Lectura de XML para Operaciones

     Natalia Vargas Reyes (de 10 am a 12:00 pm) 2:00 horas


Problemas con FK's que creimos haber solucionado pero en realidad estaban al reves, como que llegada tuviese el id del movimiento pero el movimiento en realidad debía tener el Id de la llegada.

Lo mismo pasó con Sanción y movimiento de tiempo, pues las FK's estaban al revés.

También sucedió que habían problemas al insertar en las tablas por los siguientes problemas:


Eso se solucionó ya que como se usaba la tabla de Corredor en equipo en Instancia de giro, al mapearse se necesitaba el Id de la carrera y no de esta instancia de la tabla.


EL SP ccmpleto quedó así.



SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO


ALTER PROCEDURE [dbo].[SPCargarOperacionesCiclistas]

AS

BEGIN

SET NOCOUNT ON


--BEGIN TRY

DECLARE @DocumentoXML XML,

@LenNodos INT, --cantidad de nodos año

@LenInstancias INT,

@Iterador INT, --iterador de años

@AnnioOperacion INT,

@IteradorInstancias INT


SET @DocumentoXML = (SELECT [XML] 

FROM DatosXml 

WHERE Nombre= 'Operaciones')


    --Contar los nodos de años

SELECT @LenNodos = COUNT(O.f.value('@Id','INT'))

FROM @DocumentoXML.nodes('Root/Year') AS O(f)

SET @Iterador = 1


WHILE @Iterador<=@LenNodos--recorre todos los años

BEGIN 

SELECT @AnnioOperacion = O.f.value('@Id','INT')

FROM @DocumentoXML.nodes('Root/Year[sql:variable("@Iterador")]') AS O(f)

PRINT @AnnioOperacion


--Cantidad de instancias para un año

SELECT @LenInstancias = COUNT(O.f.value('@IdGiro','INT'))

FROM @DocumentoXML.nodes('Root/Year[sql:variable("@Iterador")]/InstanciaGiro') AS O(f)

PRINT @LenInstancias

PRINT 'INSTANCIAS EN ANNIO'


SET @IteradorInstancias = 1


WHILE @IteradorInstancias<=@LenInstancias --recorre todas instancias de giro por año

BEGIN

PRINT 'Iterador instancia por annio'

PRINT @IteradorInstancias


----------------------------------Instancia de giro-----------------------------------------

PRINT 'InstanciaGiro'

INSERT INTO [dbo].[InstanciaGiro]

(

[Codigo]

,[FechaInicio]

,[FechaFin]

,[GiroId]

,[Anno]

)

SELECT

  d.value('@CodigoInstancia', 'VARCHAR(128)')

, d.value('@FechaInicio', 'DATETIME')

, d.value('@FechaFin', 'DATETIME')

, d.value('@IdGiro', 'INT')

, @AnnioOperacion

FROM 

@DocumentoXML.nodes('Root/Year[sql:variable("@Iterador")]/InstanciaGiro[sql:variable("@IteradorInstancias")]') AS t(d);

----------------------------------Equipo en Instancia de giro-----------------------------------------

PRINT 'InstanciaGiro_Equipo'

INSERT INTO [dbo].[InstanciaGiro_Equipo]

(

[InstanciaGiroId]

,[EquipoId]

,[TotalTiempo]

,[TotalPuntos]

)

SELECT

  IG.Id

, E.value('@Equipo', 'INT')

, 0

, 0


FROM 

@DocumentoXML.nodes('Root/Year[sql:variable("@Iterador")]/InstanciaGiro[sql:variable("@IteradorInstancias")]/GiroXEquipo') AS G(E)

INNER JOIN 

[dbo].[InstanciaGiro] AS IG 

ON 

E.value('@CodigoInstanciaGiro', 'VARCHAR(128)') = IG.Codigo;

----------------------------------Corredor en Equipo en Instancia de giro-----------------------------------------

PRINT 'InstanciaGiro_Equipo_Corredor'

INSERT INTO [dbo].[InstanciaGiro_Equipo_Corredor]

(

[InstanciaGiro_EquipoId]

,[CorredorId]

,[NumeroCamisa]

,[SumaTiempos]

,[SumaPuntosRegularidad]

,[SumaPuntosMontanna]

)

SELECT

  IE.Id

, E.value('@Corredor', 'INT')

, E.value('@NumeroCamisa', 'INT')

, 0

, 0

, 0

FROM 

@DocumentoXML.nodes('Root/Year[sql:variable("@Iterador")]/InstanciaGiro[sql:variable("@IteradorInstancias")]/CorredoresEnEquipoEnGiro') AS G(E)

INNER JOIN [dbo].[InstanciaGiro] AS IG ON E.value('@CodigoInstanciaGiro', 'VARCHAR(128)') = IG.Codigo

INNER JOIN [dbo].[InstanciaGiro_Equipo] AS IE ON IG.Id=IE.InstanciaGiroId;


--------------------------------Carreras-----------------------------------------

PRINT 'Carrera'

INSERT INTO [dbo].[Carrera]

(

[CodigoCarrera]

,[Fecha]

,[HoraInicio]

,[EtapaId]

,[InstanciaGiroId]

)

SELECT

  E.value('@CodigoCarrera', 'VARCHAR(128)')

, E.value('@FechaCarrera', 'DATETIME')

, E.value('@HoraInicio', 'TIME(7)')

, E.value('@IdEtapa', 'INT')

, IG.Id

FROM 

@DocumentoXML.nodes('Root/Year[sql:variable("@Iterador")]/InstanciaGiro[sql:variable("@IteradorInstancias")]/Carrera') AS G(E)

INNER JOIN [dbo].[InstanciaGiro] AS IG ON E.value('@CodigoInstanciaGiro', 'VARCHAR(128)') = IG.Codigo;

--------------------------------Final corredores en Carreras-----------------------------------------

PRINT 'Llegada'

INSERT INTO [dbo].[Llegada]

(

[HoraFin]

,[CarreraId]

,[CorredorId]

)

SELECT

  E.value('@HoraLlegada', 'TIME(7)')

, CA.Id

, CO.CorredorId  -- el id del corredor en en el equipo en la instancia de giro

--, CA.CodigoCarrera

FROM 

@DocumentoXML.nodes('Root/Year[sql:variable("@Iterador")]/InstanciaGiro[sql:variable("@IteradorInstancias")]/FinalCorredoresEnCarrera') AS G(E)

INNER JOIN 

[dbo].[Carrera] AS CA 

ON 

E.value('@CodigoCarrera', 'VARCHAR(128)') = CA.CodigoCarrera

INNER JOIN 

[dbo].[InstanciaGiro_Equipo_Corredor] AS CO 

ON 

E.value('@NumeroCamisa', 'INT') = CO.NumeroCamisa;


--------------------------------Ganador de premio de montaña en Carreras-----------------------------------------

PRINT 'Ganadores_PremioMontanna'

INSERT INTO [dbo].[Ganadores_PremioMontanna]

(

[CarreraId]

,[CorredorId]

,[PremioMontannaId]

)

SELECT

  CA.Id

, CO.CorredorId  -- Id del corredor en en el equipo en la instancia de giro

, PM.Id  -- Id del premio de montaña

FROM 

@DocumentoXML.nodes('Root/Year[sql:variable("@Iterador")]/InstanciaGiro[sql:variable("@IteradorInstancias")]/GanadorPremioMontanaEnCarrera') AS G(E)

INNER JOIN [dbo].[Carrera] AS CA ON E.value('@CodigoCarrera', 'VARCHAR(128)') = CA.CodigoCarrera

INNER JOIN [dbo].[InstanciaGiro_Equipo_Corredor] AS CO ON E.value('@NumeroCamisa', 'INT') = CO.NumeroCamisa

INNER JOIN [dbo].[PremioMontanna] AS PM ON E.value('@NombrePremio', 'VARCHAR(128)') = PM.Nombre;

------------------------------Sanciones-----------------------------------------

PRINT 'Sanciones_Carrera'

INSERT INTO [dbo].[Sanciones_Carrera]

(

[JuezId]

,[CorredorId]

,[CarreraId]

,[MinutosCastigo]

,[Descripcion]

)

SELECT

C.value('@IdJuez', 'INT')

, CO.CorredorId  -- el id del corredor en en el equipo en la instancia de giro

, CA.Id

, C.value('@MinutosCastigo', 'INT')

, C.value('@Descripcion', 'VARCHAR(128)')

FROM 

@DocumentoXML.nodes('Root/Year[sql:variable("@Iterador")]/InstanciaGiro[sql:variable("@IteradorInstancias")]/SancionCarrera ') AS S(C)

INNER JOIN [dbo].[Carrera] AS CA ON C.value('@CodigoCarrera', 'VARCHAR(128)') = CA.CodigoCarrera

INNER JOIN [dbo].[InstanciaGiro_Equipo_Corredor] AS CO ON C.value('@NumeroCamisa', 'INT') = CO.NumeroCamisa;




SET @IteradorInstancias = @IteradorInstancias + 1 --Incrementa instancias en un año

END --WHILE 2

SET @Iterador = @Iterador+1--incrementa los días

END --END DEL BEGIN DEL WHILE 1

--END TRY


--BEGIN CATCH

-- PRINT 'Error al cargar datos';

-- INSERT INTO dbo.BE_DBErrors  VALUES (

-- SUSER_SNAME(),

-- ERROR_NUMBER(),

-- ERROR_STATE(),

-- ERROR_LINE(),

-- ERROR_PROCEDURE(),

-- ERROR_MESSAGE(),

-- GETDATE()

-- ); 



--END CATCH


END


--EXEC SPCargarOperacionesCiclistas

Comentarios