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 en proyecto vcl firebird 3.0.12 al pasar de D.10.3 al 12 (https://www.clubdelphi.com/foros/showthread.php?t=97208)

amadis 04-02-2025 13:02:11

Problema en proyecto vcl firebird 3.0.12 al pasar de D.10.3 al 12
 
Buenos dias compañeros, estoy tratando de migrar un proyecto vcl +firedac de delphi 10.3 al 12.
No hay inconvenientes al compilar pero me he dado cuenta que hace algo raro el cambiar le BD.
Es como si no diera le COMMIT de las transacciones.
Compilado en D12 Si agrego un registro el mismo no aparece hasta reiniciar el programa, lo mismo un delete. Aparece al reiniciar.

Compilo en D10.3 y funciona perfecto como lo viene haciendo y deberia hacer..

Luego tratando de descubrir el problema, creo un nuevo proyecto vcl en D12 que conecte con firedac a la misma BD, fdconnection, transactions asignadas, agrego un grid y un dbnavigator y elimina y agrega registros bien.

Comparo los parámetros de componentes de la nueva aplicación y están idénticos a la vieja.

¿alguien tiene alguna sugerencia?

Gracias desde ya

pgranados 04-02-2025 17:44:56

Y si haces un refresh al fdquery se actualiza?

Código Delphi [-]
FDQuery.Refresh;

amadis 04-02-2025 18:19:39

No no hace nada. es como si no se hiciera el COMMIT hasta cerrar la aplicacion.

Porque por ej yo agrego o elimino algo, y hago una consulta y lo eliminado sigue visible y lo nuevo no se ve.

En tengo los componentes transaction en autocommit auto start y autostop.

En la mayoría de los procesos inicio y termino las transacciones yo con FDConnection.StartTransaction; y finalizo con FDConnection.Commit.

Y no se ven los cambios hasta cerrar y abrir el sistema.

Y me llama la atención otra conexion a la misma BD creada en la version nueva de delphi funciona correcto.

amadis 04-02-2025 19:25:49

En otra prueba sobre el proyecto migrado, acabo de eliminar 2 componentes transaction , los mismos estan vinculados el fdconnection, uno a la propiedad transacion (readlonly)y otro a lapropiedad Updatetransacion, además esos componentes los vinculo a cada query creado en tiempo de ejecución de la siguiente forma Query.UpdateTransaction := datos.FDTranUp;

Bueno luego de eliminar y comentar todas las lineas que usaban estos componentes , el sistema funciona correctamente. Solo que las transacciones las maneja ahora firedac de forma autónoma

Pero al hacer un post o eliminar veo los al instante

sin duda hay algo raro en las transacciones, pero algo que en delphi 103 funciona bien y en 12 no.

navbuoy 12-02-2025 03:51:58

has comprobado si tienes activada la opcion de "cached Updates" en la Tabla o tal??

en ese caso tendrias que llamar a Tabla->ApplyUpdates() antes del Commit creo

navbuoy 12-02-2025 04:03:31

En FireDAC, la llamada a ApplyUpdates() solo es necesaria si usas un componente TFDTable o TFDQuery con un CachedUpdates activo. Si estás ejecutando una consulta INSERT, UPDATE o DELETE directamente con ExecSQL(), no necesitas ApplyUpdates(), ya que los cambios se aplican inmediatamente en la base de datos.

Cuándo usar ApplyUpdates()
Debes usar ApplyUpdates() solo si estás trabajando con datos en memoria antes de enviarlos a la base de datos. Esto ocurre cuando:

TFDQuery->CachedUpdates = true
TFDTable->CachedUpdates = true
TFDMemTable está en uso y necesita sincronizarse con la base de datos.

Ejemplo con CachedUpdates
Si tienes un TFDQuery con CachedUpdates = true, los cambios se almacenan en memoria y debes hacer esto para aplicarlos:

Código:

void GuardarEnBD() {
    try {
        FDConnection1->StartTransaction();  // Inicia la transacción

        FDQuery1->Post();  // Guarda los cambios en el buffer en memoria
        FDQuery1->ApplyUpdates();  // Aplica los cambios en la BD
        FDConnection1->Commit();  // Confirma la transacción

    } catch (Exception &e) {
        FDConnection1->Rollback();  // Revierte en caso de error
        ShowMessage("Error: " + e.Message);
    }
}

Si usas ExecSQL(), no necesitas ApplyUpdates()
Cuando ejecutas una consulta directa (ExecSQL()), la actualización se realiza inmediatamente en la BD, por lo que este código NO necesita ApplyUpdates():

Código:

void ActualizarPrecio() {
    try {
        FDConnection1->StartTransaction();

        FDQuery1->SQL->Text = "UPDATE productos SET precio = precio * 1.10 WHERE categoria = 'electronica'";
        FDQuery1->ExecSQL(); 

        FDConnection1->Commit(); 

    } catch (Exception &e) {
        FDConnection1->Rollback();
        ShowMessage("Error: " + e.Message);
    }
}


amadis 12-02-2025 10:56:52

Hola, no uso cached updates. Si fuera el caso tendria el mismo delay en delphi 10.3.

Aun no he descubierto el inconveniente pero me voy acercando. Mientras sigo compilando en 10.3 y cuando sobra tiempo vuelvo a mirar con lupa en el 12 porque la idea es migrarme a 12.

amadis 12-02-2025 23:56:52

Evidentemente algo ha cambiado en el manejo de transacciones de delphi 10.3 a 12. Ya que como comenté al eliminar los componentes FDtransaction funciona.
Ahora voy agregandolos poco a poco y sigue funcionando.

He descubierto otro error en esta migracion,, me he dado cuenta que debo tener alguna dependencia de algun paquete pero no se como detecarlo. Tengo el BUILD WITH RUNTIME PACKAGES DESACTIVADO,
Y al probar el proyecto en una pc que tengo como entorno testing, el programa no inicia ,muestra un error de ACESSVIOLATION, y en las 2 pc que tengo delphi instalado ejecuta bien.

¿como puedo saber todas las dependencias de mi proyecto? De modo de ir revisando y ver como eliminar la dependencia.

amadis 13-02-2025 00:27:24

Me respondo, habia un error con la unit MIDASLIB, copie todos los dll dle bin de delphi a la carpeta del proyecto, y fui eliminando de a poco hasta que llegué al midas.dll. Que no ere requisito porque tengo la unit MIDASLIB al uses. La removi y agregue de nuevo y parece que funciona .
Pero me gustaria elminar del todo ya que antes usaba CLIENTDATASET y los he reemplazado por FDMEMTABLES, pero si elimino la unit MIDASLIB, me queda aun dependencia que no se donde estará.

Casimiro Notevi 13-02-2025 10:45:01

En Delphi, los componentes que dependen de midas.dll están relacionados con DataSnap y la manipulación de datasets en memoria, principalmente TClientDataSet, TProvider (TDataSetProvider) y componentes DataSnap antiguos (TDCOMConnection, TSocketConnection, TWebConnection).


La franja horaria es GMT +2. Ahora son las 07:12:57.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi