Fórum ClientDataSet e Generator #45562

17/07/2004

0

Bom o problema é simples tenho a seguinte tabela com o seguinte generator e abaixo a trigger

CREATE GENERATOR LCTO_LIVROS;

CREATE TABLE LCTOEMPRE_DEVOL (
    CHAVE_1         INTEGER NOT NULL,
    CLCLIENTE       INTEGER NOT NULL,
    LIVCODIGO       INTEGER NOT NULL,
    DATAEMPRESTIMO  DATE,
    DATADEVOLUCAO   DATE,
    DATAPREVISTA    DATE,
    MULTA           FLOAT,
    STATUS          CHAR(1)
);

CREATE TRIGGER LCTOEMPRE_DEVOL_AI0 FOR LCTOEMPRE_DEVOL
ACTIVE BEFORE INSERT POSITION 0
AS
begin
 if (new.chave_1 is null) then
     new.chave_1 = gen_id(lcto_livros,1);
end


agora no delphi eu falo assim

ClientDataSet.Append; até ai blz
mas qdo eu dou um
ClientDataSet.Post;
ClientDataSet.ApplyUpdates(-1);

ele fala q o campo ´Chave_1´ não foi preenchido..
ai q ta.. isso naum deveria ser automático pela trigger?
não entendo!
alguém poderia me ajudar

desde ja agradeço

Att. Renato


Rhosaka

Rhosaka

Responder

Posts

17/07/2004

Beppe

Acho que o Before Insert só ocorre após o ApplyUpdates. Inicialize o campo CHAVE_1 com um valor qualquer, e na trigger remova o teste is null.


Responder

Gostei + 0

17/07/2004

Bon Jovi

Nao vejo pq usar trigger pra pegar ID, acho q só atrapalha, como foi nesse caso. Prefiro nao complicar:

function TDataModule2.GeraSequenceInterbase(Nome: string): integer;
begin
  SQLDataSet.Close;
  SQLDataSet.CommandText := 
    ´SELECT GEN_ID(´ + Nome + ´, 1) AS NOVO_ID FROM RDB$DATABASE´;
  SQLDataSet.Open;
  Result := SQLDataSet.FieldByName(´NOVO_ID´).AsInteger;
  SQLDataSet.Close;
end;

  ClientDataSet.Append;
  ClientDataSet.FieldByName(´CHAVE_1´).AsInteger := GeraSequenceInterbase(´LCTO_LIVROS´);
  ClientDataSet.Post;
  ClientDataSet.ApplyUpdates(-1); 



Responder

Gostei + 0

19/07/2004

Ltres

concordo com Bon Jovi, faça uma rotina padrao q pode ser usada com qualquer generator. Algo do tipo
function RetornaGenerator(vGen: String; Conect: TSQLConnection): integer;
var
  TMPsql: TSQLQuery;
begin
  Result := -1;

  try
    TMPsql := TSQLQuery.Create(nil);
    TMPsql.SQLConnection := Conect;
    TMPsql.SQL.Text := ´SELECT GEN_ID(´ + vGen + ´, 1) AS VLR FROM RDB$DATABASE´;
    TMPsql.Active := True;
    Result := TMPsql.FieldByName(´VLR´).AsInteger;
  finally
    TMPsql.Free;
  end; 
end;



Responder

Gostei + 0

19/07/2004

Rhosaka

Valeu pessoal,

consegui resolver meu problema...


Até mais..


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar