Hola con respecto a los generator te recomiendo hacer un store procedure consultando el MAX del campo que afecta dicho generator y luego actualizarlo con el resultado que genero la consulta mas 1
con respecto al desativar los trigger seria algo asi, lo probe y funciono:
Código Delphi
[-]
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, DB, IBDatabase, IBCustomDataSet;
type
TForm1 = class(TForm)
IBDataSet1: TIBDataSet;
IBDataSet2: TIBDataSet;
IBTransaction1: TIBTransaction;
IBDatabase1: TIBDatabase;
btActivar: TButton;
IBTransaction2: TIBTransaction;
btDesactivar: TButton;
procedure btActivarClick(Sender: TObject);
procedure btDesactivarClick(Sender: TObject);
private
procedure ProcesarTrigger( lActivar: Boolean );
public
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.ProcesarTrigger( lActivar: Boolean );
var
cActivar: string;
begin
if lActivar then
cActivar := ' ''ACTIVE ;'' '
else
cActivar := ' ''INACTIVE ; '' ';
IBDataSet1.Close;
IBDataSet1.SelectSQL.Text := 'SELECT ''ALTER TRIGGER '' || A.RDB$TRIGGER_NAME ||' + cActivar +
' FROM RDB$TRIGGERS A ' +
' WHERE (A.RDB$SYSTEM_FLAG = 0) ' +
' AND (A.RDB$TRIGGER_INACTIVE = 0) ' +
' AND (A.RDB$TRIGGER_TYPE IN (1, 17, 113, 25)) ';
IBDataSet1.Open;
if IBDataSet1.RecordCount > 0 then
while not IBDataSet1.Eof do
try
IBDataSet2.Close;
IBDataSet2.SelectSQL.Text := IBDataSet1.Fields[0].AsString;
IBDataSet2.Prepare;
IBDataSet2.ExecSQL;
IBTransaction2.Commit;
except
on e: Exception do
begin
ShowMessage(e.Message);
if IBTransaction2.Active then
IBTransaction2.Rollback;
end;
end;
IBTransaction1.Commit;
end;
procedure TForm1.btActivarClick(Sender: TObject);
begin
ProcesarTrigger( True );
end;
procedure TForm1.btDesactivarClick(Sender: TObject);
begin
ProcesarTrigger( False );
end;
end.
Espero te sirva.
Saludos.