Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

insertar datos en tablas con relacion muchos a muchos en sql server

Estas en el tema de insertar datos en tablas con relacion muchos a muchos en sql server en el foro de SQL Server en Foros del Web. Buen día Utilizo VS 2005 y SQL server 2005. Estoy desarrollando una aplicacion web utilizando asp y c#, tengo un formulario en aspx y capturo ...
  #1 (permalink)  
Antiguo 19/05/2008, 14:36
 
Fecha de Ingreso: mayo-2008
Ubicación: Medellin
Mensajes: 17
Antigüedad: 16 años
Puntos: 0
insertar datos en tablas con relacion muchos a muchos en sql server

Buen día
Utilizo VS 2005 y SQL server 2005. Estoy desarrollando una aplicacion web utilizando asp y c#, tengo un formulario en aspx y capturo los datos de los textbox, hago la conexion con el sql e inserto los datos que capturo del formulario.
El esquema en la BD es + o - asi:
tabla1 ----< tabla1tabla2 >-------- tabla2
la duda es con respecto a la insercion ya que solo inserto en la tabla1, porque yo se que por regla los datos que inserto en la tabla1 se deben ver en la tabla1tabla2 (la que resuelve el conflicto de muchos a muchos) pero no se si tambien se deben reflejar en la tabla2, ademas que no se como se debe hacer la insercion en mas de una tabla a la vez.
Cabe aclarar que la insercion que hago es por medio de una variable session y un procedimiento almacenado
Gracias por su colaboracion
  #2 (permalink)  
Antiguo 20/05/2008, 01:26
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: insertar datos en tablas con relacion muchos a muchos en sql server

En tabla1tabla2 solo puede haber registros que a su vez esten en taba1 y tabla2 por separado:


Taba1
Reg1Tabla1
Reg2Tabla1

Taba2
Reg1Tabla2
Reg2Tabla2

luego

Taba1Taba2 puede tener
Reg1Tabla1Reg1Tabla2
Reg1Tabla1Reg2Tabla2
Reg2Tabla1Reg1Tabla2
Reg2Tabla1Reg2Tabla2

por tanto si, debes insertar los registros en todas las tablas, es más si la bd esta bien diseñada debe impedirte de entrar nada en tabal1tabla2 si no existen correspondencias en tabla1 y tabla2 por separado.

Tienes que entrar lo que capturas del formulario primero en tabla1 i/o tabla2 y luego su relacion en tabla1tabla2.

Como se inserta en varias tablas, pues una cosa detras de la otra:

INSERT INTO tabla1....
INSERT INTO tabla2....
INSERT INTO tabla1tabla2...

Quim

Última edición por quimfv; 20/05/2008 a las 01:31
  #3 (permalink)  
Antiguo 20/05/2008, 08:24
 
Fecha de Ingreso: mayo-2008
Ubicación: Medellin
Mensajes: 17
Antigüedad: 16 años
Puntos: 0
Respuesta: insertar datos en tablas con relacion muchos a muchos en sql server

Hola Quim, gracias por tu respuesta
Creo que con lo que me dices se puede resolver mi duda, aunque me parece raro eso de los insert seguidos y quiero saber si para procedimientos almacenados se puede hacer asi, ya que ese es mi caso.
Para complementar un poco mas la info de mi problema: La tabla1 esta vacia (ahi es donde debo hacer la insercion) la tabla1tabla2 tambien esta vacia, pero la tabla2 ya tiene datos, todo esto es porque estoy trabajando en una aplicacion que no comence a hacer yo y tuve que agregar la tabla1 y posteriormente la tabla1tabla2 para resolver el conflicto muchos a muchos.
Por tu atencion y colaboracion muchas gracias
  #4 (permalink)  
Antiguo 20/05/2008, 12:36
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: insertar datos en tablas con relacion muchos a muchos en sql server

No te puedo poner codigo por que no domino asp pero si se como funciona, si recoges los datos de un formulario por lo que dices estaras recogiendo parejas del tipo tabla1tabla2 el dato tabla1 por lo que dices no esta en la tabla1 por tanto sea como sea tienes que hacer un insert, supongo que apoyado en un indice unico para que no entren repeticiones, el dato tabla2 ya esta en la tabla2 por tanto no hace falta hacer el insert into y finalmente el emparejamiento no esta en la tabla1tabla2 por tanto tendras que hacer el insert.

Como el dato lo recoges del lado cliente y la base de datos esta en el servidor forzosamente tendras que mandar peticiones para hacer los insert a las tablas. Supongo que si puedes llamar un stored y pasarle la pareja de valores el stored puede hacer todo el trabajo y con una sola peticion al servidor pasaras, pero internamente el stored tendrá forzosamente que hacer los insert en las dos tablas.

Creo que no me equivoco... pero la unica forma de poner un nuevo registro en una tabla es haciendo un insert...

Quim
  #5 (permalink)  
Antiguo 20/05/2008, 12:59
 
Fecha de Ingreso: mayo-2008
Ubicación: Medellin
Mensajes: 17
Antigüedad: 16 años
Puntos: 0
Respuesta: insertar datos en tablas con relacion muchos a muchos en sql server

Hola Quim
Tienes razon exactamente lo que me dices es lo que habia pensado, pero sigo con la duda del stored procedure y los dos insert, aca te dejo como lo pienso hacer:
CREATE PROCEDURE dbo.spProcedure
@Dato1 varchar (300),
@Dato2 varchar (100),
@Dato3 varchar (20),
@Dato4 varchar (20),
@IDTabla2 int
AS
INSERT INTO Tabla1
(Dato1, Dato2, Dato3, Dato4)
VALUES (@Dato1, @Dato2, @Dato3, @Dato4)
INSERT INTO Tabla1Tabla2 (IDTabla2)
VALUES (@IDTabla2)
Esto lo hago asi porque el ID de la tabla 1 se genera y se incrementa automaticamente, en cambio el de la tabla 2 no
Me recomiendas que cambie algo, o asi esta bien?
cuando tenga resultados vuelvo a escribir, gracias por tu atencion
  #6 (permalink)  
Antiguo 21/05/2008, 02:58
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: insertar datos en tablas con relacion muchos a muchos en sql server

Tendras que obtener el nuevo id de tabla1 para insertarlo en la tabla1tabla2, en esta debes insertar los dos id el de la tabla1 y el de la 2 para establecer la relacion entre ambos, como te decia en el mail anterior:

Cita:
...
Como el dato lo recoges del lado cliente y la base de datos esta en el servidor forzosamente tendras que mandar peticiones para hacer los insert a las tablas. Supongo que si puedes llamar un stored y pasarle la pareja de valores el stored puede hacer todo el trabajo y con una sola peticion al servidor pasaras, pero internamente el stored tendrá forzosamente que hacer los insert en las dos tablas.
Tampoco trabajo con SqlServer por tanto no puedo validarte el codigo que pasas, pero yo diria que le faltan cosas

CREATE PROCEDURE dbo.spProcedure
@Dato1 varchar (300),
@Dato2 varchar (100),
@Dato3 varchar (20),
@Dato4 varchar (20),
@IDTabla2 int
AS
INSERT INTO Tabla1
(Dato1, Dato2, Dato3, Dato4)
VALUES (@Dato1, @Dato2, @Dato3, @Dato4)
//Obtener el id que ha generado el insert anterior IDTabla1
INSERT INTO Tabla1Tabla2 (IDTabla1,IDTabla2)
VALUES (IDTabla1,@IDTabla2)

no se si el stored te soportara una subconsulta asi

CREATE PROCEDURE dbo.spProcedure
@Dato1 varchar (300),
@Dato2 varchar (100),
@Dato3 varchar (20),
@Dato4 varchar (20),
@IDTabla2 int
AS
INSERT INTO Tabla1
(Dato1, Dato2, Dato3, Dato4)
VALUES (@Dato1, @Dato2, @Dato3, @Dato4)
INSERT INTO Tabla1Tabla2 (IDTabla1,IDTabla2)
VALUES ((Select max(idtabla1) from tabla1),@IDTabla2)

El idtabla2 deberia entrar como un parametro igual que el resto de datos, ya que habra mas de uno y el cliente puede elegir qualquiera... no.

Por otro lado si el idtabla1 siempre es nuevo luego la relación N a M nunca se dará!! y si es asi igual tienes un error de diseño. Si me cuentas que estamos haciendo igual te puedo orientar mejor....


Suerte y dime como ha ido.

Quim
  #7 (permalink)  
Antiguo 22/05/2008, 09:43
 
Fecha de Ingreso: mayo-2008
Ubicación: Medellin
Mensajes: 17
Antigüedad: 16 años
Puntos: 0
Respuesta: insertar datos en tablas con relacion muchos a muchos en sql server

Buen dia
acabo de solucionar el problema, el aporte de Quim me sirvio bastante para saber como hacerlo, por eso le doy las gracias. Para los que les interese esta es la forma como quedo el SP:
CREATE PROCEDURE dbo.spProcedure
@Dato1 varchar (300),
@Dato2 varchar (100),
@Dato3 varchar (20),
@Dato4 varchar (20),
@IDTabla2 int
AS
INSERT INTO Tabla1
(Dato1, Dato2, Dato3, Dato4)
VALUES (@Dato1, @Dato2, @Dato3, @Dato4)
DECLARE @IDTabla1 int
SET @IDTabla1 = (SELECT MAX(IDTabla1) FROM Tabla1)
INSERT INTO Tabla1Tabla2 (IDTabla1,IDTabla2)
VALUES (@IDTabla1,@IDTabla2)
Lo de las subconsultas (sugerencia de Quim) dentro del insert no se puede hacer en SQL Server 2005. La linea que resalte se puede cambiar por:
SET @IDTabla1 = SCOPE_IDENTITY()
Si quieren mas info sobre SCOPE_IDENTITY(), puede verla en: "http://technet.microsoft.com/es-es/library/ms190315.aspx"

Ahora resuelto este problema, me queda la duda con respecto al diseño de mi BD, Quim dijo "... si el idtabla1 siempre es nuevo luego la relación N a M nunca se dará!! y si es asi igual tienes un error de diseño". Pues precisamente, es asi, el IDTabla1 siempre es nuevo. Para contextualizar mas el problema dejo la info:
Las dos tablas principales son: Donantes (tabla1) y TiposMateriales (tabla2 que ya tiene los datos), donde un donante puede donar muchos tipos de materiales y un tipo de material puede tener asociados muchos donantes, la tabla "detalle" que en mi caso es la composicion de las otras dos (DonantesTiposMateriales, tabla1tabla2) simplemente contiene los ID's de la otras dos tablas, no contiene mas campos.
Se me ocurre que la PK de la tabla donantes no debe ser solo el ID, creo que deberia ser una PK compuesta ya sea ID mas el nombre, o borrar el campo ID (que se genera e incrementa automaticamente) y establecer como PK la cedula o el nombre del donante + el material donado, quedo atento a las sugerencias
Muchas gracias por la colaboracion y atencion, hasta pronto
  #8 (permalink)  
Antiguo 23/05/2008, 14:11
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: insertar datos en tablas con relacion muchos a muchos en sql server

Con la contextualización queda bastante claro, no puedes ligar el hecho de dar de alta un donante al hecho de establecer la relacion donante/material.

El SP que has puesto si te fijas bien solo te sirve para, dar de alta un nuevo donante y su relacion con un solo material. I siempre que lo uses vas a generar un nuevo donante (nuevo id_donante -> nuevo donante).

Haz te las siguientes preguntas:

Como dare de alta el segundo material de un donante?
Como introducire las donaciones repetitivas de distintos materiales de un mismo donante?

No es un problema de que tipo id elijas para los donantes, el problema es que quieres hacerlo todo a la vez y no se puede.

Primero debes elegir el donante de entre los que ya tengas (la tabla donantes ahora esta vacia pero supongo que esperas que esto cambie), si es nuevo dar lo de alta. Una vez tienes su id (nuevo o viejo), sea un incremental o un numero de documento, podras introducir tantas relaciones donante/material que quieras con simples INSERT INTO a la tabla1tabla2.

Otra opcion pero no se que potencia tiene el leguaje de los SP seria poder pasar al SP el id del donante si es viejo o un nulo si es nuevo, y un array de materiales asociados al donante. Si esto es posible el SP deberá contener un condicional que si recibe un id de donante (viejo) simplemente lea el array y haga los inserts pertinentes en la tabla DonantesTiposMateriales uno para cada elelmento del array. Y si ha recibido un nulo primero haga el insert en la tabla de Donantes obtenga el id del nuevo donante y con este y el array haga los insert a DonantesTiposMateriales.

Si el donante es viejo el SP tambien podria mirar si los datos1,2,3 y 4 han cambiado y hacer el update pertinente...

pero creo que estaras intentanto resolver demasiadas cosas a la vez. Recuerda el viejo principio, claramente aplicable a la programación "divide y venceras".

Quim
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:48.