cargar registros relacionados en varias tablas

21/06/2004 - 11:53 por MPOLO S.L. - Departamento Calidad | Informe spam
Estimado grupo:

Tengo un problema que no se como solucionar:
supongamos que tengo una tabla de "personas" y, relacionada a esta una de
"contactos". Se entiende que una persona puede tener n contactos.
En un ejemplo: Al momento de dar de alta 3 personas, agrego 5 contactos 3
para la persona 1, y 1 para cada una de las restantes; así:
Persona Contacto
1 1
1 2
1 3
2 4
3 5

lo que hago es mandar un XML con una "relacion temporal", y debo darla de
alta en forma definitiva en la base de datos. Se me ha ocurrido crear una
tabla temporal con las relaciones entre los IDs temporales y los
definitivos, pero no logro darme cuenta de como desarrollarlo. En el
ejemplo:

insert into personas (nombre, apellido) select ... from OPENXML (@hDoc,
'/VFPData/personas',2)

aqui, el problema es que recupero solo el último ID de @@identity, por lo
que no puedo cargar la tabla temporal donde tendre referencia para luego
cargar los contactos.

Bueno espero haber sido claro con mi exposicion.

Desde ya gracias por su ayuda

Saludos desde Menorca

Ing. MArtin R Sanchez Arnoletto

Preguntas similare

Leer las respuestas

#1 Carlos Sacristan
21/06/2004 - 12:26 | Informe spam
Lo siento pero no lo entiendo. ¿Por qué necesitas cargar esa relación en
una tabla temporal previamente? ¿Para qué necesitas recoger el valor del
último valor de identidad insertado?


Un saludo

-
"Sólo sé que no sé nada. " (Sócrates)

Por favor, responder únicamente al foro
Se agradece la inclusión de sentencias DDL


"MPOLO S.L. - Departamento Calidad" escribió en el mensaje
news:#
Estimado grupo:

Tengo un problema que no se como solucionar:
supongamos que tengo una tabla de "personas" y, relacionada a esta una de
"contactos". Se entiende que una persona puede tener n contactos.
En un ejemplo: Al momento de dar de alta 3 personas, agrego 5 contactos 3
para la persona 1, y 1 para cada una de las restantes; así:
Persona Contacto
1 1
1 2
1 3
2 4
3 5

lo que hago es mandar un XML con una "relacion temporal", y debo darla de
alta en forma definitiva en la base de datos. Se me ha ocurrido crear una
tabla temporal con las relaciones entre los IDs temporales y los
definitivos, pero no logro darme cuenta de como desarrollarlo. En el
ejemplo:

insert into personas (nombre, apellido) select ... from OPENXML (@hDoc,
'/VFPData/personas',2)

aqui, el problema es que recupero solo el último ID de @@identity, por lo
que no puedo cargar la tabla temporal donde tendre referencia para luego
cargar los contactos.

Bueno espero haber sido claro con mi exposicion.

Desde ya gracias por su ayuda

Saludos desde Menorca

Ing. MArtin R Sanchez Arnoletto



Respuesta Responder a este mensaje
#2 MPOLO S.L. - Departamento Calidad
21/06/2004 - 12:44 | Informe spam
Hola Carlos Gracias desde ya por tu respuesta

Lo que ocurre es que en mi aplicacion cliente ( en Visualfoxpro) tengo
definidos cursores con todas las modificaciones que necesito hacer en la
base de datos en SQL y estos cursores ( ojo de VFPro, no confundir con
cursores de SQL) son enviados mediante XML a un Store procedure, entonces al
momento de recibir el XML llega informacion de varias tablas ( o cursores de
VFP, es lo mismo), que debo ir introduciendo en las tablas de SQL, y
recuperando las identidades correspondientes. En el ejemplo, tengo que
recuperar la ID (que me genero el server) de la persona 1 para insertar con
este 1 las filas correspondientes a la tabla de contactos. El problema es
que si hago una instruccion
Insert into personas select ...openxml...,
no tengo forma de recuperar los IDs ( o no se la forma jeje) de cada una de
las personas para insertarlas en cada uno de los contactos correspondientes.

Bueno espero haber aclarado un poco la idea

Gracias desde ya

Saludos desde MEnorca

MArtin R Sanchez
Respuesta Responder a este mensaje
#3 Carlos Sacristan
21/06/2004 - 14:51 | Informe spam
Ya te comprendo...

Pues mira, esta es una de las razones por las cuales Javier Loria
defiende las claves naturales ;-) Si no tienes forma de asignarle un
código único a las personas y tienes que hacerlo a partir de identificadores
generados por el gestor, tal y como lo estás haciendo (más de una inserción,
con @@IDENTITY ya no te vale) la forma de recoger esos identificadores es...
buscándolos. Es decir: tienes los datos de las personas que acabas de
insertar, así que lo que tienes que hacer es buscarlos en esa tabla para
recoger los identificadores.

Es un poco feo, pero tal y como tienes implementada la aplicación no
tienes otras muchas formas... :(


Un saludo

-
"Sólo sé que no sé nada. " (Sócrates)

Por favor, responder únicamente al foro
Se agradece la inclusión de sentencias DDL


"MPOLO S.L. - Departamento Calidad" escribió en el mensaje
news:
Hola Carlos Gracias desde ya por tu respuesta

Lo que ocurre es que en mi aplicacion cliente ( en Visualfoxpro) tengo
definidos cursores con todas las modificaciones que necesito hacer en la
base de datos en SQL y estos cursores ( ojo de VFPro, no confundir con
cursores de SQL) son enviados mediante XML a un Store procedure, entonces


al
momento de recibir el XML llega informacion de varias tablas ( o cursores


de
VFP, es lo mismo), que debo ir introduciendo en las tablas de SQL, y
recuperando las identidades correspondientes. En el ejemplo, tengo que
recuperar la ID (que me genero el server) de la persona 1 para insertar


con
este 1 las filas correspondientes a la tabla de contactos. El problema es
que si hago una instruccion
Insert into personas select ...openxml...,
no tengo forma de recuperar los IDs ( o no se la forma jeje) de cada una


de
las personas para insertarlas en cada uno de los contactos


correspondientes.

Bueno espero haber aclarado un poco la idea

Gracias desde ya

Saludos desde MEnorca

MArtin R Sanchez



Respuesta Responder a este mensaje
#4 MPOLO S.L. - Departamento Calidad
21/06/2004 - 17:05 | Informe spam
Pues ahora mi idea es ir guardando los IDs en una tabla temporal llamada
#padres. Funciona perfecto excepto que por mas que le digo que me destruya
la tabla temporal, no lo hace hasta que no salgo del formulario de VFP q lo
he llamado
es decir, no se porque lo hace porque la tabla debería si se quiere
"destriurse " al finalizar el proceso almacenado, pero no lo hace. Cuando
entro al form de FOX, presiono el boton hago que me devuelva un select de
#padres para ver que cargó, y esta perfecto. Ahora si lo presiono por
segunda vez ( como intentando cargar otro conjunto de registros) , me
duplica las filas de esta y si lo presiono de nuevo lo triplica ( es decir
es como que nunca se borra la vista permanente).
Envio el código para que puedas revisarlo. Desde ya muchísimas gracias.


Martin R Sanchez


ALTER proc usp_prueba
@xml varchar(8000)
as
DECLARE @hDoc int,
@error int,
@id integer,
@idpersona int,
@formajuridica varchar(2),
@razonsoc varchar(50),
@tipoidfiscal varchar(3),
@idfiscal varchar(9),
@idcontacto integer,
@tipocontacto varchar(2),
@dato varchar(200),
@notas varchar(8000)

EXEC sp_xml_preparedocument @hDoc OUTPUT, @xml
create table #padres (pxtabla varchar(30),pxcodecli integer,pxcodesvr
integer)

declare crs_personas cursor for SELECT *
FROM OPENXML (@hDoc, '/VFPData/personas',2)
WITH (idpersona integer,
formajuridica varchar(2),
razonsoc varchar(50),
tipoidfiscal varchar(3),
idfiscal varchar(9)
) as miXML

OPEN crs_personas
FETCH NEXT FROM crs_personas into
@idpersona,@formajuridica,@razonsoc,@tipoidfiscal,@idfiscal


WHILE @@FETCH_STATUS = 0
BEGIN
insert into personas (formajuridica,razonsoc,tipoidfiscal,idfiscal) values
(@formajuridica,@razonsoc,@tipoidfiscal,@idfiscal)
set @id=(select @@identity)
if @id<>0 insert into #padres (pxtabla,pxcodecli,pxcodesvr) values
('personas',@idpersona,@id)
FETCH NEXT FROM crs_personas into
@idpersona,@formajuridica,@razonsoc,@tipoidfiscal,@idfiscal
END

CLOSE crs_personas
DEALLOCATE crs_personas


declare crs_contactos cursor for SELECT *
FROM OPENXML (@hDoc, '/VFPData/contactos',2)
WITH (idcontacto integer,
idpersona integer,
tipocontacto varchar(2),
dato varchar(200),
notas varchar(8000)
) as miXML

OPEN crs_contactos
FETCH NEXT FROM crs_contactos into
@idcontacto,@idpersona,@tipocontacto,@dato,@notas

WHILE @@FETCH_STATUS = 0
BEGIN
set @id=(select pxcodesvr from #padres where pxtabla='personas' and
pxcodecli=@idpersona)
insert into contactos (idpersona,tipocontacto,dato,notas) values
(@id,@tipocontacto,@dato,@notas)
set @id=(select @@identity)
if @id<>0 insert into #padres (pxtabla,pxcodecli,pxcodesvr) values
('contactos',@idpersona,@id)
FETCH NEXT FROM crs_contactos into
@idcontacto,@idpersona,@tipocontacto,@dato,@notas
END

CLOSE crs_contactos
DEALLOCATE crs_contactos



EXEC sp_xml_removedocument @hDoc
select * from #padres
drop table #padres
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida