martes, 5 de noviembre de 2019

Análisis de resultados

Horas de trabajo:
Anthony: 16 horas
Carlos : 4 horas
Total: 20 horas

Resultados:

-Bitacora:

  •  Los eventos se manejan a través de triggers lo cuales fueron probados y no arrojaron ningún problema. Con respecto a UPDATE y DELETE trabajan validando el campo activo, esto se explica más detalladamente en el post de triggers.


-Consultas del administrador:

  • Consulta 1: Esta consulta no se logró desarrollar por falta de tiempo además de varias dudas sobre lo que se pedía en esta
  • Consulta 2: Funciona correctamente sin tomar en cuenta el numero de días, si no se toma en cuenta este parámetro la consulta sí funciona.
  • Consulta 3: Provee todos los datos solicitados menos la cuenta que le aporta mayor beneficio a la persona, esta funcionalidad no se logró implementar debido a que no se encontró cómo llevarla a cabo. 
-Simulación:

  • Los cambios al script de simulación y las nuevas tablas para el procesamiento de COs fueron implementados con éxito, ya que era crear dos tablas nuevas y añadir un de código poco al script de simulación para leer los datos de las CO del xml de simulación, y procesar cada día los depósitos y redenciones de las CO, era adaptar el código de la etapa pasada para las CO.


Segunda consulta del administrador

Tiempo: 3:00 pm a 7:00 pm

Creación de la vista para la consulta, las tablas utilizadas para crear la cita fueron: CuentsDeAhorro, TiposDeCuenta y EstadosDeCuenta. El nombre de la vista es "Consulta2".

A diferencia de a vista de la tercera consulta, el diseño de esta me costó un poco más pensarlo ya que tenía planeado usar la tabla movimientos para revisar si una cuenta había recibido una multa o no pero estaba generando problemas al unirla con la tabla de estados de cuenta así que opté por utilizar las tablas descritas al inicio.
Con respecto al SP de la consulta no fue muy complicado pero me tomó un buen rata haciendo pruebas de concepto para asegurarme que funcionaban bien como por ejemplo la condición del if, también tuve que investigar algunas funcione sencillas como AVG para obtener el promedio o MONTH y YEAR para obtener únicamente el mes y el año de una fecha.
Gracias a las pruebas de concepto me percaté que no habían multas por exceso de retiros en CH en los datos de prueba lo que me ahorró un posible bloqueo. El nombre del SP es "ConsultaAdmin2".
Adjunto una imagen del SP para mostrar su método de funcionamiento.

Como se puede observar en la imagen el SP procesa la vista de una manera parecida a la que se usa en la simulación y se insertan los datos solicitados en una nueva tabla.

Fuentes: 
https://docs.microsoft.com/es-es/sql/t-sql/functions/month-transact-sql?view=sql-server-ver15
http://www.forosdelweb.com/f21/comando-sql-para-sacar-promedio-751088/
http://www.sqlservertutorial.net/sql-server-stored-procedures/sql-server-if-else/

lunes, 4 de noviembre de 2019

Tercera consulta de administrador

Tiempo: 1:00 pm a 10:00 pm

-Empecé por investigar el funcionamiento de las vistas, lo cual no me tomó mucho tiempo entender.
-Cree la vista con los datos que creí necesarios para realizar la consulta.El nombre de la vista es MatarAhorrantes.
-Para realizar la consulta cree un SP llamado consulta 3. Aquí tuve varios problemas.

Cantidad de cuenta de las que recibe dinero el beneficiario: Esta parte me tomó alrededor de una hora tuve que investigar como contar elementos repetidos y luego investigar como agrupar los campos que deseaba buscar, en este caso quería buscar cuantas cuentas de ahorro estaban asociadas a un mismo beneficiario para esto utilicé la clausula GROUP BY que agrupa campos en base a otro por ejemplo la cantidad de cuentas que poseen una misma persona. Para contar los campos repetidos utilicé la instrucción COUNT dado como resultado lo siguiente: SELECT count(M.idCuenta) AS CantCuentas from MatarAhorrantes M group by idPersona

Obtener la cuenta de la cual recibe mayor beneficio: Esta parte no la he podido completar ya que estoy bloqueado sobre como obtener el número de cuenta de la cuenta de ahorro que tiene el mayor saldo de entre las cuentas de las cuales es beneficiario una persona, he intentado utilizando la instrucción HAVING, utilizando subquerys, entre otras cosas. Adjunto parte de los códigos que he utilizado.



Fuentes consultadas:
http://www.forosdelweb.com/f21/urgente-seleccionar-maximo-valor-grupo-registros-291169/
https://social.msdn.microsoft.com/Forums/es-ES/6aa42b11-5446-4aeb-ae11-aee6d654604b/contar-las-veces-que-se-repite-un-campo-en-una-tabla?forum=sqlserveres
https://es.stackoverflow.com/questions/56151/top-1-por-cada-grupo-de-un-group-by-sql-server
https://geeks.ms/lmblanco/2015/07/06/tratamiento-de-datos-duplicados-en-sql-server-1/
https://www.tutorialesprogramacionya.com/sqlserverya/temarios/descripcion.php?cod=43&punto=37&inicio=

domingo, 3 de noviembre de 2019

Cambios al script de simulación y tablas nuevas

Tiempo: 19:20 - 21:45 y 22:20 - 00:01 (3 noviembre)

Cree las tablas de MovimientosCO y TipoMovimientosCO necesarias para la implementación de los depósitos y redenciones de las cuentas objetivo, además de crear los scripts de llenado para TipoMovimientosCO, y la tabla creada por Anthony: TipoEvento.

Después modifiqué el script de simulación de la etapa pasada para que creara las cuentas objetivo que vienen en el nuevo xml de simulación. Tuve algunos problemas con esto porque cambiaron el formato en el que vienen los datos en el xml, entoces el formato enviado por el profesor que utilizaba antes ya no me servía, y tuve que adaptarlo. Lo logré adaptar gracias a los siguintes foros: https://stackoverflow.com/questions/769980/how-do-i-select-a-top-level-attribute-of-an-xml-column-in-sql-server-2005 , https://dba.stackexchange.com/questions/143861/get-attribute-value-of-xml

Me tomé un descanso para comer y seguí trabajando en el script de simulación, ahora con los depósitos y redenciones de las cuentas objetivo. Cree un trigger para que al añadir un MovimientoCO, se sumara el saldo a la cuenta objetivo, igual que hice en la etapa pasada con los movimientos normales. Para las redenciones hice lo mismo pero por algún motivo que desconozco, algunas cuentas no quedaban con saldo cero al cerrarse, entonces borré el trigger y puse el código del trigger en el script. Perdí bastante tiempo porque para probar el código tenía que correr la simulación, y esto duraba varios minutos.

miércoles, 30 de octubre de 2019

Triggers

Tiempo: 6:00 pm a 9:00 pm

-Creación de los triggers para las tablas de beneficiarios y CO.

Empecé por investigar sobre qué eran los triggers y vi algunos ejemplos de estos en algunas páginas y videos. Luego analicé qué era lo que tenían que hacer exactamente mis triggers, por ejemplo el trigger para eliminar, no usa un DELETE ya que en esta tarea los borrados se implementan desactivando un campo, eso fue algo que me tuvo pensando hasta darme cuenta que ocupaba un UPDATE para el trigger de eliminar.
Establecido lo que tenía que hacer cree los triggers para la tabla beneficiarios y realicé algunas pruebas en las cuales tuve errores como que un UPDATE creaba 2 filas en la tabla de eventos, esto se solucionó agregando un if al trigger para actualizar que validara que el campo activo fuera igual a 1 de lo contrario no sería un trigger para actualizar si no para borrar.

Habiendo probado los triggers de beneficiarios cree los triggers de CO y empecé a experimentar con los XML lo cual no fue muy complicado ya que había evacuado las dudas con el profesor sobre este tema sin embargo, me topé con un problema que mantuvo bloqueado un rato: como creaba un XML con la información antes de actualizar y otro después de actualizar ya que yo solo conocía la instrucción "inserted", este bloqueo lo solucioné con la instrucción "deleted" que encontré en esta página: https://aprendiendosqlserver.blogspot.com/2013/09/programar-triggers-correctamente-que.html .
Al actulizar un beneficiario en la página web, efectivamente se creó el evento con los XML correspondientes. Luego agregue el código de los XML a los triggers de CO.

Fuentes:
https://aprendiendosqlserver.blogspot.com/2013/09/programar-triggers-correctamente-que.html
http://www.sqlservertutorial.net/sql-server-stored-procedures/sql-server-if-else/
https://www.manualsqlserver.com/?p=385
https://www.youtube.com/watch?v=FZLmXocmCLU