Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > PostgreSQL
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 28-08-2010
Avatar de Casimiro Noteví
Casimiro Noteví Casimiro Noteví is offline
Merodeador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.669
Poder: 10
Casimiro Noteví Tiene un aura espectacularCasimiro Noteví Tiene un aura espectacular
Mejor explica en detalle todo el proceso que realizas y lo que quieres conseguir.
Responder Con Cita
  #2  
Antiguo 28-08-2010
chelard chelard is offline
Miembro
 
Registrado: nov 2009
Posts: 12
Poder: 0
chelard Va por buen camino
Thumbs up

Hola Casimiro:

Tengo una tabla ventas en postgres 8.4 en esta tabla un programa (del cual no tengo codigo fuente), inserta nuevos registros.

Lo que yo quiero es desde mi programa, saber si se inserto un nuevo registro, para inmediatamente recuperar este registro, Lo primero que se me ocurrio era leer periodicamente la tabla, pero esto me consumiria muchos recursos.

Si necesitas mas datos solo hazmelo saber.

Gracias
Responder Con Cita
  #3  
Antiguo 28-08-2010
Avatar de Casimiro Noteví
Casimiro Noteví Casimiro Noteví is offline
Merodeador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.669
Poder: 10
Casimiro Noteví Tiene un aura espectacularCasimiro Noteví Tiene un aura espectacular
Pues entonces lo tienes complicado, desconozco si existe alguna utilidad para postgresql que haga lo que necesitas, aunque no me extrañaría, la verdad.
Responder Con Cita
  #4  
Antiguo 11-09-2010
Avatar de yapt
yapt yapt is offline
Miembro
 
Registrado: sep 2006
Ubicación: España
Posts: 258
Poder: 20
yapt Va por buen camino
Hola Chelard,

efectivamente tienes que utilizar UniAlerter (yo utilizo PgDAC en lugar de UniDAC pero deberían ser similares).

Para ello, desde la aplicación cliente debes "escuchar" los eventos asincronos de PostgreSQL (te debes suscribir como cliente) y luego tendrás que generar esos eventos (un trigger -after insert row- de base de datos puede servir).

Revisa esta parte del manual de PostgreSQL:
http://www.postgresql.org/docs/8.4/s...ql-notify.html (este es el más completo)
http://www.postgresql.org/docs/8.4/s...ql-listen.html

Jugue con ello hace tiempo, pero no tengo nada en producción, así que seré de poca ayuda a partir de aquí.

Suerte.

Última edición por yapt fecha: 11-09-2010 a las 17:14:59. Razón: Olvidé los enlaces de la doc. de PosgreSQL
Responder Con Cita
  #5  
Antiguo 11-09-2010
chelard chelard is offline
Miembro
 
Registrado: nov 2009
Posts: 12
Poder: 0
chelard Va por buen camino
http://www.delphiaccess.com/forum/index.php?topic=3135.0

Hola Yapt,

Gracias por responder, en general ya tenia la idea lo que quiero realmente es si alguien me puede dar una pauta, un poco mas practico.

en este enlace esta lo que quiero, pero trabaja con firebird,

http://www.delphiaccess.com/forum/in...p?topic=3135.0


alguien que tenga unos conocimientos de triggers en postgres creo que lo podria resolver facilmente, desgraciadamente aun no tengo esa habilidad,

Espero que este enlace ayude a resolver el tema.

Me dice que aun no puedo enviar enlaces, no lei nada al respecto en la guia, en fin puse el enlace en el titulo, espero no cometer ninguna infraccion, solo con el fin de aclarar el post.

gracias

Última edición por Casimiro Noteví fecha: 11-09-2010 a las 20:31:44.
Responder Con Cita
  #6  
Antiguo 11-09-2010
Avatar de yapt
yapt yapt is offline
Miembro
 
Registrado: sep 2006
Ubicación: España
Posts: 258
Poder: 20
yapt Va por buen camino
Chelard,

normalmente esto no funciona así. Tienes unas directrices generales, al menos intentalo y vuelve con las dudas concretas que puedas tener.

Pero veo que, al menos, eres de los que responden y.... bueno... que aquí va (para referencia futura):

En PostGreSQL (8.4):

Código SQL [-]
/*
  Creamos la función que será llamada por el TRIGGER.
*/

CREATE OR REPLACE FUNCTION "f_eventoInsert"()
  RETURNS trigger AS
$BODY$BEGIN
  NOTIFY pgEventoInsert;
  RETURN NEW;
END;$BODY$
  LANGUAGE 'plpgsql' VOLATILE COST 100;

/*
  Creamos la tabla.
*/
CREATE TABLE "testEventos"
(
  id numeric(5,0) NOT NULL,
  nombre character varying(10),
  CONSTRAINT "pk_testEventos" PRIMARY KEY (id)
)
WITH (OIDS=FALSE);


/*
  Creamos el Trigger y lo asociamos a la tabla.
*/
-- Trigger: tg_test_eventoInsert on "testEventos"
-- DROP TRIGGER "tg_test_eventoInsert" ON "testEventos";
CREATE TRIGGER "tg_test_eventoInsert"
  AFTER INSERT
  ON "testEventos"
  FOR EACH ROW
  EXECUTE PROCEDURE "f_eventoInsert"();



Y en Delphi. Esto está hecho con los controles de las Devart (PgDAC) que son los que yo tengo licenciados y no con UNIDAC que es el que has comprado tú (tengo la esperanza de que así sea).


Delphi:

{ El formulario.... }

Código Delphi [-]
object Form1: TForm1
  Left = 382
  Top = 212
  Caption = 'Form1'
  ClientHeight = 255
  ClientWidth = 288
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object Memo1: TMemo
    AlignWithMargins = True
    Left = 3
    Top = 87
    Width = 282
    Height = 165
    Align = alClient
    TabOrder = 0
    ExplicitLeft = 40
    ExplicitTop = 144
    ExplicitWidth = 185
    ExplicitHeight = 89
  end
  object Panel1: TPanel
    AlignWithMargins = True
    Left = 3
    Top = 3
    Width = 282
    Height = 78
    Align = alTop
    BevelOuter = bvNone
    TabOrder = 1
    ExplicitWidth = 178
    object Button1: TButton
      Left = 8
      Top = 8
      Width = 75
      Height = 25
      Caption = 'Conectar'
      TabOrder = 0
      OnClick = Button1Click
    end
    object Button2: TButton
      Left = 89
      Top = 16
      Width = 75
      Height = 25
      Caption = 'Suscribir'
      TabOrder = 1
      OnClick = Button2Click
    end
    object Button3: TButton
      Left = 89
      Top = 45
      Width = 75
      Height = 25
      Caption = 'DeSuscribir'
      TabOrder = 2
      OnClick = Button3Click
    end
    object Button4: TButton
      Left = 8
      Top = 53
      Width = 75
      Height = 25
      Caption = 'Desconectar'
      TabOrder = 3
      OnClick = Button4Click
    end
  end
  object PgConnection1: TPgConnection
    Username = 'usuario'
    Password = 'clave'
    Server = 'localhost'
    Connected = True
    LoginPrompt = False
    Database = 'postgres'
    Left = 195
    Top = 19
  end
  object PgAlerter1: TPgAlerter
    Events = 'pgEventoInsert'
    Connection = PgConnection1
    OnEvent = PgAlerter1Event
    Left = 203
    Top = 67
  end
end


{ El Código.... }

Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, DBAccess, PgAccess, StdCtrls, ExtCtrls, DAAlerter, PgAlerter;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Panel1: TPanel;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    PgConnection1: TPgConnection;
    PgAlerter1: TPgAlerter;
    procedure Button1Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure PgAlerter1Event(Sender: TObject; const EventName: string;
      PID: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  PgConnection1.Connect;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  PgAlerter1.Active := true;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  PgAlerter1.Active := false;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
  PgConnection1.Disconnect;
end;

procedure TForm1.PgAlerter1Event(Sender: TObject; const EventName: string;
  PID: Integer);
begin
  Memo1.Lines.Add('['+TimeToStr(now)+']'+'El proceso: ' + IntToStr(PID) + ' ha lanzado el evento: ' + EventName);
end;

end.

Cuando lo conviertas a UNIDAC, deja aquí los cambios para que sirvan para futuros visitantes.

Gracias.
Responder Con Cita
  #7  
Antiguo 12-09-2010
chelard chelard is offline
Miembro
 
Registrado: nov 2009
Posts: 12
Poder: 0
chelard Va por buen camino
Hola Yapt:

Muchisimas gracias por responder, y practicamente lo hiciste todo, mucho mas de lo que esperaba,

Si lo intente, desgraciadamente el primer paso era el trigger y ahi es donde me quede,

Manos a la obra para pasarlo a Unidac y en seguida posteo los cambios,

Vamos te mereces un millon de gracias, me has ahorrado mucho trabajo.
Volvere pronto para poner los cambios.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Capturar Eventos de Windows berna API de Windows 4 07-10-2008 19:40:52
Capturar Eventos del Control Remoto lachuza API de Windows 2 05-06-2008 20:36:05
capturar eventos de un telefono fedeloko API de Windows 0 04-10-2006 01:35:48
Capturar eventos de Windows Carlos G. C++ Builder 1 19-08-2004 14:22:28
Capturar eventos de componentes vichovi OOP 3 13-06-2003 19:01:33


La franja horaria es GMT +2. Ahora son las 15:54:24.


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