PDA

Ver la Versión Completa : Problemas con applyupdates


mar646
14-01-2005, 09:19:18
Bueno en primer lugar decir que no sabía dónde situar este hilo, así que si me equivoco ruego que me disculpen.

Uso Firebird 1.5, delphi7 y dbexpress.

El caso es que tengo 2 tablas. La primera de ellas es la cabecera de un documento (una factura por ejemplo) y la segunda es el cuerpo de esa cabecera. Indicar que están relacionadas por un campo en la segunda tabla que indica a qué documento pertenece.

El proceso que sigo es el siguiente:
- Abro una transacción.
- Modifico o inserto tanto la cabecera como las diferentes líneas.
- Hago ApplyUpdates de la cabecera.
- Hago ApplyUpdates del cuerpo. (Aquí hay más de un registro afectado)
- Si todo ha ido bien, hago commit de la transacción.
- En caso contrario dejo que pueda volver a hacer cambios.
- Si cancelo, hago rollback de la transacción.

Para acceder a la primera tabla uso un TSQLquery (para traerme únicamente un único registro), con un provider y un clientdataset. En el query indico los campos claves y el provider lo tengo a upwherekeyOnly.

Para la segunda tabla tengo la misma estructura.

El caso es que si no se produce ningún error en la base de datos (los dos applyupdates son correctos) todo va fenomenal. Si se produce un error en el primer applyupdates, también va todo bien. El problema viene cuando el primer applyupdates es correcto (no creo que sea la causa de lo que me pasa) y en el segundo applyupdates (el que afecta al cuerpo y por tanto puede afectar a más dé un registro) falla. En tal caso recojo la excepción y la muestro, hasta ahí bien. Pero cuando arreglo el fallo de esa línea y vuelvo a hacer applyupdates del conjunto, me acepta todo bien pero me duplica los registros que no han dado error y que eran nuevos en el cuerpo, con los existentes no hace nada raro.

¿Alguna idea? ¿Si se produce un error al hacer un applyupdates que afecta a más de un registro, se producen los cambios que no dan error, o por el contrario el applyupdates se hace de todo o de nada?

De antemano muchas gracias.

StartKill
15-01-2005, 15:38:25
Wnas...No tengo mi Delphi mano ni mi interbase ;-)

Pero me gustaria saber en que evento haces nuevamente el applyupdates... no estoy muy seguro pero "pero lo digo por sospecha" pero se supone que debes reconciliar el error y resolverlo registro por registro "lo lei o me dijieron"...

Your friend;

StartKill
Lima-Perú

mar646
17-01-2005, 10:09:32
Hola. Gracias por tu respuesta pero ya intenté atrapar el error en el reconcileerror pero no me funciona como yo quiero. Está claro que lo que debería de hacer es ir haciendo applyupdates línea a línea y no me daría este problema, e incluso irá mejor la aplicación (es lo que pasa cuando se empieza a programar por primera vez con estos componentes, será la inexperiencia) y eso es lo que haré

Para tu información mi idea era el hacer el applyupdates al terminar de introducir todo el cuerpo del documento y claro, si me da un error en un registro pos ya la tengo liada, :p .

De todas formas muchas gracias.

StartKill
17-01-2005, 17:15:08
Holas,

Parece que no me explicado bien... la idea no es hacer un applyupdate linea a linea... la idea es reconciliar el error y el error es a nivel registro por registro... osea esta bien que apliques la actualizacion a todo el detalle..."tal como lo tienes pensado".

No se si ya habras conseguido tu obejetivo...

Your friend

StartKill
Lima-Perú
StartKill@hotmail.com

mar646
18-01-2005, 13:44:07
Gracias Startkill. Lo he solucionado haciendo applyupdates línea a línea y te explico por qué.

El caso es que mi primera opción era lo del reconcilie, pero o no sé usarlo o a mi no me funcionaba como yo esperaba. Además ahí sólo te llegan los registros que han tenido error, pero los otros han quedado modificados en la base de datos y mi aplicación no veía los cambios, por lo que cuando iba a hacer otro applyupdates me decía que ya existía un registro con la misma id. Total que después de darle muchas vueltas opté por la solución de aplicar el applyupdates a cada línea y todo me va fenomenal. Incluso yo diría que va más rápido.

De todas formas muchas gracias por tu ayuda.