Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 15-11-2004
Avatar de radiohead
radiohead radiohead is offline
Miembro
 
Registrado: may 2004
Ubicación: Oliva (Valencia)
Posts: 34
Poder: 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 12:17:41.
Responder Con Cita
  #2  
Antiguo 15-11-2004
Avatar de ruina
ruina ruina is offline
Miembro
 
Registrado: jun 2004
Posts: 196
Poder: 21
ruina Va por buen camino
si, puedes retrasar el contador, perooooo no es nada aconsejable, lo mejor es que NO te preocupes por la secuencia, si necesitas un número consecutivo y sin huecos (ej: Nº de factura) NO uses el campo clave para estos menesteres. De hecho no tendrias ni que enseñarselo al usuario.


¿porque? por el campo de identificación del registro (lease código) y el número de factura/albarán/recibo son cosas distintas, de hecho puedes tener Dos facturas con el número 56 (Serie A y serie B de facturación, conozco empresas que tienen 10 letras de facturación distintas)
__________________
todo el mundo debe creer en algo... yo creo que voy a tomarme otra copa.
Responder Con Cita
  #3  
Antiguo 16-11-2004
Avatar de radiohead
radiohead radiohead is offline
Miembro
 
Registrado: may 2004
Ubicación: Oliva (Valencia)
Posts: 34
Poder: 0
radiohead Va por buen camino
Question Posible Solución? (a medias)

Hola!
La verdad es que no se otra forma mejor de ir generando una secuencia (efectivamente, se trata de un programa de facturación), y más si este programa se da el caso de que trabajen varias copias al unísono en red... desde luego, no es nada aconsejable ir efectuando retrasos en el contador, si se da este caso desde uno de los clientes.

No obstante (por si puede servir de algo), investigando he encontrado una forma interesante de generar la secuencia, y al mismo tiempo saber el ID generado.

Se trata de, en vez de confiar esta operación a un trigger, incrementar el generador desde el programa cliente insertando un SQLQuery con la siguiente sentencia SQL:

Código:
SELECT GEN_ID(Generator, Incremento) FROM RDB$DATABASE
Esto incrementa el GENERATOR (hablo de un Servidor Interbase), que es el mismo para todos los clientes (no se me ocurre ningún conflicto, aunque se haga desde el cliente), y te devuelve el resultado, que lo puedes incluir inmediatamente en el FIELD correspondiente antes de hacer efectiva la inserción tanto en el campo clave de la tabla maestro como en el campo externo de los registros de la tabla detalle.

No te soluciona el problema de que si hay errores en la inclusión seguirá siendo efectivo el incremento, pero menos es nada... Sólo se me ocurre que antes del mismo, asegurarse mediante código, si es necesario, de que la inserción se va a realizar sin ningún problema.

Si alguien conoce alguna forma mejor, le agradecería su consejo.

Un Saludo


Última edición por radiohead fecha: 16-11-2004 a las 10:40:45.
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 00:59:07.


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