CODIGO CHAVE SEQUENCIAL - ADO/SQL.
Num cadastro tenho um campo código de 4 dÃgitos como chave. Ao incluir um novo cadastro, um código sequencial deve ser atribuÃdo automaticamente. Sabendo que mais de um usuário pode estar efetuando um novo cadastro, qual a rotina mais apropriada?
Estou usando Banco SQL Server 2000 e ADO.
Estou usando Banco SQL Server 2000 e ADO.
o mais apropriado seria que este seu campo fosse um auto numerador.
Para que o próprio SQL Server cuidasse de código sequencial.
Vc pode fazer isto alterando a propriedade Identity do campo para "YES for not replication".
Para que o próprio SQL Server cuidasse de código sequencial.
Vc pode fazer isto alterando a propriedade Identity do campo para "YES for not replication".
Outra opção para inclusão de multi-usuário num mesmo código sem autonumeração é fazer o que o gerenciador de BD faz, ou seja, faça:
select TOP 1 codigo from tabela ORDER BY codigo DESC (pega o ultimo)
faz codigo=codigo+1
(importante codigo tem que ser campo indice SEM REPETIÇÃO ou Chave Primária)
Inclui um novo registro em branco com codigo+1 se OK, completa os demais campos e da um UPDATE, se der DUPLICATA de chave primaria, pega o novo codigo com o mesmo select, soma +1 e tenta incluir novamente (o cliente não precisa saber o que está acontecendo, vc só mostra o novo codigo quando já conseguiu incluir um cara no final da tabela com o codigo final + 1.
A sugestão do MarceloHF é mais simples, usar o campo autonumeração evita esse trabalho, entretanto, vc só sabe do código depois do comando bem sucedido INSERT.
Tenho um exemplo (projeto cadastro de clientes) tratando o acesso multiusuário com SQL e BD Access com chave usando autonumeração. Se interessar o exemplo manda uma mensagem interna pra mim que eu passo o link.
At,
select TOP 1 codigo from tabela ORDER BY codigo DESC (pega o ultimo)
faz codigo=codigo+1
(importante codigo tem que ser campo indice SEM REPETIÇÃO ou Chave Primária)
Inclui um novo registro em branco com codigo+1 se OK, completa os demais campos e da um UPDATE, se der DUPLICATA de chave primaria, pega o novo codigo com o mesmo select, soma +1 e tenta incluir novamente (o cliente não precisa saber o que está acontecendo, vc só mostra o novo codigo quando já conseguiu incluir um cara no final da tabela com o codigo final + 1.
A sugestão do MarceloHF é mais simples, usar o campo autonumeração evita esse trabalho, entretanto, vc só sabe do código depois do comando bem sucedido INSERT.
Tenho um exemplo (projeto cadastro de clientes) tratando o acesso multiusuário com SQL e BD Access com chave usando autonumeração. Se interessar o exemplo manda uma mensagem interna pra mim que eu passo o link.
At,
pode ser assim também:
cnn.execute "Insert into Sua_Tabela (Cod) VALUES ((Select Max(Cod) from sua tabela) + 1)"
cnn.execute "Insert into Sua_Tabela (Cod) VALUES ((Select Max(Cod) from sua tabela) + 1)"
Estou usando o seguinte código:
[/c]
Já testei e funciona para gerar o código, porém não sei se trará problemas no acesso multiusuário.
Alguma opinião? [S43]
[c]Private Sub Gerar_Codigo()
Dim CodigoT As Integer
Set TabTransportadora = New ADODB.Recordset
SQL = "SELECT CodigoTransportadora FROM Transportadora ORDER BY CodigoTransportadora"
TabTransportadora.Open SQL, ConectaBanco, adOpenDynamic, adLockOptimistic
If Not TabTransportadora.EOF Then
TabTransportadora.MoveLast
CodigoT = TabTransportadora!CodigoTransportadora + 1
Else
CodigoT = 1
End If
TabTransportadora.Close
txtCodigoT.Text = CodigoT
End Sub
[/c]
Já testei e funciona para gerar o código, porém não sei se trará problemas no acesso multiusuário.
Alguma opinião? [S43]
Sim... haverão problemas na inclusão de registros.
Imaginemos que um usuário abra a tela, será gerado um código X.
antes que o mesmo grave o registro um outro usuário abra a tela também, será gerado o mesmo código X.
assim serão geradas duplicidades no banco de dados.
Aconselho realmente a alterar a estrutura da tabela e colocar o campo como auto numerador, ou usar como inclusão a forma como postei ali em cima, que também evita duplicação de códigos.
Imaginemos que um usuário abra a tela, será gerado um código X.
antes que o mesmo grave o registro um outro usuário abra a tela também, será gerado o mesmo código X.
assim serão geradas duplicidades no banco de dados.
Aconselho realmente a alterar a estrutura da tabela e colocar o campo como auto numerador, ou usar como inclusão a forma como postei ali em cima, que também evita duplicação de códigos.
Elaine,
Vai da erro conforme o MarceloHF comentou acima.
Dois ou mais usuarios ao mesmo tempo podem ter a chave igual +1.
Só o primeiro vai incluir os demais vão receber erro de duplicata de chave primária no BD.
Se não quiser alterar pela sugestão do MarceloHF (autonumeraçao) ou a minha sugestão, vai ter que tratar o erro e pedir para o usuário incluir novamente.
At,
Vai da erro conforme o MarceloHF comentou acima.
Dois ou mais usuarios ao mesmo tempo podem ter a chave igual +1.
Só o primeiro vai incluir os demais vão receber erro de duplicata de chave primária no BD.
Se não quiser alterar pela sugestão do MarceloHF (autonumeraçao) ou a minha sugestão, vai ter que tratar o erro e pedir para o usuário incluir novamente.
At,
MarceloHF,
Criei um campo CODIGO na minha tabela CLIENTES em Access 2000.
Executei o comando:
Insert into clientes (Codigo) VALUES ((Select Max(Codigo) from clientes) + 1);
Deu o seguinte erro: Reserved error (-3025); there is no message for this error
O campo código criado foi numérico (long).
Criei um campo CODIGO na minha tabela CLIENTES em Access 2000.
Executei o comando:
Insert into clientes (Codigo) VALUES ((Select Max(Codigo) from clientes) + 1);
Deu o seguinte erro: Reserved error (-3025); there is no message for this error
O campo código criado foi numérico (long).
"INSERT INTO Table1
SELECT MAX(Codigo) + 1 AS Expr1
FROM Table1"
Fiz assim no SQL server agora e funcionou, vou tentar testar no access aqui e posto.
SELECT MAX(Codigo) + 1 AS Expr1
FROM Table1"
Fiz assim no SQL server agora e funcionou, vou tentar testar no access aqui e posto.
desta forma funcionou tanto no SQL quanto no Access. utilizando o Count ao invés do Max:
INSERT INTO Tabela1 ( codigo )
SELECT count(Tabela1.codigo) + 1
FROM Tabela1;
A parte Select max(codigo)+1 as CodigoMaior FROM Clientes funciona no Access
quando colocada junto com o INSERT INTO ... VALUES... da pau!
Gostei da instrução. Estou aguardando a que funciona.
quando colocada junto com o INSERT INTO ... VALUES... da pau!
Gostei da instrução. Estou aguardando a que funciona.
Tópico encerrado , respostas não são mais permitidas