Usuário com melhor resposta
C# Atualização código sequencial no banco

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?
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]
- Editado Junior Galvão - MVPMVP sábado, 14 de setembro de 2013 16:59
- Sugerido como Resposta Alexandre Matayosi quarta-feira, 18 de setembro de 2013 20:21
- Marcado como Resposta Giovani Cr quinta-feira, 19 de setembro de 2013 20:19
Todas as Respostas
-
-
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:
- Utilizar identity na coluna que controlará o incremento. Link: http://technet.microsoft.com/en-us/library/aa933196(v=sql.80).aspx
- 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.comRoberto Galvão | MCTS | MCITP | Microsoft Partner |
- Sugerido como Resposta Roberto Galvão quinta-feira, 12 de setembro de 2013 15:30
-
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]
- Editado Junior Galvão - MVPMVP sábado, 14 de setembro de 2013 16:59
- Sugerido como Resposta Alexandre Matayosi quarta-feira, 18 de setembro de 2013 20:21
- Marcado como Resposta Giovani Cr quinta-feira, 19 de setembro de 2013 20:19
-
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.