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