Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   problema actualización registros relacionados (https://www.clubdelphi.com/foros/showthread.php?t=59488)

morta71 28-08-2008 20:30:11

problema actualización registros relacionados
 
Hola, desde hace tiempo estoy intentando realizar una aplicación de facturación, ya solventé varios problemillas que me fueron surgiendo pero ahora estoy algo estancado en lo siguiente:

tengo dos tablas relacionadas, pedidos y albaranes:

PEDIDOS (ID, FECHA, IDCLIENTE)
ALBARANES(ID, IDPEDIDO, FECHA)
relacion ALBARANES.IDPEDIDO = PEDIDOS.ID

El problema es que un pedido se puede servir en varios albaranes, según va llegando el material solicitado.

En el mantenimiento de documentos maestro-detalle como albaranes, hasta ahora lo que hice era sencillo, volcar sobre un StringGrid la información de las líneas de albarán, editarlas y al pulsar "Aceptar", realizo el borrado de todas las líneas de la albarán y grabar el contenido del StringGrid en la tabla.

Esto no me sirve con la tabla pedidos, ya que si he servido algún albarán aparecerá un error de integridad.

Hace días que estoy dandole vueltas al asunto y no acabo de ver una solución sencilla que me permita mantener una transacción abierta el mínimo de tiempo posible.

Alguien con más experiencia podría orientarme un poquito.

Gracias

boreg 28-08-2008 23:04:41

Corrigeme si me equivoco, pero, ¿estas diciendo que para actualizar tus tablas primero borras los registros y despues insertas los datos correctos?, creo que esto esta muy mal y ya estas viendo las consecuencias.
Yo te sugiero que utilices Update al menos en la tabla de pedidos para que no te de ese error cuando modifiques la info, otro consejo es que utlices los controles para datos (DBGrid, DBEdit, etc...) y dataset's para actualizar tus tablas.

Saludos!!!

morta71 29-08-2008 14:47:53

Gracias por tu respuesta boreg.

En una tabla "normal", como la de clientes, utilizo el Update tal y como me sugieres.

Sinembargo, en más de un sitio leí que las transacciones deben quedar abiertas el mínimo tiempo posible, por tanto, quizás equivocadamente, cree el programa donde edito el Albarán (cabecera y líneas de albarán) sin conexión a la BD, y al pulsar en "Grabar" vuelco toda la información en la BD, en la cabecera realizo un Update y con las líneas las borro y las inserto de nuevo, un solo COMMIT para grabar cabecera y líneas en una transacción (es el concepto que creí interpretar en algún texto sobre transacciones).

Posiblemente no sea el método adecuado. De la manera que me dices, entiendo que debería realizar un COMMIT con cada Update para no matener la transacción abierta mientras se editan otras líneas. Sería éste el método correcto que me sugieres boreg??

boreg 29-08-2008 18:18:01

Pues te diré que no soy en experto en el tema de las transacciones, pero creo que no es necesario que tengas abierta una transaccion para hacer update en una tabla (mientras no uses dataset's),

Cita:

...De la manera que me dices, entiendo que debería realizar un COMMIT con cada Update para no matener la transacción abierta mientras se editan otras líneas...
creo que en este caso estás hablando de los albaranes (detalle), quizás no sea necesario que hagas un update por cada linea, ya que podrías hacerlo al finalizar la edicion de todas las lineas y, como tú comentabas al principio, solo harás un commit, por supuesto tambien alctualizando la cabecera(¿tabla de pedidos?).

Espero haberme explicado bien, de lo contrario con gusto aclararé tus dudas, claro que si alguien mas puede dar su punto de vista sería excelente.

Saludos

morta71 30-08-2008 08:39:32

Cita:

Pues te diré que no soy en experto en el tema de las transacciones, pero creo que no es necesario que tengas abierta una transaccion para hacer update en una tabla (mientras no uses dataset's),
Por este motivo no utilizo el DBGrid, ya que debe ir asociado a un dataset que me abrirá una transacción en el momento en que se ejecute un "Edit" en el dataset.

Cita:

creo que en este caso estás hablando de los albaranes (detalle), quizás no sea necesario que hagas un update por cada linea, ya que podrías hacerlo al finalizar la edicion de todas las lineas y, como tú comentabas al principio, solo harás un commit, por supuesto tambien alctualizando la cabecera(¿tabla de pedidos?).
Exactamente me refiero a eso, por ello guardo el detalle en un StringGrid (de momento hasta ahora era la mejor opción que encontré), el problema es que en el Grid puede haber inserciones, ediciones y borrado de líneas, por lo que si no borro y creo las líneas de nuevo, de alguna manera debería guardar una especie de histórico de movimientos para poder reflejarlos adecuadamente en la BD y es ahí donde estoy atascado.

Posiblemente mi método es el de complicarme la vida in extremis, fué la solución para una tabla maestro-detalle sin dependencias, al incluir dependencias el tema se me ha complicado, por lo que deduzco que el planteamiento está mal pero, aparte de utilizar DBGrid + DataSet, no se me ocurren otras soluciones, y por ello la petición de ayuda.

Gracias por tu aporte.


La franja horaria es GMT +2. Ahora son las 18:53:12.

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