none
C# Atualização código sequencial no banco RRS feed

  • Pergunta

  • Prezados, estou com um problema no sistema, aonde o banco de dados foi construído utilizando código da tabela como varchar(9) até mesmo pela nfe. Ai tenho uma tabela que grava o código sequencial das tabelas, e sempre que alguém clica em incluir, ele pega o ultimo código + 1 e já insere este código na tabela e mostra o código para o usuário. Porem esta acontecendo de 2 usuários clicarem no botão incluir e aparecer o mesmo código na tela. Mesmo ele gerando o próximo código e gravando no mesmo método (o que considero muito rápido). Como resolver este problema, sem alterar a estrutura do banco? Alguma dica?
    segunda-feira, 8 de julho de 2013 18:22

Respostas

  • Miguel,

    Veja se estes exemplos podem ajudar:

    Create Table #Sequencial
     (Sequencial Int Identity(1,1),
       Campo1 Int,
       Campo2 Int,
       Campo3 Int)
    
    Insert Into #Sequencial Values(1,2,3)
    Insert Into #Sequencial Values(4,5,6)
    Insert Into #Sequencial Values(7,8,9)
    Insert Into #Sequencial Values(10,11,12)
    
    
    Select * from #Sequencial
    
    SELECT
     (SELECT COUNT(Sequencial) FROM #Sequencial AS TInt Where TInt.Sequencial >= TOut.Sequencial) As SEQ,
     Campo1, Campo2, Campo3
    FROM
     #Sequencial AS TOut
    ORDER BY SEQ ASC


    Use Laboratorio
    
    Declare @Identity Int
    
    ---Refazendo numeração Controle de Entrada - Matéria Prima ---
    Set @Identity=(Select Ident_Current('CTEntrada_PQC'))
    
    DBCC CheckIdent('CTEntrada_PQC',Reseed,@Identity)
    
    ---Refazendo numeração Controle de Produção - Moinho ---
    Set @Identity=(Select Ident_Current('CTProducao_Moinho'))
    
    DBCC CheckIdent('CTProducao_Moinho',Reseed,@Identity)
    
    ---Refazendo numeração Controle de Entrada - Recebimento - Látex ---
    Set @Identity=(Select Ident_Current('CTEntrada_Recebimento_Látex'))
    
    DBCC CheckIdent('CTEntrada_Recebimento_Latatex',Reseed,@Identity)
    
    ---Refazendo numeração Controle de Produção - PVM ---
    Set @Identity=(Select Ident_Current('CTProducao_PVM'))
    
    DBCC CheckIdent('CTProducao_PVM',Reseed,@Identity)
    Go


    DECLARE @NUMREQUISICAO INT,
                 @LOTEINI INT
                 
    SET @NUMREQUISICAO=1
    SET @LOTEINI=(SELECT MIN(LOTEPRODUCAO) FROM MOVIMENTACAO_LOTEPRODUCAO)
    
    WHILE @LOTEINI <=(SELECT MAX(LOTEPRODUCAO) FROM MOVIMENTACAO_LOTEPRODUCAO)
     Begin
    
      IF @LOTEINI >(select max(loteproducao) from movimentacao_loteproducao)
       Break
      Else
       Begin 
        BEGIN TRANSACTION  
    
        UPDATE MOVIMENTACAO_LOTEPRODUCAO
        SET NUMREQUISICAO=@NUMREQUISICAO
        WHERE LOTEPRODUCAO=@LOTEINI
    
        COMMIT
    
        SET @NUMREQUISICAO=@NUMREQUISICAO+1
       End
    
      SET @LOTEINI=(SELECT TOP 1 LOTEPRODUCAO FROM MOVIMENTACAO_LOTEPRODUCAO WHERE LOTEPRODUCAO >@LOTEINI ORDER BY LOTEPRODUCAO)
     End
    /****************************************************/
    SELECT * FROM MOVIMENTACAO_LOTEPRODUCAO
    ORDER BY NUMREQUISICAO

    Como destacado anteriormente no SQL Server 2012 foi introduzido o objeto Sequence que permite criar uma sequência numérica, veja abaixo o exemplo:

    Create Database MsTechDay
    Go
    
    
    -- Criando uma nova Tabela --
    CREATE TABLE Familia
    (Nomes varchar(15))
    Go
    
    INSERT INTO Familia values
    ('Pedro'), ('Fernanda'), ('Eduardo'), ('João Pedro'), ('Maria Luíza')
    
    -- Criando uma nova Sequência de Valores --
    CREATE SEQUENCE Seq As INT -- Tipo
     START WITH 1 -- Valor Inicial (1)
     INCREMENT BY 1 -- Avança de um em um
     MINVALUE 1 -- Valor mínimo 1
     MAXVALUE 10 -- Valor máximo 10000
     CACHE 10 -- Mantém 10 posições em cache
     NO CYCLE -- Não irá reciclar
    
      -- Utilizando a Sequência de Valores --
    SELECT Next VALUE FOR Seq AS ID, Nomes FROM Familia;
    
    -- Reinicializando a valor da Sequência --
    ALTER Sequence Seq
     RESTART WITH 1 ;
    
       -- Utilizando a Sequência de Valores --
    SELECT Next VALUE FOR Seq AS ID, Nomes FROM Familia;
    
    -- Excluíndo a Sequência --
    Drop Sequence Seq


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]


    sábado, 14 de setembro de 2013 16:57

Todas as Respostas

  • sempre que alguém clica em incluir, ele pega o ultimo código + 1

    Você esta pegando o último código através de select?


    quinta-feira, 12 de setembro de 2013 15:23
  • Olá Miguel,

    Você pode deixar este controle de auto incremento para o SQL Server. Este problema que você está tendo de duas conexões pegar o mesmo ID não irá ocorrer.

    Você pode tratar isso de duas formas:

    1. Utilizar identity na coluna que controlará o incremento. Link: http://technet.microsoft.com/en-us/library/aa933196(v=sql.80).aspx
    2. Se estiver utilizando o SQL Server 2012 você pode utilizar um novo recurso chamado Sequence. Segue exemplo de como utlizar este recurso: http://bobgalvao.wordpress.com/2011/10/06/objeto-sequence-no-sql-server-denali/

    "Se a resposta foi útil, não esqueça de marcar a resposta."

    Roberto Galvão
    MCITP - Administration SQL Server 2008
    MCITP - Developer SQL Server 2008
    MCSA - SQL Server 2012
    Blog: http://bobgalvao.wordpress.com


    Roberto Galvão | MCTS | MCITP | Microsoft Partner |

    • Sugerido como Resposta Roberto Galvão quinta-feira, 12 de setembro de 2013 15:30
    quinta-feira, 12 de setembro de 2013 15:29
  • Miguel,

    Veja se estes exemplos podem ajudar:

    Create Table #Sequencial
     (Sequencial Int Identity(1,1),
       Campo1 Int,
       Campo2 Int,
       Campo3 Int)
    
    Insert Into #Sequencial Values(1,2,3)
    Insert Into #Sequencial Values(4,5,6)
    Insert Into #Sequencial Values(7,8,9)
    Insert Into #Sequencial Values(10,11,12)
    
    
    Select * from #Sequencial
    
    SELECT
     (SELECT COUNT(Sequencial) FROM #Sequencial AS TInt Where TInt.Sequencial >= TOut.Sequencial) As SEQ,
     Campo1, Campo2, Campo3
    FROM
     #Sequencial AS TOut
    ORDER BY SEQ ASC


    Use Laboratorio
    
    Declare @Identity Int
    
    ---Refazendo numeração Controle de Entrada - Matéria Prima ---
    Set @Identity=(Select Ident_Current('CTEntrada_PQC'))
    
    DBCC CheckIdent('CTEntrada_PQC',Reseed,@Identity)
    
    ---Refazendo numeração Controle de Produção - Moinho ---
    Set @Identity=(Select Ident_Current('CTProducao_Moinho'))
    
    DBCC CheckIdent('CTProducao_Moinho',Reseed,@Identity)
    
    ---Refazendo numeração Controle de Entrada - Recebimento - Látex ---
    Set @Identity=(Select Ident_Current('CTEntrada_Recebimento_Látex'))
    
    DBCC CheckIdent('CTEntrada_Recebimento_Latatex',Reseed,@Identity)
    
    ---Refazendo numeração Controle de Produção - PVM ---
    Set @Identity=(Select Ident_Current('CTProducao_PVM'))
    
    DBCC CheckIdent('CTProducao_PVM',Reseed,@Identity)
    Go


    DECLARE @NUMREQUISICAO INT,
                 @LOTEINI INT
                 
    SET @NUMREQUISICAO=1
    SET @LOTEINI=(SELECT MIN(LOTEPRODUCAO) FROM MOVIMENTACAO_LOTEPRODUCAO)
    
    WHILE @LOTEINI <=(SELECT MAX(LOTEPRODUCAO) FROM MOVIMENTACAO_LOTEPRODUCAO)
     Begin
    
      IF @LOTEINI >(select max(loteproducao) from movimentacao_loteproducao)
       Break
      Else
       Begin 
        BEGIN TRANSACTION  
    
        UPDATE MOVIMENTACAO_LOTEPRODUCAO
        SET NUMREQUISICAO=@NUMREQUISICAO
        WHERE LOTEPRODUCAO=@LOTEINI
    
        COMMIT
    
        SET @NUMREQUISICAO=@NUMREQUISICAO+1
       End
    
      SET @LOTEINI=(SELECT TOP 1 LOTEPRODUCAO FROM MOVIMENTACAO_LOTEPRODUCAO WHERE LOTEPRODUCAO >@LOTEINI ORDER BY LOTEPRODUCAO)
     End
    /****************************************************/
    SELECT * FROM MOVIMENTACAO_LOTEPRODUCAO
    ORDER BY NUMREQUISICAO

    Como destacado anteriormente no SQL Server 2012 foi introduzido o objeto Sequence que permite criar uma sequência numérica, veja abaixo o exemplo:

    Create Database MsTechDay
    Go
    
    
    -- Criando uma nova Tabela --
    CREATE TABLE Familia
    (Nomes varchar(15))
    Go
    
    INSERT INTO Familia values
    ('Pedro'), ('Fernanda'), ('Eduardo'), ('João Pedro'), ('Maria Luíza')
    
    -- Criando uma nova Sequência de Valores --
    CREATE SEQUENCE Seq As INT -- Tipo
     START WITH 1 -- Valor Inicial (1)
     INCREMENT BY 1 -- Avança de um em um
     MINVALUE 1 -- Valor mínimo 1
     MAXVALUE 10 -- Valor máximo 10000
     CACHE 10 -- Mantém 10 posições em cache
     NO CYCLE -- Não irá reciclar
    
      -- Utilizando a Sequência de Valores --
    SELECT Next VALUE FOR Seq AS ID, Nomes FROM Familia;
    
    -- Reinicializando a valor da Sequência --
    ALTER Sequence Seq
     RESTART WITH 1 ;
    
       -- Utilizando a Sequência de Valores --
    SELECT Next VALUE FOR Seq AS ID, Nomes FROM Familia;
    
    -- Excluíndo a Sequência --
    Drop Sequence Seq


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]


    sábado, 14 de setembro de 2013 16:57
  • Bom dia Miguel,

    Vchegou a testar a sugestão que lhe foram passadas?

    Caso elas funcionem não esqueça de marcar como resposta para fechar a sua thread.

    Att,

     


    Giovani Cruzara – Microsoft Contingent Staff

    Esse conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    Msdn Community Support

    Por favor, lembre-se de “Marcar como Resposta” as respostas que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    quarta-feira, 18 de setembro de 2013 20:01