CODIGO CHAVE SEQUENCIAL - ADO/SQL.

USUARIO.EXCLUIDOS 16/09/2006 05:40:00
#171816
Marcelo,

Sua sugestão com COUNT..

INSERT INTO Clientes ( codigo )
SELECT count(Clientes.codigo) + 1
FROM Clientes;

Não funciona no Access, ou seja, a instrução RODA mas da resultado errado, veja, se no campo codigo tivermos:

1,3,4,5 (4 registros retorna no count), o certo seria proximo codigo 6, mas rodando a instrução acima volta 5, duplicata no codigo.

Com MAX não funciona nem a pau no Access.

Com relação a sugestão do Daniel Gomes, tem que testar, porque se dois clientes estiverem executando a mesma rotina na mesma hora PODE dar problema.
Acho mais seguro fazer com os gerenciadores de BD fazem tipo SQL Server ou Oracle, ou seja, na inclusão cada um recebe uma chave primária, independente de confirmar ou não.
Voltando a confirmar que com campo AUTONUMERAÇÃO tudo funciona Ok.

Volto a postar a questão no SQL, ou seja, o ideal seria rodar somente uma instrução SQL para incluir usando o max(codigo)+1 que funcione no Access e no SQL Server.


USUARIO.EXCLUIDOS 16/09/2006 05:49:48
#171817
Daniel,
O que se está querendo é oferecer um código igual ao ultimo+1 NO INàCIO da inclusão, não no final.
Na sua sugestão de pegar o número no final (quando grava) o melhor é usar um campo autonumeração, que assegura SEM ERRO, cada usuário receber um codigo no final da transação de inclusão.
At,
USUARIO.EXCLUIDOS 16/09/2006 12:06:55
#171847
é roberto... agora também gostaria de saber como fazer a inclusão com o Max no access...

com o count eu imaginava este erro mesmo...
USUARIO.EXCLUIDOS 16/09/2006 12:18:55
#171848
MARCELO, no firebird funfa mto bem dessa maneira:

INSERT INTO TABELA(CODIGO, NOME)
VALUES((SELECT MAX(CODIGO) + 1 FROM TABELA), 'SEU NOME')


Talvez no SQL Server tb funfe...flw
USUARIO.EXCLUIDOS 16/09/2006 22:00:11
#171920
eu acho que no SQL Server funciona sim, o problema é no Access!
USUARIO.EXCLUIDOS 18/09/2006 00:25:01
#172057
Elaine,
Acho que seu problema já está resolvido certo?
Ficou alguma dúvida? Se ficou favor informar.
Desculpe por ter misturado estação com a discussão do max(codigo) no Access.

Marcelo,
Acha que tem como contornar no Access o max(codigo)+1 que naum ta funcionando com outra opção? O legal seria poder em um só comando SQL pegar o último + 1 do codigo numérico que naum eh um campo autonumeração.



USUARIO.EXCLUIDOS 18/09/2006 08:53:17
#172077
da pra testar assim roberto:

no lugar do select Max(Campo), tentar este:

Select TOP 1 (Campo + 1) as UltID from tabela order by campo Desc


Não testei, e é meio que uma gambi né...
num sei se funfa...
FFCOUTO 18/09/2006 09:27:49
#172088
Galera eu faço assim e nunca tive problemas, uso tanto o Access quanto o SQL Server. Obviamene, a autonumeração seria a melhor opção, visto que nunca irá ter código duplicado, pórem tem o problema chato de pegar o código gerado.

Private Sub cmdGravar_Click()
On Error Goto ErrHandle
Dim sSQL As String
Dim r As Object
Dim lNum As Long

Set r = CreateObject("ADODB.Recordset")
GerarCodigo:
sSQL = "SELECT MAX(Codigo) AS Maior FROM Tabela;"
r.Open sSQL, Conexao, 3
lNum = 1
If Not r.BOF Then lNum = IIf(IsNull(r("Maior")), 1, r("Maior") + 1)
r.Close

sSQL = "INSERT INTO Tabela (Codigo) VALUES (" & lNum & ");
Conexao.Execute sSQL

sSQL = "UPDATE Tabela SET Campo1 = Valor1, Campo2 = Valor2, OutrosCampos = OutrosValores WHERE (Codigo = " & lNum & ");"
Conexao.Execute sSQL

Set r = Nothing
MsgBox "Registro gravado com sucesso.", vbInformation
Exit Sub

errHandle:
If Err = -2147467259 Then GoTo GerarCodigo
MsgBox Err.Description & vbCr & "Número do erro: " & Err.Number
End Sub


Observem q na rotina acima, pego o maior código disponível e acrescento 1, em seguida manho gravar apenas o código do registro. Caso gere o erro de registro duplicado, a rotina retorna ao início e gera novamente o maior código disponível acrescentando 1, quando não há mais erro de duplicação, apenas atualizo o registro com as informações dos campos restantes e saio da rotina.


espero ter ajudado.
USUARIO.EXCLUIDOS 18/09/2006 09:48:57
#172096
então Fabiano, assim agente até consegue, o problema é que gostaríamos de fazer tudo em somente uma instrução SQL.
USUARIO.EXCLUIDOS 18/09/2006 11:11:30
#172119
Estarei usando a rotina para gerar o código somente na hora da gravação. Acredito que não haverá problemas no acesso multiusuário, agindo desta forma.

Agradeço a todos pela colaboração.
Página 3 de 4 [32 registro(s)]
Tópico encerrado , respostas não são mais permitidas