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)
-   -   Usando AnyDAC con Delphi Tokyo (https://www.clubdelphi.com/foros/showthread.php?t=93423)

leus 21-09-2018 04:10:18

Usando AnyDAC con Delphi Tokyo
 
Hola amigos,

Bajé la versión de Delphi Tokyo Community Edition, pero quiero conectarme con bases de datos remota. Desde ya no puedo usar FireDAC, porque para esta versión está restringida a bases de datos locales, y además mi código es bastante viejo ya, y tengo una licencia de AnyDAC antes que los comprara Embarcadero.

El asunto es que hice compilar mi aplicación, y también pude compilar AnyDAC; pero como algunos ya sabrán, Data.DB cambió mucho desde el tiempo de Delphi XE hasta ahora, y en resumen, AnyDAC no me trae valores desde la base de datos.

¿Alguien sabe qué es lo que cambió en Data.DB que hace que las librerías viejas de conexión a bases de datos no funcionen? Ví algo con UniDAC en otro hilo y también hice la pregunta, pero pregunto por acá para ver si alguien comparte su sapiencia.

Saludos desde Chile

Neftali [Germán.Estévez] 21-09-2018 08:45:52

Estaría bien saber a qué base de datos te estás conectando, para valorar otras alternativas.
Una opción es que mires de actualizar la versión de UniDAC (si puedes).
La otra (si la anterior no es viable) es que utilices otros componentes de conexión, como pueden ser ZeosLib. Pero para "afinar" esto último habría que saber a qué te estás conectando.

leus 21-09-2018 19:45:21

No uso UniDAC, sino AnyDAC (que ahora es FireDAC).

Cambiar estos componentes no es viable, es un proyecto viejo con harto código que usa funcionalidades específicas de AnyDAC.

Lo que me interesa saber es qué cambió entre XE y XE3 en esta área. Recuerdo que en un momento FireDAC sólo soportó las versiones desde XE3 hacia adelante, lo que me hace sospechar que hubo cambios importantes en Data.DB en esa versión.

Depurando ví que AnyDAC lo único que hace en un momento es un "fetch" a una estructura interna llamada FRow, pero haciendo muchos malabares con buffers internos. Luego Data.DB trata de acceder a su propio buffer interno pero AnyDAC nunca lo asignó, por lo tanto convierte el buffer sin inicializar a 0. Y ahí estoy aún, AnyDAC parece tener tentáculos por todos lados.

Casimiro Notevi 22-09-2018 10:25:35

Cita:

Empezado por leus (Mensaje 528546)
El punto es que ahora (dado que esto es un hobby) estoy usando Delphi Tokyo Community Edition, y le instalé los componentes (tuve que hacer un par de cambios en el código). ¡Pero no funcionan! Algo cambió en la unit DB.pas (ahora Data.DB.pas) que hace que todo me devuelva vacío.
En fin, a seguir peleando. La Community Edition es espectacular, es de esperar que no sea demasiado tarde.

Si es un hobby, entonces puedes dedicarle tiempo en adaptarlo. Lo malo sería que tuvieses a un montón de empresas esperando.

leus 22-09-2018 18:09:55

Bueh, es un poco complicado - tuve una empresa, vendí un software, pero ahora la empresa está, hm, "inactiva" (y yo estoy trabajando en otra parte). Pero los clientes siguen usando el software y yo, que tiendo a valorar mi nombre, les sigo dando soporte como un gil.

Mi filosofía respecto del soporte es intentar evitar dar soporte - para eso, sigo manteniendo el software. A veces me paso días desarrollando cosas que me evitarán una hora de soporte :-)

En eso estoy ahora. Estoy intentando actualizar mi software porque quiero compilarlo en Tokyo. No quiero tener que usar máquinas virtuales para tener Delphi XE en un lado y Tokyo en otro... prefiero usar un solo IDE.

En fin, sigo investigando, y veo que hubo cambios en XE3 en la manera que los TField obtienen sus datos. Pero no tengo el diff - alguien puede ser tan amable de hacer una comparación entre DB.pas de Delphi XE y Data.DB.pas de Delphi Tokyo?

Al González 22-09-2018 18:22:59

Suena razonable lo que comentas, leus (dejé algo acá).

Bien, hay dos maneras de resolverlo: Aprovecho que estoy desempleado para analizar esto con detalle, me das acceso por TeamViewer (no tengo esos componentes) y, divirtiéndome mucho, intento diagnosticar por qué ya no te funciona igual el componente proponiendo alguna solución que compartamos con todos. Tal vez un par de semanas basten.

La otra opción es invertir en tu nombre.

Saludos. :-)

leus 22-09-2018 22:54:53

Al, eso sería genial. A ver si nos podemos coordinar por mensaje interno.

Sí, si me entra un dinero extra probablemente compre una licencia Enterprise. (¡Pero es equivalente a un mes de sueldo!)

leus 23-09-2018 00:49:55

Ah, creo que encontré el problema, y de momento parece que todo funciona ok.

Las declaraciones de algunos overrides de AnyDAC no eran correctas, por lo que se estaba llamando a las funciones base de TDataset (que no hacen nada). Estos son los cambios necesarios, en caso de que alguien se encuentre con este problema:

Código:

Source/uADCompDataSet.pas | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/Source/uADCompDataSet.pas b/Source/uADCompDataSet.pas
index b324bc9..af9cf96 100644
--- a/Source/uADCompDataSet.pas
+++ b/Source/uADCompDataSet.pas
@@ -758,8 +758,8 @@ type
    procedure GetDetailLinkFields(AMasterFields, ADetailFields: TList); {$IFNDEF AnyDAC_FPC} override; {$ENDIF}
    function GetColumnField(AColumn: TADDatSColumn): TField;
    function GetFieldColumn(AField: TField): TADDatSColumn; overload;
-    function GetFieldData(AFieldNo: Integer; ABuffer: Pointer): Boolean; overload; {$IFNDEF AnyDAC_FPC} override; {$ENDIF}
-    function GetFieldData(AField: TField; ABuffer: Pointer): Boolean; overload; override;
+    function GetFieldData(AFieldNo: Integer; var ABuffer: TValueBuffer): Boolean; override;
+    function GetFieldData(AField: TField; var ABuffer: TValueBuffer): Boolean; override;
 {$IFNDEF AnyDAC_FPC}
    function GetStateFieldValue(AState: TDataSetState; AField: TField): Variant; override;
 {$ENDIF}
@@ -3843,7 +3843,7 @@ begin
 end;
 
 {-------------------------------------------------------------------------------}
-function TADDataSet.GetFieldData(AFieldNo: Integer; ABuffer: Pointer): Boolean;
+function TADDataSet.GetFieldData(AFieldNo: Integer; var ABuffer: TValueBuffer): Boolean;
 var
  pRecBuf: PADBuffer;
  oColumn: TADDatSColumn;
@@ -3983,7 +3983,7 @@ begin
 end;
 
 {-------------------------------------------------------------------------------}
-function TADDataSet.GetFieldData(AField: TField; ABuffer: Pointer): Boolean;
+function TADDataSet.GetFieldData(AField: TField; var ABuffer: TValueBuffer): Boolean;
 var
  pRecBuf: PADBuffer;
 begin
@@ -4004,7 +4004,7 @@ begin
        if AField.DataType = ftBCD then
          CurrToBCD(PCurrency(pRecBuf + 1)^, PADBcd(ABuffer)^)
        else
-          ADMove(pRecBuf[1], ABuffer^, AField.DataSize);
+          ADMove(pRecBuf[1], PADBuffer(ABuffer)^, AField.DataSize);
    end;
  end;
 end;


Al González 23-09-2018 19:21:55

Excelente. Qué bueno que pudiste resolverlo ajustando las directivas condicionales. :)

gatosoft 27-09-2018 18:39:18

Cita:

Empezado por leus (Mensaje 528552)
Bueh, es un poco complicado - tuve una empresa, vendí un software, pero ahora la empresa está, hm, "inactiva" (y yo estoy trabajando en otra parte). Pero los clientes siguen usando el software y yo, que tiendo a valorar mi nombre, les sigo dando soporte como un gil.

Mi filosofía respecto del soporte es intentar evitar dar soporte - para eso, sigo manteniendo el software. A veces me paso días desarrollando cosas que me evitarán una hora de soporte :-)

En eso estoy ahora. Estoy intentando actualizar mi software porque quiero compilarlo en Tokyo. No quiero tener que usar máquinas virtuales para tener Delphi XE en un lado y Tokyo en otro... prefiero usar un solo IDE.

Me parece estar escuchando la historia de mi vida

gatosoft 27-09-2018 18:42:27

Cita:

Empezado por leus (Mensaje 528556)
Al, eso sería genial. A ver si nos podemos coordinar por mensaje interno.

Sí, si me entra un dinero extra probablemente compre una licencia Enterprise. (¡Pero es equivalente a un mes de sueldo!)

Tienes suerte, yo necesito ahorrar durante unos 2 años evitando los lujos (carne, pan, leche, huevos...) para poder comprar una licencia...

leus 28-09-2018 17:17:17

Cita:

Empezado por gatosoft (Mensaje 528648)
Tienes suerte, yo necesito ahorrar durante unos 2 años evitando los lujos (carne, pan, leche, huevos...) para poder comprar una licencia...

El equivalente a UN MES DE SUELDO, no ahorrar por un mes :-) - no se tú, pero a mí el sueldo me alcanza apenas :D

gatosoft 28-09-2018 17:52:33

Mes y medio :(

Casimiro Notevi 28-09-2018 19:12:27

¿De qué habláis?

leus 20-11-2018 15:58:54

En caso de que alguien a futuro se encuentre con este problema, he seguido parchando AnyDAC para que funcione con las versiones recientes de Delphi (faltaban otros overrides por ahí). Obviamente no puedo publicar los fuentes, pero sí podría pasar los cambios necesarios por interno.

¡Saludos!


La franja horaria es GMT +2. Ahora son las 01:19:09.

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