Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 05-11-2019
tarco35 tarco35 is offline
Miembro
 
Registrado: sep 2003
Posts: 210
Poder: 22
tarco35 Va por buen camino
Question Evento comun para tablas

Saludos.. tengo muchas tablas y lo que quiero es tener un evento comun para todas ellas en el evento AfterPost, de forma que todas realicen la misma accion, que es FlushBuffers.
Me explico, en el avento AfterPost de Tabla1 tener Tabla1.FlushBufers, en el de Tabla2 tener Tabla2.FlushBuffers,.....
pues en vez de tener que escribir todo esto
Código Delphi [-]
procedure TModuloDatos.Tabla1AfterPost(DataSet: TDataSet);
begin
  Tabla1.FlushBuffers;
end;

procedure TModuloDatos.Tabla2AfterPost(DataSet: TDataSet);
begin
  Tabla2.FlushBuffers;
end;

etc etc

poder tener un procedure que le pueda asignar a todos los eventos Afterpost y realice esta acción.
(Delphi6, Paradox)
Gracias.
Responder Con Cita
  #2  
Antiguo 05-11-2019
Avatar de movorack
[movorack] movorack is offline
Miguel A. Valero
 
Registrado: feb 2007
Ubicación: Bogotá - Colombia
Posts: 1.346
Poder: 20
movorack Va camino a la famamovorack Va camino a la fama
Hola, puedes crear un evento común y asignarlo en la creación del datamodulo a todos los componentes que requieras. En esa asignación, puedes validar que no tenga un evento asignado para evitar inconvenientes.

Código Delphi [-]
..
private
  procedure TablaAfterPost(DataSet: TDataSet);
..

procedure TModuloDatos.TablaAfterPost(DataSet: TDataSet);
begin
  //No se que tipo de Dataset estés manejando así que acá debes manejar el tipo correcto
  TTable(Dataset).FlushBuffers;
end;

procedure TModuloDatos.DataModuleCreate(Sender: TObject);
  var
    i: integer;
begin
  for i := 0 to Self.ComponentCount - 1 do
  begin
    //No se que tipo de Dataset estés manejando así que acá debes manejar el tipo correcto
    if Self.Components[i] is TTable
      and (not Assigned(TTable(Self.Components[i]).AfterPost))
    then
      TTable(Self.Components[i]).AfterPost := TablaAfterPost;
  end;
end;
__________________
Buena caza y buen remar... http://mivaler.blogspot.com
Responder Con Cita
  #3  
Antiguo 05-11-2019
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.549
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Otra opción puede ser crear un derivado del componente TTable (TTableAF), con una propiedad AutoFlushBuffers, que por defecto tenga valor True.
Si la propiedad está a True, después del evento AfterPost, realizar el FlushBuffers.

Sólo te queda cambiar en el .PAS y en .DFM las apariciones de TTable por TTableAF
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #4  
Antiguo 05-11-2019
Avatar de movorack
[movorack] movorack is offline
Miguel A. Valero
 
Registrado: feb 2007
Ubicación: Bogotá - Colombia
Posts: 1.346
Poder: 20
movorack Va camino a la famamovorack Va camino a la fama
Es una buena opción.

Código Delphi [-]
unit TableAF;

interface

uses
  SysUtils, Classes, DB, DBTables;

type
  TTableAF = class(TTable)
  private
    FAutoFlushBuffers: Boolean;
    procedure SetAutoFlushBuffers(const Value: Boolean);
    { Private declarations }
  protected
    procedure DoAfterPost; override;
    { Protected declarations }
  public
    { Public declarations }
  published
    property AutoFlushBuffers: Boolean read FAutoFlushBuffers write SetAutoFlushBuffers default True;
    { Published declarations }
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('MyBDE', [TTableAF]);
end;

{ TTableAF }

procedure TTableAF.DoAfterPost;
begin
  inherited;

  if FAutoFlushBuffers then
    Self.FlushBuffers;
end;

procedure TTableAF.SetAutoFlushBuffers(const Value: Boolean);
begin
  FAutoFlushBuffers := Value;
end;

end.
__________________
Buena caza y buen remar... http://mivaler.blogspot.com
Responder Con Cita
  #5  
Antiguo 05-11-2019
tarco35 tarco35 is offline
Miembro
 
Registrado: sep 2003
Posts: 210
Poder: 22
tarco35 Va por buen camino
Muchas Gracias. Lo he implementado con la primera indicacion de movorack ... me ha parecido mas simple y lo mismo de efectiva.
Responder Con Cita
  #6  
Antiguo 05-11-2019
manelb manelb is offline
Miembro
 
Registrado: mar 2017
Posts: 297
Poder: 8
manelb Va por buen camino
Como me gusta leer a los que saben…

Una consulta referente a este tema:
Hace un tiempo descubrí (creo que aquí en el foro) un tipo de herencia (no recuerdo como lo llamaron) que consistía en definir la clase tal que así…

TTable = class(Bde.DBTables.TTable).

En el caso que nos ocupa, y si en todas mis unidades pongo en el uses mi unidad antes que la unidad Bde.DBTables…

¿ Serviría para no tener que modificar en todos los .pas y .dfm las apariciones de TTable por TTableAF ?
¿ Sería recomendable una solución de este tipo ?
¿Ventajas y/o inconvenientes?

En principio no sería necesario el registro, y la propiedad AutoFlushBuffers debería ser publica en lugar de publicada
Responder Con Cita
  #7  
Antiguo 06-11-2019
Avatar de ElKurgan
[ElKurgan] ElKurgan is offline
Miembro Premium
 
Registrado: nov 2005
Posts: 1.237
Poder: 20
ElKurgan Va camino a la fama
Se denominan Clases Interpuestas o Interpose Classes.

En este artículo de Ian Marteens se habla un poco de ellas, aunque es algo antiguo.

Un saludo
Responder Con Cita
  #8  
Antiguo 06-11-2019
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.549
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por movorack Ver Mensaje
Es una buena opción.

Justo a eso me refería [movorack].
Gracias por la implementación. La pensé pero no tuve tiempo de plasmarla.

__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #9  
Antiguo 06-11-2019
manelb manelb is offline
Miembro
 
Registrado: mar 2017
Posts: 297
Poder: 8
manelb Va por buen camino
Gracias [ElKurgan] por el enlace al artículo.

Después de su lectura me queda mucho más clara su utilización y veo que estaba equivocado en cuanto al orden de las unidades en el uses que propongo en mi respuesta anterior. Se remarca esto en el final del artículo.
Responder Con Cita
  #10  
Antiguo 07-11-2019
Avatar de ElKurgan
[ElKurgan] ElKurgan is offline
Miembro Premium
 
Registrado: nov 2005
Posts: 1.237
Poder: 20
ElKurgan Va camino a la fama
Thumbs up

Es verdad, no había caído en ello. Pero tiene su lógica, ya que todo lo "principal" lo hace la clase original, y solo el añadido es el de la clase interpuesta

Un saludo
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
Filtro Sql en campo cómun a dos tablas GINMARMENOR SQL 3 26-06-2018 23:29:23
Tablas relacionadas por una campo en comun mjjj SQL 4 02-10-2008 01:03:14
Un Evento comun, distintas variables FGarcia Varios 20 05-12-2007 06:03:52
Algo un poco fuera de lo comun JerS Impresión 2 25-10-2005 19:05:28
¿Que tienen en comun las mujeres y los servidores web? obiwuan Humor 0 04-05-2003 13:56:38


La franja horaria es GMT +2. Ahora son las 01:30:33.


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