Ver Mensaje Individual
  #68  
Antiguo 03-05-2012
MartinS MartinS is offline
Miembro
NULL
 
Registrado: nov 2011
Ubicación: Villa Cacique - Argentina
Posts: 283
Reputación: 13
MartinS Va por buen camino
Hola nuevamente:

esto:

Código Delphi [-]
procedure TForm1.localidadesAfterPost(DataSet: TDataSet);  
begin    
  localidades.Transaction.CommitRetaining; // si dejo  DataSet.Transaction.CommitRetaining; no compila  
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
    { Private declarations }
  public
    { Public declarations }
  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
    { Private declarations }
  public
    { Public declarations }
  end;

var
  DM: TDM;

implementation

{$R *.dfm}

procedure TDM.DataModuleCreate(Sender: TObject);
Var BaseDeDatos: String;
    IniFile: TIniFile;
begin
   // Obtiene la ruta y el nombre de la base de datos
   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;
  //    IBEvents1.Events.Clear;
  //    IBEvents1.Events.Add('new_reg');
  //    IBEvents1.RegisterEvents;
    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;
//  IBEvents1.UnRegisterEvents;
end;

procedure TDM.IBEvents1EventAlert(Sender: TObject; EventName: string;
  EventCount: Integer; var CancelAlerts: Boolean);
begin
{  if EventName = 'new_reg' then
  Begin
  ShowMessage('Edito');
  SClientes.DataSet.Refresh;
  End;  }
end;

end.

Comentado esta el codigo para el IbEvent


Saludos.- y espero que vayamos orientando hacia alguna parte
Responder Con Cita