Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 30-08-2004
Duc Duc is offline
Miembro
 
Registrado: jul 2004
Posts: 49
Poder: 0
Duc Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 31-08-2004
oscorm oscorm is offline
Miembro
 
Registrado: ago 2004
Ubicación: Alcorcón
Posts: 59
Poder: 21
oscorm Va por buen camino
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.
Responder Con Cita
  #3  
Antiguo 31-08-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
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.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #4  
Antiguo 31-08-2004
Sirkius Sirkius is offline
Miembro
 
Registrado: jun 2004
Posts: 83
Poder: 21
Sirkius Va por buen camino
Con el tipo de tablas InnoDB tenemos transacciones y foreign keys :P
__________________
SIN FIRMA :P
Responder Con Cita
  #5  
Antiguo 31-08-2004
Duc Duc is offline
Miembro
 
Registrado: jul 2004
Posts: 49
Poder: 0
Duc Va por buen camino
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.
Responder Con Cita
  #6  
Antiguo 01-09-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Cool

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.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 02:33:51.


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
Copyright 1996-2007 Club Delphi