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
sábado, 28 de septiembre de 2019
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.
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
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
- Conocimientos sobre SQL, C#/ASP.NET MVC y XML
- Comunicación, liderazgo y trabajo en equipo
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.
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:
- Que la clase de moneda tenía que ir asociada a la clase tipo_cuenta y no a la clase cuenta
- Que no hacía falta una tabla intermedia entre la clase movimientos y estados de cuenta, que con una referencia era suficiente.
- Que la clase cuentas_objetivo no era necesaria para la primera tarea programada.
- 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
Suscribirse a:
Comentarios (Atom)