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 23-09-2003
Sprite Sprite is offline
Registrado
 
Registrado: sep 2003
Ubicación: España
Posts: 6
Poder: 0
Sprite Va por buen camino
Post 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.
Responder Con Cita
  #2  
Antiguo 23-09-2003
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
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!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #3  
Antiguo 23-09-2003
Sprite Sprite is offline
Registrado
 
Registrado: sep 2003
Ubicación: España
Posts: 6
Poder: 0
Sprite Va por buen camino
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.
Responder Con Cita
  #4  
Antiguo 23-09-2003
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
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.
Responder Con Cita
  #5  
Antiguo 23-09-2003
Sprite Sprite is offline
Registrado
 
Registrado: sep 2003
Ubicación: España
Posts: 6
Poder: 0
Sprite Va por buen camino
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.
Responder Con Cita
  #6  
Antiguo 23-09-2003
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
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;
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #7  
Antiguo 23-09-2003
Sprite Sprite is offline
Registrado
 
Registrado: sep 2003
Ubicación: España
Posts: 6
Poder: 0
Sprite Va por buen camino
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.
Responder Con Cita
  #8  
Antiguo 23-09-2003
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
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.
Responder Con Cita
  #9  
Antiguo 23-09-2003
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
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)
Responder Con Cita
  #10  
Antiguo 23-09-2003
Sprite Sprite is offline
Registrado
 
Registrado: sep 2003
Ubicación: España
Posts: 6
Poder: 0
Sprite Va por buen camino
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é.
Responder Con Cita
  #11  
Antiguo 24-09-2003
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 23
guillotmarc Va por buen camino
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).
Responder Con Cita
  #12  
Antiguo 24-09-2003
Sprite Sprite is offline
Registrado
 
Registrado: sep 2003
Ubicación: España
Posts: 6
Poder: 0
Sprite Va por buen camino
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.
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 01:18:13.


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