PDA

Ver la Versión Completa : Ado y transacciones


LucianoRey
15-04-2005, 15:40:43
Hola a todos, espero me puedan orientar, tengo el siguiente problema:

Tengo una pantalla de captura, donde manejo una relacion master-detail,es decir tengo los datos que pertenecen a la tabla maestra y ademas unos grids que son los detalles, bueno el caso es que por la "relacion", yo se que tengo que grabar el principal antes de capturar los detalles, entonces, el usuario sabe que si le da al boton ok, su registro queda grabado (maestro y detalles), si lo cancela aunque haya metido información no graba nada, pero para mi, si el usuario intenta meter detalles yo grabo el registro principal y entonces si le dejo meter detalles, como esto lo hago por medio de transacciones no hay problema, tengo Adodataset para mis tablas maestra y detalles y mi forma de manejar la llave que relaciona las tablas es, cuando el usuario intenta meter un detalle (cualquiera), por medio de un procedimiento almacenado (SQLServer) me traigo el ultimo numero de la tabla principal y lo asigno al master, como yo se que, en lo que el usuario termina su captura, pueden pasar n segundos, minutos, u horas, solo hasta que le da al boton ok entonces vuelvo a ejecutar mi procedimiento almacenado y lo asigno al campo clave del maestro y detalles, pero el detalle esta en que cuando vuelvo a ejecutarlo me da el ultimo numero pero de lo que tengo en memoria, es decir, y no se si sea por que esta dentro de la tranasaccion, parece como si el procedimiento almacenado se ejecutara en memoria de mi ordenador, no en el servidor como deberia (y como yo quiero), entonces,alguien me podria decir que estoy haciendo mal? ó que me falta?, aparte de estudiar mas supongo, ya intente usar un numero temporal para la clave, en lo que estoy capturando y cuando le doy boton ok usar el procedimiento, me lo hace bien la primera vez, despues ya no, tambien otra tabla con el ultimo grabado, lo uso en lo que capturo y me sucede lo mismo, mi procedimiento almacenado lo desactivo antes de ejecutarlo nuevamente, pero nada, espero haber sido claro y me puedan ayudar, gracias.

jachguate
15-04-2005, 16:32:20
Dejo constancia que he intentado leer la el problema... pero me ha parecido que se complica por no estar dividido en parrafos y, dado que no dispongo de mucho tiempo, lo dejo para alguien mas valiente que yo (o mas desocupado :D)...

Un saludo.

LucianoRey
15-04-2005, 16:57:25
Ok, gracias por el comentario y tienes razón tengo que redactar bien, saludos.

kalimero
15-04-2005, 17:49:21
Hola.

Bueno cojo el relevo de jachguate(jejejeje). No termino de comprender que tengas que ejecutar dos veces el procedimiento almacenado para coger el ultimo valor. Bueno la verdad es que si lo entiendo pero no lo comparto. Podrias trabajar con los datasets en modo cache, es decir, poner la propiedad locktype = ltBatchOptimistc. Despues en el evento BeforePost del master recoges el ultimo valor introducido en la BD y por ultimo en el evento de AfterPost tambien del master recorres el Detalle y le añades el campo llave de la cabecera. Para terminar aplicas los datos de la cahé y listo.
De esta forma no importa si el usuario tarda mucho en rellenar las lineas.

Saludos

LucianoRey
15-04-2005, 20:21:41
Hola, ya lo hice asi, pero algo me falta, en una transacción no tengo problema, pero abri dos veces la aplicación en una capturo mi registro principal y al pasar a capturar detalles, le doy post al principal para que me deje capturar los detalles y lo dejo esperando, ¡ah! me dio el 18 (ultima clave), en la otra capturo como en la primera y lo grabo me graba el 18 porque en la anterior no lo hice, regreso a esta y trato de grabar, me dice que no puedo duplicar una clave, que me faltaria?, lo que entendi como aplicar datos de la cache lo hice con :
AdoDataset.cacheupdate, de antemano gracias.

LucianoRey
15-04-2005, 20:32:27
Perdón fue asi :

DataModule1.ADODataSet5.UpdateBatch(); *tabla principal
DataModule1.ADODataSet15.UpdateBatch(); *tabla detalles
DataModule1.ADODataSet12.UpdateBatch(); *tabla detalles
DataModule1.ADODataSet10.UpdateBatch(); *tabla detalles

DataModule1.ADOConnection1.CommitTrans;

antes de esto, no doy otro post, pues cuando intentan capturar detalles ya lo hice y enseguida lo pongo en modo de edición.

LucianoRey
15-04-2005, 22:21:30
¡¡¡Gracias por la ayuda!!!, ya funciona, asi como me dijiste "kalimero", lo que paso es que cuando el usuario entra a alguno de los grids-detalle, yo doy un post al registro principal, para que me deje meter detalles.

Luego si el usuario le pica al boton Ok, ya no hacia otro post del registro principal, solo "vaciaba" el buffer e iniciaba otra transacción, append de registro principal y otra vez a capturar, lo cambie puse otra vez el post al registro principal y ¡¡¡listo!!!.

En el caso de mi boton Cancel, no habia problema, porque le daba cancel al registro principal y deshacia la transacción.

Ahora solo me falta ver como manejo la edición en la misma pantalla (por el llamado al proc. almac. dentro del post), pero creo debe ser mas facil, gracias otra vez por la ayuda, pues eso de pasar de Clipper a Delphi es otro mundo, pero muy bueno, saludos.