Gerar ID da tabela depois de dar um Append ou Insert
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
Curtidas 0
Respostas
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:
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
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
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
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