viernes, 7 de octubre de 2011

Simple ABM (CRUD) de una tabla con WebMatrix

En el siguiente post se detallara como armar un ABM (pantallas de alta, baja y modificación) de una tabla simple (en este caso la tabla de provincias) utilizando JQuery en la plataforma WebMatrix.
El resultado sera algo como esto:


Vista de datos




Agregar nuevo dato


Modificar Dato


Lo primero que debemos hacer es descargar JQuery UI (en este ejemplo utilizaremos la versión 1.8.4)

Este ejemplo esta armado sobre una tabla de provincias llamada Provincias con  los siguientes campos:
  • ProvinciaId
  • Nombre

En el HEAD del archivo _SiteLayout.cshtml debemos agregar las siguientes lineas para referenciar a JQuery

<link type="text/css" href="@Href("~/Styles/jquery-ui-1.8.4.custom.css")" rel="stylesheet" />
        <link type="text/css" href="@Href("~/Styles/Site.css")" rel="stylesheet" />
        <script type="text/javascript" src="@Href("~/Scripts/jquery-1.4.2.min.js")"></script>
        <script type="text/javascript" src="@Href("~/Scripts/jquery-ui-1.8.4.custom.min.js")"></script>


Para armar el ABM utilizaremos:
  • Una página “maestra” de provincias, que incluirá una vista parcial (partial view) con la grilla de las provincias y un botón para crear un nuevo elemento.
  • La vista parcial: es la encargada de leer la tabla de provincias y mostrarla. Además mostrara los links de editar y eliminar.
  • Métodos de tratamiento de datos. Son tres páginas CSHTML que solo contienen código para procesar diferentes solicitudes:
    • Agregar nievo elemento.
    • Modificar un elemento.
    • Eliminar un elemento.
Archivos:
Método de alta de provincias AgregarProvincia.cshtml
@{
    bool bOk = true;
    string sError = "";
    var url = Request.Url.ToString();
    if (url.Contains("?Nombre"))
    {
        var db = Database.Open("database");
        string nombre = url.Substring(url.IndexOf('?') + 8);
        if (nombre != "") {
            var provincia = db.QuerySingle("SELECT * FROM Provincias WHERE Nombre like @0", nombre);
            if (provincia == null) {
                db.Execute("INSERT INTO Provincias (Nombre) VALUES (@0)", nombre);
            }
            else {
                bOk = false;
                //sError = "La provincia ya existe.";
                sError = "1";
            }
        }
        else {
            bOk = false;
            sError = "2";
        }
    }
    else {
        bOk = false;
        sError = "2";
    }

}

@if (bOk)
{
    @:<script languaje="JavaScript">location.href='/Administracion/Provincias/ProvinciasJQ.cshtml';</script>
} else if (sError == "1"){
    @:<script languaje="JavaScript">alert("Error: La provincia ya existe." );location.href='/Administracion/Provincias/ProvinciasJQ.cshtml';</script>
} else if (sError == "2") {
    @:<script languaje="JavaScript">alert("Error: Debe ingresar un nombre para la provincia." );location.href='/Administracion/Provincias/ProvinciasJQ.cshtml';</script>
}


Obtiene por parámetro de la url el nombre a insertar y realiza reglas de negocios antes de hacerlo. Si da algún error muestra en alert y vuelve a la página que lo llamo.


Método de edición de provincia EditarProvincia.cshtml

@{
    bool bOk = true;
    string sError = "";
    var url = Request.Url.ToString();
    if (url.Contains("?Nombre"))
    {
        var db = Database.Open("database");
  
        string nombre = Request.QueryString["Nombre"];
        string id = Request.QueryString["Id"];
  
        //nombre = nombre.Substring(0, url.IndexOf('&'));
        if (nombre != "" && id != "") {
            var provincia = db.QuerySingle("SELECT * FROM Provincias WHERE Nombre like @0", nombre);  
            if (provincia == null) {
                db.Execute("UPDATE Provincias SET Nombre = (@0) WHERE ProvinciaId = (@1)", nombre, id);
            }
            else {
                bOk = false;
                //sError = "La provincia ya existe.";
                sError = "1";
            }
        }
        else {
            bOk = false;
            sError = "2";
        }
    }
    else {
        bOk = false;
        sError = "2";
    }

}

@if (bOk)
{
    @:<script languaje="JavaScript">location.href='/Administracion/Provincias/ProvinciasJQ.cshtml';</script>
} else if (sError == "1"){
    @:<script languaje="JavaScript">alert("Error: La provincia ya existe." );location.href='/Administracion/Provincias/ProvinciasJQ.cshtml';</script>
} else if (sError == "2") {
    @:<script languaje="JavaScript">alert("Error: Debe ingresar un nombre para la provincia." );location.href='/Administracion/Provincias/ProvinciasJQ.cshtml';</script>

Obtiene por parámetro de la url el nombre y el id de la provincia a modificar y realiza reglas de negocios antes de hacerlo. Si da algún error muestra en alert y vuelve a la página que lo llamo.


Método de eliminación de provincia EliminarProvincia.cshtml

@{
    // Valida si se tiene que eliminar un registro
    var url = Request.Url.ToString(); 
    if (url.Contains("?Eliminar"))
    {
        var db = Database.Open("database");
        string id = url.Substring(url.IndexOf('?') + 10);
        db.Execute("DELETE FROM Provincias WHERE ProvinciaId = @0", id);     
    } 
}

<script languaje="JavaScript">location.href='/Administracion/Provincias/ProvinciasJQ.cshtml';</script>

Obtiene por parámetro de la url el id de la provincia a eliminar y si existe lo elimina. Luego vuelve a la página que lo llamo.


Partial View ProvinciasGrid.cshtml


@{
    var db = Database.Open("database");
    var selectQueryString = "SELECT * FROM Provincias";
    var data = db.Query(selectQueryString);
    var grid = new WebGrid(source: data,
                           defaultSort: "Nombre",
                           rowsPerPage: 10);
}

<fieldset>
    <legend>Listado de Provincias</legend>
    <div id="grid">
        @grid.GetHtml(tableStyle: "ui-widget ui-widget-content",
                    headerStyle : "ui-widget-header",
            columns: grid.Columns(
                    grid.Column(header: "Accionnes",
                        format:
                        @<text><a href="../../Methods/Provincias/EliminarProvincia.cshtml?Eliminar=@item.ProvinciaId">(Eliminar)</a>
                               <a href="#" onclick="mostrarEdicion('@item.ProvinciaId', '@item.Nombre')">(Editar)</a></text>),
                    grid.Column("ProvinciaId", "Id"),
                    grid.Column("Nombre", "Provincia")
            )
        )
    </div>  
</fieldset>

Básicamente lee todos los registros de la tabla de provincias y los muestra en una grilla. Además agrega dos links. Uno para eliminar, que llama al método EliminarProvincia con un parámetro que es el id de la provincia a eliminar. El otro link es el de editar y llama a una función de javascript que estará en la página principal de las provincias.


Página principal de provincias Provincias.cshtml


@{
    // Set the layout page and page title
    Layout = "~/_SiteLayout.cshtml";
    Page.Title = "Tabla de Provincias";   
}

    <script type="text/javascript">
        $(function() {
            $('#dialog-form').dialog({
                autoOpen : false,
                modal: true,
                height: 160,
        width: 475,
                buttons: {
                    'Agregar' : function(){
                        $.ajax({
                            type: "POST",
                            url: $("#add-book-form").attr('action'),
                            data: $("#add-book-form").serialize(),
                            dataType: "text/plain",
                            success: function(response) {
                                $('#dialog-form').dialog('close');
                                location.href = "../../Methods/Provincias/AgregarProvincia.cshtml?Nombre=" + $("#nombre").val();
                            },
                            error: function(response) {
                                alert(response);
                                $('#dialog-form').dialog('close');
                            }
                        });
                    },
                    Cancelar: function() {
                        $('#dialog-form').dialog('close');
    }
                }
            });
                   
            $('#dialog-form-edit').dialog({
                autoOpen : false,
                modal: true,
                height: 200,
        width: 475,
                buttons: {
                    'Aceptar' : function(){
                        $.ajax({
                            type: "POST",
                            url: $("#add-book-form").attr('action'),
                            data: $("#add-book-form").serialize(),
                            dataType: "text/plain",
                            success: function(response) {
                                $('#dialog-form').dialog('close');
                                location.href = "../../Methods/Provincias/EditarProvincia.cshtml?Nombre=" + $("#nombreEdit").val() + "&Id=" + $("#IdProv").val();
                            },
                            error: function(response) {
                                alert(response);
                                $('#dialog-form-edit').dialog('close');
                            }
                        });
                    },
                    Cancelar: function() {
                        $('#dialog-form-edit').dialog('close');
    }
                }
            });

            $('#nueva-provincia')
                .button().click(function() {
                    $('#dialog-form').dialog('open');
                });              
               
        });
       
        function mostrarEdicion(id, descripcion){
            $('#IdProv').val(id);
            $('#nombreEdit').val(descripcion);
            $('#dialog-form-edit').dialog('open');
        }
       
        </script>
   
    <div id="grid" class="ui-widget">
        @RenderPage("~/Partials/ProvinciasGrid.cshtml")
    </div>
   
    <div id="dialog-form" title="Agregar nueva provincia">
        <div class="row">
            <span class="label"><label for="nombre">Nombre:</label></span>
            <input type="text" name="nombre" id="nombre" size="40" />
        </div>
    </div>

    <div id="dialog-form-edit" title="Editar provincia">
        <div class="row">
            <span class="label"><label for="nombre">ID:</label></span>
            <input type="text" disabled="disabled" name="IdProv" id="IdProv" size="5" />
            <br/>
            <span class="label"><label for="nombre">Nombre:</label></span>
            <input type="text" name="nombreEdit" id="nombreEdit" size="40" />
        </div>
    </div>   
   
    <p><button id="nueva-provincia">Agregar nueva provincia</button></p> 


Esta página cuenta con dos div que serán las pantallas de creación y modificación de datos: dialog form y dialog form edit. Mediante JQuery se arma las respectivas pantallas y las acciones a realizar en cada una. Cada pantalla llamara al método que le corresponda, mencionado anteriormente. 


Espero que sea de ayuda. Cualquier duda pueden comentar y con gusto, si es que puedo, se las aclarare.

miércoles, 21 de septiembre de 2011

Microsoft WebMatrix



WebMatrix es una nueva herramienta de desarrollo web gratuita que hace que sea más fácil crear, personalizar y publicar un sitio web.

En WebMatrix se pueden crear aplicaciones web desde cero utilizando bases de datos y el motor de vista Razor.
Si bien el IDE de la aplicación no se compara con la herramienta Visual Studio, es bastante amigable e intuitivo, sin demasiadas opciones y fácil de usar. Tal vez el punto mas flojo es la falta de intelisence en el sector del código c# dentro de la pagina cshtml.

Lo mas destacado de esta herramienta es que tiene todo lo necesario para desarrollar un sitio, sin requerir grandes recursos:

  • Cuenta con IIS para poder correr el sitio.
  • Se puede administrar la base de datos.
  • Permite la edición de las paginas del sitio.

Recursos Online

La siguiante lista contiene informacion util para programadores sobre la herramienta:

sábado, 16 de octubre de 2010

Error al instalar visual studio lightswitch - Silverlight


Microsoft Visual Studio LightSwitch es una herramienta para crear aplicaciones de calidad empresarial-profesional para el escritorio, la web, y la nube. LightSwitch es una nueva adición a la familia de Visual Studio.

Mas adelante iré posteando todo lo relacionado a esta nueva herramienta de Microsoft, por ahora beta...

Pero antes que nada, quiero mostrarles la solución al problema que se me presento al querer instalarla.
Luego de varios pasos de la instalación, surgió un error al querer instalar Silverlight 4. Para solucionar esto hay que desinstalar la versión que tengamos de silverlight e instalar la versión DSK que se encuentra en la carpeta "WCU\Silverlight" del cd de instalación. Luego de esto debemos proceder con la instalación.

Como les comente, mas adelante posteare como trabajar con esta nueva herramienta.

miércoles, 14 de abril de 2010

Acceso a datos SQL Express y C#

En el presente post les mostrare como acceder a una base de datos SQL Express (gratuita) mediante una aplicación de Windows con C#.

Pueden descargar la aplicacion desde: http://www.megaupload.com/?d=JHUFC14H

Requisitos de Software:

Una vez que tengamos andando SQL Express, hay que correr los scripts "BaseEjemplo.sql" y luego "TablaEjemplo.sql".


En la solucion encontraremos una carpeta llamada "AccesoDatos", en esta carpeta se encuentran las clases "BaseDatos.cs" y "BaseDatosException.cs".
La clase "BaseDatos.cs" contiene todo el manejo de datos, lo cual crea una abstracción la misma.

El formulario Form1 contiene todos los metodos de accesos: alta, modificacion y baja.


La aplicacion de ejemplo esta desarrollada en tres capas:

  • Acceso a datos (carpeta AccesoDatos)
  • Negocios (carpeta )
  • Presentacion (en este caso se dejo en el directorio principal de la aplicacion, pero se puede armar una carpeta con todos los formularios o incluso un proyecto.)

martes, 13 de abril de 2010

HP reduce los chips a escala atómica


Hewlett-Packard (HP) anunció avances en el diseño de un nuevo tipo de interruptores que podría reducir los chips a escala atómica, sustituyendo a los transistores actuales, fabricados con materiales semiconductores, y que permitiría fabricar equipos más eficientes y veloces.

Ésto sería posible gracias al memristor o reóstato de memoria, un elemento de circuito pasivo concebido en 1971 por el ingeniero Leon Chua, de la Universidad de California, pero que no fue construído hasta 37 años después. Un hito logrado por científicos de la firma tecnológica HP, que contaron la experiencia a la revista Nature en abril de 2008.

Los instrumentos fueron llamados así por su habilidad de “recordar” el monto de la carga que fluyó a través de ellos una vez que se desconecta la corriente. Esto quiere decir que sirven para construir memoria y capacidad de almacenamiento en los equipos, una aplicación que de acuerdo a Stan Williams, investigador de HP, podría estar en el mercado antes de tres años.

Además, los ‘memristors’ son más simples que los transistores de los semicondutores actuales, pueden almacenar información, incluso sin electricidad y se pueden utilizar tanto para el procesamiento de datos como para aplicaciones de almacenamiento.

Hoy, esas funciones se realizan en dos instrumentos separados, lo que quiere decir que los datos deben ser transferidos entre los dos, haciendo más lento el proceso de cómputo y gastando energía.

El procesador y la memoria podrían ser exactamente la misma cosa“, le dijo a la BBC Williams. “Eso nos permite pensar distinto acerca de cómo se hace la computación”.

Según el profesor Leon Chua, el primero en proponer los memristores, el trabajo era “conceptualmente, apenas la punta del iceberg”. “En el futuro cercano podremos usar los memristores para fabricar computadoras verdaderamente parecidas a cerebros“, señaló.

Desde que hace dos años se anunciaron los trabajos, el equipo de investigadores de HP fue capaz de incrementar la velocidad de los dispositivos para igualarlos a los transistores de silicio actuales, y probarlos en un laboratorio.

Esto indica que ahora sería posible considerar la existencia de chips basados en ‘memristors’ como una alternativa a las memorias flash basadas en transistores que se utilizan en dispositivos de consumo como reproductores MP3, portátiles o cámaras digitales.


[Fuente: RedUsers]

jueves, 1 de abril de 2010

Creando una aplicacion windows desde cero

Bueno, lo que vamos a hacer es crear una nueva aplicacion de Windows Form (en c# con VS 2008) utilizando MDI (ventanas padres e hijos para ordenar el proyecto).

Lo primero que debemos hacer es abrir el Visual Studio ir a File->New->Proyect.
Aqui seleccionamos Windows C# y luego Windows Forms Apication. Esto nos creara una solucion con un formulario llamado Form1.


Luego crearemos otro formulario: hacemos clic sobre el nombre de la solucion: Add->Windows Form, a este nuevo formulario lo llamamos "frmPrincipal".


Modificamos las propiedades del formulario:

  • Start Position: CenterScreen.
  • IsMidContainer: True (esto indica que sera el contenedor de todos los nuevos formularios que se abran)

  • WindowsState: maximized.
Luego agregaremos un menú al formulario: el la Toolbox desplegamos "Menu & Toolbars" y arrastramos MenuStrip al formulario. Aquí podremos agregar todos los menus de nuestro sistema, y haciendo doble clic en un menú, nos habre el código del mismo.


Agregamos un nuevo menú llamado "Ventanas" y en las propiedades del menuStrip, en MDIWindowsListItem seleccionamos este nuevo menú, esto le indica al menú que muestre todas las ventanas abiertas en este item del menú.

Renombramos el form1 a "frmLogo"
Ahora agregamos un menu nuevo que "Logo" y en el código escribimos:
frmLogo fLogo= new frmLogo();
fLogo.MdiParent = this;
fLogo.Show();
Esto nos abrirá el formulario logo en el mismo contenedor.

Ahora debemos configurar la aplicacion para que frmPrincipal sea el que se inicie al abrir la aplicacion, para esto abrimos el archivo Program.cs y donde dice "Application.Run" reemplazamos el nombre "frmLogo" por "frmPrincipal".

Hasta aquí hemos llegado.

Nos vemos en la próxima.

Programando en .NET

Comienzo este blog con fines didácticos, pretendiendo registrar toda mi experiencia y mis conocimientos.
Trabajaremos principalmente con Visual Studio 2008 (.Net Framework 3.5) y bases de datos SQL Server. Crearemos aplicaciones de escritorio y también aplicaciones web.

Los dejo hasta la proxima entrada...