Icon View Incident Report

Serious Serious
Reported By: Jason
Reported On: 10/14/2004
For: Version 4.12 Build 1
# 1870 AfterInsert Triggers Not Reporting the Correct Values for SQL INSERT Trigger Firings

After pressing the Button1, can get as follows result:

kind BI AI BI AI BI AI BI AI BI AI
SN 0 1 0 2 0 3 0 4 0 5
RN 0 1 0 2 0 3 0 4 0 5

After pressing the Button2, can get as follows result , it is incorrect, Always point to the record 1

kind BI AI BI AI BI AI BI AI BI AI
SN 0 1 0 1 0 1 0 1 0 1
RN 0 1 0 1 0 1 0 1 0 1

procedure TForm1.TriggerSaveLog(Kind: string;
  TriggerSession: TDBISAMSession; TriggerDatabase: TDBISAMDatabase;
  const Table_Name: String; CurrentRecord: TDBISAMRecord);
var LogQy :TDBISAMQuery;
begin
  if Table_Name='TGLOG' then exit;
  LogQy := TDBISAMQuery.Create(Application);
  try
    with LogQy do begin
      DatabaseName := TriggerDatabase.DatabaseName;
      SessionName := TriggerSession.SessionName;
      sql.Clear;
      sql.Add('Insert into "TGLOG" (kind,SN,RN,TgDate,TgDBName,Directory,Table_Name) ');
      sql.Add('  VALUES (:kind,:SN,:RN,:TgDate,:TgDBName,:Directory,:Table_Name)');
      ParamByName('kind').AsString :=Kind;
      ParamByName('SN').AsInteger := CurrentRecord.fieldbyName('SN').AsInteger;
      ParamByName('RN').AsInteger := CurrentRecord.RecNo;
      ParamByName('TgDate').AsDateTime := now;
      ParamByName('TgDBName').AsString :=TriggerDatabase.DatabaseName;
      ParamByName('Directory').AsString := TriggerDatabase.Directory;
      ParamByName('Table_Name').AsString := Table_Name;
      ExecSQL;
    end;
  finally
    LogQy.Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var ii:integer;
begin
  DBISAMTable1.close;
  DBISAMTable1.EmptyTable;
  DBISAMTable2.close;
  DBISAMTable2.EmptyTable;
  DBISAMTable2.Open;
  //Test Insert
  for ii := 1 to 30 do
  begin
    DBISAMTable2.Append;
    DBISAMTable2.FieldByName('FD1').AsInteger := ii;
    DBISAMTable2.Post;
  end;

  //Test Update
  with DBISAMTable2 do begin
    First;
    while not eof do begin
      edit;
      FieldByName('FD1').AsInteger := FieldByName('FD1').AsInteger+1;
      post;
      Next;
    end;
  end;

  //Test Delete
  with DBISAMTable2 do begin
    First;
    while not eof do
      delete;
  end;
  DBISAMTable1.open;
end;

procedure TForm1.Button2Click(Sender: TObject);
var ii:integer;
begin
  DBISAMTable1.close;
  DBISAMTable1.EmptyTable;
  DBISAMTable2.close;
  DBISAMTable2.EmptyTable;
  //Test Insert
  DBISAMQuery1.sql.Clear;
  DBISAMQuery1.sql.Add('Insert into "TEST1" (FD1) values (:FD1)');
  for ii := 1 to 30 do
  begin
    DBISAMQuery1.ParamByName('FD1').AsInteger := ii;
    DBISAMQuery1.ExecSQL;
  end;

  //Test Update
  with DBISAMQuery1 do begin
    sql.Clear;
    sql.Add('Update "TEST1" Set FD1=:FD1 where SN=:SN');
    for ii := 1 to 30 do
    begin
      ParamByName('FD1').AsInteger := ii+1;
      ParamByName('SN').AsInteger := ii;
      ExecSQL;
    end;
  end;

  //Test Delete
  with DBISAMQuery1 do begin
    sql.Clear;
    sql.Add('Delete from "TEST1"');
    ExecSQL;
  end;
  DBISAMTable1.open;
end;

procedure TForm1.DBISAMEngine1BeforeInsertTrigger(Sender: TObject;
  TriggerSession: TDBISAMSession; TriggerDatabase: TDBISAMDatabase;
  const TableName: String; CurrentRecord: TDBISAMRecord);
begin
  TriggerSaveLog('BI',TriggerSession,TriggerDatabase,TableName,CurrentRecord);
end;

procedure TForm1.DBISAMEngine1BeforeUpdateTrigger(Sender: TObject;
  TriggerSession: TDBISAMSession; TriggerDatabase: TDBISAMDatabase;
  const TableName: String; CurrentRecord: TDBISAMRecord);
begin
  TriggerSaveLog('BU',TriggerSession,TriggerDatabase,TableName,CurrentRecord);
end;

procedure TForm1.DBISAMEngine1BeforeDeleteTrigger(Sender: TObject;
  TriggerSession: TDBISAMSession; TriggerDatabase: TDBISAMDatabase;
  const TableName: String; CurrentRecord: TDBISAMRecord);
begin
  TriggerSaveLog('BD',TriggerSession,TriggerDatabase,TableName,CurrentRecord);
end;

procedure TForm1.DBISAMEngine1AfterInsertTrigger(Sender: TObject;
  TriggerSession: TDBISAMSession; TriggerDatabase: TDBISAMDatabase;
  const TableName: String; CurrentRecord: TDBISAMRecord);
begin
  TriggerSaveLog('AI',TriggerSession,TriggerDatabase,TableName,CurrentRecord);
end;

procedure TForm1.DBISAMEngine1AfterUpdateTrigger(Sender: TObject;
  TriggerSession: TDBISAMSession; TriggerDatabase: TDBISAMDatabase;
  const TableName: String; CurrentRecord: TDBISAMRecord);
begin
  TriggerSaveLog('AU',TriggerSession,TriggerDatabase,TableName,CurrentRecord);
end;

procedure TForm1.DBISAMEngine1AfterDeleteTrigger(Sender: TObject;
  TriggerSession: TDBISAMSession; TriggerDatabase: TDBISAMDatabase;
  const TableName: String; CurrentRecord: TDBISAMRecord);
begin
  TriggerSaveLog('AD',TriggerSession,TriggerDatabase,TableName,CurrentRecord);
end;



Comments Comments
Table inserts are okay, but SQL INSERTs were seeing the same record after each insert.


Resolution Resolution
Fixed Problem on 10/16/2004 in version 4.13 build 1
Image