martes, 23 de junio de 2015

Martes 23/06/2015 (Análisis de Resultados)

Información general, análisis de resultados del desarrollo del proyecto:
Con un total de 25 horas laboradas, aproximadamente, se logró resolver cada problema encontrado durante la abstracción de todos los puntos sobresalientes de la tarea programada. Se consiguió elaborar la estructura, procedimientos y funciones necesarias.


+ Reporte de productividad por actividad, o total : Completo.
 
     -Entradas: Un ciclo a) Total (totas la actividades), b) Tipo de actividad c) Por clase solicitud

    -Salidas Se muestra el id del lote y su índice de productividad, el id de la solicitud con índice de productividad más caro y el encargado que la solicitó.



+Reporte de productividad por maquinaria: Completo.
 
  -Entradas: Un ciclo, o un lote, o un cultivo
     
  -Salidas: Id de la máquina y su índice de productividad, Las maquinas ordenadas de Mayor a menor según su índice productividad por Lote o por ciclo o cultivo, la cantidad de solicitudes para la maquina en el ciclo o el lote o cultivo, el monto máximo del costo de cualquier solicitud y el monto promedio de costos.


+Reporte de ociosidad por máquina: Completo.
 
  -Entradas: Un ciclo, un lote o un cultivo

 -Salidas: Para cada máquina, suponiendo que está disponible 24 horas diarias, se pido el id de la    máquina, y la cantidad de horas ociosa, y el lote donde realizo la mayor cantidad de horas y la cantidad de horas.


+Reporte comparativo por tipo de actividad, de los 3 ciclos previos más próximos

  -Entradas: un tipo de actividad
   
  -Salidas: Para cada tipo de actividad muestra un encabezado con el nombre, monto total de costos e índice de productividad, de los 3 ciclos previos más próximos.


+ Migración: Completado (Faltó optimizar).

lunes, 22 de junio de 2015

Lunes 22/06/2015 (NULOS)

Tiempo invertido: 4 horas y 30 minutos, aproximadamente

15:00-19:30

Uno de los mayores causantes de inconsistencias o errores en una base de datos son los mencionados Nulos, ya que si no se saben tratar o manejar de la mejor forma, causan muchos estragos a la hora de querer realizar alguna consulta o ejecutar algún procedimiento o función, en los proyectos programados anteriores pudimos resolver de una forma rápida y eficiente los Nulos, y pensamos que en este proyecto seria de igual manera.

En este proyecto programado el tratamiento de nulos fue un poco mas complicado de lo que esperábamos, pensamos que con la forma que los estábamos manejando iba a ser suficiente para que no mostrar ningún error o inconsistencia en la base de datos, pero no resulto así, ya que empezamos a tener una serie de problemas y errores a la hora de realizar la migracion de datos desde el archivo que fue creado por un grupo de compañeros para realizar la migracion a nuestra base de datos, y de los mayores errores que nos dio la migracion fue que no podíamos insertar datos que fueran NULOS, lo cual a primera vista nos pareció muy extraño, ya que antes de insertar todos los datos a las variables tablas creadas, la información parseada se revisa por medio de la función ISNULL para comprobar que no se inserte un campo NULO. 

Como tuvimos este error de NULOS empezamos a organizar y revisar nuestro código de migracion para ver si encontrábamos alguna falla o error que fuera el culpa de que no se pudiera realizar de una forma correcta la migracion de datos, pero no pudimos encontrar ninguna inconsistencia en el código, lo cual nos resulto aun mas extraño, ya que después de revisar minuciosa mente el código lo ejecutamos nuevamente y nos aparecía el mismo error. 

Como no encontrábamos una respuesta lógica para este error decidimos empezar a correr pequeñas fracciones del código de migracion por aparte para ver en cual de todos las tablas se insertaba un nulo o nos devolvía el error que nos daba antes, y así de esta manera luego de largos tiempos de espera pudimos encontrar que serie de errores que no provenian de nuestra código de migracion, sino que se encontraban en el archivo XML que nuestros compañeros habían creado, los cuales eran los principales sospechosos de que causaran los errores en nuestra base de datos.

Como pudimos encontrar esas inconsistencias en el archivo XML empezamos a ver de que manera podíamos encontrar estos errores, ya que al ser un archivo tan extenso pensamos que este estaría bien revisado por nuestros compañeros y no traería fallas o errores, pero nos dimos cuenta que no fue así.

Luego de un largo tiempo de estar lidiando con este error de NULOS pudimos dar con el paradero del origen del error, el cual era que en el archivo XML habían nombres de variables incompletos y mal escritos, o tenían un nombre que no era el de ese atributo, estos pequeños errores de nuestros compañeros nos causo gran desesperacion y estres ya que pasamos mucho tiempo resolviendo algo que no era falla de nosotros y de nuestro código.

Después de resolver este problema de NULOS que nos llevo demasiado tiempo en encontrarlo, procedimos a realizar nuevamente la migracion de datos, la cual se realiza de una forma perfecta y se ingresaron todos los datos a la base de datos sin ningún inconveniente o inconsistencia.


domingo, 21 de junio de 2015

Domingo 21/06/2015 (Nuevos Filtros)

Tiempo invertido: 6 horas y 30 minutos, aproximadamente.

13:00-19:30

Para este nuevo proyecto se ve a necesitar crear nuevos filtros, con los cuales podremos acceder a los diferentes datos que son necesarios para poder realizar de una forma efectiva y exitosa las nuevas consultas.

Para poder realizar estos nuevos filtros es necesario crear varias funciones nuevas, las cuales seran las encargadas de realizar todas las acciones necesarias para poder tener el resultado que se requiere. 
Estas funciones son las encargadas de realizar las acciones para tener los datos como: los indices de productividad de un lote, o por un tipo de actividad especifica o por una tipo de solicitud.
 Acontinuacion se explicara brevemente como se implementaran las funciones en la base de datos, y asi obtener el resultado necesario.

Primero se debe crear un procedimiento en la cual se actualiza el indice de productividad, en el cual lo que se realiza es un Update del indice de productividad de un lote por ciclo, esto se hace de la siguiente manera: se suman los tres balances que se encuentran en el lote por ciclo que son los balances de suministros, maquinaria y servicios, luego esto se divide entre los metros cuadrados del lote para asi obtener el indice de productividad del ciclo y poder actualizarlo en la tabla.

CREATE PROCEDURE APSP_UpdateProductivityIndex
AS
BEGIN
    UPDATE AP_LotXCycle SET ProductivityIndex = (LC.SuppliesBalance + LC.ServicesBalance + LC.MachineryBalance) / L.SquareMeters
        FROM dbo.AP_LotXCycle LC
        inner join dbo.AP_Lot L ON L.ID = LC.FK_Lot
END

Tambien se debe crear una funcion por medio de la cual se obtenga los indices de productividad de los lotes en un cierto rango de fechas, para poder realizar esta funcion de deben tener varios datos como parametros que son los siguientes: el FK del lote, fecha inicio, fecha fin (Rango de fechas), la actividad y el tipo de solicitud.
Luego de obtener estos datos como parametros se declaran dos variables en la funcion, una de esta variables es una tabla donde se guardan los ID, la otra variables es el indice de productividad.
Luego de declarar las variables de la funcion se procede a verificar todos los datos para poder obtener el indice de productividad de un ciclo en un rango especifico, para poder lograr esto se debe hacer uso de la funcion de SQL ISNULL para poder ir comparando y verificando que los datos que nos dan por parametros son los correctos.
Luego de comprara todos los datos y veridficar que son correctos, en la variable indice de productividad se van a sumar los balances de los tres tipos de solicitudes que existen, luego de que se suman estos balances, el resultado se divide entre los metros cuadrados del lote para asi poder obtener el indice de productividad en el rango de fecha pedido.
Acontinuacion el codigo de dicha funcion:

CREATE FUNCTION APFN_ProductivityIndexReport(@FK_LotXCycle INT, @Start DATE, @End DATE, @ActivityType VARCHAR(50), @RequestType VARCHAR(50))
RETURNS FLOAT
AS
BEGIN
    DECLARE @QueryResult TABLE(ID INT)
    DECLARE @ProductivityIndex FLOAT
    INSERT INTO @QueryResult(ID)
    SELECT R.ID FROM dbo.AP_Historical H
        inner join dbo.AP_Request R ON R.ID = H.FK_Request
        inner join dbo.AP_ActivityType AT ON AT.ID = R.FK_ActivityType
        inner join dbo.AP_RequestType RT ON RT.ID = R.FK_RequestType
        WHERE R.FK_LotXCycle = @FK_LotXCycle
            and AT.Name = ISNULL(@ActivityType, AT.Name)
            and RT.Name = ISNULL(@RequestType, RT.Name)
            and    (H.ActivityDate >= ISNULL(@Start, H.ActivityDate) and H.ActivityDate <= ISNULL(@End, H.ActivityDate))
    SELECT @ProductivityIndex = ISNULL(@ProductivityIndex, 0) + ISNULL(SUM(ISNULL(SerM.Amount, 0)), 0) FROM dbo.AP_ServiceMovement SerM
        inner join dbo.AP_ServiceRequest SerR ON SerR.ID = SerM.FK_ServiceRequest
        inner join @QueryResult R ON R.ID = SerR.ID
    SELECT @ProductivityIndex = ISNULL(@ProductivityIndex, 0) + ISNULL(SUM(ISNULL(MacM.Amount, 0)), 0) FROM dbo.AP_MachineryMovement MacM
        inner join dbo.AP_MachineryRequest MacR ON MacR.ID = MacM.FK_MachineryRequest
        inner join @QueryResult R ON R.ID = MacR.ID
    SELECT @ProductivityIndex = ISNULL(@ProductivityIndex, 0) + ISNULL(SUM(ISNULL(SupM.Amount, 0)), 0) FROM dbo.AP_SupplyMovement SupM
        inner join dbo.AP_SupplyRequest SupR ON SupR.ID = SupM.FK_SupplyRequest
        inner join @QueryResult R ON R.ID = SupR.ID

    SELECT @ProductivityIndex = @ProductivityIndex / L.SquareMeters FROM dbo.AP_Lot L
        inner join dbo.AP_LotXCycle LC ON LC.FK_Lot = L.ID
        WHERE LC.ID = @FK_LotXCycle           

    RETURN @ProductivityIndex
END

Luego de tener el indice de productividad de cada ciclo, se debe crear un nuevo procedimiento por el medio del cual se pueden observar los indices de productividad de los ciclos que se encuentran entre un cierto rango de tiempo.
Para crear este procedimiento se necesita: el FK de la propiedad, fecha inicio y fecha fin (rango de tiempo), la actividad, y tipo de solicitud.
Luego que se tiene todos estos datos, se seleccionan todos los lotes que se encuentran dentro del rango de fechas, y se muestran de forma descendente (Mayor a menor).

CREATE PROCEDURE APSP_ProductivityIndexes(@FK_Property INT, @Start DATE, @End DATE, @Activity VARCHAR(50), @RequestType VARCHAR(50))
AS
BEGIN
    BEGIN TRY
        SELECT L.ID, dbo.APFN_ProductivityIndexReport(LC.ID, @Start, @End, @Activity, @RequestType) AS ProductivityIndex FROM dbo.AP_Lot L
            inner join dbo.AP_LotXCycle LC ON LC.FK_Lot = L.ID
            WHERE L.FK_Property = @FK_Property
            ORDER BY ProductivityIndex DESC
    END TRY
    BEGIN CATCH
        RETURN @@ERROR * -1
    END CATCH
END

Estos procedimientos son los encargados de realizar las nuevas consultas, ya que por medio de ellos podremos filtrar y encontrar los datos que se requieren en los reportes que se deben realizar, y asi poder obtener los diferentes indices de productividad que tiene cada lote en un respectivo ciclo.

sábado, 20 de junio de 2015

Sábado 20/06/2015 (Migración de datos)

Tiempo invertido: 2 horas y 00 minutos, aproximadamente.
16:00-18:30

En la parte de la migracion de datos se dieron algunas modificaciones, principalmente por la inclusion de los metros cuadrados de cada lote, esta modificacion se dio debido a que es necesario para algunos de los requerimientos del tercer proyecto.

Esta modificacion no vario mucho el archivo de migracion de la base de datos, lo que si es que tuvimos algunos inconvevientes con el archivo por que para el segundo proyecto programado se elimino algunos datos los cuales creiamos que no eran importantes. Pero para el terecer proyecto si lo eran por lo tanto nuesto mayor reto fue solucionar este problema.

Debido a esto nuestro tiempo se vio alargado considerablemente, ya que nosotros creiamos que esto iba a ser un ejercicio sencillo de modificacion del archivo de migracion.

Ya que nuestra migracion del segundo proyecto fue satisfactoriamente buena, no tuvimos que modificar mucho del codigo original del segundo proyecto.  El principal problema fue el tratamiento de unsos nulos existentes en el archivo XML pero de esto se hablara en otra entrada con mas detalle.

viernes, 19 de junio de 2015

Viernes 19/06/2015 (Modificación de la BD)


Tiempo invertido: 2 horas y 30 minutos, aproximadamente.

17:00-19:30

Para este proyecto se deberán realizar varios cambios en el modelo conceptual y en la base de datos, ya que para poder realizar las nuevas consultas se deben tener unos atributos nuevos en varias tablas de la base de datos, los cuales son los siguientes:
  • Metros cuadrados: este es un nuevo atributo que debe tener la tabla del lote, en el cual podemos apreciar la dimensión que tiene el lote. Con este nuevo dato se podrá realizar la consulta para obtener el índice de productividad de cada lote.
  • Índice de productividad: este es un nuevo atributo que tendrá la tabla lote por ciclo en la cual se va almacenar el índice de producción que tiene ese lote en un ciclo especifico. Este nuevo espacio nos permitirá realizar la consulta para poder obtener los diferentes índices de productividad que tiene los lotes.

jueves, 18 de junio de 2015

Jueves 18/06/2015 (Implementación del Cubo)

Tiempo invertido: 1 horas y 30 minutos, aproximadamente.
16:00-17:30

En esta ocasión nuestro profesor Franco Quiros nos sugirió que la parte extra de nuestro proyecto debía ser una cubo, el cual sirve para visualizar datos (en tiempo real) de la base de datos. El mismo se realizo utilizando la herramienta SQL Server Data Tools, la cual se conecta con una versión 2010 de Visual Studio la cual nos permite crear un cubo.

Primero se selección la base de datos a la cual se va a enlazar, después se seleccionan las tablas mas importantes las cuales se conectan por medio de los Foreign keys. Despues el sistema crea el las partes del cubo asignándole un archivo .dim por cada tabla seleccionada. Luego se procesan los datos y se crea el cubo en si.

 Luego se pasa a un visualizador de datos como tal, en este caso se utilizo la misma herramienta antes utilizada SQL Server Data Tools la cual nos permite ver los datos de las tablas de la base de datos de una forma dinámica y en tiempo real. En al siguiente imagen se puede apreciar la estructura del mismo.