Hola nuevamente:
esto:
Código Delphi
[-]procedure TForm1.localidadesAfterPost(DataSet: TDataSet);
begin
localidades.Transaction.CommitRetaining; end;
estaria mal a mi entender si localidades es un IbTable ya que el commit se hace sobre el componente IbTransaction
Te voy a poner una unidad completa de un ejemplito bien sencillo sobre el alta de un cliente
Código Delphi
[-]unit UAlta;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, Mask, DBCtrls;
type
TPalta = class(TForm)
BGrabar: TButton;
BSalir: TButton;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
DBEdit1: TDBEdit;
DBEdit2: TDBEdit;
DBEdit3: TDBEdit;
DBEdit4: TDBEdit;
StatusBar1: TStatusBar;
DBEdit5: TDBEdit;
BNuevo: TButton;
procedure FormShow(Sender: TObject);
procedure BSalirClick(Sender: TObject);
procedure BGrabarClick(Sender: TObject);
procedure BNuevoClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
public
end;
var
Palta: TPalta;
implementation
uses UDm;
{$R *.dfm}
procedure TPalta.BSalirClick(Sender: TObject);
begin
Dm.Clientes.Cancel;
Dm.Transaccion.RollbackRetaining;
end;
procedure TPalta.BGrabarClick(Sender: TObject);
begin
Try
Dm.ClientesID.AsInteger := 0;
Dm.Clientes.Post;
Dm.Transaccion.CommitRetaining;
Dm.Clientes.Append;
DBEdit1.SetFocus;
Except
Dm.Clientes.Cancel;
Dm.Transaccion.RollbackRetaining;
ShowMessage('Error de escritura');
End;
end;
procedure TPalta.BNuevoClick(Sender: TObject);
begin
Dm.Clientes.Append;
end;
procedure TPalta.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if Dm.Transaccion.InTransaction then
Dm.Transaccion.RollbackRetaining;
end;
procedure TPalta.FormShow(Sender: TObject);
begin
DBEdit1.SetFocus;
end;
end.
Resumiendo:
Dm es un TDataModule
Clientes es un IbTable
Transaccion es un IbTransaction
Para que puedas actualizar en tiempo real por decirlo de alguna manera a todos los clientes vas a tener que crear un trigger que genere un evento, algo asi:
Código SQL
[-]CREATE TRIGGER POST_NEW_REG FOR CLIENTES
ACTIVE AFTER INSERT
POSITION 0
AS
BEGIN
POST_EVENT 'new_reg';
END
que se disparara cada vez que se ingrese uno en este caso y capturar ese evento con el componente IBEvent para que realice la correspondiente actualizacion de la grilla.
En la unidad del TDataModule (Dm) puse esto:
Código Delphi
[-]unit UDm;
interface
uses
SysUtils, Classes,IniFiles,Forms,Dialogs, DB, IBDatabase, IBCustomDataSet,
IBTable, IBEvents;
type
TDM = class(TDataModule)
Transaccion: TIBTransaction;
BaseGeneral: TIBDatabase;
Clientes: TIBTable;
ClientesID: TIntegerField;
ClientesAPELLIDOS: TIBStringField;
ClientesNOMBRES: TIBStringField;
ClientesFNAC: TDateField;
ClientesDOMICILIO: TIBStringField;
ClientesLOCALIDAD: TIBStringField;
SClientes: TDataSource;
IBEvents1: TIBEvents;
procedure DataModuleCreate(Sender: TObject);
procedure DataModuleDestroy(Sender: TObject);
procedure IBEvents1EventAlert(Sender: TObject; EventName: string;
EventCount: Integer; var CancelAlerts: Boolean);
private
public
end;
var
DM: TDM;
implementation
{$R *.dfm}
procedure TDM.DataModuleCreate(Sender: TObject);
Var BaseDeDatos: String;
IniFile: TIniFile;
begin
IniFile := TIniFile.Create(ExtractFilePath(Application.ExeName)+'BDatos.ini');
BasedeDatos := IniFile.ReadString('BD','Path','');
If BasedeDatos = '' then
ShowMessage('Error al cargar Base de Datos') else
Begin
Try
BaseGeneral.DatabaseName := BaseDeDatos;
BaseGeneral.Connected := True;
Transaccion.Active := True;
Clientes.Open;
Except
ShowMessage('No se puede conectar el servidor...');
End;
End;
end;
procedure TDM.DataModuleDestroy(Sender: TObject);
begin
Transaccion.Active := False;
BaseGeneral.Connected := False;
Clientes.Close;
end;
procedure TDM.IBEvents1EventAlert(Sender: TObject; EventName: string;
EventCount: Integer; var CancelAlerts: Boolean);
begin
end;
end.
Comentado esta el codigo para el IbEvent
Saludos.- y espero que vayamos orientando hacia alguna parte