Enfrentei um problema que me parece comum para iniciantes como eu no
Firebird, tendo migrado há pouco tempo de bases de dados Paradox.

O PROBLEMA:

Criei uma tabela, cujo DDL segue abaixo, contendo um campo incremental
criado com Generator e usando um Trigger.
Quando inseria um novo valor a partir de um DBgrid, usando um
DataModule com acesso DBExpress na forma convencional (SqlConnection,
SQLDataSet, DatasetProvider e um ClientDataset), o valor do campo
ID_PERGUNTA, minha chave primária incremental, aparecia em branco,
gerando erro na tentativa de Post. Gostaria que o mesmo fosse exibido
com seu respectivo valor incrementado, como fazia anteriormente no
Paradox.

SOLUÇÃO:

Criei uma Procedure no próprio DataModule, realizando um Select e
incrementando o Generator:

//Procedure que incrementa um Generator previamente criado em uma
unidade, retornando seu valor

procedure Tdmod1.Incrementa(Generator: String; PrimaryKey: TField);
var
  Qry:TSQLQuery;
begin
  
  if PrimaryKey.DataSet.State <> dsInsert then
    Exit;
  Qry := TSQLQuery.Create(nil); {: cria uma instância do objeto}
  try
    Qry.SQLConnection := SQLConnection1; {: componente de conexão}
    Qry.SQL.Add('SELECT GEN_ID('+Generator+',1)FROM RDB$DATABASE ');
    Qry.Open;
    PrimaryKey.AsInteger := Qry.Fields[0].AsInteger;
  finally
    FreeAndNil(Qry);  {: libera o objeto da memória}
  end;

end;

///Chamando a Procedure acima a partir do evento AfterInsert do
ClientDataset (Acrescente os Campos ao projeto primeiramente)

procedure Tdmod1.ClientDataSetPERGUNTAAfterInsert(DataSet: TDataSet);
begin
  Incrementa('G_ID_PERGUNTA',ClientDataSetPERGUNTAID_PERGUNTA);

end;

A DDL DA TABELA PERGUNTA:

SET SQL DIALECT 3;
SET NAMES ISO8859_1;
CREATE GENERATOR G_ID_PERGUNTA;
CREATE TABLE PERGUNTA (
    ASSUNTO      VARCHAR(30) NOT NULL COLLATE PT_BR,
    ID_PERGUNTA  INTEGER NOT NULL,
    CATEGORIA    VARCHAR(30) NOT NULL COLLATE PT_BR,
    PERGUNTA     VARCHAR(100) COLLATE PT_BR,
    TEXTO        BLOB SUB_TYPE 1 SEGMENT SIZE 80,
    IMAGEM       BLOB SUB_TYPE 0 SEGMENT SIZE 80
);
ALTER TABLE PERGUNTA ADD PRIMARY KEY (ID_PERGUNTA);
ALTER TABLE PERGUNTA ADD FOREIGN KEY (ASSUNTO) REFERENCES ASSUNTO   
(ASSUNTO) ON DELETE NO ACTION ON UPDATE NO ACTION;
ALTER TABLE PERGUNTA ADD FOREIGN KEY (CATEGORIA) REFERENCES CATEGORIA
(CATEGORIA) ON DELETE NO ACTION ON UPDATE NO ACTION;
SET TERM ^ ;

Espero com isso ajudar outro iniciante como eu no uso de Generators e
Triggers.

Paulo Jorge

Responder a