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)
-   -   ayuda con commit en transaccion... (https://www.clubdelphi.com/foros/showthread.php?t=9310)

ronimaxh 20-04-2004 15:07:03

ayuda con commit en transaccion...
 
Hola amigos, aqui les planteo mi problemita, estoy probando firebird 1.03 en red, con delphi 7, aplicacion de facturacion, tengo dos tablas a la que hago referencia para facturar, la primera se llama factura que me genera un id en la tabla maestra, y una de detalla donde tambien genera un id de dettalle estos id se generan por codigo, primero mando una rutina a crear el id, luego del insert hago el post y despues el commint, ahora bien el problema que pasa es que me chocan los id cuando los hago al mismo timpo (ejecutando el programa dos veces por ende en dos ventanas distintas, para hacer la prueba).

Nota: uso ibx componentes, cuando genero los id utulizo el ibquery y para guardarlos uso un ibtable, no se si es por eso lo que me ocurre, todo lo hago en el bonton guardar, primero llamo la rutina para que me genere el id, luego de esto, me hace el insert y despues el post y el commit. Lo que me pasa es cuando corro el programa desde otra ventana y hago otra factura en el mismo modulo me dice que el id esta duplicada y da error, parase que el commit no actualiza la base de datos (desde la otra ventana), ahora bien cuando repito el commit en el boton guardar antes de generar el id si lo hace bien, ha que se debe esto.

Nota: espero haberme esplicado bien, sino avisenme y aclaro un poco mas.

guillotmarc 20-04-2004 15:51:00

Hola.

La consulta para ver y guardar el nuevo ID en la tabla correspondiente, tendría que ir en una transacción independiente. De forma que el nuevo valor estuviese confirmado nada más crearlo, y disponible para ser consultado por las otras conexiones. (Además seria aconsejable aumentar el nivel de aislamiento de esa transacción a Lecturas repetibles). De esta forma evitarás la duplicación de códigos.

Aunque usualmente, se suelen utilizar generadores para crear los códigos ID. Un generador es un objeto en la base de datos que va proporcionando códigos consecutivos. Si te instalas IB-Expert, http://www.hksoftware.net/download/i...4.1.1_full.exe además de ser un Administrador de Datos muy bueno, te permite crear el generador y un procedimiento almacenado para consultarlo, en el momento de crear el campo ID (mira las opciones de Autoincremento).

De forma que creas el generador y un procedimiento almacenado, al crear el campo ID. Y en el programa, en lugar de consultar tu tabla de IDs, ejecutas el procedimiento almacenado para averiguar el nuevo código.

Saludos.

ronimaxh 20-04-2004 16:01:54

gracias amigo por tu pronta respuesta, en mi caso soy principiante, y no se nada de generadores y tampo de procedimientos almacenados (nunca lo hecho).
Si me das una pista como lo puedo aprender lo intentaria.

Nota: uso ibexpert version personal.

guillotmarc 20-04-2004 16:24:07

Hola.

Un buen punto por el que empezar es esta web http://firebird.com.mx

Saludos.

Luis 23-06-2004 22:56:37

Actualizar con Interbase
 
Hola
soy nuevo en esto de interbase, si me pueden ayudar en la siguiente duda:

Estoy utilizando un IBquery para accesar a una tabla llamada clientes pero no se como realizar la actualizacion cuando agrego un cliente nuevo, el siguiente es el procedimiento que utilizo pero con SQL server a travez del BDE.

procedure T_MODULO.ActualizaBaseDatos(Query: TIBquery);
begin
With Query Do
begin
FRIO3.StartTransaction;
try
FRIO3.ApplyUpdates;
FRIO3.Commit;
completado:=true;
except
begin
MessageDlg('Error en la base de datos...notifique a sistemas', mtError, [mbOK], 0);
completado:=false;
FRIO3.Roolback;
exit;
end;
end;
end;
end;

si me pueden regalar un ejemplo de como actualizar se los agradecere mucho.

:confused:

guillotmarc 29-06-2004 13:26:41

Hola.

¿ Que error te encuentras ?

Respecto a un ejemplo, ¿ no te sirven los que vienen con Delphi ?. Tienes, por ejplo. la IBMastApp (carpeta Demos, DB)

Saludos.


La franja horaria es GMT +2. Ahora son las 00:37:52.

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