Descoberta do ID gerado automaticamente
Ola Pessoal. Estou com um problema em relação ao ID. Dentro de minha base em firebird 2.5, com delphi 7, tenho um form que quando geral um registro em uma tabela, a chave principal é gerada por um ID automatico (generate dentro da base). Este campo chave por exemplo: CODIGOPRODUTO, após gerado preciso alimentar outra base com o numero automatico gerado naquela base, como faço para saber que numero é esse. Obrigado
Carlos Cabral
Curtidas 0
Respostas
Raimundo Pereira
06/10/2015
Cabral, Bom dia.
Depois de realizar de gravar o registro .
Você pode realizar o locate ou pode montar um select para retornar o registro e pegar o código, ou também pode ir para o ultimo registro e pegar o código .
No meu caso eu usaria o locate
Exemplo:
IF DM.SUA_TABELA.LOCATE('DESCRICAO',EDIT_COM_DESCRIÇÃO.TEXT,[]) THEN
BEGIN
SHOWMESSAGE(INTTOSTR(DM.SUA_TABELA.FIELBYNAME('CODIGOPRODUTO').ASINTEGER);
END;
Aguardo retorno.
Depois de realizar de gravar o registro .
Você pode realizar o locate ou pode montar um select para retornar o registro e pegar o código, ou também pode ir para o ultimo registro e pegar o código .
No meu caso eu usaria o locate
Exemplo:
IF DM.SUA_TABELA.LOCATE('DESCRICAO',EDIT_COM_DESCRIÇÃO.TEXT,[]) THEN
BEGIN
SHOWMESSAGE(INTTOSTR(DM.SUA_TABELA.FIELBYNAME('CODIGOPRODUTO').ASINTEGER);
END;
Aguardo retorno.
GOSTEI 0
Carlos Cabral
06/10/2015
Cara, achei uma idéia ótima. Pensei em pegar o ultimo numero por select, mas fiquei meio em duvida. O locate também daria certo, mas paira ainda uma situação. E me desculpe pela ignorancia, mas não tenho muita experiencia em alguns comandos. E Quando eu tiver por exemplo estações e exatamente naquele momento as mesmas estiverem fazendo o mesmo cadastro e por ventura gravarem ao mesmo tempo ?? Neste caso o LOCATE também me ajudaria ??
GOSTEI 0
Carlos Cabral
06/10/2015
.
Marco
Eu acho que não compreendi ou nao sei usar esse comando. Após eu dar o comando POST e APPLY UPDATE no delphi e o próprio firebird incrementar um ID automatico
como eu faço para pegar o ID que foi gerado pelo banco ? Como devo utilizar o RETURNING ?
Marco
Eu acho que não compreendi ou nao sei usar esse comando. Após eu dar o comando POST e APPLY UPDATE no delphi e o próprio firebird incrementar um ID automatico
como eu faço para pegar o ID que foi gerado pelo banco ? Como devo utilizar o RETURNING ?
GOSTEI 0
Rafael Bosco
06/10/2015
Utiliza uma select, mas de tabelas internas do banco de dados do FireBird, que irá trazer o último ID do generator.
Lembrando que, a SQL está colocando como parâmetro o valor 0, ou seja, NÃO SERÁ INCREMENTADO nada no generator, apenas trazer o último valor, como o campo CODIGO, abaixo outra função que obtém o valor:
class function TSQL.GetMaxCode(const AGeneratorName: String): String;
begin
Result := 'SELECT GEN_ID('+ AGeneratorName +', 0) AS CODIGO FROM RDB$DATABASE';
end;
Lembrando que, a SQL está colocando como parâmetro o valor 0, ou seja, NÃO SERÁ INCREMENTADO nada no generator, apenas trazer o último valor, como o campo CODIGO, abaixo outra função que obtém o valor:
function TProduto.GetMaxCode: System.Integer;
begin
try
fConnection.ClearSQL;
fConnection.AddSQL(TSQL.GetMaxCode('ID_PRODUTO'));
fConnection.OpenSQL;
Result := fConnection.FieldByName('CODIGO').AsInteger
except
raise;
end;
end;
GOSTEI 0
Carlos Cabral
06/10/2015
Utiliza uma select, mas de tabelas internas do banco de dados do FireBird, que irá trazer o último ID do generator.
Lembrando que, a SQL está colocando como parâmetro o valor 0, ou seja, NÃO SERÁ INCREMENTADO nada no generator, apenas trazer o último valor, como o campo CODIGO, abaixo outra função que obtém o valor:
class function TSQL.GetMaxCode(const AGeneratorName: String): String;
begin
Result := 'SELECT GEN_ID('+ AGeneratorName +', 0) AS CODIGO FROM RDB$DATABASE';
end;
Lembrando que, a SQL está colocando como parâmetro o valor 0, ou seja, NÃO SERÁ INCREMENTADO nada no generator, apenas trazer o último valor, como o campo CODIGO, abaixo outra função que obtém o valor:
function TProduto.GetMaxCode: System.Integer;
begin
try
fConnection.ClearSQL;
fConnection.AddSQL(TSQL.GetMaxCode('ID_PRODUTO'));
fConnection.OpenSQL;
Result := fConnection.FieldByName('CODIGO').AsInteger
except
raise;
end;
end;
Meu amigo, muito obrigado. Testei e funcionou legal. Obrigado
GOSTEI 0
Socrates Foschera
06/10/2015
bom dia quero que o proximo contador gerado apareça quando for clicado no botao novo como proceder e não que apareça depois que for salvo
GOSTEI 0