CODIGO CHAVE SEQUENCIAL - ADO/SQL.

USUARIO.EXCLUIDOS 15/09/2006 10:55:48
#171652
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.
USUARIO.EXCLUIDOS 15/09/2006 11:11:04
#171653
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".
USUARIO.EXCLUIDOS 15/09/2006 14:41:44
#171697
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,
USUARIO.EXCLUIDOS 15/09/2006 15:01:12
#171707
pode ser assim também:

cnn.execute "Insert into Sua_Tabela (Cod) VALUES ((Select Max(Cod) from sua tabela) + 1)"
USUARIO.EXCLUIDOS 15/09/2006 15:16:07
#171711
Estou usando o seguinte código:

[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]
USUARIO.EXCLUIDOS 15/09/2006 15:19:44
#171714
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.
USUARIO.EXCLUIDOS 15/09/2006 15:27:03
#171716
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,
USUARIO.EXCLUIDOS 15/09/2006 15:35:04
#171718
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).
USUARIO.EXCLUIDOS 15/09/2006 15:41:35
#171720
"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.
USUARIO.EXCLUIDOS 15/09/2006 15:52:34
#171725
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;

USUARIO.EXCLUIDOS 15/09/2006 15:53:14
#171726
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.

Página 1 de 4 [32 registro(s)]
Tópico encerrado , respostas não são mais permitidas