martes, 23 de noviembre de 2010

Uso de ASPxGridView para Insertar y Actualizar


La suite de controles de Developer Express,  es amplia y nos brinda muchas mejoras en el desarrollo de aplicaciones .NET.   
 El ASPXGridView es un excelente control que nos permitirá de manera fácil,  filtrar, ordenar y paginar nuestros datos,  además de mejorar la presentación.
 El ejemplo que posteo a continuacion realiza el enlace al control por medio de código, además nos facilita la inserción y actualización de datos, sin utilizar el un datasource tipado o enlazado.  Haremos uso de la base de datos Northwind y la tabla Products para el ejemplo.
1.  Agregamos un ASPxGridView  que se llama por defecto:  ASPxGridView1
2. Generamos la carga de datos desde el evento Load del formulario:
Dim dt As New DataTable
Dim da As New SqlDataAdapter("select * from products", _
ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString)
      da.Fill(dt)
      ASPxGridView1.DataSource = dt
      ASPxGridView1.DataBind()
3.  Definiremos las columnas que mostraremos en el grid,  además de otras propiedades. 
Nos permitirá habilitar el popup que mostrara un formulario de captura.
<SettingsEditing Mode="PopupEditForm" PopupEditFormWidth="400px" /> 
Nos permitirá ubicarnos en cada fila
<SettingsBehavior AllowFocusedRow =true />
Dentro de Templates crearemos el Formulario Popup que mostrara los datos seleccionados ademas de poder inserter uno Nuevo.
A Continuación remplazaremos el código que forma el ASPxGridView1 por el siguiente código:
   <dx:ASPxGridView ID="ASPxGridView1" runat="server" KeyFieldName="ProductID"
            AutoGenerateColumns=False>
        <Columns>
                <dx:GridViewCommandColumn VisibleIndex="0">
                        <EditButton Visible="True" />
                        <NewButton Visible="True" />
                  dx:GridViewCommandColumn>
                 
                 
                <dx:GridViewDataTextColumn FieldName="ProductID" VisibleIndex="1">
                dx:GridViewDataTextColumn>
                <dx:GridViewDataTextColumn FieldName="ProductName" VisibleIndex="2">
                dx:GridViewDataTextColumn>
                 
                 
        Columns>
        <SettingsEditing Mode="PopupEditForm" PopupEditFormWidth="400px" />
        <SettingsBehavior AllowFocusedRow =true />
       
        <Templates>
                  <EditForm>
                  <div style="padding:4px 4px 3px 4px">
                         <asp:Label ID="lblProducto" runat=server Text='<%#Eval("ProductID")%>'>asp:Label>
                         <br />
                         Producto: <asp:TextBox ID="txtNombre" Width=300px runat=server Text='<%#Eval("ProductName")%>'>asp:TextBox>
                         <br />
                         Precio: <asp:TextBox ID="txtPrecio" Width=300px runat=server Text='<%#Eval("UnitPrice")%>'>asp:TextBox>
                         <br />
                         Cantidad x Unidad: <asp:TextBox ID="txtCantidad" Width=300px runat=server Text='<%#Eval("QuantityPerUnit")%>'>asp:TextBox>
                        
                        
                  div>
                  <div style="text-align:right; padding:2px 2px 2px 2px">
                        <dx:ASPxGridViewTemplateReplacement ID="Registrar" ReplacementType="EditFormUpdateButton" runat="server">dx:ASPxGridViewTemplateReplacement>
                        <dx:ASPxGridViewTemplateReplacement ID="Cancelar" ReplacementType="EditFormCancelButton" runat="server">dx:ASPxGridViewTemplateReplacement>
                  div>
                  EditForm>
            Templates>
       
    dx:ASPxGridView>

4.  Crearemos los eventos ASPxGridView1_RowInserting y ASPxGridView1_RowUpdating para insertar y actualizar registros.  Nótese que buscaremos cada uno de los controles definidos en la pagina instanciándolos a un objeto en el evento del mismo tipo.   Al final utlizaremos e.Cancel = True para evitar que busque un método de actualización automático que no está implementado, ya que lo estamos haciendo manual.  Agregaremos los dos métodos a continuación:
  Protected Sub ASPxGridView1_RowInserting(ByVal sender As Object, ByVal e As DevExpress.Web.Data.ASPxDataInsertingEventArgs) Handles ASPxGridView1.RowInserting

        Dim lblProducto As Label = TryCast(ASPxGridView1.FindEditFormTemplateControl("lblProducto"), Label)

        Dim txtNombre As TextBox = TryCast(ASPxGridView1.FindEditFormTemplateControl("txtNombre"), TextBox)
        Dim txtPrecio As TextBox = TryCast(ASPxGridView1.FindEditFormTemplateControl("txtPrecio"), TextBox)
        Dim txtCantidad As TextBox = TryCast(ASPxGridView1.FindEditFormTemplateControl("txtCantidad"), TextBox)

        Dim conn As New SqlConnection(ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString)

        Dim cmd As New SqlCommand("INSERT INTO Products (ProductName, UnitPrice, QuantityPerUnit, Discontinued) VALUES ('" & txtNombre.Text & "', '" & txtPrecio.Text & "', '" & txtCantidad.Text & "', 0)", conn)
        conn.Open()
        cmd.ExecuteNonQuery()
        conn.Close()

        e.Cancel = True

    End Sub

    Protected Sub ASPxGridView1_RowUpdating(ByVal sender As Object, ByVal e As DevExpress.Web.Data.ASPxDataUpdatingEventArgs) Handles ASPxGridView1.RowUpdating

        Dim lblProducto As Label = TryCast(ASPxGridView1.FindEditFormTemplateControl("lblProducto"), Label)

        Dim txtNombre As TextBox = TryCast(ASPxGridView1.FindEditFormTemplateControl("txtNombre"), TextBox)
        Dim txtPrecio As TextBox = TryCast(ASPxGridView1.FindEditFormTemplateControl("txtPrecio"), TextBox)
        Dim txtCantidad As TextBox = TryCast(ASPxGridView1.FindEditFormTemplateControl("txtCantidad"), TextBox)

        Dim conn As New SqlConnection(ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString)

        Dim cmd As New SqlCommand("UPDATE Products SET ProductName='" & txtNombre.Text & "' WHERE ProductId='" & lblProducto.Text & "'", conn)
        conn.Open()
        cmd.ExecuteNonQuery()
        conn.Close()

        e.Cancel = True

    End Sub

Finalmente hemos implementado la inserción y actualización de registros en el aspxGridView de Developer Express sin utilizar asistentes o mecanismos tipados,  lo hemos hecho manual lo cual nos da mayor control de lo que queremos realizar.    A continuación el Link donde podemos descargar el proyecto completo.

http://www.4shared.com/file/bOHqLvgt/GridViewTemplate.html


jueves, 18 de noviembre de 2010

ASP.NET - Encriptar el Web.Config

El archivo de configuracion web.config se guarda informacion sensitiva para todo nuestro web site,  existen 2 secciones importantes como son appSettings  y connectionStrings  donde se guardan configuraciones de datos que usa nuestra aplicacion en el primer caso y  cadenas de conexion con login y password para conectarnos a una fuente de datos.   Si alguna persona sin autorizacion tuviera acceso a este archivo podriamos tener problemas.   Por tal motivo es necesario que se deba aplicar algún cifrado, tal como vamos a mostrar a continuación: 


1.-Abrimos la línea de comandos y nos movemos de directorio, vamos a la carpeta v2.0.50727 
2. Luego escribimos
aspnet_regiis -pef "connectionStrings" "C:\Inetpub\wwwroot\Demo"
o
aspnet_regiis -pe "connectionStrings" -app "/Demo"
 En la primera sentencia hacemos referencia una ruta fisica dentro de nuestro directorio, en la segunda hacemos referencia a una aplicacion definida en el IIS.

Si hubiéramos querido encriptar la sección appSettings del web.config. es igual que el ejemplo de arriba sólo que reemplazamos la palabra "connectionStrings" por "appSettings".




Nota: la operación de encriptar el web.config se debe realizar sobre la misma máquina de producción... ya que si encriptas el webconfig en una PC y luego la subes encriptada a otra PC: No funcionará... porque el algoritmo de encriptación usa algunos identficadores únicos de la PC para el encriptado... lo cual impedirá que se pueda leer desde otra PC.

viernes, 12 de noviembre de 2010

Guia Practica Reporting Services 2008 - Intermedio

Ejercicio 1: Expresiones
1.       En un reporte de rptExpresiones de la tabla Customers de Northwind,    con la consulta: 
SELECT  c.CustomerID, CompanyName, ContactName, City, Region, Country, SUM(UnitPrice) UnitPrice, SUM(Quantity) Quantity, SUM(Discount) Discount
FROM customers c
INNER JOIN Orders o ON c.CustomerID = o.CustomerID
INNER JOIN [Order Details] od ON o.OrderID = od.OrderID
GROUP BY c.CustomerID, CompanyName, ContactName, City, Region, Country
2.       Tenemos un Campo,  Name, Company, UnitPrice, Quantity
3.       Nueva columna relacionamos:  Ubicación à  Click Derecho  à Expressions
4.       = Fields!.City.Value &  “ “ &  Fields!.Region.Value & “, “ &  Fields!.Country.Value
5.       Visualizamos el reporte.
6.       Nueva Columna SubTotal =  UnitPrice * Quantity
7.       Nueva Columna Descuento en Monto
8.       Columna Total  =  SubTotal – Descuento
9.       Visualizamos el reporte.
10.   Nueva Columna Tipo Cliente:    =IIF( Calculo Total) > = 10000,  “Gran Consumidor”,  “Pequeno Consumidor”)
11.   Modificar la columna para el uso de SWITCH (CASE) 
=Switch(Calculo Total >= 20000, “Gran Consumidor”  
Calculo Total >= 5000, “Mediano Consumidor”,
Calculo Total < 5000, “ Pequeño Consumidor”)
12.   Visualizamos el Reporte
13.   Para todas las filas poner un Color de Fondo Especial cuando los precios sean menores a 50.
14.   Aplicar ordenamiento Interactivo para Name, Company

Ejercicio 2: Trabajando con Agrupaciones
1.       Crear un nuevo reporte llamado rptAgrupaciones con la siguiente consulta:
SELECT o.ShipCountry, o.ShipCity, c2.CategoryName, p.ProductName,   od.UnitPrice,  Quantity, od.UnitPrice * Quantity AS Total
FROM customers c INNER JOIN Orders o ON c.CustomerID = o.CustomerID
INNER JOIN [Order Details] od ON o.OrderID = od.OrderID
INNER JOIN Products p ON p.ProductID = od.ProductID
INNER JOIN Categories c2 ON c2.CategoryID = p.CategoryID
2.       Agregar en el Detalle Product Name , Cantidad  , Precio,  Total
3.       Crear Grupo para Category Name y su Total
4.       Crear Grupo para City y Su Total
5.       Crear Grupo para Country y su Total
6.       Visualizar el Reporte
7.       Cambiar los Totales de Precio a Promedio
8.       Cambiar Formato a los Totales
9.       Cambiar Colores por Grupo.
10.   Hacer Visible con Click en cada uno de los Grupos.  NOTA:  Hacerlo desde los grupos y no desde las Celdas.  Hacer ver la diferencia.
11.   Visualizar el Reporte

Ejercicio 3:  Trabajando con Parametros
1.       Crear un nuevo reporte llamado rptParametrosFiltros con la siguiente consulta:
SELECT o.ShipCountry, o.ShipCity, c2.CategoryName,  SUM(od.UnitPrice) AS Precio,  SUM(Quantity) Cantidad, SUM(od.UnitPrice * Quantity) AS Total
FROM customers c INNER JOIN Orders o ON c.CustomerID = o.CustomerID
INNER JOIN [Order Details] od ON o.OrderID = od.OrderID
INNER JOIN Products p ON p.ProductID = od.ProductID
INNER JOIN Categories c2 ON c2.CategoryID = p.CategoryID
GROUP BY o.ShipCountry, o.ShipCity, c2.CategoryName
2.       Agregar Todos los campos a una Tabla
3.       En las propiedades del Dataset1  agregamos un parámetro llamado Pais.  Hacer click en OK
4.       Nuevamente en las propiedades del dataset1, en Filters buscar ShipCountry y evaluarlo contra una expression donde se seleccione el parámetro Pais
5.       Visualizar el Reporte
6.       Realizar los mismos pasos 3 y 4  para Ciudad
7.       Visualizamos el Reporte.

Ejercicio 4:  Trabajando con Parametros
1.       Crear un nuevo reporte llamado rptParametros.
2.       En Management Studio ejecutamos el siguiente procedure:
CREATE PROC sp_VentasxPais
@Pais VARCHAR(100)
AS
SELECT o.ShipCountry, o.ShipCity, c2.CategoryName,  SUM(od.UnitPrice) AS Precio,  SUM(Quantity) Cantidad, SUM(od.UnitPrice * Quantity) AS Total
FROM customers c INNER JOIN Orders o ON c.CustomerID = o.CustomerID
INNER JOIN [Order Details] od ON o.OrderID = od.OrderID
INNER JOIN Products p ON p.ProductID = od.ProductID
INNER JOIN Categories c2 ON c2.CategoryID = p.CategoryID
WHERE o.ShipCountry = @Pais
GROUP BY o.ShipCountry, o.ShipCity, c2.CategoryName
3.       Luego creamos un Dataset con el procedimiento y hacemos click en OK
4.       Creamos el Reporte agregando los campos en una Tabla
5.       Verificamos en las propiedades del Dataset que se nos creo automáticamente un Parametro con el nombre de @Pais.  Ademas en la carpeta Parameters deberá estar este mismo parametro
6.       Visualizamos el reporte
7.       En las propiedades del parametro, Available Values, Specify Values,  Asignamos: Valores de Paises
8.       Visualizamos el reporte
9.       Crear un nuevo Dataset lo llamaremos dtPaises con la siguiente consulta: SELECT DISTINCT o.ShipCountry FROM Orders o
10.   En las propiedades del parametro, Available Values, Get Values from a Query,  Asignamos:  los valores de  ShipCountry.
11.   Visualizamos el Reporte

Ejercicio 5:  Multiples Valores en Parametros
1.       Crear un nuevo reporte llamado rptParametrosMultiples.
SELECT o.ShipCountry, o.ShipCity, c2.CategoryName,  SUM(od.UnitPrice) AS Precio,  SUM(Quantity) Cantidad, SUM(od.UnitPrice * Quantity) AS Total
FROM customers c INNER JOIN Orders o ON c.CustomerID = o.CustomerID
INNER JOIN [Order Details] od ON o.OrderID = od.OrderID
INNER JOIN Products p ON p.ProductID = od.ProductID
INNER JOIN Categories c2 ON c2.CategoryID = p.CategoryID
WHERE o.ShipCountry IN (@Pais)
GROUP BY o.ShipCountry, o.ShipCity, c2.CategoryName
2.       Creamos el Reporte agregando los campos en una Tabla
3.       En las propiedades del parámetro,  definimos que sea  multivalor.
4.       Crear un nuevo Dataset lo llamaremos dtPaises con la siguiente consulta: SELECT DISTINCT o.ShipCountry FROM Orders o
5.       En las propiedades del parametro, Available Values, Get Values from a Query,  Asignamos:  los valores de  ShipCountry.
6.       Visualizamos el Reporte


Ejercicio 6:  Reporte Matrix
1.       Crear un Nuevo Reporte llamado rptMatrix con la siguiente consulta:
SELECT  MONTH(o.OrderDate) AS Mes, YEAR(o.OrderDate) Anio,
o.ShipCountry, o.ShipCity, c2.CategoryName, p.ProductName,   od.UnitPrice,  Quantity, od.UnitPrice * Quantity AS Total
FROM customers c INNER JOIN Orders o ON c.CustomerID = o.CustomerID
INNER JOIN [Order Details] od ON o.OrderID = od.OrderID
INNER JOIN Products p ON p.ProductID = od.ProductID
INNER JOIN Categories c2 ON c2.CategoryID = p.CategoryID
2.       Agregar un Matrix
3.       Configurarlo:  Filasà Pais, Ciudad, Categoria, Producto,   Columnasà Anio y Mes,  Dataà Total, Cantidad
4.       Cambiar Colores por Columnas y por Filas
5.       Hacerlo Dinamico para que se oculte y se muestre al hacer click en el.

Ejercicio 7:  Creando un Grafico
1.       Crear un Nuevo Reporte llamado rptGrafico con la siguiente consulta:
SELECT  MONTH(o.OrderDate) AS Mes, YEAR(o.OrderDate) Anio,
o.ShipCountry, o.ShipCity, c2.CategoryName, p.ProductName,   od.UnitPrice,  Quantity, od.UnitPrice * Quantity AS Total
FROM customers c INNER JOIN Orders o ON c.CustomerID = o.CustomerID
INNER JOIN [Order Details] od ON o.OrderID = od.OrderID
INNER JOIN Products p ON p.ProductID = od.ProductID
INNER JOIN Categories c2 ON c2.CategoryID = p.CategoryID
2.       Agregar un Grafico
3.       Seleccionar de Barra
4.       Configurarlo:  Categorias à Categorias,  Series àAnio,  Data à Total
5.       Poner Titulo
6.       Visualizamos el reporte
7.       Cambiar tipo de Grafico
8.       Visualizamos el reporte