jueves, 31 de marzo de 2016

Aproximar valores en Excel

La fórmula para redondear valores en Excel se llama Redondear y tiene dos (2) argumentos (Parámetros), el valor y la cantidad de dígitos a redondear, por ejemplo: Si redondeamos el valor 13.456 con el parámetro 2 “Redondear (13,456;2)” el resultado será 13.46 y si el número 3 es 13,453 el resultado será 13.45.

El anterior ejemplo nos permite redondear a dos dígitos decimales de cualquier número digitado.  Además, si te fijas, la fórmula aproxima al entero más cercano.

Ahora, si lo que necesitas es redondear los valores enteros a la centésima más cercana, basta con usar números negativos en el segundo parámetro, por ejemplo: Redondear (450.234; -3) Redondea el número a 450.000. Pero, si lo que necesitas es aproximar a la centésima superior, basta con sumarle al valor 500, así: Redondear (450.234 + 500; -3) El resultado será 451.000.

Resumiendo, La función redondear en Excel, al usar el segundo parámetro con números positivos, nos permite redondear los decimales, y al usar números negativos nos permite redondear valores enteros.

En la ilustración 1, podrás ver unos ejemplos y las formulas en Excel, no olvides que el separador de los parámetros de la fórmula depende de la configuración de tu PC; en este caso estoy usando como separador de decimales la coma, separador de miles el punto y separador de listas el punto y coma.



En el enlace a continuación podrás encontrar un ejemplo de uso de la función redondear en un archivo de Excel, el ejemplo usa la función redondear para elaborar un Presupuesto de propiedad horizontal

Para finalizar, les recuerdo:
·         Cada quien tiene su forma 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.
.

viernes, 25 de marzo de 2016

Arquitectura de N Capas: Parte 3 – La Capa de Entidades

Arquitectura de N Capas: Parte 3 – La Capa de Entidades
Ahora que tenemos el proyecto armado y la capa acceso a datos y la de entidades, vamos a separar las entidades que se encuentran dentro del modelo de datos den Entity Framework y colocarlos en un proyecto aparte.
Cuando en la capa de datos creamos el modelo de datos, éste se creó de la siguiente manera:
  • ModelGestion.edmx
  • ModelGestion.Context.cs
  • ModelGestion.Designer.cs
  • ModelGestion.edmx.diagram
  • ModelGestion.tt

Para separar las entidades, trasladamos el archivo ModelGestion.tt de la capa de datos a la capa de entidades, para esto seguimos los siguientes pasos:

  1. Cerrar las ventanas dentro del Visual Studio.
  2. Abrir el explorador de Windows.
  3. Ir a la carpeta de Datos.
  4. Mover el archivo ModelGestion.tt a la carpeta Entidades.
  5. Volver a Visual Studio a la capa de entidades.
  6. Utilizar la opción Show All Files en la capa de presentación para ver el archivo de ModelGestion.tt en la ventana Solution Explorer.
  7. Integrarlo al proyecto mediante la opción de clic derecho Include in Projet .
  8. Abrir el archivo ModelGestion.tt.
  9. Redireccionar, donde está el modelo de datos, de la siguiente manera: conststringinputFile = @"../Datos/ModelGestion.edmx". Lo anterior se hace porque no podemos crearlo mediante: adicionar referencias al proyecto.
  10. Volver a la capa de acceso a datos y eliminar el link roto del archivo ModelGestion.tt .
  11. En el nombre del proyecto de Datos usar clic derecho para incluir la referencia al proyecto Entidades.
  12. Ir a las propiedades del archivo ModelGestion.Context.cs.
  13. En la opción CustomToolNamespace escribir el nombre de la capa de Entidades.
  14. Incluir en la clase de acceso a datos el llamado a Entidades:  using Entidades.
  15. Recompilar la solución.



Las imágenes de los pasos las podrás ver en la Ilustración 1:

Ilustración 1


Ahora que tenemos la capa de entidades agreguemos en ella los metadatos a la entidad Procesos, siguiendo los siguientes pasos:
  1. Agregar al proyecto la referencia a System.ComponentModel.DataAnnotations.
  2. Crear una clase ProcesosMD.cs.
  3. Incluir en la clase:usingSystem.ComponentModel.DataAnnotations.
  4. Volver pública la clase publicclassProcesosMD .
  5. Copiar los atributos de la clase ModelGestion  / Procesos dentro de ProcesosMD .
  6. Adicionar los metadatos.
  7. Al finalizar con la clase ProcesosMD, extendemos las propiedades de la clase

La clase con los metadatos termina así:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel.DataAnnotations;

namespace Entidades
{
    public class ProcesosMD
    {
        [Display(Name = "Id")]
        public int IdProceso { get; set; }

        [Display(Name = "Nombre Proceso")]
        [Required(ErrorMessage = "Campo requerido")]
        public string NombreProceso { get; set; }

        [Display(Name = "Versión")]
        [Required(ErrorMessage = "Campo requerido")]
        public string Version { get; set; }

        [Display(Name = "Fecha de Creación")]
        [Required(ErrorMessage = "Campo requerido")]
        [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}")] //Formato de la fecha
        public System.DateTime FechaCreacion { get; set; }
    }

    [MetadataType(typeof(ProcesosMD))]
    public partial class Procesos
    {
    }
}

Algunos de los metadatos que me han sido útiles los puedes encontrar a continuación:
[DisplayName("Nombre del atributo")]
[Required(ErrorMessage = "Campo requerido")]
[MaxLength(50, ErrorMessage = "Máximo 50 caracteres")]
[StringLength(50, ErrorMessage = "Máximo 50 caracteres")]
[RegularExpression(@"[a-zA-ZñÑ\s]{2,50}", ErrorMessage = "Solo letras")]
[RegularExpression("^[0-9]*$", ErrorMessage = "Solo números")]
[Range(0, 999, ErrorMessage = "Máximo tres números")]
[Range(1000000000, 9999999999, ErrorMessage = "10 números")]
[DataType(DataType.Date)] //Fecha
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}")] //Formato de la fecha
[DataType(DataType.Url)]
[DataType(DataType.EmailAddress)]


Aquí finalizamos el ejemplo de la capa de Entidades, la cual nos facilita el transporte de los datos entre las demás capas del modelo; recuerden agregar los metadatos a todas las entidades que lo necesite. Así mismo, es mejor hacerlo en archivos separados que agregarlos a la entidad, por la sencilla razón que si hay que cambiar el modelo de datos agregando una propiedad adicional que casi nunca ocurre (Broma), no perderíamos el trabajo elaborado.
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.

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.


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 ...