![]() |
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. |
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. |
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. |
|
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: |
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 22:47:33. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi