PDA

Ver la Versión Completa : Falla en actualización con CachedUpdates


Marina
31-05-2003, 16:44:46
Hola a todos!

Trabajo con Delphi 4 professional e Interbase 6. Estoy usando componentes TQuery con Cachepupdates.

El problema que tengo es el siguiente:
Se está cargando una factura, para lo cual se utilizan 3 querys: 1 para la cabecera de la factura, otro para el detalle de la factura y otro para las cuotas de la factura.
Todo funciona correctamente hasta que se agota la existencia de un artículo. El procedimiento que se realiza es el siguiente, cuando el usuario decide grabar la factura:
1- Se inicia una transacción
2- Se hace Applyupdates de los 3 querys
3- Se llama un storedprocedure que controla la existencia, si está agotada muestra un mensaje y hace rollback
4- Se vuelve a la edición de la factura para poder elegir otro artículo o cambiar la cantidad
5- Se confirma nuevamente la factura
6- El programa vuelve a recalcular las cuotas, para ello hace Delete de todo lo existente en el query 3 y luego hace append para agregar nuevamente las cuotas correspondientes (en este punto he detectado con el debbuger que al realizar el delete el recordcount de ese query me queda en 0, y al agregar nuevamente las cuotas me sigue quedando en 0)
7- se inicia nuevamente la transacción
8- hace applyupdates de los 3 querys, cuando hace el tercero (query de cuotas), me sale el siguiente error: falló la actualización.

Alguien puede orientarme con este problema?
Por favor ruego no cuestionar la ubicación del storedprocedure que controla la existencia, pues hay un largo por qué para esto, que no viene al caso explicar en este momento.

Desde ya gracias anticipadas.

Marina

andres1569
02-06-2003, 13:35:20
Hola:

Así a ciegas, puedo decirte que revises ciertas partes del código aunque sería interesante que lo mostraras. ¿Te salta una excepción o eres tú quien controla, dependiendo del resultado del StoredProc, la llamada a RollBack? Si salta excepción ¿Te aseguras de que no se llama a CommitUpdates? ¿Interceptas el evento OnUpdateError? Si es así, ¿te manejas con los valores de NewValue y OldValue?. Al borrar las cuotas y volverlas a introducir ¿puede que hayas aplicado un DisableControls a la tabla maestra y que por ello pierdan la referencia no apareciendo ninguna? ¿El Query3 tiene CachedUpdates a TRUE?

Bueno, quizás te parezcan algunas preguntas de cajón pero hay que revisarlo todo. Otra cuestión, el ApplyUpdates ya inicia una transacción, ¿hay alguna razón para que inicies otra "manualmente"? ¿Es por el StoredProc?

Son ideas, a ver si van por ahí los tiros.

Saludos

andres1569
02-06-2003, 15:00:57
Hola de nuevo:

Creo que ya sé por dónde pueden ir los tiros. Con casi toda probabilidad se trata de un error del BDE que viene explicado (así como su solución) en el siguiente enlace a la página de trucos de Ian Marteens (supongo que sabes quién es, el autor de "La Cara Oculta de Delphi 2' (y 4, y 6, y ...)):

http://www.marteens.com/trick2d.htm

Un error semejante me sucedió a mi también con Delphi 4.0, aunque con tablas Paradox, y recurrí, como explica Ian Marteens, al componente TUpdateSQL, y a la gestión del evento OnUpdateError para solucionarlo.

Bueno, ya me dirás si era eso o si hay que seguir indagando.

Saludos

Marina
02-06-2003, 15:36:26
Hola

Ya he leído el artículo de Ian Marteens al que te refieres, y creo que no es el mismo problema, al menos porque no es el mismo error el que me da, además las tablas no se encuentran relacionadas como maestro detalle, son todas independientes.

Con respecto a las cosas que me preguntas el Query 3 si tiene CachedUpdates, no estoy haciendo DisableControls, el uso explícito de la transacción es por el Storedprocedure y porque además estoy usando el cachedupdates a nivel de dataset.
El rollback lo estoy haciendo según el resultado del storedprocedure, no se genera excepción. La llamada a CommitUpdates estoy segura que no se está haciendo.
Estoy interceptando el evento OnUpdateError de los 3 query pero en él no estoy haciendo nada, ya que cuando empecé a trabajar usando CachedUpdates me aconsejaron interceptarlo pero no usarlo, debido a unos mensajes de error que no podía eliminar.

Realmente ya no se me ocurre que otra cosa probar.
Espero tengas alguna otra idea.

Marina

andres1569
02-06-2003, 16:13:05
Hola otra vez:

Bueno, se me ocurre alguna cosa, como por ejemplo que hagas CancelUpdates a la Query3, la de la cuotas, en vez de borrar los registros y volverlos a generar (o bien apliques RevertRecord a cada registro de esta Query). De esa forma vacías su caché y no queda rastro de los anteriores registros. Es muy posible que el hecho de que el RecordCount de esta tabla te indique siempre 0, tras borrarlos, esté relacionado con que al volver a regenerar los registros asignas la misma clave primaria que tenían los anteriores, pero como aún están en memoria (no se han borrado realmente sino que están "marcados" como tales), en realidad estarías asignando valores en la caché a los anteriores. Eso explicaría que saltara el error al actualizar puesto que dichos registros no constan como "nuevos" sino como ya existentes, e Interbase no los encuentra.

Bueno, Marina, todo esto es una composición mental que estoy haciendo, no lo he probado, ya nos dirás qué tal.

Un Saludo

Marina
03-06-2003, 20:55:05
Hola!

No pude usar lo de CancelUpdates o RevertRecord, pues en el punto que tengo que hacer el control ya tengo hecho el Applyupdates.

Pero bueno, como no lo pude resolver de esa manera opté por cambiar unas cuantas cosas y poner todo el control de la existencia (storedprocedure) antes de hacer el applyupdates. De esa forma funcionó; todavía me faltan hacer unas pruebas en red, pero creo que va a andar.

De todas formas muchas gracias por tu ayuda.

Marina