Ayuda relacionando productos.

05/12/2007 - 13:23 por Masta | Informe spam
Hola a todos.

Tengo la siguiente tabla:

RELACIONES
IDProducto int
IDProducto2 int

y tengo el siguiente Procedimiento Almacenado...

ALTER PROCEDURE [dbo].[ADMIN_Relacionar]
(
@id1 as int,
@id2 as int
)
AS
BEGIN

if (not exists(select * from new_relaciones where (idproducto=@id1 and
idproducto2=@id2) or (idproducto=@id2 and idproducto2=@id1))) and
(@id1<>@id2)
begin
insert into new_relaciones(idproducto,idproducto2)
values(@id1,@id2)
end
END

...Que lo que hace es relacionar dos productos que le pasamos,
comprobando antes que no exista la relación.

Ahora bien, quiero rizar el rizo y que, además de relacionar el "@id2"
al "@id", relacione también el "@id2" con todos los "id" que ya tiene
relacionados el "@id", pero por supuesto comprobando antes que no
exista ya la relación.

Ejemplo: Tenemos unos paraguas

1 - Azul
2 - Rojo
3 - Amarillo

En la tabla de relaciones tenemos que el Paraguas Azul (1) está
relacionado con el Rojo (2) y el Amarillo (3)
1 - 2
3 - 1

Ahora tenemos un nuevo paraguas
4 - Verde

Quiero que al relacionar el Verde (4) al paraguas Azul (1), éste
herede automáticamente sus relaciones, es decir, que relacione también
el Verde (4) con el Rojo (2) y el Amarillo (3).
Por supuesto entiendo que es tan sencillo como hacer un insert con un
select, pero es necesario comprobar antes que la relación que va a
crear automáticamente no exista ya en la tabla.

¿Alguna idea?

Espero haberme explicado bien, si no, decídmelo las dudas que os haya
dejado y intento explicároslo mejor.

Un saludo a todos

Preguntas similare

Leer las respuestas

#1 Masta
06/12/2007 - 22:51 | Informe spam
Sigo necesitando ayuda para este asunto.

Si necesitáis que os aclare algo decídmelo por favor.

Un saludo.
Respuesta Responder a este mensaje
#2 Carlos M. Calvelo
07/12/2007 - 11:28 | Informe spam
Hola,


On 5 dec, 13:23, Masta wrote:
Hola a todos.

Tengo la siguiente tabla:

RELACIONES
> IDProducto int
IDProducto2 int

y tengo el siguiente Procedimiento Almacenado...

ALTER PROCEDURE [dbo].[ADMIN_Relacionar]
(
@id1 as int,
@id2 as int
)
AS
BEGIN

if (not exists(select * from new_relaciones where (idproducto=@id1 and
idproducto2=@id2) or (idproducto=@id2 and idproducto2=@id1))) and
(@id1<>@id2)
begin
insert into new_relaciones(idproducto,idproducto2)
values(@id1,@id2)
end
END

...Que lo que hace es relacionar dos productos que le pasamos,
comprobando antes que no exista la relación.

Ahora bien, quiero rizar el rizo y que, además de relacionar el "@id2"
al "@id", relacione también el "@id2" con todos los "id" que ya tiene
relacionados el "@id", pero por supuesto comprobando antes que no
exista ya la relación.

Ejemplo: Tenemos unos paraguas

1 - Azul
2 - Rojo
3 - Amarillo

En la tabla de relaciones tenemos que el Paraguas Azul (1) está
relacionado con el Rojo (2) y el Amarillo (3)
1 - 2
3 - 1

Ahora tenemos un nuevo paraguas
4 - Verde

Quiero que al relacionar el Verde (4) al paraguas Azul (1), éste
herede automáticamente sus relaciones, es decir, que relacione también
el Verde (4) con el Rojo (2) y el Amarillo (3).
Por supuesto entiendo que es tan sencillo como hacer un insert con un
select, pero es necesario comprobar antes que la relación que va a
crear automáticamente no exista ya en la tabla.

¿Alguna idea?

Espero haberme explicado bien, si no, decídmelo las dudas que os haya
dejado y intento explicároslo mejor.





Qué te parece esto?

insert into new_relaciones
select c1,c2 from
(
select @id2 as c1,idproducto2 as c2
from new_relaciones
where idproducto = @id1 and idproducto2 <> @id1
union
select @id2 as c1,idproducto as c2
from new_relaciones
where idproducto2 = @id1 and idproducto <> @id1
union
select @id1 as c1,idproducto as c2
from new_relaciones
where idproducto2 = @id2 and idproducto <> @id2
union
select @id1 as c1,idproducto2 as c2
from new_relaciones
where idproducto = @id2 and idproducto2 <> @id2
) T
where
not exists (
select idproducto,idproducto2 from new_relaciones
where idproducto = T.c1 and idproducto2 = T.c2 OR
idproducto = T.c2 and idproducto2 = T.c1 OR
T.c1 = t.c2
)

Este insert lo puedes poner justo antes del otro insert
en el SP.
Si quieres ver el resultado de este select puedes probarlo
(sin el insert) para distintos valores de @id1 y @id2.

Saludos,
Carlos
Respuesta Responder a este mensaje
#3 Masta
07/12/2007 - 13:22 | Informe spam
Muchas gracias Carlos, me has dejado el código que con copiar y pegar
ha quedado listo para funcionar.

Lo he dejado implementado en la herramienta. Ahora me queda leérmelo
bien para asimilar lo que me has enseñado.

Un saludo y gracias de nuevo!
Respuesta Responder a este mensaje
#4 Carlos M. Calvelo
07/12/2007 - 13:56 | Informe spam
Hola Masta,

On 7 dec, 13:22, Masta wrote:
Muchas gracias Carlos, me has dejado el código que con copiar y pegar
ha quedado listo para funcionar.

Lo he dejado implementado en la herramienta. Ahora me queda leérmelo
bien para asimilar lo que me has enseñado.




Espero que lo hayas probado, por ejemplo así:

declare @id1 int, @id2 int
set @id1 = 4
set @id2 = 1


Con datos ejemplo en la tabla new_relaciones y
con distintas combinaciones de @id1 y @id2 puedes
controlar si el select devuelve lo que tu esperas.

Los cuatro subselects tratan de generar combinaciones
de:
@id1, IDProducto
@id1, IDProducto2
@id2, IDProducto y
@id2, IDProducto2

Después de generar las combinaciones necesarias
el 'where not exists(...)' controla que no estén
ya en la tabla.

Saludos,
Carlos
Respuesta Responder a este mensaje
#5 Carlos M. Calvelo
07/12/2007 - 20:58 | Informe spam
Hola Leonardo,

On 7 dec, 16:20, "Leonardo Azpurua" <l e o n a r d o [arroba] m v p s
[punto] o r g> wrote:

Tal vez lo más razonable sería replantear un poco el diseño, ...



Mejor se lo replantee, sí.
Ya solo porque se están introduciendo registros en la tabla que
se podrían derivar. Y eso, con la misma consulta con la que se
determina que registros hay que introducir.

Y ya no solo por reducir el volumen de datos registrados, sino
también por integridad. Por ejemplo, de la consulta no los va a
borrar nadie y de la tabla base puede que si.

Saludos,
Carlos
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida