Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Problema transacciones IBX + Delphi Berlin (https://www.clubdelphi.com/foros/showthread.php?t=93161)

lavtaro 02-06-2018 06:50:17

Problema transacciones IBX + Delphi Berlin
 
Hola estimados, vengo a pedir su ayuda con un problema que tengo con IBX + Delphi Berlin, después de trabajar con Delphi 2007 con IBX sin problemas, usando la misma configuración en Delphi Berlin tengo el problema que para que se vean los datos modificados en otros equipos de la red tengo que cerrar la aplicación (cosa que tampoco me pasaba con MDO). Como dato tampoco IBExpert puede ver las modificaciones pero mi aplicación si ve las modificaciones de IBExpert.

Esta es la configuración de los componentes:

TIBDatabase:
Connected = True
DatabaseName = 'Server/3050:C:\firebird\Base.FDB'
Params.Strings = (
'user_name=SYSDBA'
'password=masterkey'
'lc_ctype=ISO8859_1')
LoginPrompt = False
DefaultTransaction = Transaction
ServerType = 'IBServer'

TIBTransaction:
Active = True
Params.Strings = (
'read_committed'
'rec_version'
'nowait')
AutoStopAction = saCommit

Este es un ejemplo de código usando un procedimiento almacenado (simplificado para mejorar lectura):

Código:

  StoreProcedure.ParamByName('Parametro1').AsInteger := 1;
  StoreProcedure.ExecProc;
  nId := StoreProcedure.ParamByName('LASTID').AsInteger;
  DM.Transaction.CommitRetaining;

Procedimiento almacenado (simplificado para mejorar lectura):

Código:

create or alter procedure GRABA_ENCAB (
    Parametro1 integer

returns (
    LASTID integer)
as
begin
  INSERT INTO TABLA
          (
          campo1
          )
  VALUES
          (
          :Parametro1
          )
  returning IDTABLA
        INTO :lastid;
end^

Otra prueba:
Código:

  DM.Transaction.Active := False;
  DM.Transaction.StartTransaction;
  StoreProcedure.ParamByName('Parametro1').AsInteger := 1;
  StoreProcedure.ExecProc;
  nId := StoreProcedure.ParamByName('LASTID').AsInteger;
  DM.Transaction.Commit;

Versiones de Software que ocupo:
- Embarcadero® Delphi 10.1 Berlin Version 24.0.25048.9432
- InterbaseExpress 19,19
- Firebird-2.5.2.26540_0_x64 en su instalación por defecto.

SO estaciones de trabajo donde se hacen pruebas:
- Windows 7
- Windows 8
- Windows XP

SO usado para servidores probados:
- Windows server 2012 R2
- Windows 7

De antemano muchas gracias.

Casimiro Notevi 02-06-2018 10:10:51

¿Se supone que tienes un componente IBDatabase y otro IBTransaction enlazados?

lavtaro 02-06-2018 21:07:20

Cita:

Empezado por Casimiro Notevi (Mensaje 526792)
¿Se supone que tienes un componente IBDatabase y otro IBTransaction enlazados?

Hola Casimiro, exactamente, el TIBDatabase está enlazado con el TIBTransaction, también probé dejando vacía la propiedad DefaultDatabase del TIBTransaction o enlazado con el TIBDatabase y tampoco da resultado, saludos.

Casimiro Notevi 03-06-2018 00:37:45

Si tienes esos componentes "TStoredProc" enlazados con el componente TIBTransaction, entonces no necesitas iniciar otra transacción.
Sería más o menos, así:
Código Delphi [-]
try
  DM.SP.Close;
  DM.SP.ParamByName('CODIGOCUENTA').AsString  := DS1.DataSet.FieldByName('CODIGOCUENTA').AsString;
  DM.SP.ExecProc;
finally
  DM.SP.Transaction.CommitRetaining;
end;

lavtaro 03-06-2018 00:48:59

Actualización: en el mismo entorno de pruebas con Firedac funciona sin problemas usando este pequeño manual de la página de embarcadero Connect to Firebird (FireDAC) : http://docwiki.embarcadero.com/RADSt...bird_(FireDAC)

Con la diferencia en el FDConnection1 la propiedad UpdateTransaction = Transaction , relacioné el componente de conexión con el componente de transacción.

No me gustaría cambiar de componentes :( , alguna experiencia en el uso de firedac con Firebird 2.5? de antemano muchas gracias ^\||/.

También encontré un manual en la página oficial de Firebird Chapter 3: Developing Firebird Applications in Delphi: https://firebirdsql.org/file/documen...0-firedac.html

lavtaro 03-06-2018 00:57:32

Cita:

Empezado por Casimiro Notevi (Mensaje 526799)
Si tienes esos componentes "TStoredProc" enlazados con el componente TIBTransaction, entonces no necesitas iniciar otra transacción.
Sería más o menos, así:
Código Delphi [-]
try
  DM.SP.Close;
  DM.SP.ParamByName('CODIGOCUENTA').AsString  := DS1.DataSet.FieldByName('CODIGOCUENTA').AsString;
  DM.SP.ExecProc;
finally
  DM.SP.Transaction.CommitRetaining;
end;

De esa manera lo vengo usando hace años estimado Casimiro (voy a copiar esa estructura con control de excepciones :D ), no me gustaría cambiar de componentes, saludos.

Casimiro Notevi 03-06-2018 15:44:56

Cita:

Empezado por lavtaro (Mensaje 526801)
De esa manera lo vengo usando hace años estimado Casimiro (voy a copiar esa estructura con control de excepciones :D ), no me gustaría cambiar de componentes, saludos.

Pues no es lo que has puesto arriba.

lavtaro 03-06-2018 19:40:10

Cita:

Empezado por Casimiro Notevi (Mensaje 526805)
Pues no es lo que has puesto arriba.

Efectivamente estimado Casimiro pero en la segunda versión de prueba, en el primer trozo de código está así:

Código:

StoreProcedure.ParamByName('Parametro1').AsInteger := 1;
  StoreProcedure.ExecProc;
  nId := StoreProcedure.ParamByName('LASTID').AsInteger;
  DM.Transaction.CommitRetaining;

Con la diferencia que no llamo el método close, ¿influirá la llamada a este método? considerando que desde la primera ejecución del StoreProcedure.ExecProc; ya no funciona y que sin ese método en sistemas desarrollados con Delphi 2007 funcionaba? Estoy muy complicado estimado Casimiro, creo que tendré que cambiar a Firedac, saludos y muchas gracias.

Casimiro Notevi 03-06-2018 19:57:21

A ver, como he puesto en mi ejemplo, primero cierras, le pasas sus parámetros y lo ejecutas.
Código Delphi [-]
DM.SP.Close;
DM.SP.ParamByName('campo').AsString := DS1.DataSet.FieldByName('uncampo').AsString;
DM.SP.ExecProc;
En cuanto a lo de cambiar a firedac, cámbialo si lo necesitas, pero no porque no te funcione algo que, seguramente, no se está usando correctamente.

Yo solamente puedo contarte mi experiencia con delphi+ibx+firebird desde 1998 (antes de firebird era interbase y en lugar de ibx también he usado sus primos y padres: FreeIBcomponentes, FIBplus, MDO, etc.). Pues desde esa fecha, hace 20 años ya, he trabajado en muchos proyectos para todo tipo de empresas, siempre han sido con el servidor y muchos/bastantes/muchísimos terminales, y nunca, en ningún caso, he tenido esos problemas de transacciones.

Quiero decir con esto, que si el problema ha surgido al cambiar de versión de delphi, entonces el problema estaría ahí, pero como no creo que eso pueda ser así, entonces pienso que a lo mejor también ha habido otros cambios que sean realmente los culpables, no sé, versión/actualización de windows, por decir algo.

Si en el equipo/equipos donde ahora no funciona, si se vuelve a instalar la versión compilada con la versión de delphi que iba bien, ¿funciona bien o también mal?

Otra explicación, pero algo "conspiranóica", es que delphi haya añadido algún "error, sin querer" que provoque esos problemas con firebird, y que no ocurra con interbase, que es el suyo, y el que les interesa vender :cool:

lavtaro 03-06-2018 21:00:06

Estimado Casimiro, estoy de acuerdo que algo estoy haciendo mal, por lo mismo pido ayuda a quienes evidentemente tienen mas experiencia que yo, también hice otras pruebas:

- Tomado la aplicación compilada que funciona como yo espero en las mismas estaciones de trabajo con mismo servidor y misma base de datos.
- Instalé Delphi Berlin en una máquina limpia.
- Delphi Berlin en Windos 7 x64, Windows 8.1 x64 , Windows Server 2012 R2.

A estas alturas del proyecto que estoy haciendo no se hace tan difícil cambiar, pero con las aplicaciones ya hechas se puede complicar, saludos y muchas gracias.

Casimiro Notevi 03-06-2018 21:30:36

Hola lavtaro, yo no sé si estás haciendo algo mal, para ello tendría que inspeccionar más el programa, cosa que no puedo hacer desde aquí.
Pero basándome en lo que has comentado, se puede deducir que si todo iba bien con una versión de delphi, y después va mal con otra versión de delphi, la prueba que haría sería paso a paso:
Servidor que sé que va bien.
Un par de clientes con la aplicación que sé que va bien.
¿Funciona ok?
Si es SI, entonces instalo la misma aplicación, pero compilada con otra versión nueva de delphi.
¿Funciona ok?
Si es NO, entonces el problema está en esa versión de delphi (aunque no creo que eso vaya a ocurrir).
Si es SI, entonces el problema no está en esa versión nueva de delphi.

¿Qué hay diferente? ¿versión de windows/actualización? ¿cambios de configuración? ¿firewall, puertos? etc...

Pero siempre las pruebas de una en una, empezando por lo mínimo y básico que sé, seguro, convencido, de que funciona bien porque funcionaba bien.
Porque si tampoco funciona, entonces, amigo, el problema es otro.

lavtaro 03-06-2018 22:43:28

Gracias estimado Casimiro, voy a hacer las pruebas que sugieres, saludos.

lavtaro 04-06-2018 02:09:31

Actualización: realice la siguiente prueba:

- Con Delphi 2007 empece un proyecto nuevo, un componente TIBDatabase, TIBTransaction , TIBStoredProc.
- Copié el proyecto compilado a la máquina donde está Delphi Berlin y lo ejecute funcionó.
- Copié el proyecto a la máquina donde tengo instalado Delphi Berlin, lo abrí, compilé y ejecute, funcionó sin problemas.

Me fijé en un detalle, dentro de Delphi Berlin agregué al proyecto otro TIBStoredProc y también un TIBQuery y fíjense la diferencia en las unit que agrega:

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, IBCustomDataSet, IBStoredProc, StdCtrls, IBX.IBQuery;

Cuando en un formulario tengo un componente IBX, no agrega nuevas Unit que es obvio, pero cuando las agrega lo hace de otra manera, en por ejemplo IBX.IBQuery.

Después, borre el componente IBStoredProc y eliminé de las uses las correspondientes a IBX agregadas por Delphi 2007 , agregué al formulario un IBStoredProc , obviamente cambió el uses:

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Data.DB, IBX.IBCustomDataSet, IBX.IBStoredProc;

Ejecute el programa y funciona, hay dos componentes que se mantienen con sus respectivas Unit desde delphi 2007 que son TIBDatabase, TIBTransaction y curiosamente se mantiene el funcionamiento de Delphi 2007.

Saludos y de antemano muchas gracias.

lavtaro 04-06-2018 02:40:52

Otra cosa que me di cuenta es que al crear un proyecto con Delphi Berlin y agregar un DataModulo de Delphi 2007 desconoce las unit IBDatabase, IBTable, IBCustomDataSet, IBQuery , [dcc32 Fatal Error] uDataModulo.pas(6): F2613 Unit 'IBDatabase' not found.

Saludos.

Casimiro Notevi 04-06-2018 10:50:10

Cita:

Empezado por lavtaro (Mensaje 526811)
- Copié el proyecto compilado a la máquina donde está Delphi Berlin y lo ejecute funcionó.
- Copié el proyecto a la máquina donde tengo instalado Delphi Berlin, lo abrí, compilé y ejecute, funcionó sin problemas.
Ejecute el programa y funciona, hay dos componentes que se mantienen con sus respectivas Unit desde delphi 2007 que son TIBDatabase, TIBTransaction y curiosamente se mantiene el funcionamiento de Delphi 2007.

Entonces ya funciona todo bien, ¿no?

Cita:

Empezado por lavtaro (Mensaje 526812)
Otra cosa que me di cuenta es que al crear un proyecto con Delphi Berlin y agregar un DataModulo de Delphi 2007 desconoce las unit IBDatabase, IBTable, IBCustomDataSet, IBQuery , [dcc32 Fatal Error] uDataModulo.pas(6): F2613 Unit 'IBDatabase' not found.

Sí, bueno, al ser el nuevo Delphi espera que sea IBX.IBDatabase, IBX.IBTable, IBX.IBCustomDataSet, IBX.IBQuery

lavtaro 04-06-2018 15:09:59

Estimado Casimiro, muchas gracias por la atención al tema, efectivamente encontré solución al problema, cuando necesite iniciar un nuevo proyecto en Delphi Berlin con IBX tendré que tomar un DataModulo hecho en delphi 2007, voy probar lo avanzado que tengo del proyecto para ver si tengo algún otro detalle, saludos y nuevamente muchas gracias.

lavtaro 04-06-2018 16:29:09

Cita:

Empezado por lavtaro (Mensaje 526821)
Estimado Casimiro, muchas gracias por la atención al tema, efectivamente encontré solución al problema, cuando necesite iniciar un nuevo proyecto en Delphi Berlin con IBX tendré que tomar un DataModulo hecho en delphi 2007, voy probar lo avanzado que tengo del proyecto para ver si tengo algún otro detalle, saludos y nuevamente muchas gracias.

Corrección, iniciar el proyecto en Delphi 2007 con un DataModule, abrir ese proyecto con Delphi Berlin y seguir trabajando en Delphi Berlin.


La franja horaria es GMT +2. Ahora son las 01:29:58.

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