retornar o código gerado (auto-incremento) para a aplicação
quero que após inserir um registro, a aplicação receba qual foi o código que o banco gerou no auto-incremento.
ou seja, tenho uma tela de cadastro de Clientes, quando pesso um novo (insert) o campo código fica em branco. preencho todo o registro e salvo (post). o campo código continua em branco, mas o valor já foi gerado na tabela.
quero agora colocar o valor deste campo logo após salvar o registro.
ou seja, tenho uma tela de cadastro de Clientes, quando pesso um novo (insert) o campo código fica em branco. preencho todo o registro e salvo (post). o campo código continua em branco, mas o valor já foi gerado na tabela.
quero agora colocar o valor deste campo logo após salvar o registro.
Raserafim
Curtidas 0
Respostas
Edilcimar
15/01/2006
eu faço assim
Append;
With IBQuery1 do
Begin
Close;
SQL.Clear;
SQL.Add(´Select gen_id(CLIENTES_NUMCLIENTE_GEN, 1) from RDB$DATABASE´);
IBQuery1.Open;
NumCliiente := IBQuery1.Fields[0].AsInteger;
End;
e depois pego a variável NumCliente e jogo para dentro do banco, no campo autoincremento
Append;
With IBQuery1 do
Begin
Close;
SQL.Clear;
SQL.Add(´Select gen_id(CLIENTES_NUMCLIENTE_GEN, 1) from RDB$DATABASE´);
IBQuery1.Open;
NumCliiente := IBQuery1.Fields[0].AsInteger;
End;
e depois pego a variável NumCliente e jogo para dentro do banco, no campo autoincremento
GOSTEI 0
Thomaz_prg
15/01/2006
Basta dar um refresh na tabela.
GOSTEI 0
Raserafim
15/01/2006
thomaz, não posso fazer assim pois a query que está ligada ao form só retorna o registro que eu digo qual é o código.
ou seja, no momento que eu der um refresh na tabela, tenho que passar como parâmetro para a query o código do cliente.
ou seja, no momento que eu der um refresh na tabela, tenho que passar como parâmetro para a query o código do cliente.
GOSTEI 0
Raserafim
15/01/2006
edilcimar, apesar de a sua forma funcionar, fiquei me perguntando se realmente seria a melhor. vi uma brexa aí, mas confesso que é pouco provável.
vc está olhando o valor do auto0incrmento atual logo após o registro ser salvo, mas e se alguém tb salvar um registro no intervalo de vc salvar o seu e ver o gen_id? assim vc vai ter um valor errado.
acho q o ideal seria que após salvar o registro, a aplicação receber o valor que foi utilizado. mas como a aplicação vai saber isso? eis a questão.
vc está olhando o valor do auto0incrmento atual logo após o registro ser salvo, mas e se alguém tb salvar um registro no intervalo de vc salvar o seu e ver o gen_id? assim vc vai ter um valor errado.
acho q o ideal seria que após salvar o registro, a aplicação receber o valor que foi utilizado. mas como a aplicação vai saber isso? eis a questão.
GOSTEI 0
Edilcimar
15/01/2006
aquilo acontece após o append e antes do post, portanto se outro usuário incluir um número o gerador irá fornecer um número subseqüente
GOSTEI 0
Thomaz_prg
15/01/2006
thomaz, não posso fazer assim pois a query que está ligada ao form só retorna o registro que eu digo qual é o código.
ou seja, no momento que eu der um refresh na tabela, tenho que passar como parâmetro para a query o código do cliente.
Mas se o parâmetro já foi passado, ele ainda terá em memória o último valor lançado, sendo assim, você pode usar normalmente o Refresh.
GOSTEI 0
Raserafim
15/01/2006
thomaz, o problema maior é com os registros novos, que ainda estão sem código. pois só irão receber quando forem salvos.
GOSTEI 0
Raserafim
15/01/2006
aquilo acontece após o append e antes do post, portanto se outro usuário incluir um número o gerador irá fornecer um número subseqüente
edilcimar, vc está dizendo que esta função também faz com que seja incrementado de um do valor que foi retornado? é isso?
o simples fato de consultar já vai incrementar?
GOSTEI 0
Edilcimar
15/01/2006
sim, quando vc executa a sql com o gerador ele já incrementa o número do mesmo
With IBQuery1 do
Begin
Close;
SQL.Clear;
SQL.Add(´Select gen_id(CLIENTES_NUMCLIENTE_GEN, 1) from RDB$DATABASE´);
IBQuery1.Open;
NumCliente := IBQuery1.Fields[0].AsInteger;
showmessage(inttostr(numcliente));
End;
faça este teste e verá que o numcliente será alterado todas as vezes
With IBQuery1 do
Begin
Close;
SQL.Clear;
SQL.Add(´Select gen_id(CLIENTES_NUMCLIENTE_GEN, 1) from RDB$DATABASE´);
IBQuery1.Open;
NumCliente := IBQuery1.Fields[0].AsInteger;
showmessage(inttostr(numcliente));
End;
faça este teste e verá que o numcliente será alterado todas as vezes
GOSTEI 0
Raserafim
15/01/2006
hummm agora sim.
acabei utilizando este esquema que vc disse.
valeu edilcimar
acabei utilizando este esquema que vc disse.
valeu edilcimar
GOSTEI 0