Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Insertar en varias tablas... (https://www.clubdelphi.com/foros/showthread.php?t=13766)

Duc 30-08-2004 18:35:08

Insertar en varias tablas...
 
Buenas

estoy trabajando con Delphi 6 y accedo a una base de datos SQLServer con un ADOQuery. Tengo que grabar unos datos en diferentes tablas: tengo una tabla con una cabezera y varias tablas de "lineas" vinculadas a la tabla de cabezeras (una cabezera se vincula a varias lineas). Primero inserto el registro de la cabezera, después abro un formulario para insertar las lineas, una a una.
Si hubiera un error en el insertar alguna linea, o el proceso se cancelara, tendría que eliminar otra vez todos los registros insertados en el proceso para dejar las tablas limpias. Una faena bastante dura si contamos todas las lineas que puedo llegar a poner a la vez.

Mi duda es sencilla: ¿Hay alguna forma de optimizar el proceso? es decir, alguna forma de decirle, uno a uno, los registros que tiene que grabar, pero si se cancela, que no guarde ninguno; o al contrario, grabar los registros uno a uno, pero que si se cancela los elimine todos automáticamente.

Recuerdo una técnica que me explicaron, eran transacciones de Beatrive; servian para hacer, según lo que yo entendí, exactamente lo que yo necesito.

Siento el rollo, y muchas gracias por adelantado.

oscorm 31-08-2004 02:06:05

claro que si, inicias una transaccion y si algo peta en el medio simplemente ejecutas un rollback y caso contrario haces commit. de cualquier modo te aclaro que eso que planteas es una chapuza desde el punto de vista que, claro como informaticos que somos partimos de la base de primero guardar la cabecera y luego el detalle cuando en la realidad sucede completamente al revés, piensa en lo que te acabo de escribir y verás más luz al final del camino.

un saludo.

jachguate 31-08-2004 03:58:35

Como veo que estas bastante novato en el tema, te recomiendo buscar ayuda sobre transacciones, que es una forma de convertir varias operaciones en una operación atómica, es decir o suceden todas o no sucede ninguna. Estas operaciones están soportadas en prácticamente todas las bases de datos y manejadores de archivos actuales, entre las pocas excepciones podemos contar a mySQL, que ha prometido, sin embargo, en su próxima versión, soportarlas.

Hasta luego.

;)

Sirkius 31-08-2004 08:40:53

Con el tipo de tablas InnoDB tenemos transacciones y foreign keys :P

Duc 31-08-2004 11:42:54

Muchas gracias a todos!

He empezado a buscar información y a trabajar con las transacciones, y tienen muy buena pinta :) . Ahora bien, he estado haciendo algunas pruebas, ¿no puedo hacer consultas de las tablas afectadas antes de terminar la transferencia? Me interesaría mucho consultar los datos que voy insertando, y despues poderlos eliminar todos o grabarlos todos...

Otra cosa,
Cita:

de cualquier modo te aclaro que eso que planteas es una chapuza
No entiendo el porqué, ya que forzosamente tengo que guardar primero la cabezera y luego las lineas, ya que al haber una relación si no existe la cabezera no se pueden guardar las lineas. ¿estoy equivocado?

gracias a todos de nuevo.

jachguate 01-09-2004 06:07:28

Cita:

Empezado por Duc
Ahora bien, he estado haciendo algunas pruebas, ¿no puedo hacer consultas de las tablas afectadas antes de terminar la transferencia? Me interesaría mucho consultar los datos que voy insertando, y despues poderlos eliminar todos o grabarlos todos...

Normalmente si podes consultarlos en el contexto de la misma transacción, pero no desde otras, a menos que el motor permita un nivel de aislamiento DirtyRead, pero creo que ni interbase, ni firebird, ni oracle los permiten. No se de otros motores.

Hasta luego.

;)


La franja horaria es GMT +2. Ahora son las 02:54:27.

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