Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Actualizar mediante un UpdateSQL varias tablas relacionadas (https://www.clubdelphi.com/foros/showthread.php?t=3878)

Sprite 23-09-2003 12:23:19

Actualizar mediante un UpdateSQL varias tablas relacionadas
 
:confused: 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.

delphi.com.ar 23-09-2003 15:58:58

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

Supongo que la sintaxis para IB debe ser similar a esta...
Saludos!

Sprite 23-09-2003 17:30:35

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.

delphi.com.ar 23-09-2003 17:58:13

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?

Sprite 23-09-2003 18:04:38

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.

delphi.com.ar 23-09-2003 18:11:00

Cita:

Posteado originalmente por Sprite
¿Me podrías indicar mediante un ejemplo como integraría, por ejemplo, un Stored Procedure, dentro de la propiedad MODIFYSQL del propio UpdateSQL?
Con Oracle haría algo así:
Código:

BEGIN
  MiStoreProcedure(:PARAM1, :PARAM2....);
END;

Mismo alguna vez he hecho algo como esto

Código:

BEGIN
  IF :PARAM1 = 'S' THEN
    UPDATE.... ;
  ELSE
    INSERT.... ;
  END IF;
END;


Sprite 23-09-2003 18:22:24

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.

delphi.com.ar 23-09-2003 18:32:42

Es que necesitaríamos que algun usuario IB nos diga como se hace esto en ese motor!

Saludos!

__cadetill 23-09-2003 18:39:22

Cita:

Posteado originalmente por Sprite
¿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?
Pues hasta donde yo conozco, la única forma que tienes de hacerlo es hacer la consulta sobre la tabla 1 y las otras ponerlas en campos calculados o lookup (personalmente me gustan más los calculados)

Sprite 23-09-2003 18:55:05

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é.

guillotmarc 24-09-2003 11:37:05

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.

Sprite 24-09-2003 15:03:52

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.


La franja horaria es GMT +2. Ahora son las 14:51:40.

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