Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Transacciones en Interbase
Ir a página Anterior  1, 2
 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Bases de Datos
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: TRANSACCIONES Responder citando

Cesar el componente que mencionas al actualizarlo me da bastantes errores y he decidido desinstalarlo.

¿Puedes decirme con condigo como lo hago?

Question Arrow ¿El TIBTransaction actúa cuando modificas la base de datos mediante sentencias SQL solamente, o también cuando modificas un registro con el componente TIBTable y por ejemplo Post()...?
PARA aplicar una transacción que eventos debo de utilizar, por ejemplo: Rolling Eyes
Código:


MDatos->IBTable->Campo->Post();


MDatos->IBTransaction->Active = true;
//O esta otra
MDatoa->IBTransaction->StartTransaction();

//Y luego

MDatos->IBTransaction->Commit();
//O esta otra
Mdatos->IBTransaction->CommitRetaining();



Question Arrow ¿Cuando ejecutas el “Commit() o CommitRetaining()”, la propiedad “MDatos->IBTransaction->Active” se pone a false o permanece en true? Shocked


Exclamation Como ves tanto a Grandel como a mi no hace falta mas ayuda. GRACIAS.
_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Re: TRANSACCIONES Responder citando

JesúsGandia escribió:
Cesar el componente que mencionas al actualizarlo me da bastantes errores y he decidido desinstalarlo.

¿Puedes decirme como lo hago con código?

Question Arrow ¿El TIBTransaction actúa cuando modificas la base de datos mediante sentencias SQL solamente, o también cuando modificas un registro con el componente TIBTable y por ejemplo Post()...?
PARA aplicar una transacción que eventos debo de utilizar, por ejemplo: Rolling Eyes
Código:


MDatos->IBTable->Campo->Post();


MDatos->IBTransaction->Active = true;
//O esta otra
MDatoa->IBTransaction->StartTransaction();

//Y luego

MDatos->IBTransaction->Commit();
//O esta otra
Mdatos->IBTransaction->CommitRetaining();



Question Arrow ¿Cuando ejecutas el “Commit() o CommitRetaining()”, la propiedad “MDatos->IBTransaction->Active” se pone a false o permanece en true? Shocked


Exclamation Como ves tanto a Grandel como a mi no hace falta mas ayuda. GRACIAS.

_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Responder citando

es raro que te marque errores,

cuando haces post(), no deshabilitas la transaccion, este se debe cerrar con Mdatos->IBTransaction->CommitRetaining();

los paso son los siguientes,
1.- habilitas la transaccion,
2.- modificas, agregas o eliminas
3.- cierras la transaccion, para que las operaciones se reflejen en la base de datos con Mdatos->IBTransaction->CommitRetaining(); lo que hace esta sentencia, es que aplica las transacciones, y te deja el cursor de la tabla en el registro, si usas Mdatos->IBTransaction->Commit(); cierras el DataSet, y tienes que volver abrirlo..

si te causa problemas, el componente, posiblemente,tengas instalado una version de firebird o interbase, yo lo uso de la siguiente manera, no instalo interbase, cuando instalo el builder, en su lugar utilizo firebird, 1.5.x, ya que el componente, viene echo para Interbaes 7.1

saludos, y me cuentas de nuevo..
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Continua Responder citando

No entiendo tu respuesta…
Si el componente viene hecho para Internase 7.1 y yo trabajo con esta versión, lo normal seria que no me diese problemas a mi y si a ti que trabajas con firebird 1.5x, pero bueno este tema ya lo tengo resuelto, pues he decidido activar las transacciones yo mismo explícitamente con código y esa era mi pregunta principal.

En resumen, te expongo las siguientes preguntas enumeradas y te pido que me respondas si es posible con las respuestas numeradas, para así de una vez por todas entenderlas bien y no molestarte más con este tema:

PREGUNTAS

PRIMERA:
¿Para activar las transacciones que método utilizo, siempre refiriéndome al código que tengo que escribir?
ESTE METODO: MDatos->IBTransaction->Active = true;
O ESTE OTRO: MDatos->IBTransaction->StarTransaction();

SEGUNDA:
¿Para confirmar la transacción que método utilizo, y que diferencia hay entre uno y otro?
ESTE METODO: MDatos->IBTransaction->Commit();
O ESTE OTRO: MDatos->IBTransaction->CommitRetaining();

TERCERA:
¿Cuándo ejecuto alguno de los métodos de la SEGUNDA PREGUNTA, la transacción deja de estar activa, finaliza o se cierra?

CUARTA:
¿Si es así, debería de volver a iniciar la transacción con alguno de los métodos de la PRIMERA PREGUNTA en otra parte del código cuando me hiciese falta volver a lanzar una transacción?

QUINTA:
Según me dices cuando hago un CommitRetaining(), se cierra el DataSet. ¿Pero cual? Se supone que cuando ejecuto una transacción con Commit(), o CommitRetaining(), la ejecuto contra la base de datos no contra la tabla. Es decir no entiendo que es lo que me dices que se cierra: Si la base de datos o la tabla implicada.

SEXTA:
En resumen lo que pretendo en mi programa, TPV-Hosteleria, es que si un establecimiento tiene mas de una caja registradora, es decir mas de un PC-TPV, en el mismo establecimiento, y todos ellos trabajan sobre la misma Base de Datos, que cuando uno de ellos modifique, actualice, borre o cancele una operación en la BD. Confirmar la transacción al momento para que los otros PC-TPV, puedan ver los cambios en tiempo real.
Siempre que modifico cualquier cosa de la BD. Debería de activar y ejecutar una transacción confirmándola, por lo cual el tiempo que está activa una transacción debería de ser muy corta en cuanto a tiempo se refiere. Por ejemplo en mi código siempre debería de activar una transacción antes del método Edit(), Insert() o Append() y seguidamente ejecutar un Commit(), o CommitRetaining() después del método Post(),
De esta forma los otros PV-TPV deberían de poder acceder a la información actualizada en tiempo real.

Posdata:
Perdona que insista con este tema, pero quizás no me explico correctamente o no sé plantearte mis dudas de una forma razonable. GRACIAS POR TODO CESAR.
_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Re: Continua Responder citando

JesúsGandia escribió:

PREGUNTAS

PRIMERA:
¿Para activar las transacciones que método utilizo, siempre refiriéndome al código que tengo que escribir?
ESTE METODO: MDatos->IBTransaction->Active = true;

- Esta es para activar el componente, y conectarlo a la base de datos

O ESTE OTRO: MDatos->IBTransaction->StarTransaction();

- Antes de Editar, modificar, eliminar, debes iniciar la transaccion, con la sentencia anterior.

SEGUNDA:
¿Para confirmar la transacción que método utilizo, y que diferencia hay entre uno y otro?
ESTE METODO: MDatos->IBTransaction->Commit();
- si usas este metodo, todos los dataset, se cierran, y debes volver a abrirlos.

O ESTE OTRO: MDatos->IBTransaction->CommitRetaining();
Con este Metodo, aplicas la transaccion, y dejas activos los DataSet, es mejor usarlo, que en lugar del anterior

TERCERA:
¿Cuándo ejecuto alguno de los métodos de la SEGUNDA PREGUNTA, la transacción deja de estar activa, finaliza o se cierra?
- la transaccion se cierra, con cualquiera de las 2, y para volver a modificar, agregar o eliminar, debes usar StarTransaciton(), de nuevo


CUARTA:
¿Si es así, debería de volver a iniciar la transacción con alguno de los métodos de la PRIMERA PREGUNTA en otra parte del código cuando me hiciese falta volver a lanzar una transacción?

- Solo debes usar la StarTransacction, para indicar que vas a crear una transaccion, si usas el propiedad Active, y la cierras, es como si estuvieras abriendo y cerrando la conexion de las transacciones, es mejor usar StarTransacction()


QUINTA:
Según me dices cuando hago un CommitRetaining(), se cierra el DataSet. ¿Pero cual? Se supone que cuando ejecuto una transacción con Commit(), o CommitRetaining(), la ejecuto contra la base de datos no contra la tabla. Es decir no entiendo que es lo que me dices que se cierra: Si la base de datos o la tabla implicada.

se cierra el dataset, de la base de datos, en teoria, lo que se hace, es cerrar las tablas, pero como estas dependen, del IBDataBase, entonces al cerrarse el IBDataBase, cierras automaticamente las tablas, es mejor usar el CommitRetaining(), para aplicar las transacciones y dejar las tablas, abiertas.

SEXTA:
En resumen lo que pretendo en mi programa, TPV-Hosteleria, es que si un establecimiento tiene mas de una caja registradora, es decir mas de un PC-TPV, en el mismo establecimiento, y todos ellos trabajan sobre la misma Base de Datos, que cuando uno de ellos modifique, actualice, borre o cancele una operación en la BD. Confirmar la transacción al momento para que los otros PC-TPV, puedan ver los cambios en tiempo real.
Siempre que modifico cualquier cosa de la BD. Debería de activar y ejecutar una transacción confirmándola, por lo cual el tiempo que está activa una transacción debería de ser muy corta en cuanto a tiempo se refiere. Por ejemplo en mi código siempre debería de activar una transacción antes del método Edit(), Insert() o Append() y seguidamente ejecutar un Commit(), o CommitRetaining() después del método Post(),
De esta forma los otros PV-TPV deberían de poder acceder a la información actualizada en tiempo real.

Para ello, si quieres, que las otras, terminales reflejen, la transaccion de las otras maquinas, puedes poner un IBEvents, y registras un evento..
asi cuando grabes, generas el evento, como este se ejecuta, en el servidor, y las terminales estan conectadas a la base de datos. el evento se genera, para cada una de ellas, (te recomiendo buscar dentro del foro, tambien he dejado algo sobre el IBEvents), si no lo encuentras, espero darte el link.

Posdata:
Perdona que insista con este tema, pero quizás no me explico correctamente o no sé plantearte mis dudas de una forma razonable. GRACIAS POR TODO CESAR.


Todo esta correcto, espero haberte sido de ayuda
Volver arriba
Mensaje    Asunto: Re: Continua Responder citando

JesúsGandia escribió:

PREGUNTAS

PRIMERA:
¿Para activar las transacciones que método utilizo, siempre refiriéndome al código que tengo que escribir?
ESTE METODO: MDatos->IBTransaction->Active = true;

- Esta es para activar el componente, y conectarlo a la base de datos

O ESTE OTRO: MDatos->IBTransaction->StarTransaction();

- Antes de Editar, modificar, eliminar, debes iniciar la transaccion, con la sentencia anterior.

SEGUNDA:
¿Para confirmar la transacción que método utilizo, y que diferencia hay entre uno y otro?
ESTE METODO: MDatos->IBTransaction->Commit();

- si usas este metodo, todos los dataset, se cierran, y debes volver a abrirlos.
O ESTE OTRO: MDatos->IBTransaction->CommitRetaining();

Con este Metodo, aplicas la transaccion, y dejas activos los DataSet, es mejor usarlo, que en lugar del anterior

TERCERA:
¿Cuándo ejecuto alguno de los métodos de la SEGUNDA PREGUNTA, la transacción deja de estar activa, finaliza o se cierra?

- la transaccion se cierra, con cualquiera de las 2, y para volver a modificar, agregar o eliminar, debes usar StarTransaciton(), de nuevo

CUARTA:
¿Si es así, debería de volver a iniciar la transacción con alguno de los métodos de la PRIMERA PREGUNTA en otra parte del código cuando me hiciese falta volver a lanzar una transacción?

- Solo debes usar la StarTransacction, para indicar que vas a crear una transaccion, si usas el propiedad Active, y la cierras, es como si estuvieras abriendo y cerrando la conexion de las transacciones, es mejor usar StarTransacction()


QUINTA:
Según me dices cuando hago un CommitRetaining(), se cierra el DataSet. ¿Pero cual? Se supone que cuando ejecuto una transacción con Commit(), o CommitRetaining(), la ejecuto contra la base de datos no contra la tabla. Es decir no entiendo que es lo que me dices que se cierra: Si la base de datos o la tabla implicada.

- se cierra el dataset, de la base de datos, en teoria, lo que se hace, es cerrar las tablas, pero como estas dependen, del IBDataBase, entonces al cerrarse el IBDataBase, cierras automaticamente las tablas, es mejor usar el CommitRetaining(), para aplicar las transacciones y dejar las tablas, abiertas.

SEXTA:
En resumen lo que pretendo en mi programa, TPV-Hosteleria, es que si un establecimiento tiene mas de una caja registradora, es decir mas de un PC-TPV, en el mismo establecimiento, y todos ellos trabajan sobre la misma Base de Datos, que cuando uno de ellos modifique, actualice, borre o cancele una operación en la BD. Confirmar la transacción al momento para que los otros PC-TPV, puedan ver los cambios en tiempo real.
Siempre que modifico cualquier cosa de la BD. Debería de activar y ejecutar una transacción confirmándola, por lo cual el tiempo que está activa una transacción debería de ser muy corta en cuanto a tiempo se refiere. Por ejemplo en mi código siempre debería de activar una transacción antes del método Edit(), Insert() o Append() y seguidamente ejecutar un Commit(), o CommitRetaining() después del método Post(),
De esta forma los otros PV-TPV deberían de poder acceder a la información actualizada en tiempo real.

Para ello, si quieres, que las otras, terminales reflejen, la transaccion de las otras maquinas, puedes poner un IBEvents, y registras un evento..
asi cuando grabes, generas el evento, como este se ejecuta, en el servidor, y las terminales estan conectadas a la base de datos. el evento se genera, para cada una de ellas, (te recomiendo buscar dentro del foro, tambien he dejado algo sobre el IBEvents), si no lo encuentras, espero darte el link.

Posdata:
Perdona que insista con este tema, pero quizás no me explico correctamente o no sé plantearte mis dudas de una forma razonable. GRACIAS POR TODO CESAR.


Todo esta correcto, espero haberte sido de ayuda
Volver arriba
Mensaje    Asunto: Responder citando

si ya lo se!!, el LOGIN je je Very Happy
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Gracias Responder citando

Gracias Cesar por todas las respuestas.
Pero...
Cesar citó:
Código:

Para ello, si quieres, que las otras, terminales reflejen, la transaccion de las otras maquinas, puedes poner un IBEvents, y registras un evento..
asi cuando grabes, generas el evento, como este se ejecuta, en el servidor, y las terminales estan conectadas a la base de datos. el evento se genera, para cada una de ellas, (te recomiendo buscar dentro del foro, tambien he dejado algo sobre el IBEvents), si no lo encuentras, espero darte el link.


¿como genero el evento de IBEvent?
He insertado un IBEvents en el modulo de datos y he creado los siguientes eventos en Events: Articulos, Grupos, EstadoComanda, DetallesComanda, Empleados, HistoricoArticulos, Imagenes y Usuarios, en total 8 Eventos, 1 para cada tabla, para saver cuando a habido algún cambio en alguna de ellas, y luego en el EventAlert he puesto este código:
Código:

void __fastcall TMDatos::IBEventosEventAlert(TObject *Sender,
      AnsiString EventName, int EventCount, bool &CancelAlerts)
{
    if (EventName == "Articulos")
        IBTArticulos->Refresh();
    if (EventName == "Grupos")
        IBTGrupos->Refresh();
    if (EventName == "EstadoComanda")
        IBTEstadoComanda->Refresh();
    if (EventName == "DetallesComanda")
        IBTDetComanda->Refresh();
    if (EventName == "Empleados")
        IBTEmpleados->Refresh();
    if (EventName == "HistoricoArticulos")
        IBTHistArticulos->Refresh();
    if (EventName == "Imagenes")
        IBTImagenes->Refresh();
    if (EventName == "Usuarios")
        IBTUsuarios->Refresh();
}

¿Tengo que hacer algun triger o procedimiento almacenado en la BD?
Y si es asi ¿Como?
Estoy un poco verde en este tema y encima creo que si lo tubiese que hacer en la BD, tendria que hacerlo en Código Pascal, pues la verdad es que necesito una ayudita.
¿Podrias ponerme algun ejemplo de como hacerlo? OTRA VEZ, GRACIAS.
_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.


Ultima edición por JesúsGandia el Sab 18 Jun, 2005 12:19 am, editado 1 vez
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Funciona Responder citando

Cesar después de escribirte el Post Nº 22, he modificado el código de mi aplicación y funciona de maravilla, a falta de escribir el código necesario para los IBEvents que no sé, pero espero tu me ayudes a solucionarlo. Ahora puedo abrir una misma mesa desde cualquier PC-TPV, añadir o modificar registros en uno de ellos y el resultado se muestra en el otro, pero eso si, después de hacer algún movimiento en el otro, es decir se muestran las modificaciones que he hecho desde el PC-TPV-1 en el PC-TPV-2, pero solo cuando refresco o modifico algo en el PC-TPV2. Por todo ello creo que la solución como tu bien dices esta en el componente IBEvents. Al final en mi código para no ir repitiendo las instrucciones de IBTransaction he hecho lo siguiente y funciona de mil maravillas. Very Happy


En los Eventos: (BeboreDelete, BeforeEdit, BeforeInsert) de mis TIBTable que son 8 he puesto este código:
Código:

void __fastcall TMDatos::IBTArticulosBeforeEdit(TDataSet *DataSet)
{
    if(!DataSet->Active)
        DataSet->Open();

    if(!IBTransaction->InTransaction)
        IBTransaction->StartTransaction();
}



En los Eventos: (BeboreDelete, BeforeEdit, BeforeInsert) de mis TIBQuery que son 4 he puesto este código:
Código:

void __fastcall TMDatos::IBQHistArticulosBeforeDelete(TDataSet *DataSet)
{
    if(!IBTransaction->InTransaction)
        IBTransaction->StartTransaction();
}


En los Eventos: (AfterDelete, AfterPost) de mis TIBTable que son 8, y mis IBQuery que son 4 he puesto este código:
Código:

void __fastcall TMDatos::IBTArticulosAfterPost(TDataSet *DataSet)
{
    if(IBTransaction->InTransaction)
        IBTransaction->CommitRetaining();
}


El TIBTransaction lo he puesto a “Read Committed” haciendo doble click sobre el componente.
Sus propiedades “AutoStopAction = saCommitRetaining, y DefaultAction = TACommitRetaining”.
Luego en el evento IBDatabaseAfterConnect esto otro:
Código:

void __fastcall TMDatos::IBDatabaseAfterConnect(TObject *Sender)
{
    IBTransaction->Active = true;
    IBTransaction->CommitRetaining();
}


Con todo esto ahorro mucho código, aunque no he encontrado el evento BeforeAppend, ¿Cómo lo soluciono? O quizás no haga falta porque cuando ejecutas un Append() la tabla se pone en modo de edición y por eso quizás le valga el Evento BeforeEdit, ¿Es así, o por el contrario me equivoco?

La verdad es que estoy solucionando todas mis dudas, aunque poco a poco.
Gracias por la grandísima ayuda que me has prestado, ya solo me falta creo, solucionar lo de el componente “IBEvents”. Como no me caso ahí va otra vez… GRACIAS. Wink
_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Responder citando

Bien esto es un poco largo, pero intentare ser lo mas espesifico, en cuanto a la descripcion y utilizacion, del IBEvents, yo lo uso de la siguiente manera, y no tengo problemas, al actualizar entre varias tablas, asi, que ahi va..

Bien lo primero que hay que hacer, es crear un procedimiento almacenado en la base de datos. de la siguiente manera.



Posteriormente dentro del modulo de datos, pones dos componentes

1. IBEvents con las siguientes propiedades


1. IBStoredProc con las siguientes propiedas


bien ya teniendo los siguientes compoentes, y previamente asignados a la base de datos. ahora vamos al codigo.

En el evento despues de conectar en la base, registras el procedimiento y preparas el procedimiento, con el evento Procedure Registrado en la base


ahora bien, cuando grabas, editas, o borras un registro, los codigos son los siguientes

Nuevo o Modificacion
Código:
 DMPROVEEDORES->IBDProveedores->Post(); // grabamos en la tabla
    DMREMOTO->IBTS3->CommitRetaining();  // aplicamos la trasaccion
    DMREMOTO->IBSPS3->ExecProc();   // generamos el evento, para actualizar


Borrado de un Registro
Código:
DMPROVEEDORES->IBDProveedores->Delete();
        DMREMOTO->IBTS3->CommitRetaining();  // aplicamos la trasaccion
        DMREMOTO->IBSPS3->ExecProc();   // generamos el evento, para actualizar


Como te habras dado cuenta, al final viene siempre la generacion del evento.
Código:
DMREMOTO->IBSPS3->ExecProc();   // generamos el evento, para actualizar

Que es el que se encarga de activar el IBEvents, es decir, cada vez que ejecutas el procedimiento almacenado, este genera un POST_EVEN 'RFD', y este evento se envia a todas las apliacaciones, que se encuentren conectadas a la base de datos..

y por ultimo al recibir, el evento en tu Componente IBEventes, y en el evento EventAlert()

Código:
void __fastcall TDMREMOTO::IBES3EventAlert(TObject *Sender, AnsiString EventName,
      int EventCount, bool &CancelAlerts)
{
        if(EventName=="RFD")
        {
            // cuando recibes el evento, actualizas las tablas que te
            // interesan, que no son todas..
        };
}
//---------------------------------------------------------------------------

Compara el evento que se genera, en este caso RFD, y actualizas las tablas, con ApplyUpdates, por ejemplo
Código:
ModuloUsuarios->IBDUsuarios->ApplyUpdates()

quedando algo asi

Código:
void __fastcall TDMREMOTO::IBES3EventAlert(TObject *Sender, AnsiString EventName,
      int EventCount, bool &CancelAlerts)
{
        if(EventName=="RFD")
        {
            // cuando recibes el evento, actualizas las tablas que te
            // interesan, que no son todas..
           ModuloUsuarios->IBDUsuarios->ApplyUpdates();
        };
}
//---------------------------------------------------------------------------


Espero que sea claro, y no tengas tanto problemas con esto..
_________________
Cool


Ultima edición por Cesar C. Salazar Gonzalez el Vie 03 Nov, 2006 6:58 am, editado 1 vez
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Mas claro el agua Responder citando

Cesar, eres superway, mas claro no puede estar, ¡THANKS YOU! Wink Laughing
_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Responder citando

Un saludo.. para todos.

Mas no se puede decir.. je je, este mensaje fue cambiado del original, ya que el anterior fue un momento de nostalgia..
_________________
Cool


Ultima edición por Cesar C. Salazar Gonzalez el Mar 21 Jun, 2005 3:57 pm, editado 1 vez
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Ven cuando quieras Responder citando

Si ese es tu deseo, por mi parte no hay ningun problema. Soy de Valencia (PLAYA DE GANDIA) y si decides venir, mi casa esta abierta. Solo me queda decirte, animate y hazlo. SALUDOS
_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Responder citando

Hola, me vuelvo a sumar al hilo, despues de un tiempo perdido.

Leyendo la explicación de César sobre los eventos quería agregar una cosa más, que es como yo los uso.

En ves de generar un procedimiento almacenado para disparar el evento, es mucho mas facil hacerlo mediante un trigger.

Quedaría asi:

Código:

CREATE TRIGGER ACTUALIZAR_FDB FOR Proveedores
AFTER INSERT AS
BEGIN
  POST_EVENT 'RFD';
END^


y una vez ejecutada la transacción

Código:

DMREMOTO->IBTS3->CommitRetaining();


no es necesario llamar a ningún procedimiento, esto te asegura que no te vallas a olvidar de llamarlo y tener que modificar todos los programas que tenias escritos.

Tiene una desventaja, tienes que crear un trigger por cada tabla. Pero normalmente es lo que uno hace, generando un evento para cada tabla, entonces solo actualizas la tabla que generó el evento.

Esto completa un poco la idea Razz

Suerte
_________________
Crandel

"hay 10 tipos de personas, las que ven en binario y las que no"

Angel Zeitoune - Artículo: Generación de eventos en C++Builder
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.