![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
|
|
#1
|
|||
|
|||
|
Como guardar Maestro Detalles entorno de red
Hola mi consulta es la siguiente: tengo una tabla maestro (t1) y otra detalles (t2), como seria la forma correcta de guardar la informacion?
Ejemplo 1 --------- insert into t1 (c1, c2) values ..... try commit except end insert into t2 (c1, c2, c3) values ..... try commit except end o Ejemplo 2 --------- try insert into t1 (c1, c2) values ..... insert into t2 (c1, c2, c3) values ..... commit except end En un prinicipio lo hacia como en el ejemplo 2, pasa que a veces me daba error de transacciones pendientes en un entorno de red... lo cambie por el ejemplo 2 y todo bien, pero no estoy seguro de estar haciendo las cosas correctamente. Gracias |
|
#2
|
||||
|
||||
|
La forma correcta de hacerlo es la 2), así si hay algún problema se cancela la transacción con lo que no se guarda ningún registro, ni en el maestro ni en el detalle (En cambio con la opción 1) nos podemos encontrar facilmente con que hemos guardado el maestro, pero no hemos podido guardar los detalles, con lo que tenemos información incompleta e incoherente en la base de datos).
En todo caso la opción 1) tampoco te debería dar esos problemas de transacciones pendientes. Si quieres buscar la causa deberías darnos más información : mensaje de error exacto, componentes usados, código Delphi real, etc. ...
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no). |
|
#3
|
|||
|
|||
|
Los componentes utilizados son los de Interbase, para las tablas utilizo tibquery.
El error que sale cada tanto es: (estando en red) lock conflict on no wait transaction deadlock update conflicts with concurrent update concurrent transaction number is 83114. El código: tengo las tablas FACVTA (FACTURAS), DETFAC (DETALLES DE PRODUCTOS VENDIDOS, ARTICULOS (PARA ACTUALIZAR LAS CANTIDADES) ---- guardo encabezado insert into factura_encabezado (...) values ... execsql; ---- guardo detalles de facturas y actualizo cantidades Recorro una tabla temporal y voy insertando en los datalles los productos vendidos y actualizando cantidades first while ... not eof do begin insert into factura_detalles (...) values .... execsql; //aca mismo actualizo las cantidad de la tabla articulos update articulos set cantid = cantid + .... where codart = facturas_detalles.codart execsql; next end //while tablascommit; (Aqui surge el error cada tanto) //PROCDIMIENTO TABLASCOMMIT QUE USO procedure tablascommit; begin try datafb.IBTransaction1.CommitRetaining; except datafb.IBTransaction1.RollbackRetaining; end; end; sino se entiende pongo el codigo real, no lo puse por lo extenso, gracias! |
|
#4
|
||||
|
||||
|
Cita:
NOTA: Los triggers también cuentan. De manera que si al añadir productos vendidos, vas actualizando su stock. Entonces dos maquinas distintas, aunque den de alta ventas distintas, van a intentar modificar el stock del mismo producto, y vas a tener un bloqueo en ese registro. Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no). |
|
#5
|
||||
|
||||
|
resp
Puedes crear una vista actualizable que trbajo sobre ambas tablas y de esa manera pueder verificar el error de bloque. Aunque es muy raro que firebird te de error de bloque ya usa versionado de registros. Debes estar cometiendo un error y no lo estas notando. Has la prueba con una vista actualizable.
__________________
Todo se puede, que no exista la tecnología aun, es otra cosa. |
|
#6
|
||||
|
||||
|
Cita:
Coge un registro, modifícalo con un UPDATE pero no termines la transacción. Ahora en otro equipo intenta modificar el mismo registro. No vas a poder hasta que el primer equipo no finalice esa transacción. (Por eso me gusta trabajar con ClientDatasets, nunca se dejan transacciones abiertas, y cuando se hacen cambios en la b.b.d.d. las transacciones duran el mínimo tiempo posible. Cuanto más cortas sean tus transacciones menos posibilidades tendrás de encontrarte bloqueos). NOTA: El sistema de versiones son para las lecturas.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no). Última edición por guillotmarc fecha: 07-10-2010 a las 10:35:16. |
![]() |
| Herramientas | Buscar en Tema |
| Desplegado | |
|
|
Temas Similares
|
||||
| Tema | Autor | Foro | Respuestas | Último mensaje |
| Insertar registro maestro y detalles en un mismo procedimiento | Vlady | Conexión con bases de datos | 0 | 13-11-2008 23:49:56 |
| Ayuda con relacion maestro detalles. | OscarBravo | Tablas planas | 1 | 26-07-2007 17:24:41 |
| Guardar Maestro-Detalle (Problema super comun) | sonjeux | Conexión con bases de datos | 2 | 19-02-2007 18:28:29 |
| Como imprimir un informe master/detail con 1 maestro y 5 detalles | ovd | Impresión | 6 | 18-11-2005 10:31:07 |
| QR: Como imprimir dos detalles diferentes en una hoja | erickperez6 | Impresión | 1 | 22-05-2003 09:25:00 |
|