Seleccion en Tabla con relacion ciclica

12/06/2008 - 07:09 por datsel | Informe spam
hola que tal necesito algo de ayuda para hacer una seleccion en una tabla con
relacion ciclica.
la estructura de la tabla es la siguiente:

nombre de la tabla:PARTES
idParte INT,
descripcion CHAR(50),
costo FLOAT,
subParte_de INT
-

ahora suponiendo que tenemos los siguientes datos en la tabla

idParte |descripcion |costo |subParte_de
1 |motor |5000.00 |NULL
2 |cilindro x1 |4700.00 |1
3 |muelle p8 |300.00 |1
4 |inserto plas|70.00 |3


Bueno tenemos que segun los datos en la tabla "la parte con identifiador 4
es un inserto de plastico con un costo de 70.00 y es una subParte del el
muelle P8 como se especifica en la columna de subParte_de pues es igual a 3".
Ahora si el costo de el inserto de plastico aumenta a 80.00 es necesario
recalcular los costos involucrados con esa parte y segun los datos de la
tabla en necesario cambiar las siguientes partes:
1.idParte 3 costo 10
2.idParte 1 costo P10

E aqui el problema o duda.
Como seleccionar todos las partes involucradas al cambiar el costo de una en
especifico para si posterior analisis o manejo.
en el ejemplo antes mensionado el resulatado de la seleccion debe ser el
siguiente:
si se cambio el costo de la parte con identificador idParte=4 nos deberia
quedar lo siguiente.
idParte |descripcion |costo |subParte_de
1 |motor |5000.00 |NULL
3 |muelle p8 |300.00 |1

de esa manera ya se sabria que datos modificar quedandonos como resultado
posterior a la seleccion y operaciones lo siguiente

idParte |descripcion |costo |subParte_de
1 |motor |5010.00 |NULL
2 |cilindro x1 |4700.00 |1
3 |muelle p8 |310.00 |1
4 |inserto plas|80.00 |3


espero que alguien me pueda ayudar estare pendiente de las respuestas y o
dudas sobre mi duda.

gracias
 

Leer las respuestas

#1 Alejandro Mesa
12/06/2008 - 20:18 | Informe spam
Cual version de SQL Server usas?

Actualizar the abajo hacia arriba puede hacerse, pero recuerda garantizar
que un padre no puede tener un costo menor al de la suma de sus hijos.

Trata:

CREATE TABLE dbo.PARTES_temp (
idParte INT NOT NULL CONSTRAINT pk_partes PRIMARY KEY,
descripcion VARCHAR(50) NULL,
costo NUMERIC(8, 2) NOT NULL,
subParte_de INT CONSTRAINT fk_partes_partes FOREIGN KEY (subParte_de)
REFERENCES dbo.PARTES_temp(idParte)
)
GO

INSERT INTO dbo.[PARTES_temp] VALUES (1, 'motor', 5000.00, NULL)
INSERT INTO dbo.[PARTES_temp] VALUES (2, 'cilindro x1', 4700.00, 1)
INSERT INTO dbo.[PARTES_temp] VALUES (3, 'muelle p8', 300.00, 1)
INSERT INTO dbo.[PARTES_temp] VALUES (4, 'inserto plas', 70.00, 3)
GO

CREATE TRIGGER tr_partes_upd_del ON dbo.[PARTES_temp]
after UPDATE, DELETE
AS
IF @@ROWCOUNT = 0 RETURN

SET NOCOUNT ON

BEGIN TRY
;WITH parts
AS
(
SELECT idParte, costo, subParte_de, idParte AS lower_child, 0 AS lvl
FROM deleted

UNION ALL

SELECT
p.idParte, p.costo, p.subParte_de, c.lower_child, c.lvl + 1 AS lvl
FROM
dbo.[PARTES_temp] AS p
INNER JOIN
parts AS c
ON p.idParte = c.subParte_de
)
UPDATE
b
SET
b.costo = b.costo - d.costo + ISNULL(i.costo, 0)
FROM
parts AS a
INNER JOIN
dbo.PARTES_temp AS b
ON a.idParte = b.idParte
INNER JOIN
deleted AS d
ON a.lower_child = d.idParte
LEFT OUTER JOIN
inserted AS i
ON i.idParte = d.idParte
WHERE
a.lvl > 0
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
END CATCH
GO

UPDATE dbo.[PARTES_temp]
SET [costo] = 80
WHERE [idParte] = 4
GO

SELECT *
FROM dbo.[PARTES_temp]
GO

UPDATE dbo.[PARTES_temp]
SET [costo] = 315
WHERE [idParte] = 3
GO

SELECT *
FROM dbo.[PARTES_temp]
GO

DROP TABLE dbo.[PARTES_temp]
GO


La idea es traer todos los padres relacionados con los hijos que se
modifican, retornando el [id] de el hijo que genero la cadena.


AMB


"datsel" wrote:

hola que tal necesito algo de ayuda para hacer una seleccion en una tabla con
relacion ciclica.
la estructura de la tabla es la siguiente:

nombre de la tabla:PARTES
idParte INT,
descripcion CHAR(50),
costo FLOAT,
subParte_de INT
-

ahora suponiendo que tenemos los siguientes datos en la tabla

idParte |descripcion |costo |subParte_de
1 |motor |5000.00 |NULL
2 |cilindro x1 |4700.00 |1
3 |muelle p8 |300.00 |1
4 |inserto plas|70.00 |3


Bueno tenemos que segun los datos en la tabla "la parte con identifiador 4
es un inserto de plastico con un costo de 70.00 y es una subParte del el
muelle P8 como se especifica en la columna de subParte_de pues es igual a 3".
Ahora si el costo de el inserto de plastico aumenta a 80.00 es necesario
recalcular los costos involucrados con esa parte y segun los datos de la
tabla en necesario cambiar las siguientes partes:
1.idParte 3 costo 10
2.idParte 1 costo P10

E aqui el problema o duda.
Como seleccionar todos las partes involucradas al cambiar el costo de una en
especifico para si posterior analisis o manejo.
en el ejemplo antes mensionado el resulatado de la seleccion debe ser el
siguiente:
si se cambio el costo de la parte con identificador idParte=4 nos deberia
quedar lo siguiente.
idParte |descripcion |costo |subParte_de
1 |motor |5000.00 |NULL
3 |muelle p8 |300.00 |1

de esa manera ya se sabria que datos modificar quedandonos como resultado
posterior a la seleccion y operaciones lo siguiente

idParte |descripcion |costo |subParte_de
1 |motor |5010.00 |NULL
2 |cilindro x1 |4700.00 |1
3 |muelle p8 |310.00 |1
4 |inserto plas|80.00 |3


espero que alguien me pueda ayudar estare pendiente de las respuestas y o
dudas sobre mi duda.

gracias

Preguntas similares