Gerar ID da tabela depois de dar um Append ou Insert

Delphi

Firebird

FireDAC

CRUD - Delphi

17/06/2022

Galera como faço para que, no meu código, no momento em que eu dar um Append ou um Insert, o Generator já gerar o código e lançar no campo Auto Increment da minha tabela? Utilizo FireDAC como componentes e atualmente ao dar um Append ou Insert ele fica automático como -1. Me lembro que nos componentes da tabela InterBase existia ou existe uma opção onde você definia se queria o ID gerado no momento OnAppend ou OnPost mas no FireDAC não estou encontrando nada parecido.
Kauan Oliveira

Kauan Oliveira

Curtidas 0

Respostas

Emerson Nascimento

Emerson Nascimento

17/06/2022

o problema de fazer da forma que você está solicitando é que, se a inclusão for cancelada, o sequenciador será perdido.
crie uma function que retorne o número do generator, mais ou menos assim:
// criada originalmente para trabalhar com dbExpress, mas você pode alterar para usar FireDAC
function GeneratorID(aName: string; Connection: TSQLConnection; Incrementa: Boolean): integer;
var
	Qry: TSQLQuery;
begin
	Qry := TSQLQuery.Create(nil);
	try
		Qry.SQLConnection := Connection;
		if Incrementa then
			Qry.SQL.Add('SELECT GEN_ID('+aName+', 1) FROM RDB$DATABASE')
		else
			Qry.SQL.Add('SELECT GEN_ID('+aName+', 0) FROM RDB$DATABASE');
		Qry.Open;
		Result := Qry.Fields[0].AsInteger;
	finally
		FreeAndNil(Qry);
	end;
end;

daí, no OnNewRecord (ou no AfterInsert, ou onde preferir) do dataset você chama a função:
datast.campoID.AsInteger := GeneratorID('nomedogenerator', componentedeconexao, true); // true incrementa, false retorna o último inserido

GOSTEI 0
Paulo

Paulo

17/06/2022

Ao invés de usar uma function pra isso, não seria mais interessante utilizar um generator e uma trigger?
GOSTEI 0
Kauan Oliveira

Kauan Oliveira

17/06/2022

Não necessariamente precisa ser uma function, o colega deu a ideia da function q deu certo aqui inclusive, porém, dentro do IBExpert ele automaticamente cria a trigger como BeforeInsert, mas ele age antes de comitar e não no momento em que dou um DataSet.Insert no meu código, oq consequentemente acaba não dando certo da maneira que eu precisava. Se acaso eu conseguisse controlar isso pelo banco e não pelo código seria mais vantajoso
GOSTEI 0
POSTAR