Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 02-11-2006
aladelta aladelta is offline
Miembro
 
Registrado: jul 2003
Posts: 70
Poder: 21
aladelta Va por buen camino
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..
Responder Con Cita
  #2  
Antiguo 02-11-2006
tefots tefots is offline
Miembro
 
Registrado: feb 2005
Posts: 108
Poder: 20
tefots Va por buen camino
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.
Responder Con Cita
  #3  
Antiguo 02-11-2006
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
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.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #4  
Antiguo 02-11-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
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
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #5  
Antiguo 02-11-2006
aladelta aladelta is offline
Miembro
 
Registrado: jul 2003
Posts: 70
Poder: 21
aladelta Va por buen camino
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....
Responder Con Cita
  #6  
Antiguo 03-11-2006
aladelta aladelta is offline
Miembro
 
Registrado: jul 2003
Posts: 70
Poder: 21
aladelta Va por buen camino
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
Responder Con Cita
  #7  
Antiguo 03-11-2006
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
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.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #8  
Antiguo 03-11-2006
aladelta aladelta is offline
Miembro
 
Registrado: jul 2003
Posts: 70
Poder: 21
aladelta Va por buen camino
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??....
Responder Con Cita
  #9  
Antiguo 03-11-2006
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
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.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #10  
Antiguo 03-11-2006
aladelta aladelta is offline
Miembro
 
Registrado: jul 2003
Posts: 70
Poder: 21
aladelta Va por buen camino
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...
Responder Con Cita
  #11  
Antiguo 04-11-2006
aladelta aladelta is offline
Miembro
 
Registrado: jul 2003
Posts: 70
Poder: 21
aladelta Va por buen camino
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
Responder Con Cita
  #12  
Antiguo 04-11-2006
aladelta aladelta is offline
Miembro
 
Registrado: jul 2003
Posts: 70
Poder: 21
aladelta Va por buen camino
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...
Responder Con Cita
  #13  
Antiguo 04-11-2006
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
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.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
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
alguien ha utilizado Firebird DDX provider? (conectarse con db en firebird!) JuanErasmo .NET 1 04-11-2006 16:17:12
como actualizar firebird 1.5 a firebird 2.0 cidarta Firebird e Interbase 3 26-04-2006 08:57:07
Firebird : Llamado para probadores de Firebird 2.0 JOSEPE Firebird e Interbase 0 12-03-2005 20:33:18
Problemas Firebird Super Server 1.5 con RFunc Firebird v 1.0 Prophoenix Firebird e Interbase 1 09-03-2004 11:40:48


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


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