FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Actualizar mediante un UpdateSQL varias tablas relacionadas
Trabajo con Delphi 5 y una base de datos en Interbase 6.0. Desearía poder modificar los datos mostrados en un formulario, mediante componentes DataAware, a través de un componente UpdateSQL, como realizo en otros formularios similares. El problema con el que me encuentro es que quiero poder modificar cualquier campo de tres tablas relacionadas mediante consulta y no sé cómo llevarlo a cabo.
La consulta que tengo en la Query es similar a esta: SELECT A.ID, A.CAMPO1, B.CAMP1, C.CPO1 FROM TABLA1 A, TABLA2 B, TABLA3 C WHERE A.ID = B.ID AND B.ID = C.ID; Y la ModifySQL del UpdateSQL es como esta: UPDATE TABLA1 SET ID = :ID, CAMPO1 = :CAMPO1, CAMP1 = :CAMP1, CPO1 = :CPO1 WHERE A.ID = :OLD.ID ¿Existe alguna manera de poder llevarlo a cabo? ¿Quizás tendría que crear los campos, de las dos tablas con las que se relaciona, mediante Lookup o campo calculado? ¿Sería necesario crear una Vista y trabajar a través de ella? Gracias por todo y espero que me podáis informar y echarme un cable. |
#2
|
||||
|
||||
No se como se hace en interbase, pero te paso el Sql que pondría en el UpdateSql para un Oracle:
Código:
BEGIN UPDATE TABLA1 SET ID = :ID, CAMPO1 = :CAMPO1 WHERE ID = :OLD.ID; UPDATE TABLA2 SET ID = :ID, CAMP1 = :CAMP1 WHERE ID = :OLD.ID; UPDATE TABLA3 SET ID = :ID, CPO1 = :CPO1 WHERE ID = :OLD.ID; END Saludos!
__________________
delphi.com.ar Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla. |
#3
|
|||
|
|||
He adaptado las consultas de actualización para SQL de Interbase.
Por lo que yo sé y la práctica que tengo con el TUpdateSQL, dentro de la ModifySQL no se pueden concatenar dos consultas de golpe para actualizar distintas tablas. Por lo menos a mi tal y como me lo has indicado no me da permiso, dándome error a partir de la segunda consulta de actualización. ¿Existe alguna alternativa? Aún no lo he conseguido solucionar. Gracias por tu contestación. |
#4
|
||||
|
||||
Dentro del ModifySQL puedes poner cualquier tipo de Sql (excepto de selección) que pueda ser interpretado por el motor que utilizas, es lo mismo que ejecutar una consulta cualquiera desde la consola, mismo puedes disparar un store procedure en lugar de un Update!
¿Lo has puesto con el Begin y el End?
__________________
delphi.com.ar Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla. |
#5
|
|||
|
|||
Sí, lo he colocado entre BEGIN y END, separando las propias consultas con ";". Supongo que no será necesario indicar alguna clase de "terminador" como ocurre con los Triggers y los Procedure.
¿Me podrías indicar mediante un ejemplo como integraría, por ejemplo, un Stored Procedure, dentro de la propiedad MODIFYSQL del propio UpdateSQL? Creo que al final será la única solución. Si por lo menos tuviera un ejemplo que funcionase, a la hora de modificar varias tablas relacionadas... Gracias de nuevo por tu ayuda. |
#6
|
||||
|
||||
Cita:
Código:
BEGIN MiStoreProcedure(:PARAM1, :PARAM2....); END; Código:
BEGIN IF :PARAM1 = 'S' THEN UPDATE.... ; ELSE INSERT.... ; END IF; END;
__________________
delphi.com.ar Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla. |
#7
|
|||
|
|||
Siento estar haciéndote perder el tiempo. BEGIN no lo interpreta dentro de la propiedad ModifySQL.
Voy a probar a crearme un Procedimiento y le paso los parámetros directamente, a ver si de esta manera actualiza. En principio creo que podré hacerlo de esta manera. Muchas gracias por tus respuestas. |
#8
|
||||
|
||||
Es que necesitaríamos que algun usuario IB nos diga como se hace esto en ese motor!
Saludos!
__________________
delphi.com.ar Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla. |
#9
|
|||
|
|||
Cita:
|
#10
|
|||
|
|||
He probado mediante un procedimiento almacenado, por paso de parámetros, y no me reconoce el nombre del procedimiento. Creo que no lo estoy haciendo correctamente.
Gracias. Voy a probar por medio de Campos Calculados y a ver si el procedimiento lo hace correctamente. Muchísimas gracias a los dos. Ahora os contaré. |
#11
|
||||
|
||||
Hola
¿ Haces la llamada al procedimiento con un execute procedure ?. Recuerda también, que si el nombre del procedimiento tiene minúsculas deberias ponerlo entre comillas. Ejplo.: execute procedure "ActualizarDatos"(:PARAM1, :PARAM2) o bien execute procedure ACTUALIZAR(:PARAM1, :PARAM2) Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no). |
#12
|
|||
|
|||
Muchas gracias por todas vuestras respuestas. Finalmente lo he conseguido por medio de un Procedimiento Almacenado. Muchas gracias Marc porque necesitaba colocar "execute procedure" y de esta manera no ha habido ningún inconveniente. Creo que es la manera más rápida y sencilla, evitando complicaciones. Lo tengo en cuenta para posibles actualizaciones.
Cadetill, mediante consulta y el resto de campos como calculados o Lookup no me ha llegado a funcionar correctamente: actualizaba solamente los de la tabla 1. Quizás no he sabido cómo denominar a los campos calculados. Gracias por el consejo. Un saludo a todos. |
|
|
|