Descoberta do ID gerado automaticamente

Delphi

06/10/2015

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

Carlos Cabral

Curtidas 0

Respostas

Raimundo Pereira

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.
GOSTEI 0
Marcos P

Marcos P

06/10/2015

GOSTEI 0
Carlos Cabral

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
Marcos P

Marcos P

06/10/2015

GOSTEI 0
Carlos Cabral

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 ?
GOSTEI 0
Rafael Bosco

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.

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

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.

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

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
POSTAR