sábado, 28 de septiembre de 2019

Correccion de primera parte del proyecto

Hora de inicio 1:23pm

Empece por completar una carga de datos hecha correctamente (ordenada y entendible) esto debido a que la carga de datos que utiliza Austin es distinta a la carga de datos que debo hacer yo, esto es porque por alguna razon que desconocemos la utilizacion de tablas temporales para cargar los datos no funciona en mi computadora. A continuacion el codigo de lo que hice:

--------------------------EMPIEZA la insercion en las tablas que no son temporales

--Inserta Moneda
Insert INTO Moneda
SELECT TM.Nombre, TM.Simbolo
FROM TMoneda TM

--Inserta TipoCuentaAhorro
Insert INTO TipoCuentaAhorro
SELECT Moneda.id, TCuenta.Nombre, TCuenta.SaldoMinimo, TCuenta.MultaSaldoMinimo,
        TCuenta.MontoMensual, TCuenta.Retiros, TCuenta.SimMoneda, TCuenta.RetirosCajero,
        TCuenta.TasaIntereses
FROM Moneda, TCuenta
Where Moneda.Simbolo = TCuenta.SimMoneda
   
--Inserta Parentesco
Insert INTO Parentesco
SELECT TP.Nombre, TP.Detalle
FROM TParentesco TP

--Inserta TipoID
Insert INTO TipoID
SELECT TID.Nombre
FROM TTipoId TID

--Inserta Cliente
Insert INTO Cliente
SELECT TipoID.id, TCliente.FechaNacimiento, TCliente.Usuario, TCliente.Password, TCliente.TipoDocId,
        TCliente.DocID, TCliente.Email, TCliente.Telefono1, TCliente.Telefono2, TCliente.Nombre
FROM TipoID, TCliente
Where TipoID.Nombre = TCliente.TipoDocId

--Inserta CuentaAhorro
Insert INTO CuentaAhorro
SELECT TCA.NumCuenta, TCA.Saldo, TipoCuentaAhorro.id, Cliente.id
FROM TCA, TipoCuentaAhorro, Cliente
Where TipoCuentaAhorro.Nombre = TCA.IdTipoCA
AND Cliente.Documento_Identificacion = TCA.IdCliente

--Inserta CuentaObjeto
Insert INTO CuentaObjeto
SELECT CuentaAhorro.id, TObjeto.Saldo, TObjeto.FechaInicio, TObjeto.FechaFinal,
        TObjeto.MontoAhorro, TObjeto.NumCuenta
FROM CuentaAhorro, TObjeto
Where CuentaAhorro.Numero_Cuenta = TObjeto.NumCuenta

--Inserta EstadoCuenta
Insert INTO EstadoCuenta
SELECT CuentaAhorro.id, TEstado.FechaInicio, TEstado.FechaFinal, TEstado.SaldoInicial,
        TEstado.SaldoFinal, TEstado.Intereses, TEstado.NumCuenta
FROM CuentaAhorro, TEstado
Where CuentaAhorro.Numero_Cuenta = TEstado.NumCuenta

--Inserta Beneficiario
Insert INTO Beneficiario
SELECT CuentaAhorro.id, Parentesco.id, TipoID.id, TBeneficiario.Nombre, TBeneficiario.Parentesco,
        TBeneficiario.PorcentajeBeneficio, TBeneficiario.Activo, TBeneficiario.FechaDesactivo,
        TBeneficiario.TipoDocId, TBeneficiario.DocID, TBeneficiario.Email, TBeneficiario.Telefono1,
        TBeneficiario.Telefono2, TBeneficiario.NumCuenta
FROM CuentaAhorro, Parentesco, TipoID, TBeneficiario
Where CuentaAhorro.Numero_Cuenta = TBeneficiario.NumCuenta
AND Parentesco.Nombre = TBeneficiario.Parentesco
AND TipoID.Nombre = TBeneficiario.TipoDocId

-----------------------------------TERMINA la insercion de los datos a las tablas


Cree un algoritmo para limpiar  mi base datos (antes lo hacia borrando las tablas una por una), es decir para borrar todas las tablas que tiene la base de datos esto para poder crearla de nuevo y cargar de nuevo los datos. A continuacion el codigo):

ALTER PROCEDURE [dbo].[CASP_LimpiarBaseDatos]
AS
BEGIN
    SET NOCOUNT ON

    BEGIN TRY
        drop table dbo.Beneficiario
        drop table dbo.EstadoCuenta
        drop table dbo.CuentaObjeto
        drop table dbo.CuentaAhorro
        drop table dbo.Cliente
        drop table dbo.TipoID
        drop table dbo.Parentesco
        drop table dbo.TipoCuentaAhorro
        drop table dbo.Moneda
    END TRY

    BEGIN CATCH
        return @@ERROR * -1
    END CATCH
END


Por ultimo se modifico el SP: CASP_ActualizarBeneficiario, ya que anteriormente solo se podian actualizar porcentajes de forma que siempre la suma de los porcentajes de los beneficiarios de una cuenta sumaran 100, ahora estos pueden sumar menos o igual a 100 pero no más.
Tambien estaba el problema de que no se podia modifiar el nombre, la identificacion o el tipo de identificacion de los usuarios, ahora se puede cambiar toda esa informacion y la que anteriormente se podia cambiar.
No se va a mostrar el codigo porque es muy extenso.

Hubo complicaciones con las validaciones de que el beneficiario al que modificara fuera precisamente el que queria modificar.

Hora de finalizacion de lo anterior: 5:34pm

Horas en total: 4 horas y 11 minutos

Correcciones de la primera parte

28 de setiembre del 2019

Se realizan mockups de la pagina web para aclarar las submetas necesarias para avanzar con el proyecto. Hora Inicio: 11:30 a.m- Hora Final: 12:43 p.m

Subtotal efectivo: 1:13 h

https://github.com/Xfighter32/Sistema-Banco-Proyecto-de-Bases-de-datos-I-/tree/64eb1734a2ab5a9e981b043e3cca4efe0b4bbe68/Mockups

Se corrige el stored procedure de inserción de un beneficiario. Hora Inicio: 4:49 p.m
Se busca información sobre el funcionamiento de SqlDataAdapter
Se busca infromación sobre la diferencia entre ViewBag, ViewData, y TempData.
Se busca información sobre el funcionamiento de Session.
Se modifica el código de login.

Hora final: 9:34 p.m

Subtotal efectivo: 2:30 h

Se recibe el error -100014 al trabajar con el sp para ingresar un beneficiario constantemente y no se sabe por qué aún.



Total de horas del día: 3:43 h

viernes, 27 de septiembre de 2019

Correcciones de la primera tarea programada


27 de setiembre del 2019

Hora de inicio: 7:49 p.m

Se empieza por corregir la funcionalidad de ingresar un beneficiario nuevo.
  • Se creo un SP para obtener la suma de porcentajes de los beneficiarios de una cuenta. 8:05 p.m
  • Se busca en videos de YouTube para retomar la creación de CRUD en ASP.NET MVC sin el uso de EntitySet Framework. 8:14 p.m
Hora Final 9:13 p.m





martes, 24 de septiembre de 2019

Primera reunión II Tarea programada


Nos reunimos para establecer metas claras que se deben resolver para completar lo que hizo falta de la primera tarea programada. Una vez hecho esto, planteamos algunas pautas generales para el desarrollo de la segunda parte. Tenemos como meta cumplir con la corrección de la primera parte antes del domingo 29 de setiembre para tener suficiente tiempo para implementar lo solicitado en la segunda parte. A continuación se muestra una imagen con los puntos abordados en la reunión.


Acordamos que de forma preliminar Austin se dedicaría a arreglar la conexión entre la capa lógica y la capa física y que Anthony se centraría en corregir el stored procedure de actualizar beneficiario siguiendo las puntos discutidos en la reunión.

Finalmente, se decidió crear un repositorio en Github para mantener un control de versiones ordenado que refleje el progreso en el proyecto. https://github.com/Xfighter32/Sistema-Banco-Proyecto-de-Bases-de-datos-I-



Horas: 1:15 



lunes, 16 de septiembre de 2019

Resumen y autoevaluación

A pesar de que esta primera parte del proyecto no está completa y no cumple con todos los requisitos, trajo consigo mucho aprendizaje en diferentes aspectos. Procedo a enumerar y describir puntualmente cuáles fueron estos aspectos a nivel personal.

  • Administración del tiempo
Es evidente que no hubo una planificación clara desde el principio. Se mantuvo una actitud "investigativa" la mayor parte del tiempo justificado en el hecho de que se tenía que aprender nuevos lenguajes y nuevos entornos de programación (SQL, C#, Microsoft SQL Server Management Studio, Visual Studio, ASP.NET MVC). Sin embargo, de este modo se postergó un verdadero desarrollo del proyecto. Además al principio las primeras interacciones con el proyecto fueron esporádicas, de 2 efectivas horas cuando mucho. A este punto también le asocio el hecho de que muchas veces sucede que uno se traba en aspectos específicos de la implementación del lenguaje de programación, no necesariamente en la lógica, y descubrir las respuestas puede llevar muchas horas de consultas en internet. Tal vez esto se puede erradicar mejor si simplemente se pregunta en el grupo de WhatsApp. Las entradas a esta bitácora también van incluidas en este aspecto, muchas veces pasó que se trabajó todo un día y no se tomó apunte de lo que se estaba haciendo entonces ahora es muy difícil ver el desarrollo del proyecto y las horas trabajadas. En todo caso, el resultado fue de esperar, se empezó tarde tarde el desarrollo del proyecto y el progreso era lento pero seguro, de modo que al final no se completó cómo se habría deseado.
  • Conocimientos sobre SQL, C#/ASP.NET MVC y XML
Los conocimientos adquiridos en este periodo fueron muchos, considero que tengo una noción básica de las principales funcionalidad de lenguaje SQL y puedo trabajar con cierto grado de confianza en el entorno de Microsoft SQL Server Management Studio administrando tablas y stored procedures sencillos. Por otra parte, con el lenguaje C# y ASP.NET tengo una noción general de cómo funciona el patrón Modelo-Vista-Controlador y la integración entre código C# y documentos HTML y puedo hacer formularios simples basados en modelos de datos y vistas sencillas ayudado del layout predefinido en el proyecto ASP.NET Web Application con MVC. Si bien aún me falta mucho por aprender en ambos campos, sé mucho más de lo que creía que aprendería solo con esta primera parte. Finalmente, con respecto a XML no sabía mucho más que el hecho de eran tipos de archivo que se usaban en la transferencia de datos. Con este proyecto tuve mi primera introducción a estos archivos y considero que entendí bastante bien cómo manipularlos a través de scripts en SQL para hacer una población de datos en una base de datos.
  • Comunicación, liderazgo y trabajo en equipo
Al principio, durante la primera semana no tenía pareja de grupo y eventualmente en una interacción por medio del grupo de WhatsApp del curso llegué a formar un grupo con el compañero Anthony. Para ser honesto el trabajo en equipo en esta primera etapa del proyecto fue muy deficiente, solamente en una ocasión logramos reunirnos presencialmente para trabajar en el proyecto (20 de agosto) y el resto de nuestras interacciones fueron por medio de WhatsApp. En un principio con el desarrollo del modelo conceptual y modelo físico de la base de datos había más cooperación mutua, durante este periodo discutimos sobre el modelo, generábamos versiones y realizamos consultas con el profesor. Luego hubo algunos momentos en los que teníamos problemas con el uso de Management Studio y la creación de bases de datos a partir de los script autogenerados por el sistema (para compartir nuestros diseños de base de datos). Luego con la llegada de setiembre se complicó el más el asunto. En algunas ocasiones el compañero no podía trabajar por algún examen importante o algún otro motivo académico y mientras tanto yo trataba de avanzar lo más que podía desde la parte de ASP.NET MVC mientras que también tenía que ocuparme de mis otras obligaciones. Al fin y al cabo, no se presentó el mejor ambiente de trabajo y ambos pudimos haberlo hecho mucho mejor. Durante los últimos días antes de la entrega intenté hacer todo lo posible por completarlo solo, pero no fue suficiente. 

A manera de conclusión de este fracaso en la entrega completa del trabajo se aprende, de la forma difícil, que es indispensable plantear un plan de trabajo concreto y con fechas límite manejadas a nivel interno para asegurar el avance continuo del proyecto y que no se estanque. Además de un trabajo en equipo bien organizado y justamente distribuido. Por el lado positivo, ya se tiene una base importante sobre los lenguajes y entornos que serán usado para la segunda etapa de la tarea programada por lo que puede haber una mayor concentración en el desarrollo que en la investigación.

 Se estima que el número total de horas trabajadas, incluyendo desarrollo, investigación y demás fue de 50 horas.

domingo, 15 de septiembre de 2019

El día sábado 14 de setiembre que algunos de los datos que venían en el XML debía ser validados. Por ejemplo, existían 2 beneficiarios asociados a una cuenta que tenían ambos un 100% de beneficio, incumpliendo la restricción de que suma de todos los porcentajes debe ser menor o igual al 100. Entonces se procedió a investigar cómo filtrar los datos importados desde los XML. Primero se empezó investigando el uso de XQuery para hacer las llamadas XML con ciertos parámetros que permitieran seleccionar solo los campos con las condiciones requeridas pero no hubo mucho fruto, aunque es posible que sí se pueda resolver de ese modo. A la mañana siguiente, se investigó nuevamente el problema y se encontró un video donde se hace un GRUOP BY de un SELECT de los id de una tabla usando la función agregada SUM(<columna>). Con este comando vi la posibilidad de agrupar los campos de la tabla beneficiario por ID según la suma de sus campos porcentaje y ver si exceden el 100%. Esto dio resultados:


También se descubrió que se puede usar la función agregada CONT(<columna>) para verificar que el número de beneficiarios no excede los 3 requeridos como máximo 



Sin embargo para filtrar los datos aún no se sabe cómo hacerlo. Después de investigar por otra hora se descubrió la instrucciones HAVING, que se creó porque no se puede usar funciones agregadas como SUM() en una directiva WHERE. En esta imagen se ve cómo se logra obtener solo los números de cuenta del xml que tienen una suma de porcentaje menor o igual a 100. Esta referencia fue útil https://www.w3schools.com/sql/sql_having.asp


Aquí hubo un lapso de tiempo en el que no se actualizó más el blog, se reconoce el error. Pero al final sí se logró resolver el problema. Después de todo ni siquiera existía porque en una consulta al grupo/foro de WhatsApp del curso se vio que había un archivo más reciente que corregía el error que requería la validación.
























viernes, 6 de septiembre de 2019

Conexión entre ASP.NET y BD SQL Server, dudas sobre modelo físico y desarrollo de SP

Durante la mañana del día 06 de setiembre se investigó sobre maneras de conectar la base de datos creada en SQL server con la aplicación web en ASP.NET MVC. Inicialmente se descubrió que se puede hacer un proyecto SQL Server dentro de Visual Studio, crear la base de datos desde ahí, realizar en el controlador tanto un modelo de datos para recibir la información de las tablas de la BD y un modelo de vista para controlar su visualización y validar su formato. En el siguiente video se muestra dicho proceso: https://www.youtube.com/watch?v=bIiEv__QNxw y la parte de la conexión con la base de datos comienza alrededor del minuto 33:12.

Luego en otro videotutorial se descubrió que otra manera de hacer la conexión es por medio de un Entity Framework donde si ya se tiene una base de datos previamente creada, se puede utilizar esta funcionalidad de Visual Studio para realizar clases modelo en Visual Studio de las tablas en la base de datos y luego se hace una modelo de vista para mostrar los datos de la tablas en el sitio web. Este mecanismo es más automático que el anterior. En este video se aprendió sobre esta funcionalidad: https://www.youtube.com/watch?v=UrHKfCCncHQ

Viendo estos videos y probando el código que mostraban se duró unas 2 horas.

También durante la mañana hubo una conversación con el profesor tanto sobre el modelo conceptual como el físico de la base de datos. Las cuestiones tratados incluyeron: 

  1. Que la clase de moneda tenía que ir asociada a la clase tipo_cuenta y no a la clase cuenta
  2. Que no hacía falta una tabla intermedia entre la clase movimientos y estados de cuenta, que con una referencia era suficiente.
  3. Que la clase cuentas_objetivo no era necesaria para la primera tarea programada.
  4. Existían varias dudas sobre cómo debían ser las relaciones a nivel físico entre las tablas cuenta, estado_cuenta y movimiento. Por lo cual se acordó una reunión vía Skype con el profesor para atender la duda. Alrededor de las 4:30 el integrante Austin Hakanson se comunicó con el profesor durante unos 10 minutos. Al final de la conversación se concluyó que tanto la clase movimiento como la clase estado_cuenta son débiles con respecto a la clase cuenta y que debían estar relacionadas por medio de una referencia. También tenía que existir una referencia entre estados_cuenta y movimientos. También se aclaró que los FK tiene que ir siempre del lado n en una relación 1..n o n..1. Esta es una imagen del diagrama físico que se fue haciendo durante la conversación:

Finalmente, durante la noche se estuvo trabajando con los stored procederes y los llenados de prueba de la base de datos. Conversando con un compañero de apartamento que ya llevó el curso de BD con el profesor Franco me consultó sobre unos archivos XML para cargar la base de datos, él me mostró cómo lo hizo él y me prestó el código para probarlo con nuestra base de datos, se modificaron las variables, los parámetros y las direcciones de archivo tanto en el script SQL como en el archivo XML y se pudo cargar con éxito datos a la tabla estado_cuenta. 

Script SQL para leer de un archivo XML
Archivo XML con datos de prueba para llenar la tabla Estado_Cuenta
Se consultó en el grupo para saber si dichos archivos ya existían pero aún faltaba un poco para terminarlos. Seguidamente se inició el desarrollo del stored procedure para la selección de todos los estados de cuenta, como un prueba de stored procederes. 

Tiempo estimado de trabajo total: 3:30 




miércoles, 4 de septiembre de 2019

Notas del día sobre el desarrollo de la app en ASP.NET MVC

Después de varios días de búsqueda se encontró un video muy completo que dice mostrar cómo realizar una aplicación ASP.NET con MVC 5 con un formulario para recibir datos de un usuario, enviarlos a una base de datos SQL Server y luego poder solicitar los datos nuevamente y mostrarlos en la página web. La dinámica de este tutoría pareció ser muy adecuada para aprender sobre esta tecnología en función con lo que requiere la tarea programada. Este es el enlace al tutorial: https://www.youtube.com/watch?v=bIiEv__QNxw&t=565s


En el tutorial primero se crea una Librería de clases (.Net Framwork) para manejar todo lo relativo al acceso de datos. Seguidamente se crea un proyecto de base de datos SQL Server para crear la base de datos en Visual Studio, sin embargo, ya tenemos la base de datos posteriormente buscaremos como simplemente conectarla para aprovechar el trabajo ya realizado. 


Luego se crea un archivo en la carpeta modelo para el usuario, en nuestro caso se ha llamado cliente con el fin de hacer un formulario de registro de clientes al banco. En este modelo se ingresan todas las propiedades que se van a querer obtener obtener de un usuario (Nombre, Documento de Identididad, Tipo de cuenta, etc). 

Seguidamente en el controlador de Inicio que se crea por defecto se crea una Acción la cual despliega una vista con el mismo nombre. Para el inicio de sesión creo la acción en el controlador y se le añadió una vista utilizando un template llamado "Create" que genera un código base cshtml de un formulario de ingreso de datos tomando como modelo el Modelo Dueño creado previamente. 


Recorriendo el código generado se observa que se selecciona un modelo en la primera instrucción, luego se le da una título a la página, luego también se ingresa el título en HTML. Luego viene la instrucción Html.BeginForm() que es donde empieza la generación del formulario. Primero se asigna un AntiForgeryToken() es una función que se encarga de evitar ataques de tipo CRSF (Cross-site Requests forgery). Seguidamente se genera una división en el HTML de tipo "fore-horizontal" que va a tener varias divisiones de la clase "fore-group" que representan campos de ingreso de datos para los atributos indicados en el modelo Dueño. En cada uno de estos grupos se incluye un Html.Label para mostrar una etiqueta en el campo de ingreso, un Html.EditorFor que corresponde al campo de ingreso en sí y un Html.ValidateMessageFor que muestra un mensaje en caso de que haya un error en el ingreso de datos. Por ejemplo, si una campo es obligatorio, este método se encarga de mostrar dicho mensaje debajo del campo respectivo.

También como se puede observar en este layout para el Inicio de Sesión hay una combinación de código en HTML y en C# por medio de la sintaxis de la tecnología Razor. Esto permite hacer modificaciones a la página más fácilmente sin tener que lidiar con código en HTML.

Luego se empezaron a agregar nuevas características a las propiedades del modelo para hacer un formulario más completo con validaciones en el ingreso de los datos. 



Seguidamente se creó otra acción en el Controlador de Inicio para recibir los datos del formulario usando la característica [HttpPost] en un método de acción del mismo nombre que la acción de InicioSesión. De modo que en esta acción del controlador se manejará la recepción de los datos. Aquí se vuelven a validar los datos nuevamente, por mayor seguridad, y si todo funcionó correctamente se redirije el usuario a la página de inicio.

21

Horas trabajadas: 2