viernes, 25 de marzo de 2016

Arquitectura de N Capas: Parte 2 – La Capa de Acceso a Datos


Ahora que tenemos la base de datos en SQL Server 2014, comenzaremos a crear el aplicativo y sus diferentes capas. Para esto iniciamos una solución y en ella colocamos las capas como proyectos independientes. Para facilitar la elaboración de ésta, primero crearemos todas las capas y luego continuaremos con la capa de acceso a datos.

Para la creación del proyecto uso Visual Studio Community 2015.  Los pasos para crear la solución en capas son los siguientes:
  1. Abrimos Visual Studio Community  2015.
  2. Seleccionamos la opción: New Project.
  3. En el árbol de la izquierda seleccionamos: Visual C#/Windows/Class Library.
  4. En la parte inferior de la ventana, damos el nombre al proyecto y a la solución: Datos/Gestión.
  5. En cada proyecto del tipo “Class Library, Cisual Studio, crea una clase Class1.cs, la cual eliminamos en cada capa.
  6. Sobre el nombre de la solución pulsamos clic y agregamos un nuevo proyecto: Entidades.
  7. Sobre el nombre de la solución pulsamos clic y agregamos un nuevo proyecto: Lógica.
  8. Sobre el proyecto de la solución agregamos la capa de presentación: Web/ASP.NET WenApplication.
  9. Cuando aparece la pantalla New ASP.NET Project – Presentacn, seleccionamos la opción MVC, Addunittests y deshabilitamos Host in cloud.
  10. Pulsamos el botón de ChangeAuthentication y seleccionamos en la ventana No Authentication.



Con los pasos anteriores se arma la solución con 5 proyectos.  En la ilustración 1 podrás apreciar las imágenes con los pasos. Continuemos con la creación de la capa de acceso a datos.

Ilustración 1


En la capa de acceso a datos vamos a usar Entity Framework “EF”, éste es un ORM “Objeto de mapeo relacional”; esta utilidad nos permite a los desarrolladores .NET acceder a una base de datos, consultarla, modificar y guardar información.

El EF nos permite desarrollar aplicaciones más rápido; sin embargo, dependiendo de la complejidad de algunas consultas o ejecución de órdenes sobre una base de datos, a futuro puede que tengas que optimizarlas o convertirlas en procedimientos almacenados.

Para incluir el EF en la capa de acceso a datos vamos a hacer lo siguiente:
  1. Con clic derecho sobre la solución, agregamos la funcionalidad de Entity Framework: ManageNugetPackagesforsolution / Browse / Entity Framework en el proyecto de Datos y Presentación.
  2. Clic aceptando la licencia.
  3. Clic sobre el proyecto de Datos y agregamos un nuevo modelo: Entity Framework: Add / New Item / ADO.NET Entity Data Model.
  4. En el asistente de modelo de datos seleccionamos: EF Designerfromdatabase.
  5. Seleccionamos la fuente de datos: Microsoft SQL Server.
  6. Creamos una nueva conexión
  7. Incluimos las propiedades de la conexión: Servidor de la base de datos usuario, contraseña y seleccionamos la base de datos a usar; antes de cerrar comprobamos la conexión a ésta.
  8. Incluimos los datos de la cadena de conexión.
  9. Le damos un nombre a los datos.
  10. Finalmente, adicionamos las tablas al modelo de datos.


Las imágenes de los pasos para incluir el EF en la capa de Acceso a Datos las puedes visualizar en la Ilustración 2.




Una vez tenemos el EF accediendo a la base de datos, construiremos la clase de acceso a datos, para esto pulsaremos clic derecho sobre el proyecto y agregaremos una clase que llamaremos GestionAD, 

En esta clase vamos a colocar las opciones del CRUD (Create, Read, Update y Delete) a las tablas de la base de datos, más adelante las adecuaremos según las necesidades.

Para los comandos del CRUD vamos a emplear LinQ; a continuación, podrás apreciar el ejemplo del CRUD de la tabla Procesos.

usingSystem;
usingSystem.Collections.Generic;
usingSystem.Data.Entity;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Threading.Tasks;


namespace Datos
{
publicclassGestionAD
    {
GestionEntitiesoDatos = newGestionEntities();

//CRUD De Procesos
#region "CRUD Procesos"
publicList<Procesos>ProcesosConsultar()
        {
var q = from C inoDatos.Procesosselect C;
returnq.ToList();
        }

publicList<Procesos>ProcesosConsultar(Procesos Procesos)
        {
var q = from C inoDatos.ProcesoswhereC.NombreProceso.Contains(Procesos.NombreProceso) select C;
returnq.ToList();
        }

publicList<Procesos>ProcesosConsultarPorID(Procesos Procesos)
        {
var q = from C inoDatos.ProcesoswhereC.IdProceso==Procesos.IdProcesoselect C;
returnq.ToList();
        }

publicProcesosProcesosInsertar(Procesos Procesos)
        {
oDatos.Procesos.Add(Procesos);
oDatos.SaveChanges();
return Procesos;
        }

publicvoidProcesosEliminar(Procesos Procesos)
        {
oDatos.Procesos.Remove(Procesos);
oDatos.SaveChanges();
        }

publicProcesosProcesosActualizar(Procesos Procesos)
        {
oDatos.Entry(Procesos).State = EntityState.Modified;
oDatos.SaveChanges();
return Procesos;
        }
#endregion

    }
}

Personalmente, me gusta agrupar los métodos colocados dentro de la clase con regiones; sin embargo, eso depende de las mejores prácticas de desarrollo del arquitecto donde estás trabajando.

En el artículo de la capa de entidades separaremos las entidades del EF.
Para finalizar les recuerdo:
  • Cada quien tiene su manera de matar pulgas, así que puede haber una gran cantidad de maneras de hacer el mismo trabajo.
  • Estos artículos son ejemplos, así que, si tienes una mejor manera de hacerlo o puedes colaborarme con alguna observación, tu comentario es bienvenido.
  • No asumo ninguna responsabilidad por el uso de lo expuesto.
  • Si los artículos te son de utilidad, no olvides un “Me Gusta” o dejar algún comentario.


jueves, 24 de marzo de 2016

Asp.Net + MVC: Mostrar DatePicker con formato “dd/mm/yyyy”

Al intentar usar un control para mostrar y seleccionar una fecha en formato “dd/MM/yyyy”, logré desplegarlo en ASP.NET pero con algunos problemas, si me funcionaba bien en un navegador, no funcionaba en otros o funcionaba bien en Internet Explorer, pero tenía problemas en Chrome.

Por ejemplo: al momento de mostrar datos lo que hacía era mostraba el formato “dd/mm/aaaa” en vez del dato de fecha.

Después de investigar, esta fue la solución que me funciono:

Descargue de http://jqueryui.com/download/ El archivo
jquery-ui-1.11.4.custom.zip. Extraje y copié a la carpeta “Content” el archivo “jquery-ui.css”

Modifiqué el web.config con la configuración de mi país
<system.web>
<globalization uiCulture="es" culture="es-CO"/>
</system.web>

Instale desde “NuGet” el complemento “jQuery.UI.Combined”

Agregué en el BundleConfig.cs  el llamado a jqueryui

bundles.Add(new ScriptBundle("~/bundles/jqueryui").Include("~/Scripts/jquery-ui-{version}.js"));

Agregué en el BundleConfig.cs en el bundles del css:

,"~/Content/jquery-ui.css"

Agregué el llamado a los bundle en mi clase parcial:
    @Scripts.Render("~/bundles/jquery")
    @Scripts.Render("~/bundles/jqueryui")
    @Scripts.Render("~/bundles/jqueryval")

    @Scripts.Render("~/bundles/bootstrap")

Modifique mi clase parcial agregando el llamado al datepicker:

<script>
        $(document).ready(function () {
            $(".datepicker")
                .attr('type', 'text')
                .datepicker({
                    monthNames: ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"],
                    monthNamesShort: ["Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dic"],
                    dayNames: ['Domingo', 'Lunes', 'Martes', 'Mi&eacute;rcoles', 'Jueves', 'Viernes', 'S&aacute;bado'],
                    dayNamesShort: ['Dom', 'Lun', 'Mar', 'Mi&eacute;', 'Juv', 'Vie', 'S&aacute;b'],
                    dayNamesMin: ['Do', 'Lu', 'Ma', 'Mi', 'Ju', 'Vi', 'S&aacute;'],
                    dateFormat: 'dd/mm/yy',
                    firstDay: 1,
                    prevText: '&#x3c;Ant', prevStatus: '',
                    prevJumpText: '&#x3c;&#x3c;', prevJumpStatus: '',
                    nextText: 'Sig&#x3e;', nextStatus: '',
                    nextJumpText: '&#x3e;&#x3e;', nextJumpStatus: '',
                    currentText: 'Hoy', currentStatus: '',
                    todayText: 'Hoy', todayStatus: '',
                    clearText: '-', clearStatus: '',
                    closeText: 'Cerrar', closeStatus: '',
                    yearStatus: '', monthStatus: '',
                    weekText: 'Sm', weekStatus: '',
                    dayStatus: 'DD d MM',
                    defaultStatus: '',
                    changeYear: true,
                    changeMonth: true,
                    autoShow: true,
                });
        });

    </script>


Cambie LabelFor por  un TextBoxFor así

Antes:
@Html.EditorFor(model => model. FechaCreacion, new { htmlAttributes = new { @class = "form-control" } })

Después

@Html.TextBoxFor(model => model.FechaCreacion, @"{0:dd\/MM\/yyyy}", new { @class = "form-control datepicker" })

Las imágenes de estos pasos las podrás ver a continuación.



El resultado en funcionamiento en los exploradores lo podrás apreciar en el siguiente gráfico:






Para finalizar les recuerdo:

  • Cada quien tiene su manera de matar pulgas, así que puede haber una gran cantidad de maneras de hacer el mismo trabajo.
  • Esto es un ejemplo, así que, si tienes alguna observación, para mejorar el artículo, será bienvenida.
  • No asumo ninguna responsabilidad por el uso de lo aquí explicado.
  • No olvides dejar un comentario.


martes, 22 de marzo de 2016

Arquitectura de N Capas: Parte 1 – La base de datos


Este artículo es el primero de una serie de artículos en que quiero explicar mi visión de la programación por capas.

Ilustración 1
Siendo la programación en capas una arquitectura que tiene como objetivo principal separar la capa de diseño de la de lógica, existen otros valores adicionales que aportan a proyectos grandes entre otros como: el crear un código más estructurado, facilita el trabajo en equipo, permitiendo que varios programadores trabajen paralelamente en una misma funcionalidad sin interferirse mutuamente. También se puede separar algunas de las capas de código en diferentes servidores para balanceo de cargas, buses de datos empresariales, etc.

En la ilustración 1 podrás apreciar el un modelo básico de capas.

A continuación, describiré las herramientas que usaré para elaborar el ejemplo en sus diferentes capas:
  • La base de datos se elabora en SQL Server Express 2014.
  • La capa de acceso a datos la desarrollaré en C#, Entity Framework y Linq.
  • En la capa de entidades separaré la definición de las entidades del Entity Framework y agregaré metadatatos a los atributos.
  • La capa de lógica en C#, como su nombre lo indica, colocaremos la lógica de la aplicación y uso de try/catch.
  • En la capa de presentación usaré MVC, Bootstrap y JQuery.


Empecemos:

Las tablas ejemplo para la base de datos, representan un modelo relacional para almacenar los datos de procesos, procedimientos y diagramas de notación BPMN, los objetos del diagrama como son los eventos, actividades, compuertas y las conexiones entre estos objetos. Uso este ejemplo porque con él se puede representar la mayoría de las estructuras de datos como son: maestro detalle, árboles y grafos. Además, me interesa este tipo de modelos para ampliar el tema con otros artículos más adelante.

Creando la Base de Datos

Comencemos ingresando a SQL Management Studio 2014, después nos ubicamos en el explorador de objetos y en la opción de base de datos pulsamos clic derecho y usamos la opción nueva base de datos, como se ve en la ilustración 2.


Ilustración 2



Una vez seleccionamos la opción de base de datos, el SQL Management Studio 2014 abre una ventana de creación de base de datos, en esta opción debemos darle el nombre a una base de datos y un propietario. Para el Nombre de la base de datos usaremos “Procesos” y el propietario de la base de datos será: “sa”.


Creación del esquema

Una vez creada la base de datos, desplegamos el árbol de la base de datos y nos vamos a seguridad, en seguridad ubicamos el puntero del mouse sobre Esquemas y pulsamos clic derecho y creamos un nuevo esquema. Para el nombre del esquema usaremos “Aplicacion” y Propietario del esquema “dbo”.
Ilustración 3




Creación de las Tablas

Para la creación de las tablas se pulsa clic derecho sobre la opción de la tabla y clic en la opción Tabla, al crear la tabla, no olvidar crear la llave, a la llave volverla un auto numérico “Especificación de identidad” y cambiar el esquema donde vamos a crear la tabla en la Ventana de propiedades, que accedes mediante la tecla rápida F4 o en el menú de ver. En la ilustración 3 se puede apreciar la creación de la tabla procesos.


Ilustración 4


Las tablas del ejemplo quedan así:
·         Procesos: Guarda los procesos de una empresa
·         Procedimientos: Guarda los procedimientos asociados a un proceso.
·         Objetos: Almacena los objetos del procedimiento (Sendas, Eventos, Actividades, Compuertas)
·         Tipos de objetos: Categoriza los objetos de los procedimientos
·         Conexiones; Define los caminos entre los objetos de un procedimiento (Actividades, Compuertas, Eventos).
·         Existe una relación recursiva en la tabla objetos entre los campos IdObjeto y FK_Objeto

Creación de las relaciones

Sigue los pasos que se usaron para crear la tabla procesos en la creación de las otras tablas y una vez estén creadas, procedemos a crear las relaciones entre ellas, esto lo hacemos por la opción de Diagrama en la Base de datos y creamos un nuevo diagrama, en este agregamos todas las tablas, las organizamos y arrastramos la llave primaria a la llave foránea para establecer la relación. Por ejemplo: Arrastramos “Drag and Drop” entre la llave primaria de Procesos “IdProceso” y el campo “IdProceso” en la tabla procedimiento. En la ilustración 5 se puede ver los primeros pasos para la elaboración del diagrama de la base de datos.
Ilustración 5



En la ilustración 6 se ve el modelo del ejemplo ya terminado.

Ilustración 6

Algunos datos de las tablas:
  • Todas las tablas del modelo tienen una llave subrogada o identificador único.
  • Todas las llaves subrogadas son campos enteros.
  • En la tabla de procesos deje un campo Date para posteriormente agregarle metadatos y reglas de validación en la capa de entidades.
  • La relación entre las tablas “Procedimientos y Objetos” y “Objetos y Conexiones” tienen la opción de borrado en cascada activado.
  • Todavía no hay procedimientos almacenados, más adelante haré un ejemplo.
  • Existe una relación recursiva entre IdObjeto y FKObjeto.
  • La relación recursiva de Objetos, representa un árbol.
  • La relación doble Objetos y Conexiones representa un grafo.



El Script para la creación del BD lo puedes descargar aquí.
Si prefieres un backup de la base de datos, se puede descargar aquí.

Arquitectura de N Capas: Parte 2 – La Capa de Acceso a Datos

Para finalizar les recuerdo:

  • Cada quien tiene su manera de matar pulgas, así que puede haber una gran cantidad de maneras de hacer el mismo trabajo. 
  • Esto es un ejemplos, así que, si tienes alguna observación, para mejorar el artículo, será bienvenida. 
  • No asumo ninguna responsabilidad por el uso de lo aquí expuesto. 
  • No olvides dejar un comentario.

viernes, 14 de agosto de 2015

Hacer copias de seguridad y restauraciones por línea de comandos en SQL Server


Hace poco intente restaurar una copia de seguridad en un equipo desde el “Microsoft SQL Server Management Studio” utilizando las opciones del menú, desafortunadamente por permisos o algún problema con el ordenador, no pude hacerlo, así que investigue como hacer la restauración y de paso la copia de seguridad por medio de línea de comandos.
Para copia de seguridad:
BACKUP DATABASE [Nombre base de datos] TO DISK = 'C:\Copias\BaseDeDatos.Bak' WITH init

Para restaurar:
RESTORE DATABASE [Nombre base de datos] FROM DISK = ' C:\Copias\BaseDeDatos.Bak' WITH REPLACE


Espero que esto les sea de utilidad.

viernes, 7 de agosto de 2015

Windows 10: Actualizaciones P2 y el ahorro del ancho de banda



Una de las nuevas funcionalidades de Windows es la distribución de actualizaciones a través de redes P2P, esto quiere decir que Windows puede compartir actualizaciones entre computadores, ahorrándole a la persona que tiene muchos computadores ancho de banda en el momento de compartir las actualizaciones, sin embargo también puede ir en detrimento del ancho de banda si compartes tus actualizaciones a través de la LAN.

Lo anterior debido a que las actualizaciones no solo se comparten de manera predeterminada entre tus equipos, sino también en redes WAN (Internet).

Este vídeo muestra cómo se configura las actualizaciones para que solamente distribuya las actualizaciones a través de nuestros computadores.

La manera de deshabilitar la opción de compartir tus actualizaciones es la siguiente:
Ingresas a la configuración:
  • Clic en notificaciones (Ilustración 1)
  • Clic en abrir todas las configuraciones (Ilustración 2)
  • Clic en Actualización y seguridad (Ilustración 3)
  • Clic en Opciones Avanzadas (Ilustración 4)
  • Clic en Elige el modo de que quieres que se entreguen las actualizaciones (Ilustración 5)
  • Clic en Equipos en la red local y equipos en Internet (Ilustración 6)

Ilustración 1


Ilustración 2
Ilustración 3
Ilustración 4

Ilustración 5

Ilustración 6



Espero que esta ayuda les sea de utilidad, no olviden que estas recomendaciones se distribuyen sin responsabilidad alguna.










martes, 28 de abril de 2015

Copiar el listado de archivos de un directorio (Carpeta) a un archivo texto.


A veces necesitamos copiar el listado de archivos que se encuentra en un directorio o careta a un archivo, por ejemplo cuando necesitamos entregar un DVD con información mediante un memorando o sencillamente cuando necesitamos colocar dentro de una tabla de un documento el listado de archivos.
La manera más rápida que he encontrado es la siguiente:

1.       Creamos un archivo texto en la carpeta donde queremos generar el listado de archivos, por ejemplo Lista.txt
2.       Lo abrimos y escribimos dentro de él la sentencia Dir *.*/b > Lista.csv
3.       Después de guardar cambiamos la extensión del archivo de .txt a .bat.
4.       Pulsamos doble clic sobre el archivo .bat.
5.       Después abrimos el archivo lista.csv  en Excel.

Para cambiar la extensión del archivo texto basta con pulsar clic derecho sobre el archivo e ir a la opción de propiedades.
Para listar los archivos incluyendo sub carpetas se tiene que agregar el comando /s a la sentencia, esta queda así: Dir *.*/b/s > Lista.csv

Una vez más. El uso de esta sentencia es bajo su propia responsabilidad y si te es de utilidad, por favor no olvides regalarme un like al artículo.

miércoles, 8 de abril de 2015

Campo calculado para mostrar la edad en años - SQL Server

Existen muchas maneras fórmulas para calcular la edad, la más sencilla que he encontrado es la de calcular los días de diferencia entre dos fechas y dividirlos entre 365.25 que son los días de un año. Para lo anterior utilizo la función de SQL server DateDiff. A continuación el ejemplo:


set dateformat dmy
Declare @FechaNacimiento as Date = Cast('08/04/2010' as Date)

Select Cast((DATEDIFF(day,@FechaNacimiento , GetDate())/365.25) as int) Edad


Es una formula sencilla pero que me a ayudado mucho. Espero les sirva y si les es de utilidad, no olvides dejar un Like en el artículo.

Entrada destacada

Arquitectura de N-Capas con Visual Studio .NET y AngularJS

Este artículo es el primero de una serie de artículos en que quiero explicar mi visión de la programación por capas. La Arquitectura ...