Ver Mensaje Individual
  #1  
Antiguo 15-11-2004
Avatar de radiohead
radiohead radiohead is offline
Miembro
 
Registrado: may 2004
Ubicación: Oliva (Valencia)
Posts: 34
Reputación: 0
radiohead Va por buen camino
Question Transacciones

Hola!
Estoy realizando un proyecto de estudios en Delphi, y tengo una duda sobre transacciones con componentes dbExpress conectado a BBDD Interbase.

La pregunta es:

Si realizo la siguiente secuencia:

Código:
 
SQLConnection1.StartTransaction(TD); //TD: Variable TransactionDesc
 
try
SqlQuery1.SQL.Text := 'INSERT INTO TABLAMAESTRO(<CampoClave>, 
<Campo1>, <Campo2>, ...) VALUES (<:ParamClave>, <:Param1>, <:Param2>, ...);
SqlQuery1.Params[0] := XXXX; //Valor inventado, pues el ID lo asigna un 
trigger 'After Insert' mediante un GENERATOR actualizado con GEN_ID(Gen, Inc)
SqlQuery1.Params[1] := Valor1;
// ... Y así todos los campos
SqlQuery1.ExecSQL();
 
// ... Y ahora los registros Detalle
SqlQuery2.SQL.Text := 'INSERT INTO TABLADETALLE(<CampoClave1>,
<CampoClave2>, <Campo1>, <Campo2>, ...) VALUES <:ParamClave1>, 
<:ParamClave2>, <:Param1>, <:Param2>, ...);
 
SqlQuery1.Params[0] := Valor1; // El primer Campo Clave, es a la vez el 
campo Clave (FOREIGN KEY) del registro de la Tabla Maestro, objeto de mi 
primera duda: no se el valor del ID generado para el campo clave ¿Como 
Averiguarlo?
SqlQuery1.Params[1] := Valor2; // Segundo Campo Clave de la tabla Detalle
// ... Y así todos los campos
SqlQuery2.ExecSQL(); 
 
SQLConnection1.Commit(TD);
except
SQLConnection1.Rollback(TD);
Más o menos se trata de esto. Las diversas inserciones en la tabla detalle las realizo con un bucle, y todo funciona perfectamente de no ser porque necesito saber el ID generado para la tabla maestro (automaticamente mediante trigger 'after insert' para incluirlo en el campo FOREIGN KEY de cada registro de la tabla detalle y hacer así efectiva la relación.

Por otra parte (sé que es otra pregunta, aunque creo que estrechamente relacionada con la cuestión anterior), hágase el Commit o el Rollback (o todo o nada), el trigger és activado y el generador automáticamente incrementado. Si realizo una transacción, deseo explícitamente un Todo o Nada. Si esta no se lleva a cabo, no deseo que se incremente el generador, pues la inserción no ha sido efectiva y, por lo tanto, me rompe la secuencia de los anteriores registros insertados en la tabla maestro. ¿Hay alguna forma de solucionar esto?

Gracias de antemano por vuestro interés.


Última edición por radiohead fecha: 15-11-2004 a las 11:17:41.
Responder Con Cita