(Simulación)
Hora inicio: 7:00 a.m Hora Fin: 10:45 a.m
Se declaran las tablas auxiliares a utilizar y se crea la tabla InstanciasPorIterar, la cuales la encargada de ir iterando por instancias y años respectivamente.
También se parsea el XML DatosFinales, el cual contiene los archivos necesarios para la simulación.
Se crea un While que va recorriendo la tabla instanciasPorIterar para ir insertando a la tabla Instancia Giro Según e año en el que se esté.
Se insertan las instancias en una tabla auxiliar para después recorrerlas con otro while, ya que no lograba hacer que se agregaran los datos de manera que cumpliera con el orden respectivo, entonces por eso se creó el while anidado.
Al inicio no me cargaba los datos porque no encontraba el nodo dentro de la instancia en el XML, ya que lo tenía implementado de esta manera, pero despues busqué en internet y vi una solución para esta y las demás tablas.
Donde dice que hay que darle una variable dentro del path, muy similar al del año.
Se insertan los valores a la tabla InstanciaGiroXEquipoCorredor con sus respectivos INNER JOIN para realizar y asegurar su correcta inserción y en su respectiva instancia.
Para las llegadas se implemento insertandolas en una tabla Type para después enviar todas las llegadas de esa instancia a un SP y poder procesarlas una a una.
SP LlegadasSimulación:
Se crea una tabla @tblaOrdenada para insertar los valores que vienen en la tabla enviada desde la simulación y ordenaros para después utilizarlos de manera más sencilla y ordenada.
Seguidamente se insertan esos datos en la tabla Llegadas.
Se recorre la tabla ordenada con un While para ir uno a uno, después se obtiene el idEtapa y la cantidad de puntos por etapa para los ganadores o primeros en llegar.
Seguidamente se calcula el tiempo que duró cada corredor en segundos:
SELECT @tiempoSumar = DATEDIFF(ss,CA.HoraIncio,@horaFin) FROM Carrera CA WHERE CA.Id = @idCarrera,
para después a las variables TIME(0) de cada tabla con timepo, sumarle los segundos y obtener el nuevo tiempo acumulado:
SumaTiempo = DATEADD(ss,@tiempoSumar,SumaTiempo)
Después para saber cuantos puntos hay que sumarle a cada corredor en caso de merecerlo, realicé un IF donde si @idMenor(variable que recorre la tabla del while) es mayor a la cantidad de puntos que otorga la etapa, entonces significa que a ese corredor ya no se le da premiación, ahora de lo contrario se hace un pequeño calculo para averiguar cuanto puntaje se le otorga, y como es decreciente segun vayan llegando, entonces la variable @puntosGanados será igual a la cantidad de puntos de la etapa menos el id en el momento del While + 1.
Una vez ya calculado el puntaje y el tiempo, se procede a actualizar las tablas de las instancias por corredor y las instancias por equipo, ya que si aumenta o disminuye en corredor, también lo hace en la de equipo.
Por último se procede a insertar en las tablas movimientoRegular y movimientoTiempo en base a sus nuevos datos.
Se tardó aproximadamente 3 horas y 40 minutos, ya que son procedimientos muy lentos y rediosos, no tuve inconvenientes que pueda documentar, pero si me quedaba pegado por ratos pensado en la idea de como lo haría.















Comentarios
Publicar un comentario