Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   firebird y mdo (https://www.clubdelphi.com/foros/showthread.php?t=37078)

aladelta 02-11-2006 00:08:04

firebird y mdo
 
Hola a todos

tengo la necesidad de preguntar algo que veo un poco feo con estos componentes y el firebird....

Uso el firebird 2.0 y los componentes mdo...conecto un mdodatabase con un mdotransaction con un mdodataset con un mdodatasource

Hasta aqui todo bien, veo en un grid la tabla seleccionada.. ahora bien, me doy cuenta de que en el momento en que pongo el mdodatasource.active para ver los datos, se pone el mdotransaction.active con la consiguiente "starttransaction" y comienza lo feo, porque solo estoy visualizando, es decir tengo la tabla en "dsbrowse", ¿porque tengo que tener una transaccion abierta si no estoy modificando nada?

A raiz de esto, veo que cuando inserto un registro, que por cierto lo hace bien, tengo que hacer el mdotransaction.commit, y lo hago en el evento afterpost del mdodataset, pero en ese momento se cierra la transaccion y se cierra el mdodataset tambien dejando el grid en blanco...y tengo que volver a abrir el mdodataset

¿esto es correcto?, estos componentes ¿trabajan asii?, la forma de trabajar con BDE y paradox aunque "diferente", no pasaban estas cosas...

Gracias..

tefots 02-11-2006 00:42:55

cualquier operacion que hagas con firebird debes abrir una transaccion
por eso se pone activa nada mas abrir la bd.
tanto con mdo como con ibx has de asignar la transaccion por defecto con la cual trabajar , tanto a la bd como a los datasets.

y tienes que usar commitretaining , de lo contrario cierra la transacción y el dataset.

jachguate 02-11-2006 15:09:33

Si estas acostumbrado a trabajar con el BDE y no queres aprender todas estas complicaciones de IBX/MDO, tenes la opción de usar IBObjects, que encapsulan la complejidad del manejo de transacciones y mantener cursores abiertos de la misma forma que lo hacía antes el BDE.

Estos componentes son de pago, pero si aún no estas generando ingresos con tu proyecto, no tenes negado su uso: Trustware license

Hasta luego.

;)

Lepe 02-11-2006 16:19:11

El mdotransaction ¿o era el mdoconnection? tiene una propiedad Autocommit para realizar automáticamente el commit, así no tienes que hacerlo manualmente.

Quizás puedas usar CommitRetaining para mantener la transacción y poder ver los datos recién agregados en el grid.

De todas formas, deberías estudiar el tema de transacciones en los pdf de interbase/ firebird desde www.ibphoenix.com para entender al 100 % como funcionan.

Saludos

aladelta 02-11-2006 22:29:46

Hola a todos,

Cita:

Cita
Cita:

Empezado por tefots
cualquier operacion que hagas con firebird debes abrir una transaccion por eso se pone activa nada mas abrir la bd.tanto con mdo como con ibx has de asignar la transaccion por defecto con la cual trabajar , tanto a la bd como a los datasets. y tienes que usar commitretaining , de lo contrario cierra la transacción y el dataset.

Ok, pero si hago commitretaining los demas usuarios no veran esos cambios, y por lo que veo es la unica manera de hacer un dbgrid editable con este mdodataset porque con mdosql u otro no podria hacerse editable ¿noo?...y mejor el mdotable no usarlo...

Cita:

Cita
Cita:

Empezado por jachguate
Si estas acostumbrado a trabajar con el BDE y no queres aprender todas estas complicaciones de IBX/MDO, tenes la opción de usar IBObjects, que encapsulan la complejidad del manejo de transacciones y mantener cursores abiertos de la misma forma que lo hacía antes el BDE.

hombre, si que estoy muy acostumbrado al BDE, porque empeze con Dbase3-plus, despues clipper, despues delphi con el BDE en la version 1 hasta hoy, y me cuesta mucho cambiar la mentalidad al nuevo motor, pero me gusta aprender y voy a estar pegando palos hasta que lo moldee y lo haga a mi gusto...y terminate manejando y controlando la firebird pero se que me va a costar mucho tiempo, pero gracias a vosotros que estais ahi siempre para poder apoyar mis dudas....y voy a probar tambien los IBObjects a ver que tal....

Cita:

Cita
Cita:

Empezado por lepe
El mdotransaction ¿o era el mdoconnection? tiene una propiedad Autocommit para realizar automáticamente el commit, así no tienes que hacerlo manualmente.

si que la tiene, pero solo funciona cuando se cumple el tiempo establecido en la propiedad idletimmer del mismo componente mdotransaction, y si la propiedad DefaultAction tiene el TACommit pues se volvio a joder el invento, pero de forma automatica.....

Una ultima cosilla, al insertar con el mdodataset, me crea el registro pero sale el ultimo en el que estoy situado, y asi repetidamente tantas veces como clicks haga en el boton de insertar, ¿la unica forma es cerrar y abrir, en cada insercion, o modificacion?, por que, en el delete si lo hace instantaneo y visible en el dbgrid...

Y....Gracias a todos por el interes....

aladelta 03-11-2006 00:05:59

Hola otra vez...

Tambien me gustaria comentar, el porque???, porque desde un dbgrid con el mdodataset, cuando mofidico es perfecto, y sale todo bien, pero al insertar esta el problema de que o bien me inserta un registro "en blanco en el dbgrid" pero a traves del ibexpert esta correcto y hay que hacer por obligacion un commit y volver a abrir el mdodataset....

Gracias

jachguate 03-11-2006 00:09:33

Probablemente vos no le estas asignando un valor a la llave primaria a dicho registro desde delphi, o bien lo estas modificando en triggers before insert en la base de datos. Si esto es así, mdo no podrá localizar el registro en la base de datos después de realizada la inserción y por tanto no puede dejarlo como "registro activo".

Hasta luego.

;)

aladelta 03-11-2006 08:29:40

Buenos dias...

Asi lo hago, a traves de un triggers de la base de datos, entonces debo entender que el campo indice primario cuando lo tengo en un dbgrid o edito la tabla directamente, al insertar lo haga desde el mdodataset y cuando son master/Detail, en los detail lo haga desde un triggers para eviar el null contagioso??....

jachguate 03-11-2006 16:24:31

Cita:

Empezado por aladelta
Asi lo hago, a traves de un triggers de la base de datos, entonces debo entender que el campo indice primario cuando lo tengo en un dbgrid o edito la tabla directamente, al insertar lo haga desde el mdodataset

Los componentes TMDOQuery y TMDODataset tienen la propiedad GeneratorLink, con la que delegas a MDO la gestión de la asignación de una llave basada en un generador, con la ventaja que al hacerlo del lado de delphi, evitaras el efecto que tenías.

Cita:

Empezado por aladelta
y cuando son master/Detail, en los detail lo haga desde un triggers para eviar el null contagioso??....

Esto si no lo entendí... cuando son master detail, normalmente asigno su campo de relación con el maestro en el evento OnNewRecord, pero no se si es a lo que te referís.

Hasta luego.

;)

aladelta 03-11-2006 22:08:21

Hola a todos...

No sabia lo de la propiedad generatorlink de los mdo, voy a investigar pues me parece buena idea la de generar desde delphi el campo indice en vez de la tabla....yo estaba maquinando algo parecido, pensando en un procedimiento de la bd que me genere el id y lo devuelva al delphi para añadir el registro, vamos algo parecido al gen_id pero en vez de hacerlo en la bd hacerlo en delphi, sin usar triggers para esos campos...

Y si que me refiero a los campos de relacion entre tablas cuando son master/Detail y en relacion a lo anterior aqui en vez de usar el onnewrecord que me parece muy bien, voy a intentar hacerlo en un trigger en la maestro para generar el registro en la detalle. a ver que tal...

Gracias por todo...

aladelta 04-11-2006 00:24:58

Hola de nuevo...

jachguate, ya he progado el generatorlink y funciona todo muy bien, como estaba previsto, al insertar ya lo veo al instante en el grid, pero ¿como hacer si usas mas de un generador en la misma tabla cuando tienes varios campos clave?...aunque observo un detalle, y es que al crear un registro nuevo, y estando "order by campo" en la selectsql, lo inserta donde le parece, nunca en el orden establecido....¿que te parece?

Gracias

aladelta 04-11-2006 00:29:57

Hola otra vez

al hacer en el evento afterpost del mdodataset un commitretainig y despues un last, funciona de muerte....ya que el registro que se esta insertando debe de estar al final de la lista ordenada...solo queda estudiar como hacer para que varios generadores se activen al crear un registro y todo desde delphi

Hasta luego...:)

jachguate 04-11-2006 00:40:43

Cita:

Empezado por aladelta
al hacer en el evento afterpost del mdodataset un commitretainig y despues un last, funciona de muerte....ya que el registro que se esta insertando debe de estar al final de la lista ordenada...

Por favor, no abuses del commitretaining, tiene implicaciones con el desempeño de la base de datos. Es mejor hacer un commit completo siempre que se pueda.

Cita:

Empezado por aladelta
solo queda estudiar como hacer para que varios generadores se activen al crear un registro y todo desde delphi

No hay forma que yo conozca de que MDO lo maneje automáticamente, sin embargo podes hacer lo vos fácilmente:

Código Delphi [-]
procedure TForm1.mdoquery1BeforePost(Sender: TDataSet);
begin
  if MDOQuery1.state = dsInsert then
    with TMDOQuery.Create(nil) do
      try
        Database := MDODatabase1;
        SQL.Text := 'select gen_id(generador, 1) from rdb$database';
        Open;
        MDOQuery1Campo2.AsInteger := Fields[0].AsInteger;
      finally
        free;
      end;
end;

La idea es esa...

Hasta luego.

;)


La franja horaria es GMT +2. Ahora son las 05:06:16.

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