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)
-   -   Ayuda con Firebird, Transacciones, Zeos y Delphi (https://www.clubdelphi.com/foros/showthread.php?t=72087)

ElGatitoTapatio 27-01-2011 05:04:59

Ayuda con Firebird, Transacciones, Zeos y Delphi
 
Mis estimados miembros de este excelente foro despues de leer y leer posts acerca de firebird buscando solucion a mis problemas, me he atrevido a pedirles de su ayuda.

LA verdad es que soy un super novato en Firebird y su utilizacion con Delphi, eso me doy cuenta al leer todo lo que hay en este importante foro, por lo tanto les expongo mis broncas.

Tengo un sistema desarrollado en delphi el cual se utiliza como cliente servidor, uno de los problemas es que cuando hago cambios en un cliente (inserts, updates, deletes) estos cambios no se ven reflejados en algun otro cliente hasta que se cierran y se abren las aplicaciones, esto despues de lo que he leido al parecer es por como estoy utilizando las transacciones o tal vez por la falta de utilizacion de las mismas. :confused:

Otra bronca es que al agregar muchos registros despues de un numero determinado el sistema se hace muy lento hasta el punto de bloquearse y se tiene que cerrar la aplicacion, esto tambien parece ser por la bronca de las transacciones, al parecer no las estoy cerrando por lo que he leido, pero por eso quiero confirmarlo con ustedes.

Les comento que utilizo Firebird 2.1.3, DElphi 7 y componentes ZEOS, que estos ultimos son tambien algo por lo que me hace pedir ayuda, ya que al parecer esto es mucho mas sencillo con los componentes IB. Pero pues como tendria que cambiar todo el sistema o por lo menos los componentes pues prefiero preguntar antes para, si se puede ahorrar trabajo.

Les anexo basicamente el codigo que estoy utilizando para los procesos que implican un cambio en la base de datos, tambien les comento que me doy cuenta que en la propiedad de TZConnection.TransactIsolationLEvel tenia tiNone, asi que creo que debo de comenzar por cambiarla por tiReadCommitted, creo yo.

Este es el codigo:


Código Delphi [-]
           with dm_databases.ZConnection_LAXP do
            Try
              frm_main.GuardaCursor;
              ExecuteDirect('Delete from HISTORICO_TRANSACCIONES '+
                            'where FOLIO = '+ed_folio.Text);
              for i := 1 to grid_pesadas.RowCount do
                ExecuteDirect('Insert into HISTORICO_TRANSACCIONES(FOLIO,ID_TIPO,TOT_EJES,NO_EJE,ID_CAMION,ID_CHOFER,'+
                              'ID_EMPRESA,ID_PRODUCTO,PESO_INICIAL,PESO_CIERRE,FECHA_INICIAL,FECHA_CIERRE,'+
                              'STATUS,PLACA) Values('+ed_folio.Text+','+IntToStr(TipoBascula)+','+IntToStr(ed_ejes.Value)+
                              ','+grid_pesadas.Cells[0,i-1]+','+LIdCamiones[cb_camion.itemindex]+','+LIdChoferes[cb_chofer.itemindex]+
                              ','+LIdEmpresas[cb_empresa.itemindex]+','+LIdProductos[cb_producto.itemindex]+','+
                              grid_pesadas.Cells[1,i-1]+','+grid_pesadas.Cells[2,i-1]+','''+ed_fecha_inicial.text+' '+
                              ed_time_inicial.text+''','''+ed_fecha_cierre.text+' '+ed_time_cierre.text+''','+IntToStr(status)+
                              ','''+ed_placa_camion.text+''')');
              frm_main.RestauraCursor;
              HistorialTransacciones;
              NuevaTransaccion;
              MessageBox(0, 'Se ha guardado la transacción correctamente.', 'Transacción almacenada', MB_ICONINFORMATION or MB_OK or MB_TASKMODAL);
            except
                frm_main.RestauraCursor;
                MessageBox(0, 'Ocurrió algún error al guardar la transacción.', 'Error', MB_ICONERROR or MB_OK or MB_TASKMODAL);
            end

Debo de aclarar que cuando menciono transaccion en el codigo no me refiero a transacciones de bases de datos, sino al proceso que se realiza, ya que asi se le llama en el sistema en cuestion.

La verdad es que me da pena poner el codigo porque se que soy novatazo pero no me queda de otra.

De antemano les agradezco enormemente la ayuda que me puedan dar .

Saludos!!

Casimiro Notevi 27-01-2011 13:26:27

Zeos es perfectamente válido, no veo necesario el que lo cambies, salvo que necesitaras más velocidad.
Mira este hilo, es un pequeño tutorial de Caral, en él crea un sistema básico con firebird y también indica los parámetros para el componente de transacciones.
Básicamente pones un componente Basedato y otro Transaction, cuando haces alguna grabación, o sea '.post' (al insertar, borrar y editar) debes confirmar la transacción, normalmente en el evento AfterPost del Dataset, algo así como: dataset.transaction.commit (o commitreaining).
Algunos componentes tienen una propiedad para que lo haga automáticamente, el commit, algo así como: autocommit=yes/no y se encargaría él de hacer el commit tras cualquier post.
Échale un vistazo al hilo que te he indicado y aquí estamos por si tienes alguna duda más.

ElGatitoTapatio 27-01-2011 17:35:06

Gracias por tu pronta respuesta Casimiro.

Fijate que si lei el tutorial de Caral antes de preguntar, es por esto que les comento que talvez lo mejor seria cambiar a componentes IB ya que en ese tutorial se encuentra muy bien explicado su uso. Lamentablemente yo tengo los componentes Zeos en el sistema y no he encontrado un tutorial igual para estos.

Deja reviso los parametros que me comentas y hago algunas pruebas con Zeos para ver si lo puedo solucionar y los mantengo al tanto.

Gracias.

lucasarts_18 28-01-2011 02:15:22

Estimado ElGatitoTapatio

Tenía un problema similar al tuyo cuando me inicie con Firebird, com odice nuestro compañero Casimiro, yo lo solucione con la propiedad autocommit=true.

Intenta ver este parametros u otro del componente database y despues nos cuentas.

Saludos -.

ElGatitoTapatio 28-01-2011 16:23:05

Mis estimados!!

Al parecer, salvo lo que diga el cliente, ya solucione el problema como lo sospeche desde un principio creo que el problema fue la propiedad TZConnection.TransactIsolationLEvel donde tenia tiNone, la cambie por tiReadCommitted y parece ser que ya se actualizan al momento los datos. Ahora solo falta verificar lo de la lentitud del sistema al pasar mucho tiempo trabajando con el mismo. La verdad es que creo que esto tambien se va a solucionar, ya que creo que las transacciones se quedaban abiertas y llegaba un momento en que se saturaba la base de datos, esto salvo los mejores comentarios que me puedan dar ustedes.

Pero bueno, esperemos a que lo pruebe el cliente y veremos que resulta.

De nuevo les agradesco su ayuda.

Saludos y los mantendré informados.


La franja horaria es GMT +2. Ahora son las 17:41:42.

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