Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 03-05-2012
pelikno pelikno is offline
Miembro
NULL
 
Registrado: oct 2010
Posts: 95
Poder: 14
pelikno Va por buen camino
Sobre las transacciones como tendria que ser la configuracion?, porque anteriormente puse como la tenia configurada a la base y a la transaccion.

parametros de la transaction
read_commited
rec_version
nowait

Última edición por pelikno fecha: 03-05-2012 a las 15:00:48.
Responder Con Cita
  #2  
Antiguo 03-05-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.044
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Código Delphi [-]
procedure TForm1.localidadesAfterPost(DataSet: TDataSet);  
begin    
  localidades.Transaction.CommitRetaining; // si dejo  DataSet.Transaction.CommitRetaining; no compila  
end;

Tiene que compilar. Mal vamos si no compila eso.
Responder Con Cita
  #3  
Antiguo 03-05-2012
pelikno pelikno is offline
Miembro
NULL
 
Registrado: oct 2010
Posts: 95
Poder: 14
pelikno Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Código Delphi [-]
procedure TForm1.localidadesAfterPost(DataSet: TDataSet);  
begin    
  localidades.Transaction.CommitRetaining; // si dejo  DataSet.Transaction.CommitRetaining; no compila  
end;

Tiene que compilar. Mal vamos si no compila eso.
con dataset te referis al parametro enviado al after pos ? porque me tira este error
Código Delphi [-]
[ERROR] UMain.pas(94):Undeclared Identifier: 'Transaction'

y supongo que es porque un tdataset comun no tiene una transaction.

Última edición por pelikno fecha: 03-05-2012 a las 16:08:07.
Responder Con Cita
  #4  
Antiguo 03-05-2012
MartinS MartinS is offline
Miembro
NULL
 
Registrado: nov 2011
Ubicación: Villa Cacique - Argentina
Posts: 283
Poder: 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
  #5  
Antiguo 03-05-2012
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
17) Vuelva a leer este hilo de atrás para adelante... quizá si lo hacemos "al verré" se entiende la cosa

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #6  
Antiguo 03-05-2012
pelikno pelikno is offline
Miembro
NULL
 
Registrado: oct 2010
Posts: 95
Poder: 14
pelikno Va por buen camino
Cita:
Empezado por MartinS Ver Mensaje
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
Gracias martins, tenia las componentes IBEvent pero no sabia como utilizarlas bien igual que el trigger de la base !!!!!
Responder Con Cita
  #7  
Antiguo 03-05-2012
MartinS MartinS is offline
Miembro
NULL
 
Registrado: nov 2011
Ubicación: Villa Cacique - Argentina
Posts: 283
Poder: 13
MartinS Va por buen camino
Bueno parece que vamos encontrando el rumbo. Igual los tengo comentados (Lo de IbEvents) porque no se cual es la razon que se queda pensando el sistema en red. Seguramente hay algo que estoy mal pero ya alguien va a comentar.

Saludos
Responder Con Cita
  #8  
Antiguo 03-05-2012
pelikno pelikno is offline
Miembro
NULL
 
Registrado: oct 2010
Posts: 95
Poder: 14
pelikno Va por buen camino
Cita:
Empezado por MartinS Ver Mensaje
Bueno parece que vamos encontrando el rumbo. Igual los tengo comentados (Lo de IbEvents) porque no se cual es la razon que se queda pensando el sistema en red. Seguramente hay algo que estoy mal pero ya alguien va a comentar.

Saludos
Cree los trigers pero el IBEvents no me los capta, puse el debuger y no pasa nunca, tengo seteada la databse en IBEvent, algo mas hay que hacer ?
Responder Con Cita
  #9  
Antiguo 04-05-2012
pelikno pelikno is offline
Miembro
NULL
 
Registrado: oct 2010
Posts: 95
Poder: 14
pelikno Va por buen camino
Cita:
Empezado por MartinS Ver Mensaje
Bueno parece que vamos encontrando el rumbo. Igual los tengo comentados (Lo de IbEvents) porque no se cual es la razon que se queda pensando el sistema en red. Seguramente hay algo que estoy mal pero ya alguien va a comentar.

Saludos
Pudiste ver eso porque a mi me funciono bien !!
Responder Con Cita
  #10  
Antiguo 03-05-2012
pelikno pelikno is offline
Miembro
NULL
 
Registrado: oct 2010
Posts: 95
Poder: 14
pelikno Va por buen camino
Para no seguir dando vueltas, hay alguien que use firebirds y aplicacion cliente servidor que pueda actualizar los dataset de las terminales sin tener que hacerlo por codigo con un dataset.refresh;
Responder Con Cita
  #11  
Antiguo 03-05-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.044
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Amigo, disculpa que te lo diga, pero está claro, no te enteras
Responder Con Cita
  #12  
Antiguo 03-05-2012
pelikno pelikno is offline
Miembro
NULL
 
Registrado: oct 2010
Posts: 95
Poder: 14
pelikno Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Amigo, disculpa que te lo diga, pero está claro, no te enteras
Casi ... Perdon pero no entiendo a me entero como dicen uds jaja otros sistemas que tengo funcionando tienen un boton actualizar lo que no me gusta por eso queria hacerlo mas automatico el tema del refresco de los datos pero no puedo
Responder Con Cita
  #13  
Antiguo 03-05-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.044
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Creo que es la tercera vez ... mira sobre post_event <--- click ahí ---
Y este enlace también lo puse antes.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Diseño de Sistema magnu9 Varios 14 16-10-2007 05:27:53
Consulta con diseño de BD Petolansa Varios 7 11-08-2007 02:30:01
en diseño web miamuxi Conexión con bases de datos 6 19-01-2007 20:13:50
Diseño pepelu1975 Varios 1 31-05-2004 09:55:36
duda en el diseño wonder boy SQL 3 31-03-2004 19:55:06


La franja horaria es GMT +2. Ahora son las 21:27:49.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi