Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 13-02-2019
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Crea una prueba aislada del problema, colocando en una nueva aplicación los elementos esenciales del proceso, como son los componentes de acceso y conexión de base de datos. Un simple formulario, con un botón para intentar reproducir el problema.

Es normal abrumarse ante un bug misterioso cuando este ocurre a mitad del bosque. Pero es un poco más fácil encontrar la causa si se recorta ese pequeño trozo de bosque y se planta en la maceta de tu ventana.

¡Y nos muestras el código!

Saludos.
Responder Con Cita
  #2  
Antiguo 13-02-2019
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.052
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Un commit que falta por ahí, también
Responder Con Cita
  #3  
Antiguo 13-02-2019
usuario1000 usuario1000 is offline
Miembro
 
Registrado: nov 2016
Posts: 86
Poder: 8
usuario1000 Va por buen camino
Gracias por las respuestas, me he limitado a ejecutar un proceso sencillo y he hecho paso a paso lo siguiente y algo falla, me explico:


Código Delphi [-]
  transacciones.StartTransaction;
   try
      QExpedientes.ExecSQL;// (aquí paro la ejecución y la ejecuto paso a paso)
      Result := 'Ok';
      transacciones.Commit;
    except
    on E: Exception do
      begin
         transacciones.Rollback;

      end;

   end;


1º Ejecuto el servidor en modo depuración. Es decir paso a paso. Tengo un stop puesto en la instrucción EXECSQL.
2º Ejecuto el Cliente en modo normal.
3º Ejecuto el SQLManager Lite para ver en todo momento los valores que toman los campos de un registro.
4º Modifico un registro en el cliente y pulso aceptar para que mande los datos al servidor con la correspondiente funcion.enviarDatos(dato1, dato2, dato3...);
5º En el servidor se ejecuta el proceso que he copiado mas arriba y se para la linea donde tengo el stop, y empiezo a ejecutar paso a paso.
6º Se ejecuta QExpedientes.ExecSQL y me voy a la base de datos y no observo modificación alguna, es de esperar que sea así, puesto que no ha llegado aún al commit.
7º Cuando se ejecuta la línea "transacciones.Commit", me voy de nuevo a la base de datos (SQLManager Lite) y le doy a refrescar para ver si ha cogido los nuevos datos y no los ha cogido, aún tiene los antiguos. Le doy a refrescar varias veces y nada de nada. Incluso ejecuto otro cliente y aparecen los datos antiguos. Deprimente.
8º Cierro la aplicación y ahora sí, estan los datos en la Base de Datos.


El problema que me encuentro es que en el momento que grabo un registro, no se actualiza la base de datos de inmediato, dando origen a un problema, que es que otro ususario se conecte y le lleguen unos datos que no sean los actualizados. De hecho me ha pasado ya y quiero evitar ese problema con la grabación inmediata de datos del cliente al servidor.


No sé que hago mal, en principio el proceso es muy sencillo, tal como he puesto más arriba. Supongo que será tocar alguna propiedad o algo del componente TFDTRansaction.


Espero me echen un cable.



Gracias anticipadas.
Responder Con Cita
  #4  
Antiguo 13-02-2019
Avatar de Caminante
Caminante Caminante is offline
Miembro
 
Registrado: oct 2010
Ubicación: Lima - Peru
Posts: 338
Poder: 14
Caminante Va camino a la fama
Hola


No conozco los componentes que usas pero podrias fijarte el nivel de aislamiento de las transaccion con un readcommited ya deberia leer los datos cambiados.


Espero sea util


Saludos
__________________
Caminante, son tus huellas el camino y nada más; Caminante, no hay camino, se hace camino al andar.
Antonio Machado
Responder Con Cita
  #5  
Antiguo 13-02-2019
usuario1000 usuario1000 is offline
Miembro
 
Registrado: nov 2016
Posts: 86
Poder: 8
usuario1000 Va por buen camino
Cita:
Empezado por Caminante Ver Mensaje
Hola


No conozco los componentes que usas pero podrias fijarte el nivel de aislamiento de las transaccion con un readcommited ya deberia leer los datos cambiados.


Espero sea util


Saludos



Gracias por tu respuesta.


El componente TFDFTransaction en su propiedad Isolation tiene asignado "xiReadCommited".



El TFDQuery que utilizo para realizar el "Update from ...." tiene en su propiedad Transaction asignado el componente TFDFTransaction.

En principio no veo nada raro.


Para que me funcione tengo que poner las siguienes instrucciones en el cliente:
Código Delphi [-]
resultado:= funcion.enviarDatosAServidor(dato1, dato2, dato3...);
if resultado = 'OK' then 

begin

      TFDConnection.connected := false;
      TFDConnection.connedted:= True;
end;


No me parece muy coherente cada vez que modifique un dato conectar y desconectar el cliente para que actualice la base de datos.


A ver si podemos arreglarlo de otra forma.


Gracias.
Responder Con Cita
  #6  
Antiguo 14-02-2019
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.052
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Ese componente fdtransaction ¿tiene una propiedad "base de datos", y está asignada?
Responder Con Cita
  #7  
Antiguo 14-02-2019
usuario1000 usuario1000 is offline
Miembro
 
Registrado: nov 2016
Posts: 86
Poder: 8
usuario1000 Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Ese componente fdtransaction ¿tiene una propiedad "base de datos", y está asignada?



Buenas tardes,


El componente en sí, no veo que tenga tal propiedad, no sé si está muy escondida por alguna subpropiedad, pero no la veo.




Como ultima medida estoy pensando en quitar todas las instrucciones de transacciones, a ver si delphi las ejecuta de forma automática y me arregla el problema, pero lo veo raro. Según tengo entendido cuando no ejecutas una transaccion delphi la ejecuta de forma automática, pero no lo hace.


Me gustaría ver como puedo arreglar este problema de que no me graba instantáneamente en las tablas de la base de datos.



Gracias por tu interés.
Responder Con Cita
  #8  
Antiguo 15-02-2019
Avatar de Caminante
Caminante Caminante is offline
Miembro
 
Registrado: oct 2010
Ubicación: Lima - Peru
Posts: 338
Poder: 14
Caminante Va camino a la fama
Cita:
Empezado por usuario1000 Ver Mensaje
Gracias por tu respuesta.

Para que me funcione tengo que poner las siguienes instrucciones en el cliente:
Código Delphi [-]resultado:= funcion.enviarDatosAServidor(dato1, dato2, dato3...); if resultado = 'OK' then begin TFDConnection.connected := false; TFDConnection.connedted:= True; end;



No me parece muy coherente cada vez que modifique un dato conectar y desconectar el cliente para que actualice la base de datos.


Gracias.

Pues a mi no se tampoco me parece coherente cerrar la coneccion y volver a conectar. Si las transacciones estan configuradas correctamente deberia bastar con cerrar y abrir el dataset. Habria que ver como haces el proceso. Poruqe se supone que la transaccion (estando en readcommited) deberia poder leer las transacciones confirmadas. A mi siempre me ha funcionado; aunque nunca he usado datasnap.
__________________
Caminante, son tus huellas el camino y nada más; Caminante, no hay camino, se hace camino al andar.
Antonio Machado
Responder Con Cita
  #9  
Antiguo 14-02-2019
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.052
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Haz lo que te dijo Al González:
Cita:
Empezado por Al González Ver Mensaje
Crea una prueba aislada del problema, colocando en una nueva aplicación los elementos esenciales del proceso, como son los componentes de acceso y conexión de base de datos. Un simple formulario, con un botón para intentar reproducir el problema.
Es normal abrumarse ante un bug misterioso cuando este ocurre a mitad del bosque. Pero es un poco más fácil encontrar la causa si se recorta ese pequeño trozo de bosque y se planta en la maceta de tu ventana.
¡Y nos muestras el código!
Saludos.
Es que no podemos hacer mucho si no podemos "tocar y ver" tu programa.
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
Grabacion macrossman Varios 2 06-04-2011 22:09:07
Duda registros valor 0 sql drykea SQL 6 13-03-2008 17:43:52
Duda sobre DFS enrique_84 Varios 2 08-06-2006 11:53:40
grabación jorodgar Windows 4 19-09-2005 11:22:42
Duda sobre busqueda de registros... hademon Varios 2 16-09-2005 19:26:17


La franja horaria es GMT +2. Ahora son las 02:40:30.


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