miércoles, 24 de octubre de 2012

Crear reporte con Sap Crystal Reports



El día de hoy les traigo la forma de crear un reporte con Sap Crystal Reports desde c#, que es una muy buena herramienta con los controles mejorados y muy vistosos. Pero vallamos al grano como siempre.
Desde nuestro Visual Studio en nuestro proyecto previamente creado, agregamos un nuevo archivo de tipo de datos, el cual será nuestro DataSet, el cual contendrá la estructura de nuestra tabla de BD que vamos a utilizar. Una vez abierto el diseñador agregamos una TablaAdapter con el clic derecho de nuestro mouse o desde el cuadro de herramientas (Imagen 1), una vez agregada la TablaAdapter, procedemos a configurar nuestra conexión a BD, o bien seleccionamos la que se esté utilizando en el proyecto.


Imagen 1.

 

Una vez ingresada nuestra nueva conexión o seleccionada, nos muestra 3 opciones, donde podemos escoger:
·         Usar instrucciones SQL: podemos utilizar un select de alguna tabla.
·         Crear nuevos procedimientos almacenados: podemos crear un procedimiento almacenado directamente.
·         Usar un procedimiento almacenado: Nos muestra los procedimientos que existen en nuestra BD.
Para este ejemplo utilizaremos usar instrucción SQL, e la cual podemos poner Select * from unidades, donde en mi BD tengo la tabla unidades con los campos idunidad, Nombre, Activo, fechaAlta y usuario, y damos en finalizar. Una vez creada la tabla tendrá la siguiente forma.

 Imagen2

Una vez creado nuestro dataset, vamos a nuestra pagina.aspx a la cual le pondré Reporte1.aspx, y agregamos un control CrystalReportViewer que esta en el cuadro de herramientas, en el apartado creación de informes, en caso de que no este, una vez instalado el Sap Cryrtal report en nuestro cuadro de herramientas y no lo de en automático, con clic derecho  y la opción “elegir elementos” y buscamos y seleccionamos en componentes de .Net Framework los elementos CrystalReportViewer, CrystalReportSoruce, una vez hecho esto deben de aparecer los elementos en nuestro cuado de herramientas (Imagen 3).

Imagen 3

Solo basta con arrastrar el control a nuestro diseñador, una vez en él nos muestra por default la ventana de Tareas de Crystal ReportViewer donde nos da la opción de crear nuestro informe en la opción elegir un origen de informe (Imagen 4), damos clic sobre <Nuevo origen de informe…>

Imagen 4

Y nos creara el informe en automático, una vez creado el reporte podemos manipularlo con los datos de nuestro dataset que se encuentra en el explorador de campos (Imagen 5).

Imagen 5

Para ello solo basta con arrastrarlos a nuestro reporte en la sección de detalles (Imagen 6), de forma automática se agrega el nombre del campo en el encabezado de página, estos encabezados se puede editar a nuestro gusto, o bien podemos agregar líneas o cuadros, según nuestras necesidades.

Imagen 6

Una vez configurado nuestro reporte volvemos a nuestra pagina Reporte.aspx y agregamos un control CrystalReportSource, el cual nos dará la opción de configurar el origen del informe, y seleccionamos el que creamos previamente (Imagen 7).

Imagen 7

Una vez hecho esto, agregamos un control ObjectDataSource el cual configuraremos el origen de datos, en el combo Elegir un objeto comercial, nos pondrá las TablaAdapter que tenemos en nuestro dataset, damos siguiente y nos mostrara las funciones que podemos realizar (Imagen 8) en nuestro caso como fue un select nos da de primera instancia en Elegir un método: el GetData() que se configuro en nuestra TablaAdapter, en las demás pestañas si no se va a interactuar con ellas podemos dejar ninguno, paso siguiente damos finalizar, en este paso cuando seleccionamos un vez de un select normal, y ponemos un procedimiento que reciba parámetros, este mismo nos da la opción de escoger un control de donde tomar los datos parámetro, ya sea un combo o un hidden.

Imagen 8

Una vez configurado nuestro ObjectDataSource, volvemos a nuestro control CrystalReportSoucer, y en vista Código agregamos después de <Report > una etiqueta <DataSources> como se muestra a continuación:


<CR:CrystalReportSource ID="CrystalReportSource1" runat="server">
         <Report FileName="CrystalReport1.rpt">
             <DataSources>                  
                 <CR:DataSourceRef DataSourceID="ObjectDataSource1" TableName="Unidades" />
             </DataSources>
         </Report>
</CR:CrystalReportSource>
   

Con esto vinculamos nuestro ObjectDataSource con nuestro reporte, paso seguido podemos correr nuestra aplicación.
Les dejo el código de nuestra pagina Reporte1.aspx



<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Reporte1.aspx.cs" Inherits="SapCrystalReports.Reporte1" %>

<%@ Register Assembly="CrystalDecisions.Web, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304"
    Namespace="CrystalDecisions.Web" TagPrefix="CR" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
       
        <CR:CrystalReportViewer ID="CrystalReportViewer1" runat="server" AutoDataBind="True"
            GroupTreeImagesFolderUrl="" Height="1202px" ReportSourceID="CrystalReportSource1"
            ToolbarImagesFolderUrl="" ToolPanelWidth="200px" Width="1104px" />
        <CR:CrystalReportSource ID="CrystalReportSource1" runat="server">
            <Report FileName="CrystalReport1.rpt">
                <DataSources>                  
                    <CR:DataSourceRef DataSourceID="ObjectDataSource1" TableName="Unidades" />
                </DataSources>
            </Report>
        </CR:CrystalReportSource>
        <asp:ObjectDataSource ID="ObjectDataSource1" runat="server" OldValuesParameterFormatString="original_{0}"
            SelectMethod="GetData" TypeName="SapCrystalReports.DataSet1TableAdapters.UnidadesTableAdapter">
            <%--  Cuando es un procedimiento, o alguna funciones que lleve parametros, al configurar el objectdatasource muestra que necesita los parametros y los tipos de datos.
Ejemplo, el control saldria asi, haciendo referencia a tres combobox, que al cambiar uno ese actualizara el reporte.
<SelectParameters>
                <asp:ControlParameter ControlID="DropDown1" Name="unidad" PropertyName="SelectedValue"
                    Type="Int32" />
                <asp:ControlParameter ControlID="DropDown2" Name="año" PropertyName="SelectedValue"
                    Type="Int32" />
                <asp:ControlParameter ControlID="DropDown3" Name="activo" PropertyName="SelectedValue"
                    Type="Int32" />
            </SelectParameters>
            --%>
        </asp:ObjectDataSource>
    </div>
    </form>
</body>
</html>



Y aquí el link de descarga del proyecto que esta en Visual Studio 2010.

Espero les halla sido de utilidad, cualquier duda o comentario no duden en realizarla.

Saludos cordiales!