![]() |
![]() |
![]() |
![]() |
![]() |
FTP | ![]() |
![]() |
CCD | ![]() |
![]() |
Buscar | ![]() |
![]() |
Trucos | ![]() |
![]() |
Trabajo | ![]() |
![]() |
Foros | ![]() |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
![]() |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
||||
|
||||
Updates en Interbase con dos tablas relacionadas
Hola amigos de nuevo,
Reconozco abiertamente que soy un novato en esto del Delphi. Procedo del Clipper donde he estado muy cómodo hace muchos años. He leído y leído muchos hilos de este foro y sé que todo el mundo está bastante convencido del Delphi. No voy a ocultar que las cosas que me parecían muy fáciles en Clipper se me están volviendo 'imposibles' en Delphi, por muy raro que parezca. Mi problema, con el cual llevo varios días y no lo logro resolveer después de innumerables consultar a documentos de Internet, manuales, tutoriales, etc, es el siguiente: Tengo dos tablas en una misma base de datos. Los datos básicos de la Tabla1/Tabla2 son : Código:
Tabla1.Clave Tabla1.Campo1 Tabla1.Campo2 ... Tabla2.Clave Tabla2.Comentario Utilizo Interbase 7.1. La Tabla1 tiene como Primary Key el campo 'Clave' y la Tabla2 también como Primary Key el campo 'Clave', adicionalmente declarada Código:
Foreign Key ("Clave") References Tabla1 ('Clave') On Update Cascade On Delete Cascade El Form1 consta de un TIBDatabase1, TIBTransaction1, TIBQuery1, TIBUpdateSQL1 y DataSource1. El Form2 lo mismo pero en vez de utilizar el IBQuery utilizo TIBTable1. Todo funciona perfectamente, con referencias de uno a otro, etcetera, hasta que : 1. Si cambio 'Clave' de un registro en el DBGrid del Form1, al abrir el segundo Form ya la referencia del campo DBMemo está vacía. He probado de todo, cerrar y abrir la transacción, la tabla e incluso la base de datos en el Form2 antes de crear el formulario. Nada funciona correctamente. La mayoría de las veces incluso el programa se me queda 'colgado'. Tengo que forzar el cierre completo de la aplicación por el Administrador de Tareas. 2. Si accedo al Form2 para editar el campo 'Comentario' en el DBMemo, la actualización se efectúa correctamente y todo correcto. Hasta que vuelvo a cambiar la 'Clave' en el DBGrid del Form1. A pesar de haber realizado un Free del Form2, cerrado la transacción, etcétera, me dá el siguiente error: Código:
deadloack update conflicts with concurrent update Si he cerrado el Form2, liberado con Free, cerrada la transacción del Form2, por qué se supone que quedan pendientes 'updates concurrentes'? Curiosamente, si cierro el Form1 (que por cierto es un MDIChild de un Formulario Main), y lo abro de nuevo desde su opción de menú, todos los errores anteriores parece como si no se hubieran dado y ahí si que se 'resetea' el sistema de los dos formularios. Pero por supuesto, vuelta a empezar y si hago cualquiera de las dos modificaciones arriba mencionadas, los errores vuelven a aparecer. Seguramente alguno de vosotros habeis podido ver otros hilos míos anteriores en este foro sobre el mismo tema, pero me trae de cabeza. Sé que a lo mejor es un error mío de absoluto novato, pero lo que para mí era muy facil de hacer en Clipper, ahora me es no sólo totalmente in-transparente, es decir, no logro entrever las operaciones que realiza el Delphi para estos 'Updates', sino que además me salen estos errores. Este tipo de operaciones es muy necesario para mí, donde se modifican claves primarias y updates en tablas relacionadas. Si no logro resolver este conflicto, no sé como poder seguir. He probado incluso hacer los updates manualmente, con el evento 'OnUpdateRecord' del TIBQuery. Pero resulta que si no le adjunto al Form un elemento TIBUpdateSQL no me permite editar el DBGrid ya que está en modo 'Solo Lectura', al haber utilizado un TIBQuery. Y si añado el TIBUpdateSQL, el programa no pasa aparentemente por el evento 'OnUpdateRecord'. Os agradezco muy sinceramente toda la ayuda que me podais prestar. Gracias. |
#2
|
||||
|
||||
ALELUYA !!!!
Acabo de encontrar la solución. Me voy a responder a mí mismo para que otros que tengan el mismo problema no se encuentren en la misma situación en la que he estado rompiendome la cabeza durante tres días. Y FINALMENTE RESULTA QUE ES TAN SIMPLE !! (como siempre en estos casos). Resulta que el error viene en situar en el segundo Form2 de nuevo un componente TIBDatabase y TIBTransaction. Estos son los dos elementos que causaban el error. Si referencio directamente la IBTable en el Form2 a la base de datos y transacción del Form1, todo funciona correctamente y los updates se realizan de manera inmediata y eficientemente. Y la pregunta final: Todo esto en que manual de Delphi viene descrito? Supongo que en el 'manual del programador Delphi desesperado...' Era lógico pensar que si en el Form2 accedía a otra tabla diferente, aunque dentro de la misma base de datos, podía situar un nuevo componente TIBDatabase en el Form2, no? ... lógica de programador Clipper, claro! Saludos a todos. |
![]() |
|
|
![]() |
|