CODIGO CHAVE SEQUENCIAL - ADO/SQL.
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.
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.
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,
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,
é 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...
com o count eu imaginava este erro mesmo...
MARCELO, no firebird funfa mto bem dessa maneira:
Talvez no SQL Server tb funfe...flw
INSERT INTO TABELA(CODIGO, NOME)
VALUES((SELECT MAX(CODIGO) + 1 FROM TABELA), 'SEU NOME')
Talvez no SQL Server tb funfe...flw
eu acho que no SQL Server funciona sim, o problema é no Access!
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.
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.
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...
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...
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.
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.
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.
então Fabiano, assim agente até consegue, o problema é que gostarÃamos de fazer tudo em somente uma instrução SQL.
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.
Agradeço a todos pela colaboração.
Tópico encerrado , respostas não são mais permitidas