jueves, 25 de junio de 2015

Conclusión

Conclusión final 
Esta tarea estuvimos muy motivados ya que los 3 necesitamos un 100 para poder pasar, y gracias a eso sacamos el 100% de la tarea.
Hubo una mejora en la comunicación, trabajamos con más sinergia, nos ayudamos unos a otros, si teníamos problemas con algúna consulta, otro conpañero nos ayudaba o problemas al construir la bitácora.
Tuvimos problemas con la primera y la segunda consulta, en la primera se tuvo que crear una fila nueva en la tabla de los ciclos, ya que se nos dificultó la obtención de información.
En la segunda consulta estaba más difícil ya que la información solicitada estaba en tablas muy distantes, pero con el buen uso de el comando row lo pudimos sacar.
Pensamos que a pesar de la plantilla de evaluación estaba dura nos apegamos muy bien a lo que había que completar, a continuación el veredicto grupal:

1. Reporte de productividadXActividad
Esta consulta está muy completa, el recibimiento de la entrada especificada está al pie de la letra, las salidas están al 100% a como las pedía el profesor, en fin, aunque tuvimos problemas al entender el código de los compañeros, estamos muy satisfechos con esta consulta, Veredicto para el Reporte de productividadXActividad 100%

Cantidad de horas trabajadas en esta consulta: 4 horas

2. Reporte de productividad por maquinaria.
Esta consulta está muy completa, el recibimiento de la entrada especificada está al pie de la letra, las salidas están al 100% a como las pedía el profesor, aunque esta consulta fue muy difícil de sacar, lo logramos entre los 3 y estamos muy satisfechos con el resultado, 
Veredicto para el Reporte de productividadXMaquinaria 100%

Cantidad de horas trabajadas en esta consulta: 7 horas

3. Reporte de ociosidad por maquina. 
En esta consulta tuvimos problemas con la implementación de la base de datos, y problamas con en pegue con la base de datos que estaba juntando Vinicio, no pudimos reconocer ni corregir el error, sin embargo el código está correctamente implementado y las salidas están correctamente ejecutadas.
Veredicto para el Reporte de ociosidad por máquina 100%

Cantidad de horas trabajadas en esta consulta: 9 horas

4. Reporte comparativo por tipo de actividad
En esta consulta se con dificultó el orden de las tablasen las que había que leer los join, sin embargo después de mucho esfuerzo logramos completarlo satisfactoriamente, esta consulta está muy completa, el recibimiento de la entrada especificada está al pie de la letra, las salidas están al 100% a como las pedía el profesor, en fin, aunque tuvimos problemas al entender el código de los compañeros, estamos muy satisfechos con esta consulta, Veredicto para el Reporte de productividadXActividad 100%

Cantidad de horas trabajadas en esta consulta: 7 horas

La idea de las tareas programadas es aprender y pensamos que esta cumplió su objetivo, esperamos tener la siguiente al 100% evitar contratiempos del software, uniendo nuestros conocimientos y aplicándolos mejor, evitar cometer los mismos errores y agregar la retroalimentación del profesor en el futuro.

Horas totales trabajadas por miembro del grupo:
27 horas.

martes, 23 de junio de 2015

Finalización de la tercera consulta

Martes 23 de Junio
Hora inicio: 9: 00 am
Hora fin: 3:00 pm

9:00 am - 11:00 am
Se culmina la tercera consulta. Las mayores dificultades surgieron de la necesidad de comprender el funcionamiento de la base de datos de otros programadores. Esto, debido a que utilizan un estilo y metodología de programación distinto al propio, por lo que discernir las relaciones entre las tablas y como esta almacenada la informacion puede ser dificultoso. Sin embargo, se logra superar dicha dificultad por medio de seguir los pasos para el funionmiento del proyecto, anáslisis profundo de las tablas, análisis de los datos y el análisis de los campos de las tablas, y se procede a realizar la consulta.

La tabla que más se nos dificultó la comprensión fue la de Request, pues era la tabla que poseía más datos y la más compleja de entender.

11:00 am - 3:00 pm

Se utiliza un cursor que se mueve sobre la tabla Machinery, lo que toma sus nombres y permite calcular la suma total de las horas trabajadas de cada una al seleccionar solo las entradas con esa maquina en la fila. No se itera sobre el JOIN principal, solo sobre los nombres de las maquinas.




Se emplean variables tabla, tanto creadas mediante DECLARE como con INSERT INTO. El segundo tipo se utiliza gracias a la facilidad de no especificar cada atributo, ya que el JOIN principal del Stored Procedure crea una tabla de tamaño considerable.

insert into @Maquinas
select idMachine, nombreMachine,
(Costo*newRow)/metrosCuadrados,
idLot,
newRow, (Costo*newRow),(Costo*newRow)/newRow,
ROW_NUMBER()OVER(PARTITION BY nombreMachine,idLot   Order BY nombreMachine,idLot,(Costo*newRow)/metrosCuadrados  DESC) as 'row number'
from @MaquinasLote

select idMachine, nombreMachine, indiceProductividad, idLot, cantSolicitudes, montoMaxXSolicitud, montoProm
from @Maquinas
Where newRow<2
order by indiceProductividad DESC

Se implementan los filtros por ciclo, lote y cultivo de forma exitosa.
Para programar la consulta y una cantidad no precisada de horas para comprender el funcionamiento de la base.

Problemas de compatibilidad entre los cursores de Will con la base de datos de Vinicio, error:
Msg 1087, Level 15, State 2, Line 1
Uneable to use cursor "@AP_Cycle".
Msg 1087, Level 15, State 2, Line 7
Uneable to use cursor @AP_CYCLE "@MaquinasLote".
Msg 1087, Level 15, State 2, Line 10
Must declare the table variable "@Maquinas".

Páginas consultadas para el error:

https://msdn.microsoft.com/en-us/library/ms180169.aspx
ftp://ftp.microsoft.com/bussys/sql/docs/DBLMSG.TXT
http://sqlmag.com/t-sql/text-pointers

lunes, 22 de junio de 2015

Finalización de la cuarta consulta

Domingo 21 de Junio
Hora inicio: 3:00 a.m
Hora Fin: 6:00 pm

3:00 pm - 6:00 pm
Investigación de cómo eliminar las filas repetidas sin utilizar el comando group by, ya que este comando me daba problemas de que no todas las filas con el mismo nombre eran iguales. El resultado de la investigación fue positiva, recordé un comando que se llama distinct, que hace exactamente lo que quiero, pero este comando me daba problemas junto con el comando order by que necesitaba para acomodar las actividades por fecha.
El problema era únicamente que no me los acomodaba, así que era nada más era de cambiarlos de posición.


El siguiente reto era más difícil ya que el profe no le gusta que usemos iteración en los SP, el reto era tomar las primeras 3 actividades previas más próximas por fecha, sin utilizar iteraciones.
Después de investigar en varias páginas, descubrí un comando que le agrega números consecutivos a los nombres iguales y al cambiar el nombre, los números empiezan de nuevo desde 1. Si lograba hacer que este comando funcionara toda la vida iba a tener solución, ya que lo único que tenía que hacer era filtrar los números mayores a 3.
Por desgracia la vida no es tan bella, el comando ROW_NUMBER()OVER únicamente funciona en tablas common, y como mi tabla es temporal no funcionaba, después de mucha investigación logré hacer como hacerlo, tengo que crear 2 tablas temporales y copiar el ROW_NUMBER a la segunda.

USE AgriculturalProperty;

GO

CREATE PROCEDURE reporteActividades
@Fecha date

AS

Begin
Declare @ActivitiesLots TABLE(
Nombre varchar(100),
GastoServicio int, GastoSuministro int, GastoMaquinaria int, IndiceProductividad float,
FechaInicio date, FechaFin date,
IdLote int, CodigoLote int, MetrosCuadrados Float)

Declare @Activities TABLE(
Nombre varchar(100), GastoTotal int,
GastoServicio int, GastoSuministro int, GastoMaquinaria int, IndiceProductividad float,
FechaInicio date, FechaFin date,
IdLote int, CodigoLote int, MetrosCuadrados Float, rowNum int)

INSERT INTO @ActivitiesLots
select distinct
dbo.AP_ActivityType.Name,
dbo.AP_LotXCycle.ServicesBalance, dbo.AP_LotXCycle.SuppliesBalance,
                dbo.AP_LotXCycle.MachineryBalance, dbo.AP_LotXCycle.ProductivityIndex,
                dbo.AP_Cycle.StartDate, dbo.AP_Cycle.EndDate,
                dbo.AP_Lot.ID, dbo.AP_Lot.Code, dbo.AP_Lot.SquareMeters
from dbo.AP_LotXCycle join dbo.AP_Request on
                dbo.AP_LotXCycle.ID=dbo.AP_Request.FK_LotXCycle
join dbo.AP_ActivityType on
                dbo.AP_Request.FK_ActivityType=dbo.AP_ActivityType.ID
join dbo.AP_Cycle on dbo.AP_LotXCycle.FK_Cycle=dbo.AP_Cycle.ID
join dbo.AP_Lot on dbo.AP_LotXCycle.FK_Cycle=dbo.AP_Lot.ID;

insert into @Activities
select
Nombre, GastoServicio + GastoSuministro + GastoMaquinaria,
GastoServicio, GastoSuministro, GastoMaquinaria, IndiceProductividad,
FechaInicio, FechaFin,
IdLote, CodigoLote, MetrosCuadrados,
ROW_NUMBER()OVER(PARTITION BY Nombre Order BY Nombre, FechaInicio DESC) as 'row number'
from @ActivitiesLots
where (FechaInicio<@Fecha)

select Nombre, GastoTotal,
GastoServicio, GastoSuministro, GastoMaquinaria, IndiceProductividad,
FechaInicio, FechaFin,
IdLote, CodigoLote, MetrosCuadrados
from @Activities
where rowNum<4

End

Bibliografía

Editor de consultas:
https://msdn.microsoft.com/es-es/library/ms345415(v=sql.120).aspx

Ordenar:
https://www.google.com/search?q=sql+ordenar+de+menor+a+mayor&oq=ordenar+sql+menor+a+&aqs=chrome.1.69i57j0l2.16751j0j7&sourceid=chrome&es_sm=122&ie=UTF-8

ROW_NUMBER tutorials
https://www.youtube.com/watch?v=ynWgSZBoUkU
http://stackoverflow.com/questions/1466963/sql-row-number-function-in-where-clause
http://www.sqlservercentral.com/Forums/Topic1052669-1291-1.aspx
http://www.sqlusa.com/bestpractices2005/addrownumbertotable/
https://msdn.microsoft.com/en-us/library/ms186734.aspx

Avance en cuarta consulta

Domingo 21 de Junio
Hora inicio: 5:00 a.m
Hora Fin: 2:00 pm

5:00 am - 6:00 am
Análisis de la cuarta consulta, tenemos problemas para entender la redacción de la cuarta consulta, se le envía un correo al profesor con las dudas respectivas, el siguiente fue el correo:

"Hola profe!
Profe tengo unas dudas sobre la número 4 de la progra, lo que entiendo es que recibo una fecha y regreso todas las actividades, 3 de cada una con las fechas anteriores más cercanas y lo que debo mostrar en cada una es esto: nombre, monto total de costos, indice de productividad de los 3 ciclos más próximos, lotes y el id de lote. ¿Es correcto?
Otra pregunta, ¿cómo era que se sacaba el índice de productividad? y ¿los costos son los salen en la tabla LotXCycle (ServicesBalance, SuppliesBalance, MachineryBalance)?
Muchas gracias de antemano profe!

Saludos, Valerio"

Aun no tenemos respuesta, sin embargo se trabajó en lo que sí entendimos.

6:00 am - 2:00 pm
Se analizó el diagrama de los compañeros e hicimos un análisis de lo que se nos solicitaba en la cuarta consulta, así llegamos a la conclusión de los joins de las tablas las cuales debíamos trabajar. las tablas que debimos tomar en cuesta fueron:
Request: únicamente para unir las demás tablas
Lot: para tomar el ID y el código del lote que se solicita
Cycle: para tomar las fechas intervalo en las que trabajaremos
LotXCycle: para unir con las tablas Lot y Cycle, también tiene información importante para nosotros, como los balances de los precios
ActivityType: para tomar el nombre de la actividad que se solicita.



El código fue fácil de crear, pues son simples joins:

/*nombre, monto total de costos, indice de productividad de los 3 ciclos más próximos
 lotes, id de lote,      costos, indice de productividad de los 3 ciclos
*/
DECLARE @ActivitiesLots TABLE(Id INT NOT NULL IDENTITY(1,1),
Nombre varchar(50),
GastoServicio int, GastoSuministro int, GastoMaquinaria int,
FechaInicio date, FechaFin date,
IdLote int, CodigoLote int, MetrosCuadrados Float)

INSERT INTO @ActivitiesLots
                           select  dbo.AP_ActivityType.Name,
                dbo.AP_LotXCycle.ServicesBalance, dbo.AP_LotXCycle.SuppliesBalance,                                         dbo.AP_LotXCycle.MachineryBalance,
                  dbo.AP_Cycle.StartDate, dbo.AP_Cycle.EndDate,
                dbo.AP_Lot.ID, dbo.AP_Lot.Code, dbo.AP_Lot.Meters
           from dbo.AP_LotXCycle join dbo.AP_Request on                                                                                       dbo.AP_LotXCycle.ID=dbo.AP_Request.FK_LotXCycle
             join dbo.AP_ActivityType on                                                                                                      dbo.AP_Request.FK_ActivityType=dbo.AP_ActivityType.ID
     join dbo.AP_Cycle on
                               dbo.AP_LotXCycle.FK_Cycle=dbo.AP_Cycle.ID
     join dbo.AP_Lot on
                               dbo.AP_LotXCycle.FK_Cycle=dbo.AP_Lot.ID

select * from @ActivitiesLots


Decidimos crear una tabla para guardar todos los datos, mientras el profe nos contesta.

Bibliografía 

Joins:
https://www.youtube.com/watch?v=NL7eBil5Yak&index=31&list=PL6hPvfzEEMDaU4aiS389oXamdN8sip856

https://www.youtube.com/watch?v=mjE1PWXm8QA&list=PL6hPvfzEEMDaU4aiS389oXamdN8sip856&index=32

https://www.youtube.com/watch?v=pjduEQj9-6c&index=33&list=PL6hPvfzEEMDaU4aiS389oXamdN8sip856

domingo, 21 de junio de 2015

Finalización del segundo reporte

Sábado 20 de Junio
Hora inicio: 6:00 p.m
Hora Fin: 12:30 am

6:00 pm - 8:00 pm
Se finaliza la implementacion del primer reporte en su totalidad.
Se termina de codificar y perfeccionar el algoritmo SQL para la consulta total y desglose de lotes por indice de productividad de todas las actividades.


8:00 pm - 8:30 pm
Se implementa el segundo filtro por tipo de actividad

alter PROCEDURE APSP_ProductividadPorMaquina
-- Add the parameters for the stored procedure here
@Ciclo int, @Lote int, @Cultivo int, @TipoReporte VARCHAR(50)
AS
BEGIN

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

/** Si la transaccion no ha sido comenzada a correr anteriormente, entonces la iniciamos
  * sino, simplemente realizamos un checkpoint */
IF @@TRANCOUNT = 0
BEGIN TRANSACTION
ELSE
SAVE TRANSACTION ProdByMachTran

-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
BEGIN TRY
/* Para este caso se define el Indice de Productividad de una maquina como
el cociente del costo de todos los lotes en los que trabajo entre el area de cada lote */

9:00 pm - 9:25 pm
Se logra codificar el tercer filtro por tipo de solicitud

alter PROCEDURE APSP_ProductividadPorMaquina
-- Add the parameters for the stored procedure here
@Ciclo int, @Lote int, @Cultivo int, @TipoReporte VARCHAR(50)
AS
BEGIN

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

/** Si la transaccion no ha sido comenzada a correr anteriormente, entonces la iniciamos
  * sino, simplemente realizamos un checkpoint */
IF @@TRANCOUNT = 0
BEGIN TRANSACTION
ELSE
SAVE TRANSACTION ProdByMachTran

-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
BEGIN TRY
/* Para este caso se define el Indice de Productividad de una maquina como
el cociente del costo de todos los lotes en los que trabajo entre el area de cada lote */

11:00 pm - 12:30 am
Se implementa el codigo de manejo de errores, y se invierto cierto tiempo en investigacion y casos de ensayo y error para mejorar la eficiencia el desempeño de las consultas.

END
IF @TipoReporte = 'Por Cultivo'
BEGIN
declare @a as int;
END

IF @@TRANCOUNT = 1
COMMIT

END TRY
BEGIN CATCH
DECLARE @error INT, @message VARCHAR(4000), @xstate INT;
SELECT @error = ERROR_NUMBER(), @message = ERROR_MESSAGE(), @xstate = XACT_STATE();
IF @xstate = -1
ROLLBACK;
IF @xstate = 1 and @@TRANCOUNT = 0
ROLLBACK
IF @xstate = 1 and @@TRANCOUNT > 0
ROLLBACK TRANSACTION ProdByMachTran;
RAISERROR ('ProdByMachTran: %d: %s', 16, 1, @error, @message) ;
END CATCH

END
GO


Bibliografía

Manejo de errores:
https://www.youtube.com/watch?v=BswGWNhrNSM
http://www.devjoker.com/contenidos/articulos/255/Control-de-errores-en-Transact-SQL.aspx

viernes, 19 de junio de 2015

Primera consulta

Viernes 19 de Junio
Hora inicio: 1:00 p.m
Hora Fin: 4:00 pm

1:00 pm - 1:30 pm
Nos dividimos cada una de las partes del proyecto, la decisión final fue: Vinicio se encargaba de la primera y la segunda parte, William se encargaba de la tercera parte y Valerio se encargaba de la última parte de la progra.

1:30 pm - 4:00 pm
Se implementa el código SQL correspondiente a la primera consulta del primer reporte (Reporte de Productividad por Actividad) de manera Total. Aun esta pendiente las consultas por Tipo de Actividad y por tipo de Solicitud.
El código final quedó de la siguiente manera:

    IF @TipoReporte = 'Por Ciclo'
BEGIN
declare @c as int;
END
IF @TipoReporte = 'Por Lote'
BEGIN
DECLARE @MaquinasLote TABLE(rownum int, machine INT NOT NULL, RequestID Int NOT NULL, Nombre Varchar(50), Costo INT, pIndex float, lot int NOT NULL);
INSERT INTO @MaquinasLote  SELECT DENSE_RANK()OVER(PARTITION BY M.ID ORDER BY MR.ID DESC) AS 'Row Number', M.ID, MR.ID,  M.Name,M.Cost,M.ProductivityIndex, MR.FK_Lot FROM AP_Machinery M
JOIN AP_MachineryRequest MR ON M.ID = MR.FK_Machinery
JOIN AP_Lot L ON L.ID = MR.FK_Lot WHERE MR.FK_Lot = @Lote;

Se realizan experimentos de prueba y error en la base de datos, se añaden algunos atributos en las relaciones AP_Lot, AP_Lot y AP_Request, dichos atributos estan destinados a almacenar los indices de productividad de cada lote especificamente, y a su vez el Indice de productividad de cada solicitud. Loa índices se calculan con la fórmula:
UnidadxCostoxUnidad





Se programa el respectivo Stored Procedure para dicha consulta del primer reporte y se codifican las transacciones que la componen.


Bibliografía

Detalles sobre el join:
https://www.youtube.com/watch?v=mjE1PWXm8QA&list=PL6hPvfzEEMDaU4aiS389oXamdN8sip856&index=32