martes, 16 de junio de 2015

Conclusión

Conclusión final:
A pesar de ser nuestra primera tarea programada y el hecho de que Vinicio, Will y yo nunca hemos trabajado juntos y desconociamos nuestros procesos personales, esta tarea salió muy bien, con unos pocos errores que no tomamos en cuenta que nos harían tanto daño en el proceso de la inserción de datos, la conectividad de los sp y la base, pensamos en mejorar estos aspectos en las siguientes oportunidades de trabajo, tanto en el diseño del modelo como en el diseño gráfico de la base de datos.
Aprendimos a no manejar tantos NULL, ya que provocan muchos errores en la base.
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. Documentación: La documentación está muy completa, la entrada a los blogs están distribuidos en el tiempo, ya que empezamos la progra muy temprano, Las horas están muy consistentes ya que ambos miembros del grupo trabajamos arduamente las últimas 5 semanas. Veredicto de la documentación 100%
  2. Diseño e implementación de la base de datos: La base de datos está muy completa, con pequeños errores NO críticos permite la buena evaluación de la misma, FKs en diferentes tablas que complementan los tipos de datos dados y de acuerdo a como los vimos en clase, las tablas correctamente ordenadas y adecuadamente interconectadas. Veredicto del diseño de la base de datos 100%
  3. Migración masiva de datos básicos. La lectura del XML fue muy sencilla, el problema fue el cambio ya mencionado en la última entrada, los cambios a los que no estábamos acostumbrados en el XML nos tomó mucho tiempo. Veredicto de datos básicos y migración de datos 100%
  4. Código de la aplicación de escritorio: Trabajamos muy bien en esta parte de la tarea, aunque tuvimos problemas para unir el código con los SP, nos trabaja muy bien la lectura y una parte de inserción de datos, sin embargo el código está completo y en una futura versión funcional, tenemos problemas menores con la conversión de datos de el java.util a el java.sql, al parecer existe cierta incompatibilidad entre ambas y no pudimos solucionar el problema. Veredicto del código de la aplicación de escritorio 90%
  5. Código de la aplicación WEB: Trabajamos muy bien en esta parte de la tarea, aunque tuvimos problemas para unir el código con los SP, nos trabaja muy bien la lectura y una parte de inserción de datos, sin embargo el código está completo y en una futura versión funcional, tenemos problemas menores con la conversión de datos de el java.util a el java.sql, al parecer existe cierta incompatibilidad entre ambas y no pudimos solucionar el problema. Veredicto del código de la aplicación WEB 90%
  6. Código en SP: Sabemos que el código está correcto, con manejo de errores, completo, retorno de valores positivos o negativos dependiendo del error. Tomando en cuenta el manejo de transacciones, (los múltiples cálculos), las actualizaciones entre tablas están muy completas., tuvimos muchos problemas con los permisos de administrador en la base de datos, cuando intentábamos acceder a alguna función del SQL no nos dejaba, por la falta de permisos de administrador, es un problema que necesitamos mejorar para la siguiente programada, nos faltaron pequeños detalles en la elaboración de algunos SP, sin embargo están muy completos y estamos satisfechos con el resultado. Veredicto final del código en SP 90%

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:
35 horas.

sábado, 13 de junio de 2015

Creación de la lectura del XML

Miércoles 10 de Junio
Inicio: 11:30 a.m
Fin: 3:20 p.m

11:30 a.m - 11:45 a.m
Analicé el archivo XML, visualicé que tenía varios caracteres que el SQL no soportaba, pensé mis opciones para cambiar todos los posibles errores que incluían las vocales con tildes, vocales con diéresis y otros caracteres extraños del inglés.
Tenía que utilizar herramientas para reemplazar los errores que me daban pues el XML posee más de 45680 líneas y obviamente no lo podía hacer manualmente. Notepad++ no lo podía utilizar ya que este programa sustituía los caracteres extraños por números hexadecimales, así que decidí utilizar el reeplace all del notepad de Windows.

11:45 a.m - 12:45 p.m
Junto con el SQL, notepad++ y notepad de Windows rastrié los caracteres, el SQL me decía la línea del caracter del error, en el notepad++ buscaba la línea para saber cuál era el caracter del error, el cual reemplazaba todas las posibles apariciones en el XML por medio del noteped de Windows. Este procedimiento fue muy lento y tedioso por la cantidad de caracteres diferentes que se agregaron en el XML.

12:45 p.m - 1:50 p.m
Ya cuando el XML estaba listo, me dediqué a buscar información de cómo leer XML e insertarlo en las tablas temporales para posteriormente procesar la información y insertarlos en la base de datos.
Para mi sorpresa, el XML de los compañeros era un poco diferente de los XML usuales, aquí un ejemplo de las pequeñas diferencias que afectan mucho el código.

XML de los compañeros:

<?xml version="1.0" encoding="UTF-8"?> 
 <company>
  <period startDate="07/12/2014" endDate="08/06/2015"> 
<farm name="Santander" code="25282" > 
<lot name="Cisneros" code="23986" cropType="Frijol"> 
<activity description="Reciclaje de residuos organicos"> 

<machinery name="Maquinaria 0" requestFrom="Baldomero Ayllon" manager="Albino Garay" requestDate="10/02/2014" transactionDate="10/02/2014" units="6" status="Approved" costPerHour="4542" duration="2" note="Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."></machinery> 

XML de tutoriales:

<?xml version="1.0"?>
<File>
<Row>
<Operation>NormalHour</Operation>
<Data>1/2014-08-20/12</Data>
</Row>
<Row>
<Operation>NormalHour</Operation>
<Data>2/2014-08-20/10</Data>
</Row>
<Row>
<Operation>NormalHour</Operation>
<Data>3/2014-08-20/8</Data>
</Row>

Como podemos ver, en la primera versión la información está dentro de los signos de <>, diferenciado de nombres significativos con la información entre comillas. En la segunda versión los nombres significativos están en medio de los signos <>, seguidos por la información de una en una.

Así que tenía que tener esto en cuenta al escribir el código.

El primer SP fue el más difícil, pero después de hacer que funcionara los demás eran copiar y pegar, cambiarle algunos elementos y listo.

El primer SP me quedó así.

DECLARE @periodoVar TABLE(Id INT NOT NULL IDENTITY(1,1),
fechaInicio date, fechafin date)

INSERT INTO @periodoVar
SELECT 
usr.value('@startDate', 'date') as fechaInicio,
usr.value('@endDate','date') as fechafin
FROM @fincaInfo.nodes('/company/period') as a(usr)


select * from @periodoVar

1:50 p.m - 2:00 p.m
Cambié los parametros que leo en el XML de la primera función.

/*--------------------------------------------------------------
Leo la finca
---------------------------------------------------------------*/

DECLARE @fincaVar TABLE(Id INT NOT NULL IDENTITY(1,1),
nombre Varchar(50))

INSERT INTO @fincaVar
SELECT 
usr.value('@name', 'Varchar(50)') as nombre
FROM @fincaInfo.nodes('/company/period/farm') as a(usr)


select * from @fincaVar

2:00 p.m - 2:10 p.m
Cambié los parametros que leo en el XML de la primera función.

/*--------------------------------------------------------------
Leo la el código del lote y su tipo de cosecha
---------------------------------------------------------------*/

DECLARE @loteVar TABLE(Id INT NOT NULL IDENTITY(1,1),
codigo int, tipoCosecha Varchar(50))

INSERT INTO @loteVar
SELECT 
usr.value('@code', 'Varchar(50)') as codigo,
usr.value('@cropType', 'Varchar(50)') as tipoCosecha
FROM @fincaInfo.nodes('/company/period/farm/lot') as a(usr)


select * from @loteVar

2:10 p.m - 2:20 p.m
Cambié los parametros que leo en el XML de la primera función.

/*--------------------------------------------------------------
Leo la actividad
---------------------------------------------------------------*/

DECLARE @actividadVar TABLE(Id INT NOT NULL IDENTITY(1,1),
descripcion Varchar(50))

INSERT INTO @actividadVar
SELECT 
usr.value('@description', 'Varchar(50)') as descripcion
FROM @fincaInfo.nodes('/company/period/farm/lot/activity') as a(usr)


select * from @actividadVar

2:20 p.m - 2:40 p.m
Cambié los parametros que leo en el XML de la primera función.
Esta función fue un poco más difícil ya que era más larga y compleja, había que agregarle más parámetros

/*--------------------------------------------------------------
Leo la maquinaria, el solicitante, el manager, la fecha de solicitud,
fecha de transacción, unidades, duración, costo por hora y el estado
---------------------------------------------------------------*/

DECLARE @infoSolucitudVar TABLE(Id INT NOT NULL IDENTITY(1,1),
nombreMaquina Varchar(50), nombreSolicitante Varchar(50), 
nombreManager Varchar(50), fechaSolucitud date, fechaTransaccion date,
unidades int, duracion int, costoxHora int, estado Varchar(50))

INSERT INTO @infoSolucitudVar
SELECT 
usr.value('@name', 'Varchar(50)') as nombreMaquina,
usr.value('@requestFrom', 'Varchar(50)') as nombreSolicitante,
usr.value('@manager', 'Varchar(50)') as nombreManager,
usr.value('@requestDate', 'date') as fechaSolucitud,
usr.value('@transactionDate', 'date') as fechaTransaccion,
usr.value('@units', 'int') as unidades,
usr.value('@duration', 'int') as duracion,
usr.value('@costPerHour', 'int') as costoxHora,
usr.value('@status', 'Varchar(50)') as estado
FROM @fincaInfo.nodes('/company/period/farm/lot/activity/machinery') as a(usr)


select * from @infoSolucitudVar

2:40 p.m - 3:00 p.m
Cambié los parametros que leo en el XML de la primera función.
Esta función fue un poco más difícil ya que era más larga y compleja, había que agregarle más parámetros

/*--------------------------------------------------------------
Leo el suministro, el solicitante, el manager, la fecha de solicitud,
fecha de transacción, nota de la transacción, unidades, tipo de unidad,
duración, costo por unidad y el estado
---------------------------------------------------------------*/

DECLARE @infoSuministroVar TABLE(Id INT NOT NULL IDENTITY(1,1),
nombreSuministro Varchar(50), nombreSolicitante Varchar(50), 
nombreManager Varchar(50), fechaSolucitud date, fechaTransaccion date,
notaTransaccion varchar(50), unidades int,  tipoUnidad varchar(50),
costoxUnidad int, estado Varchar(50))

INSERT INTO @infoSuministroVar
SELECT 
usr.value('@name', 'Varchar(50)') as nombreSuministro,
usr.value('@requestFrom', 'Varchar(50)') as nombreSolicitante,
usr.value('@manager', 'Varchar(50)') as nombreManager,
usr.value('@requestDate', 'date') as fechaSolucitud,
usr.value('@transactionDate', 'date') as fechaTransaccion,
usr.value('@transactionNote', 'Varchar(50)') as notaTransaccion,
usr.value('@units', 'int') as unidades,
usr.value('@unitType', 'Varchar(50)') as tipoUnidad,
usr.value('@costPerUnit', 'int') as costoxUnidad,
usr.value('@status', 'Varchar(50)') as estado
FROM @fincaInfo.nodes('/company/period/farm/lot/activity/supply') as a(usr)


select * from @infoSuministroVar

3:00 p.m - 3:20 p.m
Cambié los parametros que leo en el XML de la primera función.
Esta función fue un poco más difícil ya que era más larga y compleja, había que agregarle más parámetros

/*--------------------------------------------------------------
Leo el servicio, el solicitante, el manager, la fecha de solicitud,
fecha de transacción, número de personas, duración, costo por hora
y el estado
---------------------------------------------------------------*/

DECLARE @infoServicioVar TABLE(Id INT NOT NULL IDENTITY(1,1),
nombreServicio Varchar(50), nombreSolicitante Varchar(50), 
nombreManager Varchar(50), fechaSolucitud date, fechaTransaccion date,
personas int,  duracion int,
costoxHora int, estado Varchar(50))

INSERT INTO @infoServicioVar
SELECT 
usr.value('@name', 'Varchar(50)') as nombreServicio,
usr.value('@requestFrom', 'Varchar(50)') as nombreSolicitante,
usr.value('@manager', 'Varchar(50)') as nombreManager,
usr.value('@requestDate', 'date') as fechaSolucitud,
usr.value('@transactionDate', 'date') as fechaTransaccion,
usr.value('@persons', 'int') as personas,
usr.value('@duration', 'int') as duracion,
usr.value('@costPerHour', 'int') as costoxHora,
usr.value('@status', 'Varchar(50)') as estado
FROM @fincaInfo.nodes('/company/period/farm/lot/activity/service') as a(usr)


select * from @infoServicioVar

3:00 p.m - 3:20 p.m
Por último agregué la seguridad contra detección de errores, algo somple pero funciona, :)

 END TRY
 BEGIN CATCH
     PRINT ERROR_NUMBER() 
     PRINT ERROR_SEVERITY()    
     PRINT ERROR_STATE()  
     PRINT ERROR_PROCEDURE()   
     PRINT ERROR_LINE()   
     PRINT ERROR_MESSAGE()  

 END CATCH 

Bibliografía

Leer el XML:
http://stackoverflow.com/questions/4815836/how-do-you-read-xml-column-in-sql-server-2008

Control de errores:
http://www.devjoker.com/contenidos/articulos/255/Control-de-errores-en-Transact-SQL.aspx

lunes, 1 de junio de 2015

Finalización de SP's

Lunes 1 de Junio
Inicio: 8:00 p.m
Fin: 11:00 p.m

8:00 p.m - 11:00 p.m

Se culmina la creacion de los dos primeros stored procedures. Los filtros se implementan de manera exitosa. Para cumplir esta tarea se
Se agrega columna gastosacumulados a lote, esta guarda los gastos provenientes de sus actividades
Se agrega columna gastosacumulados a actividades, esta guarda los gastos provenientes de suministros,etc
Se crea la tabla TipoActividad. El tipo se toma de la columna nombre de la tabla Actividades. Por lo tanto, dicha columna
es eliminada de la tabla Actividades.
Se crea la tabla Labor, la cual describe el trabajo que realizo el funcionario, ademas de TipoLabor.
Se crea la tabla TipoSuministro.
Se crea la tabla LaborXFuncionario, ya que una labor puede tener varios funcionarios a la vez que un Funcionario puede
participar en varias labores.
Se agregan foreign keys en Actividad hacia Labor,Suministro,Maquinaria y TipoActividad.
Queda pendiente el llenado apropiado de las tablas.
Quedan pendientes pruebas exhaustivas a los filtros.


 realizaron los siguientes cambios:

jueves, 28 de mayo de 2015

Complementación de ventanas

Jueves 28 de Mayo
Inicio: 9:00 p.m
Fin: 11:00 p.m

9:00 p.m - 10:00 p.m

Se implementan en la aplicación de escritorio las pantallas de mantenimiento y gestión de las fincas-lotes-cosechas, en los cuales se permiten operaciones de registro, eliminación y modificación de tareas a diferentes tipos de cosechas de todos los lotes de las fincas existentes.
Se crean las ventanas y formularios gráficos con sus diferentes controles de usuario.



10:00 p.m - 11:00 p.m

Se implementan los bindings entre los controles gráficos (JLists y JTables principalmente) con los datos recibidos de la base de datos. Me enfrento a varias inconvenientes causados principalmente por el desconocimiento al aplicar los layouts correctamente en los JForms, sin embargo, investigando en la documentación online proporcionado por Oracle para la API Swing de Java, logré ir dando poco a poco, y con mucho esfuerzo con las soluciones a todos estos problemas de manera satisfactoria.

Información acerca del error que se desplegaba:

http://docs.oracle.com/javase/7/docs/api/

java.util
Contains the collections framework, legacy collection classes, event model, date and time facilities, internationalization, and miscellaneous utility classes (a string tokenizer, a random-number generator, and a bit array).
javax.security.auth.callback
This package provides the classes necessary for services to interact with applications in order to retrieve information (authentication data including usernames or passwords, for example) or to display information (error and warning messages, for example).
javax.transaction.xa
Provides the API that defines the contract between the transaction manager and the resource manager, which allows the transaction manager to enlist and delist resource objects (supplied by the resource manager driver) in JTA transactions.
Páginas visitadas:

http://docs.oracle.com/javase/7/docs/
http://www.lab.dit.upm.es/~lprg/material/apuntes/doc/doc.htm
http://www.aprenderaprogramar.com/index.php?option=com_content&view=article&id=582:api-java-descarga-download-e-instalacion-de-documentacion-clases-imejor-en-local-o-internet-cu00908c&catid=58:curso-lenguaje-programacion-java-nivel-avanzado-i&Itemid=180

lunes, 25 de mayo de 2015

Avance en Stored Procedures

Lunes 25 de Mayo
Inicio: 10:30 a.m
Fin: 2:00 p.m

10:30 p.m - 12:00 p.m
Se comienza la creación de los Stored Procedures. Se completan el primer y segundo, a excepción del calculo de los costos totales. El tercer Stored Procedure queda pendiente en su totalidad.
Se realizan modificaciones en las tablas y las relaciones entre ellas para facilitar la realización de las consultas.

Posteriormente, se requiere la creación o modificación pesada de algunas tablas para poder realizar el tercer Stored Procedure.
Las tablas que se afectaron:
Empresa
Fincas
Solicitudes
Funcionarios
Lotes
CosechasxLote
ActividadesxCosechaxLote
Procedimientos
TipoCultivo
RequisitosSolicitados
PasosxProcedimiento
RequisitoxPaso

También queda pendiente el relleno apropiado de datos en tablas para comprobar el funcionamiento totalmente adecuado de las consultas.
A continuación se detallan los cambios realizados a las tablas:

Se cambia el nombre de la tabla tipo cultivo a cosecha
Se coloca en suministro y maquinaria un atributo costo
Se remueve la foreign key a actividadesXcosechaXlote en actividades
Se agrega una foreign key en actividadesXcosechaXlote hacia actividades
Se agrega una foreign key en cosechasXlote hacia cosecha
Se remueven los atributos Cultivo1, Cultivo2 y descripción de actividadesXcosechaXlote
Se asignan keys temporales a actividadesXcosechaXlote y cosechasXlote

martes, 19 de mayo de 2015

JDBC y creación de capa lógica

Lunes 25 de Mayo
Inicio: 10:30 a.m
Fin: 2:00 p.m

10:30 p.m - 12:00 p.m
Se comienza la creación de los Stored Procedures. Se completan el primer y segundo, a excepción del calculo de los costos totales. El tercer Stored Procedure queda pendiente en su totalidad.
Se realizan modificaciones en las tablas y las relaciones entre ellas para facilitar la realización de las consultas.

Posteriormente, se requiere la creación o modificación pesada de algunas tablas para poder realizar el tercer Stored Procedure.
Las tablas que se afectaron:
Empresa
Fincas
Solicitudes
Funcionarios
Lotes
CosechasxLote
ActividadesxCosechaxLote
Procedimientos
TipoCultivo
RequisitosSolicitados
PasosxProcedimiento
RequisitoxPaso

También queda pendiente el relleno apropiado de datos en tablas para comprobar el funcionamiento totalmente adecuado de las consultas.
A continuación se detallan los cambios realizados a las tablas:

Se cambia el nombre de la tabla tipo cultivo a cosecha
Se coloca en suministro y maquinaria un atributo costo
Se remueve la foreign key a actividadesXcosechaXlote en actividades
Se agrega una foreign key en actividadesXcosechaXlote hacia actividades
Se agrega una foreign key en cosechasXlote hacia cosecha
Se remueven los atributos Cultivo1, Cultivo2 y descripción de actividadesXcosechaXlote
Se asignan keys temporales a actividadesXcosechaXlote y cosechasXlote

jueves, 14 de mayo de 2015

Creación de las composiciones

Jueves 14 de Mayo
Inicio: 7:30 p.m
Fin: 11:30 p.m

7:30 p.m - 8:30 p.m

Se establecen las relaciones conceptuales en el diseño de la misma naturaleza, agregaciones, composiciones, asociaciones, entre otros.



8:30 p.m - 11:30 p.m


Se llevó a cabo casi la totalidad del diseño físico de la base de datos del sistema. Se establecieron la totalidad de los constraints "Foreign Key", relaciones, entre otros.


Además, se incorporaron una gran parte de los atributos por conjunto de entidades necesarios para realizar las consultas solicitadas en la asignación.

En el proceso de planificación, análisis y el ciclo de implementación-corrección se invirtió cerca de 3 horas aproximadamente.




miércoles, 13 de mayo de 2015

Creación de tablas

Miércoles 13 de Mayo
Inicio: 7:30 p.m
Fin: 9:40 p.m

7:30 p.m - 9:40 p.m

Se establecen los conjuntos entidad (tablas) básicos que conformarán el modelo básico de la base de datos en sí.
Aún está pendiente todas las relaciones, agregaciones, composiciones, etc, entre ellas, sin embargo en este proceso de compresión de lectura, análisis de requisitos y establecemiento del marco del problema.
Las tablas creadas son:
Empresa
Fincas
Solicitudes
Funcionarios
Lotes
CosechasxLote
ActividadesxCosechaxLote
Procedimientos
TipoCultivo
RequisitosSolicitados
PasosxProcedimiento
RequisitoxPaso



martes, 12 de mayo de 2015

Instalación de Java y creación de la base

Martes 12 de Mayo
Inicio: 7:30 p.m
Fin: 10:20 p.m

7:30 p.m - 7:40 p.m

Se selecciona el entorno de desarrollo (IDE) Eclipse para desarrollar la aplicación desde la cual se manipulará la información de la base de datos de administración de fincas.
El lenguaje a utilizar será Java, y el SABD seleccionado para esta vez será PostgreSQL.

Investigación para comprender cuales plugins serán necesarios adaptar e instalar al IDE Eclipse para poder diseñar las bases de datos y manipularlas desde el IDE. Páginas visitadas:

http://www.eclipse.org/ide/
http://scala-ide.org/
https://developer.salesforce.com/page/Force.com_IDE

Se encuentra este plugin: http://www.toad-data-modeler.com/enu/free-toad-eclipse-plugin-postgresql.aspx  y se instaló a Eclipse para dicho fin.

7:50 p.m - 8:00 p.m

Se realiza labor de investigación en lo que es MVC (Model-View-Controller) para la aplicación Java encargada de manipular los datos de la base de datos.
Páginas visitadas para la investigación:

http://www.asp.net/mvc
https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller
http://www.w3schools.com/aspnet/mvc_intro.asp

8:00 p.m - 8:20 p.m

Se hace labor de instalación y configuración (setting-up) del SABD PostgreSQL, agregar usuarios permitidos para ejecutar el SABD, roles.

8:20 p.m - 8:30 p.m

Se decide cambiar de SABD, en lugar de PostgreSQL se utilizará MySQL por razones de simplicidad a la hora de adaptarlo al IDE seleccionado (Ahora ha cambiado por Netbeans).

8:30 p.m - 9:00 p.m

Se instala y configura bajo un sistema Linux el MySQL Workbench para administración más simple e intuitiva de la base de datos del sistema.

La mayor parte del tiempo lo tomó la instalación.


9:00 p.m - 10:00 p.m

Se elige como herramienta para modelado del diseño conceptual de la base de datos del sistema el sistema online GenMyModel, esto por su elevada flexibilidad y variedad de herramientas y modos de exportación de modelos.

Entre el proceso de búsqueda de información acerca de diferentes herramientas de modelado y el modo de uso.



10:00 p.m - 10:20 p.m

Enlace directo al modelo conceptual de la base de datos de administración de fincas por parte de una empresa: https://repository.genmymodel.com/vinicioflores/FincaAgricola