jueves, 24 de mayo de 2012

Like en Crystal Reports

Es muy sencillo utilizar el comando LIKE en Crystal Reports tal como lo usamos en SQL.  La única diferencia es que en lugar de usar el %, aquí usaremos el * de la siguiente forma:

Esto nos mostraría todos los clientes:

{CLIENTES.CLIENTE] LIKE "*"

Así mostraríamos los clientes que contengan MA:

{CLIENTES.CLIENTE} LIKE "*MA*"

Y si el criterio de búsqueda proviene de un parámetro, podemos hacer lo siguiente:

{CLIENTES.CLIENTE} LIKE "*" + {?CLIENTEBUSCAR} + "*"

Si queremos usar ese mismo parámetro para que el usuario decida si quiere ver todos los clientes o bien solo los que cumplan con el criterio ingresado, debemos configurar el parámetro para que su valor DEFAULT sea * y con esto si el usuario no lo cambia le mostraremos todos los clientes, y si lo cambia pues le mostraremos los que cumplan la condición.

Ya en la fórmula lo utilizaríamos de la siguiente forma:

{CLIENTES.CLIENTE} LIKE ( IIF( {?CLIENTEBUSCAR} = "*", "*", "*" + {?CLIENTEBUSCAR} + "*" ) )

Y por último, si deseamos usar NOT LIKE en Crystal Reports, usamos cualquiera de las formas descritas anteriormente de la siguiente forma:

NOT ( {CLIENTES.CLIENTE} LIKE "*MA*" )

De nuevo salu2.

viernes, 11 de mayo de 2012

Agrupar GridView asp.net

Ahora les quiero mostrar como hacer grupos con sus totales y totales generales a un GridView en asp.net

Vamos a agrupar el siguiente Grid:


Para agrupar por una columna en un grid de asp.net, debemos hacer TemplateFields la o las columnas por las que vayamos a crear los grupos.  En este caso voy a agrupar por mi columna "Proveedor":


<asp:TemplateField HeaderText="Proveedor" Visible="false" AccessibleHeaderText="Proveedor">
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Bind("Proveedor") %>'></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("Proveedor") %>'></asp:TextBox>
</EditItemTemplate>
<HeaderStyle HorizontalAlign="Left" />
<ItemStyle HorizontalAlign="Left" />
</asp:TemplateField>

Deben descargar las siguientes clases aquí.

Para crear el grupo, deben escribir el siguiente código:

GridViewHelper helper = new GridViewHelper(this.gridVentas);

helper.RegisterGroup("Proveedor", true, true);
helper.GroupHeader += new GroupEvent(helper_GroupHeader);

helper.ApplyGroupSort();
gridVentas.DataBind();


Esto nos dará el siguiente resultado:


Ahora, para agregar los totales por grupo deben copiar el siguiente código:


helper.RegisterSummary("Valor1", "{0:###,###,###,###,###.##}", SummaryOperation.Sum, "Proveedor");
helper.RegisterSummary("Valor2", "{0:###,###,###,###,###.##}", SummaryOperation.Sum, "Proveedor");
helper.RegisterSummary("Valor3", "{0:###,###,###,###,###.##}", SummaryOperation.Sum, "Proveedor");
helper.GroupSummary += new GroupEvent(helper_Bug);


Y este para los totales generales:


helper.RegisterSummary("Valor1", "{0:###,###,###,###,###.##}", SummaryOperation.Sum);
helper.RegisterSummary("Valor2", "{0:###,###,###,###,###.##}", SummaryOperation.Sum);
helper.RegisterSummary("Valor3", "{0:###,###,###,###,###.##}", SummaryOperation.Sum);
helper.GeneralSummary += new FooterEvent(helper_GeneralSummary);

Para poder darle formato a las filas del grupo, del total por grupo y total general, debemos usar los siguientes eventos que ya fueron referenciados arriba:

private void helper_Bug(string groupName, object[] values, GridViewRow row)
{
    if (groupName == null) return;

    row.Cells[1].Text = "TOTAL PROVEEDOR:";
    row.Cells[1].HorizontalAlign = HorizontalAlign.Right;
 
    row.Font.Bold = true;
    row.BackColor = System.Drawing.ColorTranslator.FromHtml("#F5F6CE");
   
}

private void helper_GeneralSummary(GridViewRow row)
{
    row.Cells[1].Text = "TOTAL GENERAL:";
    row.Cells[1].HorizontalAlign = HorizontalAlign.Right;

    row.Font.Bold = true;
    row.ForeColor = System.Drawing.Color.White;
    row.BackColor = System.Drawing.ColorTranslator.FromHtml("#5D7B9D");
}

private void helper_GroupHeader(string groupName, object[] values, GridViewRow row)
{
    if (groupName == "Proveedor")
    {
row.Cells[0].Font.Bold = true;
        row.Cells[0].HorizontalAlign = HorizontalAlign.Left;
        row.BackColor = System.Drawing.ColorTranslator.FromHtml("#B3D5F7");
        row.Cells[0].Text = string.Format("Proveedor:   {0}", values[0].ToString());
    }
}


El producto final que vamos a obtener es el siguiente:


Y así se verá el total general:


Para los que no tenemos Telerik o DevExpress esta bueno verdad??? jajaja


Dar formato a columna numérica en GridView asp.net

Recientemente se me presentó la necesidad de darle formato a una columna numérica en un GridView de asp.net

Para lograr que se vean así:


Lo que debemos hacer es, primero, las columnas que vamos a formatear tienen que ser TemplateField y le colocamos el formato de la siguiente forma:

<asp:TemplateField HeaderText="Margen Ventas Monto" AccessibleHeaderText="MargenVentasMonto">
<ItemTemplate>
    <asp:Label ID="Label4" runat="server"
    Text='<%# Bind("MargenVentasMonto", "{0:####,###,###,###,##.##}") %>'></asp:Label>
</ItemTemplate>
<EditItemTemplate>
    <asp:TextBox ID="TextBox4" runat="server"
    Text='<%# Bind("MargenVentasMonto", "{0:####,###,###,###,##.##}") %>'></asp:TextBox>
</EditItemTemplate>
<HeaderStyle HorizontalAlign="Right" Width="110px" />
<ItemStyle HorizontalAlign="Right" Width="110px" />
</asp:TemplateField>

Les marqué en negrita lo que formatea la columna.

Lo que me gustó de esto es que pude utilizar el contenido de esta columna utilizando la propiedad "Text" del Label para hacer operaciones numéricas y el formato no me afectó.

Salu2.