none
Controle de Numero Duplicando RRS feed

  • Pergunta

  • Possuo um controle de numero, ex: controle de senha

    Porém está ocorrendo de sair dois pedidos com mesma senha.

    Atualmente exitem 5 maquinas tirando pedidos e acontece esse problema algumas vezes.

    Para pegar o próxima senha estou executando o SQL

    update pedidoconfiguracao set senha = senha + 1;
    select senha from pedidoconfiguracao;

    Qual é uma boa prática para realizar esse tipo de controle evitando que dois pedidos peguem a mesma senha?

    sexta-feira, 16 de dezembro de 2016 15:41

Respostas

  • Boa tarde Raphael!

    Qual sua versão do SQL Server? Caso seja o 2012 ou superior, considere o uso da SEQUENCE. Segue abaixo o link com a documentação da MSDN:

    https://msdn.microsoft.com/pt-br/library/ff878091.aspx

    Você pode criar uma sequence do tipo:

    CREATE SEQUENCE SQ_NumeroPedido
        START WITH 1  
        INCREMENT BY 1 
        NO CACHE;  
    GO  

    E para selecionar o próximo valor, pode fazer o seguinte:

    DECLARE @Numero INT
    SELECT @Numero = NEXT VALUE FOR SQ_NumeroPedido
    
    SELECT @Numero

    Abraços

    sexta-feira, 16 de dezembro de 2016 17:56

Todas as Respostas

  • Boa tarde,

    Acho que você pode utilizar uma variável no Update. Ex:

    declare @senha integer;
    
    update pedidoconfiguracao set @senha = senha = senha + 1; 
    
    select @senha

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    sexta-feira, 16 de dezembro de 2016 16:18
  • Rafael ,existe algumas estratégias para isso, mas preciso tirar umas duvidas

    como e a rotina de geração de pedidos ? (e pela aplicação ? ou uma SP ? )

    vc tem que atentar a rotina que recupera a senha 

    exemplo:

    Maquina 1 = getUltimaSenha   >retorna 1000

    Maquina2 = UpdadeSenha  > muda senha para 1001

    Maquina1  = getUltimaSenha   >retorna 1001

    Maquina3  = getUltimaSenha   >retorna 1001

    vou dar uma  estrategia que pode se encaixar no seu contexto.

    segue o algoritimo a ser visto

    veja que a rotina deve estar dentro de uma transação , ou implementada dentro do banco , ou na aplicação

    o mais importante e estar dentro da transação

    CREATE TABLE SenhasSequencias( Tabela VARCHAR(MAX), senha INT , )

    --Primeiro valor Default INSERT INTO dbo.SenhasSequencias ( Tabela, senha ) VALUES ( 'Pedidos', -- Tabela - varchar(max) 1 -- senha - int )

    --Rotina a ser implementada ou no banco ou na aplicação BEGIN TRANSACTION SalvarPedido IF(GerarNovoPedido) BEGIN DECLARE @NovaSenha INT; SET @NovaSenha = (SELECT MAX(S.senha) +1) FROM dbo.SenhasSequencias WHERE Tabela ='Pedidos') salvarPedido(DadosDoPedido ,@NovaSenha) IF SalvouSemErros =1 BEGIN UPDATE dbo.SenhasSequencias SET senha =@NovaSenha WHERE Tabela ='Pedidos' END IF SalvouSemErros =1 COMMIT ELSE ROLLBACK END END



     

    Wesley Neves

    sexta-feira, 16 de dezembro de 2016 16:19
  • Boa tarde Raphael!

    Qual sua versão do SQL Server? Caso seja o 2012 ou superior, considere o uso da SEQUENCE. Segue abaixo o link com a documentação da MSDN:

    https://msdn.microsoft.com/pt-br/library/ff878091.aspx

    Você pode criar uma sequence do tipo:

    CREATE SEQUENCE SQ_NumeroPedido
        START WITH 1  
        INCREMENT BY 1 
        NO CACHE;  
    GO  

    E para selecionar o próximo valor, pode fazer o seguinte:

    DECLARE @Numero INT
    SELECT @Numero = NEXT VALUE FOR SQ_NumeroPedido
    
    SELECT @Numero

    Abraços

    sexta-feira, 16 de dezembro de 2016 17:56
  • Boa tarde Raphael!

    Qual sua versão do SQL Server? Caso seja o 2012 ou superior, considere o uso da SEQUENCE. Segue abaixo o link com a documentação da MSDN:

    https://msdn.microsoft.com/pt-br/library/ff878091.aspx

    Você pode criar uma sequence do tipo:

    CREATE SEQUENCE SQ_NumeroPedido
        START WITH 1  
        INCREMENT BY 1 
        NO CACHE;  
    GO  

    E para selecionar o próximo valor, pode fazer o seguinte:

    DECLARE @Numero INT
    SELECT @Numero = NEXT VALUE FOR SQ_NumeroPedido
    
    SELECT @Numero

    Abraços

    Raphael,

    A sugestão do Otávio é interessante, acredito que seja útil avaliar esta possibilidade.


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    sexta-feira, 16 de dezembro de 2016 21:37
  • Deleted
    sábado, 17 de dezembro de 2016 09:56