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 04-10-2004
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
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
EL 'Comentario' de la tabla 2 es de tipo BLOB y sólo almacenará texto.

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
Tengo un Form1 con un DBGrid que funciona perfectamente, y otro Form2 que se abre en modo Modal al clikear un botón que abre un TDBMemo, que a su vez también funciona perfectamente referenciado a la Tabla1 en el DBGrid del Form1. Cuando cierro el Form2 realizo un Free con lo que supuestamente queda todo liberado.

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
Sinceramente, no logro comprender el porqué de estos errores. Si se supone que Interbase realiza la actualización de los campos 'Clave' en ambas tablas de manera automática, por qué Delphi no es capaz de interpretarlas correctamente?

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.
Responder Con Cita
  #2  
Antiguo 05-10-2004
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
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.
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 05:14:48.


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