Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   sumar totales de detalle y asignarlo a un campo del maestro!! (https://www.clubdelphi.com/foros/showthread.php?t=66490)

TrUnkS 23-02-2010 05:12:32

sumar totales de detalle y asignarlo a un campo del maestro!!
 
Amigos ... estoy haciendo un procedimiento en Firebird que he logrado hacer a medias. Tengo una relacion maestro-detalle entre una tabla productos y otra de compuestos. Los compuestos también contienen datos de la misma tabla productos:

PRODUCTOS

IDPRODUCTO
PRECIO_COMPRA

COMPUESTOS

IDCOMPUESTO
IDPRODUCTO
ID
CANTIDAD
NOMBRE
PRECIO_COMPRA
TOTAL_PRECIO_COMPRA

La idea es que si se cambia un PRECIO_COMPRA de la tabla productos y ese producto se encuentra en la tabla compuestos (o sea es una composicion de otro producto), entonces que se cambie ese PRECIO_COMPRA de la tabla compuestos para que se actualize el TOTAL_PRECIO_COMPRA. Eso ya lo tengo:

Código SQL [-]
CREATE OR ALTER PROCEDURE ACTUALIZAR (
    COMPRA double precision)
as
begin
 UPDATE COMPUESTOS
 SET PRECIO_COMPRA = :COMPRA
 WHERE ID = :IDPRODUCTO;
 SUSPEND;


pero lo que necesito es que .... si existe un producto cuyo compuesto sea aquel al cual se le ha modificado su PRECIO_COMPRA, entonces el PRECIO_COMPRA de ese producto es igual a SUM(TOTAL_PRECIO_COMPRA).Lo que quiero es mantener actualizado siempre PRECIO_COMPRA de la tabla productos el cual depende de la suma de los totales de los compuestos.

juanlaplata 23-02-2010 12:28:20

En 1er. lugar, creo que el PRECIO_COMPRA de la tabla COMPUESTOS, no deberia estar, si es q hace referencia al verdadero precio del producto, lo rescatas de la propia tabla y listo, para eso es una base de datos relacional.

2do. No me queda claro como se compone el TOTAL_PRECIO_COMPRA

3ro. en este codigo:
Código SQL [-]
 
UPDATE COMPUESTOS 
SET PRECIO_COMPRA = :COMPRA 
WHERE ID = :IDPRODUCTO;
no deberia igualar con
Código SQL [-]
 WHERE IDPRODUCTO = :IDPRODUCTO

TrUnkS 23-02-2010 14:18:24

Hola juanlaplata y gracias por responder ....

1º El PRECIO_COMPRA de la tabla compuestos no puede hacer referencia a la tabla productos como llave foranea porque un producto puede tener muchos compuestos, entonces si se cambia el PRECIO_COMPRA de un producto, se van a cambiar todos los PRECIO_COMPRA de sus compuestos, siendo que cada compuesto tiene diferente PRECIO_COMPRA

2. El TOTAL_PRECIO_COMPRA es el producto de CANTIDAD * PRECIO_COMPRA. Todos son campos físicos de la tabla. Lo hice asi porque es necesario para calcular el total de cada columna con un campo Aggregate de un ClientDataSet.

3. En el código el IDPRODUCTO es primary key de la tabla producto y foreing key de la tabla COMPUESTOS, asi q estan enlazadas por este campo. El campo ID guarda la primary key de los productos que se van aagregando a la tabla COMPUESTOS.

Aqui hay algo pero no me ha resultado del todo bien

http://www.clubdelphi.com/foros/show...=sumar+columna

y aunque he trabajado con SQL me cuesta mas que el Delphi. Gracias cualquier ayuda.

juanlaplata 23-02-2010 18:19:32

Ok, por la similitud de los nombres no comprendia bien el modelo.
En Oracle se q se puede hacer el SQL todo en uno.
Código SQL [-]
UPDATE PRODUCTOS  
     SET PRECIO_COMPRA = (select sum (TOTAL_PRECIO_COMPRA)                        
                                         from COMPUESTOS                        
                                       where ID = :IDPRODUCTO) 
 WHERE IDPRODUCTO = :IDPRODUCTO;
Lo que no se si es posible en Firebird, pero no seria mayor inconveniente hacerlo en dos pasos, recolectar 1ro. el monto a actualizar, y luego hacerlo ( update )

Rescatamos el total para ingresar como parametro :compra en el update
Código SQL [-]
select sum (TOTAL_PRECIO_COMPRA) 
  from COMPUESTOS  
where ID = :IDPRODUCTO;

Código SQL [-]
UPDATE PRODUCTOS  
     SET PRECIO_COMPRA = :COMPRA  
 WHERE IDPRODUCTO = :IDPRODUCTO;

TrUnkS 23-02-2010 19:58:56

Gracias ... lo voy a probar y comento como me fue. Gracias mil :)


La franja horaria es GMT +2. Ahora son las 12:49:49.

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