SAP Crystal Reports, versión para programadores de Microsoft Visual Studio Versión del documento: Support Package 10 - 2014-06-23 Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Tabla de contenido 1 Manual del desarrollador del SDK de SAP Crystal Reports .Net . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.1 Inicio. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.1.1 ¿Qué es SAP Crystal Reports, versión para programadores de Microsoft Visual Studio? ............................................................................ 3 1.1.2 1.2 1.3 1.4 1.5 1.6 1.7 1.8 2 Migrar la aplicación SAP Crystal Reports .Net. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 Configurar el entorno de desarrollo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 1.2.1 Configuración del sistema. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 1.2.2 Configuración de proyectos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 Aspectos fundamentales del SDK. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 1.3.1 Arquitectura. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 1.3.2 Control CrystalReportViewer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 1.3.3 ¿Cuál es el enfoque de persistencia que se debe usar con SAP Crystal Reports?. . . . . . . . . . . 52 1.3.4 Escalar la aplicación. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .63 1.3.5 Usar SAP Crystal Reports en una matriz de servidores o de procesos Web. . . . . . . . . . . . . . . 73 1.3.6 Trabajar con Crystal Reports como servicio web. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 1.3.7 Consideraciones sobre la seguridad. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 Uso del SDK. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 1.4.1 Imprimir un informe. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 1.4.2 Exportar un informe. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 1.4.3 Filtrar datos con parámetros o fórmulas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .134 1.4.4 Establecer el origen de datos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .149 1.4.5 Visualizar un informe. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 1.4.6 Personalizar el control CrystalReportViewer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .222 1.4.7 Uso de los informes de sólo lectura de SAP Crystal Reports (RPTR). . . . . . . . . . . . . . . . . . . 240 Tutoriales. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240 1.5.1 Tutoriales del modelo de objeto CrystalReportViewer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240 1.5.2 Tutoriales del modelo de objetos ReportDocument. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .336 1.5.3 Tutoriales de código reducido en Visual Studio. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .503 1.5.4 Tutoriales de conectividad de datos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 544 1.5.5 Otros tutoriales. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 584 Implementación. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 612 1.6.1 Componentes de implementación. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 612 1.6.2 Implementación para Visual Studio. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 623 Crear informes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 642 1.7.1 Usar SAP Crystal Reports Designer incrustado. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .642 1.7.2 Referencia de fórmulas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .777 1.7.3 Referencia de interfaz de usuario. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 846 Glosario. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 996 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Tabla de contenido 1 Manual del desarrollador del SDK de SAP Crystal Reports .Net 1.1 Inicio Esta ayuda en pantalla está diseñada para ayudarle a desarrollar su propia aplicación Web o para Windows con el SDK de SAP Crystal Reports .NET. Incluye tutoriales y referencias de programación que puede usar para implementar el SDK de SAP Crystal Reports .NET. 1.1.1 ¿Qué es SAP Crystal Reports, versión para programadores de Microsoft Visual Studio? SAP Crystal Reports, versión para programadores de Microsoft Visual Studio permite crear informes complejos y profesionales en un programa basado en GUI. Después puede conectar el informe a casi todos los orígenes de base de datos, así como a datos proxy, como un conjunto de resultados (por ejemplo, un ADO.NET DataSet). Los asistentes del diseñador de GUI le permiten establecer los criterios de formato, agrupamiento y gráficos, etc. Puede almacenar el informe en una aplicación Web o para Windows, con uno de los controles de visores deSAP Crystal Reports. La presentación de informes, tanto en clientes Windows como en HTML 4.0 es muy interactiva y proporciona funciones como la profundización en gráficos, la exploración de informes y la búsqueda de texto. SAP Crystal Reports, versión para programadores de Microsoft Visual Studio incluye un SDK extenso. Puede utilizarlo para interactuar con el informe mediante programación en tiempo de ejecución, usando uno de los cuatro modelos de objetos posibles: ● CrystalReportViewer, el modelo de objetos más sencillo. ● ReportDocument, el modelo de objetos más completo. ● ReportClientDocument, el modelo de objetos más completo. Este modelo de objetos está disponible con un servidor RAS. ● InfoObject, un modelo de objetos muy eficaz para la programación y configuración de informes en el marco de SAP Crystal Reports Server o la plataforma SAP BusinessObjects Business Intelligence. Nota Los modelos de objetos CrystalReportViewer y ReportDocument están disponibles con todas las versiones de SAP Crystal Reports, versión para programadores de Microsoft Visual Studio. Los modelos de objetos ReportClientDocument e InfoObject requieren una licencia actualizada. Vea Soluciones de elaboración de informes de SAP BusinessObjects Business Intelligence [página 63]. Los informes se pueden relacionar con el proyecto de Visual Studio de muchas formas: ● Incruste los informes directamente en el proyecto. ● Obtenga acceso a sus informes desde un directorio de archivos. ● Obtenga acceso a sus informes como servicio Web de informes desde un servidor remoto. ● Conecte sus informes como Crystal Services. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 3 ● Mediante la actualización a SAP Crystal Reports Server puede tener acceso a sus informes a través del servidor RAS. ● Mediante la actualización a la plataforma SAP BusinessObjects Business Intelligence, puede tener acceso a sus informes a través de Page Server o del servidor RAS incluidos en el marco de la plataforma SAP BusinessObjects Business Intelligence. 1.1.1.1 Funciones disponibles en SAP Crystal Reports Designer SAP Crystal Reports Designer proporciona varias funciones que no están disponibles con SAP Crystal Reports, versión para programadores de Microsoft Visual Studio: Función Descripción Miembros calculados en gráficos de tabla de referencias cruzadas Puede agregar filas o columnas a un gráfico de tabla de referencias cruzadas insertando un miembro calculado. Estas filas o columnas pueden contener cálculos personalizados (por ejemplo, la diferencia en las ventas entre dos regiones) o se pueden usar en conjunto para tareas de formato (por ejemplo, insertar una fila en blanco cada tres líneas para mejorar la legibilidad). Tiene total flexibilidad para diseñar sus propias fórmulas de cálculo y puede elegir si deben aparecer solamente una vez o repetirse regularmente en la tabla de referencias cruzadas. Objetos Flash incrustados Puede incrustar un objeto Flash o crear un vínculo a un objeto Flash en cualquier sección de un informe de SAP Crystal Reports. Resúmenes incrustados en tablas de referencias cruzadas Puede agregar un cálculo adicional a un gráfico de tabla de referencias cruzadas insertando un resumen incrustado. Los resúmenes incrustados no agregan filas ni columnas a la tabla de referencias cruzadas. En lugar de ello, hacen que aparezcan cálculos adicionales en cada celda de la tabla de referencias cruzadas. Por ejemplo, en un informe que muestra las ventas regionales, podría insertar un cálculo para cada región que mostrase el porcentaje de ventas totales del país. Vista previa editable Con SAP Crystal Reports Designer puede visualizar un informe en la ficha de diseño o la ficha de vista previa. En la ficha Vista previa dispone de las mismas opciones de formato que en la ficha Diseño. Sin embargo, en la ficha Vista previa trabaja con los datos reales. En lugar de un marco de campo que representa varios valores de campo, en el informe se muestran los valores reales. 4 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Función Descripción Códigos de barras con formato SAP Crystal Reports Designer incluye las fórmulas y fuentes necesarias para admitir códigos de barras Code39. Puede usar la opción Dar formato al campo para cambiar el aspecto de un código de barras. Existen varias razones para cambiar el aspecto de un código de barras, como: ● Para cambiar el tamaño de modo que el código de barras no sea demasiado grande o pequeño como para leerlo con un escáner. ● Ordenación de campos interactiva Para mostrar el código de barras en un color diferente. Puede diseñar el informe de modo que los usuarios puedan modificar un campo o una dirección de ordenación sin necesidad de actualizar la información de la base de datos. Puede hacerlo agregando un Control de ordenación al informe. Un Control de ordenación es especialmente útil por diversos motivos: ● Permite que los usuarios ordenen los datos de un informe para analizarlos sin necesidad de abandonar el lienzo del informe. ● Elimina demanda de procesamiento en la base de datos. ● Reduce el tiempo que los usuarios deben esperar a que se ordenen los datos. ● Permite que los usuarios ordenen los campos del informe aunque no dispongan de conexión o derechos para acceder a la base de datos en el momento de la visualización. Workbench En Workbench puede crear proyectos que contengan uno o varios informes. Con las opciones de la barra de herramientas puede agregar, eliminar o cambiar el nombre de carpetas, informes y paquetes de objetos. Puede reorganizar los archivos en una o varias carpetas arrastrándolos y colocándolos donde desee que se muestren. También puede arrastrar archivos de informes desde Windows Explorer y colocarlos en la carpeta que desee en Workbench. 1.1.2 Migrar la aplicación SAP Crystal Reports .Net En esta sección se ofrece información sobre la migración de la aplicación SAP Crystal Reports .Net a SAP Crystal Reports, versión para programadores de Microsoft Visual Studio. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 5 Nota SAP Crystal Reports, versión para programadores de Microsoft Visual Studio contiene un completo conjunto de funciones, y está disponible como una descarga gratuita que se integra con Visual Studio 2010 o posterior. SAP Crystal Reports, versión para programadores de Microsoft Visual Studio no se incluye en la aplicación SAP Crystal Reports Designer. 6 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Opciones de migración en las diferentes versiones de SAP Crystal Reports Este diagrama muestra las diferentes opciones de migración entre versiones de SAP Crystal Reports. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 7 Migrar a SAP Crystal Reports, versión para programadores de Microsoft Visual Studio SAP Crystal Reports, versión para programadores de Microsoft Visual Studio actualiza automáticamente los proyectos anteriores a la versión actual. Si un proyecto incluye referencias a componentes anteriores, se solicita al usuario que realice una actualización. Al hacer clic en el botón Sí, los proyectos y sus archivos se actualizan a la versión actual de SAP Crystal Reports. Si se hace clic en el botón No, se ajusta el proyecto de modo que se utilicen las referencias originales. Algunas de las funciones anteriores se deshabilitan debido a que los componentes anteriores no tendrán esa funcionalidad determinada. Nota Si están bloqueados el archivo de proyecto, cualquier archivo ASPX que incluya componentes de SAP Crystal Reports o el archivo web.config, no se podrá llevar a cabo la actualización o la aplicación de soluciones. Información relacionada Soluciones de elaboración de informes de SAP BusinessObjects Business Intelligence [página 63] 1.1.2.1 Problemas de migración Un informe basado en una fuente de datos ADO.NET no funcionará si el proyecto tiene como destino el .NET 4.x Framework Los informes basados en una fuente de datos ADO.NET no funcionarán si el proyecto tiene como destino .NET 4.x Framework. Se produce el siguiente error: "Información adicional: se ha creado un conjunto de modo combinado frente a la versión 'v2.0.50727' del tiempo de ejecución y no puede cargarse en el tiempo de ejecución 4.x sin información de configuración adicional." Este problema puede solucionarse actualizando el archivo .config de los proyectos. Agregue las siguientes líneas de código a la sección <configuration></configuration> del archivo: <startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.x"/> </startup> 1.1.2.2 Limitaciones de 64 bits SAP Crystal Reports, versión para programadores de Microsoft Visual Studio8 x64 (AMD64) admite la arquitectura de 64 bits. Sin embargo, actualmente no se admite la arquitectura de IA64 (Itanium). 8 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Funciones que no se admiten actualmente en escenarios de 64 bits: ● Exportar informes al formato HTML. ● Componentes de correspondencia geográfica. ● Componentes de fuente de código de barras Azalea. 1.2 Configurar el entorno de desarrollo En esta sección se ofrecen instrucciones detalladas sobre cómo instalar y configurar el entorno de implementación y cómo crear un sitio Web o proyecto Windows en SAP Crystal Reports, versión para programadores de Microsoft Visual Studio. 1.2.1 Configuración del sistema En esta sección se proporciona una vista general de cómo configurar el entorno de desarrollo para probar y desarrollar aplicaciones para Windows o sitios Web que usen el SDK de SAP Crystal Reports .Net. 1.2.1.1 Instalaciones necesarias Necesita instalar SAP Crystal Reports, versión para programadores de Microsoft Visual Studio para poder crear aplicaciones Web o para Windows que usen SAP Crystal Reports. 1.2.1.1.1 Versiones compatibles de Visual Studio Si desea utilizar SAP Crystal Reports, versión para programadores de Microsoft Visual Studio, deberá verificar que la versión de Visual Studio instalada admite SAP Crystal Reports. Las ediciones Ultimate, Premium y Professional de Visual Studio se admiten en Visual Studio 2010 y versiones superiores. SAP Crystal Reports no admite las ediciones Express de Visual Studio. Información relacionada Soluciones de elaboración de informes de SAP BusinessObjects Business Intelligence [página 63] Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 9 1.2.1.1.2 Versiones de SAP Crystal Reports Hay disponibles numerosas versiones de SAP Crystal Reports. Muchos de los procedimientos incluidos en este documento son específicos de versión. Para obtener el máximo partido de este documento, determine en primer lugar qué versión de SAP Crystal Reports tiene instalada. 1.2.1.1.2.1 Para determinar qué versión de SAP Crystal Reports está ejecutando: Procedimiento 1. Vaya a GAC (caché de ensamblados global) en C:\WINNT\Assembly o C:\Windows\Assembly. 2. Busque el archivo CrystalDecisions.CrystalReports.Engine. Nota Si ha instalado más de una versión de SAP Crystal Reports, tendrá varias versiones de estos archivos en la caché de ensamblados global. El archivo CrystalDecisions.CrystalReports.Engine se selecciona, ya que dicho archivo se incluye en todas las versiones de SAP Crystal Reports. 3. Observe la columna Versión que aparece en la ventana. Ésta es la "versión de ensamblado". 4. Busque el número más alto de un ensamblado determinado. 5. Compare la versión del ensamblado con el número de versión en el gráfico de versiones de SAP Crystal Reports. 1.2.1.1.2.2 Versiones de SAP Crystal Reports Producto Versión de ensamblado SAP Crystal Reports, versión para programadores de Microsoft Visual Studio (.NET 4.0 Framework) 13.0.2000.0 SAP Crystal Reports 2008 (.NET 2.0 Framework) 12.0.2000.0 SAP Crystal Reports 2008 (.NET 1.1 Framework) 12.0.1100.0 SAP Crystal Reports XI Release 2 11.5.3300.0 SAP Crystal Reports XI Release 1 11.0.3300.0 SAP Crystal Reports Basic para Visual Studio 2008 10.5.3600.0 SAP Crystal Reports para Visual Studio 2005 10.2.3600.0 SAP Crystal Reports 10 10.0.3300.0 10 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Producto Versión de ensamblado SAP Crystal Reports 9 9.2.3300 SAP Crystal Reports para Visual Studio 2003 9.1.5000 SAP Crystal Reports 2008 y SAP Crystal Reports 2008 SP1 usan el mismo número de versión de ensamblado. Para comprobar si tiene instalado SAP Crystal Reports 2008 SP1, compruebe que la versión de archivo empieza por 12.1, y no por 12.0. 1.2.1.1.3 Instalar el Servicio de actualizaciones de SAP Crystal Reports Contexto SAP Crystal Reports, versión para programadores de Microsoft Visual Studio dispone ahora de un servicio opcional de actualizaciones de SAP Crystal Reports que busca actualizaciones, soluciones y revisiones de SAP Crystal Reports. El servicio de actualizaciones de SAP Crystal Reports, versión para programadores de Microsoft Visual Studio no forma parte del instalador. Deberá descargar e instalar el Servicio de actualizaciones por separado. Procedimiento 1. Tras instalar SAP Crystal Reports, versión para programadores de Microsoft Visual Studio, abra Visual Studio y cree un sitio Web o un proyecto para Windows. 2. En Explorador de soluciones haga clic con el botón derecho en el nombre de proyecto en negrita y haga clic en Agregar Nuevo elemento . 3. En el cuadro de diálogo Agregar nuevo elemento, seleccione Crystal Reports. 4. En el campo Nombre, especifique Test.rpt y, a continuación, haga clic en Agregar. Nota Si es la primera vez que usa SAP Crystal Reports Designer incrustado, se le pedirá que acepte el Contrato de licencia para el usuario final. Después de esto, se abrirá el cuadro de diálogo Servicio de actualizaciones. Si ha abierto antes SAP Crystal Reports Designer incrustado, deberá abrir manualmente el cuadro de diálogo Servicio de actualizaciones. Se abrirá SAP Crystal Reports Designer incrustado y mostrará el nuevo informe. 5. Si no aparece el cuadro de diálogo Servicio de actualizaciones, en el menú Crystal Reports, haga clic en Comprobar actualizaciones. Si no está instalado el Servicio de actualizaciones de SAP Crystal Reports, se le preguntará si desea instalarlo. 6. En el cuadro de diálogo Servicio de actualizaciones, haga clic en Sí. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 11 Se cargará el sitio Web del Servicio de actualizaciones de SAP Crystal Reports, que dispone de un vínculo para descargar el servicio de actualizaciones. 7. Descargue e instale el Servicio de actualizaciones de SAP Crystal Reports. 8. Inicie de nuevo Visual Studio. 9. Abra Test.rpt. Se iniciará SAP Crystal Reports Designer incrustado y mostrará el informe. 10. En el menú Crystal Reports, haga clic en Comprobar actualizaciones. Se abrirá el Servicio de actualizaciones y buscará actualizaciones. Puede aceptar o rechazar las actualizaciones disponibles. 1.2.1.1.4 Reports Código de clave de producto de SAP Crystal El código de clave de producto es una cadena alfanumérica con una longitud de 19 dígitos o caracteres. En SAP Crystal Reports, versión para programadores de Microsoft Visual Studio, al crear proyectos de implementación que usen Windows Installer, es posible que necesite un código de clave de producto para validar la licencia de las aplicaciones Web o para Windows. 1.2.1.2 Comprobaciones necesarias Para desarrollar un sitio Web o aplicación de Windows que use el SDK de SAP Crystal Reports .NET, tendrá que comprobar que los componentes del desarrollador de Crystal Reports se han instalado correctamente y se han integrado con Visual Studio. Para desarrollar un sitio Web, tendrá que llevar a cabo un paso adicional: comprobar que el directorio virtual de los visores se ha instalado correctamente en los servidores de desarrollo, implementación y Web. En esta sección se explica la configuración que tendrá que comprobar antes de crear una aplicación de SAP Crystal Reports .NET. Información relacionada Versiones compatibles de Visual Studio [página 9] 12 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 1.2.1.2.1 Comprobar que SAP Crystal Reports está instalado Contexto Para verificar que el componente SAP Crystal Reports de Visual Studio está instalado, asegúrese de que SAP Crystal Reports aparece en el cuadro de diálogo Agregar nuevo elemento de Visual Studio. Procedimiento 1. Inicie Visual Studio. 2. Cree un nuevo proyecto Web o de Windows (en cualquier lenguaje) o abra uno ya existente. 3. En el menú Proyecto, haga clic en Agregar nuevo elemento. Nota Los nuevos archivos de informe se deben agregar directamente a un proyecto. No se puede crear un nuevo informe de Crystal en Visual Studio mediante el menú Archivo. 4. Cuando aparezca el cuadro de diálogo Agregar nuevo elemento, desplácese en éste y compruebe que Crystal Reports es uno de los elementos disponibles. 1.2.1.2.2 Directorio de visores SAP Crystal Reports se basa en un directorio virtual para obtener acceso a los visores a fin de mostrarlos. Dicho directorio virtual y la ruta de archivos subyacente son exclusivos en cada una de las versiones de SAP Crystal Reports; de esta forma, las versiones subsiguientes de SAP Crystal Reports instaladas en un mismo equipo funcionarán sin conflictos. 1.2.1.2.2.1 visores Ubicación predeterminada del directorio de Si ha instalado SAP Crystal Reports usando la configuración y las rutas de archivos predeterminadas, el directorio virtual de visores estará configurado de la siguiente forma: Versión Framework SAP Crystal Reports, 4.x Framework versión para progra­ madores de Micro­ soft Visual Studio Ruta de archivos Directorio de archivos al usar ASP.NET Development Server: \Windows\Microsoft.NET\Framework \v4.0.30319\ASP.NETClientFiles \crystalreportviewers13 Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 13 Versión Framework Ruta de archivos Directorio de archivos al usar IIS: \inetpub\wwwroot\aspnet_client\system_web \4_0_30319\crystalreportviewers13 SAP Crystal Reports, 2,0 Framework versión para progra­ madores de Micro­ soft Visual Studio Directorio de archivos al usar ASP.NET Development Server: \Windows\Microsoft.NET\Framework \v2.0.50727\ASP.NETClientFiles \crystalreportviewers13 Directorio de archivos al usar IIS: \inetpub\wwwroot\aspnet_client\system_web \2_0_50727\crystalreportviewers13 1.2.1.2.2.2 Para encontrar el directorio de visores Procedimiento 1. En el Panel de control, haga doble clic en Herramientas administrativas y, a continuación, haga doble clic en Internet Information Services. 2. En el cuadro de diálogo Internet Information Services, expanda el nodo Sitios Web y, a continuación, el nodo Sitio Web predeterminado. 3. Busque todas las carpetas que contengan una carpeta crystalreportsviewers13. 4. Haga clic con el botón derecho en cada carpeta crystalreportsviewers13 y seleccione Propiedades. 5. En el cuadro de diálogo Propiedades, confirme que la ruta local está configurada correctamente para su versión de SAP Crystal Reports para Visual Studio. 1.2.1.2.3 Directorio de informes de muestra Algunos de los ejemplos de las funciones, casos de enlace de informes y manuales se basan en informes de muestra disponibles en SAP Crystal Reports. Los informes de muestra pueden descargarse de http://www.sdn.sap.com/irj/boc/downloads 1.2.2 . Configuración de proyectos Esta sección constituye un punto de aprendizaje clave tanto para programadores de nivel avanzado como intermedio. Aquí se muestran las mejores prácticas recomendadas para continuar con la creación y la 14 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net configuración de un nuevo proyecto para Windows o un proyecto/sitio Web con SAP Crystal Reports, versión para programadores de Microsoft Visual Studio. El proyecto nuevo que se crea sirve también como requisito previo para los tutoriales suministrados junto con esta ayuda en línea. 1.2.2.1 Configuración de sitios Web en Visual Studio En esta sección se describe la configuración de sitios Web en Visual Studio. Este sitio web que se crea sirve también como requisito previo para los tutoriales de codificación suministrados junto con esta ayuda en línea. 1.2.2.1.1 Crear un nuevo sitio Web en Visual Studio Procedimiento 1. Inicie Visual Studio. 2. En el menú Archivo, haga clic en Nuevo sitio Web. 3. En el cuadro de diálogo Nuevo sitio Web, haga clic en Sitio Web ASP.NET. 4. En la lista desplegable Ubicación, seleccione Sistema de archivos. 5. En la lista desplegable Idioma, seleccione el idioma de codificación que desea usar. 6. En el campo de texto Ubicación indique la ruta de directorio C:\WebSites\, seguida del nombre del proyecto. C:\WebSites\MiProyecto 7. Haga clic en Aceptar. 1.2.2.1.2 1.2.2.1.2.1 Preparar el formulario Web Form Para crear el formulario Web Form Contexto En esta sección puede configurar la clase de código subyacente del formulario Web Form. Nota Los términos "formulario Web", "página ASPX" y "Default.aspx" son intercambiables. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 15 Procedimiento 1. En el Explorador de soluciones, haga doble clic en Default.aspx para abrir el formulario Web Form. 2. En el menú Ver, haga clic en Código. Se abrirá la clase de código subyacente. La clase se denomina _Default. El archivo de la clase se llama Default.aspx.cs o Default.aspx.vb. Nota Si su página Default.aspx predeterminada se creó con código en línea, no coloque dicho código en un archivo independiente. En tal caso, elimine la página ASPX y vuelva a crearla. Al crear la página ASPX, active la casilla de verificación "Colocar código en archivo independiente". 3. Si utiliza Visual Basic para escribir la clase, escriba "Option Strict On" en la parte superior de la clase. Nota Como práctica recomendada, se sugiere establecer Option Strict On al comienzo de cualquier clase de Visual Basic del sitio Web. Cuando se escribe código, se impone el uso de las prácticas más recomendables, con declaraciones de variables con tipos declarados y una proyección válida. Ambos se comprueban durante la compilación. Las comprobaciones de cumplimiento estricto realizadas durante la compilación pueden reducir las excepciones en tiempo de ejecución. 1.2.2.1.2.2 Para agregar instrucciones Imports/Using a los espacios de nombres de referencia Procedimiento 1. Abra la página Default.aspx. 2. En el menú Ver, haga clic en Código. Aparece la clase de código subyacente del formulario Web Form. 3. Sobre la firma de clase, agregue una declaración "Imports" [Visual Basic] o "using" [C#] a la parte superior de la clase que contenga los siguientes espacios de nombres de SAP Crystal Reports. Imports CrystalDecisions.CrystalReports.Engine Imports CrystalDecisions.Shared using CrystalDecisions.CrystalReports.Engine; using CrystalDecisions.Shared; Nota Las clases de estos dos ensamblados se usan habitualmente en todos los tutoriales. Si hay ensamblados adicionales que pueda necesitar ocasionalmente en tutoriales específicos, se le indicará que los agregue durante dicho tutorial. 16 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 1.2.2.1.2.3 Para agregar un método de ayuda privado para el código de configuración de SAP Crystal Reports Procedimiento En la clase, agregue un nuevo método de ayuda de ámbito privado sin valor de devolución, denominado ConfigureCrystalReports(). Private Sub ConfigureCrystalReports() End Sub private void ConfigureCrystalReports() { } El método ConfigureCrystalReports() permite a los usuarios interactuar con el informe en tiempo de ejecución. Además, controla la interacción mediante programación con el informe. Pasos siguientes A continuación, agregue un controlador de eventos Page_Init desde el que se llamará al método ConfigureCrystalReports(). Si se llama al métodoConfigureCrystalReports() desde este controlador de eventos, se garantiza que el código de configuración de informes de Crystal se ejecute durante el evento de inicialización de páginas. 1.2.2.1.2.4 Para agregar un controlador de eventos Page_Init a la clase de código subyacente Contexto Normalmente el controlador de eventos Page_Load se usa para especificar código de configuración de Web Forms en una aplicación Web de ASP.NET para que el código se llame durante el evento Page.Load. Sin embargo, el código de configuración del informe de Crystal se debe llamar antes durante el evento Page.Init. Procedimiento 1. Agregue el evento Page_Init al código. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 17 ○ Si está codificando en Visual Basic, seleccione Eventos de página en la lista desplegable de la parte superior izquierda y, a continuación, el evento Init en lista desplegable de la parte superior derecha. El controlador de eventos Page_Init se agregará a la clase subyacente. Private Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init End Sub ○ Si está codificando en C#, escriba el control de eventos Page_Init con la siguiente sintaxis exacta. private void Page_Init(object sender, EventArgs e) { } Nota En un formulario Web de C# en Visual Studio 2005 o posterior, los controladores de eventos Page_Init, Page_Load o Page_PreRender de la clase de código subyacente se conectan automáticamente al evento Init, Load o PreRender. La firma del control de eventos deberá coincidir exactamente para que sea llamada. Esta característica ocurre cuando la directiva Page, que se encuentra en la parte superior de la página ASPX en la vista HTML, tiene el parámetro AutoEventWireup establecido como true. Las versiones anteriores de Visual Studio .NET siempre establecían la directiva AutoEventWireup Page en False, pero en los formularios Web de C# en Visual Studio 2005 y posterior la directiva AutoEventWireup Page se establece en True de forma predeterminada. 2. En el controlador de eventos Page_Init de Visual Basic o C#, indique una llamada al método de auxiliar ConfigureCrystalReports(). ConfigureCrystalReports() ConfigureCrystalReports(); 3. En el menú Archivo, haga clic en Guardar todo. 1.2.2.1.3 Para agregar un control de CrystalReportViewer a un sitio Web Procedimiento 1. Abra la página Default.aspx. 2. Haga clic en el botón Diseño situado en la parte inferior de la vista del formulario. 3. En el Cuadro de herramientas, abra el nodo Informes para buscar el control CrystalReportViewer. 18 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Nota En las versiones anteriores de SAP Crystal Reports, versión para programadores de Microsoft Visual Studio, el control CrystalReportViewer aparecía en el nodo Crystal Reports. 4. Arrastre y coloque el control CrystalReportViewer en el formulario Web Forms. 5. En el menú Archivo, haga clic en Guardar todo. Resultados Cuando se agrega un control CrystalReportViewer a su aplicación, se agregarán de forma automática a su proyecto referencias a los ensamblados de SAP Crystal Reports. 1.2.2.1.4 Configuración del archivo Web.Config Un archivo Web.Config de una aplicación Web ASP.NET almacena configuración global, como información de conexión de base de datos, referencias de ensamblados y tratamiento de errores. Este archivo se escribe en XML y su elemento raíz siempre debe ser <configuration>. Se trata de una configuración avanzada y es opcional. Los elementos siguientes son exclusivos de SAP Crystal Reports y se pueden agregar al archivo Web.Config. Nota Los números de versión pueden cambiar según el producto que tenga. Nota En .NET 2.0 y versiones superiores, la etiqueta section del archivo Web.Config debe utilizar la siguiente sintaxis: <configSections> <sectionGroup name="businessObjects"> <sectionGroup name="crystalReports"> <section name="printControl" type="System.Configuration.NameValueSectionHandler" /> </sectionGroup> </sectionGroup> </configSections> CrystalImageCleaner El proceso CrystalImageCleaner elimina automáticamente las imágenes generadas que ha representado el control CrystalReportViewer. Esta configuración permite establecer el intervalo de tiempo entre la exploración del directorio de imágenes y la duración mínima de los archivos antes de que se eliminen. Este elemento se agrega Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 19 automáticamente al archivo Web.Config cuando se agrega el control CrystalReportViewer al sitio Web. Esto corresponde a la clase CrystalImageCleaner. ● CrystalImageCleaner-Sleep inicializa el período de tiempo en milisegundos que el sistema de limpieza de imágenes permanece inactivo antes de buscar y limpiar los archivos de imagen del directorio de imágenes dinámicas. ● CrystalImageCleaner-Age inicializa la duración mínima en milisegundos de un archivo antes de que se elimine. ● CrystalImageCleaner-AutoStart controla el proceso CrystalImageCleaner. El sistema de limpieza de imágenes limpia las imágenes temporales que se han creado al visualizar un informe. Nota Sólo se puede iniciar un sistema de limpieza en un único proceso de trabajo ASP.NET. <appSettings> <add key="CrystalImageCleaner-AutoStart" value="true" /> <add key="CrystalImageCleaner-Sleep" value="60000" /> <add key="CrystalImageCleaner-Age" value="120000" /> </appSettings> CrystalImageHandler El elemento CrystalImageHandler muestra todas las imágenes dinámicas en el control CrystalReportViewer. Este ajuste configura el proceso de trabajo de ASP.NET para redirigir las solicitudes efectuadas a CrystalImageHandler.aspx a una clase interna de controlador de imágenes solamente. Si no tiene la configuración CrystalImageHandler en el archivo Web.Config, no se mostrarán las imágenes del sitio web. Este elemento se agrega automáticamente al archivo Web.Config cuando se agrega el control CrystalReportViewer al sitio Web. <system.web> <httpHandlers> <add verb="GET" path="CrystalImageHandler.aspx" type="CrystalDecisions.Web.CrystalImageHandler, CrystalDecisions.Web, Version=13.0.2000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304"/> </httpHandlers> </system.web> documentView El elemento documentView controla el aspecto del informe en el lienzo de informes. Hay dos configuraciones disponibles: ● Si se establece el valor a printlayout se muestra un borde gris alrededor del informe y una sombra en el lienzo. Este es el valor predeterminado. 20 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net ● Si el valor se establece en weblayout, el lienzo se rellenará con el informe. <configSections> <sectionGroup name="businessObjects"> <sectionGroup name="crystalReports"> <section name="crystalReportViewer" type="System.Configuration.NameValueSectionHandler" /> </sectionGroup> </sectionGroup> </configSections> <businessObjects> <crystalReports> <crystalReportViewer> <add key="documentView" value="weblayout"/> </crystalReportViewer> </crystalReports> </businessObjects> EnableTextClipping El elemento EnableTextClipping controla si el texto del campo está cortado. Si está definido como verdadero, el texto de un campo dado no superpondrá el texto del campo contiguo. <configSections> <sectionGroup name="businessObjects"> <sectionGroup name="crystalReports"> <section name="crystalReportViewer" type="System.Configuration.NameValueSectionHandler" /> </sectionGroup> </sectionGroup> </configSections> <businessObjects> <crystalReports> <crystalReportViewer> <add key="EnableTextClipping" value="true"/> </crystalReportViewer> </crystalReports> </businessObjects> globalResourcePath El elemento globalResourcePath es la referencia a la ruta del directorio de archivos para los recursos globales. Este directorio de archivos contiene los recursos de idioma personalizados en una ubicación central y se puede compartir entre varias aplicaciones Web. Este ajuste permite acceder a los recursos globales de un sitio Web específico. En SAP CrystalReports.NET, los archivos de recursos predeterminados no se incluyen en la instalación del producto, pero pueden descargarse desde el sitio Web de asistencia técnica de SAP BusinessObjects: http:// help.sap.com. Este elemento se tiene que agregar manualmente al archivo Web.Config del sitio Web. <appSettings> Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 21 <add key="globalResourcePath" value="c:\CrystalReportViewer_resource_files\"/> </appSettings> maxNumberListOfValues maxNumberListOfValues controla el número de elementos de LOV que se enviarán al cliente. Esto controla el número de valores que se muestran en el panel de parámetros. Cuando se establece este valor, sólo aparecerán los primeros n valores en una lista de valores. Podrá consultar los diferentes conjuntos de valores en el cuadro de diálogo Avanzado en función del tamaño de su lista y del valor del elemento maxNumberListOfValues. Por ejemplo, si dispone de 180 valores, y establece el elemento maxNumberListOfValues en 50, podrá ver los primeros 50 valores enumerados en el panel de parámetros. Podrá consultar los 180 valores en el cuadro de diálogo Avanzado, donde se mostrarán los tres grupos de 50 valores, y un grupo de 30. Se recomienda que este valor siempre sea mayor que 0. El valor predeterminado es 200. <configSections> <sectionGroup name="businessObjects"> <sectionGroup name="crystalReports"> <section name="crystalReportViewer" type="System.Configuration.NameValueSectionHandler" /> </sectionGroup> </sectionGroup> </configSections> <businessObjects> <crystalReports> <crystalReportViewer> <add key="maxNumberListOfValues" value="50"/> </crystalReportViewer> </crystalReports> </businessObjects> printControl El elemento printControl permite imprimir el informe directamente en la impresora local. El directorio de instalación predeterminado es C:\Program Files (x86)\SAP BusinessObjects\Crystal Reports for .NET Framework 4.0\Common\Crystal Reports 2011\crystalreportviewers. Esta configuración hace que el archivo .cab esté visible para el sitio Web de SAP Crystal Reports .NET. Este elemento se tiene que agregar manualmente al archivo Web.Config del sitio Web. <configSections> <sectionGroup name="businessObjects"> <sectionGroup name="crystalReports"> <section name="printControl" type="System.Configuration.NameValueSectionHandler" /> </sectionGroup> </sectionGroup> </configSections> <businessObjects> 22 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net <crystalReports> <printControl> <add key="url" value="http://localhost/PrintControl.cab" /> </printControl> </crystalReports> </businessObjects> processingIndicatorDelay El elemento processingIndicatorDelay controla el tiempo que transcurre antes de que aparezca el indicador de procesamiento de informes. Este valor se indica en milisegundos. Si se establece este valor en 0, se deshabilitará el indicador de procesamiento de informes. El valor predeterminado es 200 milisegundos. <configSections> <sectionGroup name="businessObjects"> <sectionGroup name="crystalReports"> <section name="crystalReportViewer" type="System.Configuration.NameValueSectionHandler" /> </sectionGroup> </sectionGroup> </configSections> <businessObjects> <crystalReports> <crystalReportViewer> <add key="processingIndicatorDelay" value="20"/> </crystalReportViewer> </crystalReports> </businessObjects> processingIndicatorText El elemento processingIndicatorText controla el texto que se muestra en el indicador de procesamiento de informes. El texto predeterminado es: Espere mientras el documento se procesa. <configSections> <sectionGroup name="businessObjects"> <sectionGroup name="crystalReports"> <section name="crystalReportViewer" type="System.Configuration.NameValueSectionHandler" /> </sectionGroup> </sectionGroup> </configSections> <businessObjects> <crystalReports> <crystalReportViewer> <add key="processingIndicatorText" value="Thank you for waiting."/> </crystalReportViewer> </crystalReports> </businessObjects> Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 23 reportMappings El elemento reportMappings actualiza los sitios Web creados en Visual Studio 2003 que utilizan informes incrustados a sitios Web no incrustados cuando se abren en Visual Studio 2005 o posterior. Esta configuración convierte el archivo .dll creado en Visual Studio 2003 en un archivo de disco. Visual Studio 2005 y 2008 no admiten sitios Web incrustados y debe modificar el archivo Web.Config para garantizar que sigue siendo funcional con la versión más reciente de Visual Studio. Este elemento se tiene que agregar manualmente al archivo Web.Config del sitio Web. La configuración reportMappings requiere una ruta absoluta. Nota Este elemento sólo es válido para Visual Studio 2005 y Visual Studio 2008. <configSections> <sectionGroup name="businessObjects"> <sectionGroup name="crystalReports"> <section name="reportMappings" type="CrystalDecisions.Shared.ReportMappingHandler" /> </sectionGroup> </sectionGroup> </configSections> <businessObjects> <crystalReports> <reportMappings> <add reportName="World Sales Report.rpt" path="C:\Report\World Sales Report.rpt" /> </reportMappings> </crystalReports> </businessObjects> resourceURI El elemento resourceURI establece la ubicación del directorio crystalreportviewers en su aplicación Web. El directorio crystalreportviewers contiene todos los archivos que necesita el visor. <configSections> <sectionGroup name="businessObjects"> <sectionGroup name="crystalReports"> <section name="crystalReportViewer" type="System.Configuration.NameValueSectionHandler" /> </sectionGroup> </sectionGroup> </configSections> <businessObjects> <crystalReports> <crystalReportViewer> <add key="resourceURI" value="~/crystalreportviewers12" /> </crystalReportViewer> </crystalReports> </businessObjects> 24 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net serverFileReportManager El elemento serverFileReportManager es un servicio Web que enumera los archivos del servidor en el equipo del servidor. Este ajuste permite obtener una lista de objetos (carpetas e informes) desde un equipo remoto. Este ajuste asigna la raíz del directorio de archivos para el servidor. En este ejemplo, la raíz se establece en c: \inetpub\wwroot. Este elemento se tiene que agregar manualmente al archivo Web.Config del sitio Web. Nota Esto corresponde a la clase serverFileReportManager. <configSections> <sectionGroup name="crystalDecisions"> <section name="serverFileReportManager" type="System.Configuration.NameValueSectionHandler" /> </sectionGroup> </configSections> <crystalDecisions> <serverFileReportManager> <add key="rootDirectory" value="c:\inetpub\wwwroot" /> </serverFileReportManager> </crystalDecisions> UseAsynchronousRequests De forma predeterminada, se permiten las solicitudes asíncronas dentro del visor de DHTML. Si desea habilitar el botón Atrás en el navegador del usuario para que funcione con el visor DHTML, deberá deshabilitar las solicitudes asíncronas estableciendo este parámetro a false. Nota No se recomienda establecer el elemento UseAsynchronousRequests en false. Si lo hace, se deshabilitará el cuadro de diálogo Avanzado en el panel de parámetros, así como algunas mejoras de rendimiento del visor y funciones de aspecto mejoradas. <context-param> <param-name>crystal_use_asynchronous_requests</param-name> <param-value>false</param-value> </context-param> UseBrowserLocale El elemento UseBrowserLocale recupera la configuración de idioma del explorador para el control CrystalReportViewer. Cuando se establece en true, este ajuste configura el control CrystalReportViewer para observar la configuración regional del explorador. Cuando se establece en false, este ajuste restringe la Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 25 configuración regional que se muestra página a página. Este elemento se tiene que agregar manualmente al archivo Web.Config del sitio Web. <configSections> <sectionGroup name="businessObjects"> <sectionGroup name="crystalReports"> <section name="crystalReportViewer" type="System.Configuration.NameValueSectionHandler" /> </sectionGroup> </sectionGroup> </configSections> <businessObjects> <crystalReports> <crystalReportViewer> <add key="UseBrowserLocale" value="true" /> </crystalReportViewer> </crystalReports> </businessObjects> Ejemplo Archivo Web.Config de ejemplo <?xml version="1.0"?> <configuration> <appSettings> <add key="CrystalImageCleaner-AutoStart" value="true"/> <add key="CrystalImageCleaner-Sleep" value="60000"/> <add key="CrystalImageCleaner-Age" value="120000"/> </appSettings> <connectionStrings/> <system.web> <compilation debug="true"> <assemblies> <add assembly="CrystalDecisions.Web, Version=13.0.2000, Culture=neutral, PublicKeyToken=692FBEA5521E1304"/> <add assembly="CrystalDecisions.Shared, Version=13.0.2000, Culture=neutral, PublicKeyToken=692FBEA5521E1304"/> <add assembly="CrystalDecisions.ReportSource, Version=13.0.2000, Culture=neutral, PublicKeyToken=692FBEA5521E1304"/> <add assembly="CrystalDecisions.CrystalReports.Engine, Version=13.0.2000, Culture=neutral, PublicKeyToken=692FBEA5521E1304"/> </assemblies> </compilation> <authentication mode="Windows"/> <httpHandlers> <add verb="GET" path="CrystalImageHandler.aspx" type="CrystalDecisions.Web.CrystalImageHandler, CrystalDecisions.Web, Version=12.1.2000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304"/> </httpHandlers> </system.web> </configuration> Información relacionada Imprimir 26 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Web: configurar la localización basada en el explorador Web configurar recursos personalizados globales o locales Cómo agregar o eliminar referencias en Visual Studio Versiones de SAP Crystal Reports 1.2.2.2 Studio Configuración de proyectos de Windows en Visual Esta sección constituye un punto de aprendizaje clave tanto para programadores de nivel avanzado como intermedio. Aquí se muestran las mejores prácticas recomendadas para continuar con la creación y la configuración de un nuevo proyecto de Windows con SAP Crystal Reports, versión para programadores de Microsoft Visual Studio. En esta sección se muestra la configuración de un proyecto de Windows mediante un modelo de codificación. Como parte de esta configuración, se tendrá acceso a la clase Form1 y se escribirá código. Este proyecto de Windows basado en código que se crea sirve también como requisito previo para los tutoriales de codificación suministrados junto con esta ayuda en línea. 1.2.2.2.1 Studio Crear un nuevo proyecto de Windows en Visual Procedimiento 1. Inicie Visual Studio. 2. En el menú Archivo, seleccione Nuevo y, a continuación, haga clic en Proyecto. 3. En el cuadro de diálogo Nuevo proyecto, seleccione una carpeta de lenguaje para C# o Visual Basic en la lista Tipos de proyecto. 4. En la lista Plantillas, haga clic en Aplicación para Windows Forms. 5. En el campo Nombre, sustituya el nombre de proyecto predeterminado por el nombre de su proyecto. Utilice la convención de nomenclatura Pascal, donde se escribe la primera letra del nombre del proyecto en mayúsculas, ya que el nombre del proyecto también se utilizará como nombre del espacio de nombres para el ensamblado generado a partir del proyecto. 6. Haga clic en Aceptar. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 27 1.2.2.2.2 Aplicar la configuración de proyecto Visual Basic estándar (opcional) Contexto Si desea configurar el proyecto de forma que se pueda utilizar con los tutoriales incluidos en esta documentación, es necesario realizar una pequeña modificación en la configuración del mismo. Procedimiento 1. En Explorador de soluciones, haga clic con el botón derecho en el nombre de proyecto en negrita bajo del nombre de solución y, a continuación, seleccione Propiedades. 2. En la vista Propiedades, haga clic en la ficha Compilar. 3. En la lista OptionStrict, haga clic en Activada. 4. Cierre la vista Propiedades. 5. En el menú Archivo, haga clic en Guardar todo. Nota Como práctica recomendada, se sugiere habilitar OptionStrict al comienzo de cualquier proyecto de Visual Basic. Cuando se escribe código, se impone el uso de las prácticas más recomendables, con declaraciones de variables con tipos declarados y una proyección válida. Ambos se comprueban durante la compilación. Las comprobaciones de cumplimiento estricto realizadas durante la compilación pueden reducir las excepciones en tiempo de ejecución. 1.2.2.2.3 Preparar el formulario Windows Form en Visual 1.2.2.2.3.1 Para crear el formulario de Windows Form Contexto Por lo general, en las aplicaciones para Windows de Visual Basic 6, un formulario predeterminado se define con el nombre Form1. Siguiendo este modelo, en un proyecto de Windows se utiliza el mismo nombre predeterminado de formulario, Form1, con la extensión cs o vb, en función del lenguaje que se utilice. Procedimiento 1. 28 Si Form1 no aparece en la ventana principal, haga doble clic en Form1 en el Explorador de soluciones para abrirlo en la vista Diseño. © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Form1 se abrirá en Designer. 2. En el menú Ver, haga clic en Código. Aparece la vista Código de la clase Form1. La presentación de esta clase depende de si la aplicación para Windows se codifica en Visual Basic o C#. En C#, la clase Form1 muestra lo siguiente: ○ La firma de clase. ○ Un constructor (Form1). En Visual Basic, la clase Form1 muestra lo siguiente: ○ La firma de clase (una clase Form1). Nota Una clase "partial" independiente contiene métodos y variables adicionales de la clase Form1. (Esto es cierto para C# y Visual Basic). Las clases parciales se explican posteriormente en Configuración de proyectos de Windows. 1.2.2.2.3.2 Para agregar un método de ayuda privado para el código de configuración de SAP Crystal Reports Procedimiento 1. Agregue a esta clase Form1 un nuevo método auxiliar de ámbito privado sin valor devuelto, denominado ConfigureCrystalReports(). Private Sub ConfigureCrystalReports() End Sub private void ConfigureCrystalReports() { } A continuación, agregue un controlador de eventos Form_Load y una llamada a ConfigureCrystalReports() en el controlador de eventos Form_Load. De este modo, el método ConfigureCrystalReports() se ejecutará automáticamente al cargar el formulario. 2. 3. En el menú Ver, haga clic en Diseñador. Haga doble clic en Form1. Regresará a la vista Código. Como hizo doble clic en Form1, se generará automáticamente un controlador de eventos Form1_Load en la clase Form1. 4. En el control de eventos Form1_Load, escriba una llamada al método ConfigureCrystalReports(). ConfigureCrystalReports() Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 29 ConfigureCrystalReports(); 5. En el menú Archivo, haga clic en Guardar todo. 1.2.2.2.4 Agregar un control CrystalReportViewer 1.2.2.2.4.1 Para agregar un control de CrystalReportViewer a una aplicación de Windows Procedimiento 1. Abra un formulario de Windows Form en la vista Diseño. 2. En el Cuadro de herramientas, abra el nodo Informes para buscar el control CrystalReportViewer. Nota En las versiones anteriores de Visual Studio, el control CrystalReportViewer aparecía en el nodo Crystal Reports. 3. Arrastre y suelte el control CrystalReportViewer en el formulario. 4. En el menú Archivo, haga clic en Guardar todo. Resultados Cuando se agrega un control CrystalReportViewer a su aplicación, se agregarán de forma automática a su proyecto referencias a los ensamblados de SAP Crystal Reports. 1.2.2.2.4.2 Para agregar instrucciones Imports/Using a los espacios de nombres de referencia Procedimiento 1. Si la carpeta Referencias no está visible en Explorador de soluciones, en la barra de herramientas Explorador de soluciones, haga clic en Mostrar todos los archivos para mostrar todos los archivos de proyecto. 2. En Explorador de soluciones, expanda la carpeta Referencias. 3. Verifique que se han agregado los siguientes ensamblados de SAP Crystal Reports: 30 ○ CrystalDecisions.CrystalReports.Engine ○ CrystalDecisions.Shared © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 4. Seleccione Form1 y, a continuación, en el menú Ver, haga clic en Código. 5. Sobre la firma de clase, agregue una declaración "Imports" [Visual Basic] o "using" [C#] a la parte superior de la clase que contenga los siguientes espacios de nombres de SAP Crystal Reports. Imports CrystalDecisions.CrystalReports.Engine Imports CrystalDecisions.Shared using CrystalDecisions.CrystalReports.Engine; using CrystalDecisions.Shared; 1.3 Aspectos fundamentales del SDK 1.3.1 1.3.1.1 Arquitectura Elegir el modelo de objetos correcto para el proyecto Para elegir el modelo de objetos correcto para el proyecto, debe comprender los métodos prácticos para trabajar con el control CrystalReportViewer y saber cómo interactúa este control con el resto de los modelos de objetos. Nota En esta documentación, un modelo de objetos hace referencia a una clase básica y las clases que la rodean, que forman un modelo de programación. En SAP Crystal Reports estos modelos de objetos se basan en una clase básica que encapsula un archivo de definición de informes. Esa clase básica y el modelo de objetos que la rodea permiten la interacción mediante programación con el informe. Método práctico para trabajar con el control CrystalReportViewer Una aplicación Web eficaz diferencia claramente su nivel de presentación de la lógica de negocios subyacente. El diseño del control ASP.NET promueve de forma natural este modelo. Encapsula la información de presentación en el control y, a continuación, lo enlaza a un objeto subyacente o a un modelo de objetos que lleva a cabo la lógica de negocios. CrystalReportViewer es un control .NET que sigue esta arquitectura. Funciona como objeto de presentación de Web Form o Windows Form (el nivel de presentación), y se puede enlazar a cualquiera de los siguientes modelos de objetos: ● Modelo de objetos ReportDocument ● Modelo de objetos ReportClientDocument (Report Application Server) ● Modelo de objeto InfoObject (SAP Crystal Reports Server o plataforma SAP BusinessObjects Business Intelligence) Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 31 En un caso de método práctico, el control CrystalReportViewer enlaza a uno de los modelos de objetos que lleva a cabo la lógica de negocios, normalmente para la manipulación del informe. En este caso, el control CrystalReportViewer limita su interacción mediante programación para modificar sólo la configuración de presentación; por ejemplo, ocultar o mostrar la barra de herramientas del visor o un botón de esa barra de herramientas. Modelo de objetos CrystalReportViewer El control CrystalReportViewer contiene propiedades y métodos que permiten la interacción con la presentación de los informes. Asimismo tiene unas pocas propiedades y métodos para interactuar con los informes enlazados al control. Estas propiedades y métodos constituyen un modelo de objetos limitado. Algunos casos de enlaces de informes se basan en el modelo de objetos CrystalReportViewer. En estos casos, el control CrystalReportViewer se enlaza directamente a un informe (por ejemplo, se pasa una cadena de ruta al informe de un directorio de archivos), sin encapsular primero el informe en ningún modelo de objetos. En dichos casos, puesto que el control CrystalReportViewer encapsula el informe directamente, se debe basar en el modelo de objetos limitado del control para interactuar con el informe mediante programación. Pero en la mayoría de los casos de enlace, es desalentador utilizar CrystalReportViewer como modelo de objetos. En su lugar, utilice el modelo de objetos ReportDocument, por las siguientes razones: ● El modelo de objetos CrystalReportViewer genera el riesgo de crear conflictos entre los modelos de objetos. No mezcle el modelo de objetos CrystalReportViewer con otros modelos. ● El modelo de objetos CrystalReportViewer proporciona una interacción limitada con los informes; contiene un pequeño subconjunto de las funciones disponibles en el modelo de objetos ReportDocument. ● El modelo de objetos CrystalReportViewer difumina la separación del nivel de presentación y de la lógica de negocios subyacente del código. El modelo de objetos ReportDocument ReportDocument es un modelo de objetos más eficaz y completo que CrystalReportViewer. Se incluye con el SDK de SAP Crystal Reports .NET y proporciona mayores posibilidades de manipular los informes en el código. ¿Cuál es el modelo de objetos que se debe utilizar? Si no va a actualizar a SAP Crystal Reports Server ni a la plataforma SAP BusinessObjects Business Intelligence, el modelo de objeto ReportDocument es el modelo de objeto recomendado para el trabajo de desarrollo con el SDK de SAP Crystal Reports. Nota En SAP Crystal Reports 10 o superior y SAP Crystal Reports para Visual Studio 2005, el modelo de objetos ReportDocument se ha adaptado al modelo de objetos ReportClientDocument para facilitar la actualización a un servidor. 32 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 1.3.1.2 Evitar mezclar los modelos de objetos No mezcle el modelo de objetos CrystalReportViewer con otros modelos. El uso del control CrystalReportViewer en su función de modelo de objetos limitado funciona correctamente, siempre y cuando lo enlace directamente al informe con una cadena de ruta sencilla. Pero si lo encapsula en uno de los demás modelos de objetos (como ReportDocument o ReportClientDocument) y, a continuación, enlaza el control a ese modelo de objetos, deje de utilizar inmediatamente el modelo de objetos CrystalReportViewer. El modelo limitado que se proporciona con el control CrystalReportViewer se convierte en redundante respecto al modelo de objetos más eficaz al que está enlazado. Además, la configuración que se aplica al modelo de objetos CrystalReportViewer es visible para el otro modelo de objetos, lo que podría dar lugar a un comportamiento y excepciones inesperados. Por ejemplo, quizá prefiera utilizar el modelo de objetos ReportDocument para exportar o imprimir un informe mensual desde el servidor. Si ha establecido un parámetro mensual en este informe con el modelo de objetos CrystalReportViewer, puede que experimente problemas. El modelo de objetos ReportDocument no puede ver la configuración de parámetros aplicada en el modelo de objetos CrystalReportViewer. Intentará exportar o imprimir el informe sin darse cuenta de la existencia de esa configuración de parámetro mensual y, a continuación, mostrará el mes equivocado o incluso provocará una excepción. La mejor respuesta es limitar el uso del control CrystalReportViewer para informar de la configuración de presentación sólo cuando el control se haya enlazado a uno de los modelos de objetos subyacentes. 1.3.1.3 SAP Crystal Reports Designer incrustado SAP Crystal Reports Designer incrustado crea o modifica informes. Está formado por una interfaz gráfica para el usuario para el diseño de informes WYSIWYG, y una serie de asistentes que simplifican la conectividad, la ordenación, el agrupamiento de los datos y los problemas de diseño de informes complejos adicionales. SAP Crystal Reports Developer incluye una versión mejorada del diseñador incrustado que permite crea potentes informes y aplicaciones de elaboración de informes. El diseñador incrustado que se incluye con SAP Crystal Reports, versión para programadores de Microsoft Visual Studio contiene muchas de las funciones de SAP Crystal Reports Designer. Función de SAP Crystal Reports Designer incrustado en la arquitectura SAP Crystal Reports Designer incrustado se incluye en la descripción de la arquitectura porque su función es fundamental para SAP Crystal Reports, versión para programadores de Microsoft Visual Studio: crea los archivos de informe que se mostrarán. Sin embargo, la función de SAP Crystal Reports Designer incrustado es una función en tiempo de diseño. La función que implica la presentación e interacción con los informes, que se produce en tiempo de ejecución, pertenece al SDK de SAP Crystal Reports. Por lo tanto, aunque el diseñador incrustado crea los informes que se utilizan en la arquitectura, no forma parte de la propia arquitectura. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 33 Información relacionada Usar SAP Crystal Reports Designer incrustado [página 642] 1.3.1.4 Controles de visores de informes SAP Crystal Reports, versión para programadores de Microsoft Visual Studio incluye controles de forma estándar para visualizar informes. Cada control encapsula compleja información de diseño de informe en un objeto GUI dentro del cuadro de herramientas. Se incluyen dos controles: El control CrystalReportViewer. Este control muestra el informe con un diseño basado en páginas, con la posibilidad de moverse entre ellas. Control CrystalReportPartsViewer. El control muestra información de resumen de informe en una pequeña ventana al estilo de un portal, con la posibilidad de profundizar en el informe a través de una serie de partes vinculadas. Cada control se usa para mostrar un informe arrastrando y soltando el control desde el Cuadro de herramientas en el formulario Web o para Windows y, a continuación, asignando la propiedad ReportSource de dicho control a un informe. Información relacionada ¿Cómo utilizo los controles de visores de informes? [página 42] 1.3.1.5 Modelos de objetos SAP Crystal Reports, versión para programadores de Microsoft Visual Studio proporciona un SDK que contiene dos modelos de objetos. Con licencia adicional, el SDK se expande para contener cuatro modelos de objetos. Los controles del visor de informes proporcionan el punto de entrada al SDK. La razón es que el visor de informes muestra los informes mediante el enlace a un objeto de informe; todos los modelos de objetos del SDK exponen y manipulan objetos de informe. Cada modelo de objetos proporciona niveles de mayor eficacia y complejidad: ● El modelo de objetos más sencillo es CrystalReportViewer. El control CrystalReportViewer de un formulario Web Forms o Windows Forms tiene, por definición, una clase subyacente del mismo nombre. Esta clase CrystalReportViewer expone propiedades y métodos para modificar la funcionalidad de presentación del control, así como para interactuar con las clases que administran inicios de sesión, parámetros y fórmulas de selección de base de datos. Este conjunto de clases es el modelo de objetos más sencillo. La clase CrystalReportViewer existe de dos formas distintas: una en un espacio de nombres de Windows y otra en un espacio de nombres Web. Por tanto, muchos elementos de este 34 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net modelo de objetos se duplican en ambos espacios de nombres, con algunas variaciones para admitir las diferencias de las plataformas Windows y Web. Las clases de este modelo de objetos se incluyen en el espacio de nombres CrystalDecisions.Web para la versión de formularios Web Forms de este control o en el espacio de nombres CrystalDecisions.Windows.Forms para la versión de formularios Windows Forms del control. ● Un modelo de objetos más amplio es ReportDocument. La clase ReportDocument es una puerta de enlace al conjunto de clases del espacio de nombres Engine, que incluye Database, DataDefinition, ExportOptions, PrintOptions, ReportDefinition, ReportOptions y SummaryInfo. Se trata de un conjunto más completo de clases que proporcionan posibilidades más eficaces de personalización e interacción con el informe. Las clases de este modelo de objetos se incluyen en el espacio de nombres CrystalDecisions.CrystalReports.Engine. ● Los siguientes modelos de objetos están disponibles mediante actualización: ○ Un modelo de objetos con mayor posibilidad de modificación de informes denominado ReportClientDocument. Esta clase funciona como puerta de enlace a un modelo de objetos mucho más amplio formado por muchas clases de varios espacios de nombres. Expone la estructura completa del informe mediante el SDK, de tal forma que se pueden crear o modificar todos los aspectos del informe mediante programación en tiempo de ejecución. Las clases de este modelo de objetos se incluyen en el grupo de espacios de nombres CrystalDecisions.ReportAppServer. El modelo de objetos ReportClientDocument se suministra con un Report Application Server (RAS), para el que se requiere una licencia adicional. Hay disponible un servidor de aplicaciones de informes con SAP Crystal Reports Server y la plataforma SAP BusinessObjects Business Intelligence. ○ Un modelo de objetos más completo para interactuar con las funciones en el nivel de plataforma SAP Crystal Reports Server o la plataforma SAP BusinessObjects Business Intelligence, denominado InfoObject. Se suministra con la licencia de SAP Crystal Reports Server o de la plataforma SAP BusinessObjects Business Intelligence. Esta clase funciona como puerta de enlace al modelo completo de objetos de plataforma SAP Crystal Reports Server o de la plataforma SAP BusinessObjects Business Intelligence. Las clases de este modelo de objetos se incluyen en el grupo de espacios de nombres CrystalDecisions.Enterprise. Nota El modelo de objetos InfoObject se proporciona sólo con SAP Crystal Reports Server y la plataforma SAP BusinessObjects Business Intelligence, para la que se requiere una licencia adicional. Información relacionada Elegir el modelo de objetos correcto para el proyecto [página 31] Comparar soluciones de elaboración de informes de SAP BusinessObjects Business Intelligence [página 64] Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 35 1.3.1.5.1 Modelo de objetos CrystalReportViewer La clase CrystalReportViewer tiene dos funciones: ● En el formulario Web Forms o Windows Forms, CrystalReportViewer se expone como control .NET que se puede agregar al formulario para mostrar el informe. Para obtener información específica sobre su función como control .NET, vea Controles de visores de informes [página 34]. ● En el código subyacente del formulario Web Forms o Windows Forms, la clase CrystalReportViewer proporciona el modelo de objetos más sencillo del SDK. Exploraremos ese modelo de objeto más adelante en esta sección. La forma más sencilla de colocar un informe en un formulario Web Forms o Windows Forms es agregar el control CrystalReportViewer al formulario y, a continuación, en la clase de código subyacente, asignar la ruta del informe como cadena a la propiedad ReportSource de la clase CrystalReportViewer. Si asigna la ruta del informe directamente al control (en vez de colocar el informe dentro de un modelo de objetos más complejo, como ReportDocument o ReportClientDocument), restringe la interfaz a sólo el modelo de objetos más sencillo: CrystalReportView Comparación del modelo de objetos CrystalReportViewer CrystalReportViewer tiene dos diagramas de modelo de objetos, ya que se vuelve a utilizar el mismo nombre de control y de clase (y, por tanto, su modelo de objetos subyacente) en aplicaciones para Windows y Web. Por consiguiente, el modelo de objetos CrystalReportViewer se repite (con variaciones mínimas) en dos espacios de nombres distintos. La versión de Windows de CrystalReportViewer incluye las clases y los eventos principales compartidos por las versiones de Windows y Web del modelo de objetos. La versión Web del modelo de objetos CrystalReportViewer incluye las mismas clases y eventos que la versión de Windows, pero, además, tiene los siguientes eventos relacionados con la forma en que se carga la página ASPX. Información relacionada Controles de visores de informes [página 34] Enlazar informes al modelo de objetos CrystalReportViewer [página 169] 1.3.1.5.2 Modelo de objetos ReportDocument La clase ReportDocument proporciona un modelo de objetos más completo para el SDK que el modelo de objetos CrystalReportViewer. La clase ReportDocument forma parte del espacio de nombres CrystalDecisions.CrystalReports.Engine. Funciona como puerta de enlace a un conjunto de clases del 36 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net espacio de nombres Engine, que proporciona más herramientas para la manipulación de un informe mediante programación. El modelo de objetos ReportDocument En la sección anterior, aprendió a trabajar con el modelo de objetos CrystalReportViewer básico asignando la cadena de la ruta de un informe directamente al control CrystalReportViewer. En el siguiente nivel del modelo de objetos, utilice el modelo de objetos ReportDocument para encapsular el informe dentro de una instancia de ReportDocument, antes de que se asigne al control. De esta forma, se proporciona acceso al modelo de objetos más complejo y eficaz de ReportDocument. Nota Puesto que ambos modelos de objetos están implicados en este proceso (CrystalReportViewer para cargar y mostrar el informe, ReportDocument para encapsularlo y manipularlo), es fácil confundir las funciones de ambos modelos de objetos. Una vez que el modelo de objetos ReportDocument se ha utilizado para encapsular el informe, se debe restringir cualquier manipulación del informe a ese modelo. Si trata de utilizar las propiedades y los métodos de CrystalReportViewer para manipular el informe, los dos modelos de objetos entran en conflicto y genera un comportamiento inesperado. Una vez que ha introducido un modelo de objetos adicional, restrinja el uso del código de CrystalReportViewer sólo para establecer propiedades de presentación. ReportDocument y ReportClientDocument (RAS) En SAP Crystal Reports 9, ambos modelos de objetos eran totalmente independientes. En SAP Crystal Reports 10 y versiones posteriores, se ha eliminado la separación básica entre los modelos de objetos. El modelo de objetos ReportDocument ahora funciona como proxy para (un subconjunto de) funcionalidad desde el modelo de objetos ReportClientDocument. SAP Crystal Reports 2008 permite acceder a una versión limitada del modelo de objetos ReportClientDocument mediante la propiedad ReportDocument.ReportClientDocument. Información relacionada Tutoriales del modelo de objetos ReportDocument [página 336] En esta sección se presentan varios tutoriales del modelo de objetos ReportDocument. Enlazar informes al modelo de objetos ReportDocument [página 198] Modelo de objetos CrystalReportViewer [página 36] Elegir el modelo de objetos correcto para el proyecto [página 31] Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 37 1.3.1.5.3 Modelo de objetos ReportClientDocument (RAS) El modelo de objetos ReportClientDocument proporciona el modelo de objetos más eficaz y completo para manipular informes. Este modelo de objetos sólo está disponible como parte de un servidor de aplicaciones de informes (RAS), que puede ser un servidor de aplicaciones de informes no administrado (RAS) o un servidor de aplicaciones de informes administrado (BOE). El modelo de objetos ReportClientDocument está formado por muchas clases de diversos espacios de nombres. El espacio de nombres lleva el prefijo CrystalDecisions.ReportAppServer. Este modelo de objetos expone toda la estructura del informe en el SDK, para permitir crear, modificar y guardar cambios mediante programación en todos los aspectos del informe en tiempo de ejecución. Una instancia de ReportClientDocument consta de un informe que se puede modificar con programación mediante sus propiedades de clase. Estas propiedades están vinculadas con una serie de bibliotecas del SDK que contienen controladores, modelos de definición de datos y modelos de definición de informes: ● ReportDefinition corresponde a la apariencia del informe, como se muestra en SAP Crystal Reports Designer. ● DataDefinition corresponde al explorador de campos de SAP Crystal Reports Designer. ● RowsetController corresponde a los valores de datos procesados de cada fila de detalles, cuando se consulta el informe en tiempo de ejecución. Las instancias de ReportClientDocument pueden ser instancias de uno de estos objetos: ● Un archivo .rpt existente cargado desde un directorio y modificado con las clases de definición de informe y de definición de datos del SDK de ReportClientDocument. ● Un informe completamente nuevo y vacío que se genera con las clases de definición de informe y definición de datos del SDK de ReportClientDocument. Esta instancia de la clase ReportClientDocument puede cargarse tan sólo el tiempo suficiente para enviar la instancia al visor para su visualización, antes de que pase a estar fuera del ámbito. Sin embargo, también se puede modificar y, a continuación, guardar como un informe (.rpt) en un directorio con una de las clases de controlador. Para obtener información detallada sobre el modelo de objetos ReportClientDocument, consulte la documentación del SDK de SAP BusinessObjects RAS .NET. ReportClientDocument en SAP Crystal Reports 9 SAP Crystal Reports 9 (versión Advanced) se entregaba con RAS no administrado y los ensamblados .NET de RAS necesarios para programar en el modelo de objetos ReportClientDocument. De esta forma, los programadores podían crear proyectos .NET que aprovechaban el modelo de objetos ReportClientDocument. Sin embargo, también significaba que los proyectos que se crearon anteriormente con el modelo de objetos ReportDocument proporcionado con SAP Crystal Reports se debía volver a codificar totalmente para el modelo de objetos ReportClientDocument proporcionado con RAS. La razón era que ambos modelos de objetos eran totalmente independientes. 38 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net ReportClientDocument en SAP Crystal Reports 10 y superior En SAP Crystal Reports 10, se eliminó la separación básica entre los modelos de objetos. Esto se ha realizado reescribiendo el modelo de objetos ReportDocument para que sirva como proxy para funcionalidad (o para un subconjunto de funcionalidad) desde el modelo de objetos ReportClientDocument. Las clases del modelo de objetos ReportDocument exponen las mismas firmas de propiedades y métodos que antes, pero la funcionalidad subyacente se modifica para redirigir cada propiedad y método a las propiedades y métodos del modelo de objetos ReportClientDocument más eficaz. Esto no significa que una versión básica de SAP Crystal Reports Developer obtenga acceso total a un servidor RAS no administrado ni al modelo de objetos ReportClientDocument. La versión básica de SAP Crystal Reports sigue teniendo acceso sólo al modelo de objetos ReportDocument (aunque el modelo de objetos ReportDocument funcione como proxy para un subconjunto del modelo de objetos ReportClientDocument). El motor de creación de informes original de las versiones anteriores de SAP Crystal Reports se ha reemplazado por una versión limitada e incrustada del motor de creación de informes de RAS. Instale y obtenga acceso al modelo ReportClientDocument sólo con una licencia actualizada para el servidor RAS no administrado. En ese punto, todo el código existente escrito para el modelo de objetos ReportDocument se puede redirigir fácilmente al servidor de RAS independiente, estableciendo dos propiedades en cualquier instancia de informe dado y se puede obtener acceso directamente al modelo de objetos ReportClientDocument subyacente, al recuperarlo desde la propiedad ReportClientDocument de la clase ReportDocument. 1.3.1.5.4 Modelo de objetos InfoObject (BOE) El modelo de objetos InfoObject incluye los productos de actualización SAP Crystal Reports Server y la de plataforma SAP BusinessObjects Business Intelligence. Nota Para obtener más información, vea Soluciones de elaboración de informes de SAP BusinessObjects Business Intelligence [página 63]. El modelo de objetos InfoObject proporciona un modelo de objetos de nivel de plataforma para el SDK. InfoObject funciona como clase base, en la que se encapsulan muchos objetos Enterprise en clases derivadas. La clase derivada que representa informes es la clase CrystalDecisions.Enterprise.Desktop.Report. El SDK de la plataforma SAP BusinessObjects Business Intelligence se ha diseñado a partir de la clase de objetos InfoObject y sus clases de soporte. La clase InfoObject La clase InfoObject se utiliza en el SDK para representar una amplia variedad de entidades de información. Incluye tanto entidades físicas (archivos de informe o archivos PDF) como entidades de red (usuarios, servidores o conexiones FTP). Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 39 La clase InfoObject es una clase base de distintas clases ampliadas que corresponden a estas entidades de información con más detalle. Las clases extendidas que heredan de InfoObject incluyen las siguientes: Report, User, Server, Folder, Program, Ftp, Smtp, Word, Excel y Pdf. Mediante la manipulación de estas instancias de InfoObject y de las clases ampliadas, puede crear una aplicación de escritorio cliente o administrativa. Clases de soporte Dos clases adicionales admiten la clase InfoObject. Clase InfoStore Esta clase actúa como controlador, o puerta de enlace, para el repositorio del Servidor de administración central (CMS), que es una base de datos donde se guardan todas las instancias de InfoObject. La clase InfoStore se utiliza para crear instancias, recuperar y validar todas las instancias de la clase InfoObject guardadas en el repositorio del CMS. Clase indizada InfoObjects Esta clase incluye varias instancias de InfoObject. InfoStore la utiliza para mover instancias de InfoObject desde y hacia el repositorio de CMS. Las instancias de InfoObject no se pueden administrar directamente mediante la clase InfoStore. Antes, deben incluirse en la clase indizada InfoObjects. Mediante esta clase indizada, las instancias individuales de InfoObject se pueden agregar, recuperar, actualizar o programar. Nota Para obtener información detallada del SDK de SAP Crystal Reports Server o de la plataforma SAP BusinessObjects Business Intelligence, consulte la documentación del SDK de SAP Crystal Reports Server o de la plataforma SAP BusinessObjects Business Intelligence. Información relacionada Elegir el modelo de objetos correcto para el proyecto [página 31] 1.3.1.6 Comparación de arquitecturas en las soluciones de elaboración de informes SAP Business Intelligence Existen cuatro soluciones de elaboración de informes de SAP Business Intelligence: ● SAP Crystal Reports, versión para programadores de Microsoft Visual Studio ● SAP Crystal Reports Developer ● Servidor de aplicaciones de informes (RAS) no administrado ● SAP Crystal Reports Server o plataforma SAP BusinessObjects Business Intelligence La diferencia principal de la arquitectura entre cada solución de elaboración de informes es la forma en la que cada uno coloca e implementa el motor de informes. 40 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net ¿Qué es el motor de informes? El motor de informes se encuentra en el núcleo de cada solución de elaboración de informes. Procesa todas las solicitudes de usuario y extrae la información del informe. El rendimiento máximo del procesamiento de solicitudes de usuario simultáneas varía entre las soluciones. En algunas soluciones se establece mediante diseños de arquitectura o restricciones de licencia. Los componentes principales restantes de cada solución de elaboración de informes son los siguientes: ● El archivo de definición de informes (.rpt). ● El origen de datos. ● El visor de informes. ● El SDK. ● Marco de plataforma (encontrado en SAP Crystal Reports Server o la plataforma SAP BusinessObjects Business Intelligence). ¿Cómo interactúa el motor de informes con el resto de los componentes principales? El motor de informes utiliza el archivo de definición de informes (.rpt) como plantilla. A continuación, recupera los datos del origen de datos y utiliza la definición de informes para presentar el informe solicitado actualmente, que se pasa al visor de informes. La información recibida del visor, o codificada con el SDK de la interfaz, activa un procesamiento posterior desde el motor de informes que realiza más acciones en el informe. ¿En qué se diferencia la configuración del motor de informes en las distintas soluciones de elaboración de informes de SAP Business Intelligence? ● El motor de informes se incrusta. En SAP Crystal Reports, versión para programadores de Microsoft Visual Studio, el motor de informes está incrustado en la aplicación. Este motor de informes incrustado tiene un límite de un máximo de tres solicitudes de usuario simultáneas. No se trata de un límite de licencia arbitrario, sino de una limitación de la arquitectura del motor de informes incrustado. ● El motor de informes se extrae en un proceso de servidor de informes independiente. En la solución que utiliza el servidor de aplicaciones de informes (RAS), el motor de informes se extrae en un proceso de servidor independiente. Dicho proceso de servidor se puede ejecutar en el mismo equipo o colocar en un hardware físico distinto para incrementar el rendimiento mediante la descarga de parte del procesamiento del servidor de aplicaciones. Un servidor RAS no administrado ya no está disponible como opción de actualización. Se recomienda realizar una actualización a SAP Crystal Reports Server en su lugar. Para obtener más información, vea Soluciones de elaboración de informes de SAP BusinessObjects Business Intelligence [página 63]. ● El proceso de servidor de informes independiente se encapsula en una arquitectura de plataforma completa. En la solución SAP Crystal Reports Server o plataforma SAP BusinessObjects Business Intelligence, se agrega una arquitectura de plataforma completa que encapsula el proceso de servidor de aplicaciones de informes Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 41 independiente (RAS). El servidor de aplicaciones de informes (RAS) administrado se convierte en un solo servidor, entre muchos otros servidores de la arquitectura de plataforma. Esta arquitectura proporciona un conjunto muy amplio de funciones adicionales, como programación, equilibrio de carga, conmutación por error y escalabilidad tanto horizontal como vertical. 1.3.2 Control CrystalReportViewer Para ver un informe de Crystal, debe agregar un control CrystalReportViewer a la aplicación. El control CrystalReportViewer se usa en .NET Framework para enlazar y mostrar informes. El control CrystalReportViewer predeterminado incluye elementos de interfaz de usuario para facilitar la visualización, guardado y navegación en un informe. Los dos controles CrystalReportViewer usados con mayor frecuencia son el control CrystalReportViewer para las aplicaciones de Windows, al que se accede a través de la clase CrystalDecisions.Windows.Forms.CrystalReportViewer y el control CrystalReportViewer para sitios web, al que se accede a través de la clase CrystalDecisions.Web.CrystalReportViewer. Para obtener más información, consulte SAP Crystal Reports .NET API Reference. Nota Sólo es necesario un control CrystalReportViewer si desea visualizar informes de Crystal. Personalizar el control CrystalReportViewer Según su aplicación, puede interesarle modificar ciertos elementos del control predeterminado. SAP Crystal Reports permite personalizar de diferentes formas el aspecto del visor que se muestra en la aplicación. Entre otras opciones: ● Se puede eliminar del visor la barra de herramientas de CrystalReportViewer. ● Se pueden agregar o eliminar los botones de la barra de herramientas mediante programación. ● El control CrystalReportViewer admite la personalización mediante CSS o temas. Información relacionada Personalizar el control CrystalReportViewer [página 222] Visualizar un informe [página 162] 1.3.2.1 ¿Cómo utilizo los controles de visores de informes? Los controles de visores de informes son controles .NET que se pueden agregar a un formulario en una aplicación para Windows o Web, con el fin de mostrar los informes en dicho formulario. 42 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Al planear la creación de una aplicación con el SDK de SAP Crystal Reports, una de las consideraciones más importantes es si se van a usar controles de visores de informes. Conocer los aspectos fundamentales del SDK que afectan a estos controles le ayudará a elegir la estructura más adecuada para el proyecto de SAP Crystal Reports, versión para programadores de Microsoft Visual Studio. ¿Qué son los controles .NET? Los controles de Microsoft .NET son un tipo especial de clases que se muestran en el Cuadro de herramientas de Visual Studio. Se agregan a Web Forms o Windows Forms como objetos GUI, y heredan de una clase base Control común. Los controles .NET típicos son: Button, DropDownList, CheckBox, TextBox o DataGrid. Los controles de Microsoft .NET cumplen la siguiente práctica recomendada: separar la capa de presentación de la capa de lógica empresarial. Encapsulan la información de presentación dentro del propio control en Web Forms o Windows Forms. En la clase de código subyacente, el control .NET se genera como una instancia de nivel de clase. Esta variable de instancia proporciona acceso a las propiedades, métodos y eventos del control Los controles de Microsoft .NET son funcionalmente idénticos tanto para Windows Forms como para Web Forms. .NET Framework ve cada página Web como un formulario que contiene controles, como ocurre en las aplicaciones para Windows. Conocer los aspectos fundamentales del SDK que afectan a estos controles le ayudará a elegir la estructura más adecuada para el proyecto de SAP Crystal Reports para Visual Studio. Uno de los puntos fuertes de las herramientas de creación de informes es que encapsulan los problemas complejos de estructura, diseño y presentación de informes en una herramienta GUI sencilla. De igual forma, los controles .NET encapsulan los problemas complejos de presentación y llenado de datos de un objeto GUI sencillo en un Web Form o Windows Form. Mediante el uso de controles .NET, se unifican la creación y la presentación complejas de informes. Toda esta información compleja de informes, que se solía encapsular sólo en la versión independiente de SAP Crystal Reports, ahora se encapsula en un control .NET como visor de informes. ¿Cuántos controles de visores de informes hay? SAP Crystal Reports, versión para programadores de Microsoft Visual Studio incluye dos versiones del control CrystalReportViewer: una para aplicaciones Web y otra para aplicaciones para Windows. Los proyectos Web ASP.NET utilizan el control CrystalReportViewer, situado en el espacio de nombres CrystalDecisions.Web. Los proyectos de Windows utilizan el control CrystalReportViewer, situado en el espacio de nombres CrystalDecisions.Windows.Forms. El control CrystalReportPartsViewer sólo se usa para mostrar elementos de informes en una página Web. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 43 Presentación de un informe mediante el control CrystalReportViewer El control CrystalReportViewer muestra sólo un informe a la vez. El informe que muestra el control lo determina el informe enlazado al código. Para indicar al control el informe que se va a mostrar, enlace la propiedad ReportSource del control a un informe en concreto. En tiempo de ejecución, el control carga el informe enlazado a la propiedad ReportSource y lo muestra. En su forma más sencilla, la asignación tiene el siguiente aspecto: crystalReportViewer1.ReportSource = "C:\WorldSalesReport.rpt" crystalReportViewer1.ReportSource = "C:\\WorldSalesReport.rpt"; En este caso, el informe está enlazado al control directamente desde su ruta en el directorio de archivos. De esta forma se muestra la forma más básica de enlazar un informe al control CrystalReportViewer. ¿El control CrystalReportViewer se enlaza a objetos de datos? No. El control CrystalReportViewer se enlaza a un objeto de informe, no a un objeto de datos. La razón es que el objetivo del control CrystalReportViewer es distinto al del resto de los controles .NET. Los demás controles .NET se enlazan a los datos y dan formato a los datos sin formato de la página. Puesto que SAP Crystal Reports Designer incrustado lo hace automáticamente cada vez que crea un informe (un informe por definición encapsula la recuperación y presentación de datos), el control CrystalReportViewer sólo se ocupa de mostrar un objeto de informe. En la siguiente tabla se comparan los enlaces a un control de datos .NET y a un control CrystalReportViewer. Tipo de control Se enlaza a Conectividad del siguiente nivel Control de datos .NET (como con­ trol DataGrid) Un objeto de datos (DataSet, Data­ Reader, DataView, IDictionary, ICo­ llection, DataTable). Ninguna Control de visores de informes .NET Un objeto de informe (que encap­ (como control CrystalReportVie­ sula un archivo de informe Crystal). wer) EL archivo de informe de Crystal dispone de conectividad de datos integrada, que se conecta a diver­ sos orígenes de datos como ODBC y OleDb, así como a objetos DataRea­ der y DataSet. Para ayudarle a recordar que un control CrystalReportViewer enlaza a un objeto de informe, en vez de a un objeto de datos, la propiedad de origen del control de visor de informes se denomina ReportSource (no DataSource). 44 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Enlace automático de informes Otra diferencia del enlace de un control CrystalReportViewer es que no tiene que llamar manualmente a ningún método Bind, como haría para la mayoría de los controles .NET. En su lugar, el control enlaza automáticamente el visor de informes al objeto de informe. Información relacionada Visualizar un informe [página 162] 1.3.2.1.1 Para agregar un control de CrystalReportViewer a una aplicación de Windows Procedimiento 1. Abra un formulario de Windows Form en la vista Diseño. 2. En el Cuadro de herramientas, abra el nodo Informes para buscar el control CrystalReportViewer. Nota En las versiones anteriores de Visual Studio, el control CrystalReportViewer aparecía en el nodo Crystal Reports. 3. Arrastre y suelte el control CrystalReportViewer en el formulario. 4. En el menú Archivo, haga clic en Guardar todo. Resultados Cuando se agrega un control CrystalReportViewer a su aplicación, se agregarán de forma automática a su proyecto referencias a los ensamblados de SAP Crystal Reports. 1.3.2.1.2 Para agregar un control de CrystalReportViewer a un sitio Web Procedimiento 1. Abra la página Default.aspx. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 45 2. Haga clic en el botón Diseño situado en la parte inferior de la vista del formulario. 3. En el Cuadro de herramientas, abra el nodo Informes para buscar el control CrystalReportViewer. Nota En las versiones anteriores de SAP Crystal Reports, versión para programadores de Microsoft Visual Studio, el control CrystalReportViewer aparecía en el nodo Crystal Reports. 4. Arrastre y coloque el control CrystalReportViewer en el formulario Web Forms. 5. En el menú Archivo, haga clic en Guardar todo. Resultados Cuando se agrega un control CrystalReportViewer a su aplicación, se agregarán de forma automática a su proyecto referencias a los ensamblados de SAP Crystal Reports. 1.3.2.1.3 Para enlazar el control CrystalReportViewer a un archivo en disco Contexto La forma más sencilla de enlazar un control CrystalReportViewer a un informe de Crystal es establecer la propiedad ReportSource en una ubicación del disco. Este informe no incrustado se muestra cuando se ejecuta la aplicación. De esta forma se enlaza el informe directamente al control. Toda interacción mediante programación con el informe se debe realizar en el modelo de objetos CrystalReportViewer limitado. Procedimiento 1. Agregue un control CrystalReportViewer a la aplicación de Windows o al sitio web. 2. Abra el formulario Web Forms o Windows Forms. 3. En el menú Ver, haga clic en Código. 4. Establezca la propiedad ReportSource en la ubicación del informe en el sistema local de archivos. ○ Si trabaja con aplicaciones de Windows Forms o un sitio Web: myCrystalReportViewer.ReportSource = "C:\MyReport.rpt" crystalReportViewer.ReportSource = "C:\\MyReport.rpt"; 46 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net ○ Si trabaja con una aplicación WPF: myCrystalReportViewer.ViewerCore.ReportSource = "C:\MyReport.rpt" crystalReportViewer.ViewerCore.ReportSource = "C:\\MyReport.rpt"; 1.3.2.2 El panel de tareas inteligentes En Visual Studio 2005 o posterior, al agregar un control .NET a un formulario Web Forms o Windows Forms, aparece el panel Tarea inteligente. La Tarea inteligente es un pequeño panel adjuntado a la esquina superior derecha del control .NET. Cuando se abre el panel, contiene casillas de verificación y cuadros combinados que permiten a los programadores seleccionar opciones de conectividad y de otro tipo para el control. Esta función puede reducir de forma significativa la cantidad que el programador necesita escribir. En un sitio Web, las selecciones efectuadas en el panel Tarea inteligente producen código XML generado automáticamente en la página ASPX. En un proyecto para Windows, las selecciones efectuadas en el panel Tarea inteligente producen código generado automáticamente en un archivo de clases oculto. Dicho archivo es una clase "parcial", que actúa como anexo a la clase de Windows Forms existente. Las clases parciales son una nueva función de la versión 2.0 de .NET Framework. Puede usar el panel de tareas inteligentes para enlazar rápida y fácilmente el control CrystalReportViewer con el control CrystalReportSource. Cuando se agrega el control CrystalReportViewer a la página, la tarea inteligente aparece automáticamente y proporciona una serie de pasos para crear y configurar un control CrystalReportSource. El control CrystalReportViewer hace un uso completo del panel Tarea inteligente. Las selecciones disponibles en el panel son distintas para los proyectos Web y Windows. Limitaciones de las tareas inteligentes y el modelo de código reducido Las tareas inteligentes facilitan un modelo de código reducido que genera código automáticamente para ahorrar tiempo en vez de escribir el código manualmente. Sin embargo, aunque el código generado automáticamente ahorra tiempo al principio, resulta difícil cambiar de un modelo de código reducido a otro de codificación si se desea agregar eficacia y flexibilidad a un proyecto. 1.3.2.2.1 Tarea inteligente CrystalReportViewer para proyectos para Windows El panel Tarea inteligente CrystalReportViewer para Windows permite crear, elegir o editar un informe de Crystal. También dispone de opciones para personalizar el control CrystalReportViewer. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 47 Las siguientes funcionalidades están disponibles para el panel de tarea inteligente de los proyectos para Windows. Crear un nuevo informe de Crystal... Este comando de menú permite crear un informe mediante el diseñador de informes de SAP Crystal incrustado. Al finalizar, el código del informe se genera automáticamente para enlazar el informe al control CrystalReportViewer para su presentación inmediata. Editar el informe de Crystal actual Este comando de menú permite editar el informe que ya se ha seleccionado o creado para el origen de informe. Elegir un informe de Crystal Este comando de menú permite seleccionar un informe de Crystal o un objeto de ReportDocument para que funcione como origen del informe para el control CrystalReportViewer. Al finalizar, el código del informe se genera automáticamente para enlazar el informe al control CrystalReportViewer para su presentación inmediata. Borrar origen del informe Este comando de menú borrará la propiedad ReportSource del control CrystalReportViewer. Elegir una vista del panel de herramientas: Este comando de menú permite seleccionar el panel de herramientas que se debe mostrar de forma predeterminada cuando se carga el informe. Puede seleccionar el árbol de grupos o el panel de parámetros, o bien optar por dejar el panel de herramientas en blanco. Mostar la barra de herramientas Esta casilla de verificación permite mostrar u ocultar la barra de herramientas del control CrystalReportViewer. 48 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Mostrar barra de estado Esta casilla de verificación permite mostrar u ocultar la barra de estado en el control CrystalReportViewer. Desacoplar en contenedor principal Este comando de menú permite establecer la propiedad Dock en "Ninguno" o "Relleno". De forma predeterminada, cuando un control CrystalReportViewer se coloca en un formulario Windows Forms, la propiedad Dock se establece en "Relleno". Si se selecciona este comando de menú, la propiedad Dock "Ninguno" permite que el control CrystalReportViewer se mueva y se cambie su tamaño en el formulario Windows Forms u otros contenedores (por ejemplo, un control Panel en un formulario Windows Forms). 1.3.2.2.2 Web Tarea inteligente CrystalReportViewer para sitios El panel Tarea inteligente CrystalReportViewer para sitios Web permite crear, elegir o editar un informe de Crystal. También dispone de opciones para personalizar el control CrystalReportViewer y para habilitar los informes de errores para conexiones a base de datos y valores de parámetro. Las siguientes funcionalidades están disponibles para el panel Tarea inteligente de sitios Web: Elegir origen del informe Este cuadro combinado permite seleccionar cualquier origen del informe existente o crear uno nuevo. Al finalizar, el código del informe se genera automáticamente para enlazar el informe al control CrystalReportViewer para su presentación inmediata. Configurar el origen de informe... Este comando de menú permite configurar el origen de informe que ya se ha seleccionado o creado. Editar informe... Este comando de menú permite editar el informe que ya se ha seleccionado o creado para el origen de informe. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 49 Elegir una vista del panel de herramientas: Este comando de menú permite seleccionar el panel de herramientas que se debe mostrar de forma predeterminada cuando se carga el informe. Puede seleccionar el árbol de grupos o el panel de parámetros, o bien optar por dejar el panel de herramientas en blanco. Habilitar barra de herramientas Esta casilla de verificación permite mostrar u ocultar la barra de herramientas del control CrystalReportViewer. Habilitar vista de informes Esta casilla de verificación permite mostrar u ocultar la vista de informe en el control CrystalReportViewer. Nota Puede deshabilitar la vista de informe si desea utilizar el árbol de grupos en un formulario Web Forms. Habilitar petición de conexión a la base de datos: Esta casilla de verificación permite habilitar o deshabilitar los informes de errores para las conexiones a base de datos. Cuando un informe carece de información para conectarse a una base de datos de SQL Server, se produce la excepción de error "La conexión no es posible". Sin embargo, si la casilla de verificación está activada, aparece una ventana de solicitud y pide la información de conexión necesaria. Habilitar petición de parámetros de informe Esta casilla de verificación permite habilitar o deshabilitar los informes de errores para los valores de parámetro. Cuando un informe carece de información para hacer referencia a un parámetro que se utiliza en los criterios de selección, se produce la excepción de error "Faltan valores de parámetro". Sin embargo, si la casilla de verificación está activada, aparece una ventana de solicitud y pide la información de parámetro necesaria. Volver a utilizar el valor de parámetro al actualizar el informe Esta casilla de verificación permite habilitar o deshabilitar la persistencia de parámetros en la actualización del informe. Si la casilla de verificación está activada, se conservan los valores de parámetro pasados a un informe en 50 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net la primera carga. Sin embargo si la casilla de verificación está desactivada, se debe escribir código para pasar valores de parámetro al informe en cada actualización posterior. Información relacionada Tarea inteligente CrystalReportViewer para proyectos para Windows [página 47] 1.3.2.3 Control CrystalReportPartsViewer El control CrystalReportPartsViewer se usa en .NET Framework para enlazar y mostrar un informe de Crystal Reports como una serie de partes vinculadas. Esto reduce bastante el área necesaria para mostrar la información del informe, lo que resulta ideal para mostrar pequeñas cantidades de información del informe en una página Web de un portal. Nota Los elementos del informe sólo se usan en sitios Web; no están disponibles para proyectos para Windows. El control CrystalReportPartsViewer se ha mejorado para admitir el entorno de elementos web, un entorno de portal introducido en la versión 2.0 de ASP.NET. El marco Web Parts permite a los programadores encapsular controles en la página dentro de los elementos Web configurables. Información relacionada Tutorial: Presentar secciones de informes con el control CrystalReportPartsViewer [página 494] En este tutorial, aprenderá a dividir un informe en distintos elementos y mostrar cada elemento haciendo clic en una serie de hipervínculos sucesivos. 1.3.2.4 Control CrystalReportSource El control CrystalReportSource forma parte del nuevo modelo de desarrollo de aplicaciones basado en etiquetas que se proporciona con la versión 2.0 de ASP.NET. Nota El control CrystalReportSource sólo está disponible para sitios web. En el marco del control DataSource, los controles .NET visuales se conectan a controles DataSource no visuales (controles que no muestran información). Este nuevo marco de DataSource encapsula la información de conectividad de datos escrita como líneas de código en los controles .NET en el formulario Web Forms. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 51 En la ventana Diseño, Visual Studio muestra los nombres de los controles conectados entre sí. Los proveedores de datos .NET incluyen su propia implementación del control DataSource. Por ejemplo, SqlDataSource tiene acceso a Microsoft SQL Server, mientras que OracleDataSource obtiene acceso a Oracle. En el caso de SAP Crystal Reports, el control está implementado como control CrystalReportSource. Este diseño es paralelo al de la versión 1.0 de ASP.NET, donde el control CrystalReportViewer contiene una propiedad ReportSource en vez de la más habitual DataSource. La diferencia entre el control CrystalReportSource y los controles DataSource reside en el hecho de que el control CrystalReportSource contiene un informe que encapsula los datos, mientras que un control DataSource (como SqlDataSource) contiene los propios datos. 1.3.3 ¿Cuál es el enfoque de persistencia que se debe usar con SAP Crystal Reports? Al planear la creación de una aplicación Web con el SDK de SAP Crystal Reports, una de las consideraciones más importantes es el enfoque de persistencia con el que trabajar. ¿Qué es la persistencia? Las páginas Web no conservan el estado (el estado y la información de un usuario que se conecta a un sitio Web). Las páginas Web se solicitan desde un servidor, se envían al usuario y el proceso finaliza. Este proceso es correcto al leer información, el problema surge cuando se diseña una aplicación Web que debe conservar información sobre un usuario durante recargas y redireccionamientos de páginas. La persistencia hace referencia al uso de un mecanismo que preserva el estado de todos los usuarios (como la página del informe actual que ve cada uno de ellos) sin las trabas de las recargas y los redireccionamientos de páginas. Métodos prácticos de persistencia En esta sección, va a explorar métodos prácticos para conservar los cambios realizados en un informe de Crystal de una página Web mientras se actualiza el informe durante la recarga de una página Web. El cambio que se debe conservar puede ser tan sencillo como pasar a la segunda página después de haber hecho clic en el botón Página siguiente del visor del informe, o tan complejo como presentar datos totalmente distintos después de haber modificado los parámetros del informe. La persistencia debe aplicarse a los elementos siguientes: ● El control CrystalReportViewer. ● El informe que está enlazado al control CrystalReportViewer. 52 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Formas de conservar el estado en ASP y ASP.NET En ASP y ASP.NET tradicionales, el estado se mantiene mediante el explorador Web o el servidor Web, de las siguientes formas. Entorno Cliente o servidor Nombre Método ASP* Explorador del cliente Campos del formulario Pasar los pares de nombre y valor por las páginas Web mediante los campos de entrega de formularios. ASP* Explorador del cliente Argumentos de dirección URL Pasar los pares de nombre y valor por las páginas Web mediante argumen­ tos de dirección URL. ASP* Explorador del cliente Cookie Asignar pares de nombre y valor a una cookie en el ex­ plorador del cliente y, a continuación, recuperar la cookie en una nueva pá­ gina. ASP* Servidor Web Objeto Session Asignar objetos de los que se han creado instancias al objeto Session en el ser­ vidor y después recuperar desde Session en una nueva página. ASP* Servidor Web Objeto Application Asignar objetos de los que se han creado instancias al objeto Application en el servidor y después recu­ perar desde Application en una nueva página. ASP.NET Explorador del cliente Objeto ViewState Asignar valores de cadena al objeto ViewState del formulario Web Form de ASP.NET. ASP.NET Servidor Web Objeto Cache Igual que el objeto Appli­ cation, pero con funciones mejoradas. * Todos los enfoques de persistencia de ASP también funcionan en ASP.NET. Enfoque de persistencia que funciona mejor con SAP Crystal Reports Los enfoques de persistencia más adecuados para usar con SAP Crystal Reports son ViewState, Session o Cache. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 53 Información relacionada ViewState y persistencia del modelo de objetos CrystalReportViewer [página 54] 1.3.3.1 ViewState y persistencia del modelo de objetos CrystalReportViewer ¿Qué es ViewState? ViewState es un enfoque basado en explorador de ASP.NET para conservar el estado de la vista, es decir, el formulario Web Forms. Su función principal es apoyar la persistencia de los controles Web. Los controles Web (también denominados controles de servidor Web) se crean basándose en los controles de Windows, que se presentan en Visual Basic. Los controles de Windows son objetos del formulario que encapsulan una parte de la funcionalidad de presentación, como un campo de texto, un botón o una tabla de datos. Los controles Web son parecidos a los controles de Windows. Al igual que los controles de Windows, funcionan en dos niveles: dentro de la página Web y en la clase de código subyacente que respalda la página Web. Del mismo modo que los controles tradicionales en Windows Forms, los controles Web encapsulan elementos concretos de funcionalidad de presentación en objetos de GUI: Button, TextField, DropDownList, DataGrid, etc. En la clase de código subyacente, estos mismos controles se comparan con las clases que exponen propiedades y métodos. La diferencia entre una página Web y un formulario Windows Form es que la primera es un entorno independiente. Por lo tanto, se necesita algún tipo de mecanismo de persistencia para conservar el estado de la página Web durante sus recargas. ViewState mantiene el estado de los controles de la página Web, tanto como Session mantiene el estado de los objetos de los que se ha creado una instancia en el servidor. Nota ViewState mantiene el estado de todos los controles Web automáticamente. Esto se consigue haciendo que ViewState almacene todos los controles basados en la propiedad EnableViewState del control (cuyo valor predeterminado es true). Puesto que ViewState almacena el estado de los datos de los controles Web en la página, todo el objeto ViewState debe estar contenido en la página cuando ésta se transfiere una y otra vez entre el explorador y el servidor Web. Este proceso se lleva a cabo cifrando todo el objeto ViewState como cadena y, a continuación, colocando esta cadena dentro del valor de una etiqueta de formulario oculta en la página. Por ejemplo, ViewState para la página Web de ASP.NET que contiene sólo un único control de botón tiene el siguiente código HTML: <input type="hidden" name="__VIEWSTATE" value="dDwtNTMwNzcxMzI0Ozs+I7GfLyg3p44eTLFCiVEiRKUBzFw=" /> ViewState almacena sólo información que se puede convertir a formato de cadena. 54 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Persistencia de la presentación del informe del control CrystalReportViewer El control CrystalReportViewer desempeña la función de presentación del informe para un informe de Crystal. Presenta el informe en html en la página junto con una barra de herramientas y una vista de árbol para manipular la presentación del informe. La barra de herramientas contiene botones para acercar y alejar, pasar a la siguiente página, imprimir, exportar, etc. La vista de árbol se expande para mostrar agrupamientos de datos anidados. ViewState conserva la información del control; por tanto, conserva el estado de toda la información de presentación del informe (incluidos los eventos de la barra de herramientas y la vista de árbol) del control CrystalReportViewer durante las recargas de página. Por ejemplo, si un usuario estuviese viendo la página 3 del informe e hiciese clic en el botón de página siguiente de la barra de herramientas del control CrystalReportViewer, ViewState conservaría el estado de ambas partes de la información: ● El número de página actual. ● El estado del botón Página siguiente (en el que se ha hecho clic). Durante la recarga de la página, ViewState restauraría el control CrystalReportViewer en la página 3 y, a continuación, haría lo mismo con el clic del evento de la siguiente página para que el control se mueva a la página 4 del informe. Persistencia del modelo de objetos del control CrystalReportViewer El control CrystalReportViewer lleva a cabo una función adicional: no sólo la visualización de informes, sino también un modelo de objetos limitado (incluido en la clase de control CrystalReportViewer). Este modelo de objetos limitado se puede utilizar para la interacción mediante programación con el informe. ViewState conserva el estado de ambas funciones: ● La presentación del informe. ● El modelo de objetos CrystalReportViewer Sin embargo, se suele desaconsejar el uso del modelo de objetos CrystalReportViewer, en favor del modelo de objetos ReportDocument más completo. Este modelo de objetos alternativo no está contenido en el control sino que forma parte de las bibliotecas de clases del SDK. Compartir los mecanismos de persistencia Si utiliza el control CrystalReportViewer para desempeñar ambas funciones (presentación del informe y modelo de objetos), ViewState las conserva, y no necesita mecanismos de persistencia adicionales. Nota Un ejemplo sería enlazar el control CrystalReportViewer a una ruta de directorio de archivos. Vea Enlazar a una ruta de directorio de archivos en el código [página 170]. Sin embargo, si prefiere utilizar el control CrystalReportViewer sólo para la función de presentación de informes y, a continuación, enlazar el control a un modelo de objetos externo (como ReportDocument), es necesario un Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 55 mecanismo de persistencia independiente para conservar dicho modelo de objetos externo. Normalmente, este segundo mecanismo de persistencia es Session (u ocasionalmente, Cache). Información relacionada ¿Cuál es el enfoque de persistencia que se debe usar con SAP Crystal Reports? [página 52] Session y persistencia del modelo de objetos ReportDocument [página 56] Elegir el modelo de objetos correcto para el proyecto [página 31] 1.3.3.2 Session y persistencia del modelo de objetos ReportDocument ¿Qué es Session? Session es un enfoque basado en servidor Web utilizado tanto en ASP como en ASP.NET para conservar el estado. Session permite conservar cualquier objeto durante toda una sesión de usuario mediante el almacenamiento de dicho objeto en la memoria del servidor Web. Session se suele utilizar para cualquiera de estas acciones: ● Almacenar información que debe conservar su estado durante toda la sesión de un usuario, como la información de conexión o de cualquier otro tipo que sea necesaria cuando los usuarios se desplazan por la aplicación Web. ● Almacenar un objeto que debe conservar su estado sólo en una recarga de páginas o en un conjunto de páginas agrupadas funcionalmente. El punto fuerte de Session es que conserva la información de estado del usuario en el servidor Web para tener acceso en cualquier momento y desde cualquier página. Puesto que el explorador no debe almacenar esta información, se puede utilizar cualquier explorador, incluso dispositivos exploradores como PDAs o teléfonos móviles. Limitaciones del enfoque de persistencia ● La cantidad de memoria de servidor requerida por Session se incrementa a medida que aumenta el número de usuarios conectados. ● Cada usuario que tenga acceso a la aplicación Web genera un objeto Session independiente. Cada objeto Session se mantiene durante el período de tiempo que dure la visita del usuario más un período de inactividad. ● Si se conservan muchos objetos en cada Session, y hay muchos usuarios utilizando la aplicación Web simultáneamente (creando muchos Sessions), la cantidad de memoria de servidor dedicada a la persistencia de Session puede ser importante, limitándose la escalabilidad. Para obtener detalles sobre enfoques de persistencia alternativos, vea la siguiente información: 56 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net ● ViewState y persistencia del modelo de objetos CrystalReportViewer [página 54] ● Cache y persistencia del modelo de objetos ReportDocument [página 58] Conservar el modelo de objetos ReportDocument con Session Si se ha encapsulado el informe en el modelo de objetos ReportDocument, este modelo de objetos se debe conservar mediante un enfoque basado en servidor como Session o Cache. Para conservar un modelo de objetos ReportDocument con Session, cree una instancia de ReportDocument y, a continuación, asígnela a Session. Session es el enfoque más sencillo y el preferido cuando se aprende a crear aplicaciones Web ASP.NET usando SAP Crystal Reports. También es el enfoque recomendado para almacenar instancias de ReportDocument en las que el informe tiene una compartibilidad baja. Limitaciones de persistencia del modelo de objetos ReportDocument con Session Siempre que una instancia de ReportDocument tenga un alto grado de compartibilidad, piense en utilizar Cache en vez de Session. Diferencias entre Session y ViewState Session se ocupa principalmente de la persistencia del estado de los objetos de la clase de código subyacente. ViewState lo hace del estado de los controles de la página Web. Cuando un control de la página Web está enlazado a un objeto de la clase de código subyacente y ambos necesitan conservarse en las recargas de páginas, Session y ViewState comparten las funciones de persistencia. En este caso, ViewState conserva un control CrystalReportViewer y Session, un objeto ReportDocument que está enlazado al control. Información relacionada Tutorial: Conservar el modelo de objetos ReportDocument con Session [página 337] En este tutorial, usará el modelo de objetos ReportDocument y realizará cambios mediante programación en un informe en tiempo de ejecución. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 57 1.3.3.3 Cache y persistencia del modelo de objetos ReportDocument Cache es un enfoque basado en servidor de ASP.NET para conservar el estado. Cache es funcionalmente parecido al objeto Application que se encuentra tanto en ASP como en ASP.NET: ● Application permite conservar cualquier objeto en el ámbito de la aplicación. ● Application no está diseñado para conservar la información específica del usuario. Cache comparte todas estas funciones con Application, pero agrega nuevos niveles de inteligencia para la administración de datos transitorios: ● Un objeto agregado a la caché se puede configurar con dependencias basadas en archivo, clave u hora. Si cambia el archivo o la clave asociados, o si transcurre un período de tiempo determinado, el objeto se quita automáticamente de la caché y se coloca una versión actualizada, la siguiente vez que se requiera el objeto. ● Un objeto agregado a la caché sin dependencias y no usado caduca automáticamente. ● Cuando se quita un objeto de la caché, se activa un evento. Puede escribir código que se ejecute en ese evento y que cargue una versión actualizada del objeto en Cache. Si se agrega una versión alternativa de un objeto mediante la cadena de clave original, se sobrescribe la versión anterior. Para evitarlo, concatene la definición alternativa a la cadena de clave para que cada versión alternativa del objeto sea única. La ventaja de Cache respecto a Application es que, como Application, almacena información a la que tienen acceso todos los usuarios, pero Cache también se puede actualizar a sí mismo basándose en los cambios de sus dependencias. Comportamiento de Cache en .Net 2.0 Framework Cache en .Net 2.0 Framework es más eficiente y seguro, pues se procesa por usuario y por sesión. Es decir, cuando un usuario visualiza un informe, se guarda una copia del informe en la caché, que se muestra al usuario. Si el usuario vuelve a abrir el informe mientras la sesión en curso sigue activa, la aplicación mostrará el informe guardado en la caché. De este modo se evita tener que ejecutar el informe cada vez que el mismo usuario lo visualiza. Si otro usuario inicia sesión y abre el mismo informe, la aplicación ejecuta el informe por segunda vez, guarda una copia del informe en la caché y se la muestra al usuario. Cada usuario tiene su propia copia del informe guardada en caché para su sesión. Así se evita que varios usuarios compartan el mismo informe. Limitaciones del enfoque de persistencia Los programadores que no conocen Cache pueden sentirse tentados y utilizarlo en todas partes por su persistencia, reemplazando Session por Cache. Sin embargo, Cache no está diseñado para reemplazar la funcionalidad del objeto Session. Los intentos por emular la exclusividad de Session concatenando datos específicos del usuario a la clave de Cache cargan Cache con objetos de usuario que, a diferencia de lo que ocurre con Session, no caducan tras agotarse el tiempo de espera del usuario. Como resultado, Cache termina por solicitar más memoria del servidor Web de lo que lo hizo el objeto Session. Si debe conservar datos específicos del usuario, siga utilizando el objeto Session. 58 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Para obtener enfoques alternativos de persistencia, vea: ● ViewState y persistencia del modelo de objetos CrystalReportViewer [página 54] ● Session y persistencia del modelo de objetos ReportDocument [página 56] Conservar el modelo de objetos ReportDocument con Cache Si se ha encapsulado el informe en el modelo de objetos ReportDocument, este modelo de objetos se debe conservar mediante un enfoque basado en servidor como Session o Cache. Puede conservar un informe en el modelo de objetos ReportDocument utilizando Cache de una estas dos formas: ● Cree una instancia del informe y, a continuación, asígnela al objeto Cache, mediante la misma sintaxis utilizada para asignar un informe al objeto Session. Este método sólo funciona en informes con un nivel de compartibilidad alto, en los que la instancia de ReportDocument se produce exactamente una vez, mediante un solo conjunto de credenciales de conexión y de parámetros. En el caso de una instancia de ReportDocument que se puede producir varias veces debido a las variaciones de la información de parámetros y conexión, si se vuelve a asignar al objeto Cache con la misma cadena de clave, se sobrescribe la versión anterior de la instancia de ReportDocument. ● Crear una instancia de la versión de la clase del informe que implementa la interfaz ICachedReport. El SDK de SAP Crystal Reports incluye un marco de trabajo de almacenamiento en caché integrado para informes. Todos los informes que implementen la interfaz ICachedReport se agregan automáticamente a la caché con una clave única basada en los parámetros y las credenciales de conexión del usuario. Este método funciona con los informes que tienen una compartibilidad alta, pero que pueden tener pocas versiones debido a variaciones mínimas en los parámetros y las credenciales de conexión. Si tiene informes con una compartibilidad baja (que son específicos del usuario), asígnelos al objeto Session. Limitaciones de persistencia del modelo de objetos ReportDocument con Session Cache es el mejor enfoque de uso cuando los usuarios conservan instancias de ReportDocument con un alto grado de compartibilidad. Si el informe es específico del usuario, Cache desperdiciará la memoria del servidor al crear instancias basadas en usuario en el nivel de aplicación que estarán en el servidor después de que caduque el tiempo del usuario. Los informes específicos del usuario se deben asignar a Session. Nota En la mayoría de los casos, utilice Session para conservar instancias de ReportDocument. Utilice Cache (o más específicamente, la interfaz ICachedReport) sólo cuando un informe tenga una compartibilidad alta y sea largo, o tan complejo que tarde varios minutos en recuperar sus datos. Diferencias entre Cache y ViewState Cache se ocupa principalmente de la persistencia del estado de los objetos de la clase de código subyacente. ViewState lo hace del estado de los controles de la página Web. Cuando un control de la página Web está Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 59 enlazado a un objeto de la clase de código subyacente y ambos necesitan conservarse en las recargas de páginas, Cache y ViewState comparten las funciones de persistencia. En este caso, ViewState conserva un control CrystalReportViewer y Cache, objeto ReportDocument que está enlazado al control. Información relacionada ¿Cuál es el enfoque de persistencia que se debe usar con SAP Crystal Reports? [página 52] Limitaciones de la persistencia al enlazar informes en el método de evento Page_Load [página 61] 1.3.3.3.1 Para conservar un informe incrustado que implemente ICachedReport Procedimiento 1. Agregue el informe al proyecto. Se crea una clase de informe incrustado. También se crea una clase de informe almacenado en caché que carga y devuelve una instancia almacenada en caché de la clase de informe incrustado. 2. Cree una instancia de la clase de informe almacenado en caché. 3. Asigne la instancia de la clase almacenada en caché al control CrystalReportViewer. Información relacionada Enlazar a una clase de informe incrustado almacenado en caché [página 202] 1.3.3.3.2 Para conservar un informe no incrustado mediante una clase de utilidad que implemente ICachedReport Procedimiento 1. Cree su propia clase de utilidad de almacenamiento de caché y establezca su valor en implementar ICachedReport. 2. En esta clase de utilidad, cargue el informe no incrustado desde una cadena de ruta mediante el método ReportDocument.Load(). 3. Codifique el método de implementación CreateReport() para que devuelva la instancia de ReportDocument del informe no incrustado. 60 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 4. Cree una instancia de la clase de utilidad de administración de almacenamiento de caché del informe. 5. Asigne esa instancia de la clase al control CrystalReportViewer. Información relacionada Enlazar a un informe no incrustado cargado en una clase de utilidad de administración de caché [página 205] 1.3.3.4 Limitaciones de la persistencia al enlazar informes en el método de evento Page_Load En las aplicaciones Web ASP.NET es práctica común colocar todo el código de inicio de la página en el controlador de eventos Page_Load, que se llama desde el evento Page.Load. En particular, el código de enlace de datos de control se suele guardar en el controlador de eventos Page_Load. Sin embargo, la inclusión del código de enlace en este controlador de eventos provoca un problema con ViewState. A continuación se indica el problema y la solución habitual: ● ViewState se utiliza para conservar el estado del objeto de informe siempre que se vuelve a cargar la página: los datos que están enlazados al control y los eventos de clics del mouse realizados en el control. ● ViewState es una cadena. Por tanto, los datos y los eventos de clic deben serializarse. ● Durante la recarga de una página, los datos y los eventos de clic se restauran a partir de ViewState. ● El evento Page.Load se produce después de la restauración de ViewState. Si el controlador de eventos Page_Load contiene código de enlace de controles, en el momento de la recarga de la página este código de enlace sobrescribirá ViewState, lo que provoca la pérdida de los datos y los eventos de clic originales. ● Este problema se suele presentar como controles que olvidan las acciones de clic del ratón (por ejemplo, una selección DropDownList) cuando se recarga la página. ● Para evitar que se sobrescriban los datos y los eventos de clic del mouse, el código de enlace del controlador de eventos Page_Load se incluye en un bloque condicional Not IsPostBack, que impide la llamada al código de enlace durante los eventos PostBack. Esta resolución parte de un supuesto fundamental: que tanto los datos como los eventos de clics de mouse se pueden serializar para ViewState. Sin embargo, el control CrystalReportViewer se enlaza con objetos que no se pueden serializar (de forma específica, la clase ReportDocument, la clase ReportClientDocument o la clase InfoObject). Nota Hay una excepción: cuando el control CrystalReportViewer se enlaza con un informe mediante un ruta de directorio de archivo, la cadena de ruta se puede conservar en ViewState. Sólo en este caso, el control CrystalReportViewer podría incluirse en un bloque condicional Not IsPostBack. Sin embargo, este caso de enlace de informes es menos potente y se utiliza con menos frecuencia que el enlace con las clases de informe indicadas anteriormente. Puesto que los eventos de clic del ratón del control CrystalReportViewer sólo se pueden serializar en ViewState, el enlace con una clase de informe que no se puede serializar crea un problema irresoluble cuando se vuelven a cargar las páginas: Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 61 ● Si el código de enlace de informes está incluido en un bloque condicional Not IsPostBack, los eventos de clic del ratón de ViewState se conservan. Sin embargo, no se produce el enlace de informes. Por tanto, se genera una excepción. ● Si el código de enlace de informes se incluye fuera del bloque condicional, el informe se enlaza correctamente. Sin embargo, en el proceso se sobrescribe ViewState. Por tanto, se pierden los eventos de clic del ratón. Nota Este enfoque suele producirse cuando se hace clic en un informe de varias páginas en el control CrystalReportViewer. El informe vuelve misteriosamente a la página 1. Solución recomendada: mover el código de enlace del control CrystalReportViewer al evento Init La solución para el control CrystalReportViewer es mover el código de enlace del informe al evento Init, que se produce antes de la restauración de ViewState. Esta solución presenta una complicación. Puesto que el evento Init se codifica con menor frecuencia que el evento Load, es más difícil acceder a él. En proyectos web o para Windows de Visual Studio .NET 2003, el código de gestión de eventos Init se incluye en la región de código generado por el Diseñador de Web Form, un área generalmente oculta y reservada para código generado. Para resolver esta situación, se recomienda el siguiente enfoque: ● Extraiga todo el código de enlace y configuración de CrystalReportViewer a un método auxiliar privado denominado ConfigureCrystalReports(). ● En la región de código generado por el Diseñador de Web Forms, incluya una sola línea de código en el controlador de eventos Page_Init() o OnInit() en el método de generación de eventos: una llamada al método auxiliar ConfigureCrystalReports(). Las instrucciones para crear y llenar el método auxiliar ConfigureCrystalReports() se puede encontrar en Configuración de proyectos [página 14]. Información relacionada Tutorial: Conservar el modelo de objetos ReportDocument con Session [página 337] En este tutorial, usará el modelo de objetos ReportDocument y realizará cambios mediante programación en un informe en tiempo de ejecución. 62 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 1.3.4 Escalar la aplicación Al planear el modo en que se va a crear una aplicación con el SDK de SAP Crystal Reports, una de las consideraciones más importantes es cómo optimizar la escalabilidad. Puede escalar la aplicación de una de estas dos maneras: ● Optimizar el rendimiento de la aplicación. ● Optimizar el rendimiento del informe. La implementación de estos métodos prácticos se describe en las siguientes secciones. Escalar el código de la aplicación Al usar el SDK de SAP Crystal Reports .Net, se puede incrementar la escalabilidad siguiendo las prácticas óptimas para mejorar el rendimiento: ● Reducir el uso de DataSets. ● Aprovechar el almacenamiento de informes en caché. ● Borrar de la memoria el informe después de usarlo. ● Compartir el procesamiento entre servidores. Escalar la aplicación reduciendo la complejidad del informe Cuando diseñe informes, y especialmente cuando diseñe informes para Web, debe hacerlo teniendo en cuenta la escalabilidad. Preste atención a las siguientes prácticas recomendadas para optimizar la escalabilidad de un informe. ● Reducir el tamaño y la complejidad de los informes siempre que sea posible. ● Descargar la selección de registros al servidor de la base de datos. ● Usar subinformes a la orden 1.3.4.1 Opciones de actualización 1.3.4.1.1 Soluciones de elaboración de informes de SAP BusinessObjects Business Intelligence Hay distintas soluciones de elaboración de informes de la línea de productos de SAP BusinessObjects Business Intelligence. La gama de productos y las distintas licencias de implementación de dichos productos están diseñadas para atender la gama completa de necesidades de escalabilidad de una solución de elaboración de informes. En esta página se ofrece un breve resumen de cada una de las soluciones de elaboración de informes. Puede encontrar más información en el sitio Web de SAP BusinessObjects. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 63 SAP Crystal Reports, versión para programadores de Microsoft Visual Studio SAP Crystal Reports, versión para programadores de Microsoft Visual Studio proporciona a los desarrolladores una forma rápida y productiva de crear e integrar informes con calidad de presentación en las aplicaciones, sin salir del entorno de desarrollo de Visual Studio conocido. SAP Crystal Reports, versión para programadores de Microsoft Visual Studio incluye muchas de las funciones de SAP Crystal Reports. Estas incluyen la posibilidad de crear informes, conectarlos a un control CrystalReportViewer e interactuar mediante programación con estos informes usando el SDK de SAP Crystal Reports. SAP Crystal Server o plataforma SAP BusinessObjects Business Intelligence Se incluye un servidor RAS con SAP Crystal Reports Server y la plataforma SAP BusinessObjects Business Intelligence, que proporciona un aumento considerable en rendimiento y escalabilidad para crear, manipular y administrar informes. SAP Crystal Reports Server proporciona todo lo necesario para crear, administrar e implementar de forma segura informes en la Web en un paquete económico. Abarca todos los pasos del proceso de generación de informes: acceso a los datos y diseño, administración y entrega, e integración de informes con portales y aplicaciones, lo que permite una mayor facilidad a la hora de compartir informes Crystal ya existentes o nuevos en la Web. La plataforma SAP BusinessObjects Business Intelligence es una plataforma de inteligencia empresarial (BI) multiservidor diseñada para satisfacer los requisitos BI y la generación de informes a gran escala. El entorno multiservidor proporciona la tolerancia a errores, el equilibrio de carga, la escalabilidad y la fiabilidad que se necesita para realizar con éxito el trabajo más exigente. Además, la plataforma SAP BusinessObjects Business Intelligence se recomienda por sus avanzadas funciones de elaboración de informes, como son auditoría, SAP Crystal Reports Explorer, y Encyclopedia y Process Tracker. Para crear, administrar e implementar de forma segura informes para la mediana y pequeña empresa, use SAP Crystal Reports Server. Para aplicaciones de misiones importantes, máxima escalabilidad y herramientas de inteligencia empresarial adicionales, utilice la plataforma SAP BusinessObjects Business Intelligence. 1.3.4.1.2 Comparar soluciones de elaboración de informes de SAP BusinessObjects Business Intelligence En esta tabla se ofrece información para ayudarle a evaluar qué solución de elaboración de informes de SAP BusinessObjects Business Intelligence resulta apropiada para el nivel de escalabilidad que busca. Función SAP Crystal Reports, ver­ SAP Crystal Reports sión para programadores de Microsoft Visual Stu­ dio SAP Crystal Reports Ser­ ver o plataforma SAP Bu­ sinessObjects Business Intelligence Compatibilidad ASP.NET X X 64 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. X Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Función SAP Crystal Reports, ver­ SAP Crystal Reports sión para programadores de Microsoft Visual Stu­ dio SAP Crystal Reports Ser­ ver o plataforma SAP Bu­ sinessObjects Business Intelligence Vista interactiva de infor­ mes X X X Inicio de sesión único X X X Compatibilidad con aplica­ X ciones Windows X X Diseñador de informes mejorado X X Compatibilidad con dispo­ sitivos móviles X X Controladores nativos de bases de datos X X Orígenes de datos OLAP X X Comprobador de depen­ dencias de informes X X Plantillas X X Parámetros dinámicos en cascada X X Despliegue multiplata­ forma X Sistema de administración de entrega de la informa­ ción X Seguridad integrada X Equilibrio de carga X Repositorio de objetos de informes X Programación de informes X Creación y modificación de informes mediante pro­ gramación X X Modelo de objetos Crystal­ X ReportViewer X X Modelo de objetos Report­ X Document X X Modelo de objetos Report­ ClientDocument X X Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 65 Función SAP Crystal Reports, ver­ SAP Crystal Reports sión para programadores de Microsoft Visual Stu­ dio SAP Crystal Reports Ser­ ver o plataforma SAP Bu­ sinessObjects Business Intelligence Servidor RAS X Modelo de objetos InfoOb­ ject X Escalabilidad Baja Compatibilidad con varias versiones de .Net Frame­ work Baja Media-alta X X Información relacionada Comparación de arquitecturas en las soluciones de elaboración de informes SAP Business Intelligence [página 40] 1.3.4.1.3 Servidor de aplicaciones de informes (RAS) Puede utilizar el servidor RAS para crear y modificar informes Crystal, así como para procesar solicitudes de páginas. Una de las tecnologías de SAP BusinessObjects es el servidor de aplicaciones de informes ( RAS). RAS es un SDK cliente y un servidor. Puede utilizar el servidor RAS para crear y modificar informes Crystal, así como para procesar solicitudes de páginas. Cuando un proceso de servidor recupera un informe solicitado, RAS lo pasa al visor de informes. El servidor RAS solo está disponible como parte de SAP Crystal Reports Server o de la plataforma SAP BusinessObjects Business Intelligence. Servidor RAS administrado Al servidor RAS que es administrado por otros componentes del marco empresarial se le llama servidor RAS administrado. SAP Crystal Reports Server y SAP BusinessObjects Enterprise ofrecen un marco de servidores que facilita la administración y distribución de informes a través de la Web en toda la empresa. El servidor RAS administrado es uno de los diversos servidores de este marco. Puede procesar informes ubicados en el mismo equipo que el servidor Web y el SDK RAS (informes no administrados) o informes ubicados en un servidor de repositorio de informes independiente (informes administrados). El servidor RAS administrado puede utilizar los modelos de objetos ReportClientDocument e InfoObject. 66 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Uso de la API RAS sin un servidor RAS En SAP Crystal Reports, puede acceder a la funcionalidad avanzada para la creación y modificación de informes del modelo de objeto de ReportClientDocument desde el SDK de CR .NET. El paquete de implementación de este escenario sólo requiere los ensamblados .NET, lo que significa que utiliza la API RAS en proceso. No obstante, si utiliza la API RAS en proceso, perderá las ventajas de rendimiento y estabilidad de un sistema fuera de proceso orientado al servidor. Para obtener estas ventajas, use la API RAS en combinación con un servidor RAS en un entorno SAP Crystal Reports Server o plataforma SAP BusinessObjects Business Intelligence. Para obtener información adicional y código de ejemplo, consulte la propiedad ReportClientDocument de la clase CrystalDecisions.CrystalReports.Engine.ReportDocument en la referencia de la API. Información relacionada Comparación de arquitecturas en las soluciones de elaboración de informes SAP Business Intelligence [página 40] Modelo de objetos ReportClientDocument (RAS) [página 38] 1.3.4.2 1.3.4.2.1 Optimizar el código Evitar DataSets para consultas simples La elaboración de informes a partir de DataSets ofrece ventajas, pero no se deben utilizar DataSets forzosamente como mecanismo de acceso a datos cuando la escalabilidad es un factor a tener en cuenta. Si su aplicación crea un DataSet sólo para su uso por parte de un informe y, sobre todo, si la consulta es de tipo simple, como SELECT field 1, field 2 FROM table, los DataSets sirven de poco. En estos casos, resulta más rápido y requiere menor cantidad de memoria conectar SAP Crystal Reports directamente a la base de datos y realizar la consulta (el comportamiento predeterminado de cualquier informe creado en el diseñador SAP Crystal Reports Designer). Los DataSets son útiles cuando: ● Es necesario combinar datos de diversos orígenes. ● Es necesario modificar datos incluidos en el DataSet tras ejecutar la consulta. Información relacionada Tutorial: Conectar a conjuntos de datos de ADO.NET [página 544] Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 67 1.3.4.2.2 Almacenar DataSets en memoria caché en caso de utilizarlos Los DataSets se convierten en una herramienta de escalabilidad más útil aún si se almacenan en la memoria caché. Al cargar un informe en tiempo de ejecución, el motor de informes de SAP Crystal Reports intenta agrupar las conexiones de base de datos. Por ejemplo, si tres usuarios visitan la misma página ASPX con el mismo informe, una única conexión de base de datos agrupa las tres consultas. Sin embargo, la consulta en sí no se agrupa. Aunque la consulta sea idéntica en los tres casos, ésta se debe realizar cada vez que se solicita un informe al motor de informes. En el caso de una consulta lenta o de un gran conjunto de datos, este tipo de consulta por usuario puede convertirse en el cuello de botella de una aplicación. Realizar esta misma consulta por usuario varias veces para llenar de forma redundante un DataSet sería aún peor debido al trabajo adicional de la memoria. Para reducir el número de consultas a la base de datos, coloque el DataSet en el objeto ASP.NET Cache después de la primera consulta, de forma que todas las tareas de informe compartan el DataSet único en la caché. Información relacionada Conectar a conjuntos de datos de ADO.NET [página 156] Elaboración de informes a partir de conjuntos de datos ADO.NET [página 662] Explica cómo conectar el informe a un conjunto de datos ADO.NET. 1.3.4.2.3 Usar el método Close() para liberar el informe Use uno de los métodos Close() disponibles para liberar la memoria que usa el informe. Otra forma de optimizar la escalabilidad en un proyecto de SAP Crystal Reports, versión para programadores de Microsoft Visual Studio consiste en usar uno de los métodos Close() para liberar la memoria que usa el informe. Existen dos métodos Close(): ● ReportDocument.Close(), que se usa con SAP Crystal Reports. ● ReportClientDocument.Close(), que se usa con el SDK de RAS. El método ReportDocument.Close() Puede usar el método ReportDocument.Close() para liberar la memoria que consume el informe Crystal en el servidor Web. La forma en que se accede al método ReportDocument.Close() depende de si el informe está incrustado o no: 68 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net ● Si el informe está incrustado, se genera automáticamente una clase contenedora de informe para representar el informe en código. Esta clase contenedora de informe se hereda de ReportDocument, y al método Close() se accede por herencia. ● Si el informe no está incrustado, se carga desde el directorio de archivos a una instancia de ReportDocument, y al método Close() se accede directamente desde la clase ReportDocument. Tanto el informe de Crystal como la instancia de ReportDocument consumen memoria. Si ReportDocument se borra de la memoria, el informe continúa usándola. Por ejemplo, la instancia de ReportDocument queda fuera de alcance cuando la página Web termina de cargarse. Cuando la recopilación de desecho de .NET se deshace de la instancia de ReportDocument, la memoria usada por la instancia de ReportDocument se libera del servidor Web. Sin embargo, el propio informe permanece en memoria en el servidor Web. No se puede eliminar, porque ya no existe ninguna instancia de ReportDocument para acceder al informe. Si se repiten dichas circunstancias a gran escala, la memoria del servidor Web se llenará de informes a los que ya no se accede. Para resolver el problema, llame al método ReportDocument.Close(). El propio informe se cerrará en el servidor Web y la memoria quedará libre para más informes. Cuándo se debe llamar al método ReportDocument.Close() No se debe llamar al método ReportDocument.Close() en la página antes de que se haya mostrado el informe, porque, incluso si se ha cerrado el informe, ReportDocument volverá a abrir el informe si se hace referencia a él otra vez. Sólo se debe llamar al método Close() una vez finalizado el proceso de presentación. El momento adecuado para llamar al método Close() es durante el evento Page_Unload. El método ReportClientDocument.Close() Al utilizar un servidor RAS no administrado o RAS administrado, los informes se almacenan en el servidor de aplicaciones de informes, pero se representan en el servidor Web mediante una instancia de ReportClientDocument. Si la instancia de ReportClientDocument queda fuera de alcance sin llamar al método ReportClientDocument.Close(), Report Application Server dejará el informe abierto en la memoria, aunque ya no se pueda acceder a él. Si se repiten dichas circunstancias a gran escala, la memoria de Report Application Server se llenará de informes a los que ya no se accede en el servidor Web. Para resolver el problema, llame al método ReportClientDocument.Close(). El informe se cerrará en Report Application Server y la memoria quedará libre para más informes. Cuándo se debe llamar al método ReportClientDocument.Close() No se debe llamar al método Close() en la página antes de que se haya mostrado el informe, porque el informe debe permanecer abierto en el servidor hasta que haya finalizado el proceso de presentación. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 69 Para una instancia de ReportClientDocument, el método Close() cierra inmediatamente el informe y no se puede volver a abrir. Por lo tanto, si se llama al método Close() antes de que se muestre el informe, no se podrá acceder a él y se generará una excepción. El momento adecuado para llamar al método Close() es durante el evento Page_Unload. Información relacionada Comparar informes incrustados y no incrustados [página 163] 1.3.4.2.4 Web Configurar una matriz de servidores o de procesos Una matriz de servidores permite extender un sitio Web por varios servidores. Una matriz de procesos Web permite extender un sitio Web por varias CPU dentro de un único servidor. Distribuir la carga de trabajo del proceso de informes entre varias CPU o varios servidores puede mejorar el rendimiento de la aplicación de elaboración de informes basada en Web. Información relacionada Usar SAP Crystal Reports en una matriz de servidores o de procesos Web [página 73] 1.3.4.3 1.3.4.3.1 Optimizar los informes Utilizar informes más pequeños Otra forma de optimizar la escalabilidad en un proyecto de SAP Crystal Reports, versión para programadores de Microsoft Visual Studio consiste en reducir el tamaño de los informes. Siempre que sea posible, haga que sus informes tengan menos de 15 páginas. A menudo, en las aplicaciones Web los usuarios sólo desean ver algunos datos clave y no páginas enteras de datos. Puede que los informes utilizados en las aplicaciones de escritorio ya no resulten adecuados para las aplicaciones basadas en Web. Para reducir el tamaño de los informes, utilice la fórmula de selección de registros a fin de limitar el número de registros devueltos al informe. Esta operación se puede implementar de tres formas posibles: ● La fórmula de selección de registros puede codificarse en el informe con el diseñador incrustado SAP Crystal Reports Designer. ● Puede filtrar adicionalmente los registros recuperados en el informe mediante programación. 70 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net ○ Si usa el modelo de objetos CrystalReportViewer, use la propiedad SelectionFormula o ViewTimeSelectionFormula de CrystalReportViewer. ○ Si usa el modelo de objetos ReportDocument, use la propiedad RecordSelectionFormula de ReportDocument. Información relacionada Tutorial: Filtrar datos con fórmulas de selección [página 287] En este tutorial, aprenderá a usar las fórmulas de selección para filtrar los registros que desee mostrar en un informe de Crystal. 1.3.4.3.2 Utilizar gráficos más pequeños Otra forma de optimizar la escalabilidad en un proyecto de SAP Crystal Reports, versión para programadores de Microsoft Visual Studio consiste en usar gráficos más pequeños en el informe. No es necesario eliminar gráficos de los informes si la escalabilidad es un factor a tener en cuenta, pero se deberían utilizar con moderación debido al uso de recursos del sistema por parte de éstos. Cuando se muestra un informe en un control CrystalReportViewer y dicho informe contiene un gráfico (un diagrama o una imagen), el motor de informes debe crear un archivo JPG temporal (en la carpeta dynamic_images) y el explorador debe realizar una solicitud independiente al servidor Web para recuperarlo. Además, el control CrystalReportViewer busca periódicamente imágenes antiguas en la carpeta dynamic_images y las elimina. Este acceso al disco puede reducir el rendimiento de los informes. El uso moderado de diagramas e imágenes mantiene un acceso mínimo al disco. Información relacionada Configuración del archivo Web.Config [página 19] Directorio de visores [página 13] 1.3.4.3.3 Rediseñar subinformes para reducir la demanda Si se cambia el modo en el que se usan los subinformes en la aplicación, se puede influir en gran medida en el rendimiento de la misma. Otra forma de optimizar la escalabilidad en un proyecto de SAP Crystal Reports, versión para programadores de Microsoft Visual Studio consiste en refactorizar las llamadas a subinformes para reducir la demanda. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 71 Acerca del uso de subinformes Si bien a menudo los subinformes se pueden utilizar para crear informes complejos, éstos suponen un trabajo adicional considerable. Esto no significa que no se deban utilizar, pero su uso debería ser moderado. Además, considere que al ubicar subinformes en secciones que se repiten, como encabezados de grupo o la sección de detalles, cada instancia de subinforme requiere su propia tarea de informe. Esto significa que un informe con 100 registros que tenga un subinforme en la sección de detalles ejecuta en realidad 101 tareas de informe. Refactorizar subinformes como control DataGrid de .NET vinculado a informes A menudo los subinformes se utilizan en un modelo de resumen/detalle: ● El informe principal muestra filas de resumen. ● Cada fila se vincula a un subinforme que contiene un informe de detalles. Para los datos de resumen que no es necesario imprimir, se puede considerar la presentación de dichos datos en una lista de filas en lugar de en un informe. Es decir, en lugar de utilizar un informe como resumen que se vincule a varios subinformes para obtener detalles, utilice como resumen un control DataGrid de .NET que se vincule a varios informes normales para obtener detalles. El uso de un control DataGrid de .NET como resumen ofrece una solución más sencilla y escalable. Para crearla, enlace un conjunto de datos de resultados a un control DataGrid, con un vínculo al informe en cada ID de fila. Así, sólo se utiliza un informe (con un parámetro que acepta que se pase a éste un ID único desde la dirección URL del ID de fila de DataGrid) para cada fila. En este caso, no se realiza el procesamiento de informes cuando aparece DataGrid. El procesamiento de informes solamente tiene lugar cuando se selecciona uno de los vínculos incluido en DataGrid. 1.3.4.3.4 No utilizar campos que bloquean el procesamiento a petición Otra forma de optimizar la escalabilidad en un proyecto de SAP Crystal Reports, versión para programadores de Microsoft Visual Studio consiste en no usar campos que bloqueen el procesamiento a petición. SAP Crystal Reports procesa los informes a petición. Por ejemplo, si se va a mostrar la primera página de un informe, sólo procesa esa primera página, no el informe completo. Sin embargo, la inserción en la primera página de un informe de campos o fórmulas que dependan de la finalización del procesamiento del informe impide el procesamiento a petición. Por ejemplo, si se ubica en la primera página el campo especial "Página N de M", se deberá procesar el informe completo a fin de determinar el recuento de páginas para poder presentar este campo. Esto hace que, para poder mostrarse la primera página, sea necesario esperar hasta que haya terminado de procesarse todo el informe. El mismo comportamiento se produce cuando se utiliza un porcentaje de cálculos de resumen. Procure evitar el uso de este tipo de campos. 72 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 1.3.4.3.5 Activar la opción Ninguna impresora de Configurar impresión Otra forma de optimizar la escalabilidad en un proyecto de SAP Crystal Reports, versión para programadores de Microsoft Visual Studio consiste en seleccionar la opción Ninguna impresora en Configurar impresión. La opción Ninguna impresora Normalmente, cuando se crea un informe Crystal, se ha designado una impresora predeterminada en el equipo de desarrollo. Esta impresora predeterminada determina el diseño de las imágenes, fuentes y campos de base de datos del informe. La ventaja de designar una impresora predeterminada es que ofrece coherencia en la presentación de informes: los informes se muestran en el diseño de la impresora predeterminada. La desventaja de utilizar una impresora predeterminada es que puede dar problemas de escalabilidad. Por ejemplo, algunos controladores de impresora provocan pérdidas de memoria o de control de archivos. Si un informe se configura para un controlador de impresora que sufre alguno de estos problemas, podría afectar al rendimiento. Por lo tanto, como práctica recomendada para la escalabilidad, modifique el informe para que no use ningún controlador de impresora. Nota Una consecuencia de configurar el informe para que no use ningún controlador de impresora es que el diseño del informe puede que ya no sea idéntico a la salida de la impresora de destino. Es recomendable que después de que modifique el informe para que no use ningún controlador de impresora, pruebe el informe en la impresora seleccionada. Si es necesario, ajuste el diseño del informe. Información relacionada Para eliminar el controlador de impresora predeterminado de un informe [página 121] 1.3.5 Usar SAP Crystal Reports en una matriz de servidores o de procesos Web En esta sección se proporciona información general sobre el uso de un sitio Web de SAP Crystal Reports, versión para programadores de Microsoft Visual Studio en una matriz de servidores o de procesos Web. Una matriz de servidores permite extender un sitio Web por varios servidores. Una matriz de procesos web permite expandir un sitio web en varias CPU con un único servidor. Si se expande el informe procesando la carga Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 73 de trabajo en varias CPU o varios servidores, se puede mejorar el rendimiento de su aplicación de generación de informes basada en web. 1.3.5.1 Arquitectura de una matriz de servidores web o de una matriz web garden Arquitectura de una matriz de servidores Web Una matriz de servidores Web dispone de varios servidores que están expuestos a clientes de explorador como un único servidor virtual, con una Tarjeta de acceso a medios y una dirección TCP/IP virtuales. Tras este nivel virtual, cada servidor de la matriz de servidores Web recibe cada paquete de red, pero sólo procesa un subconjunto de estos paquetes. La habilidad de compartir equitativamente la carga de trabajo es lo que proporciona a las matrices de servidores Web su capacidad de procesamiento superior. Esta distribución de paquetes se administra mediante el Equilibrio de carga de red. El Equilibrio de carga de red realiza lo siguiente: ● Equilibra las solicitudes de cliente entre los servidores. ● Determina qué servidor procesa cada solicitud. ● Asegura que se optimiza el uso de los recursos del servidor y los tiempos de espera del cliente. ● Proporciona una alternativa superior a la afinidad de clientes. Nota En un caso de afinidad de clientes, los clientes que se conectan tienen la restricción de tener que regresar al mismo servidor cada vez. La afinidad de clientes suele estar desactivada, porque puede crear una aglomeración de solicitudes para un servidor particular. Cada servidor de una matriz de servidores Web dispone de un controlador de dispositivo de red Equilibrio de carga de red, que comunica con los otros servidores, y cada servidor suele tener dos tarjetas de red. La segunda tarjeta permite la comunicación interna para que el Equilibrio de carga de red se realice en una red interna independiente. La familia de Windows Server de los sistemas operativos disponen del controlador de dispositivo de red Equilibrio de carga de red. Arquitectura de una matriz de procesos Web Una matriz de procesos Web es como una matriz de servidores Web, excepto en que en lugar de usar varios equipos de servidor vinculados, usa un único equipo con varias CPU. Este único servidor SMP (multiprocesamiento simétrico) usa ASP.NET para ejecutar un proceso de trabajo ASP.NET en cada CPU. El servidor administra varias solicitudes de cliente relativas a las distintas CPU del servidor. 74 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 1.3.5.2 El proceso de trabajo ASP.NET ASP.NET se ejecuta dentro de un proceso denominado proceso de trabajo ASP.NET. Toda la funcionalidad ASP.NET se ejecuta dentro del ámbito de este proceso. Un servidor Web normal sólo contiene un único proceso de trabajo ASP.NET. Se diferencia de las matrices de servidores o de procesos Web: ● Una matriz de servidores Web contiene varios procesos de trabajo ASP.NET. Cada servidor del grupo de servidores administra un proceso de trabajo ASP.NET independiente. ● Una matriz de procesos Web contiene varios procesos de trabajo ASP.NET. Cada CPU del servidor SMP administra un proceso de trabajo ASP.NET independiente. Elegir un proceso de trabajo ASP.NET Cuando un cliente Web se conecta a una matriz de servidores o de procesos Web, se selecciona uno de los múltiples procesos de trabajo ASP.NET para ejecutar la solicitud. ● En una matriz de servidores Web, el Equilibrio de carga de red determina el proceso de trabajo ASP.NET seleccionado. ● En una matriz de procesos Web, el proceso de trabajo ASP.NET seleccionado lo determina ASP.NET. Administración de estado con varios procesos de trabajo ASP.NET Si se cambia de un caso con un único proceso de trabajo ASP.NET (un servidor Web normal) a un caso con varios procesos de trabajo ASP.NET (una matriz de servidores o de procesos Web), se presentan complicaciones con la administración de estado. Las páginas Web no tienen estado, de modo que un servidor Web debe conservar el estado mediante otros medios. La forma usual de administrar el estado en el servidor Web incluye Session State y ASP.NET Cache. Tanto Session como Cache están contenidos dentro del espacio de memoria de un único proceso de trabajo ASP.NET. Pero en una matriz de servidores o de procesos Web, varios procesos de trabajo ASP.NET trabajan simultáneamente. Session o Cache dentro de cualquier proceso de trabajo ASP.NET individual no pueden administrar el estado en varios procesos. Por lo tanto, se requiere una nivel adicional para la administración de estados: un servidor Session State fuera del proceso que almacene y recupere información de estado para cada proceso de trabajo ASP.NET en una matriz de servidores o de procesos Web. Información relacionada Session State fuera del proceso [página 76] ¿Cuál es el enfoque de persistencia que se debe usar con SAP Crystal Reports? [página 52] Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 75 1.3.5.3 Session State fuera del proceso En las matrices de servidores o de procesos Web, Session State se debe compartir entre los servidores mediante algún modo de Session State fuera del proceso. Normalmente se usan dos soluciones: ● Implementar el servidor Session State fuera del proceso incluido con ASP.NET. ● Configurar manualmente cada servidor Web para almacenar los datos de Session State en un servidor SQL. Requisito de serialización En ambas soluciones, todos los objetos que se desea almacenar deben ser serializables. Si un objeto no se puede serializar, no se podrá conservar en un servidor de estado fuera del proceso. Nota No todos los modelos de objetos del SDK de SAP Crystal Reports se pueden serializar. Sin embargo, SAP proporciona una solución de actualización para administrar el estado de los informes con un servidor fuera del proceso. Información relacionada Modelos de objetos serializables en SAP Crystal Reports [página 76] 1.3.5.4 Modelos de objetos serializables en SAP Crystal Reports Hay disponibles cuatro modelos de objeto para SAP Crystal Reports: dos que se incluyen con SAP Crystal Reports y dos que están disponibles por actualización. Esta sección explica qué modelos de objetos se pueden serializar para utilizarlos con un servidor Session State fuera del proceso. Nota Para obtener una presentación de Session State fuera del proceso, vea Session State fuera del proceso [página 76]. 76 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Serialización y el modelo de objetos CrystalReportViewer El modelo de objetos CrystalReportViewer es un modelo de objetos limitado incluido en la API del control CrystalReportViewer. Debido al ámbito limitado de este modelo de objetos, normalmente no se recomienda su uso en favor del modelo de objetos ReportDocument más eficaz. Si embargo, el modelo de objetos CrystalReportViewer se puede utilizar en una matriz de servidores o de procesos Web. Esto se debe a que CrystalReportViewer está incluido dentro de un control Web y la persistencia de éste se administra en el lado del cliente, con View State. La persistencia de View State coloca el estado de los controles del servidor Web ASP.NET en una cadena cifrada y, a continuación, incluye dicha cadena cifrada como un campo de formulario oculto dentro de la página ASPX cuando la página se vuelve a cargar. La información de estado se puede enviar a cualquier proceso de trabajo ASP .NET. Nota Este modo de persistencia de cliente sólo funciona en la recarga de la página. View State no puede conservar la información en varias páginas. Serialización y el modelo de objetos ReportDocument El modelo de objetos ReportDocument es más eficaz que CrystalReportViewer, y por ello normalmente se recomienda su uso en SAP Crystal Reports. Sin embargo, en la versión 9 y anteriores de SAP Crystal Reports, la clase ReportDocument no se podía serializar y, por ello, por sí sola, no se podía usar con un servidor Session State fuera del proceso en el caso de una matriz de servidores o de procesos Web. Esta limitación se ha solucionado en SAP Crystal Reports 10 y versiones posteriores adaptando el modelo de objetos ReportDocument a un modelo de objetos serializable como ReportClientDocument. Al modelo de objetos ReportClientDocument se puede acceder de varias formas distintas. Para usar el modelo de objetos ReportDocument en una matriz de servidores o de procesos Web, necesitará el servidor Session State fuera del proceso ASP.NET para almacenar el estado de la instancia de ReportDocument serializada y un servidor RAS no administrado para almacenar Nota Sólo puede serializar el modelo de objetos ReportDocument si ha instalado el servidor RAS y, a continuación, ha establecido las propiedades ReportDocument.ReportAppServer y ReportDocument.EnterpriseSession para que se dirijan a ese servidor. Serialización y el modelo de objetos ReportClientDocument El modelo de objetos ReportClientDocument se puede serializar. Al modelo de objetos ReportClientDocument se puede acceder de varias formas distintas. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 77 El modelo de objetos InfoObject El modelo de objeto InfoObject forma parte de la solución de actualización de Crystal: SAP Crystal Reports Server o la plataforma SAPBusinessObjects Business Intelligence. SAP Crystal Reports Server y la plataforma SAP BusinessObjects Business Intelligence son soluciones empresariales multiservidor que habitualmente sirven como alternativa a una matriz de servidores o de procesos Web existente. Información relacionada Usar SAP Crystal Reports en una matriz de servidores o de procesos Web [página 73] Elegir el modelo de objetos correcto para el proyecto [página 31] ViewState y persistencia del modelo de objetos CrystalReportViewer [página 54] 1.3.5.5 Configurar SAP Crystal Reports para una matriz de servidores o de procesos Web Servidores adicionales Además de los servidores de una matriz de servidores o de procesos Web, necesitará dos servidores adicionales: ● El servidor Session State fuera del proceso ASP.NET para almacenar el estado de la instancia de ReportDocument serializada. ● Un servidor RAS no administrado para almacenar el archivo de informe .rpt de Crystal. Nota Para obtener más información, vea Soluciones de elaboración de informes de SAP BusinessObjects Business Intelligence [página 63]. Uso especial de ReportDocument La matriz de servidores o de procesos Web usa el servidor Session State fuera del proceso ASP.NET para almacenar el objeto ReportDocument serializado. En este caso, el objeto ReportDocument se usa de forma diferente en una instalación básica de SAP Crystal Reports. En su lugar, el método ReportDocument.Load() o la propiedad ReportDocument.FileName vincula la instancia de ReportDocument a un informe fuera del proceso que se almacena en el servidor RAS no administrado. Para obtener ejemplos de cómo usar cada enfoque, vea la siguiente información de configuración. 78 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Nota El almacenamiento del archivo de informe .rpt file en el servidor RAS no administrado fuera del proceso significa que cada proceso de trabajo ASP.NET de la matriz de servidores o de procesos Web puede acceder al mismo archivo de informe .rpt desde una ubicación central. Configuración de ReportDocument para el servidor RAS no administrado La relación entre la instancia de ReportDocument y el servidor RAS no administrado se puede configurar de los modos siguientes: ● Cargue el informe de Crystal incrustado local incluido en la instancia de ReportDocument en el servidor RAS no administrado en tiempo de ejecución. Éste almacena temporalmente el archivo de informe .rpt en el servidor RAS no administrado fuera del proceso. ● Asocie un informe externo que está almacenado permanentemente en el servidor RAS no administrado fuera del proceso a la instancia de ReportDocument, asignando la ruta del directorio de archivos del informe en el servidor RAS no administrado a la propiedad FileName de la instancia ReportDocument. Instancia de ReportDocument en el servidor Session State, el archivo .rpt en el servidor RAS no administrado La instancia de ReportDocument, que se puede serializar si se usa en cooperación con la solución de actualización de Crystal RAS no administrado, se almacena en el servidor Session State fuera del proceso ASP.NET. Debido a que la instancia ReportDocument permanece activa en el servidor Session State, el archivo de informe .rpt de Crystal asociado a la instancia ReportDocument se mantiene abierto en el servidor RAS no administrado. Si un proceso de trabajo ASP.NET diferente de la matriz de servidores o de procesos Web obtiene la instancia de ReportDocument del servidor Session State fuera del proceso, la instancia de ReportDocument accede al archivo de informe .rpt asociado desde el servidor RAS no administrado. Escribir imágenes en el recurso compartido de red Un aspecto adicional se debe configurar al usar una matriz de servidores Web. Las imágenes que se escriben durante el proceso de elaboración de informes (por ejemplo gráficos dinámicos) se deben colocar en un recurso compartido de red para que pueda acceder a ellas cualquier proceso de trabajo ASP.NET. Cada equipo se debe configurar para escribir imágenes en el mismo recurso compartido de red y conceder permiso a la cuenta de trabajo ASP.NET en cada equipo para escribir en dicho recurso compartido. Para configurar un equipo para que pueda acceder a este directorio, agregue la siguiente información al registro. [HKEY_LOCAL_MACHINE\SOFTWARE\Business Objects\Suite 12.0\Report Application Server Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 79 \Viewer] "CrystalImageDir"="\\fileserver\images" Instrucciones de configuración detalladas Para obtener instrucciones de configuración detalladas sobre los problemas que puedan surgir al ejecutar SAP Crystal Reports en una matriz de servidores o de procesos Web, consulte el sitio Web del soporte técnico. 1.3.6 Trabajar con Crystal Reports como servicio web En esta sección se explica cómo trabajar con informes de Crystal que se han publicado como servicios Web de informes. Los servicios Web permiten que distintas aplicaciones compartan datos y funciones. Por ejemplo, un sistema contable puede conectarse a un sistema de pedidos de cliente. Las compañías también pueden utilizar los servicios Web para compartir datos y funciones de aplicación con otras compañías. Los servicios Web son independientes de cualquier tecnología de componentes o convención de llamada a objetos concreta por los siguientes motivos: ● Utilizan HTTP como protocolo Web. ● Se basan en XML. ● Son compatibles con el nivel de socket seguro (SSL). Los programas escritos en cualquier lenguaje de programación para cualquier modelo de componente y sistema operativo pueden tener acceso al servicio Web. SAP Crystal Reports permite que los informes se publiquen fácilmente y se usen como servicios Web de informes. Las aplicaciones Web y para Windows pueden conectarse a un servicio Web de informes y mostrar el informe de Crystal que expone dicho servicio. 1.3.6.1 Publicar y utilizar un informe como un servicio Web En SAP Crystal Reports, versión para programadores de Microsoft Visual Studio, se pueden publicar informes de Crystal como servicios Web. Cómo se publica un informe como servicio Web de informes En SAP Crystal Reports, versión para programadores de Microsoft Visual Studio, al seleccionar la opción de publicar un informe de Crystal para un servicio Web de informes, dicho servicio se compila en un archivo .DLL, que genera un archivo XML con la extensión de archivo de servicio Web de .NET, ".asmx" El archivo ASMX describe las funciones públicas, los parámetros de entrada, los tipos de datos y los tipos de datos de devolución que expone el servicio Web de informes. Los archivos DLL y ASMX se publican en el servidor Web como servicio 80 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Web de informes. Un cliente de un explorador Web ahora puede invocar el servicio Web de informes mediante una llamada a la dirección URL del servicio Web. Los datos se pasan desde y al servicio Web mediante HTTP en formato XML. Cómo se utiliza el informe como un archivo de servicios Web de informes en el cliente Para tener acceso al servicio Web de informes publicado desde una aplicación cliente, debe pasar la cadena de dirección URL a la propiedad ReportSource del control CrystalReportViewer, tanto desde un sitio Web como desde un proyecto Windows. Información relacionada Utilizar Crystal Services [página 83] Trabajar con Crystal Reports como servicio web [página 80] 1.3.6.1.1 Para crear un servicio Web de informes Requisitos previos Antes de empezar, necesitará un informe de Crystal existente. El informe se publicará como servicio web, que podrá usar la propiedad CrystalReportViewer.ReportSource. Procedimiento 1. Inicie Visual Studio. 2. En el menú Archivo, seleccione Nuevo y haga clic en Sitio Web. 3. En la lista Plantillas instaladas de Visual Studio, haga clic en Servicio Web de ASP.NET. 4. En el campo Ubicación, escriba una ruta de directorio de archivo y un nombre para el directorio de servicios Web. C:\WebServices\MyCrystalReportsWebServices 5. Haga clic en Aceptar. 6. En el Explorador de soluciones, haga clic con el botón secundario en el nombre de proyecto en negrita y seleccione Agregar elemento existente... 7. En el cuadro de diálogo Agregar elemento existente, establezca Tipo de archivo como Todos los archivos (*.*). Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 81 8. Agregue un informe de Crystal existente al proyecto. 9. Haga clic con el botón derecho en el objeto y seleccione Publicar como servicio Web. Se crea un nuevo servicio. 10. Haga clic con el botón derecho en el servicio web y seleccione Establecer como página de inicio. Al ejecutar la aplicación, el nuevo servicio web aparecerá en el explorador web. Puede usar la URL del servicio web como origen de informe para un control CrystalReportViewer. Nota En Visual Studio 2005 y versiones posteriores, no se utiliza IIS de forma predeterminada para obtener una vista previa de los sitios y servicios Web. En su lugar, el Visual Web Developer Web Server es el servidor Web predeterminado. Cuando se utiliza este servidor Web, la dirección URL sólo contiene un número de puerto temporal y aleatorio que sólo es válido durante la compilación. Para tener acceso a esta dirección URL de servicio Web desde una aplicación cliente, primero debe configurar el directorio de archivos para el proyecto de servicio Web como un directorio virtual en IIS. El directorio virtual ofrece una dirección URL coherente para llamarla desde la aplicación cliente. 1.3.6.1.2 Para utilizar el servicio Web de informes desde un proyecto de cliente Requisitos previos Antes de empezar, debe tener acceso a un informe que ya se haya publicado como servicio web. Procedimiento 1. Agregue el control CrystalReportViewer al sitio web o a la aplicación de Windows. 2. En el menú Ver, haga clic en Código. 3. Asigne la cadena de la dirección URL del servicio web de informes a la propiedad ReportSource de la clase CrystalReportViewer. myCrystalReportViewer.ReportSource = "http://localhost/MyCrystalReportsWebService/Hierarchical_GroupingService.asmx" crystalReportViewer.ReportSource = "http://localhost/MyCrystalReportsWebService/Hierarchical_GroupingService.asmx"; Resultados Al ejecutar la aplicación, el control CrystalReportViewer muestra el informe publicado por el servicio web. 82 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 1.3.6.2 Utilizar Crystal Services SAP Crystal Reports, versión para programadores de Microsoft Visual Studio permite la conexión mediante programación a los informes mediante el servicio Web de Crystal Services. Crystal Services facilita la conexión a informes expuestos por varios servidores en la red. Los orígenes de informe subyacentes a estos subnodos y las clases que generan (cuando se arrastran al formulario Web Forms o Windows Forms) varían según las versiones sucesivas de SAP Crystal Reports. Usar Crystal Services con SAP Crystal Reports 2005 o posterior En Visual Studio 2005, a Crystal Services se accede mediante programación. Crystal Services permite generar una lista de informes disponibles en un equipo local o remoto, y acceder a estos informes mediante un servicio Web. El código de conexión se debe introducir manualmente en SAP Crystal Reports, versión para programadores de Microsoft Visual Studio. Crystal Services utiliza el protocolo de los servicios Web de informes para acceder a un directorio virtual del servidor, conocido como el directorio virtual de visores. Usar Crystal Services con SAP Crystal Reports para Visual Studio .NET 2003 En SAP Crystal Reports para Visual Studio 2003, el acceso a Crystal Services se realizaba en el Explorador de servidores. El subnodo de Crystal Services de cada servidor se expandirá para mostrar más subnodos. Los nombres de estos subnodos varían según las versiones de SAP Crystal Reports, pero su funcionamiento es común y consiste en que cada subnodo de los servicios de Crystal Services se expande para mostrar una lista de informes, desde el directorio de archivos del equipo local o desde los servidores de la red. En algunos casos, un subnodo de Crystal Services usa el protocolo de los servicios Web de informes. En tal caso, usa dicho protocolo para acceder a un directorio virtual del servidor, conocido como el directorio virtual de visores. En otros casos, se realiza una conexión directa con un servidor RAS no administrado, SAP Crystal Reports Server o la plataforma SAP BusinessObjects Business Intelligence. En tal caso, no se usa el protocolo del servicio Web de informes. Es posible que deba ajustar la configuración del servidor de seguridad para poder acceder al CMS de la plataforma SAP BusinessObjects Business Intelligence. El puerto predeterminado del CMS es 6400. Póngase en contacto con el administrador del sistema para obtener más información sobre la configuración de la dirección de red y el puerto del sistema de plataforma SAP BusinessObjects Business Intelligence. Puede encontrar más información sobre la personalización de puertos en el Manual del administrador de la plataforma SAP BusinessObjects Business Intelligence. Nota Los nodos disponibles dependen de la configuración y del contrato de licencia. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 83 Un informe que se muestra mediante el nodo Crystal Services se puede arrastrar a la bandeja de componentes de formularios Web Forms o Windows Forms en Visual Studio .NET 2003. Información relacionada Directorio de visores [página 13] 1.3.6.3 Configurar Archivos de servidor en Crystal Services Uno de los grupos de servicios de Crystal Services que se incluye con SAP Crystal Reports, versión para programadores de Microsoft Visual Studio es Archivos de servidor Archivos de servidor es una colección de servicios Web de informes que se exponen mediante un directorio virtual, desde una ruta de directorio de archivos en la unidad de disco duro. Por cada versión de Visual Studio se necesitan distintos requisitos de implementación. 1.3.6.3.1 Configurar archivos de servidor en Visual Studio .NET 2003 Archivos de servidor hace referencia a una colección de servicios Web de informes que se exponen desde el directorio virtual de visores en IIS. Server Files se proporcionó originalmente como un nodo de Crystal Services en SAP Crystal Reports para Visual Studio .NET 2002, pero el nodo se ha eliminado desde entonces. Todas las versiones posteriores de SAP Crystal Reports siguen admitiendo Archivos de servidor en el SDK, aunque es necesario realizar algunos ajustes de configuración para cada versión. Los Archivos de servidor se generan a partir de los archivos de informe subyacentes, que se almacenan en la carpeta de informes de muestra (o cualquier otra carpeta que pueda designar) en la ruta del directorio de archivos del servidor Web. Se puede acceder de dos formas a Archivos de servidor: ● Como un nodo visible bajo Crystal Services. Este modo de acceso sólo está disponible en SAP Crystal Reports para Visual Studio 2003. ● A través de la configuración mediante programación de la clase ServerFileReport en el SDK. El acceso a Archivos de servidor a través del SDK está disponible en todas las versiones de SAP Crystal Reports .NET. Los Archivos de servidor se muestran a través de un directorio virtual en IIS. La conexión con los archivos de informe subyacentes requiere la configuración de permisos de acceso a la carpeta. Los permisos de acceso se configuran mediante una entrada del archivo web.config. 84 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Cómo se configuran los archivos de servidor en Visual Studio .NET 2003 En Visual Studio .NET 2003, se ha dejado de usar la carpeta de configuración de archivos de servidor y se ha pasado a usar una entrada de configuración al archivo web.config. Puede agregar la entrada de configuración en el archivo web.config de cada proyecto, de uno en uno. Sin embargo, se recomienda que se agregue esta entrada de configuración en el archivo web.config situado en el directorio virtual de visores de SAP Crystal Reports, con el fin de que dicha información esté disponible para todos los proyectos de Visual Studio .NET. Antes de hacerlo, vea la siguiente sección para obtener más información sobre el "directorio virtual de visores". Archivos de servidor y el directorio virtual de visores Archivos de servidor se atiende fuera de Servicios de Internet Information Server (IIS) desde un servicio Web centralizado en un directorio virtual de visores especial. Cada versión posterior de SAP Crystal Reports crea un directorio virtual de visores en IIS, lo que permite mantener varias versiones de SAP Crystal Reports. Por lo tanto, si dispone de Server Files codificado en un proyecto con una versión anterior de SAP Crystal Reports, y ahora actualiza a una versión posterior, el "directorio virtual de visores" adicional se convierte en un problema de mantenimiento. En el código, el nombre del "directorio virtual de visores" de la propiedad WebServiceURL de cada instancia de ServerFileReport se debe cambiar al "directorio virtual de visores" para permitir que funcionen las instancias de ServerFileReport. Información relacionada Configurar archivos de servidor en Visual Studio 2005 y posterior [página 87] Trabajar con Crystal Reports como servicio web [página 80] Directorio de visores [página 13] 1.3.6.3.1.1 Para cambiar el "directorio virtual de visores" en la propiedad WebServiceURL de las instancias de ServerFileReport Procedimiento 1. Busque cada repetición en el proyecto en el que esté asignada la propiedad WebServiceURL de una instancia de ServerFilesReport. 2. Compare el nombre del directorio virtual de visores actualmente asignado en el código con el que se utiliza en versiones anteriores. 3. Cambie el nombre del directorio virtual de visores al nombre que se usa en la versión más reciente instalada de SAP Crystal Reports. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 85 4. Vuelva a compilar y compruebe que los informes se cargan correctamente. Pasos siguientes Modifique el archivo web.config en el directorio virtual de visores para configurar correctamente los archivos del servidor de todas las versiones posteriores a Visual Studio .NET 2002. 1.3.6.3.1.2 Para agregar la entrada de configuración de Archivos de servidor al archivo web.config del directorio virtual de visores (todas las versiones posteriores a Visual Studio .NET 2002) Procedimiento 1. Localice el directorio virtual de visores de la versión más reciente que se haya instalado de SAP Crystal Reports. 2. Para comprobar que funciona el directorio virtual de los visores, abra un explorador y escriba la dirección URL del servicio Web de informes publicado en el directorio virtual de los visores. Opción Descripción Visual Studio 2003 http://localhost/CrystalReportWebFormViewer2/ ServerFileReportService.asmx?wsdl SAP Crystal Reports 2008 http://localhost/crystalreportviewers12/ ServerFileReportService.asmx?wsdl 3. En un editor de textos, abra el archivo web.config situado en el directorio virtual de visores. Nota De forma alternativa, puede realizar estos cambios únicamente en el archivo web.config de la aplicación Web cliente que accederá a estos informes de Archivos de servidor. 4. En la parte superior del archivo web.config, en la etiqueta de configuración, agregue una entrada configSections que declare un nuevo tipo sectionGroup (crystalDecisions) y su sección (serverFileReportManager). <configSections> <sectionGroup name="crystalDecisions"> <section name="serverFileReportManager" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, Custom=null" /> </sectionGroup> </configSections> 86 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 5. Detrás de la etiqueta de cierre de configSections, agregue el nuevo tipo sectionGroup y la sección que ha declarado en el paso anterior. En el ejemplo siguiente, cambie el valor del directorio raíz por el directorio en el que ha instalado los informes. En lo que respecta a este ejemplo, la ruta de archivo se ha establecido en C:\Archivos de programa \Microsoft Visual Studio .NET 2003\Crystal Reports\Samples\Reports\Feature Examples. <crystalDecisions> <serverFileReportManager> <add key="rootDirectory" value="C:\program files\Microsoft Visual Studio .NET 2003\Crystal Reports\Samples \En\Reports\Feature Examples" /> </serverFileReportManager> </crystalDecisions> Nota Debe escribir la ruta de directorio de archivos a la carpeta de informes en el campo de valor. 6. Guarde los cambios en web.config. 1.3.6.3.2 Configurar archivos de servidor en Visual Studio 2005 y posterior Los Archivos de servidor son una colección de servicios Web de informes que exponen informes en un servidor IIS. Server Files se proporcionó originalmente como un nodo de Crystal Services en SAP Crystal Reports para Visual Studio .NET 2002, pero el nodo se ha eliminado desde entonces. Todas las versiones posteriores de SAP Crystal Reports siguen admitiendo Archivos de servidor en el SDK, aunque es necesario realizar algunos ajustes de configuración para cada versión. Los Archivos de servidor se generan a partir de los archivos de informes subyacentes, que se almacenan en la carpeta de informes de muestra (o cualquier otra carpeta que se pueda designar) en la ruta del directorio de archivos del servidor Web. Configurar Archivos de servidor Para configurar archivos de servidor para Visual Studio 2005 o posterior, debe seguir dos pasos. En primer lugar, debe crear el servicio Web de informes que expone los informes. El segundo paso es modificar el archivo web.config que corresponde al nuevo servicio Web. En Visual Studio 2005, se ha eliminado la carpeta de configuración de Archivos de servidor que existía en Visual Studio .NET 2002 y en su lugar se ha agregado una entrada de configuración en el archivo web.config. Puede agregar la entrada de configuración al archivo web.config de cada proyecto, de uno en uno. No obstante, se recomienda que en lugar de esto, añada esta entrada de configuración al archivo web.config ubicado en el directorio virtual que contiene los servicios Web de informes. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 87 Información relacionada Conectarse a servicios Web de informes desde un sitio Web seguro [página 91] Trabajar con Crystal Reports como servicio web [página 80] 1.3.6.3.2.1 Para crear los servicios Web de informes necesarios para Archivos de servidor Procedimiento 1. Inicie Visual Studio. 2. En el menú Archivo, seleccione Nuevo y haga clic en Sitio Web. 3. En el cuadro de diálogo Nuevo sitio Web, seleccione Visual C# en la lista Lenguaje. 4. En la lista Plantillas, haga clic en Servicio Web ASP.NET 5. En el campo Ubicación, sustituya el nombre de proyecto predeterminado por el nombre de su proyecto. Para este ejemplo, guardamos el proyecto en C:\InetPub\wwwroot\ con el nombre CrystalReportsWebServices. C:\InetPub\wwwroot\CrystalReportsWebServices\ 6. Haga clic en Aceptar. 7. En el menú Depurar, haga clic en Iniciar depuración. Aparece un cuadro de diálogo para indicar que el archivo Web.config se debe modificar. Haga clic en el botón Aceptar para habilitar la depuración. 8. Una vez realizada la depuración, vuelva a la aplicación. 9. En el Explorador de soluciones, haga clic con el botón secundario en Service.asmx y, a continuación, haga clic en Eliminar. 10. En el Explorador de soluciones, expanda la carpeta App_Code, haga clic con el botón secundario en Service.cs y, a continuación, haga clic en Eliminar. 11. En el Explorador de soluciones, haga clic con el botón secundario en el nombre del proyecto que está en negrita y, a continuación, haga clic en Agregar nuevo elemento. 12. En el cuadro de diálogo Agregar nuevo elemento, realice lo siguiente: a) En el campo Plantillas instaladas, seleccione Servicio Web. b) En el campo Nombre, escriba ServerFileReportService.asmx. c) Desactive Colocar código en archivo independiente. d) Haga clic en Agregar. 13. Sustituya el contenido del archivo ServerFileReportService.asmx por la línea siguiente: <%@ WebService language="C#" class="CrystalDecisions.Web.Services.ServerFileReportService" %> 88 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 14. En el menú Archivo, haga clic en Guardar todo. 15. En el Explorador de soluciones, haga clic con el botón secundario en el nombre del proyecto que está en negrita y, a continuación, haga clic en Agregar nuevo elemento. 16. En el cuadro de diálogo Agregar nuevo elemento: a) En el campo Plantillas instaladas, seleccione Servicio Web. b) En el campo Nombre, escriba ServerFileReportManager.asmx c) Desactive Colocar código en archivo independiente. d) Haga clic en Agregar. 17. Sustituya el contenido del archivo ServerFileReportManager.asmx por la línea siguiente: <%@ WebService language="C#" class="CrystalDecisions.Web.Services.ServerFileReportManager" %> 18. En el menú Archivo, haga clic en Guardar todo. 1.3.6.3.2.2 Para cambiar el "directorio virtual de visores" en la propiedad WebServiceURL de las instancias de ServerFileReport Procedimiento 1. Busque cada repetición en el proyecto en el que esté asignada la propiedad WebServiceURL de una instancia de ServerFilesReport. 2. Compare el nombre del directorio virtual de visores actualmente asignado en el código con el nombre que se utiliza en versiones anteriores. 3. Cambie el nombre del directorio virtual de visores que se usa en la versión más reciente instalada de SAP Crystal Reports. Si la última versión instalada de SAP Crystal Reports es SAP Crystal Reports para Visual Studio 2005, introduzca la ruta del servicio Web de informes creada anteriormente en este tutorial. 4. Vuelva a compilar y compruebe que los informes se cargan correctamente. Información relacionada Directorio de visores [página 13] Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 89 1.3.6.3.2.3 Para agregar la entrada de configuración de Archivos de servidor en el archivo web.config Procedimiento 1. En el Explorador de soluciones, abra el archivo Web.Config. 2. Sustituya todo el contenido del archivo Web.Config por el siguiente XML. En el ejemplo siguiente, cambie el valor del directorio raíz por el directorio en el que ha instalado los informes. Para este ejemplo, la ruta de archivo se ha establecido en C:\Archivos de programa\Microsoft Visual Studio 8\Crystal Reports\Samples\en\Reports\Feature Examples. <?xml version="1.0"?> <configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0"> <configSections> <sectionGroup name="crystalDecisions"> <section name="serverFileReportManager" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, Custom=null"/> </sectionGroup> </configSections> <crystalDecisions> <serverFileReportManager> <add key="rootDirectory" value="C:\Archivos de programa\Microsoft Visual Studio 8\Crystal Reports\Samples\en\Reports\Feature Examples"/> </serverFileReportManager> </crystalDecisions> <appSettings/> <connectionStrings/> <system.web> <compilation debug="true"> <assemblies> <add assembly="CrystalDecisions.Web, Version=12.1.2000.0, Culture=neutral, PublicKeyToken=692FBEA5521E1304"/> </assemblies> </compilation> </system.web> </configuration> Nota Debe escribir la ruta de acceso de directorio de archivos a la carpeta de informes, donde aparece PUT_FILE_DIRECTORY_PATH_TO_REPORTS_FOLDER_HERE. 3. Guarde los cambios en el archivo web.config. 4. Para comprobar que el directorio virtual de visores funciona, abra un explorador y escriba la dirección URL del servicio Web de informes publicado. http://localhost/CrystalReportsWebServices/ServerFileReportService.asmx?wsdl 90 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 1.3.6.3.2.4 Archivos de servidor heredado y el directorio virtual de visores En versiones anteriores de SAP Crystal Reports, Server Files se servía de IIS desde un servicio Web centralizado, que está en el directorio virtual de visores. Cada versión posterior de SAP Crystal Reports crea un directorio adicional llamado "directorio virtual de visores" en IIS, lo que permite mantener varias versiones de SAP Crystal Reports. Por lo tanto, si dispone de Server Files codificado en un proyecto con una versión anterior de SAP Crystal Reports, y ahora actualiza a una versión posterior, el "directorio virtual de visores" adicional se convierte en un problema de mantenimiento. En el código, el nombre del "directorio virtual de visores" de la propiedad WebServiceURL de cada instancia de ServerFileReport se debe cambiar a la ubicación actual del servicio Web de informes para permitir que funcionen las instancias de ServerFileReport. Información relacionada Directorio de visores [página 13] 1.3.6.4 Conectarse a servicios Web de informes desde un sitio Web seguro En SAP Crystal Reports, versión para programadores de Microsoft Visual Studio, se pueden publicar informes de Crystal como servicios Web. Debido se tiene acceso a que los servicios Web a través del Web, es recomendable proteger los servicios Web de informes frente al acceso anónimo. En esta sección se explica cómo eliminar el acceso anónimo desde un directorio virtual que contenga un servicio Web de informes y, a continuación, escribir código que coloque el servicio Web de informes en una clase RemoteReportProxy, que se puede configurar para atender la autenticación NT en el servidor de Servicios de Internet Information Server (IIS). Dos tipos de Servicios Web de informes requieren código de autenticación: Servicios Web de informes normales y Archivos de servidor. Información relacionada Publicar y utilizar un informe como un servicio Web [página 80] Configurar Archivos de servidor en Crystal Services [página 84] Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 91 1.3.6.4.1 Servicios Web de informes y autenticación NT 1.3.6.4.1.1 informes Agregar autenticación NT al servicio Web de Antes de agregar modificaciones para autenticación NT, debe crear un proyecto que publique y utilice un servicio Web de informes tal como se muestra en Publicar y utilizar un informe como un servicio Web [página 80]. En esta sección aprenderá a eliminar el acceso anónimo del directorio que contiene el servicio Web de informes que ha creado anteriormente. Información relacionada Conectarse a servicios Web de informes desde un sitio Web seguro [página 91] 1.3.6.4.1.1.1 Para eliminar el acceso anónimo del directorio que contiene el servicio Web de informes Procedimiento 1. En el Panel de control, haga doble clic en Herramientas administrativas y, a continuación, haga doble clic en Administrador de servicios de Internet. 2. En la ventana Internet Information Services, expanda los nodos superiores y, a continuación, expanda el nodo Default Web Site. 3. Busque la carpeta del directorio virtual del Report Web Service que ha creado anteriormente. 4. Haga clic con el botón derecho en el directorio virtual y seleccione Propiedades. 5. En el cuadro de diálogo Propiedades, en la ficha Seguridad de directorio, haga clic en Editar. 6. Desactive la casilla de verificación Acceso anónimo y, a contiuación, haga clic en Aceptar. 7. Haga clic en Aceptar para cerrar Propiedades. 8. Cierre la ventana Servicios de Internet Information Server. Resultados En este punto, si desea que la autenticación en este directorio se establezca para un usuario de red específico, necesitará permisos de usuario de red individual para la carpeta desde el Explorador de Windows. 92 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 1.3.6.4.1.1.2 Para agregar permisos de usuario de red específico a la carpeta Procedimiento 1. En Explorador de Windows, busque la carpeta que contiene el servicio Web. 2. Haga clic con el botón derecho en la carpeta y seleccione Propiedades. 3. En el cuadro de diálogo Propiedades , en la ficha Seguridad, haga clic en Agregar. 4. En el cuadro de diálogo Seleccionar usuarios, equipos o grupos, en el panel <<Escriba los nombres separados por puntos y coma>> o elíjalos en la lista, escriba el nombre de usuario de red. 5. Haga clic en Comprobar nombres. 6. Verifique que el nombre de usuario se ha agregado correctamente y, a continuación, haga clic en Aceptar. 7. En el panel Permisos, seleccione Permitir para el permiso Leer. 1.3.6.4.1.2 seguro Editar la aplicación cliente para agregar acceso En esta sección editará la aplicación cliente para acceder de forma segura al servicio Web de informes mediante autenticación NT. Debe agregar ensamblados, espacios de nombres y nuevo código. 1.3.6.4.1.2.1 Para verificar que la aplicación cliente ya no puede acceder al servicio web seguro Procedimiento 1. Vuelva a abrir la aplicación cliente que ha creado para utilizar el servicio Web de informes (en la sección Publicar y utilizar un informe como un servicio Web [página 80]). 2. Ejecute la aplicación para verificar que ya no puede acceder de forma anónima al servicio Web de informes de este directorio. Aparece un mensaje de error: "La solicitud de error con HTTP estado 401: Acceso denegado." Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 93 1.3.6.4.1.2.2 Para agregar nuevos ensamblados y referencias a dichos ensamblados Procedimiento 1. Haga clic con el botón secundario en la carpeta References y seleccione Agregar referencia... 2. En el cuadro de diálogo Add Reference, en la ficha .NET, mantenga presionada la tecla CTRL y haga clic en los siguientes ensamblados: ○ CrystalDecisions.ReportSource ○ System.Web.Services 3. Haga clic en Select en la parte derecha del cuadro de diálogo. 4. Verifique que ambos ensamblados se han agregado al panel Selected Components y, a continuación, haga clic en OK. 5. Abra el formulario Web Forms o Windows Forms que ha creado en Configuración de proyectos [página 14]. 6. En el menú View, haga clic en Code. 7. Sobre la firma de clase, agregue tres declaraciones "Imports" [Visual Basic] o "using" [C#] a la parte superior de la clase para los siguientes espacios de nombres. Imports CrystalDecisions.ReportSource Imports System.Net Imports System.Web.Services using CrystalDecisions.ReportSource; using System.Net; using System.Web.Services; Pasos siguientes A continuación, aprenderá a agregar código para configurar una clase RemoteReportProxy que pasa credenciales de usuario al directorio seguro del servicio Web de informes. 1.3.6.4.1.2.3 Codificar el método GetReportWebServiceWithAuthentication() Contexto El método GetReportWebServiceWithAuthentication() se utiliza para configurar el proxy del informe remoto y para controlar la autenticación NT. En esta sección, aprenderá a codificar el método GetReportWebServiceWithAuthentication() para establecer los valores de las propiedades URL y Credentials. Debe agregar el método 94 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net GetReportWebServiceWithAuthentication() a ReportSource del control CrystalReportViewer para la declaración y creación de instancia de la clase RemoteReportProxy. Este método agrega opcionalmente configuración de proxy de servidor de seguridad a la instancia RemoteReportProxy. Procedimiento 1. En la parte inferior de la clase, cree el método auxiliar privado GetReportWebServiceWithAuthentication() que devuelve una clase RemoteReportProxy. Private Function GetReportWebServiceWithAuthentication() As RemoteReportProxy End Function private RemoteReportProxy GetReportWebServiceWithAuthentication() { } 2. En el método ConfigureCrystalReports(), seleccione la cadena de dirección URL del servicio Web que está asignada actualmente a la propiedad ReportSource del control CrystalReportViewer. Corte la cadena en el portapapeles. Nota Más adelante en este procedimiento, asignará un nuevo valor a la propiedad ReportSource del control CrystalReportViewer. 3. Declare una variable de cadena reportWebServiceURL y pegue la cadena de dirección URL. Dim reportWebServiceURL As String = "http://mywebserviceserver.com/MyWebServiceDirectory/Hierarchical %20GroupingService.asmx" string reportWebServiceURL = "http://mywebserviceserver.com/MyWebServiceDirectory/Hierarchical %20GroupingService.asmx"; 4. Declare y cree una instancia de la clase RemoteReportProxy. Dim myRemoteReportProxy As RemoteReportProxy = New RemoteReportProxy() RemoteReportProxy remoteReportProxy = new RemoteReportProxy(); 5. Asigne la variable reportWebServiceURL a la propiedad URL de la instancia RemoteReportProxy. myRemoteReportProxy.Url = reportWebServiceURL Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 95 remoteReportProxy.Url = reportWebServiceURL; 6. Llame al método ConfigureAuthentication() (que creará en los siguientes procedimientos) y pase un valor True Boolean y la variable reportWebServiceURL. Asigne este método a la propiedad Credentials de la instancia RemoteReportProxy. myRemoteReportProxy.Credentials = ConfigureAuthentication(True, reportWebServiceURL) remoteReportProxy.Credentials = ConfigureAuthentication(true, reportWebServiceURL); 7. Llame al método AddFirewallProxySettings() (que creará en los siguientes procedimientos) y pase un valor booleano False, la cadena de URI para un servidor proxy de seguridad y la instancia RemoteReportProxy. Nota Reemplace la cadena de URI por su servidor de proxy de seguridad. myRemoteReportProxy = AddFirewallProxySettings(False, "<< http://firewallproxyserver:8080>>", myRemoteReportProxy) remoteReportProxy = AddFirewallProxySettings(false, "<< http://firewallproxyserver:8080>>", remoteReportProxy); 8. Devuelva la instancia RemoteReportProxy desde el método. Return myRemoteReportProxy return remoteReportProxy; 1.3.6.4.1.2.4 Codificar el método ConfigureAuthentication() Contexto En esta sección, aprenderá a codificar el método ConfigureAuthentication() para permitir dos enfoques para configurar la autenticación. En el primer enfoque, se utiliza un nombre de usuario específico, una contraseña y un nombre de dominio para cumplir los requisitos de los permisos de seguridad de usuario que ha agregado en Agregar autenticación NT al servicio Web de informes [página 92]. En el segundo enfoque, se basará en la autorización NTLM. 96 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Cuando se pasa un valor True Boolean a este método, se proporcionan las credenciales específicas de usuario para tener acceso a los servicios Web. Un valor False Boolean llama al código para credenciales NTLM para tener acceso a los servicios Web. El método ConfigureAuthentication() se llama desde el método GetReportWebServiceWithAuthentication(). Procedimiento 1. En la parte inferior de la clase, cree el método auxiliar privado ConfigureAuthentication() que devuelve la interfaz ICredentials. Este método acepta dos parámetros, un valor booleano denominado isUserSpecific y la cadena reportWebServiceURL. Private Function ConfigureAuthentication(ByVal isUserSpecific As Boolean, ByVal reportWebServiceURL As String) As ICredentials End Function private ICredentials ConfigureAuthentication(bool isUserSpecific, string reportWebServiceURL) { } 2. Dentro del método, cree un bloque condicional que compruebe el parámetro de método isUserSpecific Boolean. If isUserSpecific Then Else End If if(isUserSpecific) { } else { } 3. Recopile la siguiente información: el nombre de usuario, la contraseña y el nombre de dominio de red que ha autorizado con permisos de acceso de usuario para el directorio que contiene el servicio Web de informes. 4. En el bloque If, declare y asigne los valores adecuados a las variables de cadena username, password y domain. Dim userName As String = "fchen" <NonSerialized()> Dim password As String = "1234" Dim domain As String = "Enterprise" string userName = "fchen"; [NonSerialized()] string password = "1234"; string domain = "Enterprise"; Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 97 5. Declare y cree una instancia de la clase NetworkCredential y pase las variables de cadena username, password y domain. Dim myNetworkCredential As NetworkCredential = New NetworkCredential(userName, password, domain) NetworkCredential networkCredential = new NetworkCredential(userName, password, domain); 6. Devuelva la instancia de NetworkCredential desde el bloque If. En el bloque Else, se crean tres valores alternativos: un URI para el servicio Web de informes, una cadena que indica que el tipo de autenticación es NTLM y una instancia de NetworkCredential. Cada uno de estos valores se pasa a la caché de credenciales. Return myNetworkCredential return networkCredential; 7. En el bloque Else, declare y cree una instancia de la clase CredentialCache. Dim myCredentialCache As CredentialCache = New CredentialCache() CredentialCache credentialCache = new CredentialCache(); 8. Declare y cree una instancia de la clase Uri y pase el parámetro reportWebServiceURL desde el método ConfigureAuthentication(). Dim myUri As Uri = New Uri(reportWebServiceURL) Uri uri = new Uri(reportWebServiceURL); 9. Asigne el valor de cadena "NTLM" a una variable de cadena denominada "ntlmAuthorization". Dim ntlmAuthorization As String = "NTLM" string ntlmAuthorization = "NTLM"; 10. Declare y cree una instancia de la clase NetworkCredential. Dim myNetworkCredential As NetworkCredential = New NetworkCredential() NetworkCredential networkCredential = new NetworkCredential(); 98 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 11. Pase la instancia de Uri, la cadena ntlmAuthorization y la instancia de NetworkCredential al método Add() de la instancia de CredentialCache. myCredentialCache.Add(myUri, ntlmAuthorization, myNetworkCredential) credentialCache.Add(uri, ntlmAuthorization, networkCredential); 12. Devuelva la instancia de ICredentials desde la propiedad DefaultCredentials de la clase CredentialCache, desde el bloque Else. Return CredentialCache.DefaultCredentials return CredentialCache.DefaultCredentials; 1.3.6.4.1.2.5 Codificar el método AddFirewallProxySettings() Contexto En esta sección, aprenderá a codificar el método AddFirewallProxySettings() con la instancia RemoteReportProxy como parámetro. También aprenderá a agregar la configuración de proxy Web a la instancia de RemoteReportProxy. El método AddFirewallProxySettings() se llama desde el método GetReportWebServiceWithAuthentication(). Este método sólo se ejecuta cuando se necesita tener acceso al servicio Web de informes mediante un proxy de servidor de seguridad. Procedimiento 1. En la parte inferior de la clase, cree el método auxiliar privado AddFirewallProxySettings() que devuelve la clase RemoteReportProxy y pasa una variable booleana, una variable de cadena y la instancia RemoteReportProxy. Private Function AddFirewallProxySettings(ByVal isFirewallProxy As Boolean, ByVal webProxyURI As String, ByVal remoteReportProxy As RemoteReportProxy) As RemoteReportProxy End Function private RemoteReportProxy AddFirewallProxySettings(bool isFirewallProxy, string webProxyURI, RemoteReportProxy remoteReportProxy) Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 99 { } 2. En el método, cree un bloque condicional que pruebe la variable isFirewallProxy Boolean. If isFirewallProxy Then End If if(isFirewallProxy) { } 3. En el bloque condicional, declare y cree una instancia de la clase WebProxy y pase la cadena webProxyURI y un valor True Boolean. Dim myWebProxy As WebProxy = New WebProxy(webProxyURI, True) WebProxy webProxy = new WebProxy(webProxyURI, true); 4. Asigne la instancia de WebProxy a la propiedad Proxy de la instancia de RemoteReportProxy que se ha pasado al método como parámetro. myRemoteReportProxy.Proxy = myWebProxy remoteReportProxy.Proxy = webProxy; 5. Fuera del bloque condicional, devuelva la instancia RemoteReportProxy. Return myRemoteReportProxy return remoteReportProxy; Resultados Cuando se pasa un valor booleano False al parámetro isFireWallProxy, no se agrega la configuración de proxy de servidor de seguridad. Puede probar esta versión del proyecto con la configuración de autenticación NT más simple y sin servidor de seguridad entre el cliente de prueba y el servicio Web. Al probar este proyecto con un servidor de seguridad, mueva la aplicación cliente fuera de dicho servidor y, a continuación, cambie el valor del parámetro booleano isFireWallProxy a True. Debe asignar un valor de URI de proxy Web preciso al parámetro de cadena webProxyURI y continuar la prueba de este código a través de un servidor de seguridad. 100 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Información relacionada Conectarse a servicios Web de informes desde un sitio Web seguro [página 91] 1.3.6.4.1.3 Probar el código de autenticación NT y las credenciales NTLM 1.3.6.4.1.3.1 Para probar la autenticación NT Requisitos previos Para poder probar el código, debe cambiar el código de enlace de informes en el método ConfigureCrystalReports(). ● En el método ConfigureCrystalReports(), asigne una llamada al método GetReportWebServiceWithAuthentication() para la propiedad ReportSource del control CrystalReportViewer. myCrystalReportViewer.ReportSource = GetReportWebServiceWithAuthentication() crystalReportViewer.ReportSource = GetReportWebServiceWithAuthentication(); Ahora estará listo para probar el código de autenticación NT que ha agregado al proyecto cliente del servicio Web. Contexto Para probar el código de autenticación NT en el proyecto cliente del servicio Web: Procedimiento 1. En el menú Generar, seleccione Generar solución. 2. Si existen errores de generación, continúe y corríjalos ahora. 3. En el menú Depurar, haga clic en Iniciar. La aplicación cliente se conecta al servicio Web y, si el nombre de usuario, la contraseña y el dominio son correctos, el informe se muestra correctamente. 4. Vuelva a Visual Studio y haga clic en Detener para salir del modo de depuración. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 101 Resultados Acaba de conectarse al directorio seguro con credenciales de red específicas de usuario. Ahora aprenderá a probar la conexión mediante el uso de credenciales NTLM. Nota Para configurar los valores del servidor de seguridad proxy, puede cambiar el valor Boolean que se pasa al método AddFirewallProxySettings() como parámetro. Información relacionada Archivos de servidor y autenticación NT [página 102] 1.3.6.4.1.3.2 Para probar las credenciales NTLM en el proyecto cliente del servicio Web Procedimiento 1. Busque la llamada al método ConfigureAuthentication() en el método GetReportWebServiceWithAuthentication(). 2. En la llamada a ConfigureAuthentication(), cambie el valor booleano del primer parámetro de método de True a False. 3. En el menú Generar, seleccione Generar solución. 4. En el menú Depurar, haga clic en Iniciar. 5. La aplicación cliente se conecta al servicio Web mediante autenticación NTLM. 6. Vuelva a Visual Studio y haga clic en Detener para salir del modo de depuración. Resultados Ahora ya puede conectarse correctamente desde el cliente de servicio Web a un servicio Web de informes en un directorio seguro. Lo ha realizado mediante la configuración de valores en la instancia de RemoteReportProxy y pasando dicha instancia a la propiedad ReportSource del control CrystalReportViewer. 1.3.6.4.2 Archivos de servidor y autenticación NT Puede utilizar Archivos de servidor para conectar fácilmente con informes ubicados en un equipo remoto. 102 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Sin embargo, si el directorio virtual que proporciona los informes que están almacenados en Archivos de servidor está protegido con autenticación NT, se necesita código adicional en la aplicación cliente para direccionar estos informes y proporcionar las credenciales de red necesarias. Información relacionada Configurar Archivos de servidor en Crystal Services [página 84] 1.3.6.4.2.1 Crear un proyecto para direccionar un directorio no seguro para Archivos de servidor Requisitos previos Para crear un proyecto que direccione un directorio no seguro, debe tener configurado Archivos de servidor para su versión concreta de Visual Studio. Siga las instrucciones de la sección correspondiente y anote la ruta de directorio de archivos al directorio de los informes (necesitará la ruta para los procedimientos posteriores): ● Configurar archivos de servidor en Visual Studio .NET 2003 [página 84] ● Configurar archivos de servidor en Visual Studio 2005 y posterior [página 87] Vaya al directorio de informes del proyecto y busque el nombre de un informe que desee ver mediante Archivos de servidor. En los siguientes pasos, se usa el informe de muestra denominado Hierarchical Grouping.rpt. Nota Las instrucciones siguientes sólo funcionan para un nuevo proyecto que cree en Configuración de proyectos [página 14]. Contexto En esta sección, aprenderá a configurar las credenciales de red necesarias. Para empezar, creará una aplicación cliente que tenga acceso a los informes que están almacenados en Archivos de servidor y permita un acceso no seguro al directorio de servicios Web. Una vez verificado que la aplicación cliente funciona, podrá continuar para agregar acceso seguro al directorio virtual y, a continuación, escribirá código adicional en la aplicación cliente con el fin de proporcionar credenciales para la autenticación NT. Para crear una aplicación cliente para acceder a los informes de Archivos de servidor Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 103 Procedimiento 1. Abra el formulario Web Forms o Windows Forms. 2. En el menú Ver, haga clic en Código. 3. Busque el método ConfigureCrystalReports() que ha creado en Configuración de proyectos [página 14]. 4. En el método, declare y cree una instancia de la clase ServerFileReport. Dim myServerFileReport As ServerFileReport = New ServerFileReport() ServerFileReport serverFileReport = new ServerFileReport(); 5. Asigne el nombre del informe que desea mostrar del directorio de informes a la propiedad ReportPath de la instancia de ServerFileReport. Nota El directorio es el que ha configurado para los informes de Archivos de servidor en el archivo Web.config. Al configurar el directorio virtual de visores anteriormente, ha probado el archivo wsdl introduciendo una dirección URL en el servicio Web ServerFileReportServer.asmx en el directorio virtual de visores. En el siguiente paso, indicará dicha dirección URL como valor en el código. El siguiente ejemplo de código usa el informe Hierarchical Grouping, incluido en el subdirectorio Feature Examples de la carpeta Sample Reports. No olvide incluir el nombre del subdirectorio, seguido de una barra invertida. myServerFileReport.ReportPath = "Feature Examples\Hierarchical Grouping.rpt" serverFileReport.ReportPath = "Feature Examples\\Hierarchical Grouping.rpt"; 6. Busque la versión correcta de la dirección URL al servicio Web ServerFileReportService.asmx correspondiente a su versión de SAP Crystal Reports. Si tiene instalado SAP Crystal Reports, versión para programadores de Microsoft Visual Studio, éste será el directorio virtual del visor para la versión instalada de SAP Crystal Reports. Si tiene instalado SAP Crystal Reports y SAP Crystal Reports, versión para programadores de Microsoft Visual Studio no está instalado, ésta será la dirección URL del servicio Web de informes creado en Configurar archivos de servidor en Visual Studio 2005 y posterior [página 87]. 7. Asigne esta dirección URL de servicio Web a la propiedad WebService de la instancia de ServerFileReport. myServerFileReport.WebServiceUrl = "http://localhost/CrystalReportsWebServices/ServerFileReportService.asmx" serverFileReport.WebServiceUrl = "http://localhost/CrystalReportsWebServices/ServerFileReport.asmx"; 104 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net La instancia de ServerFileReport ahora está configurada y lista para pasarla al control CrystalReportViewer. 8. Asigne la instancia de ServerFileReport a la propiedad ReportSource del control CrystalReportViewer. myCrystalReportViewer.ReportSource = myServerFileReport crystalReportViewer.ReportSource = serverFileReport; Información relacionada Directorio de visores [página 13] 1.3.6.4.2.2 Volver a configurar Archivos de servidor para direccionar un directorio seguro En esta sección, aprenderá a volver a configurar el directorio y la aplicación cliente para direccionar un directorio seguro. Para empezar, deshabilite el acceso anónimo al directorio virtual de visores en Servicios de Internet Information Server (IIS). 1.3.6.4.2.2.1 Para deshabilitar el acceso anónimo al directorio virtual de visores en IIS Procedimiento 1. En el Panel de control, haga doble clic en Herramientas administrativas y, a continuación, haga doble clic en Administrador de servicios de Internet. 2. En la ventana Internet Information Services, expanda los nodos superiores y, a continuación, expanda el nodo Default Web Site. 3. Busque la carpeta del directorio virtual esperado y, a continuación, haga clic con el botón derecho en dicha carpeta para seleccionar Propiedades. 4. En el cuadro de diálogo Propiedades, en la ficha Seguridad de directorio, haga clic en Editar... 5. Desactive la casilla de verificación Acceso anónimo y, a contiuación, haga clic en Aceptar. 6. Haga clic en Aceptar para cerrar Propiedades. 7. Cierre la ventana Servicios de Internet Information Server. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 105 Resultados A continuación, agregue una etiqueta <identity> al archivo Web.config. Nota Este archivo Web.config es el que ha modificado anteriormente al seguir las instrucciones de configuración de Archivos de servidor. Información relacionada Directorio de visores [página 13] 1.3.6.4.2.2.2 Web.config Para agregar una etiqueta identity al archivo Procedimiento 1. Vuelva a abrir el archivo Web.config en el directorio virtual de visores. Nota Existen dos archivos Web.config, uno en el directorio virtual de visores y el otro en la aplicación web local. La etiqueta de identidad que está a punto de agregar debe añadirse al archivo Web.config del directorio virtual de visores. Esto es debido a que la etiqueta identity es necesaria si se ha desactivado el acceso anónimo a un directorio virtual. 2. En la etiqueta <system.web>, en la parte superior, escriba la etiqueta de identidad tal como se muestra. <identity impersonate='true' /> 3. Guarde el archivo Web.config. 4. Si también ha desactivado el acceso anónimo en el directorio virtual de su proyecto Web cliente, agregue también la etiqueta identity al archivo Web.config en su proyecto Web cliente. Pasos siguientes A continuación, modifique su proyecto Web o para Windows cliente para acceder al servicio Web de informes seguro a través de la Autenticación NT. 106 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Información relacionada Directorio de visores [página 13] 1.3.6.4.2.2.3 Para modificar el proyecto cliente para direccionar el directorio virtual de visores seguro Procedimiento 1. Abra el proyecto Web o Windows cliente en Visual Studio. 2. Haga clic con el botón secundario en la carpeta Referencias y seleccione Agregar referencia… 3. En el cuadro de diálogo Agregar referencia, en la ficha .NET, mantenga presionada la tecla CTRL y haga clic para seleccionar dos ensamblados: ○ CrystalDecisions.ReportSource ○ System.Web.Services 4. Haga clic en Seleccionar en la parte derecha del cuadro de diálogo. 5. Verifique que ambos ensamblados se han agregado al panel Componentes seleccionados y, a continuación, haga clic en Aceptar. 6. En Explorador de soluciones, haga clic con el botón secundario en el nombre de proyecto en negrita, seleccione Agregar y, a continuación, Agregar clase. 7. En el campo Nombre, escriba el nombre de clase "NTServerFileRemoteReportSource" y, a continuación, haga clic en Agregar. 8. Sobre la firma de clase, agregue una declaración "Imports" [Visual Basic] o "using" [C#] a la parte superior de la clase para tres espacios de nombres. Imports CrystalDecisions.Shared Imports CrystalDecisions.ReportSource Imports System.Net using CrystalDecisions.Shared; using CrystalDecisions.ReportSource; using System.Net; 9. Modifique la firma de clase NTServerFileRemoteReportSource para ampliar la clase RemoteReportSource. Public Class NTServerFileRemoteReportSource : Inherits RemoteReportSource End Class public class NTServerFileRemoteReportSource : RemoteReportSource { } Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 107 Debido a que la clase base, RemoteReportSource, no puede contener un constructor sin argumentos, debe crear un constructor con argumentos que anule uno de la clase base RemoteReportSource. 10. Si va a codificar el proyecto en C#, elimine el constructor predeterminado creado en esta clase. 11. Cree un constructor que incluya un parámetro de método de ServerFileReport y llame al constructor de la clase base pasando este parámetro de informe y el valor booleano False. Public Sub New(ByVal report As ServerFileReport) MyBase.New(report, False) End Sub public NTServerFileRemoteReportSource(ServerFileReport report) : base(report, false) { } 12. En el constructor, asigne la propiedad DefaultCredentials estática de la clase CredentialCache a la propiedad Credentials de la propiedad m_proxy de la clase base. MyBase.m_proxy.Credentials = CredentialCache.DefaultCredentials base.m_proxy.Credentials = CredentialCache.DefaultCredentials; 13. En el menú Archivo, haga clic en Guardar todo. Resultados Ahora ya podrá editar la clase de código subyacente del formulario Web o para Windows. 1.3.6.4.2.2.4 Para editar la clase de código subyacente para direccionar el origen de informe remoto Procedimiento 1. Vuelva al formulario Web Forms o Windows Forms original. 2. En el menú Ver, haga clic en Código. 3. En el método ConfigureCrystalReports(), agregue una nueva línea entre la configuración de la propiedad serverFileReport.WebServiceUrl y la configuración de ReportSource del control CrystalReportViewer. En esta nueva línea, declare y cree una instancia de la nueva clase ampliada que ha creado y pásele la instancia de ServerFileReport como parámetro de método. Dim myNTServerFileRemoteReportSource As NTServerFileRemoteReportSource = New NTServerFileRemoteReportSource(myServerFileReport) 108 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net NTServerFileRemoteReportSource ntServerFileRRS = new NTServerFileRemoteReportSource(serverFileReport); 4. Modifique la línea final de código en este método: reemplace la instancia de ServerFileReport que se asignó a ReportSource del control CrystalReportViewer con la nueva instancia de NTServerFileRemoteReportSource. myCrystalReportViewer.ReportSource = myNTServerFileRemoteReportSource crystalReportViewer.ReportSource = ntServerFileRRS; Resultados Ahora está listo para probar la aplicación cliente que se ha modificado para pasar la información de credenciales desde un origen de informe remoto. Esta aplicación modificada direcciona el servicio de informes de Archivos de servidor mediante el directorio virtual de visores, que ahora requiere autenticación NT. 1.3.6.4.2.2.5 Para probar el origen de informe remoto con credenciales que direccionan el directorio virtual de visores seguro Procedimiento 1. En el menú Generar, seleccione Generar solución. 2. En el menú Depurar, haga clic en Iniciar. La aplicación cliente se conecta al directorio virtual de visores seguros y, si la nueva instancia de NTServerFileRemoteReportSource se configura con las credenciales correctas, el informe se muestra correctamente. 3. Vuelva a Visual Studio y haga clic en Detener para salir del modo de depuración. 1.3.7 Consideraciones sobre la seguridad Las situaciones siguientes deben tenerse en cuenta al diseñar una aplicación segura. Almacenamiento de datos en caché front-end Los informes visualizados en un explorador Web pueden contener datos importantes que éste puede guardar en caché. Consulte la documentación de Microsoft para obtener información sobre cómo desactivar el almacenamiento en caché en los distintos exploradores. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 109 Seguridad del archivo de informe Es posible que los archivos .rpt de SAP Crystal Reports contengan datos empresariales confidenciales. Se recomienda proteger el acceso a los informes a través de la gestión con el servidor de la plataforma SAP BusinessObjects Business Intelligence, usando la seguridad de archivo, o con el cifrado a nivel de SO. Validación de la entrada de usuario con campos de parámetros Los campos de parámetros solicitan al usuario que proporcione información para procesar un informe. El diálogo de solicitud valida los datos, pero existen pasos adicionales para garantizar que se proporcionen los valores previstos: 1. Usar el texto de la solicitud para describir el tipo de datos que se prevé. 2. Especificar unos valores máximos y mínimos para limitar el rango de números que se pueden introducir cuando se trabaja con datos numéricos. 3. Usar una máscara de edición para solicitar los datos en un formato determinado. 4. Crear diálogos de solicitud propios. El SDK de SAP Crystal Reports .NET proporciona muchas API que pueden usarse para crear diálogos de solicitud. Al crear diálogos de solicitud, se tiene un control completo sobre los valores de los campos de parámetros que proporciona el usuario. Uso de ActiveX Print Control para imprimir informes desde un visor de formularios web .NET El visor de informes Web de SAP Crystal Reports .NET permite imprimir informes como PDF o con ActiveX Print Control. PDF es la opción predeterminada y aconsejable para imprimir un informe. ActiveX Print Control se proporcionó como solución alternativa que permite la impresión con un sólo clic. Esta opción no es aconsejable, ya que requiere la instalación de privilegios administrativos. Además, como el control ActiveX se usa en un explorador Web, el killbit no se define y se considera menos seguro. Creación de una aplicación para ver informes desde la plataforma SAP BusinessObjects Business Intelligence Puede usar SAP Crystal Reports, versión para programadores de Microsoft Visual Studio para crear aplicaciones a fin de ver informes almacenados en un sistema de la plataforma SAP BusinessObjects Business Intelligence. Cuando se crean aplicaciones para ver informes almacenados en un sistema de la plataforma SAP BusinessObjects Business Intelligence, deben tenerse en cuenta las posibles consecuencias que afecten a la seguridad. Para obtener más información, consulte el manual del administrador de la plataforma SAP BusinessObjects Business Intelligence. 110 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Información relacionada Filtrar datos con parámetros o fórmulas [página 134] 1.4 Uso del SDK Esta sección proporciona instrucciones detalladas sobre cómo usar las funciones específicas del SDK de SAP Crystal Reports .Net. 1.4.1 Imprimir un informe El SDK de SAP Crystal Reports .NET permite crear aplicaciones de Windows o sitios Web que pueden imprimir en la impresora local de un usuario final o en una impresora configurada en el servidor Web. La forma más sencilla de agregar funciones de impresión a la aplicación SAP Crystal Reports .NET es usar el botón de impresión del control CrystalReportViewer. Cuando el usuario hace clic en el botón de impresión en la barra de herramientas, aparece el cuadro de diálogo de impresión del sistema estándar. A través de este diálogo se puede especificar la configuración de impresión personalizada. El SDK de SAP Crystal Reports .NET permite configurar opciones de impresión y llamar a una impresora mediante el código, en lugar de usar la interfaz de usuario de SAP Crystal Reports. Use la clase PrintOptions y el método PrintToPrinter del modelo de objetos ReportDocument. Clases usadas para imprimir informes ● CrystalDecisions.CrystalReports.Engine.ReportDocument Representa un informe y contiene las propiedades y los métodos para definir, dar formato, cargar, exportar e imprimir el informe. ● CrystalDecisions.CrystalReports.Engine.PrintOptions Proporciona las propiedades y los métodos para la configuración de las opciones de impresión de un informe. ● CrystalDecisions.Windows.Forms.CrystalReportViewer Representa el control CrystalReportViewer en un formulario de Windows Forms. El control CrystalReportViewer se usa para imprimir informes mediante la interfaz de usuario. ● CrystalDecisions.Web.CrystalReportViewer Proporciona propiedades, métodos y eventos que modifican o recuperan información sobre como aparece y funciona el control CrystalReportViewer. El control CrystalReportViewer se usa para imprimir informes mediante la interfaz de usuario. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 111 Información relacionada Exportar un informe [página 121] 1.4.1.1 Imprimir un informe desde el control CrystalReportViewer La forma más sencilla de agregar funciones de impresión a la aplicación SAP Crystal Reports .NET es usar el botón de impresión del control CrystalReportViewer. El botón de impresión está habilitado de forma predeterminada en la barra de herramientas del control CrystalReportViewer. Existen dos controles CrystalReportViewer en el SDK de SAP Crystal Reports .NET. Para un sitio web, usará la clase CrystalDecisions.Web.CrystalReportViewer y para una aplicación de Windows, la clase CrystalDecisions.Windows.Forms.CrystalReportViewer. Imprimir con la clase CrystalDecisions.Windows.Forms.CrystalReportViewer Al hacer clic en el botón de impresión en la barra de herramientas de CrystalReportViewer en una aplicación de Windows, se mostrará el diálogo de impresión habitual de Windows. Puede invocar el diálogo de impresión mediante programación a través del método CrystalReportViewer.PrintReport. El botón de impresión se puede deshabilitar en una aplicación de Windows estableciendo la propiedad CrystalReportViewer.ShowPrintButton en falsa. Imprimir con la clase CrystalDecisions.Web.CrystalReportViewer El control CrystalReportViewer para sitios web admite dos métodos de impresión: PDF y ActiveX. La impresión a PDF es la opción predeterminada para los sitios web. Al hacer clic en el botón de impresión en la barra de herramientas de CrystalReportViewer en un sitio web, se mostrará el diálogo Opciones de impresión. Introduzca las opciones de impresión personalizadas y haga clic en Aceptar. SAP Crystal Reports abrirá una nueva ventana con un PDF del informe. Imprima el PDF en su impresora local. Si se ha activado la impresión con ActiveX, el diálogo de impresión habitual de Windows se mostrará al hacer clic en el botón de impresión. La impresión con ActiveX requiere una configuración adicional y puede requerir también que el complemento de ActiveX PrintControl.cab esté instalado en el equipo cliente. El botón de impresión se puede deshabilitar en un sitio web estableciendo la propiedad CrystalReportViewer.HasPrintButton en falsa. 112 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Información relacionada Imprimir un informe mediante programación [página 116] 1.4.1.1.1 Para quitar el botón de impresión del control CrystalReportViewer Contexto Todavía podrá usar el SDK para imprimir un informe aunque el botón de impresión no esté visible. Procedimiento 1. Agregue un control CrystalReportViewer a la aplicación. 2. Establezca la propiedad que controla la visibilidad del botón de impresión en falsa. ○ Para una aplicación de Windows, establezca la propiedad CrystalReportViewer.ShowPrintButton en falsa. ○ Para un sitio web, establezca la propiedad CrystalReportViewer.HasPrintButton en falsa. Resultados Al ejecutar la aplicación, el botón de impresión ya no aparecerá en el control CrystalReportViewer. Ejemplo Deshabilitar el botón Imprimir en una aplicación de Windows Private Sub ConfigureCrystalReports() CrystalReportViewer1.ShowPrintButton = False End Sub private void ConfigureCrystalReports() { InitializeComponent(); crystalReportViewer1.ShowPrintButton = false; } Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 113 Información relacionada Imprimir un informe [página 111] 1.4.1.1.2 Para imprimir un informe con el método CrystalReportViewer.PrintReport Requisitos previos Asegúrese de que se ha configurado una impresora en el equipo cliente antes de intentar imprimir. Contexto Puede invocar el diálogo de impresión mediante programación a través del método CrystalReportViewer.PrintReport en una aplicación de Windows. Use este método para imprimir cuando la barra de herramientas de CrystalReportViewer esté oculta o en una aplicación que use botones personalizados en la barra de herramientas. Procedimiento 1. Agregue un control CrystalReportViewer al formulario de Windows Forms. 2. Configure un origen de informe válido y enlace el origen del informe al control CrystalReportViewer. 3. Llame al método PrintReport para invocar el diálogo de impresión predeterminado. Ejemplo Private Sub PrintReport() CrystalReportViewer.PrintReport() End Sub private void PrintReport() { crystalReportViewer.PrintReport(); } 114 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 1.4.1.1.3 web Para habilitar la impresión con ActiveX en un sitio Contexto Si se ha activado la impresión con ActiveX, el diálogo de impresión del sistema estándar se mostrará cuando el usuario haga clic en el botón de impresión. La impresión con ActiveX requiere una configuración adicional y puede requerir también que el complemento de ActiveX PrintControl.cab esté instalado en el equipo cliente. Procedimiento 1. Agregue un control CrystalReportViewer a la aplicación. 2. Establezca la propiedad del modo de impresión del control CrystalReportViewer en ActiveX. CrystalReportViewer1.PrintMode = PrintMode.ActiveX CrystalReportViewer1.PrintMode = PrintMode.ActiveX; 3. En el archivo Web.Config, agregue una referencia al control de ActiveX PrintControl.cab. <configSections> <section group name="businessObjects"> <sectionGroup name="crystalReports"> <section name="printControl" type="System.Configuration.NameValueSectionHandler" /> </sectionGroup> </sectionGroup> </configSections> <businessObjects> <crystalReports> <printControl> <add key="url" value="http://localhost/PrintControl.cab" /> </printControl> </crystalReports> </businessObjects> Reemplace localhost por la dirección de su servidor web. El elemento printControl permite imprimir el informe directamente en la impresora local. De forma predeterminada, este control no se instala en el equipo local y se debe descargar por separado. Esta configuración hace que el archivo .cab esté visible para el sitio Web de SAP Crystal Reports .NET. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 115 Resultados El control CrystalReportViewer usará ahora el diálogo de impresión de Windows en lugar de la impresión en PDF. La primera vez que un usuario intente imprimir desde el sitio Web de SAP Crystal Reports, se le solicitará que instale el complemento de ActiveX PrintControl.cab. Información relacionada Configuración del archivo Web.Config [página 19] 1.4.1.2 Imprimir un informe mediante programación Se pueden configurar las opciones de impresión y llamar a una impresora mediante programación. Para ello se usa la clase PrintOptions y el método PrintToPrinter del modelo de objetos ReportDocument. Si el botón Imprimir de la barra de herramientas del control CrystalReportViewer satisface sus necesidades de impresión, no es necesario escribir código para configurar opciones de impresión adicionales. Sin embargo, un método basado en el código para imprimir informes resulta útil en casos especializados: ● Puede controlar cuándo, dónde y cómo se realiza la impresión. Desactive el botón Imprimir de la barra de herramientas del control CrystalReportViewer y administre toda la impresión mediante código. ● Puede imprimir un informe en segundo plano, sin mostrarlo. Puede acceder a todas las opciones de configuración de impresión a través de la clase ReportDocument, la cual se puede configurar y usar para crear una instancia sin mostrar nunca el informe con un control CrystalReportViewer. ● Puede centralizar toda la impresión en el servidor Web de un cliente Web. Use el método PrintToPrinter() para enviar tareas de impresión a una impresora conectada al servidor web, en lugar de a una impresora local conectada al cliente web. Nota La impresión mediante programación a través del modelo de objetos ReportDocument es una opción menos amplia que el entorno de programación de informes suministrado con SAP Crystal Reports Server o la plataforma SAP BusinessObjects Business Intelligence. Imprimir mediante programación desde una aplicación web Si usa el método ReportDocument.PrintToPrinter en una aplicación web, el informe se imprimirá desde el servidor web, no desde el equipo cliente. Todas las impresiones del cliente usan el control CrystalReportViewer. 116 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Información relacionada Imprimir un informe desde el control CrystalReportViewer [página 112] 1.4.1.2.1 Establecer opciones de impresión personalizadas con el modelo de objetos ReportDocument La clase PrintOptions permite especificar opciones de configuración adicionales antes de imprimir un informe mediante programación. A través de la clase PrintOptions, puede hacer lo siguiente: ● Cambiar el origen de papel actual. ● Determinar la altura o anchura del resultado de impresión. ● Ajustar los márgenes de página. ● Forzar la impresión doble o sencilla. ● Cambiar la impresora predeterminada. Para modificar las opciones de impresión de un informe, debe recuperar un objeto PrintOptions a través de la propiedad PrintOptions de la clase ReportDocument. Copiar opciones de impresión Es posible copiar las opciones de impresión predeterminadas del sistema local o pegar otras en su lugar con los métodos PrintOptions.CopyFrom o PrintOptions.CopyTo. Para obtener más información sobre la clase PrintOptions, consulte el SAP Crystal Reports .NET API Reference. Ejemplo Forzar la impresión a doble cara En este ejemplo se establece el modo de impresión predeterminado como A doble cara. Private Sub enableDuplex(ByVal rd As ReportDocument) rd.PrintOptions.PrinterDuplex = PrinterDuplex.Vertical End Sub private void enableDuplex(ReportDocument rd) { rd.PrintOptions.PrinterDuplex = PrinterDuplex.Vertical; } Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 117 1.4.1.2.2 Para imprimir un informe en la impresora predeterminada Contexto El método ReportDocument.PrintToPrinter enviará un informe a la impresora predeterminada que esté especificada en el archivo del informe. Para enviar el informe a la impresora predeterminada especificada en el equipo cliente, debe establecer la propiedad PrintOptions.PrinterName antes de imprimir el informe. Procedimiento 1. Cree una nueva instancia de la clase PrintDocument. La impresora predeterminada del equipo cliente se especifica en la propiedad PrinterSettings.PrinterName de cualquier nueva clase PrintDocument. Dim localPrinter As System.Drawing.Printing.PrintDocument = New PrintDocument() System.Drawing.Printing.PrintDocument localPrinter = new PrintDocument(); 2. Establezca la propiedad PrinterName del objeto ReportDocument en el valor especificado en PrinterSettings.PrinterName. rd.PrintOptions.PrinterName = localPrinter.PrinterSettings.PrinterName rd.PrintOptions.PrinterName = localPrinter.PrinterSettings.PrinterName; 3. Llame al método ReportDocument.PrintToPrinter para imprimir el informe. rd.PrintToPrinter(1, False, 0, 0) rd.PrintToPrinter(1, false, 0, 0); Este método PrintToPrinter contiene cuatro parámetros: el número de copias que se imprimirán, si se deben o no intercalar las páginas, la página inicial y la página final. Sugerencias Para imprimir todas las páginas, establezca el valor de los parámetros correspondientes a la página inicial y la página final en cero. Ejemplo Private Sub printReport(ByVal rd As ReportDocument) 118 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Dim localPrinter As System.Drawing.Printing.PrintDocument = New PrintDocument() rd.PrintOptions.PrinterName = localPrinter.PrinterSettings.PrinterName rd.PrintToPrinter(1, False, 0, 0) End Sub private void printReport(ReportDocument rd) { System.Drawing.Printing.PrintDocument localPrinter = new PrintDocument(); rd.PrintOptions.PrinterName = localPrinter.PrinterSettings.PrinterName; rd.PrintToPrinter(1, false, 0, 0); } 1.4.1.2.3 Para imprimir un informe en un archivo Contexto Puede imprimir un informe en un archivo en el sistema local cambiando las propiedades predeterminadas PrinterSettings y llamando al método ReportDocument.PrintToPrinter. Para guardar un informe a disco para visualizarlo posteriormente o para guardar un informe en otro formato, exporte el informe en lugar de imprimirlo en un archivo. Procedimiento 1. Cree una nueva instancia de las clases PrinterSettings y PageSettings. Dim printerSettings As New PrinterSettings() Dim pageSettings As New PageSettings() PrinterSettings printerSettings = new PrinterSettings(); PageSettings pageSettings = new PageSettings(); 2. Copie la configuración del objeto ReportDocument en PrinterSettings y los objetos PageSettings. rd.PrintOptions.CopyTo(printerSettings, pageSettings) rd.PrintOptions.CopyTo(printerSettings, pageSettings); 3. Establezca la propiedad PrintToFile del objeto PrinterSettings en verdadera. printerSettings.PrintToFile = True printerSettings.PrintToFile = true; Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 119 4. Establezca la ubicación del archivo de salida. printerSettings.PrintFileName = "c:\outputFile.prn" printerSettings.PrintFileName = "c:\\outputFile.prn"; Nota Cuando se imprime en un archivo, la impresora determina el formato del archivo de salida. La impresora puede crear archivos de formato XPS, PS u otros. Para obtener más información, consulte el manual del fabricante. 5. Llame al método ReportDocument.PrintToPrinter para imprimir el informe. Este método PrintToPrinter contiene tres parámetros: las opciones de impresión, la configuración de página y un valor booleano que indica si es necesario cambiar el formato del informe para adaptarlo a la configuración de página. rd.PrintToPrinter(printerSettings, pageSettings, False) rd.PrintToPrinter(printerSettings, pageSettings, false); Ejemplo Private Sub printToFile(ByVal rd As ReportDocument) Dim printerSettings As New PrinterSettings() Dim pageSettings As New PageSettings() rd.PrintOptions.CopyTo(printerSettings, pageSettings) printerSettings.PrintToFile = True printerSettings.PrintFileName = "c:\outputFile.prn" rd.PrintToPrinter(printerSettings, pageSettings, False) End Sub private void printToFile(ReportDocument rd) { PrinterSettings printerSettings = new PrinterSettings(); PageSettings pageSettings = new PageSettings(); rd.PrintOptions.CopyTo(printerSettings, pageSettings); printerSettings.PrintToFile = true; printerSettings.PrintFileName = "c:\\outputFile.prn"; rd.PrintToPrinter(printerSettings, pageSettings, false); } Información relacionada Exportar un informe [página 121] 120 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 1.4.1.3 Para eliminar el controlador de impresora predeterminado de un informe Procedimiento 1. En el Explorador de soluciones, haga doble clic en el informe. 2. Haga clic con el botón derecho en cualquier área abierta del informe y seleccione Diseñador Preparar impresora . 3. En el cuadro de diálogo Configurar impresión, active No hay impresora y, a continuación, haga clic en Aceptar. 4. Haga clic en Archivo Guardar todo . Información relacionada Activar la opción Ninguna impresora de Configurar impresión [página 73] 1.4.2 Exportar un informe SAP Crystal Reports permite exportar un informe a diferentes formatos. Los formatos disponibles dependen de la versión de SAP Crystal Reports que ha instalado y el método usado para exportar el informe. Un informe se puede exportar a disco, a una ventana del explorador o a la secuencia de entrada o salida como una secuencia de bytes. Clases usadas para exportar informes ● CrystalDecisions.CrystalReports.Engine.ReportDocument Representa un informe y contiene las propiedades y los métodos para definir, dar formato, cargar, exportar e imprimir el informe. ● CrystalDecisions.Shared Contiene varias clases usadas para especificar las opciones de exportación para diferentes formatos de salida. ● CrystalDecisions.Shared.ExportOptions Proporciona propiedades para la recuperación y configuración de opciones de exportación del informe. Información relacionada Imprimir un informe [página 111] Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 121 Cuadro de diálogo Exportar [página 898] 1.4.2.1 Formatos de exportación disponibles Los formatos de exportación que admite SAP Crystal Reports se pueden categorizar a grandes rasgos en dos grupos: formatos basados en páginas y basados en registros. Los formatos basados en páginas dan más importancia al aspecto, por lo que intentan producir un resultado que coincida rigurosamente con el diseño y el formato del original. Los formatos basados en registros se centran en la precisión de la representación de datos más que en el diseño y en el formato. Formato Descripción SAP Crystal Reports (RPT) La exportación a formato de SAP Crystal Reports es muy parecido a usar la función Guardar como con la opción Guardar datos con el informe seleccionada. Este formato exporta (guarda) su informe con los datos actuales sin modificar el informe original. Si un origen de informe es un archivo de solo lectura de SAP Crystal Reports (RPTR), no podrá exportar a SAP Crystal Reports (RPT). Sólo lectura de SAP Crystal Reports (RPTR) Exporta (guarda) su informe con los datos actuales sin modificar el informe original. Los informes RPTR son informes de Crystal que se pueden visualizar con aplicaciones de visualización de informes, pero que no se pueden modificar con el SDK, ni podrán abrirlos aplicaciones del diseñador de informes. La definición de un informe RPTR no se puede modificar, por lo que no se puede usar este SDK para definir la ubicación del origen de datos de un RPTR mediante el controlador de base de datos. No obstante, podrá actualizar los datos de un informe RPTR en tiempo de ejecución actualizando el informe en un visor. HTML 4.0 Exporta el informe en HTML 4.0. Este formato conserva el diseño y el aspecto del informe utilizando DHTML. Microsoft Excel (97-2003) Este formato convierte el contenido del informe a celdas de Excel página por página. El contenido de varias páginas se exporta a la misma hoja de cálculo de Excel. Si una hoja de cálculo se llena, pero hay más datos que exportar, el programa de exportación crea varias hojas de cálculo para alojar los datos. Si un objeto de informe ocupa más de una celda, el programa de exportación fusionará celdas para representar un objeto de informe. Microsoft Excel tiene un límite de 256 columnas por hoja de cálculo, por lo que no se exportará ningún objeto de informe (o parte de éste) que se agregue a las celdas por encima de las 256 columnas. Este formato de exportación conserva la mayoría de las características de aspecto, pero no exporta objetos de línea y cuadro desde su informe. Microsoft Excel (97-2003), sólo datos Microsoft Excel (sólo datos), tal y como el nombre indica, es un formato basado en registros que se centra en la precisión de la representación de datos. Pero incluso así, este formato también exporta la mayoría de características de aspecto. A diferencia del formato de Microsoft Excel, el formato 122 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Formato Descripción Microsoft Excel (sólo datos) no fusiona celdas: cada objeto se agrega solamente a una celda. Este formato también puede exportar ciertos tipos de resúmenes en informes de Crystal como funciones de Excel. Los resúmenes admitidos son SUM, AVERAGE, COUNT, MIN y MAX. Microsoft Excel 2007 (XLSX), sólo datos El formato XLSX tiene las mismas propiedades que el formato de sólo datos de Microsoft Excel (97-2003); sin embargo, el formato XLSX permite hasta 16.385 columnas y 1.048.576 filas en un solo libro. Microsoft Word (97-2003) Produce un archivo con formato de texto enriquecido (RTF) que contiene objetos de texto y dibujo para representar objetos de informe. Con este formato de exportación se conservan casi todas las características de aspecto. No obstante los objetos de texto no se pueden colocar fuera del margen izquierdo de la página. Por tanto, si dispone de objetos de texto en su informe que estén antes del margen izquierdo del área de impresión, se moverán a la derecha. (Esto es más perceptible en informes con páginas anchas). Microsoft Word (97-2003) - Editable El formato Microsoft Word - Editable es distinto del formato Microsoft Word: se trata de un formato basado en páginas, donde no todo el diseño y las características de aspecto se conservarán en la salida. Este formato convierte todo el contenido del objeto de informe en líneas de texto. A diferencia del formato Microsoft Word, este formato no utiliza marcos de texto. Se conservan las características de aspecto del texto, pero no se conservan atributos como el color de fondo, la trama de relleno, etcétera. Todas las imágenes del informe están entre líneas con el contenido textual, por lo que las imágenes cambian de forma automática para alojar texto cuando el documento se edita en Microsoft Word. Este formato no exporta objetos de línea y cuadro desde su informe. Asimismo, los campos especiales Número de página y Página N de M dejarán de funcionar si se exporta a este formato. ODBC ODBC es un formato de intercambio de datos basado en registros. Al utilizar este formato, podrá exportar sus datos de informe a cualquier base de datos que cumpla con ODBC. PDF Los documentos exportados tienen como objetivo la impresión y la redistribución. El formato PDF exportará tanto el diseño como las características físicas de acuerdo con el aspecto del informe en la ficha Vista previa. El formato PDF incrustará las fuentes TrueType que aparezcan en el documento. (No se admiten fuentes que no sean TrueType). Este formato de exportación no admite tecnología de vinculación de fuentes de Microsoft, que se utiliza para admitir algunos conjuntos extendidos de caracteres, como el chino HKCS. Por tanto, las fuentes utilizadas en el informe deberán contener todos los pictogramas necesarios. Se admiten los siguientes tipos de URI para los hipervínculos: http, https y mailto. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 123 Formato Descripción Estilo de registro: columnas con espacios Exporta datos de informe como texto. Este formato inserta espacios entre las columnas. Estilo de registro: columnas sin espacios Exporta datos de informe como texto. No inserta espacios entre las columnas. Definición de informe El formato Definición de informe exporta el informe a un archivo de texto que contiene una breve descripción de la vista de diseño del informe. Este formato sólo se mantiene para la compatibilidad con SAP Crystal Reports 5.0. Formato de texto enriquecido (RTF) Produce un archivo RTF que contiene objetos de texto y dibujo. Valores separados (CSV) El formato Valores separados es un formato de intercambio de datos basado en registros. Exporta el contenido del objeto de informe como un conjunto de valores separados por caracteres de separador y delimitador especificados. [Cuando se utiliza una coma (,) para separar campos, el formato se denomina Valores separados por coma (CSV); este formato de exportación es utilizado frecuentemente por los usuarios de Microsoft Excel]. Texto separado por tabuladores (TTX) Conserva el diseño del informe, pero con algunas diferencias: los objetos de texto de varias líneas se exportan en una sola línea, todos los valores de cadena se encierran entre comillas dobles (" "), y los propios valores aparecerán separados por caracteres de tabulación. Los archivos TTX se pueden abrir en Microsoft Excel. Texto Da como resultado un texto sin formato (no conserva las características de aspecto). XML Se utiliza sobre todo para el intercambio de datos. Este formato produce un XML usando para ello el esquema XML de SAP Crystal Reports. Seleccionar un formato de exportación Los formatos disponibles dependen de la versión de SAP Crystal Reports que ha instalado y el método usado para exportar el informe. El control CrystalReportViewer ofrece la mayoría de formatos de exportación de forma predeterminada. Algunos formatos sólo están disponibles cuando se usa el SDK de SAP Crystal Reports .NET o SAP Crystal Reports Designer de forma independiente. Formato Control CrystalReportViewer SDK de SAP Crystal Reports .NET SAP Crystal Reports Designer SAP Crystal Reports (RPT) x x x Sólo lectura de SAP Crystal Reports (RPTR) x x x x x x x HTML 4.0 Microsoft Excel (97-2003) 124 x © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Formato Control CrystalReportViewer SDK de SAP Crystal Reports .NET SAP Crystal Reports Designer Microsoft Excel (97-2003), sólo datos x x x Microsoft Excel 2007(XLSX), sólo datos x x x Microsoft Word (97-2003) x x x Microsoft Word (97-2003) Editable x x x ODBC PDF x x x x Estilo de registro: columnas con espacios x Estilo de registro: columnas sin espacios x Definición de informe x Formato de texto enriquecido x (RTF) x x Valores separados (CSV) x x Texto separado por tabuladores (TTX) x x Texto x x x x XML x 1.4.2.2 Exportar un informe desde el control CrystalReportViewer La forma más sencilla de agregar funciones de exportación a la aplicación SAP Crystal Reports .NET es usar el botón de exportación en el control CrystalReportViewer. El botón Exportar está habilitado de forma predeterminada en la barra de herramientas del control CrystalReportViewer. El usuario puede hacer clic en el botón Exportar para acceder al cuadro de diálogo de exportación predeterminado. Las opciones de exportación disponibles para el usuario están determinadas por los controladores que se han incluido en el despliegue. Deshabilitar la capacidad de exportar un informe desde el visor La exportación está habilitada en todas las aplicaciones de SAP Crystal Reports de forma predeterminada. Puede restringir la exportación de una de estas dos maneras: ● Quitando el botón Exportar del visor. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 125 Aún así podrá seguir usando el SDK para exportar un informe, aunque el botón de exportación no esté visible. ● Deshabilitando controladores de exportación específicos en los módulos de combinación de SAP Crystal Reports. Al desplegar una aplicación de SAP Crystal Reports en un equipo de destino, debe incluir el tiempo de ejecución de SAP Crystal Reports en forma de MSI o módulo de combinación. Si decide usar módulos de combinación para el despliegue, puede especificar qué controladores de exportación desea incluir o excluir. Información relacionada Cuadro de diálogo Exportar [página 898] 1.4.2.2.1 Para quitar el botón de exportación del control CrystalReportViewer Contexto Aún así podrá seguir usando el SDK para exportar un informe, aunque el botón de exportación no esté visible. Procedimiento 1. Agregue un control CrystalReportViewer a la aplicación. 2. Establezca la propiedad que controla la visibilidad del botón de exportación en falsa. ○ Para una aplicación de Windows, establezca la propiedad CrystalReportViewer.ShowExportButton en falsa. ○ Para un sitio web, establezca la propiedad CrystalReportViewer.HasExportButton en falsa. Resultados Al ejecutar la aplicación, el botón de exportación ya no aparecerá en el control CrystalReportViewer. Ejemplo Deshabilitar el botón Exportar en una aplicación web Private Sub ConfigureCrystalReports() CrystalReportViewer1.HasExportButton = False End Sub private void ConfigureCrystalReports() 126 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net { } InitializeComponent(); crystalReportViewer1.HasExportButton = false; 1.4.2.3 Exportar un informe mediante programación El SDK de SAP Crystal Reports .NET permite exportar un informe mediante programación a un número de formatos y destinos mayor que el control CrystalReportViewer. Si el botón Exportar de la barra de herramientas del control CrystalReportViewer satisface sus necesidades de exportación, no tendrá que escribir código para configurar opciones de exportación adicionales. Sin embargo, un método basado en el código para imprimir informes resulta útil en casos especializados: ● Puede controlar cuándo, dónde y cómo se realiza la exportación. Para hacerlo, deberá desactivar el botón Exportar de la barra de herramientas del control CrystalReportViewer y administrar toda la exportación mediante código. ● Puede exportar un informe en segundo plano, sin mostrarlo. ● Puede exportar un informe a respuesta HTTP o a secuencia. El control CrystalReportViewer sólo admite la exportación de un informe a disco. Hay cuatro métodos para exportar un informe. A todos ellos se accede a través de la clase ReportDocument. ● ReportDocument.Export ● ReportDocument.ExportToHTTPResponse ● ReportDocument.ExportToDisk ● ReportDocument.ExportToStream El método más general, ReportDocument.Export, permite exportar el informe a cualquier formato y ubicación que admita el SDK de SAP Crystal Reports .NET. Para poder usar el método ReportDocument.Export, deberá establecer en primer lugar una serie de parámetros a través de la clase ExportOptions. Cada uno de los otros tres métodos ofrece una cómoda forma de exportar un informe de un modo concreto. Normalmente, al usar alguno de los otros métodos se genera menor cantidad de código, pero se tiene menos control sobre el archivo resultante. 1.4.2.3.1 Establecer opciones de exportación personalizadas Para poder usar el método ReportDocument.Export, deberá establecer en primer lugar una serie de parámetros a través de la clase ExportOptions. Estos parámetros controlan la ubicación de exportación, el formato de exportación y varias opciones de estilo específicas del resultado. Hay cuatro opciones que deben establecerse para poder exportar un informe con el método ReportDocument.Export. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 127 Opción de exportación Descripción ExportDestinationType Determina cómo se exportará el informe. ExportDestinationOptions Establece la ubicación y el nombre del archivo resultante. ExportFormatOptions Determina opciones de formato específicas del resultado. ExportFormatType Establece el tipo de archivo de destino. Establecer la propiedad ExportDestinationType La propiedad ExportOptions.ExportDestinationType determina cómo se exportará el informe. Los valores disponibles se almacenan en la enumeración ExportDestinationType. El valor más común es ExportDestinationType.DiskFile. Entre otros valores admitidos se encuentran ExchangeFolder, MicrosoftMail y NoDestination. Establecer la propiedad ExportDestinationOptions La propiedad ExportOptions.ExportDestinationOptions establece opciones concretas de la ubicación de destino del archivo de salida. El valor de la propiedad ExportDestinationOptions dependerá del valor de la propiedad ExportOptions.ExportDestinationType. ExportDestinationType ExportDestinationOptions Establece los siguientes valores DiskFile Un objeto ● Establece el nombre y la ubicación del archivo de salida. ● El perfil del usuario y la contraseña del servidor de Exchange. ● La ruta a la carpeta de Exchange. ● El nombre de usuario y la contraseña de la cuenta de correo electrónico. ● El asunto y el cuerpo del mensaje de correo electrónico. ● Los destinatarios del mensaje de correo electrónico. DiskFileDestinationOptions ExchangeFolder Un objeto ExchangeFolderDestinationOp tions MicrosoftMail Un objeto MicrosoftMailDestinationOpt ions Establecer la propiedad ExportFormatType Esta propiedad determina el formato de archivo del archivo de salida. Los valores disponibles se almacenan en la enumeración ExportFormatType. Las opciones disponibles están determinadas por la versión de SAP Crystal Reports que esté usando. 128 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net SAP Crystal Reports, versión para programadores de Microsoft Visual Studio admite las siguientes opciones de exportación: ● SAP Crystal Reports (RPT) ● Sólo lectura de SAP Crystal Reports (RPTR) ● PDF ● Formato de texto enriquecido (RTF) ● Microsoft Word (97-2003) ● Microsoft Excel (97-2003) ● Microsoft Excel (97-2003), sólo datos ● Microsoft Excel (2007), sólo datos ● HTML 4.0 ● Valores separados (CSV) ● Microsoft Word - Editable (RTF) ● Texto separado por tabuladores (TTX) ● Texto Establecer la propiedad ExportFormatOptions La propiedad ExportOptions.ExportFormatOptions establece opciones concretas del formato del archivo de salida. El valor de la propiedad ExportFormatOptions dependerá del valor de la propiedad ExportOptions.ExportFormatType. ExportFormatOptions Formato de exportación Establece los siguientes valores Un objeto ExcelFormatOptions ● Microsoft Excel (97-2003) ● ● Microsoft Excel (97-2003), sólo datos Las páginas primera y última del informe que se va a exportar. ● El ancho de columna predeterminado. ● Si se incluirán o no encabezados de columna. ● Las páginas primera y última del informe que se va a exportar. ● El nombre de la página HTML predeterminada. ● El nombre de la carpeta que contiene los archivos de compatibilidad necesarios para la salida HTML como, por ejemplo, las imágenes que se utilizan en el informe. ● Las páginas primera y última del informe que se va a exportar. Un objeto HTMLFormatOptions Un objeto PdfRtfWordFormatOptions ● HTML 4.0 ● PDF ● Formato de texto enriquecido (RTF) ● Microsoft Word (97-2003) ● Microsoft Word - Editable (RTF) Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 129 Ejemplo Establecer las opciones de exportación para Microsoft Excel - Sólo datos Este ejemplo establece las opciones de exportación necesarias para exportar un informe en el formato “Microsoft Excel - Sólo datos”. El método instancia una nueva clase DiskFileDestinationOptions, y asigna una ruta de archivo a la propiedad DiskFileDestinationOptions.DiskFileName. Para exportar el archivo a disco, la propiedad ExportOptions.ExportDestinationType deberá establecerse en ExportDestinationType.DiskFile, y ExportOptions.DestinationOptions estará establecida en un objeto DiskFileDestinationOptions válido. Si no se necesita un formato especial, puede establecer ExportOptions.ExportFormatOptions en nulo. Private Function ConfigureExportToExcelRecord(ByVal filepath As String) As ExportOptions Dim exOptions As New ExportOptions() Dim dfDestinationOptions As New DiskFileDestinationOptions() dfDestinationOptions.DiskFileName = filepath exOptions.ExportDestinationType = ExportDestinationType.DiskFile exOptions.DestinationOptions = dfDestinationOptions exOptions.ExportFormatType = ExportFormatType.ExcelRecord exOptions.ExportFormatOptions = Nothing Return exOptions End Function private ExportOptions ConfigureExportToExcelRecord(String filepath) { ExportOptions exOptions = new ExportOptions(); DiskFileDestinationOptions dfDestinationOptions = new DiskFileDestinationOptions(); dfDestinationOptions.DiskFileName = filepath; } exOptions.ExportDestinationType = ExportDestinationType.DiskFile; exOptions.DestinationOptions = dfDestinationOptions; exOptions.ExportFormatType = ExportFormatType.ExcelRecord; exOptions.ExportFormatOptions = null; return exOptions; Ejemplo Establecer las opciones de exportación para la salida HTML 4.0 Este ejemplo establece las opciones de exportación necesarias para exportar un informe en el formato “HTML 4.0”. Al exportar como HTML, no tiene que instanciar una clase DiskFileDestinationOptions. En su lugar, estas opciones se establecen mediante la clase HTMLFormatOptions. Este método instancia una nueva clase HTMLFormatOptions, y asigna el nombre de archivo predeterminado a la propiedad HTMLFormatOptions.HTMLFileName, y la ruta de exportación predeterminada a la propiedad HTMLFormatOptions.HTMLBaseFolderName. La carpeta de base contiene cada una de las páginas HTML exportadas por el informe, así como todas las imágenes necesarias. 130 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Establezca la propiedad ExportOptions.ExportFormatOptions a un objeto HTMLFormatOptions válido. Private Function ConfigureExportToHtml40(ByVal exportpath As String) As ExportOptions Dim exOptions As New ExportOptions() Dim html40FormatOptions As New HTMLFormatOptions() html40FormatOptions.HTMLBaseFolderName = exportpath html40FormatOptions.HTMLFileName = "default.html" html40FormatOptions.HTMLEnableSeparatedPages = True html40FormatOptions.HTMLHasPageNavigator = True exOptions.ExportFormatType = ExportFormatType.HTML40 exOptions.ExportFormatOptions = html40FormatOptions Return exOptions End Function private ExportOptions ConfigureExportToHtml40(String exportpath) { ExportOptions exOptions = new ExportOptions(); HTMLFormatOptions html40FormatOptions = new HTMLFormatOptions(); html40FormatOptions.HTMLBaseFolderName = exportpath; html40FormatOptions.HTMLFileName = "default.html"; html40FormatOptions.HTMLEnableSeparatedPages = true; html40FormatOptions.HTMLHasPageNavigator = true; exOptions.ExportFormatType = ExportFormatType.HTML40; exOptions.ExportFormatOptions = html40FormatOptions; } return exOptions; Información relacionada Formatos de exportación disponibles [página 122] 1.4.2.3.2 Para exportar a disco con opciones de exportación personalizadas Contexto Este ejemplo muestra cómo exportar un informe de Crystal al formato de Microsoft Word. El SDK de SAP Crystal Reports 2008 permite exportar informes a un formato concreto, como Excel, PDF o RTF. Puede exportar informes a varios formatos mediante el objeto de modelos ReportDocument. En este ejemplo se establece la propiedad ReportDocument.ExportOptions y se usa el método ReportDocument.Export para exportar el informe. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 131 Procedimiento 1. Cree un método que tome un objeto ReportDocument y una ruta de archivo como parámetros. 2. Cree una nueva instancia de la clase DiskFileDestinationOptions y establezca el valor de la propiedad DiskFileDestinationOptions.DiskFileName en la ruta del archivo de salida. Dim dfDestinationOptions As New DiskFileDestinationOptions() dfDestinationOptions.DiskFileName = filepath DiskFileDestinationOptions dfDestinationOptions = new DiskFileDestinationOptions(); dfDestinationOptions.DiskFileName = filepath; 3. Cree una nueva instancia de la clase ExportOptions y establezca las propiedades necesarias. a) Establezca la propiedad ExportDestinationType en ExportDestinationType.DiskFile. b) Establezca la propiedad ExportDestinationOptions en el objeto DiskFileDestinationOptions. c) Establezca la propiedad ExportFormatType en ExportFormatType.WordForWindows. d) Si no se necesita un formato especial, puede establecer ExportOptions.ExportFormatOptions en nulo. Dim wordExportOptions As New ExportOptions() wordExportOptions.ExportDestinationType = ExportDestinationType.DiskFile wordExportOptions.ExportDestinationOptions = dfDestinationOptions wordExportOptions.ExportFormatType = ExportFormatType.WordForWindows wordExportOptions.ExportFormatOptions = Nothing ExportOptions wordExportOptions = new ExportOptions(); wordExportOptions.ExportDestinationType = ExportDestinationType.DiskFile; wordExportOptions.ExportDestinationOptions = dfDestinationOptions; wordExportOptions.ExportFormatType = ExportFormatType.WordForWindows; wordExportOptions.ExportFormatOptions = null; 4. Llame al método Exportar y pase el objeto ExportOptions como parámetro. Ejemplo Private Sub ExportToWord_RD(ByVal rd As ReportDocument, ByVal filepath As String) Dim dfDestinationOptions As New DiskFileDestinationOptions() dfDestinationOptions.DiskFileName = filepath Dim wordExportOptions As New ExportOptions() wordExportOptions.ExportDestinationType = ExportDestinationType.DiskFile wordExportOptions.ExportDestinationOptions = dfDestinationOptions wordExportOptions.ExportFormatType = ExportFormatType.WordForWindows wordExportOptions.ExportFormatOptions = Nothing rd.Export(wordExportOptions) End Sub private void ExportToWord_RD(ReportDocument rd, String filepath) { DiskFileDestinationOptions dfDestinationOptions = new DiskFileDestinationOptions(); 132 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net dfDestinationOptions.DiskFileName = filepath; ExportOptions wordExportOptions = new ExportOptions(); wordExportOptions.ExportDestinationType = ExportDestinationType.DiskFile; wordExportOptions.ExportDestinationOptions = dfDestinationOptions; wordExportOptions.ExportFormatType = ExportFormatType.WordForWindows; wordExportOptions.ExportFormatOptions = null; } rd.Export(wordExportOptions); 1.4.2.3.3 Para exportar a disco como PDF usando el método ReportDocument.ExportToDisk Contexto Este ejemplo muestra cómo exportar un informe de Crystal al formato PDF. El SDK de SAP Crystal Reports 2008 permite exportar informes a un formato concreto, como Excel, PDF o RTF. Puede exportar informes a varios formatos mediante el objeto de modelos ReportDocument. Procedimiento 1. Cree un método que tome como parámetro un objeto ReportDocument. 2. Especifique un directorio de salida y compruebe que existe. Si no existe el directorio de salida, créelo. 3. Llame al método ExportToDisk y especifique el formato de salida y el nombre del archivo de salida. Ejemplo Private Shared Sub ExportToPDF_RD(ByVal rd As ReportDocument) Dim exportPath As String = "C:\\Exported\\" If Not System.IO.Directory.Exists(exportPath) Then System.IO.Directory.CreateDirectory(exportPath) End If rd.ExportToDisk(ExportFormatType.PortableDocFormat, exportPath + "PortableDoc.pdf") End Sub private static void ExportToPDF_RD(ReportDocument rd) { String exportPath = "C:\\Exported\\"; if (!System.IO.Directory.Exists(exportPath)) { System.IO.Directory.CreateDirectory(exportPath); } rd.ExportToDisk(ExportFormatType.PortableDocFormat, exportPath + "PortableDoc.pdf"); } Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 133 Información relacionada Modelo de objetos ReportDocument [página 36] 1.4.3 Filtrar datos con parámetros o fórmulas SAP Crystal Reports le permite personalizar los datos de los informes mediante parámetros de informe o cambiando la fórmula de selección. Un parámetro es una variable de informe que establece el usuario y de la cual se crea una instancia cuando se actualiza el informe. El uso de un parámetro en una fórmula de selección permite cambiar los datos que se incluyen en el informe en tiempo de ejecución. Los parámetros también se pueden usar para personalizar el aspecto de un informe. Las fórmulas de selección especifican y filtran los registros y los grupos que aparecen en un informe. Al cambiar la fórmula de selección se modifica la consulta que se usa al recuperar datos del origen de datos. Clases usadas para configurar parámetros o fórmulas ● CrystalDecisions.CrystalReports.Engine.DataDefinition Contiene toda la información relacionada con la manipulación de datos basada en el origen de datos de un informe. ● CrystalDecisions.CrystalReports.Engine.ParameterFieldDefinition Representa un campo de parámetros del informe. Este objeto proporciona las propiedades y los métodos para recuperar la información y las opciones de configuración de un campo de parámetro del informe. ● CrystalDecisions.Web.Parameter Proporciona propiedades que modifican o recuperan información sobre un parámetro en un sitio web. 1.4.3.1 Parámetros Un parámetro es una variable de informe que establece el usuario y de la cual se crea una instancia cuando se actualiza el informe. Existe gran cantidad de tipos de parámetros y la configuración mediante programación de los diferentes tipos puede provocar diversos comportamientos y experiencias para los usuarios de la aplicación. Prácticas idóneas para trabajar con parámetros Para evitar los errores de tiempo de ejecución al configurar los parámetros mediante programación, tenga en cuenta lo siguiente: ● 134 Los valores del parámetro deben ser del mismo tipo que el parámetro. © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net ● Si el parámetro tiene una máscara de edición, los valores del parámetro deberán respetar la máscara. ● Al leer valores de parámetros, asegúrese de que conoce el tipo de valores que está leyendo, es decir, de si son discretos o de rango. ● Establezca el tipo de límite de un valor de rango antes de agregarlo al parámetro. ● Asegúrese de que el límite superior de un valor de rango es mayor que el límite inferior. Información relacionada Configurar parámetros [página 694] Parámetros de datos y parámetros sin datos [página 696] Diseñar campos de parámetros [página 695] 1.4.3.1.1 Propiedades de valores de parámetro Los parámetros admiten muchas más opciones que las mencionadas aquí. Si desea obtener una lista completa, consulte la clase ParameterField. Parámetros de valor único o múltiple Si un parámetro admite valores múltiples, el usuario puede seleccionar más de uno para un parámetro cuando se actualiza el informe. Si un parámetro admite valores únicos, el usuario sólo puede seleccionar uno para un parámetro cuando se actualiza el informe. Si un parámetro admite valores múltiples, cambia de una variable única a una matriz que contiene varios valores. Valores de parámetro discretos o de rango Los valores de parámetro discretos representan un valor único, como 1, "Jill", 3.141 o True. Los valores de rango representan un intervalo concreto de valores desde un punto a otro, como [1..45], (4..6], ["Lunes","Martes"]. El valor del límite inferior del rango debe ser menor que el límite superior. Además, los parámetros pueden ser tanto discretos como de rango si el parámetro admite valores múltiples. Valores predeterminados Puede especificar valores predeterminados para un parámetro y obligar al usuario a seleccionar uno o varios de ellos. También puede facilitar valores de parámetro predeterminados pero permitir que el usuario introduzca valores personalizados. Los valores predeterminados se almacenan en la propiedad DefaultValues del objeto Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 135 ParameterField. Después de que el usuario haya seleccionado un conjunto de valores para los parámetros del informe, se almacenan en la propiedad CurrentValues. Nota Los valores predeterminados sólo pueden ser discretos. Valores de parámetro opcionales Si un valor de parámetro está configurado como opcional, los usuarios no están obligados a introducir un valor cuando se les solicite hacerlo. Valores de parámetro estáticos o dinámicos Los valores de parámetro estáticos se almacenan en el informe. Los valores de parámetro dinámicos se recuperan de un origen de datos fuera del informe. Valores de parámetro dinámicos en cascada Una solicitud dinámica puede incluir una lista en cascada de valores que guiarán al usuario por una secuencia de solicitudes dinámicas para determinar un valor de parámetro final. Por ejemplo, se puede solicitar a los usuarios que seleccionen un país antes de que aparezcan las opciones de región. Valores de parámetro interactivos Es posible manipular los valores de parámetro en tiempo de ejecución usando la propiedad CrystalReportViewer.ViewTimeSelectionFormula. El tiempo de vista de la fórmula de selección se aplica después de que se hayan aplicado los resultados de las fórmulas de selección guardadas con el informe. Tipos de valores de parámetro Un campo de parámetro debe contener un determinado ParameterType. Un valor de parámetro debe ser uno de los siguientes tipos de parámetro: ● ReportParameter ● StoredProcedureParameter 136 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net ● QueryParameter 1.4.3.1.2 El panel de parámetros Dé formato y filtre los datos de un informe de forma interactiva usando el panel de parámetros. El nuevo panel de parámetros de SAP Crystal Reports 2008 permite que los usuarios establezcan parámetros estáticos y dinámicos y que actualicen el informe. Además, los usuarios pueden dar formato y filtrar los datos de un informe de forma interactiva. El panel de parámetros está disponible en el panel de herramientas. Puede acceder al panel de parámetros haciendo clic en el botón Parámetros en la barra de herramientas o mediante programación usando el siguiente código: myCrystalReportViewer.ToolPanelView = ToolPanelViewType.ParameterPanel crystalReportViewer.ToolPanelView = ToolPanelViewType.ParameterPanel; Puede ocultar el botón Parámetros mediante programación usando el siguiente código: myCrystalReportViewer.ShowParameterPanelButton = False crystalReportViewer.ShowParameterPanelButton = false; El panel muestra todos los parámetros que se han establecido en Puede editarse o Sólo lectura. Si se establece un parámetro en Puede editarse, puede agregar, eliminar o modificar los valores de parámetro haciendo clic en el botón Mostrar el cuadro de diálogo Avanzadas. Si se modifican los valores de parámetro pero no se aplican, aparecerá un asterisco junto al campo del parámetro para indicar que los valores no se han aplicado en el informe. Nota Si el parámetro acepta valores personalizados, puede editar el valor del parámetro directamente en el cuadro de texto del panel de parámetros. Aparecerá un icono de base de datos junto a los parámetros de datos. Al modificar el valor de un parámetro de datos, el informe se actualiza y accede a la base de datos para hacer los cambios correspondientes. Al modificar el valor de un parámetro que no sea de datos, se cambia el formato del informe o se filtra en función de los datos guardados en el informe. El informe no accede a la base de datos. Información relacionada Filtrar datos de informe con fórmulas de selección [página 146] Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 137 1.4.3.1.3 Para establecer parámetros en la página ASPX Al crear un informe de Crystal, la selección de datos del informe se controla mediante los criterios de "where". El valor de los criterios de "where" puede ser un valor codificado. Pero cuando el valor debe ser dinámico, se crea un parámetro y la cláusula "where" se asigna al parámetro. Los parámetros se tratan de forma distinta, en función de si se programa con un modelo de codificación o un modelo de código reducido. Cuando se programa con un modelo de codificación, Crystal Reports, versión para programadores de Microsoft Visual Studio accede e interactúa con los parámetros mediante un grupo de clases relacionadas con parámetros en el SDK de SAP Crystal Reports. Cuando se programa con un modelo de código reducido (el modelo de aplicación basado en etiquetas), el control CrystalReportSource accede e interactúa con los parámetros mediante el uso del marco de Parameters. El marco de trabajo de parámetros es nuevo en la versión 2.0 de ASP.NET. Permite que los parámetros se asignen a cualquier control DataSource (en este caso, un control CrystalReportSource.) Dichos parámetros se pueden asignar al informe principal y a cualquier subinforme, a condición de que requieran parámetros. Se puede asignar un parámetro entre cualquiera de los siguientes tipos de parámetro: ● ControlParameter ● QueryStringParameter ● SessionParameter ● FormParameter ● CookieParameter Esta asignación de parámetro permite crear una solución de código reducido, donde los parámetros de un informe se pueden establecer a partir de selecciones efectuadas en controles DropDownList (u otros tipos de controles), valores de la cadena de consulta URL, valores recuperados de Session, valores enviados desde campos de formulario o valores de Cookie. Configurar Parameters directamente en el código XML En XML, la etiqueta <Parameters> está anidada dentro de la etiqueta <CrystalReportSource>. En la etiqueta <Parameters> anidada, se pueden configurar vínculos al parámetro o a un parámetro de un control. Ejemplo Configurar un parámetro en el código XML En este ejemplo se establece el valor predeterminado del parámetro Ciudad en Tokio. <CR:CrystalReportSource ID="CrystalReportSource1" runat="server"> <Report FileName="SalesReport.rpt"> <Parameters> <CR:Parameter ConvertEmptyStringToNull="False" DefaultValue="Tokyo" Name="City" ReportName="" /> </Parameters> </Report> </CR:CrystalReportSource> 138 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Ejemplo Enlazar un parámetro a un control Puede enlazar el valor de un parámetro a otro control del formulario web. En este ejemplo se establece el valor de un parámetro con el nombre Ciudad en el valor de un control de cuadro de texto llamado Ubicación. <CR:CrystalReportSource ID="CrystalReportSource1" runat="server"> <Report FileName="SalesReport.rpt"> <Parameters> <CR:ControlParameter ControlID="Location" ConvertEmptyStringToNull="False" Name="city" PropertyName="Text" ReportName="" /> </Parameters> </Report> </CR:CrystalReportSource> Información relacionada Configurar parámetros [página 694] 1.4.3.1.3.1 Acceder al cuadro de diálogo Editor de colección de parámetros Contexto Los parámetros se configuran en el cuadro de diálogo Editor de colección de parámetros. Procedimiento 1. Seleccione el control CrystalReportSource. 2. En Propiedades, expanda Informe. 3. En la propiedad Report, haga clic en los puntos suspensivos ( ...) situados a la derecha de Parameters (Collection). 4. En el cuadro de diálogo Editor de colección de parámetros, especifique uno o varios parámetros para el informe principal, así como para cualquier subinforme. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 139 1.4.3.1.4 informe Para establecer parámetros discretos en un En este ejemplo se establecen los parámetros en valores específicos que usa el informe de muestra. Requisitos previos Debe tener un informe con un campo de parámetro ya especificado. Contexto Con el modelo de objetos ReportDocument, puede establecer los valores de parámetro de los parámetros existentes en un informe. A los parámetros se accede por nombre o mediante un valor de índice numérico. Para agregar un nuevo parámetro a un informe, debe usar el modelo de objeto ReportClientDocument. Procedimiento 1. Cree una nueva constante de cadena, NOMBRE_CAMPO_DE_PARÁMETRO y establezca su valor con el nombre de un parámetro existente. 2. Cree una instancia de la clase ArrayList. 3. Agregue un valor a la instancia de ArrayList para cada valor que desea asignar al parámetro. 4. Llame al método ReportDocument.SetParameterValue y pase el nombre del parámetro y la lista de valores. El método ReportDocument.SetParameterValue establece el valor actual de un campo de parámetro. El valor puede ser un valor primitivo, ParameterValue, una matriz de cualquier tipo o una colección ParameterValues. Ejemplo Establecer parámetros discretos en un informe Private Sub SettingParameters_RD(ByVal TestReport As ReportDocument) Dim PARAMETER_FIELD_NAME As String = "Country" Dim countries As New ArrayList() countries.Add("Canada") countries.Add("USA") TestReport.SetParameterValue(PARAMETER_FIELD_NAME, countries.ToArray()) crystalReportViewer.ReportSource = TestReport End Sub private void SettingParameters_RD(ReportDocument TestReport) { string PARAMETER_FIELD_NAME = "Country"; ArrayList countries = new ArrayList(); 140 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net } countries.Add("Canada"); countries.Add("USA"); TestReport.SetParameterValue(PARAMETER_FIELD_NAME, countries.ToArray()); crystalReportViewer.ReportSource = TestReport; Pasos siguientes Es posible que un sitio Web de SAP Crystal Reports necesite codificación adicional para administrar el estado de la sesión durante la visualización de diferentes páginas. Información relacionada Tutorial: Conservar el modelo de objetos ReportDocument con Session [página 337] En este tutorial, usará el modelo de objetos ReportDocument y realizará cambios mediante programación en un informe en tiempo de ejecución. Tutorial: Leer y configurar parámetros discretos [página 385] En este tutorial, aprenderá a crear un informe cuyos datos se puedan filtrar basándose en un parámetro discreto. 1.4.3.1.5 Para establecer parámetros discretos en un subinforme Esta muestra define un parámetro en un subinforme establecido en un valor específico. Requisitos previos Debe tener un informe con un campo de parámetro ya especificado. Contexto Para establecer un valor discreto en un informe, debe llamar al método ReportDocument.SetParameterValue con el nombre y el valor del parámetro. Este método no se admite en subinformes. En su lugar, debe acceder al parámetro en el subinforme a través de la colección ParameterFields del informe principal y establecerlo como un nuevo objeto ParameterDiscreteValue. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 141 Procedimiento 1. Cree una instancia de la clase ParameterDiscreteValue. Sugerencias Use la clase ParameterRangeValue para los parámetros de rango. 2. Establezca la propiedad ParameterDiscreteValue.Value en el nuevo valor del parámetro. Dim dv As New ParameterDiscreteValue() dv.Value = parameterValue ParameterDiscreteValue dv = new ParameterDiscreteValue(); dv.Value = parameterValue; 3. Cree una instancia de la colección ParameterFields y asígnele el valor de la propiedad ReportDocument.ParameterFields desde el informe principal. Dim parameterFields As ParameterFields = testReport.ParameterFields ParameterFields parameterFields = testReport.ParameterFields; 4. Acceda al parámetro del subinforme a través de un índice de nombres de la instancia de ParameterFields. Dim parameterField As ParameterField = parameterFields(parameterFieldName, subreportName) ParameterField parameterField = parameterFields[parameterFieldName, subreportName]; La colección ParameterFields requiere dos índices, uno para el nombre del parámetro y otro para el nombre del subinforme. 5. Borre el valor existente del campo de parámetro y agregue el objeto ParameterDiscreteValue que creó anteriormente. parameterField.CurrentValues.Clear() parameterField.CurrentValues.Add(dv) parameterField.CurrentValues.Clear(); parameterField.CurrentValues.Add(dv); 6. Enlace el informe a un control CrystalReportViewer. Nota Los ParameterFields deben establecerse antes que la propiedad ReportSource del control CrystalReportViewer; de lo contrario, el control solicitará los datos del parámetro. 142 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Ejemplo Establecer parámetros discretos en un subinforme Private Sub SubreportSettingParameters_RD(ByVal testReport As ReportDocument, ByVal subreportName As String, ByVal parameterFieldName As String, ByVal parameterValue As String) Dim dv As New ParameterDiscreteValue() dv.Value = parameterValue Dim parameterFields As ParameterFields = testReport.ParameterFields Dim parameterField As ParameterField = parameterFields(parameterFieldName, subreportName) parameterField.CurrentValues.Clear() parameterField.CurrentValues.Add(dv) crystalReportViewer1.ReportSource = TestReport End Sub private void SubreportSettingParameters_RD(ReportDocument testReport, String subreportName, String parameterFieldName, String parameterValue) { ParameterDiscreteValue dv = new ParameterDiscreteValue(); dv.Value = parameterValue; ParameterFields parameterFields = testReport.ParameterFields; ParameterField parameterField = parameterFields[parameterFieldName, subreportName]; parameterField.CurrentValues.Clear(); parameterField.CurrentValues.Add(dv); crystalReportViewer1.ReportSource = TestReport; } Pasos siguientes Es posible que un sitio Web de SAP Crystal Reports necesite codificación adicional para administrar el estado de la sesión durante la visualización de diferentes páginas. Información relacionada Tutorial: Conservar el modelo de objetos ReportDocument con Session [página 337] En este tutorial, usará el modelo de objetos ReportDocument y realizará cambios mediante programación en un informe en tiempo de ejecución. Tutorial: Leer y configurar parámetros de rango para un subinforme [página 274] En este tutorial se planteará una complicación adicional: ¿qué sucede si el informe contiene un subinforme que requiere parámetros distintos? Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 143 1.4.3.1.6 Para establecer parámetros de rango en un informe Requisitos previos Debe tener un informe con un campo de parámetro ya especificado. Contexto Con el modelo de objetos ReportDocument, puede establecer los valores de parámetro de los parámetros existentes en un informe. A los parámetros se accede por nombre o mediante un valor de índice numérico. Para agregar un nuevo parámetro a un informe, debe usar el modelo de objeto ReportClientDocument. Para establecer un parámetro de rango, debe crear una instancia de la clase ParameterRangeValue y pasarla al método ReportDocument.SetParameterValue. Procedimiento 1. Cree una nueva constante de cadena, NOMBRE_CAMPO_DE_PARÁMETRO y establezca su valor con el nombre de un parámetro existente. 2. Cree una instancia de la clase ParameterRangeValue. Dim dateRange As New ParameterRangeValue() ParameterRangeValue dateRange = new ParameterRangeValue(); 3. Establezca los valores de inicio y fin del objeto ParameterRangeValue. dateRange.StartValue = startDate dateRange.EndValue = endDate dateRange.StartValue = startDate; dateRange.EndValue = endDate; 4. 144 Establezca los límites superior e inferior del rango. Opción Descripción RangeBoundType.BoundExclusive Los valores de rango superior e inferior no se incluyen en el rango. RangeBoundType.BoundInclusive Los valores de rango superior e inferior no se incluyen en el rango. © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Opción Descripción RangeBoundType.NoBound No se ha seleccionado ningún límite de rango. dateRange.LowerBoundType = RangeBoundType.BoundInclusive dateRange.UpperBoundType = RangeBoundType.BoundInclusive dateRange.LowerBoundType = RangeBoundType.BoundInclusive; dateRange.UpperBoundType = RangeBoundType.BoundInclusive; 5. Llame al método ReportDocument.SetParameterValue y pase el nombre del parámetro y el objeto ParameterRangeValue. El método ReportDocument.SetParameterValue establece el valor actual de un campo de parámetro. El valor puede ser un valor primitivo, ParameterValue, una matriz de cualquier tipo o una colección ParameterValues. Ejemplo Private Sub SettingParameters_RD(ByVal testReport As ReportDocument, ByVal startDate As String, ByVal endDate As String) Dim PARAMETER_FIELD_NAME As String = "SalesDates" Dim dateRange As New ParameterRangeValue() dateRange.StartValue = startDate dateRange.EndValue = endDate dateRange.LowerBoundType = RangeBoundType.BoundInclusive dateRange.UpperBoundType = RangeBoundType.BoundInclusive testReport.SetParameterValue(PARAMETER_FIELD_NAME, dateRange) crystalReportViewer1.ReportSource = testReport End Sub private void SettingParameters_RD(ReportDocument testReport, String startDate, String endDate) { string PARAMETER_FIELD_NAME = "SalesDates"; ParameterRangeValue dateRange = new ParameterRangeValue(); dateRange.StartValue = startDate; dateRange.EndValue = endDate; dateRange.LowerBoundType = RangeBoundType.BoundInclusive; dateRange.UpperBoundType = RangeBoundType.BoundInclusive; } testReport.SetParameterValue(PARAMETER_FIELD_NAME, dateRange); crystalReportViewer1.ReportSource = testReport; Pasos siguientes Es posible que un sitio Web de SAP Crystal Reports necesite codificación adicional para administrar el estado de la sesión durante la visualización de diferentes páginas. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 145 Información relacionada Tutorial: Conservar el modelo de objetos ReportDocument con Session [página 337] En este tutorial, usará el modelo de objetos ReportDocument y realizará cambios mediante programación en un informe en tiempo de ejecución. 1.4.3.2 Filtrar datos de informe con fórmulas de selección Las fórmulas de selección especifican y filtran los registros y los grupos que aparecen en un informe. Puede usar tres posibles fórmulas de selección para filtrar los datos: ● Fórmula de selección de registros ● Fórmula de selección de datos guardados ● Fórmula de selección de grupos La siguiente tabla muestra los tipos de campos permitidos en los diferentes filtros de informe: Fórmula de selección de registros Fórmula de selección de datos guardados Fórmula de selección de grupos Parámetros X X X Resúmenes - - X Fórmulas de hora de im­ presión/Totales acumula­ dos - - - La siguiente tabla muestra las diferencias de comportamiento asociadas con los diferentes filtros de informe: Fórmula de selección de registros Fórmula de selección de datos guardados Fórmula de selección de grupos ¿Puede referirse al resu­ men? No. Sí. Sí. ¿Cuándo se evalúa la fór­ mula? Durante la lectura de los registros. Si se usa un resumen, en el momento de impresión; de lo contrario, durante la lectura de los registros. Al imprimir. ¿Cuándo se actualiza el in­ Si el resultado de la eva­ Si se leen registros, al eva­ N/D forme? luación es falso, cuando se luarlos. Si el resultado de exponen los registros. la evaluación es falso, cuando se exponen los re­ gistros. ¿Afecta al cálculo del resu­ Sí, no se cuentan los regis­ No, siempre que el filtro se No, los registros se cuen­ men? tros descartados por el fil­ evalúe durante la lectura tan aunque el filtro los tro. de los registros; en caso haya descartado. contrario, sí. 146 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Puede aplicar la fórmula de selección de datos guardados a la salida de la fórmula de selección de registros. El siguiente diagrama muestra cómo se usan las fórmulas de selección de registros y de datos guardados: Fórmula de selección de registros La fórmula de selección de registros especifica los registros que formarán los datos guardados del informe. Esta fórmula de selección permite dos niveles de filtrado: ● Filtrado por base de datos ● Filtrado por motor de procesamiento de informes Fórmula de selección de datos guardados SavedDataFilter permite que los usuarios vean un subconjunto de los datos guardados en un informe. Los cambios en SavedDataFilter no provocarán que se descarten los datos guardados en un informe ni afectará negativamente a la base de datos. Fórmula de selección de grupos La fórmula de selección de grupos especifica los registros que se considerarán al representar páginas de informes. Esta fórmula normalmente usa valores producidos en fases anteriores del procesamiento del informe, como resúmenes. Nota La fórmula de selección de grupos filtra por registros, no por grupos. 1.4.3.2.1 Para filtrar datos con fórmulas de selección Contexto En este ejemplo se aplica un filtro a uno de los parámetros de base de datos que usa el informe de muestra. El filtro permite que los usuarios personalicen los valores que aparecen en un informe. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 147 Procedimiento 1. Cree un método que tome un objeto ReportDocument y una cadena que contenga una fórmula de selección. El SDK de SAP Crystal Reports .NET usa la misma sintaxis de fórmulas de selección que el diseñador incrustado de SAP Crystal Reports. 2. Asigne la fórmula de selección a la propiedad DataDefinition.RecordSelectionFormula del objeto ReportDocument actual. La clase DataDefinition contiene toda la información relacionada con la manipulación de datos en función del origen de datos de un informe. Se puede acceder a la clase DataDefinition de cada informe a través de la propiedad ReportDocument.DataDefinition. 3. Enlace la propiedad ReportSource del control CrystalReportViewer a la instancia de ReportDocument. Resultados El informe se actualizará con nuevos resultados en función de la fórmula de selección especificada. Ejemplo En este ejemplo se acepta un objeto ReportDocument y un parámetro entero. El parámetro entero se concatena con una cadena existente para crear una fórmula de selección completa. La fórmula de selección se aplica al informe antes de enlazar el control CrystalReportViewer al objeto ReportDocument. Private Sub FilterData_RD(ByVal TestReport As ReportDocument, ByVal sales As Integer) Dim selectFormula As String = "{Customer.Last Year's Sales} > " + sales TestReport.DataDefinition.RecordSelectionFormula = selectionFormula crystalReportViewer.ReportSource = TestReport End Sub private void FilterData_RD(ReportDocument TestReport, int sales) { string selectFormula = "{Customer.Last Year's Sales} > " + sales; TestReport.DataDefinition.RecordSelectionFormula = selectionFormula; crystalReportViewer.ReportSource = TestReport; } Pasos siguientes Es posible que un sitio Web de SAP Crystal Reports necesite codificación adicional para administrar el estado de la sesión durante la visualización de diferentes páginas. Información relacionada Tutorial: Conservar el modelo de objetos ReportDocument con Session [página 337] 148 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net En este tutorial, usará el modelo de objetos ReportDocument y realizará cambios mediante programación en un informe en tiempo de ejecución. Incorporar parámetros en fórmulas [página 699] 1.4.4 Establecer el origen de datos SAP Crystal Reports puede elaborar informes con casi cualquier tipo de orígenes de datos, incluyendo los orígenes persistentes, como bases de datos y archivos XML, y orígenes de tiempo de ejecución como colecciones de objetos. Con el modelo de objeto ReportDocument se puede acceder a la información de conexión y cambiarla en estos orígenes de datos del archivo de informe en tiempo de ejecución mediante programación. Existen diferentes formas de establecer un origen de datos: ● Usar el método ReportDocument.DatasourceConnections[0].SetConnection. Este método permite iniciar sesión en un informe o en un subinforme. ● Actualice la propiedad ReportDocument.Table.LogOnInfo y active el método ReportDocument.Table.ApplyLogOnInfo. Este método permite iniciar sesión en un informe o en un subinforme. Este método también permite especificar la ubicación completa de una tabla. ● Use el método CrystalReportViewer.LogOnInfo. Este método permite iniciar sesión en un informe, pero no permite establecer la ubicación de la base de datos. Clases usadas para configurar el origen de datos ● CrystalDecisions.Shared.ConnectionInfo Proporciona las propiedades de recuperación y configuración de las opciones de conexión a los servidores de bases de datos u orígenes de datos ODBC. ● CrystalDecisions.CrystalReports.Engine.Table Representa una tabla de base de datos a la que tiene acceso el informe. Esta clase proporciona las propiedades y los métodos para obtener información acerca de la tabla y establecer la información de conexión de la tabla. ● CrystalDecisions.CrystalReports.Engine.ReportDocument Representa un informe y contiene las propiedades y los métodos para especificar un origen de datos en tiempo de ejecución. Información relacionada Orígenes de datos admitidos [página 661] Agregar datos y obtener acceso a ellos [página 661] Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 149 1.4.4.1 Conectar a una base de datos Los orígenes de datos más frecuentes en los informes de Crystal es una base de datos. Se accede a una base de datos desde uno de los siguientes orígenes: ● Directamente desde el archivo de informe, usando la información de conectividad de base de datos almacenada en el archivo. La información de conectividad de base de datos se configura a través de SAP Crystal Report Designer incrustado cuando se crea o se modifica el informe. El motor de informes pasa automáticamente la información a la base de datos siempre que se muestra el informe. Las credenciales de inicio de sesión se pueden guardar con el informe o se pueden pasar en tiempo de ejecución. ● Desde el código API de SAP Crystal Reports .NET. La información de conectividad de base de datos se puede volver a configurar a través del código que interactúa con el informe mediante programación en tiempo de ejecución. El escenario más frecuente para la creación de una conexión a una base de datos es establecer los parámetros de conexión a la base de datos en el diseñador de SAP Crystal Reports y, a continuación, indicar la información de inicio de sesión mediante programación en tiempo de ejecución. Información relacionada Agregar datos y obtener acceso a ellos [página 661] 1.4.4.1.1 Maximizar la seguridad al conectarse a una base de datos de SQL Server Independientemente del origen de los informes, la cuestión de seguridad es la misma: ¿cómo se protege la base de datos contra ataques malintencionados? Usar la Autenticación de Windows con Seguridad integrada Para lograr la máxima seguridad, Microsoft recomienda el uso de la Seguridad integrada a través de la Autenticación de Windows. Esta configuración significa que la aplicación no necesitará una cadena de ID de usuario y contraseña. 150 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Usar la Autenticación de SQL Server con una cuenta de base de datos de acceso limitado Si debe usar la Autenticación de SQL Server con su base de datos, deberá realizar unos pasos adicionales para conseguir una seguridad eficaz. Nunca use el id ni la contraseña del administrador del sistema en el código, ya que esto conlleva un riesgo de seguridad importante. En lugar de esto realice lo siguiente: ● Cree una cuenta de base de datos de acceso limitado. ● Configure dicha cuenta, de modo que sólo se pueda acceder a las tablas necesarias de la base de datos. ● Para cada tabla a la que se pueda acceder, conceda sólo permiso para ejecutar la instrucción SELECT. Microsoft recomienda además que codifique su ID de usuario y contraseña. Para obtener información sobre cómo codificar su ID de usuario y contraseña, vea la información de seguridad en MSDN. 1.4.4.1.2 Para iniciar sesión en una base de datos segura de SQL Server con un subinforme Requisitos previos Para ejecutar este ejemplo debe tener un informe que incluya un subinforme que requiera autenticación de SQL segura. Es necesario indicar el nombre de usuario y contraseña para iniciar sesión en la base de datos de SQL Server. Contexto En este ejemplo se cambiará la base de datos de un subinforme mediante programación. Procedimiento 1. Recupere la instancia de DataSourceConnections de la propiedad DataSourceConnections de las instancias del informe y el subinforme. 2. 3. Recupere IConnectionInfo en el índice 0 de la instancia de DataSourceConnections. Llame al método SetConnection con su nombre de servidor, de base de datos y de usuario, así como su contraseña. 4. Llame al método SetLogon con su nombre de usuario y contraseña. Ejemplo Private Function SubreportLogon_RD(ByVal TestReport As ReportDocument) As Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 151 ReportDocument Dim dataSourceConnections As DataSourceConnections = TestReport.DataSourceConnections Dim connectInfo As IConnectionInfo = dataSourceConnections(0) connectInfo.SetConnection("ServerName", "DatabaseName", "UserName", "Password") Dim TestSubreport As ReportDocument = TestReport.Subreports("Subreport1") Dim subreportDataSourceConnections As DataSourceConnections = TestSubreport.DataSourceConnections Dim connectInfo As IConnectionInfo = subreportDataSourceConnections(0) connectInfo.SetLogon("UserName", "Password") End Function private ReportDocument SubreportLogon_RD(ReportDocument TestReport) { DataSourceConnections dataSourceConnections = TestReport.DataSourceConnections; IConnectionInfo connectInfo = dataSourceConnections[0]; connectInfo.SetConnection("ServerName", "DatabaseName", "UserName", "Password"); ReportDocument TestSubreport = TestReport.Subreports["Subreport1"]; DataSourceConnections subreportDataSourceConnections = TestSubreport.DataSourceConnections; IConnectionInfo connectInfo = subreportDataSourceConnections[0]; connectInfo.SetLogon("UserName", "Password"); } 1.4.4.1.3 Para iniciar sesión en una base de datos segura de SQL Server con el modelo de objeto ReportDocument Este ejemplo muestra cómo iniciar sesión en una base de datos usando autenticación de SQL segura. Requisitos previos Antes de empezar, debe tener un informe que requiera autenticación de SQL segura. Contexto Para actualizar la información de conexión para un informe con el modelo de objeto ReportDocument, debe actualizar la propiedad ConnectionInfo de cada objeto Table en la colección ReportDocument.Database.Tables. Una vez actualizadas todas las propiedades, debe llamar al método Table.ApplyLogOnInfo para aplicar los cambios. 152 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Procedimiento 1. Cree un nuevo objeto ConnectionInfo. 2. Establezca las propiedades DatabaseName, UserID y Password del objeto ConnectionInfo según los valores requeridos para el inicio de sesión. Nota Si decide establecer únicamente las propiedades DatabaseName, UserID y Password, se conectará con el servidor predeterminado de la base de datos especificada en el informe. Sin embargo, si elige asignar una propiedad ServerName alternativa, podrá redirigir el informe a un servidor diferente en tiempo de ejecución. 3. Recupere la instancia de Tables de la propiedad Database de la clase ReportDocument. Nota Tables es una clase indizada que contiene instancias de la clase Table. 4. Para cada objeto Table de la colección: a) Recupere la instancia TableLogOnInfo de la propiedad LogOnInfo de la clase Table. b) Actualice la propiedad ConnectionInfo del objeto TableLogOnInfo. c) Llame al método ApplyLogOnInfo para aplicar el cambio. Ejemplo Private Sub setDatabaseLogon(ByVal rd As ReportDocument, ByVal databaseName As String, ByVal userName As String, ByVal password As String) Dim myConnectionInfo As New ConnectionInfo() myConnectionInfo.DatabaseName = databaseName myConnectionInfo.UserID = userName myConnectionInfo.Password = password Dim myTables As Tables = rd.Database.Tables For Each myTable As Table In myTables Dim newLogonInfo As TableLogOnInfo = myTable.LogOnInfo newLogonInfo.ConnectionInfo = myConnectionInfo myTable.ApplyLogOnInfo(newLogonInfo) Next End Sub private void setDatabaseLogon(ReportDocument rd, String databaseName, String userName, String password) { ConnectionInfo connectionInfo = new ConnectionInfo(); connectionInfo.DatabaseName = databaseName; connectionInfo.UserID = userName; connectionInfo.Password = password; Tables tables = rd.Database.Tables; foreach (Table table in tables) { TableLogOnInfo newLogonInfo = table.LogOnInfo; newLogonInfo.ConnectionInfo = connectionInfo; table.ApplyLogOnInfo(newLogonInfo); Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 153 } } Pasos siguientes Después de establecer la información de inicio de sesión en la base de datos para la instancia de ReportDocument, actualice la propiedad ReportSource del objeto CrystalReportViewer. 1.4.4.1.4 Para iniciar sesión en una base de datos segura de SQL Server con el control CrystalReportViewer Contexto Cuando utilice el modelo de objetos CrystalReportViewer para conectar con una base de datos segura de SQL Server, debe usar clases del espacio de nombres CrystalDecisions.Shared. Las propiedades de la clase ConnectionInfo se usan para conectar con el servidor de base de datos u otros orígenes de datos de ODBC. Procedimiento 1. Cree un nuevo objeto ConnectionInfo. 2. Establezca las propiedades DatabaseName, UserID y Password del objeto ConnectionInfo según los valores requeridos para el inicio de sesión. Nota Si decide establecer únicamente las propiedades DatabaseName, UserID y Password, se conectará con el servidor predeterminado de la base de datos especificada en el informe. Sin embargo, si elige asignar una propiedad ServerName alternativa, podrá redirigir el informe a un servidor diferente en tiempo de ejecución. 3. Recupere la instancia de TableLogOnInfos de la propiedad LogOnInfo de la clase CrystalReportViewer. Nota TableLogOnInfos es una clase indizada que contiene instancias de la clase TableLogOnInfo. 4. Para cada objeto TableLogOnInfo de la colección, establezca la propiedad ConnectionInfo del objeto TableLogOnInfo en la del objeto ConnectionInfo. 154 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Ejemplo Private String, Dim Dim For Sub setDatabaseLogon(ByVal databaseName As String, ByVal userName As ByVal password As String) myCconnectionInfo As New ConnectionInfo() logOnInfos As TableLogOnInfos = crystalReportViewer.LogOnInfo Each logOnInfo As TableLogOnInfo In logOnInfos logOnInfo.ConnectionInfo = myCconnectionInfo Next myCconnectionInfo.DatabaseName = databaseName myCconnectionInfo.UserID = userName myCconnectionInfo.Password = password End Sub private void setDatabaseLogon(String databaseName, String userName, String password){ ConnectionInfo connectionInfo = new ConnectionInfo(); TableLogOnInfos logOnInfos = crystalReportViewer.LogOnInfo; foreach(TableLogOnInfo logOnInfo in logOnInfos) { logOnInfo.ConnectionInfo = connectionInfo; } connectionInfo.DatabaseName = databaseName; connectionInfo.UserID = userName; connectionInfo.Password = password; } 1.4.4.2 Conectar a IDataReader Muchos proyectos .NET usan DataReader, en lugar de DataSet, para obtener datos. Por ejemplo, una forma habitual de enlazar un control (por ejemplo el control GridView) a datos es crear un método que obtenga datos mediante un DataReader y, a continuación, devolver dichos datos procedentes del método a través de una interfaz IDataReader. El diseñador incrustado de SAP Crystal Report puede acceder a IDataReader, siempre que se cumplan determinadas condiciones: ● Los datos los debe devolver un método, a través de la interfaz IDataReader. ● El proveedor de datos que se use dentro del método deberá ser el proveedor de datos OleDb .NET. Nota Las clases de este proveedor de datos se encuentran en el espacio de nombres System.Data.OleDb. ● El método deberá ser Shared [Visual Basic] o estático [C#]. ● La clase que contenga este método deberá formar parte de un proyecto de biblioteca de clases y tendrá que compilarse en un ensamblado. Para crear un informe de Crystal que use una instancia de IDataReader como orígenes de datos, debe crear una biblioteca de clases con un método estático que devuelva un objeto IDataReader. Después de formar esta biblioteca de clases, la recopilación resultante actuará como orígenes de datos del informe. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 155 Nota No podrá establecer los orígenes de datos del informe en IDataReader hasta que haya creado una biblioteca de clases compilada. Información relacionada Tutorial: Conectar a IDataReader [página 558] En este tutorial de conectividad de datos, aprenderá a conectar con una instancia de IDataReader. 1.4.4.3 Conectar a conjuntos de datos de ADO.NET Un objeto de conjunto de datos ADO.NET es un grupo de clases de conjuntos de datos creado en memoria. Puede crear un conjunto de datos de ADO.NET a partir de varios orígenes de datos (entre ellos se incluyen bases de datos de Access, Oracle y SQL Server) con Visual Studio ADO.NET Dataset Designer. ADO.NET Dataset Designer proporciona una vista gráfica de la base de datos con las tablas, los campos y los tipos correspondientes. Puede arrastrar tablas desde el Explorador de servidores a un archivo de esquema en la ficha Esquema del diseñador. Para crear un informe de Crystal que use un conjunto de datos ADO.Net como origen de datos, debe crear una biblioteca de clases con un método estático o una propiedad que devuelva un objeto DataSet. Después de formar esta biblioteca de clases, la recopilación resultante actuará como orígenes de datos del informe. Nota No podrá establecer los orígenes de datos del informe en DataSet hasta que haya creado una biblioteca de clases compilada. Cuándo utilizar un DataSet Los DataSets son útiles cuando: ● Es necesario modificar datos incluidos en el DataSet tras ejecutar la consulta. ● Es necesario combinar datos de diversos orígenes. Nota Los DataSets son una representación XML de datos, normalmente procedentes de una base de datos. Un DataSet no es equivalente a una sola tabla de una base de datos, sino a un grupo de tablas. Esto plantea un problema de escalabilidad potencial para los informes. Si un informe recupera varias tablas en un DataSet y se requiere una combinación entre dichas tablas, el informe debe realizar el procesamiento de combinación al interactuar con cada una de las tablas por separado. Éste no es un proceso eficaz. Es mejor ubicar las instrucciones de combinación en la consulta que se utilice para llenar el DataSet. Como 156 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net resultado se crea una 'pseudo-tabla' simple de datos precombinados en el DataSet, lo que exime al informe de centrarse en la presentación de los datos. Información relacionada Evitar DataSets para consultas simples [página 67] Almacenar DataSets en memoria caché en caso de utilizarlos [página 68] Tutorial: Conectar a conjuntos de datos de ADO.NET [página 544] 1.4.4.4 Conectar a colecciones de objetos SAP Crystal Reports 2008 es capaz de generar informes de datos de objetos. Los datos de objetos pueden ser simples, como una cadena o datos enteros. También pueden ser complejos, como una clase o una colección. Las colecciones deben ser una matriz sencilla o un objeto IEnumerable. SAP Crystal Reports puede acceder a estas colecciones como a un origen de datos normal, ofreciendo así un origen de datos versátil para los informes de Crystal. Con una colección de objetos, puede escribir una clase personalizada que rellene un objeto con datos mediante programación o dinámicamente. También puede escribir sus propios objetos de acceso a datos, ampliando el número de orígenes de datos indicados con la instalación predeterminada de SAP Crystal Reports, versión para programadores de Microsoft Visual Studio. Para usar una colección de objetos como origen de datos, es necesario crear una clase que muestre al menos una propiedad pública. Si la propiedad devuelve datos sencillos, como una cadena o valores enteros, SAP Crystal Reports tratará estos datos como un campo de una base de datos. Si la propiedad devuelve datos complejos, como un objeto de lista de matrices, cada objeto de la colección de objetos ofrecerá una fila de detalle en el informe. Acceder a datos en objetos Las versiones anteriores de SAP Crystal Reports permiten acceder a propiedades que devuelven sólo tipos de datos sencillos. Por ejemplo, si un objeto contiene una propiedad que devuelve una cadena, esa cadena se muestra como un campo normal en tiempo de diseño. En cambio, si el objeto contiene una propiedad que devuelve un objeto, los datos que contiene el objeto devuelto no se mostrarán aunque contenga datos sencillos. SAP Crystal Reports 2008 y las versiones posteriores permiten acceder a los datos que se encuentran en tipos de datos complejos mediante la expansión de tipos complejos. En tiempo de diseño verá el objeto devuelto como un origen de datos jerárquico. Los datos complejos se pueden expandir para mostrar los tipos de datos sencillos que contienen, los cuales se pueden agregar a continuación al informe. Para habilitar la expansión de tipos complejos, agregue el atributo CrystalComplexTypeExpansionLevels a la propiedad que devuelve el objeto que desea expandir. Es necesario establecer el atributo CrystalComplexTypeExpansionLevels en un valor mayor que 1 para profundizar en los datos de la clase. Si Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 157 no se establece el atributo CrystalComplexTypeExpansionLevels, SAP Crystal Reports no podrá acceder a los datos del campo que hay en la clase. Ejemplo Mostrar datos sencillos Este ejemplo tiene dos objetos: Employee y Person. Al agregar el objeto Employee al informe como origen de datos, la propiedad Employee.EmployeeID se muestra como un campo válido; sin embargo, la propiedad Employee.Person no será visible porque devuelve un tipo de datos complejo. Class Employee Private _employeeID As Integer Private _person As New Person() Public Property EmployeeID() As Integer Get Return _employeeID End Get Set(ByVal value As Integer) _employeeID = value End Set End Property Public ReadOnly Property Person() As Person Get Return _person End Get End Property End Class Class Person Private _name As String Public Property Name() As String Get Return _name End Get Set(ByVal value As String) _name = value End Set End Property End Class class Employee { int _employeeID; Person _person = new Person(); public int EmployeeID { get { return _employeeID; } set { _employeeID = value; } } } public Person Person { get { return _person; } } class Person { 158 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net private String _name; } public String Name { get { return _name; } set { _name = value; } } Ejemplo Permitir la expansión de tipos complejos En el ejemplo anterior, la propiedad Employee.Person no es visible porque devuelve un tipo de datos complejo. En este ejemplo, el atributo CrystalComplexTypeExpansionLevels se ha agregado a la propiedad Employee.Person, lo que permitirá al diseñador del informe ver un campo nuevo en el Explorador de campos: Persona-Nombre. Class Employee Private _employeeID As Integer Private _person As New Person() Public Property EmployeeID() As Integer Get Return _employeeID End Get Set(ByVal value As Integer) _employeeID = value End Set End Property _ <CrystalDecisions.CrystalReports.Engine.CrystalComplexTypeExpansionLevels(1)> Public ReadOnly Property Person() As Person Get Return _person End Get End Property End Class Class Person Private _name As String Public Property Name() As String Get Return _name End Get Set(ByVal value As String) _name = value End Set End Property End Class class Employee { int _employeeID; Person _person = new Person(); public int EmployeeID { Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 159 } } get { return _employeeID; } set { _employeeID = value; } [CrystalDecisions.CrystalReports.Engine.CrystalComplexTypeExpansionLevels(1)] public Person Person { get { return _person; } } class Person { private String _name; } public String Name { get { return _name; } set { _name = value; } } Información relacionada Tutorial: Conectar a colecciones de objetos [página 569] En este tutorial sobre conectividad de datos, aprenderá a usar una colección de objetos como origen de datos de un informe de Crystal Reports. 1.4.4.5 Para habilitar el almacenamiento en caché de informes en un sitio Web de SAP Crystal Reports Requisitos previos Estos pasos utilizan la característica Tareas inteligentes. La característica Tareas inteligentes está disponible en Visual Studio 2005 y en versiones posteriores. Contexto Los proyectos para Windows que usan Crystal Reports, versión para programadores de Microsoft Visual Studio siguen usando el mismo entorno de almacenamiento en caché que el usado en Visual Studio .NET 2003. Es decir, cuando se agrega un informe a un proyecto, se crean dos clases contenedoras de informes: una clase de informes normal y una clase de informes en caché. Si no se genera ninguna clase contenedora para un informe, el almacenamiento en caché se controla mediante la propiedad EnableCaching del control CrystalReportSource. 160 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Procedimiento 1. Crear un sitio Web Crystal Reports, versión para programadores de Microsoft Visual Studio. 2. En la página Default.aspx, seleccione la vista Origen. 3. Busque la etiqueta XML para el control CrystalReportSource. 4. Cambie el valor de la propiedad EnableCaching de False a True. Nota Para obtener información detallada sobre el almacenamiento en caché de informes, la versión almacenada en caché de la clase contenedora de informe y una explicación de cuándo utilizar el almacenamiento en caché, vea Cache y persistencia del modelo de objetos ReportDocument [página 58]. Ejemplo <CR:CrystalReportSource ID="myCrystalReportSource" runat="server" EnableCaching="True"> <Report FileName="CrystalReport1.rpt"> </Report> </CR:CrystalReportSource> 1.4.4.6 Usar LINQ LINQ (Language Integrated Query) es un componente de Microsoft Framework que permite realizar consultas en cualquier origen de datos. SAP Crystal Reports puede elaborar un informe basado en una colección de objetos personalizados. De este modo puede controlar mejor cómo se muestra la información en un informe. Sin embargo, la recopilación de una colección de objetos puede resultar complicada si la colección contiene datos agregados de varios orígenes de datos. LINQ simplifica el proceso de elaboración de informes basados en una colección de objetos y permite ejecutar consultas similares a las consultas SQL en objetos personalizados. Por ejemplo, supongamos que tiene una base de datos SQL, un archivo XML y un archivo Microsoft Access que contienen datos de ventas. LINQ le permite hacer consultas que parten de los tres orígenes de datos y mostrar los datos en un único informe. LINQ permite hacer lo siguiente: ● Recopilar una colección de objetos pertenecientes a varios orígenes de datos. ● Unir dos colecciones de objetos. ● Agrupar elementos en una colección. Es necesario tener instalado el siguiente software para poder usar LINQ con SAP Crystal Reports: ● Visual Studio 2008 o posterior. ● Microsoft .NET Framework versión 3.5 ● SAP Crystal Reports Basic para Visual Studio 2008 o posterior. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 161 Información relacionada Establecer el origen de datos [página 149] 1.4.5 Visualizar un informe El control CrystalReportViewer se usa para ver informes de Crystal. Existen dos controles CrystalReportViewer en el SDK de SAP Crystal Reports .NET. Para un sitio web, usará la clase CrystalDecisions.Web.CrystalReportViewer. Para una aplicación de Windows, usará la clase CrystalDecisions.Windows.Forms.CrystalReportViewer. Para ver un informe, debe agregar en primer lugar un control CrystalReportViewer a la aplicación y, a continuación, asignar la propiedad ReportSource de ese control a un informe. Se denomina enlace de informes al proceso de asignación de un informe a un control CrystalReportViewer. Existen diferentes formas de enlazar un control CrystalReportViewer a un informe. En esta sección se detalla cada escenario de enlace de informes, así como consideraciones generales para la visualización de informes. Clases usadas para visualizar informes ● CrystalDecisions.Windows.Forms.CrystalReportViewer Proporciona propiedades, métodos y eventos que modifican o recuperan información sobre como aparece y funciona el control CrystalReportViewer. ● CrystalDecisions.Web.CrystalReportViewer Proporciona propiedades, métodos y eventos que modifican o recuperan información sobre como aparece y funciona el control CrystalReportViewer. ● CrystalDecisions.CrystalReports.Engine.ReportDocument Representa un informe y contiene las propiedades y los métodos para definir, dar formato, cargar, exportar e imprimir el informe. Información relacionada ¿Cómo utilizo los controles de visores de informes? [página 42] Control CrystalReportViewer [página 42] Escenarios de enlace de informes [página 168] 162 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 1.4.5.1 Comparar informes incrustados y no incrustados ¿Cuál es la diferencia entre informes incrustados y no incrustados? Un informe incrustado es un informe que se ha importado a un proyecto de Visual Studio, o que se ha creado en él. Cuando se incrusta un informe en el proyecto, automáticamente se genera una clase contenedora para el informe. De esta forma podrá tener acceso al informe por nombre, en lugar de mediante una instancia de ReportDocument independiente. Un informe no incrustado es un informe externo al proyecto de Visual Studio. Existen muchas formas de tener acceso al informe y cargarlo en un modelo de objetos, para habilitar la interacción con el informe mediante programación, pero el informe siempre continuará siendo externo al proyecto de Visual Studio. Cómo funciona un informe incrustado Cuando se importa o se crea el informe en el proyecto, se crea una clase contenedora, con el mismo nombre que el informe. Esta clase contiene, o representa, el informe en el proyecto. Cuando ocurre esto, todo el código del proyecto interactúa con la clase del informe que se ha creado para representarlo, en vez de hacerlo con el propio archivo de informe original. Al compilar el proyecto, tanto el informe como su clase contenedora se incrustan en el ensamblado, lo mismo que ocurriría con cualquier otro recurso del proyecto. Nota .Net Framework tiene restricciones de tamaño para los archivos DLL. Esto significa que puede que el proyecto no se compile si contiene grandes informes incrustados. En los proyectos que utilizan informes grandes, deshabilite los datos guardados en el informe o modifique el proyecto para que utilice informes no incrustados. El límite de tamaño varía según la versión de .Net Framework. Consulte la documentación de .Net Framework para obtener más información. La clase contenedora de un informe se extiende desde ReportDocument de la clase base común. Hereda todas las propiedades y métodos de ReportDocument. ReportDocument es la clase raíz del modelo de objetos ReportDocument. Cómo funciona un informe no incrustado A un informe no incrustado siempre se obtiene acceso externamente y el SDK puede tener acceso a él de diversas formas: ● El informe puede estar en la unidad de disco duro en una ruta de directorio de archivos. ● El informe puede estar expuesto como servicio Web de informes. ● El informe puede formar parte de un grupo de informes expuestos a través de Crystal Services. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 163 Nunca se importan informes no incrustados en el proyecto y, por lo tanto, nunca se crea ninguna clase contenedora de informe, a diferencia de los informes incrustados. En su lugar, se carga el informe no incrustado en uno de los modelos de objetos en tiempo de ejecución, de la forma correspondiente: ● El modelo de objetos ReportDocument utiliza el método ReportDocument.Load() para cargar el informe en el modelo de objetos ReportDocument. ● El modelo de objetos CrystalReportViewer utiliza la propiedad CrystalReportViewer.ReportSource para enlazar el informe directamente al control. Cuándo elegir informes incrustados o no incrustados Si desea simplificar la implementación del proyecto, utilice informes incrustados. Tendrá menos archivos con los que trabajar y no se tendrá que preocupar de si los informes están mal colocados en la ruta de directorio de archivos equivocada. Además, esta solución es más segura, en tanto que los informes no se exponen a modificaciones. Los informes incrustados son más sencillos y seguros, pero requieren más trabajo. No se pueden modificar sin volver a compilar todo el proyecto. Si los informes se deben modificar regularmente, utilice informes no incrustados para facilitar su acceso y modificación, sin preocuparse por la necesidad de volver a compilar los ensamblados cada vez. Además, existen límites en el tamaño que puede tener un informe incrustado. No se puede compilar un informe muy grande como un recurso incrustado. Los casos de enlace de informes le mostrarán muchas formas de enlazar informes incrustados y no incrustados. También verá la forma en que puede utilizar ReportDocument como la clase genérica para cualquier tipo de informe. De esta forma, puede mantener los cambios de código al mínimo, en caso de que decida cambiar los enfoques. Incrustar informes en un proyecto Web La admisión de informes incrustados se habilita mediante el uso de un proveedor de versiones que compila informes en un archivo DLL. Para incrustar el informe de una DLL durante el tiempo de compilación, deberá establecer embedRptInResource como verdadero en el archivo web.config. Para tener acceso a la clase de contenedor mediante Intellisense, deberá colocar el informe en la carpeta App_Code/Global de su solución. Nota Si el informe se encuentra en el directorio App_Code/Global y embedRptInResource está establecido en falso, el archivo de informe no podrá copiarse en la ubicación de destino al publicar el sitio Web. Para evitar este problema, copie el sitio Web en el destino. embedRptInResour ce Ubicación del informe Intellisense disponible Publicar para implementar Copiar para implementar Verdadero App_Code/Global X X X 164 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net embedRptInResour ce Ubicación del informe Verdadero Fuera de App_Code/ Intellisense disponible Publicar para implementar Copiar para implementar X X X X Global, pero en el proyecto Falso App_Code/Global Falso Fuera de App_Code/ X X Global, pero en el proyecto Información relacionada Configuración del archivo Web.Config [página 19] 1.4.5.2 Establecer el origen del informe El control CrystalReportViewer muestra sólo un informe a la vez. Para indicar al control el informe que se va a mostrar, enlace la propiedad ReportSource del control a un informe en concreto. En tiempo de ejecución, el control carga el informe enlazado a la propiedad ReportSource y lo muestra. Un control CrystalReportViewer se puede enlazar a un archivo ubicado en el disco, a un objeto ReportDocument o a un objeto ReportClientDocument. El enlace con un objeto ofrece funcionalidad adicional a través de los modelos de objetos ReportDocument y ReportClientDocument. Este procedimiento es la mejor forma de establecer la propiedad ReportSource. En su forma más sencilla, la asignación tiene el siguiente aspecto: crystalReportViewer1.ReportSource = "C:\WorldSalesReport.rpt" crystalReportViewer1.ReportSource = "C:\\WorldSalesReport.rpt"; En este caso, el informe está enlazado al control directamente desde su ruta en el directorio de archivos. El control CrystalReportSource El control CrystalReportSource forma parte del nuevo modelo de desarrollo de aplicaciones basado en etiquetas que se proporciona con la versión 2.0 de ASP.NET. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 165 Nota El control CrystalReportSource sólo está disponible para sitios web. En el marco del control DataSource, los controles .NET visuales se conectan a controles DataSource no visuales (controles que no muestran información). Este nuevo marco de DataSource encapsula la información de conectividad de datos escrita como líneas de código en los controles .NET en el formulario Web Forms. 1.4.5.2.1 Para enlazar el control CrystalReportViewer a un archivo en disco Contexto La forma más sencilla de enlazar un control CrystalReportViewer a un informe de Crystal es establecer la propiedad ReportSource en una ubicación del disco. Este informe no incrustado se muestra cuando se ejecuta la aplicación. De esta forma se enlaza el informe directamente al control. Toda interacción mediante programación con el informe se debe realizar en el modelo de objetos CrystalReportViewer limitado. Procedimiento 1. Agregue un control CrystalReportViewer a la aplicación de Windows o al sitio web. 2. Abra el formulario Web Forms o Windows Forms. 3. En el menú Ver, haga clic en Código. 4. Establezca la propiedad ReportSource en la ubicación del informe en el sistema local de archivos. ○ Si trabaja con aplicaciones de Windows Forms o un sitio Web: myCrystalReportViewer.ReportSource = "C:\MyReport.rpt" crystalReportViewer.ReportSource = "C:\\MyReport.rpt"; ○ Si trabaja con una aplicación WPF: myCrystalReportViewer.ViewerCore.ReportSource = "C:\MyReport.rpt" crystalReportViewer.ViewerCore.ReportSource = "C:\\MyReport.rpt"; 166 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 1.4.5.2.2 Para enlazar el control CrystalReportViewer a un objeto ReportDocument Contexto Este escenario de vinculación de informes permite usar el modelo de objetos ReportDocument, más eficaz, con informes no incrustados; es decir, informes externos al proyecto. En lugar de enlazar las rutas del directorio directamente al visor, páselas al método ReportDocument.Load(). A continuación, enlace el control CrystalReportViewer al objeto ReportDocument. Procedimiento 1. Agregue un control CrystalReportViewer a la aplicación de Windows o al sitio web. 2. Abra el formulario Web Forms o Windows Forms. 3. En el menú Ver, haga clic en Código. 4. Cree una instancia de un nuevo objeto ReportDocument y cargue el informe desde el disco mediante el método ReportDocument.Load. Dim rd As ReportDocument = New ReportDocument() rd.Load(reportPath) ReportDocument rd = new ReportDocument(); rd.Load(reportPath); 5. Establezca la propiedad ReportSource en el objeto ReportDocument. ○ Si trabaja con aplicaciones de Windows Forms o un sitio Web: myCrystalReportViewer.ReportSource = rd crystalReportViewer.ReportSource = rd; ○ Si trabaja con una aplicación WPF: myCrystalReportViewer.ViewerCore.ReportSource = rd crystalReportViewer.ViewerCore.ReportSource = rd; Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 167 1.4.5.3 Escenarios de enlace de informes SAP Crystal Reports, versión para programadores de Microsoft Visual Studio ofrece múltiples maneras de ligar un control CrystalReportViewer a un informe. Para ayudarle a elegir el mejor caso de enlace de informes para la aplicación, en esta sección se resumen las ventajas y las desventajas de los casos recomendados y se explica la razón de la mayor popularidad de algunos. Nota La mayoría de sitios web o proyectos para Windows se pueden basar en los dos casos de enlace más simples: el enlace a un informe incrustado o el no incrustado. Después de leer esta sección, quizá prefiera ver el listado detallado de todos los casos, para explorar totalmente todas las opciones disponibles del SDK. Casos de enlaces recomendados de SAP Crystal Reports Los escenarios que enlazan informes con el modelo de objetos ReportDocument se suelen preferir a los que utilizar el modelo de objetos CrystalReportViewer. La explicación es que el modelo de objetos ReportDocument proporciona una API más completa para la interacción mediante programación con el informe. La mayoría de los usuarios prefieren el escenario Enlazar a una clase de informe incrustado [página 198]. Aunque no es la mejor opción para optimizar el rendimiento, es el método más simple de usar: agregue un informe al proyecto para crear una clase contenedora de informe, cree una instancia de la clase contenedora de informe y, a continuación, pásela al control CrystalReportViewer. Puesto que la clase contenedora de informe hereda de la clase base ReportDocument, tiene acceso a toda la funcionalidad del modelo de objetos ReportDocument. Otra forma popular de ligar informes está descrita en Enlazar a una clase de informe no incrustado cargado en ReportDocument [página 200]. También le proporciona acceso a toda la funcionalidad del modelo de objetos ReportDocument pero con la ventaja adicional de los informes no incrustados, por lo que puede modificarlos sin volver a compilar la aplicación. Casos de enlaces recomendados para el servidor de aplicaciones de informes (RAS) Por lo que respecta a RAS, puede usar escenarios de enlace de informes adicionales, en función de la configuración del proyecto. ● Si usa SAP Crystal Reports 10 con RAS 10, puede trasladar los proyectos creados originalmente con SAP Crystal Reports (mediante informes incrustados) a RAS y al modelo de objetos ReportClientDocument con sólo dos líneas de código adicionales necesarias por informe. ● 168 Para optimizar el escenario anterior, haga copias de los informes incrustados en el servidor RAS e indique a RAS que las use. © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Escenarios de enlace de informes recomendados para SAP Crystal Reports Server o la plataforma SAP BusinessObjects Business Intelligence Si ha actualizado a SAP Crystal Reports Server o la plataforma SAP BusinessObjects Business Intelligence, dispone de cuatro escenarios de enlace de informes recomendados. El caso que va a usar está determinado por las necesidades de modificación y escalabilidad de los informes: ● Puede mostrar un informe, sin modificaciones mediante programación, con la mayor velocidad y el mejor rendimiento posibles. ● Puede modificar el informe mediante programación como parte del proceso de presentación teniendo acceso al modelo de objetos ReportClientDocument. ● Si usa SAP Crystal Reports, versión para programadores de Microsoft Visual Studio con SAP Crystal Reports Server o la plataforma SAP BusinessObjects Business Intelligence, puede trasladar los proyectos creados en primera instancia con SAP Crystal Reports (mediante informes incrustados) a SAP Crystal Reports Server o la plataforma SAP BusinessObjects Business Intelligence y conservar también el código del informe existente publicando copias de los informes incrustados en SAP Crystal Reports Server o la plataforma SAP BusinessObjects Business Intelligence. ● Puede tener acceso al informe como instancia de InfoObject en el marco de plataforma, con la posibilidad de programarlo y modificar sus parámetros. Información relacionada Controles de visores de informes [página 34] 1.4.5.3.1 Enlazar informes al modelo de objetos CrystalReportViewer El modelo de objeto CrystalReportViewer es el modelo de objeto más sencillo. A causa de sus características limitadas, se desaconseja el uso de este modelo de objeto y se recomienda el uso de ReportDocument, que es más completo. Información relacionada Modelo de objetos CrystalReportViewer [página 36] Enlazar a una ruta de directorio de archivos en el código [página 170] Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 169 1.4.5.3.1.1 código Enlazar a una ruta de directorio de archivos en el Modelo de objetos Este escenario de enlace de informes usa el modelo de objeto CrystalReportViewer. Ubicación de los informes Los informes se encuentran en un directorio de archivos. Descripción Este es el caso de enlace de informes más simple: un informe del directorio de archivos se enlaza al control CrystalReportViewer mediante su ruta de acceso. Ventajas ● Bajo mantenimiento: los informes se pueden agregar, quitar o modificar sin volver a compilar la aplicación. ● Implementación simplificada: no hay necesidad de declarar ni crear instancias de las clases. Pasa por alto el uso del modelo de objetos ReportDocument, pasando un informe directamente al control CrystalReportViewer. Desventajas ● Distribución limitada: los informes suelen estar en el mismo equipo que la aplicación, debido a las complicaciones que supone la concesión de permisos a la cuenta de usuario ASPNET para tener acceso a otro equipo de la red. ● Modelo de objetos limitado: este escenario de enlace proporciona sólo el modelo de objetos limitado que forma parte de CrystalReportViewer. Información relacionada Enlazar a una ruta de directorio de archivos mediante la ventana Propiedades [página 171] 170 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 1.4.5.3.1.1.1 Para enlazar el control CrystalReportViewer a un archivo en disco Contexto La forma más sencilla de enlazar un control CrystalReportViewer a un informe de Crystal es establecer la propiedad ReportSource en una ubicación del disco. Este informe no incrustado se muestra cuando se ejecuta la aplicación. De esta forma se enlaza el informe directamente al control. Toda interacción mediante programación con el informe se debe realizar en el modelo de objetos CrystalReportViewer limitado. Procedimiento 1. Agregue un control CrystalReportViewer a la aplicación de Windows o al sitio web. 2. Abra el formulario Web Forms o Windows Forms. 3. En el menú Ver, haga clic en Código. 4. Establezca la propiedad ReportSource en la ubicación del informe en el sistema local de archivos. ○ Si trabaja con aplicaciones de Windows Forms o un sitio Web: myCrystalReportViewer.ReportSource = "C:\MyReport.rpt" crystalReportViewer.ReportSource = "C:\\MyReport.rpt"; ○ Si trabaja con una aplicación WPF: myCrystalReportViewer.ViewerCore.ReportSource = "C:\MyReport.rpt" crystalReportViewer.ViewerCore.ReportSource = "C:\\MyReport.rpt"; 1.4.5.3.1.2 Enlazar a una ruta de directorio de archivos mediante la ventana Propiedades Modelo de objetos Este escenario de enlace de informes usa el modelo de objeto CrystalReportViewer. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 171 Ubicación de los informes Los informes están almacenados en un directorio de archivos. Descripción Ésta es una versión alternativa del caso de enlace de informes más sencillo, Enlazar a una ruta de directorio de archivos en el código [página 170]. Un informe del directorio de archivos se enlaza al control CrystalReportViewer mediante su ruta de acceso, pero la asignación se establece en la ventana Propiedades, se puede asignar directamente a la propiedad ReportSource o a la propiedad DataBindings>ReportSource. En el caso de un proyecto Web, la cadena de ruta de informe se inserta directamente en el código HTML de la página ASPX, en vez de hacerlo en el código de la clase de código subyacente. Ventajas ● Vista previa en tiempo de diseño: se puede obtener una vista previa del informe en tiempo de diseño en el formulario Web Forms o Windows Forms. Nota La vista previa en tiempo de diseño es una función que había estado disponible en sitios Web, pero es nueva en los proyectos Windows. ● Bajo mantenimiento: los informes se pueden agregar, quitar o modificar sin volver a compilar la aplicación. ● Implementación simplificada: no hay necesidad de declarar ni crear instancias de las clases. Pasa por alto el uso del modelo de objetos ReportDocument, pasando un informe directamente al control CrystalReportViewer. Desventajas ● En el caso de las aplicaciones Web, como el enlace tiene lugar en la página HTML, hay que llamar al método DataBind() para el control CrystalReportViewer en la clase de código subyacente. Nota Esta limitación se ha eliminado de SAP Crystal Reports para Visual Studio 2005. ● Distribución limitada: los informes suelen estar en el mismo equipo que la aplicación, debido a las complicaciones que supone la concesión de permisos a la cuenta de usuario ASPNET para tener acceso a otro equipo de la red. ● Modelo de objetos limitado: este escenario de enlace proporciona sólo el modelo de objetos limitado que forma parte de CrystalReportViewer. 172 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Información relacionada Enlazar a un control CrystalReportSource (sitios Web en Visual Studio) [página 173] 1.4.5.3.1.2.1 Para enlazar a una ruta de directorio de archivos mediante la ventana Propiedades Procedimiento 1. Cree un proyecto Web o Windows. 2. En el Cuadro de herramientas, arrastre un control CrystalReportViewer en Web Forms o Windows Forms. 3. Haga clic en el control CrystalReportViewer para seleccionarlo. 4. En la ventana Propiedades, asigne una ruta de acceso del directorio de archivos a la propiedad ReportSource. Nota La ruta de directorio de archivos lleva a los informes de muestra de Visual Studio 2005. Gracias a la función de vista previa en tiempo de diseño, el informe se muestra en el modo de vista previa. C:\Archivos de programa\Microsoft Visual Studio 8.0\Crystal Reports\Samples\Es \Reports\Feature Examples\Hierarchical Grouping.rpt 5. Para ver el informe, cree y ejecute el proyecto. 1.4.5.3.1.3 Enlazar a un control CrystalReportSource (sitios Web en Visual Studio) Modelo de objetos Este escenario de enlace de informes usa el modelo de objeto CrystalReportViewer. Ubicación de los informes Los informes están almacenados en un directorio de archivos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 173 Descripción Ésta es una versión alternativa del caso de enlace de informes más sencillo, Enlazar a una ruta de directorio de archivos en el código [página 170]. En este escenario, el informe se enlaza con el nuevo modelo de desarrollo de aplicaciones de código reducido y basado en etiquetas de ASP.NET versión 2.0. Nota Este caso de enlace de informes sólo está disponible para sitios Web. En este caso se utilizan tareas inteligentes para crear un control CrystalReportSource. A continuación, se selecciona un informe para el control CrystalReportSource. En vez de escribir código manualmente para interactuar con el informe y habilitar su acceso al modelo de objetos CrystalReportViewer, se realizan selecciones en el panel Tarea inteligente (en la vista Diseño) o se escribe directamente código XML de declaración (en la vista Origen). Con el código XML de declaración puede asociar las etiquetas <Parameters> y <DataSources>, que están anidadas en la etiqueta <Report>, a un conjunto de controles no visuales que están disponibles para los marcos Parameter y DataSource. Nota Los marcos de trabajo Parameter y DataSource son nuevas características de ASP.NET 2.0. Incluyen controles como: ControlParameter o QueryStringParameter y SqlDataSource o JetDataSource. El modelo de desarrollo de aplicaciones basado en etiquetas proporciona un método rápido y sencillo de realizar una interacción limitada con el informe, sin necesidad de escribir código. Ventajas ● Vista previa en tiempo de diseño: se puede obtener una vista previa del informe en tiempo de diseño en el formulario Web Forms o Windows Forms. ● Forma más sencilla de crear interacción de informe: se puede utilizar el enfoque simplificado de código reducido del modelo de desarrollo de aplicaciones basado en etiquetas, para interactuar con el informe. ● Las mismas ventajas se enumeran en Enlazar a una ruta de directorio de archivos en el código [página 170]. Desventajas ● Distribución limitada: los informes suelen estar en el mismo equipo que la aplicación, debido a las complicaciones que supone la concesión de permisos a la cuenta de usuario ASPNET para tener acceso a otro equipo de la red. ● Modelo de objetos limitado: este escenario de enlace proporciona sólo el modelo de objetos limitado que forma parte de CrystalReportViewer. 174 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 1.4.5.3.1.3.1 Para enlazar a un control CrystalReportSource mediante el modelo de código reducido Procedimiento 1. Arrastre el control CrystalReportViewer al formulario web. 2. En la esquina superior derecha del control CrystalReportViewer, haga clic en el botón triangular pequeño. Se abrirá el panel Tarea inteligente denominado Tareas de CrystalReportViewer. En la lista Elegir un origen de informe, se muestra <Ninguno>. 3. Haga clic en la lista Elegir un origen de informe y seleccione <Nuevo origen de informe…>. Se abrirá el cuadro de diálogo Crear ReportSource. 4. En el cuadro de texto Especifique nombre del control, deje la entrada predeterminada CrystalReportSource1. 5. Haga clic en la lista Especifique un informe para el control CrystalReportSource y seleccione <Examinar...>. La selección alternativa es <Nuevo informe>. Esta opción permite crear un nuevo informe de Crystal. 6. Seleccione un informe para mostrarlo en el control CrystalReportViewer y haga clic en Aceptar. 7. Vuelva a hacer clic en Aceptar para cerrar el cuadro de diálogo Elegir un origen de informe. Información relacionada Tutorial: Configurar sitios Web de código reducido con SAP Crystal Reports mediante tareas inteligentes [página 503] En este tutorial, aprenderá a utilizar el nuevo modelo de desarrollo de aplicaciones basado en etiquetas de Visual Studio. Va a seguir los pasos de un modelo de desarrollo de código reducido para configurar un sitio Web con SAP Crystal Reports, mediante tareas inteligentes. 1.4.5.3.1.4 Enlazar a una dirección URL de un servicio Web de informes Modelo de objetos Este escenario de enlace de informes usa el modelo de objeto CrystalReportViewer. Ubicación de los informes Los informes se ubican como servicio Web de informes, alojados en un servidor Web, normalmente remoto. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 175 Descripción Un informe, que se almacena en otro servidor y se atiende como servicio Web de informes, se enlaza mediante su dirección URL al control CrystalReportViewer. Ventajas ● Amplia distribución: puede haber informes en cualquier ubicación de Internet. ● Facilidad de distribución: los servicios Web de informes están en el puerto 80, por lo que se puede obtener acceso a ellos incluso a través de servidores de seguridad. Desventajas ● Modelo de objetos limitado: este escenario de enlace proporciona sólo el modelo de objetos limitado que forma parte de CrystalReportViewer. Implementación Nota Este procedimiento sólo funciona con un proyecto creado a partir de la Configuración de proyectos [página 14]. La configuración de proyectos contiene referencias específicas a espacios de nombres y configuración de códigos necesarios para este procedimiento, que no se podrá completar sin dicha configuración. ● En el método ConfigureCrystalReports() (creado en Configuración de proyectos [página 14]), asigne una dirección URL del servicio Web de informes a la propiedad ReportSource de la clase CrystalReportViewer. De esta forma se enlaza el informe directamente al control. Toda interacción mediante programación con el informe se debe realizar en el modelo de objetos CrystalReportViewer limitado. myCrystalReportViewer.ReportSource = _ "http://localhost/TestProject/World_Sales_ReportService.asmx" crystalReportViewer.ReportSource = "http://localhost/TestProject/World_Sales_ReportService.asmx"; Nota Para utilizar este caso de enlace, cree un proyecto de servicios Web de informes en Visual Studio. 176 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Información relacionada Trabajar con Crystal Reports como servicio web [página 80] 1.4.5.3.1.5 Escenarios de enlaces CrystalReportViewer que utilizan Crystal Services Usar Crystal Services en Visual Studio SAP Crystal Reports, versión para programadores de Microsoft Visual Studio permite el acceso programático a los ficheros de servidor mediante Crystal Services. Usar Crystal Services en Visual Studio 2003 En Visual Studio 2003 se puede acceder a los informes Crystal a través del nodo Crystal Services en el Explorador de servidores. Cuando están instalados SAP Crystal Reports y Crystal Services, éstos últimos aparecen como un subnodo dentro de cada servidor enumerado en el Explorador de servidores. El nodo Crystal Services se expande para mostrar listas de informes desde diversas ubicaciones: ● El directorio de archivos local de la unidad de disco duro. ● Report Application Server (RAS) ● Crystal Enterprise (CE) Puede arrastrar y colocar cualquier informe desde estas listas a Web Forms o Windows Forms. Crystal Services normalmente muestra dos subnodos que se pueden expandir, en función de la versión de SAP Crystal Reports que tenga instalada actualmente, y de las licencias adicionales que tenga del Servidor de aplicaciones de informes (RAS) o de Crystal Enterprise. La tabla de la siguiente sección describe los requisitos de acceso a un nodo en particular. Es posible que deba ajustar la configuración del servidor de seguridad para poder acceder al CMS de la plataforma SAP BusinessObjects Business Intelligence. El puerto predeterminado del CMS es 6400. Póngase en contacto con el administrador del sistema para obtener más información sobre la configuración de la dirección de red y el puerto del sistema de plataforma SAP BusinessObjects Business Intelligence. Puede encontrar más información sobre la personalización de puertos en el Manual del administrador de la plataforma SAP BusinessObjects Business Intelligence. Clases contenedoras Al arrastrar un informe de Crystal Services a un formulario Web Forms o Windows Forms, se crea una instancia de clase contenedora que hace referencia al informe en la sección de código generado, de la clase de código subyacente del Diseñador de Web Forms o Windows Forms. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 177 Nota El tipo de clase contenedora varía con las versiones de SAP Crystal Reports. Vea la siguiente tabla. Los servicios de Crystal Services que aparecen en la siguiente tabla muestran tipos de clases contenedoras que no contienen ningún modelo de objetos; dependen del modelo de objetos limitado proporcionado con el control CrystalReportViewer. La tabla muestra los servicios de Crystal Services incluidos en SAP Crystal Reports para Visual Studio 2003. Estos servicios de Crystal Services exponen grupos de informes, bien desde el directorio de archivos local o desde el componente WCS (Web Component Server) de Crystal Enterprise. Los informes se incluyen dos clases contenedoras distintas: ServerFileReport para informes del directorio de archivos locales o EnterpriseReport para informes del servidor WCS de Crystal Enterprise. Clase contenedora expuesta mediante Crystal Services Nombre del nodo si­ Versiones de SAP tuado debajo de Crystal Reports Crystal Services Descripción Requisitos para te­ ner acceso a este nodo ServerFileReport Archivos de servidor Expone los informes del directorio de ar­ chivos local me­ diante un servicio Web común, Server­ FileReportService. Para obtener más in­ formación, vea Enla­ zar a Archivos de servidor (VS .NET 2003) [página 179]. Configurar permisos para los usuarios ASPNET. (Vea Enla­ zar a Archivos de servidor (VS .NET 2003) [página 179].) Accede a servicios Web de informes mostrados por el servidor WCS de Crystal Enterprise 8, 8.5, 9 o 10 mediante un servicio Web co­ mún, EnterpriseRe­ portService. Para obtener más infor­ mación, vea Enlazar a Crystal Enterprise (VS .NET 2003) [pá­ gina 183]. Acceso a la instala­ ción de Crystal En­ terprise, que expone los informes Enter­ prise mediante su servidor WCS. SAP Crystal Reports para Visual Stu­ dio .NET 2003 (el nodo se reem­ plaza al instalar SAP Crystal Reports 9 o 10) EnterpriseReport Crystal Enterprise SAP Crystal Reports para Visual Stu­ dio .NET 2003 (el nodo se reem­ plaza al instalar SAP Crystal Reports 9 o 10) 178 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 1.4.5.3.1.5.1 Enlazar a Archivos de servidor (VS .NET 2003) Modelo de objetos Este escenario de enlace de informes utiliza CrystalReportViewer. Ubicación de los informes Los informes están en una carpeta de informes del directorio de archivos local. Los informes de esta ubicación se exponen como servicios Web de informes. Información general sobre Crystal Services Este escenario de enlace de informes se aplica a informes a los que se accede desde el nodo del servidor de Crystal Services en el Explorador de servidores. Esta sección examina el subnodo Archivos de servidor de Crystal Services, dentro de Visual Studio .NET 2003. [NOMBRE_DE_SERVIDOR] ● Crystal Reports ○ Archivos de servidor Descripción El subnodo Archivos de servidor accede y muestra informes que se han expuesto como servicios Web de informes desde un directorio de archivos local. Estos informes se exponen mediante el protocolo de los servicios Web de informes. En Visual Studio .NET 2003, para acceder a Archivos de servidor, haga clic en el nodo Archivos de servidor, en Crystal Services. Ventajas ● Acceso centralizado a los informes: proporciona un solo punto de acceso a todos los informes del directorio de informes de muestra, que crea un repositorio de informes eficaz en la unidad de disco duro local. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 179 Desventajas ● Se ha sustituido en SAP Crystal Reports 9 y 10 por un nodo de Crystal Services de RAS no administrado. Vea la sección Descripción anterior para obtener más detalles. ● Modelo de objetos limitado: este escenario de enlace proporciona sólo el modelo de objetos limitado que forma parte de CrystalReportViewer. Configurar Archivos de servidor Los archivos de servidor se proporcionan como un nodo de Crystal Services en SAP Crystal Reports para Visual Studio 2003. Si SAP Crystal Reports 9 o 10 (versiones completas) se instalan encima de la versión suministrada con Visual Studio 2003, el nodo Archivos de servidor deja de ser visible. Archivos de servidor es compatible con el SDK de todas las ediciones de SAP Crystal Reports Developer. Sin embargo, es necesaria la codificación manual para trabajar con Archivos de servidor en dicha versión. Información relacionada Configurar Archivos de servidor en Crystal Services [página 84] Enlazar a Crystal Enterprise (VS .NET 2003) [página 183] Utilizar Crystal Services [página 83] 1.4.5.3.1.5.1.1 Para instalar Crystal Services Requisitos previos Debe tener instalado SAP Crystal Reports para Visual Studio 2003. Contexto Crystal Services no se instala de forma predeterminada durante la instalación de Visual Studio .NET 2003. En este procedimiento instalará Crystal Services desde el CD de instalación de Visual Studio .Net 2003. Procedimiento 1. 180 En el CD de instalación de Microsoft Visual Studio .NET, busque Crystal Reports. © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 2. Seleccione los servicios Web de Crystal. 3. Haga clic en el botón Actualizar. 1.4.5.3.1.5.1.2 Para utilizar el nodo Crystal Services>Archivos de servidor Requisitos previos ● SAP Crystal Reports para Visual Studio 2003 está instalado y funciona correctamente. ● O SAP Crystal Reports 9 o posterior está instalado y funciona correctamente. Nota En SAP Crystal Reports 9 y 10, se ha sustituido Archivos de servidor (ya no se muestra como nodo bajo Crystal Services). Sin embargo, lo puede seguir codificando manualmente. Nota Este procedimiento sólo funciona con un proyecto creado a partir de la Configuración de proyectos [página 14]. La configuración de proyectos contiene referencias específicas a espacios de nombres y configuración de códigos necesarios para este procedimiento, que no se podrá completar sin dicha configuración. Procedimiento 1. En el menú Ver, haga clic en Otras ventanas y, a continuación, en Explorador de servidores. 2. Expanda Crystal Services y, a continuación, expanda Archivos de servidor. 3. Seleccione un informe del árbol de Archivos de servidor y arrástrelo al formulario. Nota Cuando se coloca un informe de Archivos de servidor en el formulario, se agrega una instancia de la clase ServerFileReport a la región de código generado por el diseñador del formulario. Cuando se crea una instancia de las clases que heredan de System.ComponentModel.Component (como ServerFileReport) y se configura en la región de código generado por el diseñador, aparece un icono de esta clase en la parte inferior del formulario de la vista Diseño. En la parte inferior de la vista Diseño del formulario, aparece un objeto serverFileReport1. 4. Cambie a la vista de código y abra la región de código generado por el Diseñador de Web Forms o Windows Forms. Se ha creado una instancia de la clase ServerFileReport y se ha configurado en esta región. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 181 5. En el método ConfigureCrystalReports() (creado en Configuración de proyectos), asigne la instancia de ServerFileReport a la propiedad ReportSource del control CrystalReportViewer. myCrystalReportViewer.ReportSource = serverFileReport1 crystalReportViewer.ReportSource = serverFileReport1; Pasos siguientes Para ver el informe, cree y ejecute el proyecto. 1.4.5.3.1.5.1.3 manualmente Para codificar Archivos de servidor Requisitos previos ● SAP Crystal Reports para Visual Studio 2003 está instalado y funciona correctamente. ● O SAP Crystal Reports 9 o posterior está instalado y funciona correctamente. Nota En SAP Crystal Reports 9 y 10, se ha sustituido Archivos de servidor (ya no se muestra como nodo bajo Crystal Services). Sin embargo, lo puede seguir codificando manualmente. Nota Este procedimiento sólo funciona con un proyecto creado a partir de la Configuración de proyectos [página 14]. La configuración de proyectos contiene referencias específicas a espacios de nombres y configuración de códigos necesarios para este procedimiento, que no se podrá completar sin dicha configuración. Procedimiento 1. En el método ConfigureCrystalReports() (que ha creado en Configuración de proyectos), declare una instancia de ServerFileReport. Dim myServerFileReport As CrystalDecisions.Shared.ServerFileReport = _ New CrystalDecisions.Shared.ServerFileReport() CrystalDecisions.Shared.ServerFileReport serverFileReport = new CrystalDecisions.Shared.ServerFileReport(); 182 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 2. Establezca el valor de la propiedad ObjectType de ServerFileReport en REPORT. myServerFileReport.ObjectType = CrystalDecisions. [Shared].EnumServerFileType.REPORT serverFileReport.ObjectType = CrystalDecisions.Shared.EnumServerFileType.REPORT; 3. Establezca el valor de la propiedad ReportPath de ServerFileReport en el informe y en su subdirectorio. myServerFileReport.ReportPath = "\General Business\World Sales Report.rpt" serverFileReport.ReportPath = "\\General Business\\World Sales Report.rpt"; 4. Establezca el valor de la propiedad WebServiceURL de ServerFileReport en el directorio virtual del visor para la versión instalada de SAP Crystal Reports. Nota En este código de ejemplo, el directorio virtual de visores está configurado para SAP Crystal Reports 10. myServerFileReport.WebServiceUrl = "http://localhost/crystalreportviewers10/ ServerFileReportService.asmx" serverFileReport.WebServiceUrl = "http://localhost/crystalreportviewers10/ ServerFileReportService.asmx"; 5. Establezca el valor de la propiedad ReportSource del control CrystalReportViewer en la instancia de ServerFileReport. myCrystalReportViewer.ReportSource = myServerFileReport crystalReportViewer.ReportSource = serverFileReport1; 1.4.5.3.1.5.2 Enlazar a Crystal Enterprise (VS .NET 2003) Este escenario de enlace se refiere a la tecnología utilizada en versiones anteriores y está destinado a los usuarios que tienen instalada una versión de Crystal Enterprise. Crystal Enterprise ha sido reemplazado por SAP Crystal Reports Server y la plataforma SAP BusinessObjects Business Intelligence. Modelo de objetos Este caso de enlace de informes utiliza CrystalReportViewer (vea Enlazar informes al modelo de objetos CrystalReportViewer [página 169]). Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 183 Ubicación de los informes El informe se encuentra en Web Component Server (servidor WCS) en Crystal Enterprise 8, 8.5, 9 o 10. Los informes del servidor WCS se muestran como servicios Web de informes a través del servicio Web EnterpriseReportService.asmx. Este servicio Web está situado en el directorio virtual de visores de Web Component Server. Información general sobre Crystal Services Este escenario de enlace de informes se aplica a informes a los que se accede desde el nodo del servidor de Crystal Services en el Explorador de servidores. Esta sección examina el subnodo Crystal Enterprise de Crystal Services, dentro de Visual Studio .NET 2003. [NOMBRE_DE_SERVIDOR] ● Crystal Reports ○ Crystal Enterprise Descripción El subnodo Crystal Enterprise accede y muestra informes que se han expuesto como servicios Web de informes desde un servidor WCS. Para que el subnodo Crystal Enterprise acceda a informes y muestre una lista de ellos correctamente desde el servidor WCS de Crystal Enterprise, se deben cumplir las siguientes condiciones: ● El servidor que vea actualmente en el Explorador de servidor tiene que ejecutar Crystal Enterprise 8 o 8.5. Nota Deberá actualizar SAP Crystal Reports para Visual Studio 2003 a SAP Crystal Reports Developer (versión 9 o superior) si desea conectar a Crystal Enterprise 9 o posterior. ● El servidor WCS (Web Component Server) de Crystal Enterprise tiene que estar instalado en el servidor de Crystal Enterprise. Nota El servidor WCS se instala de forma predeterminada en Crystal Enterprise 9 y 10. En Crystal Enterprise 8 y 8.5, el servidor WCS se debe instalar por separado. ● 184 Para configurar los servicios Web de informes en el servidor de Crystal Enterprise 10, deberá instalar Visual Studio .NET 2003 en el servidor de Crystal Enterprise y, a continuación, ejecutar la instalación personalizada para agregar Crystal Services específicamente. Si el administrador de Crystal Enterprise no desea instalar una versión completa de Visual Studio .NET 2003 en el servidor de Crystal Enterprise, en su lugar, se puede hacer lo siguiente: © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net ○ Instalar el módulo de combinación managed.msm. ○ Localizar el directorio virtual de visores instalado en el equipo de desarrollo y copiar el archivo EnterpriseReportService.asmx de dicho directorio y pegarlo en el directorio virtual de visores del equipo servidor. Una vez que los informes se muestren correctamente en Crystal Services, elija un informe, arrástrelo y suéltelo en el formulario Web Forms o Windows Forms. Al colocar en el formulario el informe, éste se engloba en una clase contenedora de informe y, a continuación, se muestra como una instancia de informe en la bandeja de componentes. Nota Existen varios tipos diferentes de clases contenedoras de informe, dependiendo del origen del informe en el servidor y del protocolo de conexión. Éstos varían en función de las distintas versiones de SAP Crystal Reports. Instalar Crystal Services Crystal Services no se instala de forma predeterminada durante la instalación de Visual Studio .NET 2003. Para agregar Crystal Services, cargue el CD de instalación de Microsoft Visual Studio .NET, busque Crystal Reports, seleccione Servicios Web de Crystal y haga clic en el botón de actualización. Ventajas ● Fácil acceso a los informes de Crystal Enterprise desde una aplicación Web o para Windows. Desventajas ● Modelo de objetos limitado: este escenario de enlace proporciona sólo el modelo de objetos limitado que forma parte del control CrystalReportViewer. Nota En SAP Crystal Reports 9 y 10, Crystal Services se actualiza a una clase contenedora y un protocolo de conexión diferentes. Información relacionada Directorio de visores [página 13] Utilizar Crystal Services [página 83] Enlazar a Archivos de servidor (Visual Studio 2005 y posterior) [página 187] Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 185 1.4.5.3.1.5.2.1 Para acceder a Crystal Services>Crystal Enterprise en el Explorador de servidores Procedimiento 1. En el menú Ver, haga clic en Otras ventanas y en Explorador de servidores. 2. Si su servidor de Crystal Enterprise se encuentra en un equipo que no es el local (recomendado): a) Haga clic con el botón secundario en Servidores y haga clic en Agregar servidor... b) En el cuadro de diálogo Agregar servidor, en el campo Equipos, escriba el nombre de red del servidor Crystal Enterprise y, a continuación, haga clic en Aceptar. c) Dentro del nodo Servidores, expanda el subnodo del nuevo servidor agregado y, dentro de él, expanda el subnodo Crystal Services. d) En el cuadro de diálogo Inicio de sesión de Enterprise, rellene los campos Nombre de usuario y Contraseña, y, a continuación, haga clic en Aceptar. 3. Si su servidor de Crystal Enterprise se encuentra en el equipo local: a) Dentro del nodo Servidores, expanda el subnodo de su equipo local y, dentro de él, expanda el subnodo Crystal Services. b) En el cuadro de diálogo Inicio de sesión de Enterprise, rellene los campos Nombre de usuario y Contraseña, y, a continuación, haga clic en Aceptar. Resultados Ahora ya podrá configurar Crystal Services>Crystal Enterprise en su proyecto Web o Windows. 1.4.5.3.1.5.2.2 Para configurar un informe de Crystal Services>Crystal Enterprise Requisitos previos Este procedimiento sólo funciona con un proyecto creado a partir de la Configuración de proyectos [página 14]. La configuración de proyectos contiene referencias específicas a espacios de nombres y configuración de códigos necesarios para este procedimiento, que no se podrá completar sin dicha configuración. Procedimiento 1. 186 Seleccione un informe en el subnodo Crystal Enterprise y arrástrelo al formulario Web Forms o Windows Forms. En la parte inferior del formulario, en la bandeja de componentes, aparecerá un objeto enterpriseReport1. © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 2. Cambie a la vista de código y abra la región de código generado por el Diseñador de Web Forms o Windows Forms. Nota Se ha creado una instancia de la clase EnterpriseReport y se ha configurado en esta región. 3. En el método ConfigureCrystalReports() (que ha creado en Configuración de proyectos [página 14]), asigne la instancia de EnterpriseReport a la propiedad ReportSource del control CrystalReportViewer. myCrystalReportViewer.ReportSource = enterpriseReport1 crystalReportViewer.ReportSource = enterpriseReport1; 4. Para ver el informe, cree y ejecute el proyecto. 1.4.5.3.1.5.3 Enlazar a Archivos de servidor (Visual Studio 2005 y posterior) Modelo de objetos Este escenario de vinculación de informes usa el modelo de objeto CrystalReportViewer. Ubicación de los informes Los informes están en una carpeta de informes del directorio de archivos local. Los informes de esta ubicación se exponen como servicios Web de informes. Información general de Archivos de servidor Este escenario de enlace de informes se aplica a los informes a los que se accede como archivo de servidor a través de un servicio Web. Descripción El servicio Web de archivos de servidor accede y muestra informes que se han expuesto como servicios Web de informes desde el directorio de archivos local. En Visual Studio 2005 y posterior, se accede a Archivos de servidor mediante programación. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 187 Ventajas ● Acceso centralizado a los informes: proporciona un solo punto de acceso a todos los informes del directorio de informes de muestra, que crea un repositorio de informes eficaz en la unidad de disco duro local. Desventajas ● Modelo de objetos limitado: este escenario de enlace proporciona sólo el modelo de objetos limitado que forma parte de CrystalReportViewer. Configurar Archivos de servidor En SAP Crystal Reports, versión para programadores de Microsoft Visual Studio, se accede a Archivos de servidor mediante programación. Archivos de servidor es compatible mediante programación con el SDK de todas las ediciones de SAP Crystal Reports Developer. Información relacionada Configurar archivos de servidor en Visual Studio 2005 y posterior [página 87] 1.4.5.3.1.5.3.1 manualmente Para codificar Archivos de servidor Requisitos previos ● Un servicio Web de informes que permita el acceso a Archivos de servidor mediante programación, que esté bien configurado y que funcione correctamente. ● O que SAP Crystal Reports Developer está instalado y funciona correctamente. Nota Este procedimiento sólo funciona con un proyecto creado a partir de la Configuración de proyectos [página 14]. La configuración de proyectos contiene referencias específicas a espacios de nombres y configuración de códigos necesarios para este procedimiento, que no se podrá completar sin dicha configuración. 188 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Procedimiento 1. En el método ConfigureCrystalReports() (que ha creado en Configuración de proyectos [página 14]), declare una instancia de ServerFileReport. Dim myServerFileReport As CrystalDecisions.Shared.ServerFileReport = _New CrystalDecisions.Shared.ServerFileReport() CrystalDecisions.Shared.ServerFileReport serverFileReport = new CrystalDecisions.Shared.ServerFileReport(); 2. Establezca el valor de la propiedad ObjectType de ServerFileReport en REPORT. myServerFileReport.ObjectType = CrystalDecisions. [Shared].EnumServerFileType.REPORT serverFileReport.ObjectType = CrystalDecisions.Shared.EnumServerFileType.REPORT; 3. Establezca el valor de la propiedad ReportPath de ServerFileReport en el informe y el subdirectorio correspondiente. myServerFileReport.ReportPath = "\General Business\World Sales Report.rpt" serverFileReport.ReportPath = "\\General Business\\World Sales Report.rpt"; 4. Establezca el valor de la propiedad WebServiceURL de ServerFileReport en la ubicación del servicio Web de informes. Si tiene instalado SAP Crystal Reports Developer, este será el directorio virtual del visor para la versión instalada de SAP Crystal Reports, vea Directorio de visores [página 13]. Si no tiene instalado SAP Crystal Reports Developer, este será la dirección URL en el servicio Web de informes que ha creado en Configurar archivos de servidor en Visual Studio 2005 y posterior [página 87]. Nota En el siguiente código, el directorio virtual de visores está configurado para SAP Crystal Reports para Visual Studio 2005. myServerFileReport.WebServiceUrl = "http://localhost/CrystalReportsWebServices2005/ServerFileReportService.asmx" serverFileReport.WebServiceUrl = "http://localhost/CrystalReportsWebServices2005/ServerFileReportService.asmx"; Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 189 5. Establezca el valor de la propiedad ReportSource del control CrystalReportViewer en la instancia de ServerFileReport. myCrystalReportViewer.ReportSource = myServerFileReport crystalReportViewer.ReportSource = serverFileReport1; 1.4.5.3.1.5.4 Enlazar a SAP Crystal Reports Server o la plataforma SAP BusinessObjects Business Intelligence (Visual Studio) Modelo de objetos Este caso de enlace de informes utiliza CrystalReportViewer (vea Enlazar informes al modelo de objetos CrystalReportViewer [página 169]). Ubicación de los informes El informe se encuentra en el Web Component Server (servidor WCS) en SAP Crystal Reports Server o la plataforma SAP BusinessObjects Business Intelligence. Los informes del servidor WCS se muestran como servicios Web de informes a través del servicio Web EnterpriseReportService.asmx. Este servicio Web está situado en el directorio virtual de visores de Web Component Server. Información general sobre Crystal Services Este escenario de enlace de informes se aplica a informes a los que se accede desde el nodo del servidor de Crystal Services en el Explorador de servidores. En esta sección se examina el subnodo SAP Crystal Reports Services de Crystal Services, dentro de Visual Studio. [NOMBRE_DE_SERVIDOR] ● SAP Crystal Reports Services ○ 190 Server Reports © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Descripción El subnodo de la plataforma SAP BusinessObjects Business Intelligence accede a los informes que se han expuesto como servicios Web de informes de un servidor WCS de la plataforma SAP BusinessObjects Business Intelligence. Para que el subnodo de la plataforma SAP BusinessObjects Business Intelligence acceda a una lista de informes desde el servidor WCS de la plataforma SAP BusinessObjects Business Intelligence y la muestre correctamente, se deben cumplir las siguientes condiciones: ● El servidor que se ve actualmente en el explorador de servidores está ejecutando la plataforma SAP BusinessObjects Business Intelligence. ● Para configurar los servicios web de informes en la plataforma SAP BusinessObjects Business Intelligence, instale Visual Studio en el servidor de la plataforma SAP BusinessObjects Business Intelligence y, a continuación, ejecute la instalación personalizada para agregar Crystal Services en concreto. Nota La instalación de Visual Studio en el servidor de la plataforma SAP BusinessObjects Business Intelligence, y la instalación personalizada de Crystal Services, son necesarias para que se instale y configure adecuadamente el archivo EnterpriseReportService.asmx en el directorio virtual de visores. Si el administrador de Crystal Enterprise no desea instalar una versión completa de Visual Studio en el servidor de la plataforma SAP BusinessObjects Business Intelligence, en su lugar se puede hacer lo siguiente: ○ Instalar el módulo de combinación managed.msm. ○ Localizar el directorio virtual de visores instalado en el equipo de desarrollo y copiar el archivo EnterpriseReportService.asmx de dicho directorio y pegarlo en el directorio virtual de visores del equipo servidor. Una vez que los informes se muestran correctamente en SAP BusinessObjects Services, puede enlazar un control CrystalReportsViewer a cualquiera de los informes de la lista. Para obtener más información, consulte la documentación sobre la plataforma SAP BusinessObjects Business Intelligence. Ventajas ● Fácil acceso a los informes de la plataforma SAP BusinessObjects Business Intelligence desde una aplicación web o de Windows. Desventajas ● Modelo de objetos limitado: este escenario de enlace proporciona sólo el modelo de objetos limitado que forma parte del control CrystalReportViewer. Nota En SAP Crystal Reports 9 y 10, Crystal Services se actualiza a una clase contenedora y un protocolo de conexión diferentes. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 191 Información relacionada Directorio de visores [página 13] Utilizar Crystal Services [página 83] Elegir el modelo de objetos correcto para el proyecto [página 31] 1.4.5.3.1.5.4.1 Para enlazar a una ruta de directorio de archivos mediante la ventana Propiedades Procedimiento 1. Cree un proyecto Web o Windows. 2. En el Cuadro de herramientas, arrastre un control CrystalReportViewer en Web Forms o Windows Forms. 3. Haga clic en el control CrystalReportViewer para seleccionarlo. 4. En la ventana Propiedades, asigne una ruta de acceso del directorio de archivos a la propiedad ReportSource. Nota La ruta de directorio de archivos lleva a los informes de muestra de Visual Studio 2005. Gracias a la función de vista previa en tiempo de diseño, el informe se muestra en el modo de vista previa. C:\Archivos de programa\Microsoft Visual Studio 8.0\Crystal Reports\Samples\Es \Reports\Feature Examples\Hierarchical Grouping.rpt 5. Para ver el informe, cree y ejecute el proyecto. 1.4.5.3.1.6 Enlazar a ReportSource (SAP Crystal Reports Server o SAP BusinessObjects Enterprise 11) Nota Esta página describe una funcionalidad que no está disponible en SAP Crystal Reports, versión para programadores de Microsoft Visual Studio, pero sí lo está en las versiones actualizadas. Modelo de objetos Este escenario de enlace de informes usa el modelo de objeto CrystalReportViewer. 192 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Ubicación de los informes Se obtiene acceso a los informes desde el servidor de páginas de la plataforma SAP BusinessObjects Business Intelligence. Descripción SAP Crystal Reports Server o la plataforma SAP BusinessObjects Business Intelligence permite la distribución de informes desde los servidores de un entorno de Enterprise. Un informe almacenado en SAP Crystal Reports Server o la plataforma SAP BusinessObjects Business Intelligence se puede mostrar en distintos servidores a horas diferentes, según su finalidad. En SAP Crystal Reports Server o la plataforma SAP BusinessObjects Business Intelligence, si desea mostrar un informe con el mejor rendimiento posible y no precisa realizar modificaciones importantes mediante programación, muestre el informe directamente desde el servidor de páginas con la clase ReportSource. La clase ReportSource no está asociada a ningún modelo de objetos. Si desea modificar los parámetros o la configuración de base de datos, puede utilizar el modelo de objetos limitado proporcionado con el control CrystalReportViewer. Sin embargo, para una interacción con el informe mediante programación más compleja, use uno de los demás escenarios de enlace de informes de SAP Crystal Reports Server o la plataforma SAP BusinessObjects Business Intelligence. Nota Para obtener una comparación de los diversos escenarios que usan varios servidores en SAP Crystal Reports Server o la plataforma SAP BusinessObjects Business Intelligence, vea los escenarios de enlace recomendados para SAP Crystal Reports Server o la plataforma SAP BusinessObjects Business Intelligence en Escenarios de enlace de informes [página 168]. Es posible que deba ajustar la configuración del servidor de seguridad para poder acceder al CMS de la plataforma SAP BusinessObjects Business Intelligence. El puerto predeterminado del CMS es 6400. Póngase en contacto con el administrador del sistema para obtener más información sobre la configuración de la dirección de red y el puerto del sistema de plataforma SAP BusinessObjects Business Intelligence. Puede encontrar más información sobre la personalización de puertos en el Manual del administrador de la plataforma SAP BusinessObjects Business Intelligence. Ventajas ● Más rápido: proporciona el mejor rendimiento para mostrar un informe de SAP Crystal Reports Server o la plataforma SAP BusinessObjects Business Intelligence. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 193 Desventajas ● Modelo de objetos limitado: la modificación mediante programación del inicio de sesión o la configuración de parámetros de la base de datos está limitada al modelo de objetos CrystalReportViewer. ● Disponibilidad limitada: este escenario sólo está disponible en Crystal Enterprise 10, SAP Crystal Reports Server o SAP BusinessObjects Enterprise XI. Información relacionada Enlazar informes al modelo de objetos ReportDocument [página 198] 1.4.5.3.1.6.1 Para enlazar el control CrystalReportViewer a un informe que se atiende fuera del servidor de páginas de SAP Crystal Reports Server o la plataforma SAP BusinessObjects Business Intelligence Requisitos previos ● SAP Crystal Reports Server o la plataforma SAP BusinessObjects Business Intelligence está instalado y funcionando. ● El SDK de SAP Crystal Reports Server o la plataforma SAP BusinessObjects Business Intelligence (incluidos los ensamblados .NET) está instalado y funcionando. Nota Si ha instalado SAP Crystal Reports Server o la plataforma SAP BusinessObjects Business Intelligence en el equipo de desarrollo, el SDK se incluye en la instalación. Procedimiento 1. Busque y escriba el nombre de un servidor de SAP Crystal Reports Server o de la plataforma SAP BusinessObjects Business Intelligence. Para este ejemplo, el nombre del servidor es " BOE01". a) Para buscar el nombre del servidor, haga clic con el botón secundario en el icono Mi PC y, a continuación, seleccione Propiedades. b) En el cuadro de diálogo Propiedades del sistema, haga clic en la ficha Identificación de la red. c) El nombre del equipo se encuentra en el campo "Nombre completo de equipo". 2. 194 Use el asistente de publicación para publicar el archivo Chart.rpt en el servidor de SAP Crystal Reports Server o la plataforma SAP BusinessObjects Business Intelligence. © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Nota Para saber cómo usar el asistente de publicación, vea la documentación del usuario de SAP Crystal Reports Server o la plataforma SAP BusinessObjects Business Intelligence. 3. 4. Agregue las siguientes referencias de ensamblados al proyecto. ○ CrystalDecisions.Enterprise.Framework ○ CrystalDecisions.Enterprise.InfoStore ○ CrystalDecisions.Enterprise.Viewing.ReportSource ○ CrystalDecisions.ReportAppServer.Controllers En el menú Ver, haga clic en Código para ver la clase de código subyacente de Web Forms o Windows Forms. Sobre la clase, agregue una instrucción "Imports" [Visual Basic] o "using" [C#] para el espacio de nombres CrystalDecisions.Enterprise. Imports CrystalDecisions.Enterprise Imports CrystalDecisions.Enterprise.Viewing Imports CrystalDecisions.ReportAppServer.Controllers using CrystalDecisions.Enterprise; using CrystalDecisions.Enterprise.Viewing; using CrystalDecisions.ReportAppServer.Controllers; 1.4.5.3.1.6.2 Para iniciar sesión en SAP Crystal Reports Server o SAP BusinessObjects Enterprise Procedimiento 1. En el método ConfigureCrystalReports() (creado en Configuración de proyectos [página 14]), declare una variable de cadena serverName y establezca su valor en el nombre del servidor SAP Crystal Reports Server o SAP BusinessObjects Enterprise. Dim serverName As String = "BOE01" string serverName = "BOE01"; 2. Declare y cree una instancia de la clase SessionMgr. Dim mySessionMgr As SessionMgr = New SessionMgr() SessionMgr sessionMgr = new SessionMgr(); Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 195 3. Pase el nombre de usuario (Administrador), la contraseña (en blanco), la variable serverName y el tipo de inicio de sesión (secEnterprise) al método Logon de la instancia SessionMgr y recupérela como instancia de EnterpriseSession. Dim myEnterpriseSession As EnterpriseSession = mySessionMgr.Logon( _ "Administrator", "", serverName, "secEnterprise") EnterpriseSession enterpriseSession = sessionMgr.Logon( "Administrator", "", serverName, "secEnterprise"); 4. Recupere el servicio InfoStore (como EnterpriseService), desde el método GetService de EnterpriseSession. Dim myEnterpriseService As EnterpriseService = _ myEnterpriseSession.GetService("InfoStore") EnterpriseService enterpriseService = enterpriseSession.GetService("InfoStore"); 5. Declare y cree una instancia de InfoStore y pase EnterpriseService recuperado como parámetro a InfoStore. Dim myInfoStore As InfoStore = New InfoStore(myEnterpriseService) InfoStore infoStore = new InfoStore(enterpriseService); 1.4.5.3.1.6.3 Para recuperar el informe Hierarchical Grouping de SAP Crystal Reports Server o SAP BusinessObjects Enterprise Procedimiento 1. Para volver a asignar el valor de la instancia de EnterpriseService al servicio de fábrica de informes de Page Server, pase la cadena "PSReportFactory" al método GetService() de EnterpriseService. myEnterpriseService = myEnterpriseSession.GetService("PSReportFactory") enterpriseService = enterpriseSession.GetService("PSReportFactory"); 2. Devuelva la propiedad Interface a EnterpriseService como variable de objeto. Dim psrfObject As Object = myEnterpriseService.Interface Object psrfObject = enterpriseService.Interface; 3. Proyecte la variable de objeto a una instancia de PSReportFactory. Dim myPSReportFactory As PSReportFactory = CType(psrfObject, PSReportFactory) 196 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net PSReportFactory psReportFactory = (PSReportFactory)psrfObject; 4. Introduzca la siguiente cadena de consulta para realizar una consulta sobre el informe en SAP Crystal Reports Server o SAP BusinessObjects Enterprise. Dim queryString As String = "Select SI_ID, SI_NAME, SI_PARENTID From CI_INFOOBJECTS " _ & "Where SI_PROGID='CrystalEnterprise.Report' " _ & "And SI_NAME Like 'Chart'" string queryString = "Select SI_ID, SI_NAME, SI_PARENTID From CI_INFOOBJECTS " + "Where SI_PROGID='CrystalEnterprise.Report' " + "And SI_NAME Like 'Chart'"; 5. Pase la cadena de consulta al método Query de InfoStore, para recuperar una clase indizada InfoObjects con el resultado de la consulta. Dim myInfoObjects As InfoObjects = myInfoStore.Query(queryString) InfoObjects infoObjects = infoStore.Query(queryString); 6. Recupere InfoObject desde la primera columna de la clase indizada InfoObjects. Dim myInfoObject As InfoObject = myInfoObjects(1) InfoObject infoObject = infoObjects[1]; 7. Declare y llene una instancia de ReportSource desde el método OpenReportSource() de la instancia de PSReportFactory, pasando la propiedad ID de InfoObject. Dim myReportSource As ReportSource = myPSReportFactory.OpenReportSource(myInfoObject.ID) ReportSource reportSource = psReportFactory.OpenReportSource(infoObject.ID); 8. Enlace la instancia de ReportSource a la propiedad ReportSource del control CrystalReportViewer. myCrystalReportViewer.ReportSource = myReportSource crystalReportViewer.ReportSource = reportSource; 9. Para ver el informe, cree y ejecute el proyecto. El informe ahora se muestra desde el servidor de páginas en SAP Crystal Reports Server o SAP BusinessObjects Enterprise, según su ID. Si utiliza un método alternativo para tener acceso al Id. de informe (por ejemplo, eligiendo el Id. de la lista de un control DropDownList), no tendrá que consultar InfoStore ni generar ningún InfoObject para recuperar el Id. de informe. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 197 1.4.5.3.2 Enlazar informes al modelo de objetos ReportDocument El modelo de objetos ReportDocument es el modelo de objetos más eficaz y completo que se proporciona con SAP Crystal Reports, versión para programadores de Microsoft Visual Studio. Es el modelo de objetos que se prefiere usar para desarrollar un proyecto con SAP Crystal Reports, versión para programadores de Microsoft Visual Studio. 1.4.5.3.2.1 Enlazar a una clase de informe incrustado Modelo de objetos Este escenario de enlace de informes usa el modelo de objeto ReportDocument. Ubicación de los informes Los informes se incrustan en el proyecto. Nota En las versiones anteriores de esta documentación se hacía referencia a los informes incrustados como "con tipos declarados". El término principal que se usa ahora para hacer referencia a un informe que se agrega o importa a un proyecto de Visual Studio es "incrustado". Descripción En este caso, un informe se incrusta en el proyecto. Para incrustar un informe, puede crear un nuevo informe con SAP Crystal Reports Designer incrustado (que se encuentra en Visual Studio) o importar un informe existente en el proyecto. Cuando se crea o importa el informe, se genera automáticamente una clase contenedora de informe para representarlo. El nombre de esta clase contenedora es el mismo que el del informe. Se deriva de la clase base ReportDocument y, por tanto, hereda todas las propiedades y los métodos de ReportDocument, que lo incluye en su modelo de objetos. Ventajas ● Seguridad agregada: El informe se incrusta y, por tanto, se distribuye como parte de la aplicación. ● Amplia interacción mediante programa: proporciona acceso al potente modelo de objetos ReportDocument. 198 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net ● Seguridad agregada: proporciona el tipo de acceso más controlado a los orígenes de datos. ● Más utilizado: la mayoría de los programadores consideran que es el que tiene más ventajas. Desventajas ● Mantenimiento agregado: los cambios en los informes implican la necesidad de compilar y redistribuir la aplicación de nuevo. 1.4.5.3.2.1.1 Para enlazar a una clase de informe incrustado Contexto Cuando se crea o importa un informe, se genera automáticamente una clase contenedora de informes para representarlo. El nombre de esta clase contenedora es el mismo que el del informe. Se deriva de la clase base ReportDocument y, por tanto, hereda todas las propiedades y los métodos de ReportDocument, que lo incluye en su modelo de objetos. Procedimiento 1. Agregue un control CrystalReportViewer al formulario de Windows Forms. Nota Todas las versiones de SAP Crystal Reports admiten el enlace a una clase de informe incrustado para aplicaciones de Windows. Algunas configuraciones ofrecen compatibilidad con este escenario de enlace para sitios web a través de un proveedor de compilación mejorada. 2. Agregue un informe al proyecto. De este modo se genera automáticamente una clase contenedora de informe con el mismo nombre que el informe. 3. Cree una instancia de la clase contenedora de informe. Dim myReport As New QuarterlySalesReport() QuarterlySalesReport myReport = new QuarterlySalesReport(); 4. Asígnela a la propiedad ReportSource del control CrystalReportViewer. myCrystalReportViewer.ReportSource = myReport crystalReportViewer.ReportSource = myReport; Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 199 1.4.5.3.2.2 Enlazar a una clase de informe no incrustado cargado en ReportDocument Modelo de objetos Este escenario de enlace de informes usa el modelo de objeto ReportDocument. Ubicación de los informes Los informes se encuentran en el directorio de archivos. Descripción Este escenario de enlace de informes permite utilizar el modelo de objetos ReportDocument más eficaz con informes no incrustados; es decir, informes externos al proyecto. En Enlazar a una ruta de directorio de archivos en el código [página 170], establezca el enlace a los informes mediante las rutas de acceso a los directorios de archivos; pero en vez de enlazar las rutas directamente al visor, páselas al método ReportDocument.Load(). De esta forma, podrá utilizar el modelo de objetos ReportDocument. Además, puesto que cada informe externo se carga en la clase común ReportDocument, puede desarrollar un proceso de selección de informes que comparta el código de enlace de informes común para todos los informes. Ventajas ● Bajo mantenimiento: los informes se pueden agregar, quitar o modificar sin volver a compilar la aplicación. ● Amplia interacción mediante programación: proporciona acceso al potente modelo de objetos ReportDocument. ● Menos codificación gracias al uso compartido de código: los informes pueden compartir código, ya que todos ellos se cargan en la clase común ReportDocument. Desventajas ● Distribución limitada: los informes deben estar en el mismo equipo que la aplicación. (Normalmente se restringe el acceso desde la cuenta de usuario ASPNET del servidor Web al resto de los servidores de la red.) ● Esfuerzo de implementación agregado: los informes se deben distribuir junto con la aplicación en la ruta relativa correcta. 200 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net ● Origen de informe menos seguro: existe el peligro de que los informes se cambien de ubicación o se quiten del equipo de implementación en tiempo de ejecución. 1.4.5.3.2.2.1 Para enlazar a u informe no incrustado mediante el objeto de modelos ReportDocument Requisitos previos Nota Este procedimiento sólo funciona con un proyecto creado a partir de la Configuración de proyectos [página 14]. La configuración de proyectos contiene referencias específicas a espacios de nombres y configuración de códigos necesarios para este procedimiento, que no se podrá completar sin dicha configuración. Procedimiento 1. Agregue un enunciado "Imports" [Visual Basic] o "using" [C#] al principio de la clase para el espacio de nombres CrystalDecisions.CrystalReports.Engine. Nota Es necesario declarar este espacio de nombres para tener acceso a la clase ReportDocument sin ningún prefijo de espacio de nombres. Imports CrystalDecisions.CrystalReports.Engine using CrystalDecisions.CrystalReports.Engine; 2. Busque el archivo World Sales Report.rpt en el subdirectorio General Business de su versión de SAP Crystal Reports. 3. Copie la ruta de directorio de archivos completa al Portapapeles, incluido World Sales Report.rpt. 4. En el método ConfigureCrystalReports() (creado en Configuración de proyectos [página 14]), declare una variable de cadena reportPath y asigne una cadena que contenga la ruta de directorio de archivos de World Sales Report copiado en el paso anterior. Dim reportPath As String = _ "C:\Archivos de programa\Microsoft Visual Studio 9.0\" _ & "Crystal Reports \Samples\Es\Reports\General Business\" _ & "World Sales Report.rpt" string reportPath = "C:\\Archivos de programa\\Microsoft Visual Studio 9.0\\" + "Crystal Reports\ \Samples\\Es\\Reports\\General Business\\" + "World Sales Report.rpt"; Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 201 5. Debajo de la declaración de cadena, declare una instancia de ReportDocument. Dim myReportDocument As ReportDocument = New ReportDocument() ReportDocument reportDocument = new ReportDocument(); 6. Cargue la variable de cadena que contiene la ruta de directorio de archivos, a la clase de informe no incrustado de ReportDocument. myReportDocument.Load(reportPath) reportDocument.Load(reportPath); 7. Asigne la instancia de ReportDocument (que ya contiene el informe no incrustado cargado) a la propiedad ReportSource del control CrystalReportViewer. myCrystalReportViewer.ReportSource = myReportDocument crystalReportViewer.ReportSource = reportDocument; 8. Para ver el informe, cree y ejecute el proyecto. 1.4.5.3.2.3 Enlazar a una clase de informe incrustado almacenado en caché Modelo de objetos Este escenario de enlace de informes usa el modelo de objeto ReportDocument. Ubicación de los informes Los informes se incrustan en el proyecto. Descripción Cuando se incrusta un informe en un proyecto de Visual Studio, se genera automáticamente una clase contenedora de informes que representa el archivo del informe en el proyecto. Al mismo tiempo, se genera automáticamente una clase de utilidad de administración de caché para ese informe. 202 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net En este caso, enlace el control CrystalReportViewer a la clase de utilidad de administración de caché, para que se administre automáticamente el almacenamiento en caché en el objeto ASP.NET Cache. Uso del almacenamiento en caché El almacenamiento en caché tiene un uso específico y limitado, que puede consumir demasiados recursos del sistema si no se administra con cuidado. Almacenamiento en caché de informes no incrustados Si desea administrar el almacenamiento en caché de informes no incrustados, debe crear su propia clase de utilidad de administración de caché. Para obtener más información, vea Enlazar a un informe no incrustado cargado en una clase de utilidad de administración de caché [página 205]. Ventajas ● Compartibilidad: es ideal para almacenar informes con compartibilidad alta y pocas permutaciones en los parámetros o en la información de inicio de sesión. ● Optimiza el acceso a los datos: si los informes con compartibilidad alta son muy grandes, o tienen una consulta tan compleja que tarda varios minutos en recuperar la información, se puede tener acceso a los datos más rápidamente con la clase de utilidad d Desventajas ● Penalización de servidor: los informes que se conservan en el objeto ASP.NET Cache pueden sobrecargar los recursos de memoria del servidor. ● Problemas de persistencia: el caché tiene algunas dependencias que le permiten buscar los cambios de una instancia de informe y volver a almacenarla en caché. Sin embargo, si cambia la base de datos, la instancia del informe de Cache no se actualiza para mostrar ese cambio. ● Consume recursos: un informe con parámetros a los que se llama frecuentemente con distintas cadenas de parámetros (sobre todo si uno de esos parámetros es el id de usuario) implican un nuevo informe en caché cada vez. Este proceso consume los recursos del sistema. Si el informe no tiene compartibilidad alta, la instancia del mismo se debe asignar a un objeto Session. Información relacionada Cuándo utilizar informes normales o almacenados en caché [página 219] Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 203 Modelo de objetos ReportDocument [página 36] Session y persistencia del modelo de objetos ReportDocument [página 56] 1.4.5.3.2.3.1 Para enlazar a una clase de utilidad de administración de caché Requisitos previos Nota Este procedimiento sólo funciona con un proyecto creado a partir de la Configuración de proyectos [página 14]. La configuración de proyectos contiene referencias específicas a espacios de nombres y configuración de códigos necesarios para este procedimiento, que no se podrá completar sin dicha configuración. Procedimiento 1. En el método ConfigureCrystalReports() (creado en Configuración de proyectos [página 14]), elimine las líneas de código existentes para reemplazar la clase contenedora de informes por la clase de utilidad de administración de caché. 2. Cree una instancia de la clase de utilidad de administración de caché asociada con el informe Hierarchical Grouping.rpt. Dim cachedHierarchicalGroupingReport As CachedHierarchical_Grouping = New CachedHierarchical_Grouping() CachedHierarchical_Grouping cachedHierarchicalGroupingReport = new CachedHierarchical_Grouping(); 3. Pase la instancia de la utilidad de administración de caché al control CrystalReportViewer. myCrystalReportViewer.ReportSource = cachedHierarchicalGroupingReport crystalReportViewer.ReportSource = cachedHierarchicalGroupingReport; 4. 204 Para ver el informe, cree y ejecute el proyecto. © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 1.4.5.3.2.4 Enlazar a un informe no incrustado cargado en una clase de utilidad de administración de caché Modelo de objetos Este escenario de enlace de informes usa el modelo de objeto ReportDocument. Ubicación de los informes Los informes se encuentran en el directorio de archivos. Descripción Este caso de enlace de informes es parecido al siguiente caso de enlace de informes Enlazar a una clase de informe incrustado almacenado en caché [página 202]. La diferencia con este caso es que los informes no están incrustados. Para obtener más información sobre los informes no incrustados, vea Comparar informes incrustados y no incrustados [página 163]. SAP Crystal Reports, versión para programadores de Microsoft Visual Studio incluye dos funciones para facilitar el almacenamiento en caché de informes mediante el objeto ASP.NET Cache: ● Un marco de administración de caché de informes integrados, que reconoce los informes idénticos que tienen parámetros o credenciales de inicio de sesión únicos que requieren una clave única para cada instancia que se almacena en caché. ● Una interfaz, ICachedReport, que identifica las clases de utilidades de administración de almacenamiento en caché de informes en el marco de trabajo de la administración de almacenamiento en caché de informes. En Enlazar a una clase de informe incrustado almacenado en caché [página 202], obtuvo información sobre la clase Cached[nombre de informe] que se crea automáticamente cuando se incrusta un informe en el proyecto. Sin embargo, puede crear una clase de utilidad de administración de almacenamiento en caché que administre los informes no incrustados. Para obtener un ejemplo de código, vea la sección Implementación más adelante. Uso del almacenamiento en caché El almacenamiento en caché tiene un uso específico y limitado, que puede consumir demasiados recursos del sistema si no se administra con cuidado. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 205 Ventajas ● Compartibilidad: es ideal para almacenar informes con compartibilidad alta y pocas permutaciones en los parámetros o en la información de inicio de sesión. ● Optimiza el acceso a los datos: si los informes con compartibilidad alta son muy grandes, o tienen una consulta tan compleja que tarda varios minutos en recuperar la información, se puede tener acceso a los datos más rápidamente con la clase de utilidad d Desventajas ● Penalización de servidor: los informes que se conservan en el objeto ASP.NET Cache pueden sobrecargar los recursos de memoria del servidor. ● Problemas de persistencia: el caché tiene algunas dependencias que le permiten buscar los cambios de una instancia de informe y volver a almacenarla en caché. Sin embargo, si cambia la base de datos, la instancia del informe de Cache no se actualiza para mostrar ese cambio. ● Consume recursos: un informe con parámetros a los que se llama frecuentemente con distintas cadenas de parámetros (sobre todo si uno de esos parámetros es el id de usuario) implican un nuevo informe en caché cada vez. Este proceso consume los recursos del sistema. Si el informe no tiene compartibilidad alta, la instancia del mismo se debe asignar a un objeto Session. Información relacionada Enlazar con el componente ReportDocument [página 211] Modelo de objetos ReportDocument [página 36] Session y persistencia del modelo de objetos ReportDocument [página 56] 1.4.5.3.2.4.1 Para almacenar en caché y, a continuación, enlazar un informe no incrustado a un control CrystalReportViewer Requisitos previos Nota Este procedimiento sólo funciona con un proyecto creado a partir de la Configuración de proyectos [página 14]. La configuración de proyectos contiene referencias específicas a espacios de nombres y configuración de códigos necesarios para este procedimiento, que no se podrá completar sin dicha configuración. 206 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Procedimiento 1. Busque el archivo World Sales Report.rpt en el subdirectorio General Business. 2. Copie la ruta de directorio de archivos completa al Portapapeles, incluido World Sales Report.rpt. 3. En el método ConfigureCrystalReports() (creado en Configuración de proyectos [página 14]), declare una variable de cadena reportPath y asigne una cadena que contenga la ruta de directorio del archivo World Sales Report copiado en el paso anterior. Dim reportPath As String = _ "C:\Program Files\Microsoft Visual Studio 9.0\" _ & "Crystal Reports\Samples\En\Reports\General Business\" _ & "World Sales Report.rpt" string reportPath = "C:\\Program Files\\Microsoft Visual Studio 9.0\\" + "Crystal Reports\\Samples\\En\\Reports\\General Business\\" + "World Sales Report.rpt"; 4. Declare y cree una instancia de la clase NonEmbeddedReportCacher y, a continuación, pásela a la variable de cadena reportFile. Nota Para obtener información sobre cómo crear la clase NonEmbeddedReportCacher, vea el procedimiento de varios pasos que sigue a este procedimiento de varios pasos. Dim myNonEmbeddedReportCacher As NonEmbeddedReportCacher = _New NonEmbeddedReportCacher(reportFile) NonEmbeddedReportCacher nonEmbeddedReportCacher = new NonEmbeddedReportCacher(reportFile); 5. Asigne la instancia de la clase de utilidad de administración de almacenamiento en caché de informes a la propiedad ReportSource del control CrystalReportViewer. myCrystalReportViewer.ReportSource = myNonEmbeddedReportCacher crystalReportViewer.ReportSource = nonEmbeddedReportCacher; Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 207 1.4.5.3.2.4.2 Para crear la clase de utilidad de administración de almacenamiento en caché de la clase NonEmbeddedReportCacher Procedimiento 1. Cree una nueva clase en el proyecto denominada NonEmbeddedReportCacher. Public Class NonEmbeddedReportCacher End Class using System; namespace MyWebApplication { public class NonEmbeddedReportCacher { public NonEmbeddedReportCacher() { } } } 2. Agregue la interfaz ICachedReport a la firma de la clase. Public Class NonEmbeddedReportCacher Implements ICachedReport public class NonEmbeddedReportCacher : ICachedReport 3. Agregue tres instrucciones "Imports" [Visual Basic] o "using" [C#] en la parte superior de la clase. Imports CrystalDecisions.Shared Imports CrystalDecisions.ReportSource Imports CrystalDecisions.CrystalReports.Engine using CrystalDecisions.Shared; using CrystalDecisions.ReportSource; using CrystalDecisions.CrystalReports.Engine; 4. En la clase, declare dos instancias de nivel de clase: una instancia de clase denominada reportFileName y una instancia de ReportDocument denominada nonEmbeddedReportDocument. Private reportFileName As String Private nonEmbeddedReportDocument As ReportDocument private string reportFileName; private ReportDocument nonEmbeddedReportDocument; 208 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 5. Establezca el valor del constructor para que acepte una cadena reportFileName y, en el constructor, asigne esa cadena a la variable de clase reportFileName. Public Sub New(ByVal reportFileName As String) Me.reportFileName = reportFileName End Sub public NonEmbeddedReportCacher(string reportFileName) { this.reportFileName = reportFileName; } El resto de los pasos implementan propiedades o métodos requeridos por la interfaz: 6. ○ IsCacheable ○ ShareDBLogonInfo ○ CacheTimeOut ○ CreateReport() ○ GetCustomizedCacheKey(solicitud RequestContext) Cree la propiedad IsCacheable, que debe devolver true. Public Overridable Property IsCacheable() As Boolean Implements ICachedReport.IsCacheable Get Return True End Get Set(ByVal Value As Boolean) End Set End Property public virtual Boolean IsCacheable { get { return true; } set { } } 7. Cree la propiedad ShareDBLogonInfo, que debe devolver false. Public Overridable Property ShareDBLogonInfo() As Boolean Implements ICachedReport.ShareDBLogonInfo Get Return False End Get Set(ByVal Value As Boolean) End Set End Property public virtual Boolean ShareDBLogonInfo { Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 209 get { return false; } 8. } set { } Cree la propiedad CacheTimeOut, que devuelve una constante desde la clase CachedReportConstants. Public Overridable Property CacheTimeOut() As TimeSpan Implements ICachedReport.CacheTimeOut Get Return CachedReportConstants.DEFAULT_TIMEOUT End Get Set(ByVal Value As TimeSpan) End Set End Property public virtual TimeSpan CacheTimeOut { get { return CachedReportConstants.DEFAULT_TIMEOUT; } set { } } 9. Cree el método CreateReport(), que devuelve un informe no incrustado cargado en la instancia ReportDocument de nivel de clase. Public Overridable Function CreateReport() As ReportDocument Implements ICachedReport.CreateReport nonEmbeddedReportDocument = New ReportDocument() nonEmbeddedReportDocument.Load(reportFileName) Return nonEmbeddedReportDocument End Function public virtual ReportDocument CreateReport() { nonEmbeddedReportDocument = new ReportDocument(); nonEmbeddedReportDocument.Load(reportFileName); return nonEmbeddedReportDocument; } 10. Cree el método GetCustomizedCacheKey() y devuelva el valor nulo. Nota Si este método devuelve el valor null, hace que el propio SDK de SAP Crystal Reports .NET administre la clave de búsqueda en caché. La alternativa es crear y agregar su propio método de clave de caché personalizado. Public Overridable Function GetCustomizedCacheKey(ByVal request As 210 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net RequestContext) As String Implements ICachedReport.GetCustomizedCacheKey Return Nothing End Function public virtual String GetCustomizedCacheKey(RequestContext request) { return null; } 11. Para ver el informe, cree y ejecute el proyecto. 1.4.5.3.2.5 Enlazar con el componente ReportDocument Modelo de objetos Este escenario de enlace de informes usa el modelo de objeto ReportDocument. Ubicación de los informes Los informes se encuentran en el directorio de archivos. Descripción El componente ReportDocument se encuentra en el Cuadro de herramientas y proporciona un método basado en la GUI para generar código de creación de instancias de la clase para el informe en la clase de código subyacente. Puede especificar un informe no incrustado, un informe incrustado, o un informe incrustado almacenado en caché. Nota El cuadro de diálogo usa los términos heredados "informe sin tipo" para referirse a un informe no incrustado y "informe con tipos declarados" para referirse a un informe incrustado. El uso de este cuadro de diálogo para agregar ReportDocument como un componente hace que se cree una instancia de la clase ReportDocument (o la clase contenedora del informe incrustado) dentro de la región generada automáticamente de la clase de código subyacente. A la vez, aparece un icono en la bandeja de componentes de IDE para representar visualmente la clase de informe de la que se ha creado una instancia. Nota No hace falta agregar un componente ReportDocument al proyecto para crear una instancia del informe en la clase de código subyacente. Para tener un mayor control sobre el código, es recomendable agregar el código de creación de instancias manualmente. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 211 Información relacionada Modelo de objetos ReportDocument [página 36] 1.4.5.3.2.6 Escenarios de enlaces de ReportDocument que usan Crystal Services (VS.NET 2003) Crystal Services proporciona informes de fácil acceso en Visual Studio 2003. Esta función no está disponible en Visual Studio 2005 o Visual Studio 2008. Cuando están instalados SAP Crystal Reports y Crystal Services, éstos últimos aparecen como un subnodo debajo de cada servidor dentro del nodo de servidores del Explorador de servidores. El nodo Crystal Services se expande para mostrar listas de informes desde diversas ubicaciones: ● El directorio de archivos local de la unidad de disco duro. ● Report Application Server (RAS) ● Plataforma SAP Business Intelligence (BIP) Puede arrastrar y colocar cualquier informe desde estas listas a formularios Web Forms o Windows Forms. Crystal Services normalmente muestra dos subnodos que se pueden expandir, en función de la versión de SAP Crystal Reports que tenga instalada actualmente y en cualquier licencia adicional que pueda tener para el servidor de aplicaciones de informes (RAS) o la plataforma SAP BusinessObjects Business Intelligence. La tabla de la siguiente sección describe los requisitos de acceso a un nodo en particular. Nota Algunas versiones de la plataforma SAP BusinessObjects Business Intelligence no incluyen compatibilidad para Crystal Services. Para obtener más información consulte la documentación sobre la plataforma SAP BusinessObjects Business Intelligence. Es posible que deba ajustar la configuración del servidor de seguridad para poder acceder al CMS de la plataforma SAP BusinessObjects Business Intelligence. El puerto predeterminado del CMS es 6400. Póngase en contacto con el administrador del sistema para obtener más información sobre la configuración de la dirección de red y el puerto del sistema de plataforma SAP BusinessObjects Business Intelligence. Puede encontrar más información sobre la personalización de puertos en el Manual del administrador de la plataforma SAP BusinessObjects Business Intelligence. Clases contenedoras Al arrastrar un informe de Crystal Services a un formulario Web Forms o Windows Forms, se crea una instancia de clase contenedora que hace referencia al informe en la sección de código generado de la clase de código subyacente del formulario Web Forms o Windows Forms. Nota El tipo de clase contenedora varía con las versiones de SAP Crystal Reports. Vea la siguiente tabla. 212 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Los Servicios de Crystal citados en la siguiente tabla exponen los tipos de clases contenedoras de ReportDocument. Estos dos Crystal Services se incluyen en SAP Crystal Reports 10. Exponen grupos de informes que se atienden desde un servidor RAS no administrado o un servidor RAS administrado. La clase contenedora se ha cambiado (desde SAP Crystal Reports 9) a ReportDocument. Clase contenedora expuesta mediante Crystal Services Nombre del nodo si­ Versiones de SAP tuado debajo de Crystal Reports Crystal Services Descripción Requisitos para te­ ner acceso a este nodo ReportDocument Servidor de aplica­ ciones de informes SAP Crystal Reports 10 Expone informes de Instale un servidor un servidor RAS car­ RAS no adminis­ gados en ReportDo­ trado. cument. Para obte­ ner más informa­ ción, vea Enlazar con Report Application Server (SAP Crystal Reports 10 y versio­ nes superiores) [pá­ gina 213]. ReportDocument Crystal Enterprise SAP Crystal Reports 10 Expone informes Instalar Crystal En­ desde el servidor terprise. RAS administrado, que se carga en Re­ portDocument. Para obtener más infor­ mación, vea Enlazar a Crystal Enterprise (SAP Crystal Reports 10 y versiones supe­ riores) [página 216]. Las versiones anteriores de Crystal Services exponen tipos de clases contenedoras que no utilizan el modelo de objetos ReportDocument. Por lo tanto, dependen del modelo de objetos limitado proporcionado con el control CrystalReportViewer. Para obtener más información, vea Escenarios de enlaces CrystalReportViewer que utilizan Crystal Services [página 177]. 1.4.5.3.2.6.1 Enlazar con Report Application Server (SAP Crystal Reports 10 y versiones superiores) Nota Esta página describe una funcionalidad que no está disponible en SAP Crystal Reports, versión para programadores de Microsoft Visual Studio, pero sí lo está en las versiones actualizadas. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 213 Modelo de objetos Este escenario de enlace de informes usa el modelo de objeto ReportDocument. Ubicación de los informes Los informes se encuentran en el servidor RAS no administrado. La clase ReportDocument contiene el informe. Información general sobre Crystal Services Este escenario de enlace de informes se aplica a informes a los que se accede desde el nodo del servidor de Crystal Services en el Explorador de servidores. En esta sección se examina el subnodo Report Application Server de Crystal Services, dentro de SAP Crystal Reports Developer. [NOMBRE_DE_SERVIDOR] ● Crystal Reports ○ Servidor de aplicaciones de informes Descripción El subnodo Report Application Server accede y muestra informes que ha expuesto un servidor RAS no administrado. El nodo RAS sólo es funcional cuando se ha instalado RAS no administrado en el equipo de desarrollo. Cuando se arrastra y coloca un informe desde el nodo de Crystal Services>plataforma de BusinessObjects Business Intelligence en un formulario de web o de Windows, se genera una instancia de ReportDocument. La clase ReportDocument funciona como clase contenedora. Su objetivo es contener (representar) el informe pasado desde el servidor RAS no administrado. Ventajas ● Acceso sencillo: los informes del servidor RAS no administrado se pueden ver fácilmente en una vista de árbol y arrastrarse a un formulario Web Forms. ● Amplia interacción mediante programación: proporciona acceso al potente modelo de objetos ReportDocument. La clase contenedora del informe de esta versión es ReportDocument . Esta es la primera versión de Crystal Services que da acceso al modelo de objetos ReportDocument. 214 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Desventajas ● La codificación no es tan directa: no tan directa como la codificación de informes de RAS con el modelo de objetos ReportClientDocument. Información relacionada Enlazar a Crystal Enterprise (SAP Crystal Reports 10 y versiones superiores) [página 216] Modelo de objetos ReportDocument [página 36] Utilizar Crystal Services [página 83] 1.4.5.3.2.6.1.1 Para utilizar Crystal Services>Report Application Server Requisitos previos ● SAP Crystal Reports 10 o superior está instalado y su funcionamiento es correcto. ● El servidor RAS no administrado está instalado y se comprueba su correcto funcionamiento. Nota Este procedimiento sólo funciona con un proyecto creado a partir de la Configuración de proyectos [página 14]. La configuración de proyectos contiene referencias específicas a espacios de nombres y configuración de códigos necesarios para este procedimiento, que no se podrá completar sin dicha configuración. Procedimiento 1. En Visual Studio, abra Explorador de servidores. 2. Expanda Crystal Services y, a continuación, expanda Servidor de aplicaciones de informes. 3. Seleccione un informe desde el árbol de Report Application Server y arrástrelo al formulario Web Form o Windows Form. En la parte inferior del formulario, en la vista Diseño, aparece un objeto reportDocument1. Nota Cuando se coloca un informe del Servidor de aplicaciones de informes en el formulario, se agrega una instancia de la clase ReportDocument a la región de código generado por el diseñador del formulario. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 215 Cuando se crea una instancia de las clases que heredan de System.ComponentModel.Component (como ReportDocument) y se configura en la región de código generado por el diseñador, aparece un icono de esta clase en la parte inferior del formulario en la vista Diseño. 4. Cambie a la vista de código y abra la región Código generado por el Diseñador de Web Forms o Windows Forms. Nota Se ha creado una instancia de la clase ReportDocument y se ha configurado en esta región. 5. En el método ConfigureCrystalReports() (creado en Configuración de proyectos [página 14]), asigne la instancia de ReportDocument a la propiedad ReportSource del control CrystalReportViewer. myCrystalReportViewer.ReportSource = reportDocument1 crystalReportViewer.ReportSource = reportDocument1; 6. Para ver el informe, cree y ejecute el proyecto. 1.4.5.3.2.6.2 Enlazar a Crystal Enterprise (SAP Crystal Reports 10 y versiones superiores) Nota Esta página describe una funcionalidad que no está disponible en SAP Crystal Reports, versión para programadores de Microsoft Visual Studio, pero sí lo está en las versiones actualizadas. Modelo de objetos Este escenario de enlace de informes usa el modelo de objeto ReportDocument. Ubicación de los informes Los informes se encuentran en el servidor RAS administrado. La clase ReportDocument contiene los informes. Información general sobre Crystal Services Este escenario de enlace de informes se aplica a informes a los que se accede desde el nodo del servidor de Crystal Services en el Explorador de servidores. 216 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net En esta sección se examina el subnodo de la plataforma SAP BusinessObjects Business Intelligence de Crystal Services, dentro de SAP Crystal Reports Developer. [NOMBRE_DE_SERVIDOR] ● Crystal Reports ○ Crystal Enterprise Descripción El subnodo de la plataforma SAP BusinessObjects Business Intelligence accede y muestra informes que ha expuesto un servidor RAS administrado dentro de la plataforma SAP BusinessObjects Business Intelligence. El nodo de Crystal Services>plataforma SAP BusinessObjects Business Intelligence expone los informes desde Crystal Enterprise, a través del servidor RAS administrado. El nodo de la plataforma SAP BusinessObjects Business Intelligence es funcional, pero, si no se ha instalado la plataforma SAP BusinessObjects Business Intelligence en el equipo de desarrollo, vaya a las propiedades de este nodo y establezca el nombre del servidor de la plataforma SAP BusinessObjects Business Intelligence en la red. Cuando se arrastra y coloca un informe desde el nodo de Crystal Services>plataforma de BusinessObjects Business Intelligence en un formulario de web o de Windows, se genera una instancia de ReportDocument. La clase ReportDocument funciona como clase contenedora. Su objetivo es contener (representar) el informe que se pasa del servidor RAS en Crystal Enterprise. Ventajas ● Acceso sencillo: fácil acceso a los informes de RAS en Crystal Enterprise desde una aplicación Web. ● Amplia interacción mediante programa: proporciona acceso al potente modelo de objetos ReportDocument. La clase contenedora del informe de esta versión es ReportDocument. Esta es la primera versión de Crystal Services que da acceso al modelo de objetos ReportDocument. Desventajas ● La codificación no es tan directa: no tan directa como la codificación de informes de RAS con el modelo de objetos ReportClientDocument. Información relacionada Utilizar Crystal Services [página 83] Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 217 1.4.5.3.2.6.2.1 Para usar Crystal Services>Crystal Enterprise Requisitos previos ● SAP Crystal Reports 10 o XI está instalado y su funcionamiento es correcto. Nota Este procedimiento sólo funciona con un proyecto creado a partir de la Configuración de proyectos [página 14]. La configuración de proyectos contiene referencias específicas a espacios de nombres y configuración de códigos necesarios para este procedimiento, que no se podrá completar sin dicha configuración. Procedimiento 1. En Visual Studio, abra Explorador de servidores. 2. Expanda Crystal Services y, a continuación, expanda Crystal Enterprise. 3. Seleccione un informe del árbol de Crystal Enterprise y arrástrelo al formulario. En la parte inferior del formulario, en la vista Diseño, aparece un objeto reportDocument1. Nota Cuando se coloca un informe de Crystal Enterprise en el formulario, se agrega una instancia de la clase ReportDocument a la región de código generado por el diseñador del formulario. Cuando se crea una instancia de las clases que heredan de System.ComponentModel.Component (como ReportDocument) y se configura en la región de código generado por el diseñador, aparece un icono de esta clase en la parte inferior del formulario de la vista Diseño. 4. Cambie a la vista de código y abra la región Código generado por el Diseñador de Web Forms o Windows Forms. Se ha creado una instancia de la clase ReportDocument y se ha configurado en esta región. 5. En el método ConfigureCrystalReports() (creado en Configuración de proyectos [página 14]), asigne la instancia de ReportDocument a la propiedad ReportSource del control CrystalReportViewer. myCrystalReportViewer.ReportSource = reportDocument1 crystalReportViewer.ReportSource = reportDocument1; 6. 218 Cree y ejecute el proyecto Web para ver el informe. © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 1.4.5.4 caché Cuándo utilizar informes normales o almacenados en Al planear la creación de una aplicación con el SDK de SAP Crystal Reports, una de las consideraciones más importantes es si se van a usar informes normales o almacenados en caché. Conocer los aspectos fundamentales del SDK que afectan al almacenamiento en caché de informes le ayuda a elegir la mejor estructura del proyecto SAP Crystal Reports, versión para programadores de Microsoft Visual Studio. ¿Qué son informes almacenados en caché? Los informes almacenados en caché son objetos de informe que se han almacenado en el objeto ASP.NET Cache para incrementar el rendimiento y la escalabilidad. SAP Crystal Reports incluye un marco específico para colocar instancias de ReportDocument en Cache. Dicho marco almacena en caché automáticamente cualquier informe que implemente la interfaz ICachedReport. ¿Qué es un objeto ASP.NET Cache? Tanto en ASP como en ASP.NET, los objetos de informe se colocan en los objetos Session o Application en el servidor Web, por dos razones: 1. Para conservar el estado del objeto de informe siempre que se vuelve a cargar la página. 2. Para mejorar la escalabilidad y el rendimiento mediante la colocación de informes largos o lentos de cargar en la memoria del servidor. En ASP.NET, se introdujo una variación ampliada del objeto Application denominado Cache. Igual que ocurre con Application, Cache continúa conservando instancias únicas de un objeto de informe. Sin embargo, Cache añade inteligencia que busca dependencias basadas en archivo, clave u hora. Estas dependencias pueden caducar automáticamente e incluso actualizar los objetos del informe dentro de Cache para mantener el contenido del objeto Cache actual. Los informes guardados en Cache son específicos por usuario y por sesión. Nota Los términos "objeto Cache" y "Cache" se utilizan intercambiablemente, como ocurre con los términos "objeto Session" y "Session" u "objeto Application" y "Application," pero su significado es el mismo. El término "objeto" resalta el hecho de que se trata de objetos de persistencia que se ejecutan dentro del espacio de memoria de .NET Framework en el servidor Web. ¿Cómo se colocan los objetos de informe en el objeto ASP.NET Cache? Puede colocar los objetos de informe en el objeto ASP.NET Cache de dos formas: Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 219 ● Asignar el objeto de informe a Cache con la misma sintaxis con la que se asigna un objeto de informe a Session o Application; es decir, asignación explícita. ● Crear una instancia de la versión del informe que implemente la interfaz ICachedReport. El motor del informe busca cualquier objeto que implemente esta interfaz y automáticamente coloca dicho objeto en Cache; es decir, asignación implícita. ¿Qué es la interfaz ICachedReport? La interfaz ICachedReport marca las clases del informe que permiten que ICachedReport funcione con el marco de almacenamiento en caché de SAP Crystal Reports. Este marco personalizado proporciona una capa sobre el objeto ASP.NET Cache, para satisfacer las necesidades específicas del almacenamiento en caché del informe. La interfaz ICachedReport incluye firmas de método que, cuando se implementan en la clase del informe, indican al marco cómo almacenar en caché esa clase en particular. ¿Cuáles son las funciones de almacenamiento en caché de informes incluidas cuando se incrusta un informe en un proyecto de Visual Studio? Al crear o importar un informe a un proyecto de Visual Studio, el informe se incrusta en el proyecto y se generan automáticamente dos clases: ● Una clase contenedora de informe, con el mismo nombre del informe. Esta clase contenedora representa el informe del proyecto y hereda de ReportDocument. Para obtener más información, vea Comparar informes incrustados y no incrustados [página 163]. ● Una clase de utilidad de administración de caché (denominada clase Cached[ReportName]). Esta clase de utilidad de administración de caché se encarga del almacenamiento en caché de ese informe incrustado, mediante el uso del objeto ASP.NET Cache y del marco de almacenamiento en caché integrado en el SDK de SAP Crystal Reports. La tabla siguiente muestra los elementos que se generan cuando al agregar el informe de agrupamiento jerárquico: ¿Cómo se llama? ¿Qué es? Hierarchical Grouping.rpt El informe Clase Hierarchical_Grouping La clase contenedora de informe Clase CachedHierarchical_Grouping La clase de utilidad de administración de caché se uti­ liza para administrar el almacenamiento en caché de la clase contenedora de informe La clase contenedora de informe y la clase de utilidad de administración de caché tienen tareas distintas: ● La clase contenedora de informe hereda de ReportDocument y, por lo tanto, tiene acceso al modelo de objetos ReportDocument completo. Se trata de la clase básica en la que programa para interactuar con el informe. ● La clase de utilidad de administración de caché administra y almacena las instancias de la clase contenedora de informe en el objeto ASP.NET Cache. Reconoce instancias distintas de la clase contenedora de informe y 220 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net evita que esas instancias se sobrescriban entre sí en Cache. Por ejemplo, reconoce diferencias creadas al cambiar parámetros e inicios de sesión. Para ello, asigna una clave única para cada instancia única de la clase contenedora de informe. ● Para identificarse respecto a la funcionalidad de almacenamiento en caché de SAP Crystal Reports .NET Framework, la utilidad de administración de caché implementa la interfaz ICachedReport. Tanto la clase contenedora de informe como la clase de utilidad de administración de caché se generan en el mismo archivo de clase. Para ver ambas clases, haga clic con el botón secundario en el archivo de clase de informe en el Explorador de soluciones y elija Ver código. Cuando se abre el archivo, puede encontrar el código de la clase contenedora de informe en la parte superior del mismo y el de la clase de utilidad de administración de caché hacia la mitad. Nota Para obtener información sobre cómo enlazar el control CrystalReportViewer a esta clase de utilidad de administración de caché, vea Enlazar a una clase de informe incrustado almacenado en caché [página 202]. Para crear su propia clase de utilidad de administración de caché, vea Enlazar a un informe no incrustado cargado en una clase de utilidad de administración de caché [página 205]. Cuándo se deben almacenar en caché los informes Conserve sólo un porcentaje bajo de objetos de informe en el objeto ASP.NET Cache. La mayoría de los objetos de informe tienen una compartibilidad baja; es decir, no se utilizan como recursos compartidos con otros objetos. Por lo tanto, no utilizan Cache de forma económica. Su persistencia es necesaria. Por tanto, coloque los objetos de informe en el objeto Session del usuario. Coloque el objeto de informe en Cache de ASP.NET sólo si el mismo usuario visualizará el informe varias veces en una sesión determinada. Esto es particularmente importante si el objeto de informe es muy grande o si tiene una consulta que es tan compleja que se tardan varios minutos en recuperar los datos. Información relacionada Enlazar a una clase de informe incrustado almacenado en caché [página 202] 1.4.5.5 Visualizar un informe en tiempo de diseño SAP Crystal Reports permite obtener una vista previa de un informe en tiempo de diseño en Visual Studio. Cuando se asigna un informe a la propiedad ReportSource en la ventana Propiedades, en el formulario de Windows Forms o una página ASPX, se muestra una vista previa del informe. Los datos estáticos, como fechas, imágenes o campos de texto, se mostrarán a medida que aparezcan en tiempo de ejecución. Los datos dinámicos, como los datos de una base de datos, pueden usar valores artificiales en lugar de datos del origen de datos. Si el informe contiene datos guardados, dichos datos guardados aparecerán en la vista previa en tiempo de diseño. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 221 SAP Crystal Reports Designer incrustado proporciona una funcionalidad de visualización a través de la ficha Vista previa. Cuando visualice el informe en la ficha de Vista previa, SAP Crystal Reports intentará recuperar nuevos datos del origen de datos especificado. La vista previa en tiempo de diseño no intentará recuperar datos. En su lugar, mostrará los datos que se encuentren guardados en ese momento en el informe. Nota La ficha Vista previa no está disponible en SAP Crystal Reports Designer para Visual Studio .NET 2003 incrustado. Información relacionada Ficha Vista previa [página 653] 1.4.6 Personalizar el control CrystalReportViewer El control CrystalReportViewer se usa en .NET Framework para enlazar y mostrar informes. El control CrystalReportViewer predeterminado incluye elementos de interfaz de usuario para facilitar la visualización, guardado y navegación en un informe. Según su aplicación, puede interesarle modificar ciertos elementos del control predeterminado. SAP Crystal Reports permite personalizar de diferentes formas el aspecto del visor que se muestra en la aplicación. Entre otras opciones: ● Se puede eliminar del visor la barra de herramientas de CrystalReportViewer. ● Se pueden agregar o eliminar los botones de la barra de herramientas mediante programación. ● El control CrystalReportViewer admite la personalización mediante CSS o temas. En esta sección se detalla cómo modificar el control del visor para su aplicación. Clases usadas para visualizar informes ● CrystalDecisions.Windows.Forms.CrystalReportViewer Proporciona propiedades, métodos y eventos que modifican o recuperan información sobre como aparece y funciona el control CrystalReportViewer. ● CrystalDecisions.Web.CrystalReportViewer Proporciona propiedades, métodos y eventos que modifican o recuperan información sobre como aparece y funciona el control CrystalReportViewer. Información relacionada ¿Cómo utilizo los controles de visores de informes? [página 42] 222 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 1.4.6.1 Indicador del procesamiento de informes El indicador de procesamiento de informes ofrece una indicación visual del tiempo de procesamiento en el sitio Web de SAP Crystal Reports. Si el tiempo de procesamiento de un informe supera un umbral especificado, aparecerá un cuadro de diálogo para ofrecer una indicación del progreso de la acción que se está realizando. Tanto el texto del cuadro de diálogo como el tiempo que debe transcurrir antes de que aparezca el cuadro se pueden especificar en el archivo Web.Config de su sitio web. El texto predeterminado es: Espere mientras el documento se procesa. El tiempo predeterminado antes de que se muestre el indicador de procesamiento de informes es de 200 milisegundos. Información relacionada Configuración del archivo Web.Config [página 19] 1.4.6.1.1 Para personalizar el texto del indicador de procesamiento de informes Contexto El texto del indicador de procesamiento de informes se configura en el archivo Web.Config de su sitio web. Procedimiento 1. Agregue un control CrystalReportViewer a la aplicación. 2. Abra el archivo Web.Config. Si no tiene un archivo Web.Config, haga clic en Depurar Iniciar depuración para depurar la aplicación. Visual Studio le pedirá que cree un nuevo archivo Web.Config. Haga clic en Aceptar para crear el nuevo archivo. 3. En el archivo Web.Config, agregue la configuración NameValueSectionHandler como primer elemento secundario del elemento de configuración. <configSections> <sectionGroup name="businessObjects"> <sectionGroup name="crystalReports"> <section name="crystalReportViewer" type="System.Configuration.NameValueSectionHandler" /> </sectionGroup> </sectionGroup> </configSections> Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 223 El elemento configSections debe ser un elemento secundario y único del elemento configuration. Si ya tiene un elemento configSections para SAP Crystal Reports, agregue el elemento section de CrystalReportViewer al nodo existente de configSections. 4. Agregue la configuración processingIndicatorText directamente después del elemento configSections. <businessObjects> <crystalReports> <crystalReportViewer> <add key="processingIndicatorText" value="Thank you for waiting"/> </crystalReportViewer> </crystalReports> </businessObjects> 5. Sustituya el texto del atributo value con el mensaje que desea que se muestre en el indicador de procesamiento de informes. El elemento processingIndicatorText controla el texto que se muestra en el indicador de procesamiento de informes. El texto predeterminado es: Espere mientras el documento se procesa. Resultados El control CrystalReportViewer usará ahora el mensaje personalizado del indicador de procesamiento de informes. Ejemplo En este ejemplo se reduce el tiempo que debe esperar el indicador de procesamiento de informes a 20 milisegundos y se cambia el mensaje que se muestra a “Thank you for waiting”. <?xml version="1.0"?> <configuration> <configSections> <sectionGroup name="businessObjects"> <sectionGroup name="crystalReports"> <section name="crystalReportViewer" type="System.Configuration.NameValueSectionHandler" /> </sectionGroup> </sectionGroup> </configSections> <businessObjects> <crystalReports> <crystalReportViewer> <add key="processingIndicatorText" value="Thank you for waiting."/> <add key="processingIndicatorDelay" value="20"/> </crystalReportViewer> </crystalReports> </businessObjects> <appSettings> <add key="CrystalImageCleaner-AutoStart" value="true"/> <add key="CrystalImageCleaner-Sleep" value="60000"/> <add key="CrystalImageCleaner-Age" value="120000"/> </appSettings> <connectionStrings/> <system.web> <compilation debug="true"> 224 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net <assemblies> <add assembly="CrystalDecisions.Web, Version=12.0.2000.0, Culture=neutral, PublicKeyToken=692FBEA5521E1304"/> <add assembly="CrystalDecisions.Shared, Version=12.0.2000.0, Culture=neutral, PublicKeyToken=692FBEA5521E1304"/> <add assembly="CrystalDecisions.ReportSource, Version=12.0.2000.0, Culture=neutral, PublicKeyToken=692FBEA5521E1304"/> <add assembly="CrystalDecisions.CrystalReports.Engine, Version=12.0.2000.0, Culture=neutral, PublicKeyToken=692FBEA5521E1304"/> </assemblies> </compilation> <authentication mode="Windows"/> <httpHandlers> <add verb="GET" path="CrystalImageHandler.aspx" type="CrystalDecisions.Web.CrystalImageHandler, CrystalDecisions.Web, Version=12.0.2000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304"/> </httpHandlers> </system.web> </configuration> 1.4.6.1.2 Para cambiar el tiempo que debe transcurrir antes de que se muestre el indicador de procesamiento de informes Contexto El tiempo que debe transcurrir antes de que se muestre el indicador de procesamiento de informes se configura en el archivo Web.Config del sitio web. El elemento processingIndicatorDelay controla el tiempo que transcurre antes de que aparezca el indicador de procesamiento de informes. Procedimiento 1. Agregue un control CrystalReportViewer a la aplicación. 2. Abra el archivo Web.Config. Si no tiene un archivo Web.Config, haga clic en Depurar Iniciar depuración para depurar la aplicación. Visual Studio le pedirá que cree un nuevo archivo Web.Config. Haga clic en Aceptar para crear el nuevo archivo. 3. En el archivo Web.Config, agregue la configuración NameValueSectionHandler como primer elemento secundario del elemento de configuración. <configSections> <sectionGroup name="businessObjects"> <sectionGroup name="crystalReports"> <section name="crystalReportViewer" type="System.Configuration.NameValueSectionHandler" /> </sectionGroup> </sectionGroup> </configSections> Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 225 El elemento configSections debe ser un elemento secundario y único del elemento configuration. Si ya tiene un elemento configSections para SAP Crystal Reports, agregue el elemento section de CrystalReportViewer al nodo existente de configSections. 4. Agregue la configuración processingIndicatorDelay directamente después del elemento configSections. <businessObjects> <crystalReports> <crystalReportViewer> <add key="processingIndicatorDelay" value="20"/> </crystalReportViewer> </crystalReports> </businessObjects> 5. Sustituya el texto del atributo value con la indicación del tiempo que debe transcurrir antes de que aparezca el indicador de procesamiento de informes. Este valor se indica en milisegundos. Si se establece este valor en 0, se deshabilitará el indicador de procesamiento de informes. El valor predeterminado es 200 milisegundos. Ejemplo En este ejemplo se reduce el tiempo que debe esperar el indicador de procesamiento de informes a 20 milisegundos y se cambia el mensaje que se muestra a “Thank you for waiting”. <?xml version="1.0"?> <configuration> <configSections> <sectionGroup name="businessObjects"> <sectionGroup name="crystalReports"> <section name="crystalReportViewer" type="System.Configuration.NameValueSectionHandler" /> </sectionGroup> </sectionGroup> </configSections> <businessObjects> <crystalReports> <crystalReportViewer> <add key="processingIndicatorText" value="Thank you for waiting."/> <add key="processingIndicatorDelay" value="20"/> </crystalReportViewer> </crystalReports> </businessObjects> <appSettings> <add key="CrystalImageCleaner-AutoStart" value="true"/> <add key="CrystalImageCleaner-Sleep" value="60000"/> <add key="CrystalImageCleaner-Age" value="120000"/> </appSettings> <connectionStrings/> <system.web> <compilation debug="true"> <assemblies> <add assembly="CrystalDecisions.Web, Version=12.0.2000.0, Culture=neutral, PublicKeyToken=692FBEA5521E1304"/> <add assembly="CrystalDecisions.Shared, Version=12.0.2000.0, Culture=neutral, PublicKeyToken=692FBEA5521E1304"/> <add assembly="CrystalDecisions.ReportSource, Version=12.0.2000.0, Culture=neutral, PublicKeyToken=692FBEA5521E1304"/> <add assembly="CrystalDecisions.CrystalReports.Engine, Version=12.0.2000.0, Culture=neutral, PublicKeyToken=692FBEA5521E1304"/> </assemblies> 226 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net </compilation> <authentication mode="Windows"/> <httpHandlers> <add verb="GET" path="CrystalImageHandler.aspx" type="CrystalDecisions.Web.CrystalImageHandler, CrystalDecisions.Web, Version=12.0.2000.0, Culture=neutral, PublicKeyToken=692fbea5521e1304"/> </httpHandlers> </system.web> </configuration> 1.4.6.2 Admitir varios idiomas con el control CrystalReportViewer SAP Crystal Reports, versión para programadores de Microsoft Visual Studio incluye el soporte para clientes web y para Windows multilingües, a través de la localización dinámica. La localización dinámica permite a los usuarios para ver información sobre herramientas y otro contenido del control CrystalReportViewer en el idioma deseado. Para habilitar la localización dinámica, debe poder acceder a los archivos de recursos del idioma que desee. Información relacionada Tutorial: Configurar la compatibilidad con clientes multilingües [página 584] En este tutorial aprenderá a configurar la compatibilidad con clientes multilingües en un sitio Web o un proyecto para Windows. 1.4.6.2.1 Archivos de recursos de idioma Los archivos de recursos de idioma contienen una serie de parejas de claves y valores que indican el texto que se muestra en la aplicación. Cada elemento de texto que aparece en una aplicación de Crystal Reports tiene su valor correspondiente en el archivo de recursos de idioma que especifica cómo debe mostrarse ese texto en cada idioma. Archivos de recursos de idioma En el servidor Web o el cliente Windows, puede acceder a los recursos de idioma del control CrystalReportViewer desde dos orígenes posibles: ● DLL de recursos de idioma predeterminadas, que incluyen lo siguiente: ○ Inglés (en) ○ Francés (fr) Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 227 ● ○ Alemán (de) ○ Español (es) ○ Italiano (it) ○ Japonés (jp) ○ Coreano (ko) ○ Chino simplificado (zh-chs) ○ Chino tradicional (zh-cht) Archivos de recursos de idioma personalizados, que crea como cadenas de texto y posteriormente compila como DLL de recursos de idioma personalizadas. Recursos neutros y no neutros Los recursos de idioma incluyen recursos neutros y no neutros. Los recursos neutros representan una configuración de idioma general, como por ejemplo en (para inglés), fr (para francés) y jp (para japonés). Los recursos no neutros representan una versión de idioma que se cualifica basándose en un criterio adicional, como la región: por ejemplo, de-AT para alemán (Austria). Recursos globales y locales Los recursos de idioma predeterminados se instalan en el GAC y por ello están siempre disponibles globalmente, pero a los recursos de idioma personalizados se puede acceder global o localmente. La carpeta de recursos de idioma personalizados se puede almacenar y compartir en una ubicación central, o se puede copiar en el directorio local de la aplicación Web o para Windows. Si los recursos de idioma personalizados se almacenan en una ubicación central, se denominan recursos globales. En dicho caso, se debe informar a la aplicación Web o para Windows de la ubicación de los recursos mediante un archivo de configuración XML. Para que un recurso global se cargue correctamente, el nombre de la carpeta que contiene los archivos de recursos debe ajustarse a la configuración regional de idioma. Si los recursos de idioma personalizados se copian en el directorio local, se denominan recursos locales. En dicho caso, no es necesario un archivo de configuración. Para que un recurso local se cargue correctamente, los archivos de recursos y el nombre de la carpeta que contiene los archivos de recursos deben ajustarse a la configuración regional de idioma. Elegir el uso de recursos globales o locales Los recursos globales son adecuados cuando se tienen que compartir con más de una aplicación. Por ejemplo para un servidor Web, con varios sitios Web que requiere que se comparta un conjunto común de recursos de idioma para todos los sitios Web, es conveniente utilizar recursos globales. 228 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Los recursos locales son preferibles cuando los recursos los usa una única aplicación, cuya amplia distribución requiere una configuración simple. Por ejemplo para una aplicación de Windows, formada por una única carpeta de aplicación que se desea distribuir ampliamente, es conveniente utilizar recursos locales. En la mayoría de los casos, las aplicaciones Web son más adecuadas para los recursos globales, y las aplicaciones para Windows son más adecuadas para los recursos locales. Qué recurso se carga primero Si configura los recursos globales y locales para una aplicación particular, los recursos locales tendrán más prioridad (serán los primeros en el orden de carga). Si desea garantizar que se utilicen los recursos globales, verifique que el archivo de configuración es correcto, y elimine la carpeta de recursos locales. Los recursos neutros y no neutros también se ven afectados por el orden de carga. Si ha configurado los recursos neutros y no neutros para un idioma concreto (por ejemplo "Alemán (Austria)" y "Alemán"), se seleccionará primero el recurso no neutro. En ambos casos, lo específico tiene preferencia sobre lo general. Presentación en el lado del cliente Los siguientes factores determinan el idioma que se mostrará en la aplicación cliente en tiempo de ejecución: En una aplicación de Windows: ● La configuración de las opciones regionales del equipo de cada usuario. En un sitio Web: ● La configuración de las opciones regionales del servidor Web. ● La configuración de idioma del explorador del cliente. ● La propiedad Culture, que se configura en una página ASPX independiente. 1.4.6.2.2 Compatibilidad con codificación de caracteres Unicode y GB18030 SAP Crystal Reports, versión para programadores de Microsoft Visual Studio incluye el soporte para caracteres internacionales en los estándares de los siguientes sets de caracteres: ● Unicode ● GB18030 Para entender la forma en la que SAP Crystal Reports admite la codificación Unicode y GB18030, deberá comprender las tres vistas de caracteres diferentes (repertorio de caracteres, caracteres como puntos de código y caracteres como datos codificados). También tendrá que entender las relaciones entre los puntos de código (un término más preciso para los caracteres codificados) y las unidades de código. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 229 1.4.6.2.2.1 Vistas de caracteres Para entender los estándares de conjunto de caracteres, deberá distinguir entre las tres vistas de caracteres diferentes: ● Repertorio de caracteres (la lista de caracteres abstracta). ● Caracteres como puntos de código con valores escalares. ● Caracteres como datos codificados. Repertorio de caracteres (la lista de caracteres abstracta) El repertorio de caracteres es una la lista abstracta de más de un millón de caracteres que se encuentran en una gran variedad de sistemas de escritura, incluido el latín, cirílico, chino, coreano, japonés, hebreo y arameo. Otros símbolos como los de la notación musical también se incluyen en el repertorio de caracteres. Los estándares Unicode y GB18030 tienen un repertorio de caracteres. Cuando se añaden nuevos caracteres a un estándar, el otro estándar también añade dichos caracteres para mantener la paridad. Caracteres como puntos de código con valores escalares Nota Esta segunda vista de caracteres sólo se aplica a Unicode, no a GB18030. Cada carácter del repertorio de caracteres se asigna a un punto de código. Cada punto de código tiene un valor numérico específico, que se conoce como su valor escalar. El valor escalar a menudo se expresa en formato hexadecimal. Los puntos de código existen en un espacio de código. El espacio de código consta de un intervalo de valores escalares, que se dividen en dos planos: ● Plano multilingüe básico (64 k de tamaño). En Unicode, la expresión hexadecimal de los valores de este plano inferior va desde U+0000 hasta U+FFFF. ● Plano multilingüe suplementario (16 secciones adicionales de 64 k de tamaño). En Unicode, la expresión hexadecimal de los valores de este plano superior va desde U+10000 hasta U +10FFFF. El espacio de código completo de todos los valores escalares posibles es 17 * 64 k de tamaño (1.088.000 valores posibles). Caracteres como datos codificados Cada formato de codificación convierte los caracteres del repertorio de caracteres en datos codificados. 230 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net En GB18030, los datos codificados se derivan directamente del repertorio de caracteres: el concepto de un valor escalar como un intermedio entre el repertorio de caracteres y los datos codificados sólo está limitado a Unicode. En Unicode, los datos codificados se obtienen aplicando un algoritmo al valor escalar. Unicode define tres formatos de codificación de caracteres: ● UTF-8 ● UTF-16 ● UTF-32 1.4.6.2.2.2 código Relaciones entre puntos de código y unidades de Para entender cómo SAP Crystal Reports, versión para programadores de Microsoft Visual Studio</pname> admite GB18030 y Unicode, es importante comprender las relaciones entre los puntos de código y las unidades de código. Puntos de código y unidades de código En cada codificación, a los puntos de código se le asigna una o varias unidades de código. Una unidad de código es una unidad simple dentro de cada formato de codificación. El tamaño de la unidad de código equivale a la medida en bits de la codificación particular: ● Una unidad de código en UTF-8 consta de 8 bits. ● Una unidad de código en UTF-16 consta de 16 bits. ● Una unidad de código en UTF-32 consta de 32 bits. ● En GB18030, una unidad de código consta de 8 bits. Número de unidades de código en cada punto de código El número de unidades de código que se deben asignar a cada punto de código varía según el formato de codificación: ● UTF-8 Varias unidades de código por punto de código son habituales en UTF-8 porque usa unidades de código pequeñas. Los puntos de código se asignarán a una, dos, tres o cuatro unidades de código. ● UTF-16 Las unidades de código UTF-16 son el doble de grandes que las de 8 bits. Por lo tanto, los puntos de código con un valor escalar inferior a U+10000 se codificarán con una única unidad de código. Para los puntos de código con un valor escalar de U+10000 o superior, se necesitan dos unidades de código por cada punto de código. Estos pares de unidades de código tienen un término exclusivo en UTF-16: "pares suplentes de Unicode". Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 231 Nota La compatibilidad con pares suplentes de Unicode se tratará a continuación. ● UTF-32 La unidad de código de 32 bits usada en UTF-32 es lo suficientemente grande para que cada punto de código se codifique como una única unidad de código. ● GB18030 Varias unidades de código por punto de código son habituales en GB18030 porque usa unidades de código pequeñas. Los puntos de código se asignarán a una, dos, o cuatro unidades de código. Compatibilidad con pares suplentes de Unicode Algunos sistemas de escritura compatibles con Unicode contienen caracteres cuyos puntos de código tienen un valor escalar de U+10000 o superior. En UTF-16, estos puntos de código se codifican mediante pares suplentes. Es importante que los pares suplentes de Unicode se procesen adecuadamente. Por ejemplo, al trabajar con texto en una aplicación que use UTF-16 para la codificación, el cursor de texto debe desplazarse por cada punto de código como un carácter de texto individual al agregar, eliminar o seleccionar caracteres para cortar, copiar o pegar. 1.4.6.2.2.3 Compatibilidad de SAP Crystal Reports con GB18030 a través de Unicode SAP Crystal Reports, versión para programadores de Microsoft Visual Studio</pname> no admite GB18030 directamente. En su lugar, accede a GB18030 a través de valores que ya se han convertido a uno de los formatos de codificación de Unicode. Las conversiones se facilitan gracias a una serie de orígenes incluido .NET Framework, ciertos controladores de base de datos y el sistema operativo Windows. El texto se almacena normalmente en la unidad de disco duro como UTF-8, y se carga en memoria como UTF-16. SAP Crystal Reports admite pares suplentes de Unicode en UTF-16. Ejemplos de compatibilidad con GB18030 usando Unicode Las áreas más importantes que hay que conocer en las que compatibilidad con GB18030 se realiza a través de la conversión a Unicode son las siguientes: ● 232 Bases de datos que contienen datos codificados en GB18030. Los datos de bases de datos codificados en GB18030 sólo se admiten cuando el controlador de bases de datos convierte los datos en UTF-16 cuando los obtiene. © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Nota Microsoft SQL Server 2005 convierte los datos GB18030 en UTF-16 cuando los obtiene. Para otros servidores, consulte a su proveedor de bases de datos. ● DataSets que exponen los datos de un origen GB18030. Independientemente de su origen, los DataSets se formatean como XML, que se codifica con UTF-8. ● Servicios Web que exponen los datos de un origen GB18030. Todo el texto enviado o recibido en un servicio Web ya está convertido a Unicode. Casos de GB18030 no admitidos La situación principal en la que SAP Crystal Reports no admite GB18030 es al acceder o importar archivos de texto codificados mediante GB18030. El archivo de texto codificado mediante GB18030 lo debe convertir primero a Unicode un tercero, en cuyo momento SAP Crystal Reports puede interactuar con el archivo de texto codificado mediante Unicode. 1.4.6.3 Administrar eventos de error En versiones anteriores de SAP Crystal Reports, versión para programadores de Microsoft Visual Studio, siempre que use el control CrystalReportViewer tiene que buscar todas las excepciones que se produzcan. Las excepciones que se quedaban sin detectar interrumpían el procesamiento de la página y se mostraba un error. Para evitar interrupciones y errores, se ha agregado un nuevo evento al control CrystalReportViewer, el evento Error. Cuando se utiliza el evento Error, el control CrystalReportViewer visualiza mensajes de excepción sin interrupciones en la parte superior del control CrystalReportViewer. 1.4.6.3.1 Para suprimir la página con error mediante el método de evento Error Contexto Para suprimir la excepción producida, se llama al método de evento Error y se establece ErrorEventArgs.Handled en True en el controlador de eventos. Procedimiento 1. Agregue el método de evento Error a la clase de código subyacente. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 233 2. Establezca ErrorEventArgs.Handled en True en el controlador de eventos. Ejemplo Sub myCrystalReportViewer_Error(ByVal source As Object, ByVal e As CrystalDecisions.Web.ErrorEventArgs) e.Handled = True End Sub void crystalReportViewer_Error(object source, CrystalDecisions.Web.ErrorEventArgs e) { e.Handled = true; } 1.4.6.4 Personalizar el control CrystalReportViewer con CSS El aspecto visual del control CrystalReportViewer se crea mediante el uso de gráficos y una hoja de estilo en cascada (CSS). La hoja de estilos que tiene el nombre default.css se almacena en un subdirectorio del directorio virtual del visor que se denomina css. Nota En Visual Studio 2005 y versiones posteriores (y la versión 2.0 de ASP.NET), la apariencia de los controles visuales se puede administrar mediante una nueva herramienta denominada Temas. Los temas se pueden aplicar al control CrystalReportViewer con el fin de aplicar una apariencia coherente a los controles de una página o en un sitio Web completo. Información relacionada Personalizar el control CrystalReportViewer con temas [página 235] Establecer clase CSS (cuadro de diálogo) [página 942] Dar formato a informes mediante hojas de estilo en cascada [página 736] 234 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 1.4.6.4.1 Personalizar la hoja de estilos en cascada para el control CrystalReportViewer Contexto A la hoja de estilos se tiene acceso desde la propiedad CssFileName del control CrystalReportViewer, que se puede ver desde la ventana Propiedades cuando se selecciona el control CrystalReportViewer en la vista Diseño. Procedimiento 1. Cree un sitio Web con un control CrystalReportViewer y un informe de Crystal. 2. Compile y ejecute el proyecto al menos una vez para ver el control CrystalReportViewer con su configuración de estilo predeterminada y, a continuación, salga del modo de depuración. 3. Abra la página Default.aspx en la vista Diseño. 4. Haga clic una vez en el control CrystalReportViewer para seleccionarlo. 5. En la ventana Propiedades, busque la ruta de directorio de archivos en la propiedad CssFileName al archivo "default.css". 6. En el Explorador de Windows, busque este archivo y cópielo en el directorio del sitio Web. 7. Cambie el nombre del archivo a "custom.css". 8. Edite la propiedad CssFileName para que indique el directorio del sitio Web y el nombre de archivo "custom.css". 9. Vuelva a compilar y verifique que el control CrystalReportViewer ve el archivo custom.css en el directorio del sitio Web local. 10. Salga del modo de depuración. 11. Abra el archivo "custom.css" y edite la hoja de estilos. 12. Vuelva a compilar y verifique que los cambios se han aplicado al control CrystalReportViewer. 1.4.6.5 temas Personalizar el control CrystalReportViewer con Los temas son una herramienta destinada a dar una apariencia común a todos los controles visuales de una página (o de todo el sitio web). En el nivel de página, para administrar la apariencia de los controles visuales se establece la propiedad Theme de un control visual en el nombre de un tema. El tema se aplica a todos los controles visuales de la página. El control CrystalReportViewer es compatible con los temas de ASP.NET 2.0. Los cambios que realice en un tema se extienden al control CrystalReportViewer y a los demás controles visuales de la página. Para obtener más información sobre cómo establecer y personalizar los temas en ASP.NET 2.0, vea la documentación de la versión 2.0 de .NET Framework. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 235 Información relacionada Personalizar el control CrystalReportViewer con CSS [página 234] 1.4.6.6 Personalizar la barra de herramientas de CrystalReportViewer La barra de herramientas de CrystalReportViewer contiene botones que controlan funciones frecuentes de CrystalReportVIewer, como imprimir, exportar o cambiar la página que se puede visualizar en ese momento. Personalizar los botones de la barra de herramientas La barra de herramientas de CrystalReportViewer contiene botones que controlan funciones frecuentes de CrystalReportVIewer, como imprimir, exportar o cambiar la página que se puede visualizar en ese momento. La visibilidad de cada botón del control CrystalReportViewer se gestiona a través de su correspondiente propiedad de la clase CrystalReportViewer. Los nombres de las propiedades varían entre las versiones Windows y Web del control CrystalReportViewer. En un sitio web, el aspecto de la barra de herramientas se puede controlar mediante CSS o mediante temas ASP .Net. Puede cambiar el aspecto de los iconos predeterminados de los botones cambiando las imágenes en el directorio virtual del visor. Quitar la barra de herramientas Puede quitar la barra de herramientas del control CrystalReportViewer mediante programación o a través del panel de tareas inteligentes. Puede crear controles personalizados para imitar el comportamiento de varios botones de la barra de herramientas de CrystalReportViewer. Información relacionada Personalizar el control CrystalReportViewer con CSS [página 234] Personalizar el control CrystalReportViewer con temas [página 235] Directorio de visores [página 13] 236 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 1.4.6.6.1 Controlar los botones que aparecen en la barra de herramientas de CrystalReportViewer Se puede habilitar o deshabilitar individualmente cada uno de los botones de la barra de herramientas de CrystalReportViewer. La visibilidad de cada botón del control CrystalReportViewer se gestiona a través de su correspondiente propiedad de la clase CrystalReportViewer. Existen dos controles CrystalReportViewer en el SDK de SAP Crystal Reports .NET. Para un sitio web, usará la clase CrystalDecisions.Web.CrystalReportViewer. Para una aplicación de Windows, usará la clase CrystalDecisions.Windows.Forms.CrystalReportViewer. El nombre de la propiedad que controla la visibilidad de un botón de la barra de herramientas variará en función de la versión del control CrystalReportViewer que se use. Para la clase CrystalDecisions.Web.CrystalReportViewer, cada propiedad comienza con “Has”, como HasExportButton, HasPrintButton o HasSearchButton. Para la clase CrystalDecisions.Windows.Forms.CrystalReportViewer, cada propiedad comienza con “Show”, como ShowExportButton, ShowPrintButton o ShowSearchButton. Para obtener más información sobre la clase CrystalDecisions.Web.CrystalReportViewer o la clase CrystalDecisions.Windows.Forms.CrystalReportViewer, consulte SAP Crystal Reports .NET API Reference. Nota Al quitar un botón de la barra de herramientas no se deshabilitará el comportamiento correspondiente. Ejemplo Este ejemplo muestra cómo quitar varios botones de la barra de herramientas de CrystalReportViewer en un sitio web. Private Sub ConfigureCrystalReports() CrystalReportViewer1.HasPrintButton = False CrystalReportViewer1.HasExportButton = False CrystalReportViewer1.HasSearchButton = False End Sub private void ConfigureCrystalReports() { InitializeComponent(); crystalReportViewer1.HasPrintButton = false; crystalReportViewer1.HasExportButton = false; crystalReportViewer1.HasSearchButton = false; } Información relacionada Para quitar el botón de impresión del control CrystalReportViewer [página 113] Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 237 Para quitar el botón de exportación del control CrystalReportViewer [página 126] 1.4.6.6.2 Para quitar la barra de herramientas de CrystalReportViewer Contexto Sugerencias Puede quitar la barra de herramientas de la aplicación mediante programación o hacerlo desmarcando la casilla de verificación Mostrar barra de herramientas en el panel de tareas inteligentes Tareas de CrystalReportViewer. Procedimiento 1. Agregue un control CrystalReportViewer a la aplicación. 2. Establezca la propiedad CrystalReportViewer.DisplayToolbar como falsa. Resultados Al ejecutar la aplicación, la barra de herramientas ya no aparecerá en el control CrystalReportViewer. Ejemplo Private Sub ConfigureCrystalReports() CrystalReportViewer1.DisplayToolbar = False End Sub private void ConfigureCrystalReports() { InitializeComponent(); crystalReportViewer1.DisplayToolbar = false; } 238 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 1.4.6.6.3 Para cambiar los botones predeterminados de la barra de herramientas en el visor web Contexto La barra de herramientas de CrystalReportViewer está formada por diferentes gráficos que representan la mayoría de las propiedades disponibles. Los gráficos se almacenan en el directorio virtual de visores de la versión de SAP Crystal Reports, versión para programadores de Microsoft Visual Studio. Para un sitio Web, la barra de herramientas usa gráficos para representar las siguientes propiedades: ● Árbol de grupo ● Exportar ● Imprimir ● Sintetizar ● Exploración de páginas: página primera, última, anterior y siguiente ● Ir a página ● Buscar ● Logotipo de SAP BusinessObjects No es posible cambiar estos botones a su propio conjunto de iconos personalizados. Procedimiento 1. Desplácese hasta el directorio virtual del visor. 2. Haga doble clic en la carpeta images. 3. Haga doble clic en la carpeta toolbar. En la carpeta toolbar, puede encontrar todas las imágenes utilizadas para la barra de herramientas de CrystalReportViewer. 4. Reemplace las imágenes por otras que elija, o abra las imágenes en un editor de gráficos para modificarlas. No obstante, se conservará el nombre de la imagen. Resultados Se cambiarán las imágenes de la barra de herramientas de CrystalReportViewer para todas las aplicaciones web que usen ese directorio virtual de visores. Información relacionada Directorio de visores [página 13] Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 239 1.4.7 Uso de los informes de sólo lectura de SAP Crystal Reports (RPTR) Los informes de sólo lectura de SAP Crystal Reports (RPTR) son informes de Crystal que pueden verse en las aplicaciones del visor de informes, pero que no pueden modificarse con el SDK ni abrirse con las aplicaciones del diseñador de informes. Esto permite proteger la propiedad intelectual al impedir que los usuarios modifiquen el informe u obtengan información sobre la lógica comercial de propiedad almacenada en la definición del informe. Los informes de formato de sólo lectura de SAP Crystal Reports tienen la extensión de archivo RPTR en lugar de la extensión de archivo RPT de los informes de Crystal. Puede crear un informe RPTR exportando un informe RPT al formato RPTR. No obstante, no existe un modo de convertir un informe RPTR en un informe RPT. Puesto que la definición de un informe RPTR no se puede modificar, no se puede usar este SDK para definir la ubicación de origen de los datos de un informe RPTR mediante el controlador de la base de datos. Sin embargo, se pueden actualizar los datos de un informe RPTR en tiempo de ejecución. Puede usar este SDK para realizar las tareas siguientes: ● Crear un informe RPTR exportando un informe de Crystal (RPT) al formato RPTR. Nota Sólo se pueden exportar al formato RPTR los informes creados por SAP Crystal Reports 2011. ● Ver un informe RPTR obteniendo el origen del informe y pasándolo a un visor. ● Actualizar los datos de un informe RPTR en tiempo de ejecución. ● Abrir un informe RPTR y exportarlo a otros formatos diferentes de RPT. No se puede usar este SDK para realizar las tareas siguientes: ● Modificar la definición de un informe RPTR. ● Definir la ubicación del origen de datos del informe. ● Recuperar información sobre la definición de un informe RPTR, incluidos las fórmulas, los campos, las secciones y los objetos que componen el objeto. ● Exportar un informe RPTR a formato RPT. ● Agregar un informe RPTR como un subinforme a un informe RPT. 1.5 Tutoriales 1.5.1 Tutoriales del modelo de objeto CrystalReportViewer Los tutoriales de esta sección utilizan los métodos y las propiedades de la clase CrystalReportViewer y las clases del espacio de nombres CrystalDecisions.Shared. Los tutoriales de esta sección utilizan los métodos y las propiedades de la clase CrystalReportViewer y las clases del espacio de nombres CrystalDecisions.Shared. 240 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 1.5.1.1 Tutorial: Conectar con una base de datos segura de SQL Server utilizando autenticación de SQL En este tutorial, aprenderá a agregar código de conexión para mostrar un informe que contiene información de una base de datos segura de SQL Server. Introducción Cuando utilice el modelo de objetos CrystalReportViewer para conectar con una base de datos segura de SQL Server, debe usar clases del espacio de nombres CrystalDecisions.Shared. Las propiedades de la clase ConnectionInfo se utilizan para conectar con el servidor de base de datos u otros orígenes de datos ODBC. En este tutorial, establecerá las propiedades ServerName, DatabaseName, UserID y Password. Si decide establecer únicamente las propiedades DatabaseName, UserID y Password, se conectará con el servidor predeterminado de la base de datos especificada en el informe. Sin embargo, si elige asignar una propiedad ServerName alternativa, podrá redirigir el informe a un servidor diferente en tiempo de ejecución. Obtendrá la instancia de TableLogOnInfos de la propiedad LogOnInfo del control CrystalReportViewer. A continuación, asignará la instancia de ConnectionInfo a cada objeto TableLogOnInfo de la instancia de TableLogOnInfos. El código de conexión de este tutorial también funciona para los subinformes insertados en el informe principal. Para el modelo de objetos ReportDocument, debe modificar el código con el fin de que funcione para los subinformes (vea Tutorial: Conectar con una base de datos segura de SQL Server con un subinforme [página 378]). Para realizar este tutorial mediante el modelo de objetos ReportDocument, vea Tutorial: Conectar con una base de datos segura de SQL Server utilizando autenticación de SQL [página 241]. El modelo de objetos ReportDocument se recomienda con respecto al modelo de objetos CrystalReportViewer. Código de ejemplo Cada tutorial viene con código de ejemplo de C# y Visual Basic que muestra la versión finalizada del proyecto. Siga las instrucciones de este tutorial para crear un nuevo proyecto o para abrir el proyecto de código de ejemplo y trabajar con una versión finalizada. El código de ejemplo se almacena en carpetas que están clasificadas por idioma y tipo de proyecto. Los nombres de las carpetas de cada versión del código de ejemplo son los siguientes: ● Sitio Web en C#: CS_Web_CRVObjMod_DBLogon ● Proyecto para Windows en C#: CS_Win_CRVObjMod_DBLogon ● Sitio Web en Visual Basic: VB_Web_CRVObjMod_DBLogon ● Proyecto para Windows en Visual Basic: VB_Win_CRVObjMod_DBLogon Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 241 Información relacionada Elegir el modelo de objetos correcto para el proyecto [página 31] Directorio de informes de muestra [página 14] 1.5.1.1.1 Crear un informe conectado a una base de datos segura de SQL Server Requisitos previos ● Configuración de SQL Server: ○ Si tiene instalado SQL Server (o la versión OEM, MSDE), debe configurarse de modo que requiera la Autenticación de SQL Server. ○ Si no tiene instalado SQL Server (ni la versión OEM, MSDE), debe instalar MSDE con la autenticación de SQL Server establecida en "True". ● Se debe instalar la base de datos Northwind incluida con SQL Server y verificar que requiere la autenticación de SQL Server. ● Se debe crear una cuenta de acceso limitado para utilizarla en el sitio Web. Contexto Una vez configurados SQL Server y la base de datos Northwind de acuerdo a las secciones anteriores, ya podrá crear un informe que obtenga su información de la base de datos Northwind de forma segura. Nota Este procedimiento sólo funciona con un proyecto creado a partir de la Configuración de proyectos [página 14]. La configuración de proyectos contiene referencias específicas a espacios de nombres y configuración de códigos necesarios para este procedimiento, que no se podrá completar sin dicha configuración. Procedimiento 1. En el Explorador de soluciones, haga clic con el botón secundario en el nombre de proyecto en negrita, elija Agregar y, a continuación, haga clic en Agregar nuevo elemento. 2. En el cuadro de diálogo Agregar nuevo elemento, en la vista Plantillas, seleccione la plantilla Crystal Report. 3. En el campo Nombre, escriba "NorthwindCustomers.rpt" y haga clic en Abrir. 4. En el panel Crear un nuevo documento de Crystal Reports del cuadro de diálogo Galería de Crystal Reports, seleccione Usar asistente de informes. 242 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 5. En el panel Elegir un Asistente, seleccione Estándar y, a continuación, haga clic en Aceptar. Aparecerá la ventana Asistente para la creación de informes estándar. 6. En el panel Orígenes de datos disponibles, expanda la carpeta Crear nueva conexión. 7. En la subcarpeta que se abre, expanda la carpeta OLE DB (ADO). Aparecerá la ventana OLE DB (ADO). 8. Seleccione Proveedor de Microsoft OLE DB para SQL Server y, a continuación, haga clic en Siguiente. 9. Especifique los valores de su servidor de base de datos, ID de usuario y contraseña en los campos Servidor, ID de usuario y Contraseña. 10. En la lista desplegable Base de datos, seleccione "Northwind". Deje desactivada la casilla de verificación Seguridad integrada porque está usando la autenticación de SQL Server en lugar de la autenticación de NT. 11. Haga clic en Finalizar. Ahora se expandirá la carpeta OLE DB, mostrando el servidor de base de datos y, dentro de él, la base de datos Northwind. 12. Expanda los nodos Northwind, dbo y Tablas, y, a continuación, seleccione la tabla Customers. 13. Haga clic en el símbolo > para mover la tabla al panel Tablas seleccionadas y, a continuación, haga clic en Siguiente. 14. Expanda la tabla Customers y, a continuación, mantenga presionada la tecla Ctrl mientras hace clic en CompanyName, ContactName y City. 15. Haga clic en el símbolo > para mover estos campos al panel Campos a mostrar y, a continuación, haga clic en Siguiente. 16. En el panel Campos disponibles, en Campos del informe, seleccione Cliente.Ciudad, haga clic en el símbolo > para mover el campo al panel Agrupar por y, a continuación, haga clic en Finalizar. Se creará el informe NorthwindCustomers y se cargará en la ventana principal de Visual Studio. 1.5.1.1.2 Enlazar el informe sin código de conexión En Configuración de proyectos [página 14], ha colocado un control CrystalReportViewer en el formulario Web Forms o Windows Forms. En el paso anterior, ha agregado un informe NorthwindCustomers al proyecto. En esta sección enlazará la ruta de directorio de archivos del informe NorthwindCustomers al control CrystalReportViewer. A continuación, probará si el informe se muestra correctamente cuando no se ha establecido el código de conexión. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 243 1.5.1.1.2.1 Para enlazar la ruta de directorio de archivos del informe NorthwindCustomers al control CrystalReportViewer Procedimiento 1. Abra el formulario Web Forms o Windows Forms. 2. En el menú Ver, haga clic en Código. 3. Busque el método ConfigureCrystalReports() (que ha creado en Configuración de proyectos [página 14]). 4. Declare una variable de cadena, llámela reportPath y asígnele una ruta en tiempo de ejecución al informe local. Esta ruta se determina de forma diferente para los sitios Web y los proyectos para Windows: ○ Para un sitio Web, pase el nombre del archivo de informe local como un parámetro de cadena al método Server.MapPath(). Esto asigna el informe local a la ruta del directorio de archivos de la unidad de disco duro en tiempo de ejecución. Dim reportPath As String = Server.MapPath("NorthwindCustomers.rpt") string reportPath = Server.MapPath("NorthwindCustomers.rpt"); ○ Para un proyecto Windows, concatene la propiedad Application.StartupPath con una barra diagonal inversa y el nombre del archivo de informe local. Esto asigna el informe al mismo directorio del archivo ejecutable de Windows. Nota En la fase de compilación se copiará el informe al directorio que contiene el archivo ejecutable. Dim reportPath As String = Application.StartupPath & "\" & "NorthwindCustomers.rpt" string reportPath = Application.StartupPath + "\\" + "NorthwindCustomers.rpt"; 5. Asigne la ruta del directorio de archivos del informe NorthwindCustomers a la propiedad ReportSource del control CrystalReportViewer. myCrystalReportViewer.ReportSource = reportPath crystalReportViewer.ReportSource = reportPath; 244 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 1.5.1.1.2.2 Para probar la carga del informe NorthwindCustomers Contexto Ahora estará listo para crear y ejecutar el proyecto. Está previsto que falle la carga del informe, porque aún no se ha escrito el código para conectarse con la base de datos. Procedimiento 1. En el menú Generar, seleccione Generar solución. 2. Si existen errores de generación, continúe y corríjalos ahora. 3. Si usa un informe no incrustado en un proyecto Windows, busque el archivo ejecutable de Windows compilado en el subdirectorio \bin\debug\ y, a continuación, copie el informe en dicho subdirectorio. Nota Para que el archivo ejecutable de Windows cargue el informe no incrustado en tiempo de ejecución, el informe deberá estar almacenado en el mismo directorio que el archivo ejecutable de Windows. 4. En el menú Depurar, haga clic en Iniciar. No se mostrará el informe NorthwindCustomers. Se mostrará después de agregar el código de conexión con la base de datos. Nota Los resultados pueden variar según la versión de SAP Crystal Reports que use. Por ejemplo, si tiene instalado SAP Crystal Reports 10 o una versión superior, se le pedirá información de conexión a la base de datos para ese informe. Si ejecuta una versión anterior de SAP Crystal Reports, se produce una excepción. En cualquier caso, debe seguir el siguiente procedimiento de pasos para crear una aplicación totalmente funcional. 5. Vuelva a Visual Studio y haga clic en Detener para salir del modo de depuración. 1.5.1.1.3 Agregar el código de conexión del informe Ahora estará preparado para agregar el código de conexión del informe a la clase de código subyacente. Va a empezar por crear un método auxiliar privado, SetDBLogonForReport(). Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 245 1.5.1.1.3.1 Para crear y codificar el método SetDBLogonForReport() Procedimiento 1. Regrese a la clase de código subyacente de este Web Forms o Windows Forms. 2. En la parte inferior de la clase, cree un nuevo método privado denominado SetDBLogonForReport() al que se le pase ConnectionInfo en la firma de método. Private Sub SetDBLogonForReport(ByVal myConnectionInfo As ConnectionInfo) End Sub private void SetDBLogonForReport(ConnectionInfo connectionInfo) { } 3. Con este método, se obtiene la instancia de TableLogOnInfos de la propiedad LogOnInfo de la clase CrystalReportViewer. Nota TableLogOnInfos es una clase indizada que contiene instancias de la clase TableLogOnInfo. Dim myTableLogOnInfos As TableLogOnInfos = myCrystalReportViewer.LogOnInfo TableLogOnInfos tableLogOnInfos = crystalReportViewer.LogOnInfo; 4. Cree un bucle foreach que recorra todas las instancias de TableLogOnInfo de la instancia de clase indizada TableLogOnInfos. For Each myTableLogOnInfo As TableLogOnInfo In myTableLogOnInfos Next foreach(TableLogOnInfo tableLogOnInfo in tableLogOnInfos) { } 5. En el bucle foreach, establezca la propiedad ConnectionInfo de TableLogOnInfo en el parámetro ConnectionInfo. myTableLogOnInfo.ConnectionInfo = myConnectionInfo tableLogOnInfo.ConnectionInfo = connectionInfo; 246 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 1.5.1.1.3.2 Para modificar el método ConfigureCrystalReports() para direccionar el código de conexión con la base de datos Contexto El procedimiento de este paso ha creado un método para establecer la conexión de la base de datos. Sin embargo, debe modificar el método ConfigureCrystalReports() para direccionar este método, con el fin de que el informe sepa que tiene información sobre conexión de base de datos. La modificación del método ConfigureCrystalReports() requiere dos acciones: ● Configurar la instancia de ConnectionInfo. ● Llamar al método SetDBLogonForReport(). Procedimiento 1. En el método ConfigureCrystalReports(), declare y cree una instancia de la clase ConnectionInfo debajo del código que enlaza el informe al control CrystalReportViewer. Dim myConnectionInfo As ConnectionInfo = New ConnectionInfo() ConnectionInfo connectionInfo = new ConnectionInfo(); 2. En la siguiente línea, llame al método SetDBLogonForReport() y pásele la instancia de ConnectionInfo. SetDBLogonForReport(myConnectionInfo) SetDBLogonForReport(connectionInfo); 3. Establezca las propiedades DatabaseName, UserID y Password de la instancia de ConnectionInfo. Nota Por razones de seguridad, es importante utilizar una cuenta de base de datos con permisos de acceso limitado. En el código que escriba, reemplace la contraseña de ejemplo 1234 (que se muestra más abajo) por su propia contraseña. myConnectionInfo.DatabaseName = "Northwind" myConnectionInfo.UserID = "limitedPermissionAccount" myConnectionInfo.Password = "1234" connectionInfo.DatabaseName = "Northwind"; Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 247 connectionInfo.UserID = "limitedPermissionAccount"; connectionInfo.Password = "1234"; 1.5.1.1.3.3 Para probar la carga del informe NorthwindCustomers Contexto Ahora estará listo para crear y ejecutar el proyecto. El informe se debe cargar correctamente, ya que ha agregado código para conectar con la base de datos. Procedimiento 1. En el menú Generar, seleccione Generar solución. 2. Si existen errores de generación, continúe y corríjalos ahora. 3. En el menú Depurar, haga clic en Iniciar. El informe NorthwindCustomers se mostrará correctamente. 4. Vuelva a Visual Studio y haga clic en Detener para salir del modo de depuración. 1.5.1.1.4 Agregar la posibilidad de cambiar la ubicación de la base de datos en tiempo de ejecución En esta sección, aprenderá a cambiar la ubicación de la base de datos en tiempo de ejecución. Sólo requiere una pequeña modificación de la instancia de ConnectionInfo. Nota En este tutorial cambiará el nombre del servidor de base de datos, no el nombre de la base de datos. No es posible cambiar el nombre de la base de datos con el control CrystalReportViewer. 1.5.1.1.4.1 Para cambiar la ubicación de la base de datos en tiempo de ejecución Procedimiento 1. En el método ConfigureCrystalReports(), agregue un par de saltos de línea al código detrás de la línea que llama SetDBLogonForReport(). 248 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 2. En los saltos de línea, establezca la propiedad ServerName de la instancia de ConnectionInfo. Nota En el código que escriba, reemplace el nombre del servidor de ejemplo DevDatabaseServer (que aparece más abajo) por el nombre de su servidor. myConnectionInfo.ServerName = "DevDatabaseServer" connectionInfo.ServerName = "DevDatabaseServer"; 1.5.1.1.4.2 Para probar si el informe se puede restablecer a un servidor de base de datos alternativo en tiempo de ejecución Contexto Ahora estará listo para crear y ejecutar el proyecto. El informe se debe redirigir al servidor de base de datos alternativo en tiempo de ejecución. Procedimiento 1. En el menú Generar, seleccione Generar solución. 2. Si existen errores de generación, continúe y corríjalos ahora. 3. En el menú Depurar, haga clic en Iniciar. El informe NorthwindCustomers se mostrará correctamente. 4. Vuelva a Visual Studio y haga clic en Detener para salir del modo de depuración. 1.5.1.2 Tutorial: Leer y configurar parámetros discretos En este tutorial aprenderá a crear un informe cuyos datos se puedan filtrar según un parámetro discreto. Introducción Un parámetro discreto es un único valor, a diferencia de un parámetro de rango, que hace referencia a un rango de valores. A los elementos de texto (como ciudades) se tiene acceso normalmente mediante parámetros Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 249 discretos. A los elementos numéricos(como sueldos de empleados) se suele acceder mediante parámetros de rango. En este tutorial establecerá un valor de un parámetro discreto para ver un informe de clientes basado en un solo campo. El informe muestra únicamente los clientes que viven en las ciudades seleccionadas en una lista de ciudades. La lista de ciudades proviene de los valores predeterminados del parámetro de ciudad. Dichos valores predeterminados del parámetro de ciudad se encapsulan dentro del informe. Para empezar, va a crear un informe de clientes con un parámetro de ciudad. Los datos del informe proceden de la base de datos de ejemplo incluida en SAP Crystal Reports, versión para programadores de Microsoft Visual Studio. Al crear una instancia del informe en el código, generará un ArrayList que contiene nombres de ciudades (Paris, Tokyo) y pasará dicha instancia de ArrayList a un método auxiliar que establezca estos nombres como valores actuales del parámetro Ciudad. A continuación, enlazará el informe al control CrystalReportViewer y verá el informe que mostrará únicamente los clientes que vivan en París y Tokio. En la siguiente parte del tutorial, realizará las siguientes acciones: ● Crear un método que obtenga todos los valores predeterminados y los devuelva en un ArrayList. ● Agregar un control ListBox al formulario y rellenarlo a partir de ArrayList. ● Agregar un control Button para volver a mostrar el informe basado en las selecciones de ListBox. En la parte final del tutorial, codificará el evento de clic de botón para obtener los elementos seleccionados en el control ListBox y establecerlos para que sean los valores actuales del parámetro de ciudad. El informe se volverá a mostrar incluyendo únicamente los clientes que vivan en las ciudades seleccionadas en el control ListBox. Código de ejemplo Este tutorial incluye código de ejemplo de C# y Visual Basic que muestra la versión finalizada del proyecto. Siga las instrucciones de este tutorial para crear un nuevo proyecto o para abrir el proyecto de código de ejemplo y trabajar con una versión finalizada. El código de ejemplo se almacena en carpetas que están clasificadas por idioma y tipo de proyecto. Los nombres de las carpetas de cada versión del código de ejemplo son los siguientes: ● Sitio Web en C#: CS_Web_CRVObjMod_Parameters ● Proyecto para Windows en C#: CS_Win_CRVObjMod_Parameters ● Sitio Web en Visual Basic: VB_Web_CRVObjMod_Parameters ● Proyecto para Windows en Visual Basic: VB_Win_CRVObjMod_Parameters Base de datos Xtreme Algunos de los tutoriales utilizan la base de datos Xtreme. Se incluye con el paquete de código de muestra que se puede descargar desde http://www.sdn.sap.com/irj/boc/sdklibrary ODBC a la base de datos. 250 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. . Deberá crear manualmente una conexión Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Información relacionada Directorio de informes de muestra [página 14] 1.5.1.2.1 Crear un informe con parámetros Para comenzar, cree un informe que obtenga su información de la base de datos Xtreme. 1.5.1.2.1.1 Para crear un informe con parámetros Procedimiento 1. En el Explorador de soluciones, haga clic con el botón secundario en el nombre de proyecto en negrita, elija Agregar y, a continuación, haga clic en Agregar nuevo elemento. 2. En el cuadro de diálogo Agregar nuevo elemento, en la vista Plantillas, seleccione la plantilla Crystal Report. 3. En el campo Nombre, escriba el nombre CustomersByCity.rpt y haga clic en Agregar. 4. En el panel Crear un nuevo documento de Crystal Reports del cuadro de diálogo Galería de Crystal Reports, seleccione Usar asistente de informes. 5. En el panel Elegir un Asistente, seleccione Estándar y, a continuación, haga clic en Aceptar. 6. En el panel Orígenes de datos disponibles de la ventana Asistente para la creación de informes estándar, expanda la carpeta Crear nueva conexión. 7. En la subcarpeta que se abre, expanda la carpeta ODBC (RDO). 8. En la ventana ODBC (RDO), seleccione la entrada ODBC DSN correcta para la base de datos Xtreme y haga clic en Finalizar. 9. Expanda el nodo Tablas, haga doble clic en la tabla Cliente para mover la tabla al panel Tablas seleccionadas y, a continuación, haga clic en Siguiente. 10. Expanda la tabla Cliente, mantenga presionada la tecla Ctrl y haga clic en Nombre del cliente, Título del contacto, Dirección1, Apellido del cliente y Ciudad. 11. Haga clic en el símbolo > para mover estos campos al panel Campos a mostrar y, a continuación, haga clic en el botón Siguiente. 12. En el panel Campos disponibles, en Campos del informe, haga doble clic en Cliente.Ciudad para mover el campo al panel Agrupar por y, a continuación, haga clic en el botón Finalizar. Se creará el informe CustomersByCity y se cargará en la ventana principal de Visual Studio. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 251 1.5.1.2.1.2 Para agregar un parámetro Ciudad Contexto Ahora ya podrá agregar un parámetro denominado Ciudad y ocuparlo con valores predeterminados. El Explorador de campos debe estar visible, porque proporciona acceso a las distintas funciones del informe, incluidos los parámetros. Para ver el Explorador de campos, en el menú Crystal Reports, haga clic en Explorador de campos. Procedimiento 1. Si el Explorador de campos no está visible, en la barra de herramientas de Crystal Reports, haga clic en Cambiar la vista del campo. Sugerencias Otro modo de ver el Explorador de campos es ir al menú Crystal Reports y hacer clic en Explorador de campos. 2. En el Explorador de campos, haga clic con el botón secundario en Campos de parámetro y seleccione Nuevo... 3. En el cuadro de diálogo Crear campo de parámetro: a) Establezca el Nombre como Ciudad. b) Defina Tipo como Cadena. Establezca Texto de solicitud en Seleccione una o varias ciudades. c) Defina Campo de valor como Ciudad. d) Haga clic en Acciones y seleccione Anexar todos los valores de base de datos. De esta forma se agregará la lista de ciudades completa al panel intermedio. e) En el panel Opciones de valor, establezca Texto de petición en Seleccione una o varias ciudades. f) En el mismo panel, defina Permitir valores múltiples como Verdadero. g) Establezca Permitir valores discretos como Verdadero. 4. Haga clic en Aceptar para cerrar el cuadro de diálogo Crear campo de parámetro. 1.5.1.2.1.3 Para conectar el parámetro Ciudad a la columna de base de datos Ciudad Contexto Acaba de establecer los valores predeterminados para que contengan una amplia lista de ciudades. Posteriormente, en este tutorial, va a tener acceso a esta misma lista de valores predeterminados mediante programación, a través de la propiedad ParameterFieldInfo de la clase CrystalReportViewer. Ahora va a utilizar el Asistente de selección para establecer una fórmula que conecte la columna de base de datos Ciudad con el campo de parámetro Ciudad creado recientemente. 252 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Procedimiento 1. En la barra de herramientas de Crystal Reports, haga clic en Asistente de selección. 2. En el cuadro de diálogo Elegir campo, en Campos del informe, seleccione Cliente.Ciudad y, a continuación, haga clic en Aceptar. 3. En el cuadro de diálogo Select Expert, en la ficha Customer.City, establezca la lista desplegable como "es igual a". 4. En la nueva lista desplegable que aparece a la derecha, seleccione la primera opción de la lista, {?City} y, a continuación, haga clic en Aceptar. Nota Esta selección, {?City}, es el parámetro Ciudad creado anteriormente. 5. En el menú Archivo, seleccione Guardar todo. Resultados Ahora podrá enlazar el informe al control CrystalReportViewer y establecer el parámetro de ciudad con dos valores iniciales, París y Tokio. 1.5.1.2.2 Enlazar el informe Al seguir las instrucciones de Configuración de proyectos [página 14] para preparar este tutorial, ha colocado un control CrystalReportViewer en el formulario Web Forms o Windows Forms. En los pasos anteriores, agregó un informe CustomersByCity al proyecto. En esta sección enlazará la ruta de directorio de archivos del informe CustomersByCity con el control CrystalReportViewer. A continuación, probará si el informe se muestra correctamente cuando no se han establecido valores actuales para su campo de parámetro. 1.5.1.2.2.1 Para enlazar la ruta de directorio de archivos del informe CustomersByCity al control CrystalReportViewer Procedimiento 1. Abra el formulario Web Forms o Windows Forms. 2. En el menú Ver, haga clic en Código para ver la clase de código subyacente de Web Forms o Windows Forms. 3. Busque el método ConfigureCrystalReports() (que ha creado en Configuración de proyectos [página 14]). Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 253 4. Declare una variable de cadena, llámela reportPath y asígnele una ruta en tiempo de ejecución al informe local. Esta ruta se determina de forma diferente para los sitios Web y los proyectos para Windows: ○ Para un sitio Web, pase el nombre del archivo de informe local como un parámetro de cadena al método Server.MapPath(). Esto asigna el informe local a la ruta del directorio de archivos de la unidad de disco duro en tiempo de ejecución. Dim reportPath As String = Server.MapPath("CustomersByCity.rpt") string reportPath = Server.MapPath("CustomersByCity.rpt"); ○ Para un proyecto Windows, concatene la propiedad Application.StartupPath con una barra diagonal inversa y el nombre del archivo de informe local. Esto asigna el informe al mismo directorio del archivo ejecutable de Windows. Nota En la fase de compilación se copiará el informe al directorio que contiene el archivo ejecutable. Dim reportPath As String = Application.StartupPath & "\" & "CustomersByCity.rpt" string reportPath = Application.StartupPath + "\\" + "CustomersByCity.rpt"; 5. Asigne la ruta de directorio de archivos del informe CustomersByCity a la propiedad ReportSource del control CrystalReportViewer. myCrystalReportViewer.ReportSource = reportPath crystalReportViewer.ReportSource = reportPath; 1.5.1.2.2.2 Para probar la carga del informe CustomersByCity Contexto Ahora estará listo para crear y ejecutar el proyecto. Está previsto que falle la carga del informe, porque aún no se ha escrito el código para establecer un valor para el campo de parámetro Ciudad. 254 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Procedimiento 1. En el menú Generar, seleccione Generar solución. 2. Si existen errores de generación, continúe y corríjalos ahora. 3. Si usa un informe no incrustado en un proyecto Windows, busque el archivo ejecutable de Windows compilado en el subdirectorio \bin\ [Visual Basic] o \bin\debug\ [C#] y, a continuación, copie el informe en dicho subdirectorio. Nota Para que el archivo ejecutable de Windows cargue el informe no incrustado en tiempo de ejecución, el informe deberá estar almacenado en el mismo directorio que el archivo ejecutable de Windows. 4. En el menú Depurar, haga clic en Iniciar. No se muestra el informe CustomersByCity. Se muestra después de agregar un valor para el parámetro Ciudad más adelante en este tutorial. Nota Los resultados pueden variar según la versión de SAP Crystal Reports que use. En versiones más recientes, verá un formulario que le pedirá que indique valores de parámetro para dicho informe. En versiones anteriores, se produce una excepción "Falta el valor actual del campo de parámetro". En cualquiera caso, debe agregar código adicional para que la aplicación sea completamente funcional. 5. Vuelva a Visual Studio y haga clic en Detener para salir del modo de depuración. 1.5.1.2.3 Configurar parámetros manualmente en el código Ahora ya puede establecer dos valores ("París" y "Tokio") en el campo de parámetro Ciudad del informe CustomersByCity. Esto implica codificación, que puede separar en los siguientes procesos: ● Necesita una constante PARAMETER_FIELD_NAME para que contenga el nombre del campo de parámetro "Ciudad". ● El código para agregar los valores actuales al parámetro Ciudad se utiliza en distintas partes de este tutorial; por lo tanto, este código se creará como un método auxiliar independiente. ● En el método ConfigureCrystalReports(), va a agregar los parámetros "Paris" y "Tokyo" a una instancia de ArrayList y va a pasar el informe y la instancia de ArrayList al método auxiliar para que se procesen. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 255 1.5.1.2.3.1 Para crear una constante PARAMETER_FIELD_NAME Procedimiento 1. Regrese a la clase de código subyacente de este Web Forms o Windows Forms. 2. En el nivel de clase, cree una nueva constante de cadena, PARAMETER_FIELD_NAME, y establezca su valor como "Ciudad". Private Const PARAMETER_FIELD_NAME As String = "City" private const string PARAMETER_FIELD_NAME = "City"; 1.5.1.2.3.2 Para crear un método auxiliar que agregue los valores actuales al parámetro en el informe Contexto Ahora ya puede crear el método auxiliar que agregue los valores actuales al parámetro en el informe. Procedimiento 1. Regrese a la clase de código subyacente de este Web Forms o Windows Forms. 2. Sobre la firma de clase, agregue una declaración "Imports" [Visual Basic] o "using" [C#] en la parte superior de la clase para el espacio de nombres System.Collections (si todavía no se ha declarado este espacio de nombres). Nota Esta declaración se necesita para tener acceso a la clase ArrayList. Imports System.Collections using System.Collections; 3. En la parte inferior de la clase, cree un nuevo método privado denominado SetCurrentValuesForParameterField() con dos variables en la firma de método: ParameterFields y ArrayList. Private Sub SetCurrentValuesForParameterField(ByVal myParameterFields As 256 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net ParameterFields, ByVal myArrayList As ArrayList) End Sub private void SetCurrentValuesForParameterField(ParameterFields parameterFields, ArrayList arrayList) { } 4. En este método, declare y cree una instancia de la clase ParameterValues como la variable currentParameterValues. Nota Para que se pueda tener acceso a la clase ParameterValues, debe haber incluido una declaración "Imports" [Visual Basic] o "using" [C#] en la parte superior de la clase de código subyacente del espacio de nombres CrystalDecisions.Shared. (Esta declaración se ha agregado en Configuración de proyectos [página 14].) Dim currentParameterValues As ParameterValues = New ParameterValues() ParameterValues currentParameterValues = new ParameterValues(); 5. Cree un bucle foreach para obtener todos los valores enviados (como tipo Object) de la instancia de ArrayList. Nota En este método, recupera valores de ArrayList. Posteriormente, va a escribir código que agregue valores a ArrayList. For Each submittedValue As Object In myArrayList Next foreach(object submittedValue in arrayList) { } 6. En el bucle foreach, declare y cree una instancia de la clase ParameterDiscreteValue. Dim myParameterDiscreteValue As ParameterDiscreteValue = New ParameterDiscreteValue() ParameterDiscreteValue parameterDiscreteValue = new ParameterDiscreteValue(); Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 257 7. En el bucle foreach, convierta submittedValue en una cadena y pásela a la propiedad Value de la instancia de ParameterDiscreteValue. myParameterDiscreteValue.Value = submittedValue.ToString() parameterDiscreteValue.Value = submittedValue.ToString(); 8. En el bucle foreach, agregue la instancia de ParameterDiscreteValue a la clase indizada currentParameterValues. Esto completará el código en el bucle foreach. Coloque el código restante (a partir de los pasos siguientes) después del bucle foreach. currentParameterValues.Add(myParameterDiscreteValue) currentParameterValues.Add(parameterDiscreteValue); 9. Fuera del bucle foreach, obtenga la instancia de ParameterField de la clase indizada ParameterFields que se basa en la entrada de índice de la constante PARAMETER_FIELD_NAME. Dim myParameterField As ParameterField = myParameterFields(PARAMETER_FIELD_NAME) ParameterField parameterField = parameterFields[PARAMETER_FIELD_NAME]; 10. Pase la instancia de currentParameterValues a la propiedad CurrentValues de la instancia de ParameterField. myParameterField.CurrentValues = currentParameterValues parameterField.CurrentValues = currentParameterValues; 1.5.1.2.3.3 Para llamar al método SetCurrentValuesForParameterField () antes de enlazar el informe al control CrystalReportViewer Contexto En este procedimiento con varios pasos se ha mostrado el modo de crear un método que recupera los valores enviados desde una instancia de ArrayList y los coloca como valores actuales en una instancia de ParameterField. A continuación, debe llamar a este método antes de enlazar el informe al control CrystalReportViewer, para que el informe sepa que tiene configuración de parámetros. 258 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Procedimiento 1. En el método ConfigureCrystalReports(), declare y cree una instancia de ArrayList encima de la línea que enlaza el informe al control CrystalReportViewer. Dim myArrayList As ArrayList = New ArrayList() ArrayList arrayList = new ArrayList(); 2. Agregue los nombres de ciudad "París" y "Tokio" como cadenas a la instancia de ArrayList. myArrayList.Add("Paris") myArrayList.Add("Tokyo") arrayList.Add("Paris"); arrayList.Add("Tokyo"); 3. Debajo del código que enlaza el control CrystalReportViewer, obtenga la instancia de ParameterFields de la propiedad ParameterFieldInfo del control CrystalReportViewer. Dim myParameterFields As ParameterFields = myCrystalReportViewer.ParameterFieldInfo ParameterFields parameterFields = crystalReportViewer.ParameterFieldInfo; 4. Llame al método SetCurrentValuesForParameterField() y pásele la instancia de ParameterFields y la instancia de ArrayList. SetCurrentValuesForParameterField(myParameterFields, myArrayList) SetCurrentValuesForParameterField(parameterFields, arrayList); 1.5.1.2.3.4 Para probar la carga del informe CustomersByCity Contexto Ahora estará listo para crear y ejecutar el proyecto. Se espera que el informe se muestre correctamente, porque ahora existe código escrito para establecer los valores actuales en el campo de parámetro. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 259 Procedimiento 1. En el menú Generar, seleccione Generar solución. 2. Si existen errores de generación, continúe y corríjalos ahora. 3. En el menú Depurar, haga clic en Iniciar. 4. Vuelva a Visual Studio y haga clic en Detener para salir del modo de depuración. Resultados En la siguiente sección, aprenderá como obtener los valores predeterminados del campo de parámetro y establecerá dichos valores en un control ListBox. Éstos se utilizan al final del tutorial para seleccionar nuevas ciudades dinámicamente y filtrar el informe basándose en las ciudades seleccionadas recientemente. 1.5.1.2.4 Crear un control ListBox que muestre los parámetros predeterminados El resto del tutorial trata cómo mostrar una lista completa de valores predeterminados del campo de parámetro en un control ListBox, y según las selecciones que se realicen en dicho control ListBox, volver a filtrar el contenido del informe. En esta sección aprenderá a rellenar el control ListBox con los valores predeterminados del campo de parámetro. Nota Recuerde que ya estableció los Valores predeterminados, una amplia lista de ciudades, al crear este informe al principio del tutorial. Para hacerlo, deberá agregar y configurar un control ListBox y, a continuación, crear un método auxiliar para rellenar el control ListBox. 1.5.1.2.4.1 formulario Para crear y configurar un control ListBox en el Procedimiento 1. Abra el formulario Web Forms o Windows Forms. 2. En el menú Ver, haga clic en Diseñador. 3. Si está desarrollando un sitio Web, realice las siguientes acciones: 260 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net a) Haga clic en el control CrystalReportViewer para seleccionarlo. b) Presione la FLECHA IZQUIERDA del teclado de modo que aparezca un cursor parpadeante y, a continuación, presione INTRO. 4. Si está desarrollando un proyecto de Windows, realice las siguientes acciones: a) Haga clic en el control CrystalReportViewer para seleccionarlo. b) En la ventana Propiedades, establezca Dock en "Bottom". c) Ajuste el tamaño del control CrystalReportViewer, con el fin de que disponga del espacio necesario sobre él para un control ListBox. d) En la ventana Propiedades, establezca Anchor en "Top, Bottom, Left, Right". 5. En el Cuadro de herramientas, arrastre un control ListBox sobre el control CrystalReportViewer. 6. Haga clic en el control ListBox para seleccionarlo. 7. Desde la ventana Propiedades siga estos pasos: a) Establezca ID o Name en "defaultParameterValuesList". b) Establezca SelectionMode en "Multiple" (en un proyecto de Windows, "MultiExtended"). 8. En el menú Archivo, seleccione Guardar todo. 1.5.1.2.4.2 Para crear un método auxiliar que obtenga los valores predeterminados del campo de parámetro Contexto Ahora podrá crear un método auxiliar que obtenga los valores predeterminados del campo de parámetro. Procedimiento 1. Abra el formulario Web Forms o Windows Forms. 2. En el menú Ver, haga clic en Código. 3. En la parte inferior de la clase, cree un nuevo método privado denominado GetDefaultValuesFromParameterField() que devuelva una instancia de ArrayList y se pase ParameterFields en la firma de método. Private Function GetDefaultValuesFromParameterField(ByVal myParameterFields As ParameterFields) As ArrayList End Function private ArrayList GetDefaultValuesFromParameterField(ParameterFields parameterFields) { } Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 261 4. Recupere la instancia de ParameterField de la clase indizada ParameterFields basada en la entrada de índice de la constante PARAMETER_FIELD_NAME. Dim myParameterField As ParameterField = myParameterFields(PARAMETER_FIELD_NAME) ParameterField parameterField = parameterFields[PARAMETER_FIELD_NAME]; 5. Obtenga una clase indizada ParameterValues (como la variable defaultParameterValues) a partir de la propiedad DefaultValues de la instancia de ParameterField. Dim defaultParameterValues As ParameterValues = myParameterField.DefaultValues ParameterValues defaultParameterValues = parameterField.DefaultValues; 6. Declare y cree una instancia de ArrayList. Dim myArrayList As ArrayList = New ArrayList() ArrayList arrayList = new ArrayList(); 7. Cree un bucle foreach que obtenga cada instancia de ParameterValue a partir de defaultParameterValues. En el bucle foreach, cree ahora un bloque condicional anidado que busque valores de parámetros discretos (en oposición a parámetros de rango). Existen dos versiones de este bloque condicional porque la API ha cambiado ligeramente en las distintas versiones de SAP Crystal Reports, versión para programadores de Microsoft Visual Studio. Compruebe su API (mediante IntelliSense) para ver qué propiedad está disponible en ParameterValue: For Each myParameterValue As ParameterValue In defaultParameterValues Next foreach(ParameterValue parameterValue in defaultParameterValues) { } 8. Si la propiedad disponible es IsRange, en el bucle foreach, escriba este código: If (Not myParameterValue.IsRange) Then End If 262 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net if(!parameterValue.IsRange) { } 9. O bien, si la propiedad disponible es Kind (DiscreteOrRangeKind, una enumeración con tres valores: DiscreteValue, RangeValue, DiscreteAndRangeValue), por cada bucle foreach escriba este código en su lugar: If (myParameterValue.Kind = DiscreteOrRangeKind.DiscreteValue) Then End If if(parameterValue.Kind == DiscreteOrRangeKind.DiscreteValue) { } 10. En este bloque condicional anidado, proyecte la instancia de ParameterValue en su clase ampliada, DiscreteParameterValue. Dim myParameterDiscreteValue As ParameterDiscreteValue = CType(myParameterValue, ParameterDiscreteValue) ParameterDiscreteValue parameterDiscreteValue = (ParameterDiscreteValue)parameterValue; 11. Además, en el bloque condicional anidado, agregue la propiedad Value de la instancia de ParameterDiscreteValue (convertida en cadena) a la instancia de ArrayList. myArrayList.Add(myParameterDiscreteValue.Value.ToString()) arrayList.Add(parameterDiscreteValue.Value.ToString()); 12. Fuera del bloque condicional y del bucle foreach, al final del método, devuelva la instancia de ArrayList del método. Return myArrayList return arrayList; Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 263 1.5.1.2.4.3 Para enlazar el ArrayList devuelto del método al ListBox de un proyecto Web Contexto Ha obtenido los valores predeterminados del campo de parámetro y los ha devuelto del método como un ArrayList. Debe enlazar este ArrayList al control ListBox defaultParameterValuesList. El código varía ligeramente en función de si se utiliza un proyecto Web o un proyecto de Windows; por lo tanto, asegúrese de que sólo realiza el procedimiento para Web o para Windows. Procedimiento 1. En el método ConfigureCrystalReports(), agregue un par de saltos de línea al código inmediatamente después de la línea de código que obtiene la instancia de ParameterFields. 2. En los saltos de línea, cree un bloque condicional Not IsPostBack. Nota El bloque condicional Not IsPostBack se usa para encapsular código que sólo se debe ejecutar la primera vez que se carga la página. Los controles se suelen enlazar a los valores de datos en bloques condicionales Not IsPostBack para que sus valores de datos (y los eventos de control posteriores) no se restablezcan cuando se vuelva a cargar la página. If Not IsPostBack Then End If if(!IsPostBack) { } 3. En el bloque condicional Not IsPostBack, establezca el valor de la propiedad DataSource del control ListBox defaultParameterValuesList en el método auxiliar GetDefaultValuesFromParameterField() y pase la instancia de ParameterFields como parámetro de método. defaultParameterValuesList.DataSource = GetDefaultValuesFromParameterField(myParameterFields) defaultParameterValuesList.DataSource = GetDefaultValuesFromParameterField(parameterFields); 264 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 4. Aún dentro del bloque condicional Not IsPostBack, llame al método DataBind() del control ListBox defaultParameterValuesList. defaultParameterValuesList.DataBind() defaultParameterValuesList.DataBind(); 1.5.1.2.4.4 Para enlazar el ArrayList devuelto del método al ListBox de un proyecto de Windows Procedimiento 1. En el método ConfigureCrystalReports(), agregue un par de saltos de línea al código inmediatamente después de la línea de código que obtiene la instancia de ParameterFields. En los saltos de línea, ahora puede escribir código adicional que establece el origen de datos para el control ListBox defaultParameterValuesList cuando la página se carga por primera vez. 2. En los saltos de línea, establezca la propiedad DataSource del control ListBox defaultParameterValuesList en el método auxiliar GetDefaultValuesFromParameterField() y pase la instancia de ParameterFields como un parámetro de método. defaultParameterValuesList.DataSource = GetDefaultValuesFromParameterField(myParameterFields) defaultParameterValuesList.DataSource = GetDefaultValuesFromParameterField(parameterFields); 1.5.1.2.4.5 Para probar si está relleno el control ListBox defaultParameterValuesList Contexto Ahora estará listo para crear y ejecutar el proyecto, para verificar si el cuadro de lista defaultParameterValuesList se ha rellenado. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 265 Procedimiento 1. En el menú Generar, seleccione Generar solución. 2. Si existen errores de generación, continúe y corríjalos ahora. 3. En el menú Depurar, haga clic en Iniciar. El control ListBox defaultParameterValuesList mostrará una lista completa de valores predeterminados (ciudades, en nuestro tutorial). 4. Vuelva a Visual Studio y haga clic en Detener para salir del modo de depuración. 1.5.1.2.5 Configurar parámetros a partir de las selecciones de ListBox En esta sección, agregará un botón para volver a mostrar el informe según las selecciones del control ListBox defaultParameterValuesList. En el método de evento de este botón, llamará al mismo método que se llama al cargar la página por primera vez: SetCurrentValuesForParameterField(). Pero esta vez, en lugar de pasar valores arbitrarios (Paris y Tokyo), pasará los valores seleccionados en el control ListBox defaultParameterValuesList. 1.5.1.2.5.1 Para crear y configurar un botón que vuelva a mostrar el informe en el formulario Procedimiento 1. Abra el formulario Web Forms o Windows Forms. 2. En el menú Ver, haga clic en Diseñador. 3. En el Cuadro de herramientas, arrastre un control Button a la derecha del control ListBox. 4. Haga clic en el control Button para seleccionarlo. 5. Desde la ventana Propiedades siga estos pasos: a) Establezca el valor de ID (o Name) en "redisplay". b) Establezca Text como "Volver a mostrar el informe". 266 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 1.5.1.2.5.2 Para crear el método de evento de clic del botón que vuelve a mostrar el informe en un proyecto Web Contexto Ahora podrá crear un método de evento de clic de botón que busque los elementos seleccionados en el control ListBox y los pase al método SetCurrentValuesForParameterField(). El código varía ligeramente para un proyecto Web o un proyecto de Windows; por lo tanto, realice sólo el procedimiento para Web o para Windows. Procedimiento 1. Haga doble clic en el botón Volver a mostrar el informe. Pasa a la clase de código subyacente en la que se ha generado automáticamente un método de evento redisplay_Click(). 2. Sobre la firma de clase, agregue una declaración "Imports" [Visual Basic] o "using" [C#] en la parte superior de la clase para el espacio de nombres System.Web.UI.WebControls (si todavía no se ha declarado este espacio de nombres). Imports System.Web.UI.WebControls using System.Web.UI.WebControls; 3. En el método de evento redisplay_Click() que se ha generado de manera automática, cree una nueva instancia de un ArrayList. Dim myArrayList As ArrayList = New ArrayList() ArrayList arrayList = new ArrayList(); 4. Cree un bucle foreach para obtener cada instancia de ListItem a partir de la propiedad Items del control ListBox defaultParameterValuesList. For Each item As ListItem In defaultParameterValuesList.Items Next foreach(ListItem item in defaultParameterValuesList.Items) { } Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 267 5. En el bucle foreach, cree un bloque condicional anidado que compruebe si la propiedad Selected de la instancia de Item actual está establecida como True. If item.Selected Then End If if(item.Selected) { } 6. En el bloque condicional, agregue la propiedad Value de la instancia de Item a la instancia de ArrayList. myArrayList.Add(item.Value) arrayList.Add(item.Value); 7. Fuera del bloque condicional y del bucle foreach, vuelva a enlazar la ruta de directorio de archivos del informe CustomersByCity a la propiedad ReportSource de la clase CrystalReportViewer. Nota La ruta de directorio de archivos que se muestra más abajo es la de un proyecto de Visual Studio. "ProjectName" se reemplaza por el nombre del sitio Web. "UserName" se reemplaza por el nombre de conexión. La ruta predeterminada para un proyecto de sitio Web: myCrystalReportViewer.ReportSource = "C:\WebSites\ ProjectName \CustomersByCity.rpt" crystalReportViewer.ReportSource = "C:\\WebSites\\ ProjectName\ \CustomersByCity.rpt"; 8. Recupere la instancia de ParameterFields de la propiedad ParameterFieldInfo del control CrystalReportViewer. Dim myParameterFields As ParameterFields = myCrystalReportViewer.ParameterFieldInfo ParameterFields parameterFields = crystalReportViewer.ParameterFieldInfo; 9. Pase la instancia de ParameterFields y de ArrayList al método SetCurrentValuesForParameterField(). SetCurrentValuesForParameterField(myParameterFields, myArrayList) 268 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net SetCurrentValuesForParameterField(parameterFields, arrayList); 1.5.1.2.5.3 Para crear el método de evento de clic del botón que vuelve a mostrar el informe en un proyecto de Windows Procedimiento 1. Haga doble clic en el control Button que vuelve a mostrar el informe. Pasa a la clase de código subyacente en la que se ha generado automáticamente un método de evento redisplay_Click(). 2. En el método de evento redisplay_Click() que se ha generado de manera automática, cree una nueva instancia de un ArrayList. Dim myArrayList As ArrayList = New ArrayList() ArrayList arrayList = new ArrayList(); 3. Cree un bucle foreach para obtener cada elemento (como una cadena) de la propiedad SelectedItems del control ListBox defaultParameterValuesList. For Each item As String In defaultParameterValuesList.SelectedItems Next foreach(string item in defaultParameterValuesList.SelectedItems) { } 4. En el bucle foreach, agregue la instancia de cadena de elemento a la instancia de ArrayList. myArrayList.Add(item) arrayList.Add(item); 5. Fuera del bucle foreach, vuelva a enlazar la ruta de directorio de archivos del informe CustomersByCity a la propiedad ReportSource de la clase CrystalReportViewer. Nota La ruta de directorio de archivos que se muestra más abajo es la de un proyecto de Visual Studio. "ProjectName" se reemplaza por el nombre del proyecto de Windows. "UserName" se reemplaza por el nombre de conexión. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 269 La ruta predeterminada para un proyecto de Windows: myCrystalReportViewer.ReportSource = "C:\Documents and Settings\UserName\Mis documentos\Visual Studio\Projects\ProjectName\CustomersByCity.rpt" crystalReportViewer.ReportSource = "C:\\Documents and Settings\\UserName\\Mis documentos\\Visual Studio\\Projects\\ProjectName\\CustomersByCity.rpt"; 6. Recupere la instancia de ParameterFields de la propiedad ParameterFieldInfo del control CrystalReportViewer. Dim myParameterFields As ParameterFields = myCrystalReportViewer.ParameterFieldInfo ParameterFields parameterFields = crystalReportViewer.ParameterFieldInfo; 7. Pase la instancia de ParameterFields y de ArrayList al método SetCurrentValuesForParameterField(). SetCurrentValuesForParameterField(myParameterFields, myArrayList) SetCurrentValuesForParameterField(parameterFields, arrayList); 1.5.1.2.5.4 Para probar si está relleno el control ListBox defaultParameterValuesList Contexto Ahora que se han aplicado los valores seleccionados del control ListBox como los valores actuales del campo de parámetro, estará listo para volver a mostrar el informe. Ahora estará preparado para generar y ejecutar el proyecto para verificar que el campo de parámetro se ha restablecido correctamente. Procedimiento 1. En el menú Generar, seleccione Generar solución. 2. Si existen errores de generación, continúe y corríjalos ahora. 3. En el menú Depurar, haga clic en Iniciar. 4. En el control ListBox, presione la tecla CTRL mientras hace clic para seleccionar ciudades diferentes en la lista. 270 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 5. Haga clic en el botón Volver a mostrar el informe. La página se volverá a cargar y mostrará los registros de cliente para los clientes que vivan en la lista de ciudades que ha seleccionado. 6. Vuelva a Visual Studio y haga clic en Detener para salir del modo de depuración. 1.5.1.2.6 Configurar la persistencia de parámetros En esta sección configurará la persistencia (en un tutorial basado en Web) de las selecciones de campo de parámetro que se han realizado en el control ListBox. 1.5.1.2.6.1 Para agregar código de persistencia al método ConfigureCrystalReports() Contexto Debe agregar código de persistencia a la aplicación para que se conserven los cambios efectuados cuando se vuelvan a cargar las páginas Web. Para comenzar, va a agregar código de persistencia al método ConfigureCrystalReports(), agregando un bloque Else al bloque condicional If Not IsPostBack. A continuación, va a establecer valores únicos para la instancia de ArrayList por cada condición del bloque condicional. Al iniciarse la página, va a establecer los valores predeterminados ("Paris" y "Tokyo") en la instancia de ArrayList. Al volver a cargarse la página, va a recuperar la instancia de ArrayList que está almacenada en Session. Procedimiento 1. En el método ConfigureCrystalReports(), corte y pegue las dos líneas de código que agregan Paris y Tokyo al ArrayList en la parte inferior del bloque condicional Not IsPostBack. Cuando haya terminado, el aspecto del bloque condicional debe ser parecido al siguiente: If Not IsPostBack Then defaultParameterValuesList.DataSource = GetDefaultValuesFromParameterField(myParameterFields) defaultParameterValuesList.DataBind() myArrayList.Add("Paris") myArrayList.Add("Tokyo") End If if (!IsPostBack) { defaultParameterValuesList.DataSource = GetDefaultValuesFromParameterField(parameterFields); Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 271 } 2. defaultParameterValuesList.DataBind(); arrayList.Add("Paris"); arrayList.Add("Tokyo"); Agregue una línea final de código al bloque condicional que asigna la instancia ArrayList a Session. Nota Puede agregar el nombre de variable como el identificador de cadena para el Session que agregue. Session("myArrayList") = myArrayList Session["arrayList"] = arrayList; 3. Agregue una condición Else al bloque condicional Not IsPostBack. 4. En el bloque Else, obtenga la instancia de ArrayList de Session y proyéctela en ArrayList. myArrayList = Ctype(Session("myArrayList"), ArrayList) arrayList = (ArrayList)Session["arrayList"]; Resultados Cuando haya terminado, el aspecto del bloque condicional debe ser parecido al siguiente: If Not IsPostBack Then defaultParameterValuesList.DataSource = GetDefaultValuesFromParameterField(myParameterFields) defaultParameterValuesList.DataBind() myArrayList.Add("Paris") myArrayList.Add("Tokyo") Session("myArrayList") = myArrayList Else myArrayList = Ctype(Session("myArrayList"), ArrayList) End If if (!IsPostBack) { defaultParameterValuesList.DataSource = GetDefaultValuesFromParameterField(parameterFields); defaultParameterValuesList.DataBind(); arrayList.Add("Paris"); arrayList.Add("Tokyo"); Session["arrayList"] = arrayList; } else { arrayList = (ArrayList)Session["arrayList"]; } 272 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Estas modificaciones del método ConfigureCrystalReports() garantizan que la instancia actual de ArrayList siempre está disponible para pasarla al método SetCurrentValuesForParameterField(). En la siguiente sección, realizará dos cambios en el código del evento de clic de botón: ● Tomar el ArrayList que ha creado y asignarlo a Session. ● Reemplazar las dos últimas líneas de código (que configuran y muestran el informe) con una llamada al método ConfigureCrystalReports() para realizar esta función en un conjunto común de código. 1.5.1.2.6.2 Para modificar el código del método de evento de clic de botón para que funcione con la persistencia de Session Procedimiento 1. Elimine las tres últimas líneas de código del método de evento de clic de botón. ○ La primera línea de código que se eliminará es el código que enlaza la ruta de directorio de archivos del informe a la propiedad ReportSource del control CrystalReportViewer. ○ La segunda línea de código que se eliminará es el código que obtiene la instancia de ParameterFields de la propiedad ParameterFieldInfo del control CrystalReportViewer. ○ La tercera línea de código que se eliminará es la llamada al método SetCurrentValuesForParameterField(). En el siguiente paso agregará dos nuevas líneas de código para reemplazar el código eliminado. 2. En el método de evento de clic de botón, inmediatamente fuera del bucle foreach, agregue una línea de código que asigne la instancia de ArrayList a Session. Nota Puede utilizar el nombre de variable como identificador de cadena para el control Session que agregue. Session("myArrayList") = myArrayList Session["arrayList"] = arrayList; 3. Llamar al método ConfigureCrystalReports(). De este modo se obtiene la instancia de ArrayList, la aplica al informe y enlaza el informe al control CrystalReportViewer. ConfigureCrystalReports() ConfigureCrystalReports(); Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 273 1.5.1.2.6.3 Para probar si está relleno el control ListBox defaultParameterValuesList Contexto Ahora estará preparado para generar y ejecutar el proyecto para verificar que el campo de parámetro se ha restablecido correctamente. Procedimiento 1. En el menú Generar, seleccione Generar solución. 2. Si existen errores de generación, continúe y corríjalos ahora. 3. En el menú Depurar, haga clic en Iniciar. 4. En el control ListBox, presione la tecla Mayús mientras hace clic para seleccionar todas las ciudades de la lista. 5. Haga clic en Volver a mostrar el informe. La página se vuelve a cargar y muestra los registros de cliente de todos los clientes de todas las ciudades. Es un informe extenso que contiene muchas páginas. 6. En la barra de herramientas de CrystalReportViewer, haga clic en Próxima página. 7. Ahora se conserva la lista de las ciudades seleccionadas. Se muestra la página 2 del informe. 8. Vuelva a Visual Studio y haga clic en Detener para salir del modo de depuración. 1.5.1.3 Tutorial: Leer y configurar parámetros de rango para un subinforme En este tutorial se planteará una complicación adicional: ¿qué sucede si el informe contiene un subinforme que requiere parámetros distintos? Introducción En el tutorial anterior, Tutorial: Leer y configurar parámetros discretos [página 249], obtuvo información sobre cómo crear un informe con un parámetro discreto y cómo escribir código que estableciera dicho parámetro en tiempo de ejecución, tanto con valores de parámetro codificados como con valores de parámetros pasados desde un control ListBox o TextBox. En este tutorial, aprenderá a agregar parámetros de rango a un subinforme. Necesita realizar cuatro modificaciones al proyecto que ha creado anteriormente: 274 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net ● Agregará un subinforme al informe original. Este subinforme direcciona la tabla Pedidos de la base de datos Xtreme. La tabla Pedidos está relacionada con la tabla Clientes que se ha utilizado en el tutorial anterior mediante una clave externa ID del cliente. ● Agregará un parámetro de rango al subinforme que filtre por un rango de fechas de pedido. ● Agregue dos controles Text al formulario, orderStartDate y orderEndDate, para establecer el rango de fechas de pedido en tiempo de ejecución. ● Modificará el método SetCurrentValuesForParameter() que ha creado en el tutorial anterior. Este método crea una instancia de ParameterRangeValue que contiene los valores startDate y endDate values, y, a continuación, pasa dicha instancia de ParameterRangeValue al parámetro de rango en el subinforme. Cuando termine este tutorial, podrá filtrar los valores que se muestran en el informe en tiempo de ejecución. El código que agregue limita el número de ciudades que se muestran en el informe principal, así como el rango de las fechas de pedido que se muestran en el subinforme. Este tutorial también se puede realizar con clases del modelo de objetos ReportDocument; vea Tutorial: Leer y configurar parámetros con un subinforme [página 413]. Código de ejemplo Este tutorial incluye código de ejemplo de C# y Visual Basic que muestra la versión finalizada del proyecto. Siga las instrucciones de este tutorial para crear un nuevo proyecto o para abrir el proyecto de código de ejemplo y trabajar con una versión finalizada. El código de ejemplo se almacena en carpetas que están clasificadas por idioma y tipo de proyecto. Los nombres de las carpetas de cada versión del código de ejemplo son los siguientes: ● Sitio Web en C#: CS_Web_CRVObjMod_ParametersSubrpt ● Proyecto para Windows en C#: CS_Win_CRVObjMod_ParametersSubrpt ● Sitio Web en Visual Basic: VB_Web_CRVObjMod_ParametersSubrpt ● Proyecto Para Windows En VISUAL Basic: VB_Win_crvobjmod_ParametersSubrpt Información relacionada Elegir el modelo de objetos correcto para el proyecto [página 31] Directorio de informes de muestra [página 14] 1.5.1.3.1 Agregar un subinforme al informe original Para empezar, agregará un subinforme al informe original. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 275 1.5.1.3.1.1 Para agregar un subinforme Procedimiento 1. Abra el proyecto creado en el tutorial anterior, Tutorial: Leer y configurar parámetros discretos [página 249]. 2. En el Explorador de soluciones, haga doble clic en el informe CustomersByCity para abrirlo. 3. Haga clic con el botón secundario en la barra gris Detalles y seleccione Insertar sección abajo. 4. Haga clic con el botón secundario en la nueva sección Detalles b que ha creado, seleccione Insertar y, a continuación, haga clic en Subinforme. Aparece un cuadrado gris alrededor del cursor del mouse. 5. Arrastre el rectángulo gris en la nueva sección Detalles b y, a continuación, haga clic para soltarlo. 6. En el cuadro de diálogo Insertar subinforme, en la ficha Subinforme, seleccione Crear un subinforme con el Asistente de informes. Nota El cuadro de diálogo Insertar un subinforme incluye otras opciones que permiten elegir un informe existente y subinformes a petición. Para obtener más información sobre estas funciones, vea Ficha Subinforme (cuadro de diálogo Insertar subinforme) [página 928]. 7. En el campo Nombre del informe nuevo, escriba "PedidosClientes". 8. Haga clic en Asistente de informes... 9. En el panel Orígenes de datos disponibles de la ventana Asistente para la creación de informes estándar, expanda la carpeta Crear nueva conexión. 10. En la subcarpeta que se abre, expanda la carpeta ODBC (RDO). 11. En la ventana ODBC (RDO), seleccione la entrada ODBC DSN correcta para la base de datos Xtreme y haga clic en Finalizar. Se expandirá la carpeta ODBC (RDO) y mostrará la base de datos Xtreme. 12. Seleccione la tabla Pedidos y haga clic en el símbolo > para moverla al panel Seleccionar tablas y, a continuación, haga clic en Siguiente. 13. En el panel Campos disponibles, seleccione ID del pedido, Fecha del pedido, Fecha de envío y Enviar vía. 14. Haga clic en el símbolo > para mover estos campos al panel Campos a mostrar y, a continuación, haga clic en Finalizar. 15. En el cuadro de diálogo Insertar un subinforme, seleccione la ficha Vínculo. 16. En el panel Campo(s) del informe contenedor para vincular, en la lista Campos disponibles, expanda la tabla Clientes, seleccione ID del cliente y, a continuación, haga clic en el símbolo >. 17. En el panel Vínculo de campo Clientes.ID del cliente que aparece, deje las selecciones predeterminadas inalteradas. Estas selecciones de parámetros y de datos generan automáticamente entre el informe principal y el subinforme. 18. Haga clic en Aceptar. El nuevo subinforme, PedidosClientes, se muestra en la sección Detalles b del informe principal. 276 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Nota Al agregar un subinforme a la sección Detalles, el subinforme se muestra por cada fila, lo que agrega un costo de rendimiento al informe. Si no necesita información de subinforme a ese nivel de granularidad, coloque el subinforme en una sección Grupo en vez de hacerlo en una sección Detalles. 1.5.1.3.1.2 Para verificar la configuración del subinforme Procedimiento 1. En la sección Detalles, haga doble clic en el subinforme PedidosClientes para verlo. En la parte inferior de la vista del diseñador, aparecen botones de desplazamiento para el informe principal y el subinforme PedidosClientes. 2. Si el Explorador de campos no está visible, en la barra de herramientas de Crystal Reports, haga clic en Cambiar la vista del campo. Nota Otro modo de ver el Explorador de campos es ir al menú Crystal Reports y hacer clic en Explorador de campos. 3. En el Explorador de campos, expanda Campos de parámetro. 4. Verifique que el campo de parámetro Pm-Clientes.ID del cliente se ha generado automáticamente al vincular el subinforme. 5. En la barra de herramientas de Crystal Reports, haga clic en Asistente de selección. 6. En el cuadro de diálogo Asistente de selección, verifique que está establecido el criterio Pedidos.ID del cliente es igual a {Pm-Clientes.ID del cliente} y, a continuación, haga clic en Aceptar. 7. En el menú Archivo, seleccione Guardar todo. Resultados Ha agregado correctamente un subinforme PedidosClientes al informe CustomersByCity. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 277 1.5.1.3.1.3 Para agregar un parámetro OrderDateRange al subinforme Procedimiento 1. En el Explorador de campos, haga clic con el botón secundario en Campos de parámetro y seleccione Nuevo. 2. En el cuadro de diálogo Crear campo de parámetro: a) Defina el Nombre como "OrderDateRange". b) Defina Texto de solicitud como "Especifique un rango de fechas de pedidos para mostrar". c) Defina Tipo de valor como "Fecha". d) Defina Opciones como una sola selección, "Rango de valores". 3. Haga clic en Aceptar. 4. En la barra de herramientas de Crystal Reports, haga clic en Asistente de selección. 5. Haga clic en la ficha Nuevo. 6. En el cuadro de diálogo Elegir campo, expanda la tabla Pedidos, seleccione Fecha del pedido y, a continuación, haga clic en Aceptar. 7. En la nueva ficha Orders.OrderDate, en la lista desplegable de criterios, seleccione fórmula y escriba la siguiente fórmula: {Pedidos.Fecha del pedido} en {?OrderDateRange} 8. Haga clic en Aceptar. 9. En el menú Archivo, seleccione Guardar todo. Ha agregado correctamente un parámetro OrderDateRange al subinforme y lo ha vinculado a la columna Orders.OrderDate. En la sección siguiente agregará código para direccionar el parámetro OrderDateRange en el subinforme. 1.5.1.3.2 Agregar el código de parámetro de subinforme Contexto Ahora está listo para agregar el código de parámetro para el subinforme a la clase de código subyacente. Para empezar, cree un método auxiliar privado, SetDateRangeForOrders(). Procedimiento 1. Abra el formulario Web Forms o Windows Forms. 2. En el menú Ver, haga clic en Código. 3. En la parte superior de la clase, agregue dos nuevas constantes debajo de la constante PARAMETER_FIELD_NAME agregada en el tutorial anterior. Private Const SUBREPORT_PARAMETER_FIELD_NAME As String = 278 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net "OrderDateRange" Private Const SUBREPORT_NAME As String = "CustomerOrders" private const string SUBREPORT_PARAMETER_FIELD_NAME = "OrderDateRange"; private const string SUBREPORT_NAME = "CustomerOrders"; 4. En la parte inferior de la clase, cree un nuevo método privado denominado SetDateRangeForOrders() con tres parámetros: ParameterFields, una cadena startDate y una cadena endDate. Private Sub SetDateRangeForOrders(ByVal myParameterFields As ParameterFields, ByVal startDate As String, ByVal endDate As String) End Sub private void SetDateRangeForOrders(ParameterFields parameterFields, string startDate, string endDate) { } 5. En este método, declare y cree una instancia de la clase ParameterRangeValue. Nota Para que la clase ParameterRangeValue sea accesible, deberá incluir un enunciado "Imports" [Visual Basic] o "using" [C#] en la parte superior de la clase de código subyacente del espacio de nombres CrystalDecisions.Shared. (Esta declaración se ha agregado en Configuración de proyectos [página 14].) Dim myParameterRangeValue As ParameterRangeValue = New ParameterRangeValue() ParameterRangeValue parameterRangeValue = new ParameterRangeValue(); 6. Establezca la propiedad StartValue de la instancia de ParameterRangeValue en el parámetro de método startDate. Nota Las propiedades StartValue y EndValue de la clase ParameterRangeValue aceptan valores de tipo Object. Este tipo genérico permite que el valor de rango que se pasa sea de muchos valores, incluidos: texto, número, fecha, moneda o tiempo. myParameterRangeValue.StartValue = startDate parameterRangeValue.StartValue = startDate; Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 279 7. Establezca la propiedad EndValue de la instancia de ParameterRangeValue en el parámetro de método endDate. myParameterRangeValue.EndValue = endDate parameterRangeValue.EndValue = endDate; 8. Establezca los límites inferior y superior para que sean bound-inclusive. Nota Para BoundInclusive, los valores de rango superior e inferior se incluyen en el rango. myParameterRangeValue.LowerBoundType = RangeBoundType.BoundInclusive myParameterRangeValue.UpperBoundType = RangeBoundType.BoundInclusive parameterRangeValue.LowerBoundType = RangeBoundType.BoundInclusive; parameterRangeValue.UpperBoundType = RangeBoundType.BoundInclusive; Ahora está preparado para asignar la instancia de ParameterRangeValue al parámetro del subinforme. 9. Recupere la instancia de ParameterField de la clase indizada ParameterFields que se basa en dos valores indizados: el nombre de campo de parámetro de subinforme y el nombre de subinforme. Pase los dos valores de constante que ha declarado al principio de la clase. Dim myParameterField As ParameterField = myParameterFields(SUBREPORT_PARAMETER_FIELD_NAME, SUBREPORT_NAME) ParameterField parameterField = parameterFields[SUBREPORT_PARAMETER_FIELD_NAME, SUBREPORT_NAME]; 10. Llame al método Clear() de la propiedad CurrentValues de la instancia de ParameterField para eliminar cualquier valor existente de la propiedad CurrentValues. myParameterField.CurrentValues.Clear() parameterField.CurrentValues.Clear(); 11. Agregue la instancia de ParameterRangeValue, que ha creado anteriormente, a la propiedad CurrentValues de la instancia de ParameterField. myParameterField.CurrentValues.Add(myParameterRangeValue) parameterField.CurrentValues.Add(parameterRangeValue); 280 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Resultados Este procedimiento de varios pasos ha establecido los valores de fecha inicial y final en una instancia de ParameterRangeValue y los ha pasado al parámetro OrderDateRange del subinforme CustomerOrders. 1.5.1.3.3 Agregar controles TextBox para contener valores de parámetro de rango En esta sección, agregará dos controles TextBox que proporcionan los valores de fecha inicial y final en tiempo de ejecución al parámetro de rango OrderDateRange del informe PedidosClientes. Nota Si implementa este tutorial en un sitio Web, la persistencia de los valores de fecha que el usuario escribe en los cuadros de texto se mantiene mediante ViewState. 1.5.1.3.3.1 Para crear y configurar un botón que vuelva a mostrar el informe en el formulario Procedimiento 1. Abra el formulario Web Forms o Windows Forms. 2. En el menú Ver, haga clic en Diseñador. 3. Si está desarrollando un sitio Web, realice las siguientes acciones: a) Haga clic entre el control ListBox y el control Button. b) Presione INTRO tres veces para crear dos líneas entre el control ListBox y el control Button. c) En la primera línea creada debajo del control ListBox, escriba Fecha inicial de pedidos. d) En la segunda línea creada debajo del control ListBox, escriba Fecha final de pedidos. 4. Si está desarrollando un proyecto de Windows, realice las siguientes acciones: a) En el Cuadro de herramientas, arrastre dos controles Label a la derecha del control ListBox. Coloque una etiqueta encima de la otra y ambas encima del control Button. b) Seleccione el primer control Label y, a continuación, en la ventana Propiedades, establezca la propiedad Text en Fecha inicial de pedidos. c) Seleccione el segundo control Label y, a continuación, en la ventana Propiedades, establezca la propiedad Text en Fecha final de pedidos. 5. En el Cuadro de herramientas, arrastre un control hasta la derecha de "Fecha inicial de pedidos". 6. Haga clic en el control TextBox para seleccionarlo. 7. En la ventana Propiedades, establezca ID (o Name) en orderStartDate. 8. En el Cuadro de herramientas, arrastre un control TextBox hasta la derecha de "Fecha final de pedidos". Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 281 9. Haga clic en el control TextBox para seleccionarlo. 10. En la ventana Propiedades, establezca ID (o Name) en orderEndDate. 11. En el menú Archivo, seleccione Guardar todo. 1.5.1.3.4 Modificar métodos para llamar al subinforme Debe modificar el método ConfigureCrystalReports() y el método de evento redisplay_Click() para recibir información de estos controles TextBox y aplicarlos al método SetDateRangeForOrders() con el fin de que se procese la información de parámetros de los subinformes. En el tutorial anterior, Tutorial: Leer y configurar parámetros discretos [página 249], ha diseñado estos métodos de dos formas distintas, en función de si incluía la persistencia de Session. Nota Los proyectos de Windows no requieren persistencia de Session. Los sitios Web normalmente requieren persistencia de Session. Elija uno de los procedimientos con pasos siguientes (pero no ambos). Modifique los métodos que excluyen la persistencia de Session o los que la incluyen. 1.5.1.3.4.1 Modificar los métodos que excluyen la persistencia de Session Si ha terminado el tutorial anterior, Tutorial: Leer y configurar parámetros discretos [página 249], y ha excluido la persistencia de Session, realice los siguientes procedimientos. De lo contrario, vaya a Modificar los métodos que incluyen la persistencia de Session [página 284]. 1.5.1.3.4.1.1 Para modificar el método ConfigureCrystalReports() que excluye la persistencia de Session Procedimiento 1. En el método ConfigureCrystalReports(), agregue un par de saltos de línea al código después de las líneas que asignan "Paris" y "Tokyo" como variables ArrayList. 2. En los saltos de línea, declare y establezca valores codificados para dos variables de cadena, startDate y endDate. Dim startDate As String = "8/1/1997" Dim endDate As String = "8/31/1997" 282 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net string startDate = "8/1/1997"; string endDate = "8/31/1997"; 3. Debajo del código que llama a SetCurrentValuesForParameterField(), llame al método SetDateRangeForOrders() y pásele la instancia de ParameterFields y las variables startDate y endDate. SetDateRangeForOrders(myParameterFields, startDate, endDate) SetDateRangeForOrders(parameterFields, startDate, endDate); 4. En el menú Archivo, seleccione Guardar todo. 1.5.1.3.4.1.2 Para modificar el método redisplay_Click() que excluye la persistencia de Session Procedimiento 1. En el método de evento redisplay_Click(), agregue un par de saltos de línea al código encima de la línea que enlaza el informe al control CrystalReportViewer. 2. En los saltos de línea, declare y establezca valores para dos variables de cadena, startDate y endDate, de los controles TextBox que ha agregado al formulario Web Forms o Windows Forms. Dim startDate As String = orderStartDate.Text Dim endDate As String = orderEndDate.Text string startDate = orderStartDate.Text; string endDate = orderEndDate.Text; 3. Debajo del código que llama a SetCurrentValuesForParameterField(), llame al método SetDateRangeForOrders() y pásele la instancia de ParameterFields y las variables startDate y endDate. SetDateRangeForOrders(myParameterFields, startDate, endDate) SetDateRangeForOrders(parameterFields, startDate, endDate); 4. En el menú Archivo, seleccione Guardar todo. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 283 1.5.1.3.4.2 Modificar los métodos que incluyen la persistencia de Session Si ha terminado el tutorial anterior, Tutorial: Leer y configurar parámetros discretos [página 249], y ha incluido la persistencia de Session, realice los siguientes procedimientos. En caso contrario, continúe con Modificar los métodos que excluyen la persistencia de Session [página 282]. 1.5.1.3.4.2.1 Para modificar el método ConfigureCrystalReports() que incluye la persistencia de Session Procedimiento 1. En el método ConfigureCrystalReports(), agregue un par de saltos de línea al código detrás de la línea que declara y crea una instancia de ArrayList. 2. En los saltos de línea, declare dos variables de cadena, startDate y endDate. Dim startDate As String Dim endDate As String string startDate; string endDate; 3. En el bloque condicional Not IsPostBack, escriba los valores predeterminados para las variables startDate y endDate. startDate = "8/1/1997" endDate = "8/31/1997" startDate = "8/1/1997"; endDate = "8/31/1997"; 4. En el bloque condicional Not IsPostBack, asigne las variables startDate y endDate a Session. Session("startDate") = startDate Session("endDate") = endDate Session["startDate"] = startDate; Session["endDate"] = endDate; 284 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 5. En el bloque Else, después de obtener la instancia de ArrayList de Session, obtenga las variables startDate y endDate de Session. startDate = Session("startDate").ToString() endDate = Session("endDate").ToString() startDate = Session["startDate"].ToString(); endDate = Session["endDate"].ToString(); Con este enfoque, se llega al final del bloque con las variables de fecha asignadas en cualquier caso. De este modo se sigue la lógica paralela a la asignación de la variable ArrayList que ha configurado en el tutorial anterior. 6. Debajo del código que llama a SetCurrentValuesForParameterField(), llame al método SetDateRangeForOrders() y pásele la instancia de ParameterFields y las variables startDate y endDate. SetDateRangeForOrders(myParameterFields, startDate, endDate) SetDateRangeForOrders(parameterFields, startDate, endDate); 7. En el menú Archivo, seleccione Guardar todo. 1.5.1.3.4.2.2 Para modificar el método redisplay_Click() que incluye la persistencia de Session Contexto A continuación, modificará el método de evento redisplay_Click. Procedimiento 1. En el método de evento redisplay_Click(), agregue un par de saltos de línea al código después de la línea que asigna la instancia de ArrayList a Session. 2. En los saltos de línea, asigne la propiedad Text del TextBox orderStartDate y orderEndDate a variables de Session. Session("startDate") = orderStartDate.Text Session("endDate") = orderEndDate.Text Session["startDate"] = orderStartDate.Text; Session["endDate"] = orderEndDate.Text; Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 285 3. En el menú Archivo, seleccione Guardar todo. Resultados Estos valores de Session startDate y endDate se recuperan y aplican cuando se llama al método ConfigureCrystalReports(). Ahora estará preparado para generar y ejecutar el proyecto para verificar que los valores TextBox restablecen el parámetro de rango del subinforme. 1.5.1.3.5 Probar el parámetro de subinforme Contexto Ya está preparado para probar la configuración del parámetro de subinforme desde los valores TextBox. Procedimiento 1. En el menú Generar, seleccione Generar solución. 2. Si existen errores de generación, continúe y corríjalos ahora. 3. En el menú Depurar, haga clic en Iniciar. 4. En el control ListBox, presione la tecla CTRL mientras hace clic para seleccionar al menos cuatro ciudades diferentes en la lista. 5. En el cuadro de texto orderStartDate, escriba 1/1/1997. 6. En el cuadro de texto orderEndDate, escriba 8/31/1997. 7. Haga clic en el botón Volver a mostrar el informe. La página se volverá a cargar y mostrará los registros de cliente para los clientes que vivan en las ciudades de la lista que acaba de seleccionar, así como un subinforme que muestra los pedidos del rango de fechas especificado anteriormente. 8. En el control CrystalReportViewer, aumente el nivel de Zoom al 125%. La página se recargará al 125% de zoom. Se conservan los valores que están seleccionados para ambas ciudades y el rango de fechas de pedido. 9. 286 Vuelva a Visual Studio y haga clic en Detener para salir del modo de depuración. © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 1.5.1.4 Tutorial: Filtrar datos con fórmulas de selección En este tutorial, aprenderá a usar las fórmulas de selección para filtrar los registros que desee mostrar en un informe de Crystal. Introducción Las fórmulas de selección se utilizan para filtrar los registros que desee mostrar en un informe de Crystal. Para escribir fórmulas de selección, puede usar las sintaxis Basic y Crystal. En este tutorial, va a crear una fórmula de selección para filtrar los registros de los clientes cuyo campo Ventas del año pasado es mayor que un valor especificado y el campo Nombre del cliente se compara con otra cadena. Se utiliza un control ListBox con el fin de seleccionar un operador de comparación para el campo Nombre del cliente. Puede elegir que se muestren los nombres de los clientes que son iguales a, menores que, mayores que, menores o iguales que, iguales o mayores que o que no son iguales que el valor de cadena especificado. La fórmula se pasa como variable de cadena a la propiedad SelectionFormula de la clase CrystalReportViewer. Una vez establecida la propiedad, el informe de Crystal que enlaza con el control CrystalReportViewer se filtra antes de mostrarse. Código de ejemplo Este tutorial incluye código de ejemplo de C# y Visual Basic que muestra la versión finalizada del proyecto. Siga las instrucciones de este tutorial para crear un nuevo proyecto o para abrir el proyecto de código de ejemplo y trabajar con una versión finalizada. El código de ejemplo se almacena en carpetas que están clasificadas por idioma y tipo de proyecto. Los nombres de las carpetas de cada versión del código de ejemplo son los siguientes: ● Sitio Web en C#: CS_Web_CRVObjMod_FilteringData ● Proyecto para Windows en C#: CS_Win_CRVObjMod_FilteringData ● Sitio Web en Visual Basic: VB_Web_CRVObjMod_FilteringData ● Proyecto para Windows en Visual Basic: VB_Win_CRVObjMod_FilteringData Información relacionada Referencia de fórmulas [página 777] Directorio de informes de muestra [página 14] Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 287 1.5.1.4.1 Crear un informe con una fórmula de selección En esta sección, creará un informe que obtenga su información de la base de datos Xtreme. 1.5.1.4.1.1 Para crear un informe con datos seguros de la base de datos Xtreme Procedimiento 1. En el Explorador de soluciones, haga clic con el botón secundario en el nombre de proyecto en negrita, elija Agregar y, a continuación, haga clic en Agregar nuevo elemento. 2. En el cuadro de diálogo Agregar nuevo elemento, en la vista Plantillas, seleccione la plantilla Crystal Report. 3. En el campo Nombre, especifique el nombre CustomersBySalesName.rpt y haga clic en Agregar. 4. En el panel Crear un nuevo documento de Crystal Reports del cuadro de diálogo Galería de Crystal Reports, seleccione Usar asistente de informes. 5. En el panel Elegir un Asistente, seleccione Estándar y, a continuación, haga clic en Aceptar. 6. En el panel Orígenes de datos disponibles de la ventana Asistente para la creación de informes estándar, expanda la carpeta Crear nueva conexión. 7. En la subcarpeta que se abre, expanda la carpeta ODBC (RDO). 8. En la ventana ODBC (RDO), seleccione la entrada ODBC DSN correcta para la base de datos de muestra Xtreme y haga clic en Finalizar. Se expandirá la carpeta ODBC (RDO) y mostrará la base de datos Xtreme. 9. Expanda el nodo Tablas, haga doble clic en la tabla Cliente para moverla al panel Tablas seleccionadas y, a continuación, haga clic en Siguiente. 10. Expanda la tabla Cliente y, a continuación, mantenga presionada la tecla Ctrl y haga clic en Nombre del cliente y Ventas del año pasado. 11. Haga clic en el símbolo > para mover estos campos al panel Campos a mostrar y, a continuación, haga clic en Siguiente. 12. En el panel Campos disponibles, en Campos del informe, haga doble clic en Cliente.Nombre del cliente para mover el campo al panel Agrupar por y, a continuación, haga clic en Finalizar. Se crea el informe CustomersBySalesName y se carga en la ventana principal de Visual Studio. 1.5.1.4.1.2 Para crear una fórmula de selección basada en las ventas del año pasado Contexto Después, cree una fórmula de selección para filtrar los datos basándose en el valor del campo Ventas del año pasado. 288 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Procedimiento 1. Abra el formulario Web Forms o Windows Forms. 2. En el menú Ver, haga clic en Código para ver la clase de código subyacente de Web Forms o Windows Forms. 3. Para un sitio Web, en el método ConfigureCrystalReports() (que ha creado en Configuración de proyectos [página 14]), cree un bloque condicional Not IsPostBack. Nota El bloque condicional Not IsPostBack encapsula el código que se debería ejecutar sólo la primera vez que se carga la página. If Not IsPostBack Then End If if(!IsPostBack) { } 4. Para un sitio Web, agregue las siguientes líneas de código en el bloque condicional Not IsPostBack. Para un proyecto Windows, agregue el código al método ConfigureCrystalReports(), sin el bloque condicional Not IsPostBack. a) Especifique la fórmula para seleccionar sólo los registros cuyo valor del campo Ventas del año pasado sea mayor que $11000,00 y cuyos nombres de clientes empiecen por la letra "A". Dim mySelectFormula As String = "{Customer.Last Year's Sales} > 11000.00 " _ & "AND Mid({Customer.Customer Name}, 1, 1) = ""A"" " string selectFormula = "{Customer.Last Year's Sales} > 11000.00 " + "AND Mid({Customer.Customer Name}, 1, 1) = \"A\""; b) Asigne la cadena de la fórmula de selección a la propiedad SelectionFormula del control CrystalReportViewer. myCrystalReportViewer.SelectionFormula = mySelectFormula crystalReportViewer.SelectionFormula = selectFormula; Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 289 1.5.1.4.2 Enlazar el informe Cuando siguió las instrucciones de la sección Configuración de proyectos [página 14] para prepararse para este tutorial, colocó un control CrystalReportViewer en el formulario Web Forms o Windows Forms. En los pasos anteriores, agregó un informe CustomersBySalesName y una fórmula de selección al proyecto. En esta sección enlazará la ruta de directorio de archivos del informe CustomersBySalesName con el control CrystalReportViewer. Después, va a comprobar si el informe se muestra correctamente con los registros filtrados por la fórmula de selección. 1.5.1.4.2.1 Para enlazar la ruta de directorio de archivos del informe CustomersBySalesName al control CrystalReportViewer Procedimiento 1. Abra el formulario Web Forms o Windows Forms. 2. En el menú Ver, haga clic en Código para ver la clase de código subyacente de Web Forms o Windows Forms. 3. Busque el método ConfigureCrystalReports() (que ha creado en Configuración de proyectos [página 14]). 4. Declare una variable de cadena, llámela reportPath y asígnele una ruta en tiempo de ejecución al informe local. Esta ruta se determina de forma diferente para los sitios Web y los proyectos para Windows: ○ Para un sitio Web, pase el nombre del archivo de informe local como un parámetro de cadena al método Server.MapPath(). Esto asigna el informe local a la ruta del directorio de archivos de la unidad de disco duro en tiempo de ejecución. Dim reportPath As String = Server.MapPath("CustomersBySalesName.rpt") string reportPath = Server.MapPath("CustomersBySalesName.rpt"); ○ Para un proyecto Windows, concatene la propiedad Application.StartupPath con una barra diagonal inversa y el nombre del archivo de informe local. Esto asigna el informe al mismo directorio del archivo ejecutable de Windows. Nota En la fase de compilación se copiará el informe al directorio que contiene el archivo ejecutable. Dim reportPath As String = Application.StartupPath & "\" & "CustomersBySalesName.rpt" string reportPath = Application.StartupPath + "\\" + "CustomersBySalesName.rpt"; 290 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 5. Asigne la ruta de directorio de archivos del informe NorthwindCustomers a la propiedad ReportSource del control CrystalReportViewer. myCrystalReportViewer.ReportSource = reportPath crystalReportViewer.ReportSource = reportPath; 1.5.1.4.2.2 Para probar la fórmula de selección del informe CustomersBySalesName Procedimiento 1. En el menú Generar, haga clic en Generar solución. 2. Si existen errores de generación, continúe y corríjalos ahora. 3. Si usa un informe no incrustado en un proyecto Windows, busque el archivo ejecutable de Windows compilado en el subdirectorio \bin\ [Visual Basic] o \bin\debug\ [C#] y, a continuación, copie el informe en dicho subdirectorio. Nota Para que el archivo ejecutable de Windows cargue el informe no incrustado en tiempo de ejecución, el informe deberá estar almacenado en el mismo directorio que el archivo ejecutable de Windows. 4. En el menú Depurar, haga clic en Iniciar. El informe de Crystal Reports muestra cuatro registros de cliente: Alley Cat Cycles, Ankara Bicycle Company, Arsenault et Maurier y Athens Bicycle Co. 5. Vuelva a Visual Studio y haga clic en Detener para salir del modo de depuración. 1.5.1.4.3 selección Agregar controles para usarlos en la fórmula de Contexto En esta sección, va a agregar controles para cambiar dinámicamente los valores utilizados en la fórmula de selección. Para el campo Ventas del año pasado, va a agregar un cuadro de texto para especificar el valor mínimo de ventas que se va a mostrar en el informe de Crystal. En el campo Nombre del cliente , va a agregar un control DropDownList y un control TextBox para especificar los nombres de los clientes que se van a mostrar. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 291 Procedimiento 1. Abra el formulario Web Forms o Windows Forms. 2. En el menú Ver, haga clic en Diseñador. 3. Si está desarrollando un sitio Web, realice las siguientes acciones: a) Haga clic en el control CrystalReportViewer para seleccionarlo. b) Presione la FLECHA IZQUIERDA del teclado de modo que aparezca un cursor parpadeante y, a continuación, presione INTRO tres veces. El control CrystalReportViewer bajará tres líneas. 4. Si está desarrollando un proyecto de Windows, realice las siguientes acciones: a) Haga clic en el control CrystalReportViewer para seleccionarlo. b) En la ventana Propiedades, establezca el valor de Dock en "Bottom". c) Ajuste el tamaño del control CrystalReportViewer, para que aparezcan tres líneas aproximadamente sobre él. d) En la ventana Propiedades, establezca el valor de Anchor en "Top, Bottom, Left, Right". 5. Si está desarrollando un sitio Web, en la primera línea escriba Especifique el valor mínimo de las ventas del año pasado: $. 6. Si está desarrollando un proyecto de Windows, realice las siguientes acciones: a) En el Cuadro de herramientas, arrastre un control Label hasta la parte superior del formulario. b) En la ventana Propiedades, establezca el valor de la propiedad Text en Especifique el valor mínimo de las ventas del año pasado: $. 7. En el Cuadro de herramientas, arrastre un control TextBox hasta la derecha del texto. 8. Seleccione el control TextBox y, a continuación, en la ventana Propiedades, siga estos pasos: a) Establezca el valor de ID (o Name) en lastYearsSales. b) Establezca el valor de Text en 11000,00. 9. Si está desarrollando un sitio Web, en la segunda línea, escriba Mostrar el nombre de los clientes. 10. Si está desarrollando un proyecto de Windows, realice las siguientes acciones: a) En el Cuadro de herramientas, arrastre un control Label hasta la segunda línea del formulario. b) En la ventana Propiedades, establezca el valor de la propiedad Text en "Mostrar el nombre de los clientes". 11. En el Cuadro de herramientas, arrastre un control DropDownList (ComboBox para un proyecto Windows) hasta la derecha del texto. 12. Seleccione el control DropDownList (ComboBox) y, a continuación, en la ventana Propiedades, establezca el valor de ID (o Name) en "selectOperatorList". 13. En el Cuadro de herramientas, arrastre un control TextBox hasta la derecha del control DropDownList. 14. Seleccione el control TextBox y, a continuación, en la ventana Propiedades, siga estos pasos: a) Establezca ID o Name en customerName. b) Establezca el valor de Text en A. 15. En el Cuadro de herramientas, arrastre un control Button hasta la tercera línea del formulario y sobre el control CrystalReportViewer. 16. Seleccione el control Button y, a continuación, en la ventana Propiedades, siga estos pasos: a) Establezca el valor de ID (o Name) en redisplay. 292 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net b) Establezca Text como Volver a mostrar el informe. 1.5.1.4.4 código Establecer la fórmula de selección manualmente en Ya está preparado para agregar código para modificar la fórmula de selección en la clase de código subyacente. 1.5.1.4.4.1 Para codificar la fórmula de selección Procedimiento 1. Abra el formulario Web Forms o Windows Forms. 2. En el menú Ver, seleccione Diseñador. 3. Haga doble clic en Volver a mostrar el informe. Aparece la clase de código subyacente del informe, que muestra que se ha generado automáticamente un controlador de eventos redisplay_Click(). 4. En la fórmula de selección, cree una variable de cadena que incluya los valores desde los controles TextBox. La fórmula de selección es parecida al texto escrito en el método ConfigureCrystalReports(). En vez del valor de mínimo de ventas de $11000,00, utilice el valor del control TextBox lastYearsSales. Para el campo Nombre del cliente, utilice el valor del control TextBox customerName. Dim mySelectFormula As String = "{Customer.Last Year's Sales} > " & lastYearsSales.Text _ & " AND Mid({Customer.Customer Name}, 1, 1) > """ & customerName.Text & """" string selectFormula = "{Customer.Last Year's Sales} > " + lastYearsSales.Text + " AND Mid({Customer.Customer Name}, 1, 1) > \"" + customerName.Text + "\""; 5. Asigne la variable de cadena a la propiedad SelectionFormula del control CrystalReportViewer. myCrystalReportViewer.SelectionFormula = mySelectFormula crystalReportViewer.SelectionFormula = selectFormula; 6. Vuelva a enlazar el informe CustomerBySalesName a la propiedad ReportSource del control CrystalReportViewer. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 293 Nota La ruta de directorio de archivos que se muestra aquí es la de un proyecto de Visual Studio. ProjectName se reemplaza por el nombre del proyecto Web o de Windows. UserName se reemplaza por el nombre de conexión del equipo. ○ La ruta predeterminada de un sitio Web es la siguiente: myCrystalReportViewer.ReportSource = "C:\WebSites\ ProjectName \CustomersBySalesName.rpt" crystalReportViewer.ReportSource = "C:\\WebSites\\ ProjectName\ \CustomersBySalesName.rpt"; ○ La ruta predeterminada de un proyecto de Windows es la siguiente: myCrystalReportViewer.ReportSource = "C:\Documents and Settings\ UserName\Mis documentos\Visual Studio\Projects\ ProjectName\CustomersBySalesName.rpt" crystalReportViewer.ReportSource = "C:\\Documents and Settings\\ UserName\ \Mis documentos\\Visual Studio\\Projects\\ ProjectName\ \CustomersBySalesName.rpt"; Resultados Ya ha creado una fórmula de selección que puede modificar en tiempo de ejecución. 1.5.1.4.4.2 Para probar la fórmula de selección Procedimiento 1. En el menú Generar, haga clic en Generar solución. 2. Si existen errores de generación, continúe y corríjalos ahora. 3. En el menú Depurar, haga clic en Iniciar. 4. En el control TextBox lastYearsSales, escriba 200000. 5. En el control TextBox customerName, escriba SAB. 6. Haga clic en Volver a mostrar el informe. El informe Crystal Reports muestra tres registros de clientes: SAB Mountain, Tek Bikes y Tienda de Bicicletas El Pardo. Se muestran sólo los registros de clientes con nombres mayores que "SAB" y ventas del año pasado mayor que "200000". 294 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 7. Vuelva a Visual Studio y haga clic en Detener para salir del modo de depuración. 1.5.1.4.5 Utilizar un control DropDownList para modificar la fórmula de selección En esta sección, va a llenar el control DropDownList con operadores de comparación. Va a crear una enumeración que contiene los operadores de comparación. El control DropDownList selecciona si desea mostrar los nombres de los clientes que sean iguales, menores, mayores, menores o iguales, mayores o iguales que o no sean iguales que el texto especificado en el control TextBox. En el método de evento redisplay_Click(), va a modificar la cadena actualmente asignada a la propiedad SelectionFormula del control CrystalReportViewer. 1.5.1.4.5.1 Para crear la enumeración CeComparisonOperator Procedimiento 1. En el Explorador de soluciones, haga clic con el botón secundario en el nombre de proyecto en negrita, elija Agregar y, a continuación, haga clic en Agregar nuevo elemento. 2. En el cuadro de diálogo Agregar nuevo elemento, seleccione Clase en la vista Plantillas. 3. En el campo Nombre, escriba CeComparisonOperator y, a continuación, haga clic en Agregar. Nota Puede que se le pida que coloque esta clase en un directorio de código. Haga clic en el botón Sí. 4. En la firma de clase, cambie la palabra clase por enum para convertir la clase en una enumeración. En un proyecto Windows de C#, también debe cambiar el espacio de nombres al nombre del proyecto. Nota En Visual Basic, recuerde cambiar las firmas tanto de apertura como de cierre de la clase a enumeración. 5. Puesto que las enumeraciones no tienen constructores, elimine el método constructor predeterminado que se proporciona en la versión de C# del código. 6. En la enumeración, especifique los valores: EqualTo LessThan GreaterThan LessThan_or_EqualTo Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 295 GreaterThan_or_EqualTo Not_EqualTo EqualTo, LessThan, GreaterThan, LessThan_or_EqualTo, GreaterThan_or_EqualTo, Not_EqualTo 1.5.1.4.5.2 Para llenar el control DropDownList desde la enumeración CeComparisonOperator para un sitio Web Contexto Los siguientes procedimientos explican cómo enlazar la enumeración CeComparisonOperator al control DropDownList de un sitio Web o un proyecto para Windows. Siga las instrucciones de uno de los siguientes procedimientos de varios pasos. Procedimiento 1. Abra el formulario Web Forms. 2. En el menú Ver, haga clic en Código. 3. En el bloque condicional Not IsPostBack del método ConfigureCrystalReports(), delante de la declaración de cadena de la fórmula de selección, establezca el valor de la propiedad DataSource del control DropDownList en los valores de la enumeración CeComparisonOperator. selectOperatorList.DataSource = System.Enum.GetValues(GetType(CeComparisonOperator)) selectOperatorList.DataSource = System.Enum.GetValues(typeof(CeComparisonOperator)); 4. Ahora, llame al método DataBind() del control DropDownList selectOperatorList para enlazar los valores al control. selectOperatorList.DataBind() selectOperatorList.DataBind(); 296 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 1.5.1.4.5.3 Para llenar el control DropDownList desde la enumeración CeComparisonOperator para un proyecto Windows Procedimiento 1. Abra el formulario Windows Forms. 2. En el menú Ver, haga clic en Código. 3. En el método ConfigureCrystalReports(), delante de la declaración de cadena de la fórmula de selección, establezca el valor de la propiedad del control ComboBox selectOperatorList en los valores de la enumeración CeComparisonOperator. selectOperatorList.DataSource = System.Enum.GetValues(GetType(CeComparisonOperator)) selectOperatorList.DataSource = System.Enum.GetValues(typeof(CeComparisonOperator)); 1.5.1.4.5.4 Para crear el método auxiliar GetSelectedCompareOperator() Contexto Después, va a crear el método auxiliar GetSelectedCompareOperator() para que devuelva el índice seleccionado como cadena que representa un signo de operador de comparación. Procedimiento 1. En la parte inferior de la clase, cree un método auxiliar privado denominado GetSelectedCompareOperator() que devuelva una variable de cadena. Private Function GetSelectedCompareOperator() As String End Function private string GetSelectedCompareOperator() { } Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 297 2. En el método, cree un enunciado "Select Case" [Visual Basic] o "switch" [C#] que haga referencia a los miembros de la enumeración CeComparisonOperator y devuelva el signo del operador de comparación como variable de cadena. Select Case selectOperatorList.SelectedIndex Case CeComparisonOperator.EqualTo return "=" Case CeComparisonOperator.LessThan return "<" Case CeComparisonOperator.GreaterThan return ">" Case CeComparisonOperator.LessThan_or_EqualTo return "<=" Case CeComparisonOperator.GreaterThan_or_EqualTo return ">=" Case CeComparisonOperator.Not_EqualTo return "<>" Case Else return "=" End Select switch ((CeComparisonOperator)selectOperatorList.SelectedIndex) { case CeComparisonOperator.EqualTo: return "="; case CeComparisonOperator.LessThan: return "<"; case CeComparisonOperator.GreaterThan: return ">"; case CeComparisonOperator.LessThan_or_EqualTo: return "<="; case CeComparisonOperator.GreaterThan_or_EqualTo: return ">="; case CeComparisonOperator.Not_EqualTo: return "<>"; default: return "="; } 1.5.1.4.5.5 Para modificar el operador de comparación de Nombre del cliente asignado a la propiedad SelectionFormula Contexto En el método de evento redisplay_Click(), se utiliza actualmente un signo "mayor que" (">") para la selección del campo Nombre del cliente. A continuación, aprenderá a cambiar el signo al operador de comparación seleccionado desde el control DropDownList. El signo seleccionado se devuelve como cadena al llamar al método auxiliar GetSelectedCompareOperator(). 298 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Procedimiento 1. En la parte superior del método de evento redisplay_Click(), llame al método auxiliar GetSelectedCompareOperator() y asigne el resultado a una variable de cadena. Dim mySelectedOperator As String = GetSelectedCompareOperator() string selectedOperator = GetSelectedCompareOperator(); 2. Para la variable de cadena de la fórmula de selección, reemplace el signo "mayor que" (">") por la cadena del operador seleccionado. Dim mySelectFormula As String = "{Customer.Last Year's Sales} > " & lastYearsSales.Text _ & " AND Mid({Customer.Customer Name}, 1, 1) " & mySelectedOperator & " """ & customerName.Text & """" string selectFormula = "{Customer.Last Year's Sales} > " + lastYearsSales.Text + " AND Mid({Customer.Customer Name}, 1, 1) " + selectedOperator + " \"" + customerName.Text + "\""; 1.5.1.4.5.6 Para probar la fórmula de selección del informe CustomersBySalesName Contexto Ha creado una fórmula de selección que depende de los valores especificados para el campo Ventas del año pasado y el campo Nombre del cliente. Ahora puede generar y probar la fórmula de selección. Procedimiento 1. En el menú Generar, haga clic en Generar solución. 2. Si existen errores de generación, continúe y corríjalos ahora. 3. En el menú Depurar, haga clic en Iniciar. a) En el control TextBox lastYearsSales, escriba 40000. b) En el control TextBox customerName, escriba Athens Bicycle Co.. c) En DropDownList, seleccione LessThan. d) Haga clic en Volver a mostrar el informe. El informe de Crystal Reports muestra dos registros de cliente: Alley Cat Cycles y Ankara Bicycle Company. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 299 4. Vuelva a Visual Studio y haga clic en Detener para salir del modo de depuración. 1.5.1.5 Tutorial: Personalizar el control CrystalReportViewer En este tutorial, aprenderá a personalizar la presentación del control CrystalReportViewer. Introducción En este tutorial, aprenderá a personalizar el aspecto del control CrystalReportViewer mediante el uso de las propiedades desde su clase subyacente. Asimismo, aprenderá a utilizar los métodos de selección de página, zoom, búsqueda e impresión. Para comenzar, va a aprender a personalizar la barra de herramientas de CrystalReportViewer. Necesita un control ListBox que almacene las propiedades disponibles para la barra de herramientas. Sólo las propiedades seleccionadas desde este control se muestran en la barra de herramientas de CrystalReportViewer. A continuación, agregará un segundo control ListBox para almacenar los elementos del informe. En los sitios Web, también puede elegir mostrar todas las páginas del informe como una sola página o como páginas separadas. Aprenderá a personalizar el color de fondo mediante un control DropDownList. Después, aprenderá a seleccionar la página del informe que desee ver. Necesita un control TextBox para especificar el número de página y un control Button para volver a cargar el informe en la página seleccionada. Necesita, también, los controles TextBox y Button para modificar el factor de zoom y para buscar texto en el informe. Para un sitio Web, tiene acceso a las propiedades del control CrystalReportViewer que no están disponibles en un proyecto de Windows: una propiedad para elegir el modo de impresión y otras propiedades para cambiar el ancho, el estilo y el color de los bor Código de ejemplo Este tutorial incluye código de ejemplo de C# y Visual Basic que muestra la versión finalizada del proyecto. Siga las instrucciones de este tutorial para crear un nuevo proyecto o para abrir el proyecto de código de ejemplo y trabajar con una versión finalizada. El código de ejemplo se almacena en carpetas que están clasificadas por idioma y tipo de proyecto. Los nombres de las carpetas de cada versión del código de ejemplo son los siguientes: ● Sitio Web en C#: CS_Web_CRVObjMod_CustomizeViewer ● Proyecto para Windows en C#: CS_Win_CRVObjMod_CustomizeViewer ● Sitio Web en Visual Basic: VB_Web_CRVObjMod_CustomizeViewer ● Proyecto para Windows en Visual Basic: VB_Win_CRVObjMod_CustomizeViewer 300 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Información relacionada Directorio de informes de muestra [página 14] 1.5.1.5.1 Crear una tabla de configuración personalizada En esta sección, creará y configurará una tabla (en un sitio Web) o un control TableLayoutPanel (en un proyecto para Windows) para albergar los distintos controles que forman la tabla de configuración personalizada. Debido a que los sitios Web y los proyectos para Windows usan un tipo de tabla diferente, seleccione el procedimiento con pasos que corresponda a su sitio Web o proyecto para Windows. 1.5.1.5.1.1 Para crear una tabla de configuración personalizada para un sitio Web Procedimiento 1. Abra la página Default.aspx (el formulario Web Forms) en la vista Diseño. 2. Haga clic en el control CrystalReportViewer para seleccionarlo. 3. Presione la flecha izquierda para mover el cursor a la izquierda del control CrystalReportViewer y presione Intro. 4. Presione la flecha arriba para mover el cursor a la línea vacía situada encima del control CrystalReportViewer. 5. En el menú Diseño, haga clic en Insertar tabla. 6. En el cuadro de diálogo Insertar tabla, seleccione el botón de opción Personalizado. 7. En el panel Diseño, active la casilla de verificación Ancho y deje el valor en un 100%. 8. Aumente el número de Filas a 6 y el de Columnas a 4. 9. En el panel Atributos, active la casilla de verificación Borde, y aumente el número a 1. 10. Haga clic en el botón Propiedades de celda... 11. En el cuadro de diálogo Propiedades de celda, en el panel Diseño, establezca el cuadro combinado Alineación vertical en Superior. 12. Active la casilla de verificación Sin ajuste de línea y, a continuación, haga clic en Aceptar. 13. Haga clic en Aceptar de nuevo para cerrar el cuadro de diálogo Insertar tabla. Resultados Ahora ya estará preparado para agregar controles personalizados a esta tabla para el sitio Web. Continúe con Elementos de barra de herramientas y de informe del control CrystalReportViewer [página 303]. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 301 1.5.1.5.1.2 Para crear una tabla de configuración personalizada para un proyecto para Windows Contexto Nota Este procedimiento sólo funciona con un proyecto creado a partir de la Configuración de proyectos [página 14]. La configuración de proyectos contiene referencias específicas a espacios de nombres y configuración de códigos necesarios para este procedimiento, que no se podrá completar sin dicha configuración. Procedimiento 1. Abra el formulario Windows Forms en la vista Diseño. 2. Haga clic en la barra de título Formulario para seleccionar todo el formulario y, a continuación, arrastre la esquina inferior derecha del formulario para ampliarlo de modo que llene el área principal. 3. Haga clic en el control CrystalReportViewer para seleccionarlo. 4. En la ventana Propiedades, establezca Dock en "Bottom". 5. En la ventana Propiedades, establezca Anchor en "Top, Bottom, Left, Right". 6. En el Cuadro de herramientas, arrastre un control TableLayoutPanel hasta la parte superior izquierda del formulario Windows Forms. Aparecerá un control TableLayoutPanel, mostrando dos columnas y dos filas. 7. Si el panel Tarea inteligente no está abierto, haga clic en el botón triangular de la esquina superior derecha del control TableLayoutPanel. Se abrirá el panel Tarea inteligente denominado "TableLayoutPanel Tasks". 8. En la etiqueta TableLayoutPanel Tasks, haga clic en el vínculo Editar filas y columnas. 9. En el cuadro de diálogo Estilos de columna y fila, en el cuadro combinado Tipo de miembro, seleccione Columnas. 10. Haga clic en Agregar hasta que tenga un total de cuatro columnas. 11. Para cada columna, realice lo siguiente: a) Seleccione la columna. b) En el panel Tipo de tamaño seleccione Porcentaje. c) Establezca cada valor al 25%. 12. En el cuadro combinado Tipo de miembro, seleccione Filas. 13. Haga clic en Agregar hasta que tenga un total de cinco filas. Nota La tabla de un proyecto Windows requiere una fila menos que la tabla de un sitio Web, porque hay menos opciones configurables en un control CrystalReportViewer de un proyecto Windows. 302 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 14. Para cada fila, realice lo siguiente: a) Seleccione la fila. b) En el panel Tipo de tamaño seleccione Porcentaje. c) Establezca el valor de la primera fila al 40%, y para las filas subsiguientes establezca el valor al 15%. Nota (1 x 40%) y (4 x 15%) = 100% de espacio disponible. 15. Haga clic en Aceptar. 16. Cierre la etiqueta TableLayoutPanel Tasks. 17. Arrastre la esquina inferior derecha del control TableLayoutPanel para agrandar la tabla hasta que llene el espacio creado encima del control CrystalReportViewer. Resultados Ahora ya estará preparado para agregar controles personalizados a esta tabla para el proyecto para Windows. 1.5.1.5.2 Elementos de barra de herramientas y de informe del control CrystalReportViewer En este tutorial manipulará los distintos elementos de barra de herramientas y de informe del control CrystalReportViewer. Elementos de visor Los elementos predeterminados del control CrystalReportViewer varían ligeramente para los sitios Web y para los proyectos para Windows: ● Tanto para sitios Web como para proyectos para Windows: ○ Barra de herramientas: muestra una barra de herramientas encima del área principal del informe. Los elementos individuales dentro de la barra de herramientas se controlan por separado. Nota Para obtener más información, vea la sección siguiente relativa a los elementos de barra de herramientas. ○ ● Árbol de grupos: muestra los encabezados de cada grupo del informe, de forma similar al árbol de directorios; aparece en el panel de la columna izquierda del informe. Sólo para sitios Web: ○ Página principal: muestra el informe en el área principal de la página. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 303 ○ ● Activar páginas separadas: determina si el informe se muestra en una única página Web o como páginas independientes con formato. Sólo para proyectos para Windows: ○ Barra de estado: muestra el número de página actual y otra información sobre el informe, en la parte inferior del área del informe. Elementos de la barra de herramientas Los elementos predeterminados de la barra de herramientas varían ligeramente para los sitios Web y para los proyectos para Windows: ● ● ● Tanto para sitios Web como para proyectos para Windows: ○ Botón de árbol de grupos: muestra u oculta la sección del árbol de grupos del informe. ○ Exportar: guarda el informe de Crystal Reports en otro formato de archivo, como RPT, PDF, DOC, XLS o RTF. ○ Imprimir: imprime el informe de Crystal Reports en un archivo PDF o llama al cuadro de diálogo Imprimir. ○ Exploración de páginas: le permite seleccionar la página siguiente, anterior, última o primera para verla. ○ Ir a página: le permite escribir el número de página que desee ver. ○ Buscar: le permite escribir una cadena que desee buscar en el informe. ○ Factor de zoom: le permite seleccionar el factor de zoom del informe. Sólo para sitios Web: ○ Vista de lista (sólo para un sitio Web): elige la vista del informe que se mostrará (por ejemplo, subinformes, etc.). ○ Profundizar: abre una página con información más específica que el tema actual. ○ Logotipo de Crystal: muestra el logotipo del producto SAP Crystal Reports. Sólo para proyectos para Windows: ○ Actualizar: vuelve a mostrar el informe. ○ Cerrar vista actual: cierra la vista actual del informe si hay varias vistas abiertas. 1.5.1.5.3 Agregar un mecanismo para mostrar u ocultar los elementos de barra de herramientas y de informe Contexto En esta sección aprenderá a agregar un mecanismo que determina qué elementos de la barra de herramientas CrystalReportViewer se muestran u ocultan. Empezará agregando los controles ListBox y Button a la tabla en el formulario Web Forms o Windows Forms. A continuación, creará dos enumeraciones que muestran una lista de los elementos del informe y de la barra de herramientas, y llenará cada control ListBox con los valores de una de las enumeraciones. Después, codificará el evento de clic del control Button para actualizar los elementos de la barra de herramientas. 304 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Dentro del controlador de eventos las propiedades de la clase CrystalReportViewer se establecen basándose en los dos controles ListBox. Si se selecciona un elemento de ListBox, la propiedad de la barra de herramientas se establece en True. Más tarde en este tutorial, se utilizará el control Button para actualizar selecciones adicionales. En tiempo de ejecución, puede seleccionar qué elementos del informe y de la barra de herramientas desea mostrar. Empezará agregando los controles a la tabla en la parte superior del formulario Web Forms o Windows Forms. Procedimiento 1. Abra el formulario Web Forms o Windows Forms en la vista Diseño. 2. En el Cuadro de herramientas, arrastre un control Label a la sexta fila y a la columna uno de la tabla. 3. Seleccione el control Label y, a continuación, en la ventana Propiedades, establezca la propiedad Text en Seleccionar elementos de informe para mostrar. 4. En el Cuadro de herramientas, arrastre un control ListBox a la primera fila y la columna dos de la tabla. 5. Seleccione el control ListBox y, a continuación, en la ventana Propiedades, siga estos pasos: a) Establezca el ID a listCRVReport. b) Establezca SelectionMode en Multiple (en un proyecto de Windows, MultiExtended). 6. En el Cuadro de herramientas, arrastre un segundo control Label a la primera fila y la columna tres de la tabla. 7. Seleccione el control Label y, a continuación, en la ventana Propiedades, establezca la propiedad Text en Seleccionar elementos de barra de herramientas para mostrar. 8. En el Cuadro de herramientas, arrastre un control Button a la tercera fila y la columna uno de la tabla. 9. Haga clic en el control Button para seleccionarlo. 10. En la ventana Propiedades: a) Establezca ID en "redisplay". b) Establezca Text como "Volver a mostrar el informe". 11. En un proyecto para Windows, ajuste el tamaño del control Button para mostrar el texto completo del botón. Resultados Los pasos siguientes varían, dependiendo de si se crea un sitio Web o un proyecto para Windows. Elija uno de los temas siguientes: ● Configurar los controles ListBox de un sitio Web [página 306] ● Configurar los controles ListBox de un proyecto para Windows [página 312] Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 305 1.5.1.5.4 Configurar los controles ListBox de un sitio Web Esta sección explica cómo configurar los controles ListBox de un sitio Web. Si va a crear un proyecto para Windows, vea Configurar los controles ListBox de un proyecto para Windows [página 312]. Ahora puede crear el controlador de eventos de clic para el control Button y, a continuación, agregar código a este controlador de eventos. El controlador de eventos define varios valores booleanos para las propiedades de barra de herramientas de la clase CrystalReportViewer basándose en las selecciones del usuario en el control ListBox. Antes de crear este controlador de eventos, deberá crear dos enumeraciones: CeWebCRVReportOptions y CeWebCRVToolbarOptions. Estas enumeraciones proporcionan una lista de elementos de informe y de barra de herramientas seleccionables. 1.5.1.5.4.1 Para crear la enumeración CeWebCRVReportOptions Procedimiento 1. En el Explorador de soluciones, haga clic con el botón secundario en el nombre del sitio Web, seleccione Agregar y, a continuación, haga clic en Agregar nuevo elemento. 2. En el cuadro de diálogo Agregar nuevo elemento, seleccione Clase en la vista Plantillas. 3. En el campo Nombre, escriba "CeWebCRVReportOptions" y, a continuación, haga clic en Agregar. Nota Puede que se le pida que coloque esta clase en un directorio App_Code. Haga clic en el botón Sí. 4. En la firma de clase, cambie la palabra clase por "enum" para convertir la clase en una enumeración. Nota En Visual Basic, recuerde cambiar las firmas tanto de apertura como de cierre de la clase a enumeración. 5. Puesto que las enumeraciones no tienen constructores, elimine el método constructor predeterminado que se proporciona en la versión de C# del código. 6. En la enumeración, especifique los valores: Toolbar Group_Tree Main_Page Enable_Separate_Pages Toolbar, Group_Tree, Main_Page, Enable_Separate_Pages 306 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 7. En el menú Archivo, haga clic en Guardar todo. 1.5.1.5.4.2 Para crear la enumeración CeWebCRVToolbarOptions Procedimiento 1. En el Explorador de soluciones, haga clic con el botón secundario en el nombre del sitio Web, seleccione Agregar y, a continuación, haga clic en Agregar nuevo elemento. 2. En el cuadro de diálogo Agregar nuevo elemento, seleccione Clase en la vista Plantillas. 3. En el campo Nombre, escriba CeWebCRVToolbarOptions y, a continuación, haga clic en Agregar. Nota Puede que se le pida que coloque esta clase en un directorio App_Code. Haga clic en el botón Sí. 4. En la firma de clase, cambie la palabra clase por "enum" para convertir la clase en una enumeración. Nota En Visual Basic, recuerde cambiar las firmas tanto de apertura como de cierre de la clase a enumeración. 5. Puesto que las enumeraciones no tienen constructores, elimine el método constructor predeterminado que se proporciona en la versión de C# del código. 6. En la enumeración, especifique los valores: Group_Tree_Button Export_Button Print_Button View_List_Button Drill_Up_Button Page_Navigation_Button Go_to_Page_Button Search_Button Zoom_Button Crystal_Logo Group_Tree_Button, Export_Button, Print_Button, View_List_Button, Drill_Up_Button, Page_Navigation_Button, Go_to_Page_Button, Search_Button, Zoom_Button, Crystal_Logo 7. En el menú Archivo, haga clic en Guardar todo. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 307 1.5.1.5.4.3 Para llenar los controles ListBox a partir de las enumeraciones Contexto Ahora llene los controles ListBox con los valores de la enumeración, que representan las propiedades disponibles para la barra de herramientas de CrystalReportViewer. Procedimiento 1. Abra el formulario Web Forms. 2. En el menú Ver, haga clic en Código. 3. En el método ConfigureCrystalReports(), agregue un bloque condicional Not IsPostBack. Nota El método ConfigureCrystalReports() lo creó durante Configuración de proyectos [página 14] al comienzo de este tutorial. If Not IsPostBack Then End If if (!IsPostBack) { } 4. En el bloque condicional, establezca el valor de la propiedad DataSource del control ListBox listCRVReport en los valores de la enumeración CeWebCRVReportOptions. listCRVReport.DataSource = System.Enum.GetValues(GetType(CeWebCRVReportOptions)) listCRVReport.DataSource = System.Enum.GetValues(typeof(CeWebCRVReportOptions)); 5. Llame al método DataBind() del control ListBox listCRVReport para enlazar los valores al control. listCRVReport.DataBind() listCRVReport.DataBind(); 308 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 6. A continuación, establezca el valor de la propiedad DataSource del CeWebCRVToolbarOptions ListBox a los valores de la enumeración listCRVToolbar. listCRVToolbar.DataSource = System.Enum.GetValues(GetType(CeWebCRVToolbarOptions)) listCRVToolbar.DataSource = System.Enum.GetValues(typeof(CeWebCRVToolbarOptions)); 7. Llame al método DataBind() del control ListBox listCRVToolbar para enlazar los valores al control. listCRVToolbar.DataBind() listCRVToolbar.DataBind(); 8. Fuera del bloque condicional Not IsPostBack, enlace el archivo Chart.rpt a la propiedad ReportSource del control CrystalReportViewer. Para obtener información sobre informes de ejemplo, vea Directorio de informes de muestra [página 14]. myCrystalReportViewer.ReportSource = "C:\Archivos de programa\Microsoft Visual Studio 9.0\Crystal Reports\Samples\En\Reports\Feature Examples\Chart.rpt" crystalReportViewer.ReportSource = "C:\\Archivos de programa\\Microsoft Visual Studio 9.0\\Crystal Reports\\Samples\\Es\\Reports\\Feature Examples\\Chart.rpt"; 1.5.1.5.4.4 Para codificar el control Button que vuelve a mostrar el informe de un sitio Web Contexto Ahora puede agregar código al evento de clic del control Button. El método de clic debe establecer los valores booleanos de los elementos de barra de herramientas y de informe de la clase CrystalReportViewer. Si se selecciona un elemento, el valor booleano establece en True, y se muestra el elemento de barra de herramientas o de informe. Si no se selecciona ninguna propiedad, el valor booleano se establece en False y no se muestra el elemento de barra de herramientas o de informe. Procedimiento 1. Abra el formulario Web Forms. 2. En el menú Ver, haga clic en Diseñador. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 309 3. Haga doble clic en el control Button redisplay. Aparece la clase de código subyacente del informe, que muestra que se ha generado automáticamente un controlador de eventos redisplay_Click(). 4. En el método de evento redisplay_Click(), llame a la propiedad Selected para cada uno de elementos de los controles ListBox listCRVReport y listCRVToolbar. La propiedad Selected devuelve un valor booleano para establecer las propiedades de la barra de herramientas de CrystalReportViewer. Nota Los elementos de barra de herramientas y de informe de CrystalReportViewer se establecen a sus valores correspondientes en las enumeraciones CeWebCRVReportOptions y CeWebCRVToolbarOptions. Los valores de la clase de enumeración devuelven una cadena, que debe convertir a un número entero. myCrystalReportViewer.HasToggleGroupTreeButton = listCRVToolbar.Items(Convert.ToInt32(CeWebCRVToolbarOptions.Group_Tree_Button)).S elected myCrystalReportViewer.HasExportButton = listCRVToolbar.Items(Convert.ToInt32(CeWebCRVToolbarOptions.Export_Button)).Selec ted myCrystalReportViewer.HasPrintButton = listCRVToolbar.Items(Convert.ToInt32(CeWebCRVToolbarOptions.Print_Button)).Select ed myCrystalReportViewer.HasViewList = listCRVToolbar.Items(Convert.ToInt32(CeWebCRVToolbarOptions.View_List_Button)).Se lected myCrystalReportViewer.HasDrillUpButton = listCRVToolbar.Items(Convert.ToInt32(CeWebCRVToolbarOptions.Drill_Up_Button)).Sel ected myCrystalReportViewer.HasPageNavigationButtons = listCRVToolbar.Items(Convert.ToInt32(CeWebCRVToolbarOptions.Page_Navigation_Butto n)).Selected myCrystalReportViewer.HasGotoPageButton = listCRVToolbar.Items(Convert.ToInt32(CeWebCRVToolbarOptions.Go_to_Page_Button)).S elected myCrystalReportViewer.HasSearchButton = listCRVToolbar.Items(Convert.ToInt32(CeWebCRVToolbarOptions.Search_Button)).Selec ted myCrystalReportViewer.HasZoomFactorList = listCRVToolbar.Items(Convert.ToInt32(CeWebCRVToolbarOptions.Zoom_Button)).Selecte d myCrystalReportViewer.HasCrystalLogo = listCRVToolbar.Items(Convert.ToInt32(CeWebCRVToolbarOptions.Crystal_Logo)).Select ed myCrystalReportViewer.DisplayToolbar = listCRVReport.Items(Convert.ToInt32(CeWebCRVReportOptions.Toolbar)).Selected myCrystalReportViewer.DisplayGroupTree = listCRVReport.Items(Convert.ToInt32(CeWebCRVReportOptions.Group_Tree)).Selected myCrystalReportViewer.DisplayPage = listCRVReport.Items(Convert.ToInt32(CeWebCRVReportOptions.Main_Page)).Selected myCrystalReportViewer.SeparatePages = listCRVReport.Items(Convert.ToInt32(CeWebCRVReportOptions.Enable_Separate_Pages)) .Selected crystalReportViewer.HasToggleGroupTreeButton = listCRVToolbar.Items[Convert.ToInt32(CeWebCRVToolbarOptions.Group_Tree_Button)].S elected; 310 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net crystalReportViewer.HasExportButton = listCRVToolbar.Items[Convert.ToInt32(CeWebCRVToolbarOptions.Export_Button)].Selec ted; crystalReportViewer.HasPrintButton = listCRVToolbar.Items[Convert.ToInt32(CeWebCRVToolbarOptions.Print_Button)].Select ed; crystalReportViewer.HasViewList = listCRVToolbar.Items[Convert.ToInt32(CeWebCRVToolbarOptions.View_List_Button)].Se lected; crystalReportViewer.HasDrillUpButton = listCRVToolbar.Items[Convert.ToInt32(CeWebCRVToolbarOptions.Drill_Up_Button)].Sel ected; crystalReportViewer.HasPageNavigationButtons = listCRVToolbar.Items[Convert.ToInt32(CeWebCRVToolbarOptions.Page_Navigation_Butto n)].Selected; crystalReportViewer.HasGotoPageButton = listCRVToolbar.Items[Convert.ToInt32(CeWebCRVToolbarOptions.Go_to_Page_Button)].S elected; crystalReportViewer.HasSearchButton = listCRVToolbar.Items[Convert.ToInt32(CeWebCRVToolbarOptions.Search_Button)].Selec ted; crystalReportViewer.HasZoomFactorList = listCRVToolbar.Items[Convert.ToInt32(CeWebCRVToolbarOptions.Zoom_Button)].Selecte d; crystalReportViewer.HasCrystalLogo = listCRVToolbar.Items[Convert.ToInt32(CeWebCRVToolbarOptions.Crystal_Logo)].Select ed; crystalReportViewer.DisplayToolbar = listCRVReport.Items[Convert.ToInt32(CeWebCRVReportOptions.Toolbar)].Selected; crystalReportViewer.DisplayGroupTree = listCRVReport.Items[Convert.ToInt32(CeWebCRVReportOptions.Group_Tree)].Selected; crystalReportViewer.DisplayPage = listCRVReport.Items[Convert.ToInt32(CeWebCRVReportOptions.Main_Page)].Selected; crystalReportViewer.SeparatePages = listCRVReport.Items[Convert.ToInt32(CeWebCRVReportOptions.Enable_Separate_Pages)] .Selected; 1.5.1.5.4.5 Para probar el control Button que vuelve a mostrar el informe Contexto Ahora estará listo para generar y ejecutar el proyecto para personalizar la barra de herramientas CrystalReportViewer. Procedimiento 1. En el menú Generar, haga clic en Generar solución. 2. Si existen errores de generación, continúe y corríjalos ahora. 3. En el menú Depurar, haga clic en Iniciar. Los controles ListBox listCRVReport y listCRVToolbar muestran una lista completa de opciones de barra de herramientas y de informe de CrystalReportViewer. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 311 4. En el control ListBox de opciones de barra de herramientas, seleccione "Page_Navigation_Button", "Print_Button" y "Export_Button". 5. En el control ListBox de opciones de informe, seleccione "Toolbar", "Group_Tree" y "Main_Page". 6. Haga clic en Volver a mostrar el informe. La página se vuelve a cargar para mostrar un control CrystalReportViewer con una barra de herramientas, un árbol de grupos y una página principal visibles. Dentro de la barra de herramientas, sólo están visibles los botones Exploración de páginas, Imprimir y Exportar. 7. Vuelva a Visual Studio y haga clic en Detener para salir del modo de depuración. 1.5.1.5.5 Configurar los controles ListBox de un proyecto para Windows Esta sección explica cómo configurar los controles ListBox de un proyecto para Windows. Si va a crear un sitio Web, vea Configurar los controles ListBox de un sitio Web [página 306]. Ahora puede crear el controlador de eventos de clic para el control Button y, a continuación, agregar código a este controlador de eventos. El controlador de eventos define varios valores booleanos para las propiedades de barra de herramientas de la clase CrystalReportViewer basándose en las selecciones del usuario en el control ListBox. Antes de crear este controlador de eventos, deberá crear dos enumeraciones: CeWinCRVReportOptions y CeWinCRVToolbarOptions. Estas enumeraciones proporcionan una lista de elementos de informe y de barra de herramientas seleccionables. 1.5.1.5.5.1 Para crear la enumeración CeWinCRVReportOptions Procedimiento 1. En el Explorador de soluciones, haga clic con el botón secundario en el nombre de proyecto en negrita, elija Agregar y, a continuación, haga clic en Clase. 2. En el cuadro de diálogo Agregar nuevo elemento, en el campo Nombre, escriba CeWinCRVReportOptions y, a continuación, haga clic en Agregar. Nota En Visual Studio, puede que se le pida que coloque esta clase en un directorio App_Code. Haga clic en el botón Sí. 3. En la firma de clase, cambie la palabra clase por "enum" para convertir la clase en una enumeración. Nota En Visual Basic, recuerde cambiar las firmas tanto de apertura como de cierre de la clase a enumeración. 312 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 4. Puesto que las enumeraciones no tienen constructores, elimine el método constructor predeterminado que se proporciona en la versión de C# del código. 5. En la enumeración, especifique los valores: Toolbar Group_Tree Status_Bar Toolbar, Group_Tree, Status_Bar 6. En el menú Archivo, haga clic en Guardar todo. 1.5.1.5.5.2 Para crear la enumeración CeWinCRVToolbarOptions Procedimiento 1. En el Explorador de soluciones, haga clic con el botón secundario en el nombre de proyecto en negrita, elija Agregar y, a continuación, haga clic en Clase. 2. En el cuadro de diálogo Agregar nuevo elemento, en el campo Nombre, escriba "CeWinCRVToolbarOptions" y, a continuación, haga clic en Agregar. Nota Puede que se le pida que coloque esta clase en un directorio App_Code. Haga clic en el botón Sí. 3. En la firma de clase, cambie la palabra clase por "enum" para convertir la clase en una enumeración. Nota En Visual Basic, recuerde cambiar las firmas tanto de apertura como de cierre de la clase a enumeración. 4. Puesto que las enumeraciones no tienen constructores, elimine el método constructor predeterminado que se proporciona en la versión de C# del código. 5. En la enumeración, especifique los valores: Page_Navigation_Button Go_to_Page_Button Close_View_Button Print_Button Refresh_Button Export_Button Group_Tree_Button Zoom_Button Search_Button Page_Navigation_Button, Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 313 Go_to_Page_Button, Close_View_Button, Print_Button, Refresh_Button, Export_Button, Group_Tree_Button, Zoom_Button, Search_Button 6. En el menú Archivo, haga clic en Guardar todo. 1.5.1.5.5.3 Para llenar los controles ListBox a partir de las enumeraciones Contexto Ahora llene los controles ListBox con los valores de la enumeración, que representan las propiedades disponibles para la barra de herramientas de CrystalReportViewer. Procedimiento 1. Abra el formulario Windows Forms. 2. En el menú Ver, haga clic en Código. 3. En el método ConfigureCrystalReports(), establezca la propiedad DataSource del control ListBox listCRVReport en los valores de la enumeración CeWinCRVReportOptions. Nota El método ConfigureCrystalReports() lo creó durante Configuración de proyectos [página 14] al comienzo de este tutorial. listCRVReport.DataSource = System.Enum.GetValues(GetType(CeWinCRVReportOptions)) listCRVReport.DataSource = System.Enum.GetValues(typeof(CeWinCRVReportOptions)); 4. Establezca el valor de la propiedad DataSource del control ListBox listCRVToolbar en los valores de la enumeración CeWinCRVToolbarOptions. listCRVToolbar.DataSource = System.Enum.GetValues(GetType(CeWinCRVToolbarOptions)) listCRVToolbar.DataSource = System.Enum.GetValues(typeof(CeWinCRVToolbarOptions)); 314 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 5. Enlace el archivo Chart.rpt a la propiedad ReportSource del CrystalReportViewercontrol.. Para obtener información sobre informes de ejemplo, vea Directorio de informes de muestra [página 14]. myCrystalReportViewer.ReportSource = "C:\Archivos de programa\Microsoft Visual Studio 9.0\Crystal Reports\Samples\En\Reports\Feature Examples\Chart.rpt" crystalReportViewer.ReportSource = "C:\\Archivos de programa\\Microsoft Visual Studio 9.0\\Crystal Reports\\Samples\\Es\\Reports\\Feature Examples\\Chart.rpt"; 1.5.1.5.5.4 Para codificar el control Button que vuelve a mostrar el informe de un proyecto de Windows Contexto Ahora puede agregar código al evento de clic del control Button. El método de clic debe establecer los valores booleanos de los elementos de barra de herramientas y de informe de la clase CrystalReportViewer. Si se selecciona un elemento, el valor booleano establece en True, y se muestra el elemento de barra de herramientas o de informe. Si no se selecciona ninguna propiedad, el valor booleano se establece en False y no se muestra el elemento de barra de herramientas o de informe. Procedimiento 1. Abra el formulario Windows Forms. 2. En el menú Ver, haga clic en Diseñador. 3. Haga doble clic en el control Button redisplay. Aparece la clase de código subyacente del informe, que muestra que se ha generado automáticamente un controlador de eventos redisplay_Click(). 4. En el método de evento redisplay_Click(), llame al método GetSelected() y pase todos los elementos desde ListBox. El método GetSelected() devuelve un valor booleano para establecer las propiedades de barra de herramientas o de informe de CrystalReportViewer. Nota Los elementos de barra de herramientas y de informe de CrystalReportViewer se establecen a sus valores correspondientes en las enumeraciones CeWinCRVReportOptions y CeWinCRVToolbarOptions. myCrystalReportViewer.ShowPageNavigateButtons = listCRVToolbar.GetSelected(CeWinCRVToolbarOptions.Page_Navigation_Button) Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 315 myCrystalReportViewer.ShowGotoPageButton = listCRVToolbar.GetSelected(CeWinCRVToolbarOptions.Go_to_Page_Button) myCrystalReportViewer.ShowCloseButton = listCRVToolbar. GetSelected(CeWinCRVToolbarOptions.Close_View_Button) myCrystalReportViewer.ShowPrintButton = listCRVToolbar.GetSelected(CeWinCRVToolbarOptions.Print_Button) myCrystalReportViewer.ShowRefreshButton = listCRVToolbar.GetSelected(CeWinCRVToolbarOptions.Refresh_Button) myCrystalReportViewer.ShowExportButton = listCRVToolbar.GetSelected(CeWinCRVToolbarOptions.Export_Button) myCrystalReportViewer.ShowGroupTreeButton = listCRVToolbar.GetSelected(CeWinCRVToolbarOptions.Group_Tree_Button) myCrystalReportViewer.ShowZoomButton = listCRVToolbar.GetSelected(CeWinCRVToolbarOptions.Zoom_Button) myCrystalReportViewer.ShowTextSearchButton = listCRVToolbar.GetSelected(CeWinCRVToolbarOptions.Search_Button) myCrystalReportViewer.DisplayToolbar = listCRVReport.GetSelected(CeWinCRVReportOptions.Toolbar) myCrystalReportViewer.DisplayGroupTree = listCRVReport.GetSelected(CeWinCRVReportOptions.Group_Tree) myCrystalReportViewer.DisplayStatusBar = listCRVReport.GetSelected(CeWinCRVReportOptions.Status_Bar) crystalReportViewer.ShowPageNavigateButtons = listCRVToolbar.GetSelected(Convert.ToInt32(CeWinCRVToolbarOptions.Page_Navigation _Button)); crystalReportViewer.ShowGotoPageButton = listCRVToolbar.GetSelected(Convert.ToInt32(CeWinCRVToolbarOptions.Go_to_Page_Butt on)); crystalReportViewer.ShowCloseButton = listCRVToolbar. GetSelected(Convert.ToInt32(CeWinCRVToolbarOptions.Close_View_Button)); crystalReportViewer.ShowPrintButton = listCRVToolbar.GetSelected(Convert.ToInt32(CeWinCRVToolbarOptions.Print_Button)); crystalReportViewer.ShowRefreshButton = listCRVToolbar.GetSelected(Convert.ToInt32(CeWinCRVToolbarOptions.Refresh_Button) ); crystalReportViewer.ShowExportButton = listCRVToolbar.GetSelected(Convert.ToInt32(CeWinCRVToolbarOptions.Export_Button)) ; crystalReportViewer.ShowGroupTreeButton = listCRVToolbar.GetSelected(Convert.ToInt32(CeWinCRVToolbarOptions.Group_Tree_Butt on)); crystalReportViewer.ShowZoomButton = listCRVToolbar.GetSelected(Convert.ToInt32(CeWinCRVToolbarOptions.Zoom_Button)); crystalReportViewer.ShowTextSearchButton = listCRVToolbar.GetSelected(Convert.ToInt32(CeWinCRVToolbarOptions.Search_Button)) ; crystalReportViewer.DisplayToolbar = listCRVReport.GetSelected(Convert.ToInt32(CeWinCRVReportOptions.Toolbar)); crystalReportViewer.DisplayGroupTree = listCRVReport.GetSelected(Convert.ToInt32(CeWinCRVReportOptions.Group_Tree)); crystalReportViewer.DisplayStatusBar = listCRVReport.GetSelected(Convert.ToInt32(CeWinCRVReportOptions.Status_Bar)); 316 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 1.5.1.5.5.5 Para probar el control Button que vuelve a mostrar el informe Contexto Ya está preparado para generar y ejecutar el proyecto con el fin de personalizar la barra de herramientas de CrystalReportViewer. Procedimiento 1. En el menú Generar, haga clic en Generar solución. 2. Si existen errores de generación, continúe y corríjalos ahora. 3. En el menú Depurar, haga clic en Iniciar. Los controles de cuadro de lista listCRVReport y listCRVToolbar muestran una lista completa de las opciones de informe y barra de herramientas de CrystalReportViewer. 4. En el control ListBox de opciones de barra de herramientas, seleccione "Page_Navigation_Button", "Print_Button" y "Export_Button". 5. En el control ListBox de opciones de informe, seleccione "Toolbar", "Group_Tree" y "Main_Page". 6. Haga clic en Volver a mostrar el informe. La página se vuelve a cargar para mostrar un control CrystalReportViewer con una barra de herramientas, un árbol de grupos y una página principal visibles. Dentro de la barra de herramientas, sólo están visibles los botones Exploración de páginas, Imprimir y Exportar. 7. Vuelva a Visual Studio y haga clic en Detener para salir del modo de depuración. 1.5.1.5.6 Modificar el color de fondo del informe En esta sección, aprenderá a modificar el color de fondo del informe. Para empezar, agregará un control DropDownList para la selección de color de fondo. 1.5.1.5.6.1 fondo Para agregar controles para cambiar el color de Procedimiento 1. Abra el formulario Web Forms o Windows Forms. 2. En el menú Ver, haga clic en Diseñador. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 317 3. En el Cuadro de herramientas, arrastre un control Label a la segunda fila y la columna uno de la tabla. 4. Seleccione el control Label y, a continuación, en la ventana Propiedades, establezca la propiedad Text en Seleccionar color de fondo. 5. En el Cuadro de herramientas, arrastre un control DropDownList (para sitios Web) o ComboBox (para proyectos para Windows) a la segunda fila y la columna dos de la tabla. 6. Seleccione el control DropDownList/ComboBox y, a continuación, en la ventana Propiedades, establezca el valor de ID/Name en "selectBackColor". 1.5.1.5.6.2 Para establecer los valores predeterminados de los controles Contexto Ahora, debe agregar código al método ConfigureCrystalReports() para establecer los valores predeterminados de la lista de colores de fondo y de las casillas de verificación de los componentes del informe. Procedimiento 1. Abra el formulario Web Forms o Windows Forms. 2. En el menú Ver, haga clic en Código. A continuación, en el método ConfigureCrystalReports(), agregue el código para establecer los valores predeterminados de los controles. Nota Si está creando un sitio Web, coloque estas líneas de código en el bloque condicional Not IsPostBack. Si está creando un proyecto para Windows, coloque estas líneas de código en el área principal del método ConfigureCrystalReports(). 3. Asigne la enumeración KnownColor a la propiedad DataSource del control DropDownList selectBackColor. selectBackColor.DataSource = System.Enum.GetValues(GetType(KnownColor)) selectBackColor.DataSource = System.Enum.GetValues(typeof(KnownColor)); 4. En un sitio Web, enlace el origen de datos al control DropDownList selectBackColor. selectBackColor.DataBind() selectBackColor.DataBind(); 318 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 1.5.1.5.6.3 sitio Web Para asignar la selección de color de fondo en un Contexto Después, va a agregar código al evento de clic Button para volver a mostrar el informe basándose en las selecciones del control DropDownList selectBackColor. El código varía para un sitio Web en comparación con un proyecto para Windows. Seleccione el procedimiento adecuado para el sitio Web o para el proyecto para Windows. Procedimiento 1. Abra el formulario Web Forms. 2. En el menú Ver, haga clic en Código. 3. Sobre la firma de clase, agregue una declaración "Imports" [Visual Basic] o "using" [C#] en la parte superior de la clase de System.Drawing (si aún no se ha declarado este espacio de nombres). Imports System.Drawing using System.Drawing; 4. En el controlador de eventos redisplay_Click(), agregue el siguiente código: desde el control DropDownList selectBackColor, recupere el elemento seleccionado como cadena y páselo al método FromName() de la clase Color. Asigne el valor de Color a la propiedad BackColor del control CrystalReportViewer. myCrystalReportViewer.BackColor = Color.FromName(selectBackColor.SelectedItem.Text) crystalReportViewer.BackColor = Color.FromName(selectBackColor.SelectedItem.Text); 1.5.1.5.6.4 Para asignar la selección de color de fondo en un proyecto para Windows Contexto Ahora ya podrá probar el botón Redisplay Report. Pase a la siguiente sección. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 319 Procedimiento 1. Abra el formulario Windows Forms. 2. En el menú Ver, haga clic en Código. 3. Sobre la firma de clase, agregue una declaración "Imports" [Visual Basic] o "using" [C#] en la parte superior de la clase de System.Drawing (si aún no se ha declarado este espacio de nombres). Imports System.Drawing using System.Drawing; 4. En el controlador de eventos redisplay_Click(), agregue código para recuperar el elemento seleccionado desde el control ComboBox selectBackColor y convertirlo a una instancia de KnownColor. Dim mySelectedKnownColor As KnownColor = CType(selectBackColor.SelectedItem, KnownColor) KnownColor selectedKnownColor = (KnownColor)selectBackColor.SelectedItem; 5. Cree un bloque condicional que compruebe que el color de fondo seleccionado no es transparente. If Not mySelectedKnownColor = KnownColor.Transparent Then End If if (selectedKnownColor != KnownColor.Transparent) { } 6. Dentro del bloque If, pase la instancia de KnownColor al método FromKnownName() de la clase System.Drawing.Color. Asigne el valor de Color a la propiedad BackColor del control CrystalReportViewer. myCrystalReportViewer.BackColor = System.Drawing.Color.FromKnownColor(mySelectedKnownColor) crystalReportViewer.BackColor = System.Drawing.Color.FromKnownColor(selectedKnownColor); 320 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 1.5.1.5.6.5 Para probar el control Button que vuelve a mostrar el informe Contexto Ahora ya podrá probar el botón Redisplay Report. Procedimiento 1. En el menú Generar, haga clic en Generar solución. 2. Si existen errores de generación, continúe y corríjalos ahora. 3. En el menú Depurar, haga clic en Iniciar. Se muestran los controles DropDownList/ComboBox, junto con los controles ListBox y Button agregados en el procedimiento anterior. 4. En el control DropDownList de selectBackColor, seleccione "Blue". Nota No se olvide de seleccionar los elementos del informe, especialmente Main_Page, para que esté visible. 5. Haga clic en Volver a mostrar el informe. La página se vuelve a cargar para mostrar el informe en un fondo azul. 6. Vuelva a Visual Studio y haga clic en Detener para salir del modo de depuración. 1.5.1.5.7 informe Agregar código para seleccionar una página del En esta sección, aprenderá a codificar la opción "Ir a página" de la barra de herramientas de CrystalReportViewer. La barra de herramientas de CrystalReportViewer contiene botones de exploración de páginas y un cuadro de texto para seleccionar las páginas del informe. Puede utilizar los siguientes métodos de la clase CrystalReportViewer con el fin de escribir código manualmente para las selecciones de página: ● ShowFirstPage() ● ShowLastPage() ● ShowNextPage() ● ShowNthPage(int PageNumber) ● ShowPreviousPage() Cuando se llama a uno de estos métodos, se muestra la página seleccionada para el informe actual. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 321 1.5.1.5.7.1 Para agregar los controles TextBox y Button de la opción "Ir a página" Procedimiento 1. Abra el formulario Web Forms o Windows Forms en la vista Diseño. 2. En el Cuadro de herramientas, arrastre un control TextBox a la cuarta fila y a la columna uno de la tabla. 3. Seleccione el control TextBox y, a continuación, en la ventana Propiedades, siga estos pasos: a) Establezca el valor de ID (o Name) en "pageNumber". b) Establezca el valor de la propiedad Text para que esté vacía. 4. En el Cuadro de herramientas, arrastre un control Button a la quinta fila y la columna dos de la tabla. 5. Seleccione el control Button y, a continuación, en la ventana Propiedades, siga estos pasos: a) Establezca el valor de ID (o Name) en "goToPage". b) Establezca el valor de Text en "Ir a página". 1.5.1.5.7.2 Para codificar el controlador de eventos Click() del control Button Procedimiento 1. Haga doble clic en el control Button de Ir a página. Aparece la clase de código subyacente del informe, que muestra que se ha generado automáticamente un controlador de eventos goToPage_Click(). 2. Convierta el texto escrito en el control TextBox en un número entero y, a continuación, pase el valor al método ShowNthPage() del control CrystalReportViewer. Nota No ha validado que se especificó un número entero en el control TextBox. Para una aplicación de producción, debería agregar un control de validación configurado respecto al control TextBox. myCrystalReportViewer.ShowNthPage(Convert.ToInt32(pageNumber.Text)) crystalReportViewer.ShowNthPage(Convert.ToInt32(pageNumber.Text)); 322 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 1.5.1.5.7.3 Para probar el control del botón goToPage Procedimiento 1. En el menú Generar, seleccione Generar solución. 2. Si existen errores de generación, continúe y corríjalos ahora. 3. En el menú Depurar, haga clic en Iniciar. Se muestran el informe Chart y todos los controles agregados. 4. Especifique 3 en el control TextBox pageNumber y, a continuación, haga clic en Ir a página. Se vuelve a cargar la página para mostrar la página 3 del informe. 5. Vuelva a Visual Studio y haga clic en Detener para salir del modo de depuración. 1.5.1.5.8 Modificar el factor de zoom De forma predeterminada, la barra de herramientas de CrystalReportViewer le permite seleccionar un factor de zoom comprendido entre el 25% y el 400% mediante incrementos fijos de 25%, 50% o 100%. En esta sección, va a agregar código para permitir cualquier factor de zoom que desee. Necesita un control TextBox en el que escribir el factor de zoom deseado y un control Button para volver a cargar la página. 1.5.1.5.8.1 Para agregar los controles TextBox y Button para la opción Zoom Procedimiento 1. Abra el formulario Web Forms o Windows Forms en la vista Diseño. 2. En el Cuadro de herramientas, arrastre un control TextBox a la cuarta fila y a la columna tres de la tabla. 3. Seleccione el control TextBox y, a continuación, en la ventana Propiedades, siga estos pasos: a) Establezca el valor de ID (o Name) en "zoomFactor". b) Establezca el valor de la propiedad Text para que esté vacía. 4. En el Cuadro de herramientas, arrastre un control Button a la cuarta fila y la columna cuatro de la tabla. 5. Seleccione el control Button y, a continuación, en la ventana Propiedades, siga estos pasos: a) Establezca el valor de ID (o Name) en "updateZoomFactor". b) Establezca el valor de Text en "Factor de zoom". Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 323 1.5.1.5.8.2 Para codificar el controlador de eventos Click() del control Button Procedimiento 1. Haga doble clic en el control Button updateZoomFactor. Aparece la clase de código subyacente del informe, que muestra que se ha generado automáticamente un controlador de eventos updateZoomFactor_Click(). 2. Convierta el texto escrito en el control TextBox en un número entero y, a continuación, pase el valor al método Zoom() del control CrystalReportViewer. Nota No ha validado que se especificó un número entero en el control TextBox. Para una aplicación de producción, debería agregar un control de validación configurado respecto al control TextBox. myCrystalReportViewer.Zoom(Convert.ToInt32(zoomFactor.Text)) crystalReportViewer.Zoom(Convert.ToInt32(zoomFactor.Text)); 1.5.1.5.8.3 Para probar el control Button updateZoomFactor Procedimiento 1. En el menú Generar, haga clic en Generar solución. 2. Si existen errores de generación, continúe y corríjalos ahora. 3. En el menú Depurar, haga clic en Iniciar. Se muestran el informe Chart y todos los controles agregados. 4. Especifique "38" en el cuadro de texto zoomFactor y, a continuación, haga clic en Zoom. Se vuelve a cargar la página para mostrar la página actual al 38% de su tamaño original. 5. Vuelva a Visual Studio y haga clic en Detener para salir del modo de depuración. 1.5.1.5.9 Buscar en el informe En esta sección, aprenderá a buscar texto en un informe de Crystal Reports que enlace con el control CrystalReportViewer. Necesita un control TextBox para escribir la cadena de búsqueda deseada, un control Button para buscar en el informe y un control Label para notificar si la búsqueda se ha realizado o no correctamente. 324 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 1.5.1.5.9.1 Para agregar los controles TextBox, Button y Label de la opción Buscar Procedimiento 1. Abra el formulario Web Forms o Windows Forms en la vista Diseño. 2. En el Cuadro de herramientas, arrastre un control TextBox a la quinta fila y a la columna uno de la tabla. 3. Seleccione el control TextBox y, a continuación, en la ventana Propiedades, siga estos pasos: a) Establezca el valor de ID (o Name) en "searchText". b) Establezca el valor de la propiedad Text para que esté vacía. 4. En el Cuadro de herramientas, arrastre un control Button a la quinta fila y la columna dos de la tabla. 5. Seleccione el control Button y, a continuación, en la ventana Propiedades, siga estos pasos: a) Establezca el valor de ID (o Name) en "search". b) Establezca el valor de Text en "Buscar texto". 6. En el Cuadro de herramientas, arrastre un control Label a la quinta fila y a la columna tres de la tabla. a) Establezca el valor de ID (o Name) en "message". b) Establezca el valor de Text para que esté vacío. c) Establezca el valor de ForeColor en Red. 7. Cree la clase MessageConstants para almacenar respuestas estándar como constantes de cadena para la búsqueda. 1.5.1.5.9.2 Para codificar el controlador de eventos search_Click() para un sitio Web Contexto Después, debe llamar al método SearchAndHighlightText() en el control Button de búsqueda. Nota El método SearchAndHighlightText() no tiene el mismo comportamiento si se trata de un sitio Web o un proyecto Windows. Como el método no tiene el mismo comportamiento si se trata de un sitio Web o un proyecto para Windows, realice el siguiente procedimiento con pasos correspondiente a un sitio Web o un proyecto para Windows. Procedimiento 1. Haga doble clic en el control Button search. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 325 Aparece la clase de código subyacente del informe, que muestra que se ha generado automáticamente un controlador de eventos search_Click(). 2. Recupere el texto escrito en el control TextBox y, a continuación, pase el valor al método SearchAndHighlightText() del control CrystalReportViewer. Asigne la llamada del método a una variable booleana. Nota Para que la clase SearchDirection sea accesible, deberá incluir un enunciado "Imports" [Visual Basic] o "using" [C#] en la parte superior de la clase de código subyacente del espacio de nombres CrystalDecisions.Shared. (Esta declaración se ha agregado en Configuración de proyectos [página 14].) Dim mySearchResult As Boolean = myCrystalReportViewer.SearchAndHighlightText(searchText.Text, SearchDirection.Forward) bool searchResult = crystalReportViewer.SearchAndHighlightText(searchText.Text, SearchDirection.Forward); 3. Cree un bloque condicional que compruebe si la búsqueda tiene éxito. If Not mySearchResult Then Else End If if(!searchResult) { } else { } 4. En el bloque If, asigne la constante MessageConstants.SUCCESS a la propiedad Text del control Label message. message.Text = MessageConstants.SUCCESS message.Text = MessageConstants.SUCCESS; 5. En el bloque Else, asigne la constante MessageConstants.FAILURE a la propiedad Text del control Label message. message.Text = MessageConstants.FAILURE message.Text = MessageConstants.FAILURE; 326 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 1.5.1.5.9.3 Para codificar el controlador de eventos search_Click() para un proyecto para Windows Contexto Sáltese el siguiente procedimiento de un proyecto para Windows y vaya al próximo procedimiento de prueba. Procedimiento 1. Haga doble clic en el control Button search. Aparece la clase de código subyacente del informe, que muestra que se ha generado automáticamente un controlador de eventos search_Click(). 2. Recupere el texto escrito en el control TextBox y, a continuación, pase el valor al método SearchAndHighlightText() del control CrystalReportViewer. Asigne la llamada del método a una variable booleana. Dim mySearchResult As Boolean = myCrystalReportViewer.SearchAndHighlightText(searchText.Text) bool searchResult = crystalReportViewer.SearchAndHighlightText(searchText.Text); 3. Cree un bloque condicional que compruebe si la búsqueda tiene éxito. If mySearchResult Then Else End If if(searchResult) { } else { } 4. En el bloque If, asigne la constante MessageConstants.SUCCESS a la propiedad Text del control Label message. message.Text = MessageConstants.SUCCESS message.Text = MessageConstants.SUCCESS; Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 327 5. En el bloque Else, asigne la constante MessageConstants.FAILURE a la propiedad Text del control message Label. message.Text = MessageConstants.FAILURE message.Text = MessageConstants.FAILURE; 1.5.1.5.9.4 Para probar el control Button search Procedimiento 1. En el menú Generar, haga clic en Generar solución. 2. Si existen errores de generación, continúe y corríjalos ahora. 3. En el menú Depurar, haga clic en Iniciar. Se muestran el informe Chart y todos los controles agregados. 4. Especifique China en el cuadro de texto searchText y, a continuación, haga clic en Buscar. Se vuelve a cargar la página para resaltar el resultado de la búsqueda y para mostrar un mensaje de éxito. 5. Especifique hola en el cuadro de texto searchText y, a continuación, haga clic en Buscar. Se vuelve a cargar la página para mostrar un mensaje de error. 6. Vuelva a Visual Studio y haga clic en Detener para salir del modo de depuración. Resultados Las opciones de personalización restantes sólo están disponibles para la versión Web del control CrystalReportViewer. Por lo tanto, si está desarrollando un sitio Web, continúe con Agregar un borde al informe de un sitio Web [página 328]. Si está desarrollando un proyecto para Windows, ha terminado el tutorial. 1.5.1.5.10 Agregar un borde al informe de un sitio Web En esta sección, aprenderá a agregar un borde personalizado al informe de Crystal para un sitio Web. En los proyectos de Windows, no están disponibles las propiedades de ancho, estilo y color de borde. Los estilos de borde se citan en la enumeración BorderStyle. Los colores se citan en la enumeración KnownColor. Sin embargo, la propiedad BorderColor del control CrystalReportViewer incluye los valores de la clase Color. Por tanto, debe convertir el valor KnownColor al valor Color. 328 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Para comenzar, va a agregar los controles necesarios al formulario Web Forms. Necesita un control TextBox, dos controles DropDownList y un control Button para dibujar el borde. 1.5.1.5.10.1 Para agregar los controles con el fin de establecer el ancho, el estilo y el color de borde Procedimiento 1. Abra el formulario Web Forms. 2. En el menú Ver, haga clic en Diseñador. 3. En el Cuadro de herramientas, arrastre un control Label a la sexta fila y a la columna uno de la tabla. 4. Seleccione el control Label y, a continuación, en la ventana Propiedades, establezca la propiedad Text en "Ancho del borde". 5. En el Cuadro de herramientas, arrastre un control TextBox a la misma celda de la tabla que el control Label. 6. Seleccione el control TextBox y, a continuación, en la ventana Propiedades, establezca el valor de ID (o Name) en "borderWidth". 7. En el Cuadro de herramientas, arrastre un segundo control Label a la sexta fila y a la columna dos de la tabla. 8. Seleccione el control Label y, a continuación, en la ventana Propiedades, establezca Text en "Estilo del borde". 9. En el Cuadro de herramientas, arrastre un control DropDownList a la misma celda de la tabla que el control Label. 10. Seleccione el control DropDownList y, a continuación, en la ventana Propiedades, establezca el valor de ID (o Name) en "selectBorderColor". 11. En el Cuadro de herramientas, arrastre un tercer control Label a la sexta fila y a la columna tres de la tabla. 12. Seleccione el control Label y, a continuación, en la ventana Propiedades, establezca la propiedad Text en "Color del borde". 13. En el Cuadro de herramientas, arrastre un control DropDownList a la misma celda de la tabla que el control Label. 14. Seleccione el control DropDownList y, a continuación, en la ventana Propiedades, establezca el valor de ID (o Name) en "selectBorderColor". 15. En el Cuadro de herramientas, arrastre un control Button a la sexta fila y la columna cuatro de la tabla. 16. Seleccione el control Button y, a continuación, en la ventana Propiedades, siga estos pasos: a) Establezca el valor de ID (o Name) en "drawBorder". b) Establezca el valor de la propiedad Text en "Dibujar borde". Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 329 1.5.1.5.10.2 Para llenar los controles DropDownList Contexto Ahora debe rellenar los controles DropDownList con los estilos o los colores de borde disponibles para el control CrystalReportViewer. Los controles DropDownList se llenan en el método ConfigureCrystalReports(). En los sitios Web, los estilos de borde se almacenan en la enumeración System.Web.UI.WebControls.BorderStyle. Los colores de borde se recuperan de la enumeración System.Drawing.KnownColor. Procedimiento 1. Sobre la firma de clase, agregue una declaración "Imports" [Visual Basic] o "using" [C#] en la parte superior de la clase de System.Web.UI.WebControls y System.Drawing (si aún no se ha declarado este espacio de nombres). Imports System.Web.UI.WebControls Imports System.Drawing using System.Web.UI.WebControls; using System.Drawing; 2. En el método ConfigureCrystalReports(), en el bloque condicional Not IsPostBack, asigne la enumeración BorderStyle a la propiedad DataSource del control DropDownList selectBorderStyle. selectBorderStyle.DataSource = System.Enum.GetValues(GetType(BorderStyle)) selectBorderStyle.DataSource = System.Enum.GetValues(typeof(BorderStyle)); 3. Enlace el origen de datos al control DropDownList selectBorderStyle. selectBorderStyle.DataBind() selectBorderStyle.DataBind(); 4. También en el bloque condicional Not IsPostBack, asigne la enumeración DataSource a la propiedad DataSource del control DropDownList selectBorderColor. selectBorderColor.DataSource = System.Enum.GetValues(GetType(KnownColor)) selectBorderColor.DataSource = System.Enum.GetValues(typeof(KnownColor)); 330 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 5. Enlace el origen de datos al control DropDownList selectBorderColor. selectBorderColor.DataBind() selectBorderColor.DataBind(); 1.5.1.5.10.3 Para codificar el control del botón Dibujar borde Contexto A continuación, se asignan los valores a las propiedades BorderWidth, BorderStyle y BorderColor del control CrystalReportViewer. Procedimiento 1. Abra el formulario Web Forms. 2. En el menú Ver, haga clic en Diseñador. 3. Haga doble clic en el control Button Dibujar borde. Aparece la clase de código subyacente del informe, que muestra que se ha generado automáticamente un controlador de eventos drawBorder_Click(). 4. En el controlador de eventos drawBorder_Click(), asigne el texto que está escrito en el control TextBox borderWidth a la propiedad BorderWidth del control CrystalReportViewer. Nota No ha validado que se especificó un número entero en el control TextBox. Para una aplicación de producción, debería agregar un control de validación configurado respecto al control TextBox. myCrystalReportViewer.BorderWidth = Unit.Parse(borderWidth.Text.ToString()) crystalReportViewer.BorderWidth = Convert.ToInt32(borderWidth.Text); 5. En el control selectBorderStyle DropDownList, recupere el índice seleccionado y conviértalo a un valor BorderStyle. Asigne el valor de BorderStyle a la propiedad BorderStyle del control CrystalReportViewer. myCrystalReportViewer.BorderStyle = CType(selectBorderStyle.SelectedIndex, BorderStyle) Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 331 crystalReportViewer.BorderStyle = (BorderStyle)selectBorderStyle.SelectedIndex; 6. Desde el control DropDownList selectBorderColor, recupere el elemento seleccionado como cadena y páselo al método FromName() de la clase Color. Asigne el valor Color a la propiedad BorderColor del control CrystalReportViewer. myCrystalReportViewer.BorderColor = Color.FromName(selectBorderColor.SelectedItem.Text) crystalReportViewer.BorderColor = Color.FromName(selectBorderColor.SelectedItem.Text); 1.5.1.5.10.4 Crystal Para dibujar un borde alrededor del informe de Procedimiento 1. En el menú Generar, haga clic en Generar solución. 2. Si existen errores de generación, continúe y corríjalos ahora. 3. En el menú Depurar, haga clic en Iniciar. 4. Para el ancho de borde, escriba 10. 5. Para el estilo de borde, seleccione Double. 6. Para el color de borde, seleccione SteelBlue. 7. Haga clic en el botón Dibujar borde. Se vuelve a cargar la página para mostrar un borde alrededor del informe de Crystal. 8. Vuelva a Visual Studio y haga clic en Detener para salir del modo de depuración. 1.5.1.5.11 Web Configurar la persistencia de Session de un sitio En esta sección, aprenderá a configurar la persistencia de Session de los eventos de clic de botón. Cuando se vuelve a cargar una página Web debido a un evento de clic de botón, se pierden los cambios realizados en el modelo de objetos CrystalReportViewer. 332 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 1.5.1.5.11.1 Web Para demostrar la falta de persistencia de un sitio Procedimiento 1. En el menú Generar, seleccione Generar solución. 2. Si existen errores de generación, continúe y corríjalos ahora. 3. En el menú Depurar, haga clic en Iniciar. 4. En el control DropDownList selectBackColor, seleccione "Blue". 5. Haga clic en Volver a mostrar el informe. La página se vuelve a cargar para mostrar el informe sin barras de herramientas, en un fondo azul. 6. Para el ancho de borde, escriba "10". 7. Para el estilo de borde, seleccione "Double". 8. Para el color de borde, seleccione "SteelBlue". 9. Haga clic en Dibujar borde. La página se vuelve a cargar para mostrar un borde alrededor del informe de Crystal, y el color de fondo ya no es azul 10. Especifique "3" en el control TextBox pageNumber y, a continuación, haga clic en Ir a página. La página se vuelve a cargar para mostrar la página 3 del informe, y el borde alrededor del informe ya no está visible. 11. Vuelva a Visual Studio y haga clic en Detener para salir del modo de depuración. 1.5.1.5.11.2 Para agregar código de asignación de Session al controlador de eventos drawBorder_Click() Contexto Debe agregar código de persistencia a la aplicación para que se conserven los cambios efectuados en el modelo de objetos CrystalReportViewer cuando se vuelvan a cargar las páginas Web. Para empezar, agregue código de persistencia para los valores de borde al controlador de eventos drawBorder_Click(), en el que dichos valores se asignaron primero. A continuación, en el método ConfigureCrystalReports(), los valores que están almacenados en Session se recuperan y asignan a la propiedad correspondiente de la clase CrystalReportViewer. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 333 Procedimiento En el controlador de eventos drawBorder_Click(), después del código existente, agregue cuatro asignaciones Session para BackColor, BorderColor, BorderStyle y BorderWidth. Session("myBorderColor") = myCrystalReportViewer.BorderColor.ToString() Session("myBorderStyle") = myCrystalReportViewer.BorderStyle Session("myBorderWidth") = myCrystalReportViewer.BorderWidth Session["borderColor"] = crystalReportViewer.BorderColor.ToString(); Session["borderStyle"] = crystalReportViewer.BorderStyle; Session["borderWidth"] = crystalReportViewer.BorderWidth; 1.5.1.5.11.3 Para agregar código de recuperación de Session al método ConfigureCrystalReports() Contexto Ahora ya está preparado para obtener estos valores de Session en el método ConfigureCrystalReports(). Procedimiento 1. En la parte inferior del método ConfigureCrystalReports(), cree un bloque If que compruebe que la variable BackColor de Session no es nula. Si no lo es, en el bloque If, obtenga la propiedad BackColor de Session y proyéctela en una cadena. Pase la cadena al método FromName() de la clase Color y asigne la instancia de Color a la propiedad BackColor de la instancia de CrystalReportViewer. If Not IsNothing(Session("myBackColor")) Then myCrystalReportViewer.BackColor = Color.FromName(CType(Session("myBackColor"), String)) End If if (Session["backColor"] != null) { crystalReportViewer.BackColor = Color.FromName((string)Session["backColor"]); } 2. Cree un segundo bloque If que compruebe que la variable BorderColor Session no es nula. Si no lo es, en el bloque If, obtenga la propiedad BorderColor de Session y proyéctela en una cadena. Pase la cadena al 334 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net método FromName() de la clase Color y asigne la instancia de Color a la propiedad BorderColor de la instancia de CrystalReportViewer. If Not IsNothing(Session("myBorderColor")) Then myCrystalReportViewer.BorderColor = Color.FromName(CType(Session("myBorderColor"), String)) End If if (Session["borderColor"] != null) { crystalReportViewer.BorderColor = Color.FromName((string)Session["borderColor"]); } 3. Cree un tercer bloque If que compruebe que la variable BorderStyle Session no es nula. Si no lo es, en el bloque If, obtenga la propiedad BorderStyle de Session y proyéctela en BorderStyle. myCrystalReportViewer.BorderStyle = CType(Session("myBorderStyle"), BorderStyle) if (Session["borderStyle"] != null) { crystalReportViewer.BorderStyle = (BorderStyle)Session["borderStyle"]; } 4. Cree un cuarto bloque If que compruebe que la variable Session BorderWidth no es nula. Si no lo es, en el bloque If, obtenga la propiedad BorderWidth de Session y conviértala en un número entero. myCrystalReportViewer.BorderWidth = Convert.ToInt32(Session("myBorderWidth")) if (Session["borderStyle"] != null) { crystalReportViewer.BorderWidth = Convert.ToInt32(Session["borderStyle"]); } 1.5.1.5.11.4 Para codificar el botón de control de drawBorder Contexto En el siguiente procedimiento, agregará la persistencia de Session al controlador de eventos de clic del botón que vuelve a mostrar el informe. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 335 Procedimiento 1. En el controlador de eventos redisplay_Click(), asigne el elemento seleccionado en el control DropDownList selectBackColor a Session. Session("myBackColor") = selectBackColor.SelectedItem.Text Session["backColor"] = selectBackColor.SelectedItem.Text; 2. En el controlador de eventos drawBorder_Click(), asigne la propiedad Text del control TextBox borderWidth a Session. Session("myBorderWidth") = borderWidth.Text Session["borderWidth"] = borderWidth.Text; 3. Asigne el índice seleccionado del control DropDownList selectBorderStyle a Session. Session("myBorderStyle") = selectBorderStyle.SelectedIndex Session["borderStyle"] = selectBorderStyle.SelectedIndex; 4. Asigne el elemento seleccionado del control DropDownList selectBorderColor a Session. Session("myBorderColor") = selectBorderColor.SelectedItem.Text Session["borderColor"] = selectBorderColor.SelectedItem.Text; Resultados Ahora ya podrá crear y ejecutar el proyecto, para verificar que los cambios realizados en el informe se han conservado después de los eventos de clic de botón. 1.5.2 Tutoriales del modelo de objetos ReportDocument En esta sección se presentan varios tutoriales del modelo de objetos ReportDocument. En esta sección se presentan varios tutoriales del modelo de objetos ReportDocument. 336 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 1.5.2.1 Tutorial: Conservar el modelo de objetos ReportDocument con Session En este tutorial, usará el modelo de objetos ReportDocument y realizará cambios mediante programación en un informe en tiempo de ejecución. En este tutorial, usará el modelo de objetos ReportDocument y realizará cambios mediante programación en un informe en tiempo de ejecución. También aprenderá a usar Session para conservar estos cambios aunque se vuelva a cargar la página Web. Puesto que sólo las aplicaciones Web requieren la persistencia de Session, este tutorial no se aplica a los proyectos de Windows. Introducción El proyecto que creará en este tutorial usa un Web Forms que contiene un control CrystalReportViewer y dos botones que cambian la dirección de ordenamiento del informe dentro del modelo de objetos ReportDocument. En primer lugar, va a construir el proyecto sin la persistencia de Session. Sin ella, puede comprobar que el cambio de la dirección de ordenamiento tan sólo dura un evento de clic de botón. A continuación, va a agregar la persistencia de Session al proyecto. La instancia de ReportDocument se coloca en Session en la fase de creación, así como en cualquier momento en el que se cambie el estado de esta instancia de ReportDocument. Siempre que se deba volver a mostrar el informe, la instancia de ReportDocument se obtiene de Session y se enlaza al control CrystalReportViewer. De esta forma, se garantiza que siempre que se muestra el informe, el usuario verá la versión más reciente de la instancia de ReportDocument. Nota En este tutorial usará Session, porque querrá conservar las modificaciones que realice en el modelo de objetos ReportDocument. Si sólo pretende usar el modelo de objetos limitado que contiene el control CrystalReportViewer, use ViewState exclusivamente. Cuándo usar Session para conservar un objeto ReportDocument, ¿hay otros modelos de persistencia involucrados? Cuándo usar Session para conservar un objeto ReportDocument, ¿hay otros modelos de persistencia involucrados? Sí. En una aplicación Web ASP.NET, los objetos suelen utilizar Session para la persistencia, mientras que los controles de servidor Web usan ViewState. Como una aplicación Web de SAP Crystal Reports, versión para programadores de Microsoft Visual Studio usa objetos y controles de servidor Web para interactuar con informes, Session y ViewState comparten la persistencia: Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 337 ● Session conserva el modelo de objetos ReportDocument, que interactúa con el informe mediante programación en tiempo de ejecución. ● ViewState conserva el control CrystalReportViewer, que muestra el informe. En particular, ViewState conserva las propiedades de visualización, que se establecen en la barra de herramientas de CrystalReportViewer. ViewState también conserva los eventos (como zoom, NextPage) que se activan mediante botones de la barra de herramientas. La persistencia de ViewState se administra automáticamente. Por ello, en este tutorial sólo codificará la persistencia de Session. Código de ejemplo Este tutorial incluye código de ejemplo de C# y Visual Basic que muestra la versión finalizada del proyecto. Siga las instrucciones de este tutorial para crear un nuevo proyecto o para abrir el proyecto de código de ejemplo y trabajar con una versión finalizada. El código de ejemplo se almacena en carpetas que están clasificadas por idioma y tipo de proyecto. Los nombres de las carpetas de cada versión del código de ejemplo son los siguientes: ● Sitio Web en C#: CS_Web_RDObjMod_Session ● Sitio Web en Visual Basic: VB_Web_RDObjMod_Session Información relacionada ¿Cuál es el enfoque de persistencia que se debe usar con SAP Crystal Reports? [página 52] Directorio de informes de muestra [página 14] 1.5.2.1.1 Configurar botones en el Web Forms Para empezar, agregará dos botones al Web Forms, les asignará un nombre y creará eventos de clic para cada uno. 1.5.2.1.1.1 Para agregar dos botones al Web Forms Procedimiento 1. Abra la página Default.aspx. 2. En el menú Ver, haga clic en Diseñador. 3. Haga clic en el control CrystalReportViewer y presione la FLECHA IZQUIERDA del teclado para que aparezca un cursor parpadeante y, a continuación, presione la tecla INTRO. 338 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net El control CrystalReportViewer bajará una línea. 4. En el Cuadro de herramientas, arrastre un control de servidor Web Button sobre el control CrystalReportViewer. 5. Haga clic a la derecha del control Button, para que aparezca un cursor parpadeante y, a continuación, presione la barra espaciadora dos veces. 6. En el Cuadro de herramientas, arrastre un segundo control de servidor Web Button a la derecha del primer control Button. 1.5.2.1.1.2 Para establecer las propiedades Text e ID de cada control Button Procedimiento 1. Haga clic en primer control de servidor Web Button para seleccionarlo. 2. En la ventana Propiedades: ○ Establezca el valor de ID en "sortOrderDescending". ○ Establezca Text como "Cambiar la dirección de ordenamiento a descendente". 3. Haga clic en segundo control de servidor Web Button para seleccionarlo. 4. En la ventana Propiedades: ○ Establezca el valor de ID en "sortOrderAscending". ○ Establezca Text como "Cambiar la dirección de ordenamiento a ascendente". 1.5.2.1.1.3 Crear eventos de clic para cada control Button Procedimiento 1. Haga doble clic en el primer control de servidor Web Button. La clase de código subyacente se abrirá y se creará un nuevo método de evento, sortOrderDescending_Click(), en la parte inferior de la clase. 2. Regrese a la vista Diseño de la página Default.aspx. 3. Haga doble clic en el segundo control de servidor Web Button. La clase de código subyacente se abrirá y se creará un nuevo método de evento, sortOrderAscending_Click(), en la parte inferior de la clase. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 339 1.5.2.1.2 Programar eventos de botón mediante direcciones de ordenamiento En este procedimiento programará el modelo de objetos ReportDocument del informe dentro del método de evento, y establecerá la dirección de ordenamiento como ascendente en un método de evento y como descendente en el otro. 1.5.2.1.2.1 Para programar el modelo de objetos ReportDocument del informe en el método de evento sortOrderDescending_Click Procedimiento 1. 2. Abra la clase de código subyacente y busque el método de evento sortOrderDescending_Click(). En el método de evento, obtenga la propiedad SortFields de la propiedad DataDefinition de la instancia del informe y asígnele a una instancia de la clase indizada SortFields. Dim mySortFields As SortFields = hierarchicalGroupingReport.DataDefinition.SortFields SortFields sortFields = hierarchicalGroupingReport.DataDefinition.SortFields; 3. Obtenga la primera instancia SortField de la clase indizada SortFields y asígnele a una variable denominada firstSortField. Nota La clase indizada SortFields se basa en 0. Dim firstSortField As SortField = mySortFields(0) SortField firstSortField = sortFields[0]; 4. Establezca la propiedad SortDirection de firstSortField al orden descendente mediante la selección DescendingOrder de la enumeración SortDirection. firstSortField.SortDirection = SortDirection.DescendingOrder firstSortField.SortDirection = SortDirection.DescendingOrder; 340 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 5. Ahora vuelva a asignar este informe (con su orden modificado en el modelo de objetos ReportDocument) a la propiedad ReportSource del control CrystalReportViewer. myCrystalReportViewer.ReportSource = hierarchicalGroupingReport crystalReportViewer.ReportSource = hierarchicalGroupingReport; Resultados A continuación, escribirá el código del método de evento sortOrderAscending_Click(). El código es idéntico, excepto por la configuración de la propiedad SortDirection. 1.5.2.1.2.2 Para programar el modelo de objetos ReportDocument del informe en el método de evento sortOrderAscending_Click Procedimiento 1. Abra la clase de código subyacente y busque el método de evento sortOrderAscending_Click(). 2. En el método de evento, obtenga la propiedad SortFields de la propiedad DataDefinition de la instancia del informe y asígnele a una instancia de la clase indizada SortFields. Dim mySortFields As SortFields = hierarchicalGroupingReport.DataDefinition.SortFields SortFields sortFields = hierarchicalGroupingReport.DataDefinition.SortFields; 3. Obtenga la primera instancia SortField de la clase indizada SortFields y asígnele a una variable denominada firstSortField. Nota La clase indizada SortFields se basa en 0. Dim firstSortField As SortField = mySortFields(0) SortField firstSortField = sortFields[0]; Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 341 4. Establezca la propiedad SortDirection de la instancia de firstSortField en orden ascendente mediante la selección AscendingOrder de la enumeración SortDirection. firstSortField.SortDirection = SortDirection.AscendingOrder firstSortField.SortDirection = SortDirection.AscendingOrder; 5. Ahora vuelva a asignar este informe (con su orden modificado en el modelo de objetos ReportDocument) a la propiedad ReportSource del control CrystalReportViewer. myCrystalReportViewer.ReportSource = hierarchicalGroupingReport crystalReportViewer.ReportSource = hierarchicalGroupingReport; Resultados Así se completará la programación del modelo de objetos ReportDocument del informe incluido en cada método de evento. En la siguiente sección, probará si funcionan estos cambios de orden, y si se conservan cuando no se haya aplicado Session. 1.5.2.1.3 Probar y determinar los errores de persistencia En esta sección, comprobará que, sin el uso de Session para la persistencia, los cambios de orden se perderán cuando se vuelva a cargar la página para que refleje los cambios de la configuración de presentación. 1.5.2.1.3.1 Para probar los cambios de programación efectuados en la dirección de ordenamiento codificada en el proyecto Procedimiento 1. En el menú Generar, haga clic en Generar solución. 2. Si existen errores de generación, corríjalos ahora. 3. En el menú Depurar, haga clic en Iniciar. Si no aparecen errores de generación, se cargará la página Default.aspx en el explorador, con el informe de agrupamiento jerárquico (Hierarchical Grouping) generado en el formulario. 4. Observe la dirección de ordenamiento cuidadosamente. Conviene imprimir la página para comparar los cambios de la dirección de ordenamiento. 342 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 5. Haga clic en el botón Cambiar la dirección de ordenamiento a descendente. Se invertirá la dirección de ordenamiento. 6. Haga clic en el botón Cambiar la dirección de ordenamiento a ascendente. La dirección de ordenamiento volverá a su orden original (ascendente). 1.5.2.1.3.2 Para probar si se conservan los cambios de orden cuando cambia la configuración de presentación Contexto En el siguiente procedimiento, verificará si se conserva la dirección de ordenamiento al aplicar otros cambios a la página (por ejemplo la configuración de presentación). Procedimiento 1. Haga clic en el botón Cambiar la dirección de ordenamiento a descendente. Se invertirá la dirección de ordenamiento. 2. En la barra de herramientas del informe, ajuste la ampliación de 100% a 125%. La página recargará el informe al 125%, pero no se conservará la inversión de la dirección de ordenamiento. 3. Haga clic de nuevo en el botón Cambiar la dirección de ordenamiento a descendente. Se invertirá la dirección de ordenamiento. 4. En la barra de herramientas del informe, ajuste la ampliación de 125% a 100%. 5. La página recargará el informe al 100%, pero no se conservará la inversión de la dirección de ordenamiento. 6. Vuelva a Visual Studio y haga clic en Detener para salir del modo de depuración. Resultados En esta prueba, comprobará que, en esta etapa del tutorial, la persistencia falla. La dirección de ordenamiento sólo se aplica si se hace clic en uno de los botones de ordenación. La dirección de ordenamiento se descarta si el usuario interactúa con la página para ajustar la ampliación o abrir otra página en un informe de varias páginas. Por ello, deberá agregar código para conservar el cambio de la dirección de ordenamiento realizado en el modelo de objetos ReportDocument mediante Session. 1.5.2.1.4 Agregar código de Session En esta sección, aprenderá a usar Session para conservar el cambio de la dirección de ordenamiento del informe. Al método ConfigureCrystalReports() creado al configurar el proyecto (vea Configuración de proyectos Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 343 [página 14]) le agregará código que busque Session y cargue de nuevo inmediatamente la instancia del informe en Session cuando un usuario ajuste la dirección de ordenamiento. 1.5.2.1.4.1 Para agregar código de búsqueda de Session al método ConfigureCrystalReports() Procedimiento 1. En el método ConfigureCrystalReports(), delante del código existente, cree un bloque condicional if/ else que compruebe si existe un objeto Session denominado hierarchicalGroupingReport. Puede usar un nombre de identificador que elija para este objeto Session. Use un identificador exclusivo, como el nombre de la copia del informe. If (Session("hierarchicalGroupingReport") Is Nothing) Then Else End If if(Session["hierarchicalGroupingReport"] == null) { } else { } 2. Si utiliza un informe incrustado, mueva la línea de código que declara y crea una copia del informe desde su ubicación actual hasta el bloque If. If (Session("hierarchicalGroupingReport") Is Nothing) Then hierarchicalGroupingReport = New Hierarchical_Grouping() Else End If if (Session["hierarchicalGroupingReport"] == null) { hierarchicalGroupingReport = new Hierarchical_Grouping(); } else { } 3. 344 Si utiliza un informe no incrustado, mueva las dos líneas del código que declaran y crean una copia del informe y que lo cargan desde la ruta de directorio hasta su ubicación actual en el bloque If. © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Nota Consulte Directorio de informes de muestra [página 14] para averiguar la ruta correcta de los informes de muestra. If (Session("hierarchicalGroupingReport") Is Nothing) Then hierarchicalGroupingReport = New ReportDocument() hierarchicalGroupingReport.Load("C:\Archivos de programa\Microsoft Visual Studio 9.0\Crystal Reports\Samples\Es\Reports\Feature Examples\Hierarchical Grouping.rpt") Else End If if(Session["hierarchicalGroupingReport"] == null) { hierarchicalGroupingReport = new ReportDocument(); hierarchicalGroupingReport.Load("C:\Archivos de programa\Microsoft Visual Studio 9.0\Crystal Reports\Samples\Es\Reports\Feature Examples\Hierarchical Grouping.rpt"); } else { } 4. En el bloque If, asigne el informe a Session, utilizando el nombre de variable de informe como la cadena del identificador Session. Session("hierarchicalGroupingReport") = hierarchicalGroupingReport Session["hierarchicalGroupingReport"] = hierarchicalGroupingReport; Esto completa el bloque If. El bloque If se ejecuta si el informe no existe en Session. El bloque Else se ejecuta si se encuentra el informe en Session; por lo tanto, la finalidad del bloque Else es obtener el informe de Session en una instancia de informe. 5. En el bloque Else, asigne el informe almacenado en Session a la copia del informe. hierarchicalGroupingReport = CType(Session("hierarchicalGroupingReport"), ReportDocument) hierarchicalGroupingReport = (ReportDocument)Session["hierarchicalGroupingReport"]; Nota Como Session sólo devuelve objetos genéricos, debe proyectar el informe en un tipo de informe. Tanto si utiliza informes incrustados como informes no incrustados, proyecte el objeto recuperado al tipo ReportDocument. Fuera y debajo del bloque condicional, el código restante enlaza la instancia del informe a la propiedad ReportSource del control CrystalReportViewer. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 345 Resultados Como recordará de Configuración de proyectos (vea Configuración de proyectos [página 14]), se llama al método ConfigureCrystalReports() cada vez que se vuelve a cargar una página. Por lo tanto, la modificación de este método garantiza que siempre se recupera y vuelve a cargar el informe más actual, ya sea nuevo o almacenado en Session. Sin embargo, aún no se ha escrito nada para actualizar realmente la instancia del informe. En la siguiente sección, actualizará la instancia del informe en Session cada vez que se modifique la dirección de ordenamiento. 1.5.2.1.4.2 Para actualizar la instancia del informe en Session para el método de evento sortOrderDescending_Click Procedimiento 1. En el método de evento sortOrderDescending_Click(), elimine la última línea de código que enlaza el control CrystalReportViewer al informe. Esto le debe dejar las tres líneas de código que cambian la dirección de ordenamiento. 2. Bajo las tres líneas de código que cambian la dirección de ordenamiento, asigne la instancia de hierarchicalGroupingReport (que se ha actualizado con una nueva dirección de ordenamiento) a Session mediante el mismo identificador usado en el método ConfigureCrystalReports(). Nota Para simplificar el proceso, copie y pegue esta línea de código del método ConfigureCrystalReports(). Session("hierarchicalGroupingReport") = hierarchicalGroupingReport Session["hierarchicalGroupingReport"] = hierarchicalGroupingReport; 3. Finalmente, agregue una llamada al método ConfigureCrystalReports(), que obtiene la última instancia de hierarchicalGroupingReport de Session (la misma que actualizó hace un momento) y enlácela al control CrystalReportViewer. ConfigureCrystalReports() ConfigureCrystalReports(); Resultados Ahora puede repetir los mismos pasos para el segundo método de evento. 346 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 1.5.2.1.4.3 Para actualizar la instancia del informe en Session para el método de evento sortOrderAscending_Click Procedimiento 1. En el método de evento sortOrderAscending_Click(), elimine la última línea de código que enlaza el control CrystalReportViewer al informe. Esto le debe dejar las tres líneas de código que cambian la dirección de ordenamiento. 2. Bajo las tres líneas de código que cambian la dirección de ordenamiento, asigne la instancia de hierarchicalGroupingReport (que se ha actualizado con una nueva dirección de ordenamiento) a Session mediante el mismo identificador usado en el método ConfigureCrystalReports(). Para simplificar el proceso, copie y pegue esta línea de código del método ConfigureCrystalReports(). Session("hierarchicalGroupingReport") = hierarchicalGroupingReport Session["hierarchicalGroupingReport"] = hierarchicalGroupingReport; 3. Finalmente, agregue una llamada al método ConfigureCrystalReports(), que obtiene la última instancia de hierarchicalGroupingReport de Session (la misma que actualizó hace un momento) y enlácela al control CrystalReportViewer. ConfigureCrystalReports() ConfigureCrystalReports(); Resultados Ahora ya estará preparado para comprobar si los cambios de orden se han conservado correctamente. 1.5.2.1.5 Probar y determinar la persistencia correcta En esta sección, comprobará si los cambios de orden se han conservado correctamente ahora que Session se usa para la persistencia. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 347 1.5.2.1.5.1 Para probar si los cambios de orden se han conservado correctamente Procedimiento 1. En el menú Generar, haga clic en Generar solución. Si existen errores de generación, corríjalos ahora. 2. En el menú Depurar, haga clic en Iniciar. Si no aparecen errores de generación, se cargará la página Default.aspx en el explorador, con el informe de agrupamiento jerárquico (Hierarchical Grouping) generado en el formulario. 3. Observe la dirección de ordenamiento cuidadosamente. Conviene imprimir la página para comparar los cambios de la dirección de ordenamiento. 4. Haga clic en el botón Cambiar la dirección de ordenamiento a descendente. Se invertirá la dirección de ordenamiento. 5. En la barra de herramientas del informe, ajuste la ampliación de 100% a 125%. La página recargará el informe al 125%. La inversión de la dirección de ordenamiento se ha conservado. 6. Haga clic en el botón Cambiar la dirección de ordenamiento a ascendente. Se restaurará la dirección de ordenamiento. 7. En la barra de herramientas del informe, ajuste la ampliación de 125% a 100%. La página recargará el informe al 100%. La dirección de ordenamiento conservará la configuración del paso anterior. Resultados En esta prueba puede comprobar que ahora la persistencia es correcta. 1.5.2.2 Tutorial: Conectar con una base de datos segura de SQL Server utilizando autenticación de SQL En este tutorial, aprenderá a agregar código de conexión para mostrar un informe que contiene información de una base de datos segura de SQL Server. Introducción Para conectar con una base de datos segura de SQL Server, va a utilizar clases del modelo de objetos ReportDocument. El objeto ReportDocument tiene una propiedad Database que devuelve una instancia de Database. Esta instancia Database contiene la información de base de datos del informe, incluida una propiedad Tables que devuelve una 348 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net instancia de clase indizada de Tables. Las instancias de Table individuales se pueden obtener de la clase indizada Tables. La conexión ocurre en el nivel granular de cada instancia de Table, a la que se debe conceder acceso individual al SQL Server seguro. Esto se realiza incorporando la información de conexión a una instancia de ConnectionInfo y, a continuación, dentro de un ciclo For, aplicando dicha instancia de ConnectionInfo a la propiedad ConnectionInfo de cada instancia de Table. Las propiedades de la clase ConnectionInfo incluyen lo siguiente: ● ServerName ● DatabaseName ● UserID ● Password ● IntegratedSecurity (no se utiliza en este tutorial) Nota Si desea trabajar con un tutorial que utilice autenticación de Windows (y que, por lo tanto, utilice la propiedad IntegratedSecurity en lugar de las propiedades UserID y Password), vea Tutorial: Conectar con una base de datos segura de SQL Server utilizando seguridad integrada [página 366]. Si decide establecer únicamente las propiedades DatabaseName, UserID y Password, tendrá que conectar con el servidor predeterminado y la base de datos especificada en el informe. Sin embargo, si elige asignar una propiedad ServerName alternativa, podrá redirigir el informe a un servidor diferente en tiempo de ejecución. Para empezar a crear un informe que contenga datos de una base de datos segura de un servidor SQL. Puede terminar este tutorial utilizando las clases del modelo de objetos CrystalReportViewer; sin embargo, se recomienda el modelo de objetos ReportDocument. Código de ejemplo Este tutorial incluye código de ejemplo de C# y Visual Basic que muestra la versión finalizada del proyecto. Siga las instrucciones de este tutorial para crear un nuevo proyecto o para abrir el proyecto de código de ejemplo y trabajar con una versión finalizada. El código de ejemplo se almacena en carpetas que están clasificadas por idioma y tipo de proyecto. Los nombres de las carpetas de cada versión del código de ejemplo son los siguientes: ● Sitio Web en C#: CS_Web_RDObjMod_DBLogon ● Proyecto para Windows en C#: CS_Win_RDObjMod_DBLogon ● Sitio Web en Visual Basic: VB_Web_RDObjMod_DBLogon ● Proyecto para Windows en Visual Basic: VB_Win_RDObjMod_DBLogon Información relacionada Elegir el modelo de objetos correcto para el proyecto [página 31] Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 349 Tutorial: Conectar con una base de datos segura de SQL Server utilizando autenticación de SQL [página 241] En este tutorial, aprenderá a agregar código de conexión para mostrar un informe que contiene información de una base de datos segura de SQL Server. Directorio de informes de muestra [página 14] 1.5.2.2.1 Crear un informe conectado a una base de datos segura de SQL Server Para comenzar, cree un informe que obtenga su información de la base de datos Northwind. Nota Northwind es una base de datos de muestra que se proporciona con SQL Server. Este tutorial requiere que se configuren algunos parámetros como requisito previo. Información relacionada Tutorial: Conectar con una base de datos segura de SQL Server utilizando autenticación de SQL [página 348] En este tutorial, aprenderá a agregar código de conexión para mostrar un informe que contiene información de una base de datos segura de SQL Server. 1.5.2.2.1.1 datos Requisitos previos de configuración de la base de Procedimiento 1. Configuración de SQL Server: ○ Si tiene instalado SQL Server (o la versión OEM, MSDE), debe configurarse de modo que requiera la Autenticación de SQL Server para que funcione con este tutorial. ○ Si no tiene instalado SQL Server (ni la versión OEM, MSDE), debe instalar MSDE con la autenticación de SQL Server establecida en "True" para que funcione con este tutorial. 2. La base de datos Northwind incluida con SQL Server se debe instalar y verificar que acepta la Autenticación de SQL Server. 3. Se debe crear una cuenta de acceso limitado para utilizarla en el sitio Web. 350 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 1.5.2.2.1.2 Para crear un informe con datos seguros de la base de datos Northwind Contexto Nota Este procedimiento sólo funciona con un proyecto creado a partir de la Configuración de proyectos [página 14]. La configuración de proyectos contiene referencias específicas a espacios de nombres y configuración de códigos necesarios para este procedimiento, que no se podrá completar sin dicha configuración. Procedimiento 1. En el Explorador de soluciones, haga clic con el botón secundario en el nombre de proyecto en negrita, elija Agregar y, a continuación, haga clic en Agregar nuevo elemento. 2. En el cuadro de diálogo Agregar nuevo elemento, en la vista Plantillas, seleccione la plantilla Crystal Report. 3. En el campo Nombre, escriba "NorthwindCustomers.rpt" y haga clic en Abrir. 4. En el panel Crear un nuevo documento de Crystal Reports del cuadro de diálogo Galería de Crystal Reports, seleccione Usar asistente de informes. 5. En el panel Elegir un Asistente, seleccione Estándar y, a continuación, haga clic en Aceptar. Aparecerá la ventana Asistente para la creación de informes estándar. 6. En el panel Orígenes de datos disponibles, expanda la carpeta Crear nueva conexión. 7. En la subcarpeta que se abre, expanda la carpeta OLE DB (ADO). Aparecerá la ventana OLE DB (ADO). 8. Seleccione Proveedor de Microsoft OLE DB para SQL Server y haga clic en Siguiente. 9. Especifique los valores de su servidor de base de datos, ID de usuario y contraseña en los campos Servidor, ID de usuario y Contraseña. 10. En la lista desplegable Base de datos, seleccione "Northwind". Deje desactivada la casilla de verificación Seguridad integrada porque está usando la autenticación de SQL Server en lugar de la autenticación de NT. 11. Haga clic en Finalizar. Ahora se expandirá la carpeta OLE DB, mostrando el servidor de base de datos y dentro de él, la base de datos Northwind. 12. Expanda los nodos Northwind, dbo y Tablas, y, a continuación, seleccione la tabla Customers. 13. Haga clic en el símbolo > para mover la tabla al panel Tablas seleccionadas y, a continuación, haga clic en Siguiente. 14. Mantenga presionada la tecla Ctrl mientras hace clic en CompanyName, ContactName y City. 15. Haga clic en el símbolo > para mover estos campos al panel Campos a mostrar y, a continuación, haga clic en Siguiente. 16. En el panel Campos disponibles, en Campos del informe, seleccione Cliente.Ciudad, haga clic en el símbolo > para mover el campo al panel Agrupar por y, a continuación, haga clic en Finalizar. Se creará el informe NorthwindCustomers y se cargará en la ventana principal de Visual Studio. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 351 Resultados Ahora ya podrá enlazar el informe al control CrystalReportViewer y establecer la conexión con la base de datos mediante programación. 1.5.2.2.2 Enlazar el informe En Configuración de proyectos [página 14], va a colocar un control CrystalReportViewer en el formulario Web Forms o Windows Forms. En el paso anterior, ha agregado un informe NorthwindCustomers al proyecto. En esta sección, va a crear una copia del informe NorthwindCustomers y a enlazarla con el control CrystalReportViewer. A continuación, probará si el informe se muestra correctamente cuando no se han establecido valores actuales para su campo de parámetro. Puede crear una copia del informe y enlazarla de dos formas: ● Como informe incrustado. ● Como informe no incrustado. Elija uno de los procedimientos con pasos siguientes (pero no ambos). ● Si utiliza informes incrustados, realice el siguiente procedimiento de pasos para crear una instancia del informe como un informe incrustado. ● Si utiliza informes no incrustados, siga el segundo procedimiento de pasos para crear una instancia del informe como un informe no incrustado. 1.5.2.2.2.1 Para crear una copia del informe NorthwindCustomers como informe incrustado y enlazarla al control CrystalReportViewer Procedimiento 1. Abra el formulario Web Forms o Windows Forms. 2. En el menú Ver, haga clic en Código. 3. Agregue una nueva declaración de nivel de clase para la clase contenedora del informe NorthwindCustomers, con el nombre de variable NorthwindCustomers. Establezca su modificador de acceso como private. Private northwindCustomersReport As NorthwindCustomers private NorthwindCustomers northwindCustomersReport; 4. 352 En el método ConfigureCrystalReports(), cree una instancia de la clase contenedora de informes. © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Nota Ha creado el método ConfigureCrystalReports() en Configuración de proyectos [página 14]. northwindCustomersReport = New NorthwindCustomers() northwindCustomersReport = new NorthwindCustomers(); 5. En la línea siguiente, debajo de la creación de instancias del informe, enlace la propiedad ReportSource del control CrystalReportViewer a la clase de informe de la que ha creado una instancia (nombre de variable: northwindCustomersReport). myCrystalReportViewer.ReportSource = northwindCustomersReport crystalReportViewer.ReportSource = northwindCustomersReport; Resultados Ahora estará listo para crear y ejecutar el proyecto. Está previsto que falle la carga del informe, porque aún no se ha escrito el código para conectarse con la base de datos. 1.5.2.2.2.2 Para crear una copia del informe NorthwindCustomers como informe no incrustado y enlazarla al control CrystalReportViewer Procedimiento 1. Abra el formulario Web Forms o Windows Forms. 2. En el menú Ver, haga clic en Código. 3. Agregue una nueva declaración de nivel de clase para la clase contenedora del informe NorthwindCustomers, con el nombre de variable northwindCustomersReport. Establezca su modificador de acceso como private. Private northwindCustomersReport As ReportDocument private ReportDocument northwindCustomersReport; Nota La clase ReportDocument es miembro del espacio de nombres CrystalDecisions.CrystalReports.Engine. Agregó una declaración "Imports" [Visual Basic] o "using" [C#] para este espacio de nombres Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 353 en Configuración de proyectos [página 14]. Cuando cree la instancia de ReportDocument y cargue un informe en el espacio de nombres, tendrá acceso al informe a través del SDK, sin incrustar el informe. 4. En el método ConfigureCrystalReports() (que ha creado en Configuración de proyectos [página 14]), cree una instancia de la clase ReportDocument. northwindCustomersReport = New ReportDocument() northwindCustomersReport = new ReportDocument(); 5. Declare una variable de cadena, llámela reportPath y asígnele una ruta en tiempo de ejecución al informe local. Esta ruta se determina de forma diferente para los sitios Web y los proyectos para Windows: ○ Para un sitio Web, pase el nombre del archivo de informe local como un parámetro de cadena al método Server.MapPath(). Esto asigna el informe local a la ruta del directorio de archivos de la unidad de disco duro en tiempo de ejecución. Dim reportPath As String = Server.MapPath("NorthwindCustomers.rpt") string reportPath = Server.MapPath("NorthwindCustomers.rpt"); ○ Para un proyecto Windows, concatene la propiedad Application.StartupPath con una barra diagonal inversa y el nombre del archivo de informe local. Esto asigna el informe al mismo directorio del archivo ejecutable de Windows. Nota En la fase de compilación se copiará el informe al directorio que contiene el archivo ejecutable. Dim reportPath As String = Application.StartupPath & "\" & "NorthwindCustomers.rpt" string reportPath = Application.StartupPath + "\\" + "NorthwindCustomers.rpt"; 6. Llame al método Load() de la instancia de ReportDocument y pásele la variable de cadena reportPath. northwindCustomersReport.Load(reportPath) northwindCustomersReport.Load(reportPath); 7. Enlace la propiedad ReportSource de CrystalReportViewer a la instancia de ReportDocument. myCrystalReportViewer.ReportSource = northwindCustomersReport crystalReportViewer.ReportSource = northwindCustomersReport; 354 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 1.5.2.2.2.3 Para probar la carga del informe NorthwindCustomers Contexto Tanto si ha elegido crear una instancia de clase de un informe incrustado como de un informe no incrustado mediante la clase ReportDocument, el nombre de la variable utilizada es el mismo: northwindCustomersReport. De esta forma, puede utilizar un conjunto de códigos común en los procedimientos que aparecen a continuación. Ahora estará listo para crear y ejecutar el proyecto. Está previsto que falle la carga del informe, porque aún no se ha escrito el código para conectarse con la base de datos. Procedimiento 1. En el menú Generar, seleccione Generar solución. 2. Si existen errores de generación, continúe y corríjalos ahora. 3. Si usa un informe no incrustado en un proyecto Windows, busque el archivo ejecutable de Windows compilado en el subdirectorio \bin\ [Visual Basic] o \bin\debug\ [C#] y, a continuación, copie el informe en dicho subdirectorio. Nota Para que el archivo ejecutable de Windows cargue el informe no incrustado en tiempo de ejecución, el informe deberá estar almacenado en el mismo directorio que el archivo ejecutable de Windows. 4. En el menú Depurar, haga clic en Iniciar. El informe NorthwindCustomers no se muestra, porque no se ha agregado el código de conexión con la base de datos. Nota Los resultados pueden variar según la versión de SAP Crystal Reports que use. Por ejemplo, si tiene instalado SAP Crystal Reports 10 o una versión superior, aparecerá un formulario y se le pedirá que indique la información sobre conexión de base de datos para el informe. Esta es una nueva función de SAP Crystal Reports Developer. Si ejecuta una versión anterior de SAP Crystal Reports, se produce una excepción. En cualquier caso, debe seguir el siguiente procedimiento de pasos para crear una aplicación totalmente funcional. 5. Vuelva a Visual Studio y haga clic en Detener para salir del modo de depuración. 1.5.2.2.3 Agregar el código de conexión del informe Ahora estará preparado para agregar el código de conexión del informe a la clase de código subyacente. Va a empezar por crear un método auxiliar privado, SetDBLogonForReport(). Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 355 1.5.2.2.3.1 Para crear y codificar el método SetDBLogonForReport() Procedimiento 1. Regrese a la clase de código subyacente de este Web Forms o Windows Forms. 2. En la parte inferior de la clase, cree un nuevo método privado denominado SetDBLogonForReport() con dos parámetros, ConnectionInfo y ReportDocument. Private Sub SetDBLogonForReport(ByVal myConnectionInfo As ConnectionInfo, ByVal myReportDocument As ReportDocument) End Sub private void SetDBLogonForReport(ConnectionInfo connectionInfo, ReportDocument reportDocument) { } 3. En este método, recupere la instancia de Tables de la propiedad Tables de la propiedad Database del parámetro ReportDocument. Nota Tables es una clase indizada que contiene instancias de la clase Table. Dim myTables As Tables = myReportDocument.Database.Tables Tables tables = reportDocument.Database.Tables; 4. Cree un bucle foreach que recorra todas las instancias de Table de la instancia de clase indizada Tables. Nota Debe incluir la ruta del espacio de nombres completa a la clase Table, para diferenciarla de la clase Table del espacio de nombres System.Web.UI.WebControls. For Each myTable As CrystalDecisions.CrystalReports.Engine.Table In myTables Next foreach(CrystalDecisions.CrystalReports.Engine.Table table in tables) { } 356 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 5. En el bucle foreach, obtenga la instancia de TableLogonInfo a partir de la propiedad LogOnInfo de la instancia de Table. Dim myTableLogonInfo As TableLogOnInfo = myTable.LogOnInfo TableLogOnInfo tableLogonInfo = table.LogOnInfo; 6. En el bucle foreach, establezca la propiedad ConnectionInfo de TableLogonInfo en el parámetro ConnectionInfo. myTableLogonInfo.ConnectionInfo = myConnectionInfo tableLogonInfo.ConnectionInfo = connectionInfo; 7. En el bucle foreach, pase la instancia de TableLogonInfo como parámetro al método ApplyLogonInfo de la instancia de Table. myTable.ApplyLogOnInfo(myTableLogonInfo) table.ApplyLogOnInfo(tableLogonInfo); Resultados El procedimiento de este paso ha creado un método para establecer la conexión de la base de datos. Sin embargo, debe modificar el método ConfigureCrystalReports() para direccionar este método, con el fin de que el informe sepa que tiene información sobre conexión de base de datos. La modificación del método ConfigureCrystalReports() requiere dos acciones: ● Configurar la instancia de ConnectionInfo. ● Llamar al método SetDBLogonForReport(). 1.5.2.2.3.2 Para modificar el método ConfigureCrystalReports() para direccionar el código de conexión con la base de datos Procedimiento 1. En el método ConfigureCrystalReports(), agregue un par de saltos de línea al código encima de la línea que enlaza el informe al control CrystalReportViewer. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 357 2. En los saltos de línea, declare y cree una instancia de la clase ConnectionInfo. Nota Para que la clase ConnectionInfo sea accesible, incluya un enunciado "Imports" [Visual Basic] o "using" [C#] en la parte superior de la clase de código subyacente del espacio de nombres CrystalDecisions.Shared. (Esta declaración se ha agregado en Configuración de proyectos [página 14].) Dim myConnectionInfo As ConnectionInfo = New ConnectionInfo() ConnectionInfo connectionInfo = new ConnectionInfo(); 3. Establezca las propiedades DatabaseName, UserID y Password de la instancia de ConnectionInfo. Nota Por razones de seguridad, es importante utilizar una cuenta de base de datos con permisos de acceso limitado. En el código que escriba, reemplace la contraseña de ejemplo 1234 (que se muestra más abajo) por su propia contraseña. myConnectionInfo.DatabaseName = "Northwind" myConnectionInfo.UserID = "limitedPermissionAccount" myConnectionInfo.Password = " 1234" connectionInfo.DatabaseName = "Northwind"; connectionInfo.UserID = "limitedPermissionAccount"; connectionInfo.Password = " 1234"; 4. Especifique una llamada al método SetDBLogonForReport() y pase la instancia de ConnectionInfo y el informe NorthwindCustomers. SetDBLogonForReport(myConnectionInfo, northwindCustomersReport) SetDBLogonForReport(connectionInfo, northwindCustomersReport); Resultados A continuación aparece el código original que enlaza el informe al control CrystalReportViewer. Ahora estará listo para crear y ejecutar el proyecto. El informe se debe cargar correctamente, ya que ha agregado código para conectar con la base de datos. 358 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 1.5.2.2.3.3 Para probar la carga del informe NorthwindCustomers Procedimiento 1. En el menú Generar, seleccione Generar solución. 2. Si existen errores de generación, continúe y corríjalos ahora. 3. En el menú Depurar, haga clic en Iniciar. El informe NorthwindCustomers se mostrará correctamente. 4. Vuelva a Visual Studio y haga clic en Detener para salir del modo de depuración. Resultados El informe NorthwindCustomers se mostrará correctamente. 1.5.2.2.4 Agregar la posibilidad de cambiar la ubicación de la base de datos en tiempo de ejecución En esta sección, aprenderá a cambiar la ubicación de la base de datos en tiempo de ejecución. Sólo requiere una pequeña modificación de la instancia de ConnectionInfo. 1.5.2.2.4.1 Para cambiar la ubicación de la base de datos en tiempo de ejecución Procedimiento 1. En el método ConfigureCrystalReports(), agregue un par de saltos de línea al código detrás de la línea que declara y crea una instancia de la clase ConnectionInfo. 2. En los saltos de línea, establezca la propiedad ServerName de la instancia de ConnectionInfo. Nota En el código que escriba, reemplace el nombre del servidor de ejemplo DevDatabase (que aparece más abajo) por el nombre de su servidor. myConnectionInfo.ServerName = "DevDatabase" Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 359 connectionInfo.ServerName = "DevDatabase"; 1.5.2.2.4.2 Para probar si el informe se puede restablecer a un servidor de base de datos alternativo en tiempo de ejecución Contexto Ahora estará listo para crear y ejecutar el proyecto. El informe se debe redirigir al servidor de base de datos alternativo en tiempo de ejecución. Procedimiento 1. En el menú Generar, seleccione Generar solución. 2. Si existen errores de generación, continúe y corríjalos ahora. 3. En el menú Depurar, haga clic en Iniciar. El informe NorthwindCustomers se mostrará correctamente. 4. Vuelva a Visual Studio y haga clic en Detener para salir del modo de depuración. 1.5.2.2.5 de datos Anexo: Mejoras en el código de conexión a la base Ha configurado con éxito el código para cambiar la ubicación de la base de datos en tiempo de ejecución. En este ejemplo, es el mismo servidor de base de datos, la única diferencia es que lo ha llamado explícitamente por el nombre. Sin embargo, ahora puede cambiar esta cadena de nombre servidor de base de datos a cualquier otro servidor de base de datos que contiene la base de datos Northwind. Si usa SAP Crystal Reports con Visual Studio 2005 ó 2008, tiene acceso a la API mejorada para conectar con una base de datos segura de SQL Server. La API de SAP Crystal Reports ayuda a reducir la cantidad de código necesario para conectar con la base de datos. En los procedimientos previos, ha aprendido a crear el método auxiliar SetDBLogonForReport(), que utiliza un bucle foreach para establecer la propiedad ConnectionInfo de cada tabla del informe de Crystal Reports. En este tutorial, aprenderá a eliminar el método auxiliar y a agregar código para utilizar la clase DataSourceConnections del espacio de nombres CrystalDecisions.Shared, o bien el método SetDatabaseLogon() de la clase ReportDocument. La clase DataSourceConnections es un ArrayList que contiene las instancias de ConnectionInfo de cada conexión utilizada por el informe de Crystal Reports. Puede recuperar las instancias de ConnectionInfo de un 360 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net índice especificado y, a continuación, llamara a SetLogon() o SetConnection() para pasar la información de conexión al informe. El método SetLogon() le permite establecer el nombre de usuario y la contraseña. Este método utiliza el servidor y la base de datos predeterminados especificados en el informe. El método SetConnection() permite establecer los nombres del servidor, de la base de datos y de usuario, así como la contraseña. Para utilizar el nuevo código de la API, debe seguir las instrucciones de Crear un informe conectado a una base de datos segura de SQL Server [página 350] y Enlazar el informe [página 352]. Después, puede utilizar uno de los siguientes métodos de la API mejorada: ● Utilizar la clase DataSourceConnections para la conexión de base de datos [página 362] ● Utilizar el método SetDatabaseLogon() de la clase ReportDocument [página 365] Si ha seguido todos los procedimientos de Tutorial: Conectar con una base de datos segura de SQL Server utilizando autenticación de SQL [página 348], primero debe eliminar algunas líneas de código que se muestran en Modificar el proyecto para la conexión con la base de datos [página 361], antes de poder utilizar uno de los métodos de la API mejorada. 1.5.2.2.5.1 de datos Modificar el proyecto para la conexión con la base Si ha seguido todos los procedimientos de Tutorial: Conectar con una base de datos segura de SQL Server utilizando autenticación de SQL [página 348], primero debe eliminar algunas líneas de código que se muestran en el siguiente procedimiento. 1.5.2.2.5.1.1 Para modificar el proyecto con el fin de usar la API mejorada de SAP Crystal Reports Procedimiento 1. Abra el proyecto terminado de este tutorial. 2. Abra el formulario Web Forms o Windows Forms. 3. En el menú Ver, haga clic en Código. 4. Elimine el método auxiliar SetDBLogonForReport(). 5. En el método ConfigureCrystalReports(), elimine las siguientes líneas de código: a) Elimine el código que declara una instancia de la clase ConnectionInfo. b) Elimine el código que utiliza las propiedades ServerName, DatabaseName, UserID y Password desde la clase ConnectionInfo. c) Elimine la llamada al método SetDBLogonForReport(). Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 361 Resultados Ahora, el método ConfigureCrystalReports() tiene dos líneas de código. Private Sub ConfigureCrystalReports() northwindCustomersReport = new NorthwindCustomers() myCrystalReportViewer.ReportSource = northwindCustomersReport End Sub private void ConfigureCrystalReports() { northwindCustomersReport = new NorthwindCustomers(); crystalReportViewer.ReportSource = northwindCustomersReport; } Ahora ya puede decidir si utiliza uno de los siguientes métodos de la API mejorada: ● Utilizar la clase DataSourceConnections para la conexión de base de datos [página 362] ● Utilizar el método SetDatabaseLogon() de la clase ReportDocument [página 365] 1.5.2.2.5.2 Utilizar la clase DataSourceConnections para la conexión de base de datos En esta sección, aprenderá a agregar dos líneas de código para la conexión con una base de datos de SQL Server. Debe recuperar la instancia de DataSourceConnections y, a continuación, establecer la información sobre conexión de base de datos mediante el uso de SetLogon() o SetConnection(). ● Debe crear un proyecto basado en las instrucciones de Crear un informe conectado a una base de datos segura de SQL Server [página 350] y Enlazar el informe [página 352]. ● O bien, debe crear un proyecto basado en las instrucciones de Modificar el proyecto para la conexión con la base de datos [página 361]. Si desea utilizar el servidor y la base de datos predeterminados, llame al método SetLogon() con su nombre de usuario y contraseña. De lo contrario, si desea cambiar el servidor o la base de datos, llame al método SetConnection() con los nombres del servidor, de la base de datos y de usuario, así como su contraseña. 362 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 1.5.2.2.5.2.1 Para utilizar el método SetLogon() de la clase DataSourceConnections Procedimiento 1. Entre las dos líneas de código de ConfigureCrystalReports(), recupere la instancia de DataSourceConnections de la propiedad DataSourceConnections de la instancia de NorthwindCustomers. Dim myDataSourceConnections As DataSourceConnections = northwindCustomersReport.DataSourceConnections DataSourceConnections dataSourceConnections = northwindCustomersReport.DataSourceConnections; 2. Recupere IConnectionInfo en el índice 0 de la instancia de DataSourceConnections. Dim myConnectInfo As IConnectionInfo = myDataSourceConnections(0) IConnectionInfo connectInfo = dataSourceConnections[0]; 3. Llame al método SetLogon() con su nombre de usuario y contraseña. Nota Por razones de seguridad, es importante utilizar una cuenta de base de datos con permisos de acceso limitado. En el código que escriba, reemplace la contraseña de ejemplo 1234 (que se muestra más abajo) por su propia contraseña. myConnectInfo.SetLogon("limitedPermissionAccount", "1234") connectInfo.SetLogon("limitedPermissionAccount", "1234"); Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 363 1.5.2.2.5.2.2 Para utilizar el método SetConnection() de la clase DataSourceConnections Procedimiento 1. Entre las dos líneas de código de ConfigureCrystalReports(), recupere la instancia de DataSourceConnections de la propiedad DataSourceConnections de la instancia de NorthwindCustomers. Dim myDataSourceConnections As DataSourceConnections = northwindCustomersReport.DataSourceConnections DataSourceConnections dataSourceConnections = northwindCustomersReport.DataSourceConnections; 2. Recupere IConnectionInfo en el índice 0 de la instancia de DataSourceConnections. Dim myConnectInfo As IConnectionInfo = myDataSourceConnections(0) IConnectionInfo connectInfo = dataSourceConnections[0]; 3. Llame al método SetConnection() con su nombre de servidor, de base de datos y de usuario, así como su contraseña. Nota Por razones de seguridad, es importante utilizar una cuenta de base de datos con permisos de acceso limitado. En el código que escriba, reemplace la contraseña de ejemplo 1234 (que se muestra más abajo) por su propia contraseña. myConnectInfo.SetConnection("ServerName", "Northwind", "limitedPermissionAccount", "1234") connectInfo.SetConnection("ServerName", "Northwind", "limitedPermissionAccount", "1234"); Resultados Ya está preparado para generar y ejecutar el proyecto, para conectar con la base de datos segura de SQL Server. 364 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 1.5.2.2.5.3 Utilizar el método SetDatabaseLogon() de la clase ReportDocument Contexto Entre las dos líneas de código en ConfigureCrystalReports(), llame al método SetDatabaseLogon() de la instancia de NorthwindCustomers y pase uno de los siguientes conjuntos de parámetros: Procedimiento 1. Llame al método SetDatabaseLogon() con su nombre de usuario y contraseña. Nota Por razones de seguridad, es importante utilizar una cuenta de base de datos con permisos de acceso limitado. En el código que escriba, reemplace la contraseña de ejemplo 1234 (que se muestra más abajo) por su propia contraseña. northwindCustomersReport.SetDatabaseLogon("limitedPermissionAccount","1234") northwindCustomersReport.SetDatabaseLogon("limitedPermissionAccount","1234"); 2. O bien, llame al método SetDatabaseLogon() con los nombres de servidor, de base de datos y de usuario, así como su contraseña. Nota Este método no cambia el servidor ni la base de datos. Se ve restringido a sólo el servidor y la base de datos predeterminados especificados en el informe. En el código que escriba, reemplace la contraseña de ejemplo 1234 (que se muestra más abajo) por su propia contraseña. northwindCustomersReport.SetDatabaseLogon("limitedPermissionAccount","1234", "ServerName", "Northwind") northwindCustomersReport.SetDatabaseLogon("limitedPermissionAccount","1234", "ServerName", "Northwind"); Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 365 1.5.2.3 Tutorial: Conectar con una base de datos segura de SQL Server utilizando seguridad integrada En este tutorial, aprenderá a agregar código de conexión para mostrar un informe que contiene información de una base de datos segura de SQL Server. Introducción Para conectar con una base de datos segura de SQL Server, va a utilizar clases del modelo de objetos ReportDocument. El objeto ReportDocument tiene una propiedad Database que devuelve una instancia de Database. Esta instancia Database contiene la información de base de datos del informe, incluida una propiedad Tables que devuelve una instancia de clase indizada de Tables. Las instancias de Table individuales se pueden obtener de la clase indizada Tables. La conexión ocurre en el nivel granular de cada instancia de Table, a la que se debe conceder acceso individual al SQL Server seguro. Esto se realiza incorporando la información de conexión a una instancia de ConnectionInfo y, a continuación, dentro de un ciclo For, aplicando dicha instancia de ConnectionInfo a la propiedad ConnectionInfo de cada instancia de Table. Las propiedades de la clase ConnectionInfo incluyen lo siguiente: ● ServerName ● DatabaseName ● UserID (no se utiliza en este tutorial) ● Password (no se utiliza en este tutorial) ● IntegratedSecurity Nota Si desea trabajar con un tutorial que utilice autenticación de SQL (y, por lo tanto, utilice las propiedades UserID y Password en lugar de la propiedad IntegratedSecurity), vea Tutorial: Conectar con una base de datos segura de SQL Server utilizando autenticación de SQL [página 348]. Si decide establecer únicamente las propiedades DatabaseName y IntegratedSecurity, tendrá que conectar con el servidor predeterminado y la base de datos especificada en el informe. Sin embargo, si elige asignar una propiedad ServerName alternativa, podrá redirigir el informe a un servidor diferente en tiempo de ejecución. Para empezar a crear un informe que contenga datos de una base de datos segura de un servidor SQL. Puede terminar este tutorial utilizando las clases del modelo de objetos CrystalReportViewer; sin embargo, se recomienda el modelo de objetos ReportDocument. 366 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Código de ejemplo Este tutorial incluye código de ejemplo de C# y Visual Basic que muestra la versión finalizada del proyecto. Siga las instrucciones de este tutorial para crear un nuevo proyecto o para abrir el proyecto de código de ejemplo y trabajar con una versión finalizada. El código de ejemplo se almacena en carpetas que están clasificadas por idioma y tipo de proyecto. Los nombres de las carpetas de cada versión del código de ejemplo son los siguientes: ● Sitio Web en C#: CS_Web_RDObjMod_DBLogonIntegratedSecurity ● Proyecto para Windows en C#: CS_Win_RDObjMod_DBLogonIntegratedSecurity ● Sitio Web en Visual Basic: VB_Web_RDObjMod_DBLogonIntegratedSecurity ● Proyecto para Windows en Visual Basic: VB_Win_RDObjMod_DBLogonIntegratedSecurity Información relacionada Elegir el modelo de objetos correcto para el proyecto [página 31] Directorio de informes de muestra [página 14] 1.5.2.3.1 Crear un informe conectado a una base de datos segura de SQL Server utilizando Seguridad integrada Para comenzar, cree un informe que obtenga su información de la base de datos Northwind. Nota Northwind es una base de datos de muestra que se proporciona con SQL Server. Este tutorial requiere que se configuren algunos parámetros como requisito previo. 1.5.2.3.1.1 datos Requisitos previos de configuración de la base de Procedimiento 1. Configuración de SQL Server: ○ Si tiene instalado SQL Server (o la versión OEM, MSDE), se debe configurar para que acepte la Autenticación de Windows para este tutorial. ○ Si no tiene instalado SQL Server (ni la versión OEM, MSDE), deberá instalar MSDE con la Autenticación de Windows (predeterminada) para trabajar con este tutorial. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 367 2. La base de datos Northwind incluida con SQL Server se debe instalar y verificar que acepta la Autenticación de Windows. Una vez configurados SQL Server y la base de datos Northwind de acuerdo a las secciones anteriores, ya podrá crear un informe que obtenga su información de la base de datos Northwind de forma segura. Nota Este procedimiento sólo funciona con un proyecto creado a partir de la Configuración de proyectos [página 14]. La configuración de proyectos contiene referencias específicas a espacios de nombres y configuración de códigos necesarios para este procedimiento, que no se podrá completar sin dicha configuración. 1.5.2.3.1.2 Para crear un informe con datos seguros de la base de datos Northwind Procedimiento 1. En el Explorador de soluciones, haga clic con el botón secundario en el nombre de proyecto en negrita, elija Agregar y, a continuación, haga clic en Agregar nuevo elemento. 2. En el cuadro de diálogo Agregar nuevo elemento, en la vista Plantillas, seleccione la plantilla Crystal Report. 3. En el campo Nombre, escriba "NorthwindCustomers.rpt" y haga clic en Abrir. 4. En el panel Crear un nuevo documento de Crystal Reports del cuadro de diálogo Galería de Crystal Reports, seleccione Usar asistente de informes. 5. En el panel Elegir un Asistente, seleccione Estándar y, a continuación, haga clic en Aceptar. Aparecerá la ventana Asistente para la creación de informes estándar. 6. En el panel Orígenes de datos disponibles, expanda la carpeta Crear nueva conexión. 7. En la subcarpeta que se abre, expanda la carpeta OLE DB (ADO). Aparecerá la ventana OLE DB (ADO). 8. Seleccione Proveedor de Microsoft OLE DB para SQL Server y haga clic en Siguiente. 9. Escriba el nombre del servidor de base de datos en el campo Servidor. 10. Active la casilla de verificación Seguridad integrada. 11. En la lista desplegable Base de datos, seleccione "Northwind". 12. Haga clic en Finalizar. Ahora se expandirá la carpeta OLE DB, mostrando el servidor de base de datos y dentro de él, la base de datos Northwind. 13. Expanda los nodos Northwind, dbo y Tablas, y, a continuación, seleccione la tabla Customers. 14. Haga clic en el símbolo > para mover la tabla al panel Tablas seleccionadas y, a continuación, haga clic en Siguiente. 15. Mantenga presionada la tecla Ctrl mientras hace clic en CompanyName, ContactName y City. 16. Haga clic en el símbolo > para mover estos campos al panel Campos a mostrar y, a continuación, haga clic en Siguiente. 17. En el panel Campos disponibles, en Campos del informe, seleccione Cliente.Ciudad, haga clic en el símbolo > para mover el campo al panel Agrupar por y, a continuación, haga clic en Finalizar. 368 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Se creará el informe NorthwindCustomers y se cargará en la ventana principal de Visual Studio. Resultados Ahora ya podrá enlazar el informe al control CrystalReportViewer y establecer la conexión con la base de datos mediante programación. 1.5.2.3.2 Enlazar el informe En Configuración de proyectos [página 14], colocó un control CrystalReportViewer en el formulario Web Forms o Windows Forms. En el paso anterior, ha agregado un informe NorthwindCustomers al proyecto. En esta sección, creará una instancia del informe NorthwindCustomers y la enlazará con el control CrystalReportViewer. A continuación, probará si el informe se muestra correctamente cuando no se han establecido valores actuales para su campo de parámetro. Puede crear una copia del informe y enlazarla de dos formas: ● Como informe incrustado. ● Como informe no incrustado. Elija uno de los procedimientos con pasos siguientes (pero no ambos). ● Si utiliza informes incrustados, realice el siguiente procedimiento de pasos para crear una instancia del informe como un informe incrustado. ● Si utiliza informes no incrustados, siga el segundo procedimiento de pasos para crear una instancia del informe como un informe no incrustado. 1.5.2.3.2.1 Para crear una copia del informe NorthwindCustomers como informe incrustado y enlazarla al control CrystalReportViewer Procedimiento 1. Abra el formulario Web Forms o Windows Forms. 2. En el menú Ver, haga clic en Código. 3. Agregue una nueva declaración de nivel de clase para la clase contenedora del informe NorthwindCustomers, con el nombre de variable northwindCustomersReport. Establezca su modificador de acceso como private. Private northwindCustomersReport As NorthwindCustomers Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 369 private NorthwindCustomers northwindCustomersReport; 4. En el método ConfigureCrystalReports(), cree una instancia de la clase contenedora de informes. Nota Ha creado el método ConfigureCrystalReports() en Configuración de proyectos [página 14]. northwindCustomersReport = New NorthwindCustomers() northwindCustomersReport = new NorthwindCustomers(); 5. En la línea siguiente, debajo de la creación de instancias del informe, enlace la propiedad ReportSource del control CrystalReportViewer a la clase de informe de la que ha creado una instancia (nombre de variable: northwindCustomersReport). myCrystalReportViewer.ReportSource = northwindCustomersReport crystalReportViewer.ReportSource = northwindCustomersReport; Resultados Ahora estará listo para crear y ejecutar el proyecto. Está previsto que falle la carga del informe, porque aún no se ha escrito el código para conectarse con la base de datos. 1.5.2.3.2.2 Para crear una copia del informe NorthwindCustomers como informe no incrustado y enlazarla al control CrystalReportViewer Procedimiento 1. Abra el formulario Web Forms o Windows Forms. 2. En el menú Ver, haga clic en Código. 3. Agregue una nueva declaración de nivel de clase para la clase contenedora del informe NorthwindCustomers, con el nombre de variable northwindCustomersReport. Establezca su modificador de acceso como private. Private northwindCustomersReport As ReportDocument private ReportDocument northwindCustomersReport; 370 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Nota La clase ReportDocument es miembro del espacio de nombres CrystalDecisions.CrystalReports.Engine. Agregó una declaración "Imports" [Visual Basic] o "using" [C#] para este espacio de nombres en Configuración de proyectos [página 14]. Cuando cree la instancia de ReportDocument y cargue un informe en el espacio de nombres, tendrá acceso al informe a través del SDK, sin incrustar el informe. 4. En el método ConfigureCrystalReports() (que ha creado en Configuración de proyectos [página 14]), cree una instancia de la clase ReportDocument. northwindCustomersReport = New ReportDocument() northwindCustomersReport = new ReportDocument(); 5. Declare una variable de cadena, llámela reportPath y asígnele una ruta en tiempo de ejecución al informe local. Esta ruta se determina de forma diferente para los sitios Web y los proyectos para Windows: ○ Para un sitio Web, pase el nombre del archivo de informe local como un parámetro de cadena al método Server.MapPath(). Esto asigna el informe local a la ruta del directorio de archivos de la unidad de disco duro en tiempo de ejecución. Dim reportPath As String = Server.MapPath("NorthwindCustomers.rpt") string reportPath = Server.MapPath("NorthwindCustomers.rpt"); ○ Para un proyecto Windows, concatene la propiedad Application.StartupPath con una barra diagonal inversa y el nombre del archivo de informe local. Esto asigna el informe al mismo directorio del archivo ejecutable de Windows. Nota En la fase de compilación se copiará el informe al directorio que contiene el archivo ejecutable. Dim reportPath As String = Application.StartupPath & "\" & "NorthwindCustomers.rpt" string reportPath = Application.StartupPath + "\\" + "NorthwindCustomers.rpt"; 6. Llame al método Load() de la instancia de ReportDocument y pásele la variable de cadena reportPath. northwindCustomersReport.Load(reportPath) northwindCustomersReport.Load(reportPath); 7. Enlace la propiedad ReportSource de CrystalReportViewer a la instancia de ReportDocument. myCrystalReportViewer.ReportSource = northwindCustomersReport Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 371 crystalReportViewer.ReportSource = northwindCustomersReport; Resultados Tanto si ha elegido crear una instancia de clase de un informe incrustado como de un informe no incrustado mediante la clase ReportDocument, el nombre de la variable utilizada es el mismo: northwindCustomersReport. De esta forma, puede utilizar un conjunto de códigos común en los procedimientos que aparecen a continuación. Ahora estará listo para crear y ejecutar el proyecto. Está previsto que falle la carga del informe, porque aún no se ha escrito el código para conectarse con la base de datos. 1.5.2.3.2.3 Para probar la carga del informe NorthwindCustomers Procedimiento 1. En el menú Generar, seleccione Generar solución. 2. Si existen errores de generación, continúe y corríjalos ahora. 3. Si usa un informe no incrustado en un proyecto Windows, busque el archivo ejecutable de Windows compilado en el subdirectorio \bin\ [Visual Basic] o \bin\debug\ [C#] y, a continuación, copie el informe en dicho subdirectorio. Nota Para que el archivo ejecutable de Windows cargue el informe no incrustado en tiempo de ejecución, el informe deberá estar almacenado en el mismo directorio que el archivo ejecutable de Windows. 4. En el menú Depurar, haga clic en Iniciar. El informe NorthwindCustomers no se muestra, porque no se ha agregado el código de conexión con la base de datos. Nota Los resultados pueden variar según la versión de SAP Crystal Reports que use. Por ejemplo, si tiene instalado SAP Crystal Reports Developer, aparecerá un formulario y se le pedirá que indique la información sobre conexión de base de datos para el informe. Esta es una nueva función de SAP Crystal Reports Developer. Si ejecuta una versión anterior de SAP Crystal Reports, se produce una excepción. En cualquier caso, debe seguir el siguiente procedimiento de pasos para crear una aplicación totalmente funcional. 5. 372 Vuelva a Visual Studio y haga clic en Detener para salir del modo de depuración. © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 1.5.2.3.3 Agregar el código de conexión del informe Ahora estará preparado para agregar el código de conexión del informe a la clase de código subyacente. Va a empezar por crear un método auxiliar privado, SetDBLogonForReport(). 1.5.2.3.3.1 Para crear y codificar el método SetDBLogonForReport() Procedimiento 1. Regrese a la clase de código subyacente de este Web Forms o Windows Forms. 2. En la parte inferior de la clase, cree un nuevo método privado denominado SetDBLogonForReport() con dos parámetros, ConnectionInfo y ReportDocument. Private Sub SetDBLogonForReport(ByVal myConnectionInfo As ConnectionInfo, ByVal myReportDocument As ReportDocument) End Sub private void SetDBLogonForReport(ConnectionInfo connectionInfo, ReportDocument reportDocument) { } 3. En este método, recupere la instancia de Tables de la propiedad Tables de la propiedad Database del parámetro ReportDocument. Nota Tables es una clase indizada que contiene instancias de la clase Table. Dim myTables As Tables = myReportDocument.Database.Tables Tables tables = reportDocument.Database.Tables; 4. Cree un bucle foreach que recorra todas las instancias de Table de la instancia de clase indizada Tables. Nota Debe incluir la ruta del espacio de nombres completa a la clase Table, para diferenciarla de la clase Table del espacio de nombres System.Web.UI.WebControls. For Each myTable As CrystalDecisions.CrystalReports.Engine.Table In myTables Next Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 373 foreach(CrystalDecisions.CrystalReports.Engine.Table table in tables) { } 5. En el bucle foreach, obtenga la instancia de TableLogonInfo a partir de la propiedad LogOnInfo de la instancia de Table. Dim myTableLogonInfo As TableLogOnInfo = myTable.LogOnInfo TableLogOnInfo tableLogonInfo = table.LogOnInfo; 6. En el bucle foreach, establezca el valor de la propiedad ConnectionInfo de TableLogonInfo en el parámetro ConnectionInfo. myTableLogonInfo.ConnectionInfo = myConnectionInfo tableLogonInfo.ConnectionInfo = connectionInfo; 7. En el bucle foreach, pase la instancia de TableLogonInfo como parámetro al método ApplyLogonInfo de la instancia de Table. myTable.ApplyLogOnInfo(myTableLogonInfo) table.ApplyLogOnInfo(tableLogonInfo); Resultados El procedimiento de este paso ha creado un método para establecer la conexión de la base de datos. Sin embargo, debe modificar el método ConfigureCrystalReports() para direccionar este método, con el fin de que el informe sepa que tiene información sobre conexión de base de datos. La modificación del método ConfigureCrystalReports() requiere dos acciones: ● Configurar la instancia de ConnectionInfo. ● Llamar al método SetDBLogonForReport(). 374 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 1.5.2.3.3.2 Para modificar el método ConfigureCrystalReports() para direccionar el código de conexión con la base de datos Procedimiento 1. En el método ConfigureCrystalReports(), agregue un par de saltos de línea al código encima de la línea que enlaza el informe al control CrystalReportViewer. 2. En los saltos de línea, declare y cree una instancia de la clase ConnectionInfo. Nota Para que la clase ConnectionInfo sea accesible, incluya un enunciado "Imports" [Visual Basic] o "using" [C#] en la parte superior de la clase de código subyacente del espacio de nombres CrystalDecisions.Shared. (Esta declaración se ha agregado en Configuración de proyectos [página 14].) Dim myConnectionInfo As ConnectionInfo = New ConnectionInfo() ConnectionInfo connectionInfo = new ConnectionInfo(); 3. Establezca las propiedades DatabaseName y IntegratedSecurity de la instancia de ConnectionInfo. myConnectionInfo.DatabaseName = "Northwind" myConnectionInfo.IntegratedSecurity = True connectionInfo.DatabaseName = "Northwind"; connectionInfo.IntegratedSecurity = true; 4. Especifique una llamada al método SetDBLogonForReport() y pase la instancia de ConnectionInfo y el informe NorthwindCustomers. SetDBLogonForReport(myConnectionInfo, northwindCustomersReport) SetDBLogonForReport(connectionInfo, northwindCustomersReport); Resultados A continuación aparece el código original que enlaza el informe al control CrystalReportViewer. Ahora estará listo para crear y ejecutar el proyecto. El informe se debe cargar correctamente, ya que ha agregado código para conectar con la base de datos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 375 1.5.2.3.3.3 Para probar la carga del informe NorthwindCustomers Procedimiento 1. En el menú Generar, seleccione Generar solución. 2. Si existen errores de generación, continúe y corríjalos ahora. 3. En el menú Depurar, haga clic en Iniciar. El informe NorthwindCustomers se mostrará correctamente. 4. Vuelva a Visual Studio y haga clic en Detener para salir del modo de depuración. Resultados En la siguiente sección, aprenderá a cambiar la ubicación de la base de datos en tiempo de ejecución. 1.5.2.3.4 Agregar la posibilidad de cambiar la ubicación de la base de datos en tiempo de ejecución En esta sección, aprenderá a cambiar la ubicación de la base de datos en tiempo de ejecución. Sólo requiere una pequeña modificación de la instancia de ConnectionInfo. 1.5.2.3.4.1 Para cambiar la ubicación de la base de datos en tiempo de ejecución Procedimiento 1. En el método ConfigureCrystalReports(), agregue un par de saltos de línea al código detrás de la línea que declara y crea una instancia de la clase ConnectionInfo. 2. En los saltos de línea, establezca la propiedad ServerName de la instancia de ConnectionInfo. Nota En el código que escriba, reemplace el nombre del servidor de ejemplo DevDatabase (que aparece más abajo) por el nombre de su servidor. myConnectionInfo.ServerName = "DevDatabase" 376 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net connectionInfo.ServerName = "DevDatabase"; Resultados Ahora estará listo para crear y ejecutar el proyecto. El informe se debe redirigir al servidor de base de datos alternativo en tiempo de ejecución. 1.5.2.3.4.2 Para probar si el informe se puede restablecer a un servidor de base de datos alternativo en tiempo de ejecución Procedimiento 1. En el menú Generar, seleccione Generar solución. 2. Si existen errores de generación, continúe y corríjalos ahora. 3. En el menú Depurar, haga clic en Iniciar. El informe NorthwindCustomers se mostrará correctamente. 4. Vuelva a Visual Studio y haga clic en Detener para salir del modo de depuración. 1.5.2.3.5 Configuración mediante el método SetConnection Contexto En esta sección aprenderá cómo aplicar tres cambios (al nombre de servidor, de base de datos y de la configuración de la seguridad integrada) mediante el método SetConnection(). Sólo requiere una pequeña modificación de la instancia de ConnectionInfo. Procedimiento 1. En el método ConfigureCrystalReports(), después de la línea que declara y crea una instancia de la clase ConnectionInfo, elimine las líneas de código que asignan las propiedades ServerName, DatabaseName e IntegratedSecurity. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 377 2. Escriba una nueva línea de código en la que se llame al método SetConnection() de la instancia de ConnectionInfo y pase a dicho método el nombre del servidor, el nombre de la base de datos y la configuración de seguridad integrada. myConnectionInfo.SetConnection("DevDatabase", "Northwind", True) connectionInfo.SetConnection("DevDatabase", "Northwind", true); Resultados Ahora estará listo para crear y ejecutar el proyecto. 1.5.2.4 Tutorial: Conectar con una base de datos segura de SQL Server con un subinforme En este tutorial se planteará una complicación adicional a la conexión con una base de datos de SQL Server segura: ¿qué sucede si el informe que requiere una conexión con base de datos de SQL Server segura contiene un subinforme? Introducción En este tutorial, aprenderá a cumplir los requisitos de conexión del subinforme. Debe efectuar dos modificaciones en el proyecto creado en el tutorial anterior: ● Agregará un subinforme al informe original. Este subinforme direcciona la tabla Pedidos de la base de datos Northwind. La tabla Pedidos está relacionada con la tabla Clientes utilizada por una clave externa CustomerID en el tutorial anterior. ● Va a agregar un nuevo método. El método recupera los subinformes del informe principal y, a continuación, pasa cada subinforme al método auxiliar SetDBLogonForReport(). También puede realizar este tutorial con clases del modelo de objetos CrystalReportViewer, aunque se prefiere el modelo de objetos ReportDocument. Para seguir los pasos de este tutorial con el modelo de objetos CrystalReportViewer, vea Tutorial: Conectar con una base de datos segura de SQL Server utilizando autenticación de SQL [página 241]. 378 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Código de ejemplo Este tutorial incluye código de ejemplo de C# y Visual Basic que muestra la versión finalizada del proyecto. Siga las instrucciones de este tutorial para crear un nuevo proyecto o para abrir el proyecto de código de ejemplo y trabajar con una versión finalizada. El código de ejemplo se almacena en carpetas que están clasificadas por idioma y tipo de proyecto. Los nombres de las carpetas de cada versión del código de ejemplo son los siguientes: ● Sitio Web en C#: CS_Web_RDObjMod_DBLogonSubrpt ● Proyecto para Windows en C#: CS_Win_RDObjMod_DBLogonSubrpt ● Sitio Web en Visual Basic: VB_Web_RDObjMod_DBLogonSubrpt ● Proyecto para Windows en Visual Basic: VB_Win_RDObjMod_DBLogonSubrpt Información relacionada Directorio de informes de muestra [página 14] 1.5.2.4.1 Agregar un subinforme al informe original Va a empezar por agregar un subinforme al informe original. 1.5.2.4.1.1 Para agregar un subinforme Procedimiento 1. Abra el proyecto creado en el tutorial anterior, Tutorial: Conectar con una base de datos segura de SQL Server utilizando seguridad integrada [página 366]. 2. En el Explorador de soluciones, haga doble clic en el informe NorthwindCustomers para abrirlo. 3. Haga clic con el botón secundario en la barra gris Detalles y seleccione Insertar sección abajo. 4. Haga clic con el botón secundario en la nueva sección Detalles b que ha creado, seleccione Insertar y, a continuación, haga clic en Subinforme. Aparece un cuadrado gris alrededor del cursor del mouse. 5. Arrastre el rectángulo gris en la nueva sección Detalles b y, a continuación, haga clic para soltarlo. 6. En el cuadro de diálogo Insertar subinforme, en la ficha Subinforme, seleccione Crear un subinforme con el Asistente de informes. Nota El cuadro de diálogo Insertar un subinforme incluye otras opciones que permiten elegir un informe existente y subinformes a petición. Para obtener más información sobre estas funciones, vea Ficha Subinforme (cuadro de diálogo Insertar subinforme) [página 928]. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 379 7. En el campo Nombre del informe nuevo, escriba "PedidosClientes". 8. Haga clic en Asistente de informes.... 9. En el cuadro de diálogo Asistente para la creación de informes estándar, en el panel Orígenes de datos disponibles, expanda la carpeta Crear nueva conexión. 10. Expanda la carpeta OLE DB (ADO). La carpeta contiene el servidor de base de datos, configurado para el informe al crearlo. Nota Si no se muestra el servidor, siga las instrucciones del tutorial anterior para conectarse con la base de datos de SQL Server. 11. Expanda los nodos Northwind, dbo y Tablas. 12. Seleccione la tabla Pedidos y haga clic en el símbolo > para moverla al panel Seleccionar tablas y, a continuación, haga clic en Siguiente. 13. En el panel Campos disponibles, seleccione ID del pedido, Fecha del pedido, Fecha de envío y Nombre de envío. 14. Haga clic en el símbolo > para mover estos campos al panel Campos a mostrar y, a continuación, haga clic en Finalizar. 15. En el cuadro de diálogo Insertar un subinforme, seleccione la ficha Vínculo. 16. En el panel Campo(s) del informe contenedor para vincular, en la lista Campos disponibles, expanda la tabla Clientes, seleccione ID del cliente y, a continuación, haga clic en el símbolo >. 17. En el panel Vínculo de campo Clientes.ID del cliente que aparece, deje las selecciones predeterminadas inalteradas. Estas selecciones de parámetros y de datos generan automáticamente entre el informe principal y el subinforme. 18. Haga clic en Aceptar. El nuevo subinforme, PedidosClientes, se muestra en la sección Detalles b del informe principal. Nota Al agregar un subinforme a la sección Detalles, el subinforme se muestra por cada fila, lo que agrega un costo de rendimiento al informe. Si no necesita información de subinforme a ese nivel de granularidad, coloque el subinforme en una sección Grupo en vez de hacerlo en una sección Detalles. Resultados Ahora está listo para verificar la configuración del subinforme. 380 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 1.5.2.4.1.2 Para verificar la configuración del subinforme Procedimiento 1. En la sección Detalles, haga doble clic en el subinforme CustomerOrders para verlo. En la parte inferior de la vista del diseñador, aparecen botones de desplazamiento para el informe principal y el subinforme PedidosClientes. 2. Si el Explorador de campos no está visible, en la barra de herramientas de Crystal Reports, haga clic en Cambiar la vista del campo. Nota Otro modo de ver el Explorador de campos es ir al menú Crystal Reports y hacer clic en Explorador de campos. 3. En el Explorador de campos, expanda Campos de parámetro. 4. Verifique que el campo de parámetro Pm-Clientes.ID del cliente se ha generado automáticamente al vincular el subinforme. 5. En la barra de herramientas, haga clic en Asistente de selección. 6. En el cuadro de diálogo Asistente de selección, verifique que está establecido el criterio Orders.CustomerID es igual a {?Pm-Customers.CustomerID} y, a continuación, haga clic en Aceptar. 7. En el menú Archivo, seleccione Guardar todo. Resultados Ha agregado correctamente un subinforme CustomerOrders al informe NorthwindCustomers. En la próxima sección, va a agregar código para establecer la información sobre conexión de la base de datos segura de SQL Server para todos los subinformes encontrados en el informe principal. 1.5.2.4.2 Agregar el código de conexión del subinforme Ahora ya está preparado para agregar el código de conexión para el subinforme a la clase de código subyacente. Para empezar, cree un método auxiliar privado denominado SetDBLogonForSubreports(). Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 381 1.5.2.4.2.1 Para crear y codificar el método SetDBLogonForSubreports() Procedimiento 1. Abra el formulario Web Forms o Windows Forms. 2. En el menú Ver, haga clic en Código. 3. En la parte inferior de la clase, cree un nuevo método privado denominado SetDBLogonForSubreports() con dos parámetros, ConnectionInfo y ReportDocument. Private Sub SetDBLogonForSubreports(ByVal myConnectionInfo As ConnectionInfo, ByVal myReportDocument As ReportDocument) End Sub private void SetDBLogonForSubreports(ConnectionInfo connectionInfo, ReportDocument reportDocument) { } 4. En este método, recupere la instancia de Sections de la propiedad Sections de la propiedad ReportDefinition del parámetro ReportDocument. Nota Sections es una clase indizada que contiene instancias de la clase Section. Dim mySections As Sections = myReportDocument.ReportDefinition.Sections Sections sections = reportDocument.ReportDefinition.Sections; 5. Cree un bucle foreach que recorra todas las instancias de Section de la instancia de clase indizada Sections. For Each mySection As Section In mySections Next foreach(Section section in sections) { } 6. En el bucle foreach, recupere la instancia de ReportObjects a partir de la propiedad ReportObjects de la instancia de Section. Dim myReportObjects As ReportObjects = mySection.ReportObjects 382 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net ReportObjects reportObjects = section.ReportObjects; 7. En el bucle foreach, cree un nuevo bucle foreach anidado que recorra cada instancia de ReportObject de la instancia de clase indizada ReportObjects. For Each myReportObject As ReportObject In myReportObjects Next foreach(ReportObject reportObject in reportObjects) { } 8. En el bucle foreach anidado, cree un bloque condicional que pruebe si la propiedad Kind de la instancia de ReportObject es igual a la selección SubreportObject de la enumeración ReportObjectKind. If myReportObject.Kind = ReportObjectKind.SubreportObject Then End If if(reportObject.Kind == ReportObjectKind.SubreportObject) { } 9. En el bloque condicional, proyecte la instancia de ReportObject en una instancia de SubreportObject. Dim mySubreportObject As SubreportObject = CType(myReportObject, SubreportObject) SubreportObject subreportObject = (SubreportObject)reportObject; 10. Aún en el bloque condicional, declare una nueva instancia de ReportDocument como variable subReportDocument y llénela llamando al método OpenSubreport() de la instancia de SubreportObject. Dim subReportDocument As ReportDocument = mySubreportObject.OpenSubreport(mySubreportObject.SubreportName) ReportDocument subReportDocument = subreportObject.OpenSubreport(subreportObject.SubreportName); 11. Finalmente, en el bloque condicional, llame al método SetDBLogonForReport() original y pásele el parámetro ConnectionInfo y la nueva variable subReportDocument. SetDBLogonForReport(myConnectionInfo, subReportDocument) SetDBLogonForReport(connectionInfo, subReportDocument); Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 383 1.5.2.4.2.2 Para modificar el método ConfigureCrystalReports() con el fin de direccionar el código de conexión con la base de datos para los subinformes Contexto Este procedimiento de pasos ha creado un método para recuperar todos los subinformes posibles como instancias de ReportDocument. Cada instancia de ReportDocument del subinforme se pasa, a continuación, al método original para establecer la conexión a la base de datos segura de SQL Server. Sin embargo, ahora debe modificar el método ConfigureCrystalReports() para direccionarlo, con el fin de que se procese la información sobre conexión de base de datos de los subinformes. Procedimiento 1. En el método ConfigureCrystalReports(), agregue un par de saltos de línea al código encima de la línea que enlaza el informe al control CrystalReportViewer. 2. En los saltos de línea, especifique una llamada al método SetDBLogonForSubreports() y pásele la instancia de ConnectionInfo y el informe NorthwindCustomers. SetDBLogonForSubreports(myConnectionInfo, northwindCustomersReport) SetDBLogonForSubreports(connectionInfo, northwindCustomersReport); 1.5.2.4.2.3 Para probar la carga del informe NorthwindCustomers Contexto A continuación aparece el código original que enlaza el informe al control CrystalReportViewer. Ahora estará listo para crear y ejecutar el proyecto. Se espera que el informe se cargue correctamente, incluido su subinforme, ya que ahora ya existe código escrito para conectar con la base de datos en cualquier subinforme. Procedimiento 1. 384 En el menú Generar, seleccione Generar solución. © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 2. Si existen errores de generación, continúe y corríjalos ahora. 3. En el menú Depurar, haga clic en Iniciar. El informe NorthwindCustomers, incluido su nuevo subinforme CustomerOrders, se muestra correctamente. 4. Vuelva a Visual Studio y haga clic en Detener para salir del modo de depuración. 1.5.2.5 Tutorial: Leer y configurar parámetros discretos En este tutorial, aprenderá a crear un informe cuyos datos se puedan filtrar basándose en un parámetro discreto. Introducción Un parámetro discreto es un único valor, a diferencia de un parámetro de rango, que hace referencia a un rango de valores. A los elementos de texto (como ciudades) se tiene acceso normalmente mediante parámetros discretos. A los elementos numéricos(como sueldos de empleados) se suele acceder mediante parámetros de rango. En este tutorial establecerá un valor de un parámetro discreto para ver un informe de clientes basado en un solo campo. El informe muestra únicamente los clientes que viven en las ciudades seleccionadas en una lista de ciudades. La lista de ciudades proviene de los valores predeterminados del parámetro de ciudad. Dichos valores predeterminados del parámetro de ciudad se encapsulan dentro del informe. Para empezar, va a crear un informe de clientes con un parámetro de ciudad. Los datos del informe proceden de la base de datos de ejemplo incluida en SAP Crystal Reports, versión para programadores de Microsoft Visual Studio. Al crear una instancia del informe en el código, generará un ArrayList que contiene nombres de ciudades (Paris, Tokyo) y pasará dicha instancia de ArrayList a un método auxiliar que establezca estos nombres como valores actuales del parámetro Ciudad. A continuación, enlazará el informe al control CrystalReportViewer y verá el informe que mostrará únicamente los clientes que vivan en París y Tokio. En la siguiente parte del tutorial, realizará las siguientes acciones: ● Crear un método que obtenga todos los valores predeterminados y los devuelva en un ArrayList. ● Agregar un control ListBox al formulario y rellenarlo a partir de ArrayList. ● Agregar un control Button para volver a mostrar el informe basado en las selecciones de ListBox. En la parte final del tutorial, codificará el evento de clic de botón para obtener los elementos seleccionados en el control ListBox y establecerlos para que sean los valores actuales del parámetro de ciudad. El informe se volverá a mostrar incluyendo únicamente los clientes que vivan en las ciudades seleccionadas en el control ListBox. Este tutorial también se puede realizar con clases del modelo de objetos CrystalReportViewer, aunque se prefiere el modelo de objetos ReportDocument. Para seguir los pasos de este tutorial con el modelo de objetos CrystalReportViewer, vea Tutorial: Conectar con una base de datos segura de SQL Server utilizando autenticación de SQL [página 241]. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 385 Código de ejemplo Este tutorial incluye código de ejemplo de C# y Visual Basic que muestra la versión finalizada del proyecto. Siga las instrucciones de este tutorial para crear un nuevo proyecto o para abrir el proyecto de código de ejemplo y trabajar con una versión finalizada. El código de ejemplo se almacena en carpetas que están clasificadas por idioma y tipo de proyecto. Los nombres de las carpetas de cada versión del código de ejemplo son los siguientes: ● Sitio Web en C#: CS_Web_RDObjMod_Parameters ● Proyecto para Windows en C#: CS_Win_RDObjMod_Parameters ● Sitio Web en Visual Basic: VB_Web_RDObjMod_Parameters ● Proyecto para Windows en Visual Basic: VB_Win_RDObjMod_Parameters Base de datos Xtreme Este tutorial utiliza una base de datos de muestra llamada Xtreme. El archivo de base de datos xtreme.mdb se incluye en el paquete de código de muestra del SDK de SAP Crystal Reports .NET. Para usar la base de datos Xtreme, deberá crear manualmente una conexión ODBC a ella. Información relacionada Elegir el modelo de objetos correcto para el proyecto [página 31] Directorio de informes de muestra [página 14] 1.5.2.5.1 Crear un informe con parámetros Para comenzar, cree un informe que obtenga su información de la base de datos Xtreme. 1.5.2.5.1.1 Para crear un informe con parámetros Procedimiento 1. En el Explorador de soluciones, haga clic con el botón secundario en el nombre de proyecto en negrita, elija Agregar y, a continuación, haga clic en Agregar nuevo elemento. 2. En el cuadro de diálogo Agregar nuevo elemento, en la vista Plantillas, seleccione la plantilla denominada Crystal Report. 3. En el campo Nombre, escriba el nombre CustomersByCity.rpt y haga clic en Agregar. 386 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 4. En el panel Crear un nuevo documento de Crystal Reports del cuadro de diálogo Galería de Crystal Reports, seleccione Usar asistente de informes. 5. En el panel Elegir un Asistente, seleccione Estándar y, a continuación, haga clic en Aceptar. 6. En el panel Orígenes de datos disponibles de la ventana Asistente para la creación de informes estándar, expanda la carpeta Crear nueva conexión. Nota En Visual Studio .NET 2003, donde SAP Crystal Reports no se ha actualizado a la versión completa, no existe la carpeta Crear nueva conexión; el contenido se mostrará en el nivel superior. 7. En la subcarpeta que se abre, expanda la carpeta ODBC (RDO). 8. En la ventana ODBC (RDO), seleccione la entrada ODBC DSN correcta para la base de datos Xtreme y haga clic en Finalizar. Se expandirá la carpeta ODBC (RDO) y mostrará la base de datos Xtreme. 9. Expanda el nodo Tablas y seleccione la tabla Cliente. 10. Haga doble clic en la tabla Cliente para moverla al panel Tablas seleccionadas y, a continuación, haga clic en Siguiente. 11. Expanda la tabla Cliente, mantenga presionada la tecla Ctrl y haga clic en Nombre del cliente, Título del contacto, Dirección1, Apellido del cliente y Ciudad. 12. Haga clic en el símbolo > para mover estos campos al panel Campos a mostrar y, a continuación, haga clic en el botón Siguiente. 13. En el panel Campos disponibles, en Campos del informe, seleccione Cliente.Ciudad, haga clic en el símbolo > para mover el campo al panel Agrupar por y, a continuación, haga clic en el botón Finalizar. Se creará el informe CustomersByCity y se cargará en la ventana principal de Visual Studio. Resultados Ahora ya podrá agregar un parámetro denominado Ciudad y ocuparlo con valores predeterminados. 1.5.2.5.1.2 Para agregar un parámetro Ciudad Contexto El Explorador de campos debe estar visible, porque proporciona acceso a las distintas funciones del informe, incluidos los parámetros. Procedimiento 1. Si el Explorador de campos no está visible, en la barra de herramientas de Crystal Reports, haga clic en Cambiar la vista del campo. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 387 Nota Otro modo de ver el Explorador de campos es ir al menú Crystal Reports y hacer clic en Explorador de campos. 2. En el Explorador de campos, haga clic con el botón secundario en Campos de parámetro y seleccione Nuevo... 3. En el cuadro de diálogo Crear campo de parámetro: a) Establezca el Nombre como Ciudad. b) Defina Tipo como Cadena. Establezca Texto de solicitud en Seleccione una o varias ciudades. c) Defina Campo de valor como Ciudad. d) Haga clic en Acciones y seleccione Anexar todos los valores de base de datos. De esta forma se agregará la lista de ciudades completa al panel intermedio. e) En el panel Opciones de valor, establezca Texto de petición en Seleccione una o varias ciudades. f) En el mismo panel, defina Permitir valores múltiples como Verdadero. g) Establezca Permitir valores discretos como Verdadero. 4. Haga clic en Aceptar para cerrar el cuadro de diálogo Crear campo de parámetro. Resultados Acaba de establecer los valores predeterminados para que contengan una amplia lista de ciudades. Posteriormente, en este tutorial, va tener acceso a esta misma lista de valores predeterminados mediante programación, a través de la propiedad DefaultValues de la clase ParameterFieldDefinition. Ahora va a utilizar el Asistente de selección para establecer una fórmula que conecte la columna de base de datos Ciudad con el campo de parámetro Ciudad creado recientemente. 1.5.2.5.1.3 Para conectar el parámetro Ciudad a la columna de base de datos Ciudad Procedimiento 1. En la barra de herramientas de Crystal Reports, haga clic en Asistente de selección. 2. En el cuadro de diálogo Elegir campo, en Campos del informe, seleccione Cliente.Ciudad y, a continuación, haga clic en Aceptar. 3. En el cuadro de diálogo Asistente de selección, en la ficha Customer.City, establezca la lista desplegable como es igual a. 4. En la nueva lista desplegable que aparece a la derecha, seleccione la primera opción de la lista, {?City} y, a continuación, haga clic en Aceptar. Nota Esta selección, {?Ciudad}, es el parámetro Ciudad creado anteriormente. 388 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 5. En el menú Archivo, seleccione Guardar todo. Resultados Ahora podrá enlazar el informe al control CrystalReportViewer y establecer el parámetro de ciudad con dos valores iniciales, París y Tokio. 1.5.2.5.2 Enlazar el informe Cuando siguió las instrucciones de la sección Configuración de proyectos [página 14] para preparase para este tutorial, colocó un control CrystalReportViewer en el formulario Web Forms o Windows Forms. En los pasos anteriores, agregó un informe CustomersByCity al proyecto. En esta sección, va a crear una copia del informe CustomersByCity y a enlazarla con el control CrystalReportViewer. A continuación, probará si el informe se muestra correctamente cuando no se han establecido valores actuales para su campo de parámetro. Puede crear una copia del informe y enlazarla de dos formas: ● Como informe incrustado. ● Como informe no incrustado. Elija uno de los procedimientos con pasos siguientes (pero no ambos). ● Si utiliza informes incrustados, realice el siguiente procedimiento de pasos para crear una instancia del informe como un informe incrustado. ● Si utiliza informes no incrustados, siga el segundo procedimiento de pasos para crear una instancia del informe como un informe no incrustado. 1.5.2.5.2.1 Para crear una copia del informe CustomersByCity como informe incrustado y enlazarla al control CrystalReportViewer Procedimiento 1. Abra el formulario Web Forms o Windows Forms. 2. En el menú Ver, haga clic en Código para ver la clase de código subyacente de Web Forms o Windows Forms. 3. Agregue una nueva declaración de nivel de clase para la clase contenedora del informe CustomersByCity, con el nombre de variable customersByCityReport. Establezca su modificador de acceso como private. Private customersByCityReport As CustomersByCity Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 389 private CustomersByCity customersByCityReport; 4. En el método ConfigureCrystalReports(), cree una instancia de la clase contenedora de informes. Nota Ha creado el método ConfigureCrystalReports() en Configuración de proyectos [página 14]. customersByCityReport = New CustomersByCity() customersByCityReport = new CustomersByCity(); 5. En la línea siguiente, debajo de la creación de instancias del informe, enlace la propiedad ReportSource del control CrystalReportViewer a la clase de informe de la que ha creado una instancia (nombre de variable: customersByCityReport). myCrystalReportViewer.ReportSource = customersByCityReport crystalReportViewer.ReportSource = customersByCityReport; Nota Se tiene acceso a la instancia del control CrystalReportViewer en el código porque agregó el control al formulario Web Forms o Windows Forms. Si Intellisense no reconoce la instancia del control CrystalReportViewer, verifique que se ha agregado este control como declaración de nivel de clase a esta clase de código subyacente. 1.5.2.5.2.2 Para crear una copia del informe CustomersByCity como informe no incrustado y enlazarla al control CrystalReportViewer Contexto Ahora estará listo para crear y ejecutar el proyecto. Está previsto que falle la carga del informe, porque aún no se ha escrito el código para establecer un valor para el campo de parámetro Ciudad. Procedimiento 1. 390 Abra el formulario Web Forms o Windows Forms. © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 2. En el menú Ver, haga clic en Código. 3. Agregue una nueva declaración de nivel de clase para la clase contenedora del informe ReportDocument, con el nombre de variable customersByCityReport. Establezca su modificador de acceso como private. Private customersByCityReport As ReportDocument private ReportDocument customersByCityReport; Nota La clase ReportDocument es miembro del espacio de nombres CrystalDecisions.CrystalReports.Engine. Agregó una declaración "Imports" [Visual Basic] o "using" [C#] para este espacio de nombres en Configuración de proyectos [página 14]. Cuando cree la instancia de ReportDocument y cargue un informe en el espacio de nombres, tendrá acceso al informe a través del SDK, sin incrustar el informe. 4. En el método ConfigureCrystalReports() (agregado durante uno de los procedimientos de Configuración de proyectos [página 14]), cree una instancia de la clase ReportDocument. customersByCityReport = New ReportDocument() customersByCityReport = new ReportDocument(); 5. Declare una variable de cadena, llámela reportPath y asígnele una ruta en tiempo de ejecución al informe local. Esta ruta se determina de forma diferente para los sitios Web y los proyectos para Windows: ○ Para un sitio Web, pase el nombre del archivo de informe local como un parámetro de cadena al método Server.MapPath(). Esto asigna el informe local a la ruta del directorio de archivos de la unidad de disco duro en tiempo de ejecución. Dim reportPath As String = Server.MapPath("CustomersByCity.rpt") string reportPath = Server.MapPath("CustomersByCity.rpt"); ○ Para un proyecto Windows, concatene la propiedad Application.StartupPath con una barra diagonal inversa y el nombre del archivo de informe local. Esto asigna el informe al mismo directorio del archivo ejecutable de Windows. Nota En la fase de compilación se copiará el informe al directorio que contiene el archivo ejecutable. Dim reportPath As String = Application.StartupPath & "\" & "CustomersByCity.rpt" string reportPath = Application.StartupPath + "\\" + "CustomersByCity.rpt"; Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 391 6. Llame al método Load() de la instancia de ReportDocument y pásele la variable de cadena reportPath. customersByCityReport.Load(reportPath) customersByCityReport.Load(reportPath); 7. En la línea siguiente, debajo la carga del informe, enlace la propiedad ReportSource de CrystalReportViewer a la instancia de ReportDocument. myCrystalReportViewer.ReportSource = customersByCityReport crystalReportViewer.ReportSource = customersByCityReport; Resultados Tanto si ha elegido crear una instancia de clase de un informe incrustado como de un informe no incrustado mediante la clase ReportDocument, el nombre de la variable utilizada es el mismo: customersByCityReport. De esta forma, puede utilizar un conjunto de códigos común en los procedimientos que aparecen a continuación. Ahora estará listo para crear y ejecutar el proyecto. Está previsto que falle la carga del informe, porque aún no se ha escrito el código para establecer un valor para el campo de parámetro Ciudad. Agregará un valor para el campo de parámetro Ciudad más adelante en este tutorial. 1.5.2.5.2.3 Para probar la carga del informe CustomersByCity Procedimiento 1. En el menú Generar, seleccione Generar solución. 2. Si existen errores de generación, continúe y corríjalos ahora. 3. Si usa un informe no incrustado en un proyecto Windows, busque el archivo ejecutable de Windows compilado en el subdirectorio \bin\ [Visual Basic] o \bin\debug\ [C#] y, a continuación, copie el informe en dicho subdirectorio. Nota Para que el archivo ejecutable de Windows cargue el informe no incrustado en tiempo de ejecución, el informe deberá estar almacenado en el mismo directorio que el archivo ejecutable de Windows. 4. En el menú Depurar, haga clic en Iniciar. No se muestra el informe CustomersByCity. Se muestra después de agregar un valor para el parámetro Ciudad más adelante en este tutorial. 392 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Nota Los resultados pueden variar según la versión de SAP Crystal Reports que use. En versiones más recientes, verá un formulario que le pedirá que indique valores de parámetro para dicho informe. En versiones anteriores, se produce una excepción "Falta el valor actual del campo de parámetro". En cualquiera caso, debe agregar código adicional para que la aplicación sea completamente funcional. 5. Vuelva a Visual Studio y haga clic en Detener para salir del modo de depuración. 1.5.2.5.3 Configurar parámetros manualmente en el código Ahora ya puede establecer dos valores ("París" y "Tokio") en el campo de parámetro Ciudad del informe CustomersByCity. Esto implica codificación, que puede separar en los siguientes procesos: ● Necesita una constante PARAMETER_FIELD_NAME que incluya el nombre de campo de parámetro "Ciudad", que se usa varias veces en el código. ● El código para agregar los valores actuales al parámetro se utiliza en dos partes distintas de este tutorial; por lo tanto, puede crear este código como método auxiliar independiente. ● En el método ConfigureCrystalReports(), va a agregar los parámetros "Paris" y "Tokyo" a una instancia de ArrayList y va a pasar el informe y la instancia de ArrayList al método auxiliar para que se procesen. En la siguiente sección, aprenderá como obtener los valores predeterminados del campo de parámetro y establecerá dichos valores en un control ListBox. Éstos se utilizan al final del tutorial para seleccionar nuevas ciudades dinámicamente y filtrar el informe basándose en las ciudades seleccionadas recientemente. Continúe con Crear un control ListBox que muestre los parámetros predeterminados [página 398]. 1.5.2.5.3.1 Para crear una constante PARAMETER_FIELD_NAME Procedimiento 1. Regrese a la clase de código subyacente de este Web Forms o Windows Forms. 2. En el nivel de clase, cree una nueva constante de cadena, PARAMETER_FIELD_NAME, y establezca su valor como "Ciudad". Private Const PARAMETER_FIELD_NAME As String = "City" private const string PARAMETER_FIELD_NAME = "City"; Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 393 1.5.2.5.3.2 Para crear un método auxiliar que agregue los valores actuales al parámetro en el informe Contexto Ahora ya puede crear el método auxiliar que agregue los valores actuales al parámetro en el informe. Procedimiento 1. Regrese a la clase de código subyacente de este Web Forms o Windows Forms. 2. Sobre la firma de clase, agregue una declaración "Imports" [Visual Basic] o "using" [C#] en la parte superior de la clase para el espacio de nombres System.Collections (si todavía no se ha declarado este espacio de nombres). Imports System.Collections using System.Collections; Nota Esta declaración se necesita para tener acceso a la clase ArrayList. 3. En la parte inferior de la clase, cree un nuevo método privado denominado SetCurrentValuesForParameterField() con dos variables en la firma de método: ReportDocument y ArrayList. Nota Más adelante en este tutorial, si ha utilizado un informe incrustado, va a pasar la clase de informe incrustado al parámetro del método ReportDocument. ¿Cómo es esto posible? Todas las clases de informes incrustados de SAP Crystal Reports heredan de la clase base ReportDocument. Private Sub SetCurrentValuesForParameterField(ByVal myReportDocument As ReportDocument, ByVal myArrayList As ArrayList) End Sub private void SetCurrentValuesForParameterField(ReportDocument reportDocument, ArrayList arrayList) { } 4. 394 En este método, declare y cree una instancia de la clase indizada ParameterValues como la variable currentParameterValues. © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Nota Para que se pueda tener acceso a la clase ParameterValues, debe haber incluido una declaración "Imports" [Visual Basic] o "using" [C#] en la parte superior de la clase de código subyacente del espacio de nombres CrystalDecisions.Shared. (Esta declaración se ha agregado en Configuración de proyectos [página 14].) Dim currentParameterValues As ParameterValues = New ParameterValues() ParameterValues currentParameterValues = new ParameterValues(); 5. Cree un bucle foreach para obtener todos los valores enviados (como el tipo Objeto) de la instancia de ArrayList. Nota En este método, recupera valores de ArrayList. Posteriormente, va a escribir código que agregue valores a ArrayList. For Each submittedValue As Object In myArrayList Next foreach(object submittedValue in arrayList) { } 6. En el bucle foreach, declare y cree una instancia de la clase ParameterDiscreteValue. Dim myParameterDiscreteValue As ParameterDiscreteValue = New ParameterDiscreteValue() ParameterDiscreteValue parameterDiscreteValue = new ParameterDiscreteValue(); 7. En el bucle foreach, convierta submittedValue en una cadena y pásela a la propiedad Value de la instancia de ParameterDiscreteValue. myParameterDiscreteValue.Value = submittedValue.ToString() parameterDiscreteValue.Value = submittedValue.ToString(); 8. En el bucle foreach, agregue la instancia de ParameterDiscreteValue a la clase indizada currentParameterValues. currentParameterValues.Add(myParameterDiscreteValue) Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 395 currentParameterValues.Add(parameterDiscreteValue); Esto completará el código en el bucle foreach. Coloque el código restante (a partir de los pasos siguientes) después del bucle foreach. 9. Fuera del bucle foreach, obtenga la clase indizada ParameterFieldDefinitions, que proviene de la propiedad DataDefinition de la instancia ReportDocument. Dim myParameterFieldDefinitions As ParameterFieldDefinitions = myReportDocument.DataDefinition.ParameterFields ParameterFieldDefinitions parameterFieldDefinitions = reportDocument.DataDefinition.ParameterFields; 10. Recupere la instancia ParameterFieldDefinition de la clase indizada ParameterFieldDefinitions basada en la entrada de índice de la constante PARAMETER_FIELD_NAME. Dim myParameterFieldDefinition As ParameterFieldDefinition = myParameterFieldDefinitions(PARAMETER_FIELD_NAME) ParameterFieldDefinition parameterFieldDefinition = parameterFieldDefinitions[PARAMETER_FIELD_NAME]; 11. Pase la instancia currentParameterValues al método ApplyCurrentValues de la instancia de ParameterFieldDefinition. myParameterFieldDefinition.ApplyCurrentValues(currentParameterValues) parameterFieldDefinition.ApplyCurrentValues(currentParameterValues); 1.5.2.5.3.3 Para llamar al método SetCurrentValuesForParameterField () antes de enlazar el informe al control CrystalReportViewer Contexto En este procedimiento de varios pasos se ha mostrado el modo de crear un método que recupera los valores enviados desde una instancia de ArrayList y los coloca como valores actuales en una instancia de ParameterFieldDefinition. Ahora, debe llamar a este método antes de enlazar el informe al control CrystalReportViewer, para que el informe sepa que tiene configuración de parámetros. 396 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Procedimiento 1. En el método ConfigureCrystalReports(), agregue un par de saltos de línea al código encima de la línea que enlaza el informe al control CrystalReportViewer. Dentro de estos saltos de línea, ahora puede escribir código adicional que modifique el informe antes de enlazarlo al visor. 2. En los saltos de línea, declare y cree una instancia de ArrayList. Dim myArrayList As ArrayList = New ArrayList() ArrayList arrayList = new ArrayList(); 3. Agregue los nombres de ciudad "París" y "Tokio" como cadenas a la instancia de ArrayList. myArrayList.Add("Paris") myArrayList.Add("Tokyo") arrayList.Add("Paris"); arrayList.Add("Tokyo"); 4. Llame al método SetCurrentValuesForParameterField() y pásele las instancias de CustomersByCityReport y ArrayList. SetCurrentValuesForParameterField(customersByCityReport, myArrayList) SetCurrentValuesForParameterField(customersByCityReport, arrayList); 1.5.2.5.3.4 Para probar la carga del informe CustomersByCity Contexto La línea final del código del método es código que enlaza el informe al control CrystalReportViewer. Ahora estará listo para crear y ejecutar el proyecto. Se espera que el informe se muestre correctamente, porque ahora existe código escrito para establecer los valores actuales en el campo de parámetro. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 397 Procedimiento 1. En el menú Generar, seleccione Generar solución. 2. Si existen errores de generación, continúe y corríjalos ahora. 3. En el menú Depurar, haga clic en Iniciar. El informe CustomersByCity aparecerá correctamente, mostrando la lista de los clientes de París y Tokio. 4. Vuelva a Visual Studio y haga clic en Detener para salir del modo de depuración. 1.5.2.5.4 Crear un control ListBox que muestre los parámetros predeterminados El resto del tutorial trata sobre la visualización de una lista completa de valores predeterminados del campo de parámetro en un control ListBox, y basado en las selecciones que realice en dicho control ListBox, volviendo a filtrar los contenidos del informe. En esta sección aprenderá a rellenar el control ListBox con los valores predeterminados del campo de parámetro. Nota Recuerde que ya estableció los Valores predeterminados, una amplia lista de ciudades, al crear este informe al principio del tutorial. Para hacerlo, deberá agregar y configurar un control ListBox y, a continuación, crear un método auxiliar para rellenar el control ListBox. 1.5.2.5.4.1 formulario Para crear y configurar un control ListBox en el Procedimiento 1. Abra el formulario Web Forms o Windows Forms. 2. En el menú Ver, haga clic en Diseñador. 3. Si está desarrollando un sitio Web, realice las siguientes acciones: ○ Haga clic en el control CrystalReportViewer para seleccionarlo. ○ Presione la FLECHA IZQUIERDA del teclado de modo que aparezca un cursor parpadeante y, a continuación, presione INTRO. El control CrystalReportViewer bajará una línea. 4. 398 Si está desarrollando un proyecto de Windows, realice las siguientes acciones: ○ Haga clic en el control CrystalReportViewer para seleccionarlo. ○ En la ventana Propiedades, establezca el valor de Dock en "Bottom" © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Nota En Visual Studio, cuando selecciona la propiedad Acoplar, se abre un marco en lugar de una lista de opciones. Seleccione la parte del marco que corresponde a "Inferior". 5. ○ Ajuste el tamaño del formulario de Windows y el control CrystalReportViewer de forma que CrystalReportViewer sea lo bastante grande como para mostrar un informe. Deje espacio encima del control CrystalReportViewer para un control ListBox. ○ En la ventana Propiedades, establezca Anchor en "Top, Bottom, Left, Right". ○ Ajuste el tamaño del formulario de Windows y el control CrystalReportViewer de forma que CrystalReportViewer sea lo bastante grande como para mostrar un informe. Deje espacio encima del control CrystalReportViewer para un control ListBox. En el Cuadro de herramientas, arrastre un control ListBox sobre el control CrystalReportViewer. Nota Si aparece una Tarea inteligente en ListBox (si se utiliza Visual Studio), presione Esc para cerrarla. 6. Haga clic en el control ListBox para seleccionarlo. 7. En la ventana Propiedades: 8. ○ Establezca ID o Name en "defaultParameterValuesList". ○ Establezca SelectionMode en "Multiple" (en un proyecto de Windows, "MultiExtended"). En el menú Archivo, seleccione Guardar todo. Resultados Ahora podrá crear un método auxiliar que obtenga los valores predeterminados del campo de parámetro. 1.5.2.5.4.2 Para crear un método auxiliar que obtenga los valores predeterminados del campo de parámetro Procedimiento 1. Abra el formulario Web Forms o Windows Forms. 2. En el menú Ver, haga clic en Código. 3. En la parte inferior de la clase, cree un nuevo método privado denominado GetDefaultValuesFromParameterField() que devuelva una instancia de ArrayList y pase ReportDocument a la firma del método. Private Function GetDefaultValuesFromParameterField(ByVal myReportDocument As ReportDocument) As ArrayList End Function Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 399 private ArrayList GetDefaultValuesFromParameterField(ReportDocument reportDocument) { } 4. En el método GetDefaultValuesFromParameterField(), recupere la clase indizada ParameterFieldDefinitions, que proviene de la propiedad DataDefinition de la instancia de ReportDocument. Dim myParameterFieldDefinitions As ParameterFieldDefinitions = myReportDocument.DataDefinition.ParameterFields ParameterFieldDefinitions parameterFieldDefinitions = reportDocument.DataDefinition.ParameterFields; 5. Recupere la instancia de ParameterFieldDefinition de la clase indizada ParameterFieldDefinitions basada en la entrada de índice de la constante PARAMETER_FIELD_NAME. Dim myParameterFieldDefinition As ParameterFieldDefinition = myParameterFieldDefinitions(PARAMETER_FIELD_NAME) ParameterFieldDefinition parameterFieldDefinition = parameterFieldDefinitions[PARAMETER_FIELD_NAME]; 6. Obtenga una clase indizada ParameterValues (como la variable defaultParameterValues) a partir de la propiedad DefaultValues de la instancia de ParameterFieldDefinition. Dim defaultParameterValues As ParameterValues = myParameterFieldDefinition.DefaultValues ParameterValues defaultParameterValues = parameterFieldDefinition.DefaultValues; 7. Declare y cree una instancia de ArrayList. Dim myArrayList As ArrayList = New ArrayList() ArrayList arrayList = new ArrayList(); 8. Cree un bucle foreach que obtenga cada instancia de ParameterValue a partir de defaultParameterValues. For Each myParameterValue As ParameterValue In defaultParameterValues Next foreach(ParameterValue parameterValue in defaultParameterValues) { } 400 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net En el bucle foreach, cree ahora un bloque condicional anidado que busque valores de parámetros discretos (en oposición a parámetros de rango). Existen dos versiones de este bloque condicional porque la API ha cambiado ligeramente en las distintas versiones de SAP Crystal Reports, versión para programadores de Microsoft Visual Studio. Compruebe su API (mediante IntelliSense) para ver qué propiedad está disponible en ParameterValue: 9. Si la propiedad disponible es IsRange, en el bucle foreach, escriba este código: If (Not myParameterValue.IsRange) Then End If if(!parameterValue.IsRange) { } 10. O bien, si la propiedad disponible es (DiscreteOrRangeKind, una enumeración con tres valores: DiscreteValue, RangeValue, DiscreteAndRangeValue), por cada bucle foreach escriba este código en su lugar: If (myParameterValue.Kind = DiscreteOrRangeKind.DiscreteValue) Then End If if(parameterValue.Kind == DiscreteOrRangeKind.DiscreteValue) { } 11. En este bloque condicional anidado, proyecte la instancia de ParameterValue a su clase ampliada, DiscreteParameterValue. Dim myParameterDiscreteValue As ParameterDiscreteValue = CType(myParameterValue, ParameterDiscreteValue) ParameterDiscreteValue parameterDiscreteValue = (ParameterDiscreteValue)parameterValue; 12. Además, en el bloque condicional anidado, agregue la propiedad Value de la instancia de ParameterDiscreteValue (convertida en cadena) a la instancia de ArrayList. myArrayList.Add(myParameterDiscreteValue.Value.ToString()) arrayList.Add(parameterDiscreteValue.Value.ToString()); 13. Fuera del bloque condicional y del bucle foreach, al final del método, devuelva la instancia de ArrayList del método. Return myArrayList Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 401 return arrayList; 1.5.2.5.4.3 Para enlazar el ArrayList devuelto del método al ListBox de un proyecto Web Contexto Ha obtenido los valores predeterminados del campo de parámetro y los ha devuelto del método como un ArrayList. Ahora enlace este ArrayList al control ListBox defaultParameterValuesList. El código varía ligeramente en función de si se utiliza un proyecto Web o un proyecto de Windows; por lo tanto, asegúrese de que sólo realiza el procedimiento para Web o para Windows. Procedimiento 1. En el método ConfigureCrystalReports(), cree un par de saltos de línea en el código inmediatamente después de la línea de código que agrega el valor de cadena Tokyo a la instancia de ArrayList. En los saltos de línea, ahora puede escribir código adicional que establece el origen de datos para el control ListBox defaultParameterValuesList ListBox cuando la página se carga por primera vez. 2. En los saltos de línea, cree un bloque condicional Not IsPostBack. If Not IsPostBack Then End If if(!IsPostBack) { } Nota El bloque condicional Not IsPostBack se usa para encapsular código que sólo se debe ejecutar la primera vez que se carga la página. Los controles se suelen enlazar a los valores de datos en bloques condicionales Not IsPostBack para que sus valores de datos (y los eventos de control subsiguientes) no se restablezcan cuando se vuelva a cargar la página. 3. En el bloque condicional Not IsPostBack, establezca el valor de la propiedad DataSource del ListBox defaultParameterValuesList en el método auxiliar GetDefaultValuesFromParameterField() y pase la instancia del informe CustomersByCity como parámetro de método. defaultParameterValuesList.DataSource = GetDefaultValuesFromParameterField(customersByCityReport) 402 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net defaultParameterValuesList.DataSource = GetDefaultValuesFromParameterField(customersByCityReport); 4. Aún en el bloque condicional Not IsPostBack, llame al método DataBind() del ListBox defaultParameterValuesList. defaultParameterValuesList.DataBind() defaultParameterValuesList.DataBind(); 1.5.2.5.4.4 Para enlazar el ArrayList devuelto del método al ListBox de un proyecto de Windows Procedimiento 1. En el método ConfigureCrystalReports(), cree un par de saltos de línea en el código inmediatamente después de la línea de código que agrega el valor de cadena Tokyo a la instancia de ArrayList. En los saltos de línea, ahora puede escribir código adicional que establece el origen de datos para el control ListBox defaultParameterValuesList ListBox cuando la página se carga por primera vez. 2. En los saltos de línea, establezca el valor de la propiedad DataSource del ListBox defaultParameterValuesList en el método auxiliar GetDefaultValuesFromParameterField() y pase la instancia del informe CustomersByCity como parámetro de método. defaultParameterValuesList.DataSource = GetDefaultValuesFromParameterField(customersByCityReport) defaultParameterValuesList.DataSource = GetDefaultValuesFromParameterField(customersByCityReport); 1.5.2.5.4.5 Para probar si está relleno el control ListBox defaultParameterValuesList Contexto Ahora estará listo para crear y ejecutar el proyecto para verificar si el ListBox defaultParameterValuesList está relleno. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 403 Procedimiento 1. En el menú Generar, seleccione Generar solución. 2. Si existen errores de generación, continúe y corríjalos ahora. 3. En el menú Depurar, haga clic en Iniciar. El control ListBox defaultParameterValuesList mostrará una lista completa de valores predeterminados (ciudades, en nuestro tutorial). 4. Vuelva a Visual Studio y haga clic en Detener para salir del modo de depuración. Resultados En la siguiente sección, agregará un botón para volver a mostrar el informe basado en las selecciones del control ListBox defaultParameterValuesList. 1.5.2.5.5 Configurar parámetros a partir de las selecciones de ListBox En esta sección, agregará un botón para volver a mostrar el informe basado en las selecciones del control ListBox defaultParameterValuesList. En el método de evento de este botón, llamará al mismo método que se llama al cargar la página por primera vez: SetCurrentValuesForParameterField(). Pero esta vez, en lugar de pasar valores arbitrarios (Paris y Tokyo), pase los valores seleccionados en el control ListBox defaultParameterValuesList. 1.5.2.5.5.1 Para crear y configurar un botón que vuelva a mostrar el informe en el formulario Procedimiento 1. Abra el formulario Web Forms o Windows Forms. 2. En el menú Ver, haga clic en Diseñador. 3. En el Cuadro de herramientas, arrastre un control Button a la derecha del control ListBox. 4. Haga clic en el control Button para seleccionarlo. 5. En la ventana Propiedades: 404 ○ Establezca el valor de ID (o Name) en "redisplay". ○ Establezca Text como "Volver a mostrar el informe". © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Resultados Ahora podrá crear un método de evento de clic de botón que busque los elementos seleccionados en el control ListBox y los pase al método SetCurrentValuesForParameterField(). El código varía ligeramente para un proyecto Web o un proyecto de Windows; por lo tanto, realice sólo el procedimiento para Web o para Windows. 1.5.2.5.5.2 Para crear el método de evento de clic del botón que vuelve a mostrar el informe en un proyecto Web Procedimiento 1. Haga doble clic en el control Button que vuelve a mostrar el informe. Pasa a la clase de código subyacente en la que se ha generado automáticamente un método de evento redisplay_Click(). 2. Sobre la firma de clase, agregue una declaración "Imports" [Visual Basic] o "using" [C#] en la parte superior de la clase para el espacio de nombres System.Web.UI.WebControls (si todavía no se ha declarado este espacio de nombres). Imports System.Web.UI.WebControls using System.Web.UI.WebControls; Nota Esta declaración se necesita para tener acceso a la clase ListItem. 3. En el método de evento redisplay_Click() que se ha generado de manera automática, cree una nueva instancia de un ArrayList. Dim myArrayList As ArrayList = New ArrayList() ArrayList arrayList = new ArrayList(); 4. Cree un bucle foreach para recuperar cada instancia de ListItem a partir de la propiedad Items de defaultParameterValuesList. For Each item As ListItem In defaultParameterValuesList.Items Next foreach(ListItem item in defaultParameterValuesList.Items) Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 405 { } 5. En el bucle foreach, cree un bloque condicional anidado que agregue la instancia de Item a la instancia de Arraylist si la propiedad Selected de la instancia de Item actual está establecida como True. If item.Selected Then myArrayList.Add(item.Value) End If if(item.Selected) { arrayList.Add(item.Value); } 6. Fuera del bloque condicional y del bucle foreach, llame al método SetCurrentValuesForParameterField() y pase la instancia del informe CustomersByCity y la instancia de ArrayList. SetCurrentValuesForParameterField(customersByCityReport, myArrayList) SetCurrentValuesForParameterField(customersByCityReport, arrayList); Ahora que se han aplicado los valores seleccionados del control ListBox como los valores actuales del campo de parámetro, estará listo para volver a mostrar el informe. 7. Vuelva a enlazar la instancia del informe CustomersByCity a la propiedad ReportSource del control CrystalReportViewer. myCrystalReportViewer.ReportSource = customersByCityReport crystalReportViewer.ReportSource = customersByCityReport; 1.5.2.5.5.3 Para crear el método de evento de clic del botón que vuelve a mostrar el informe en un proyecto de Windows Procedimiento 1. Haga doble clic en el control Button que vuelve a mostrar el informe. Pasa a la clase de código subyacente en la que se ha generado automáticamente un método de evento redisplay_Click(). 2. En el método de evento redisplay_Click() que se ha generado de manera automática, cree una nueva instancia de un ArrayList. Dim myArrayList As ArrayList = New ArrayList() 406 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net ArrayList arrayList = new ArrayList(); 3. Cree un bucle foreach para recuperar cada elemento (como String) de la propiedad SelectedItems de defaultParameterValuesList. For Each item As String In defaultParameterValuesList.SelectedItems Next foreach(string item in defaultParameterValuesList.SelectedItems) { } 4. En el bloque condicional, agregue la instancia de String de elemento a la instancia de ArrayList. myArrayList.Add(item) arrayList.Add(item); 5. Fuera del bloque condicional y del bucle foreach, llame al método SetCurrentValuesForParameterField() y pase la instancia del informe CustomersByCity y la instancia de ArrayList. SetCurrentValuesForParameterField(customersByCityReport, myArrayList) SetCurrentValuesForParameterField(customersByCityReport, arrayList); Ahora que se ha aplicado los valores seleccionados del control ListBox como los valores actuales del campo de parámetro, estará listo para volver a mostrar el informe. 6. Vuelva a enlazar la instancia del informe CustomersByCity a la propiedad ReportSource del control CrystalReportViewer. myCrystalReportViewer.ReportSource = customersByCityReport crystalReportViewer.ReportSource = customersByCityReport; 1.5.2.5.5.4 Para probar si está relleno el control ListBox defaultParameterValuesList Contexto Ahora estará preparado para generar y ejecutar el proyecto para verificar que el campo de parámetro se ha restablecido correctamente. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 407 Procedimiento 1. En el menú Generar, seleccione Generar solución. 2. Si existen errores de generación, continúe y corríjalos ahora. 3. En el menú Depurar, haga clic en Iniciar. 4. En el control ListBox, presione la tecla CTRL mientras hace clic para seleccionar al menos cuatro ciudades diferentes en la lista. 5. Haga clic en Volver a mostrar el informe. La página se volverá a cargar y mostrará los registros de cliente para los clientes que vivan en la lista de ciudades que ha seleccionado. 6. Vuelva a Visual Studio y haga clic en Detener para salir del modo de depuración. Resultados Si está trabajando con una aplicación para Windows, ya ha terminado. Si está trabajando con un sitio Web, continúe con Configurar la persistencia de parámetros [página 408]. 1.5.2.5.6 Configurar la persistencia de parámetros En esta sección configurará la persistencia (en un tutorial basado en Web) de las selecciones de campo de parámetro que se han realizado en el control ListBox. Como se ha mostrado en el tutorial Tutorial: Conservar el modelo de objetos ReportDocument con Session [página 337], los cambios efectuados en el modelo de objetos ReportDocument se pierden cuando se vuelve a cargar la página Web, cada vez que los usuarios hagan clic en los botones de la barra de herramientas de CrystalReportViewer (como Página siguiente y Zoom). 1.5.2.5.6.1 Para demostrar la falta de persistencia de las selecciones de parámetro Procedimiento 1. En el menú Generar, seleccione Generar solución. 2. Si existen errores de generación, continúe y corríjalos ahora. 3. En el menú Depurar, haga clic en Iniciar. 4. En el control ListBox, presione la tecla Mayús mientras hace clic para seleccionar todas las ciudades de la lista. 5. Haga clic en Volver a mostrar el informe. La página se vuelve a cargar y, a continuación, muestra los registros de cliente de todos los clientes de todas las ciudades. Es un informe extenso que contiene muchas páginas. 408 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 6. En la barra de herramientas CrystalReportViewer, haga clic en Página siguiente. No se conserva la lista de las ciudades seleccionadas. La página 2 del informe no se muestra. En su lugar, vuelve a aparecer la configuración de parámetros de inicio (París y Tokio). 7. Vuelva a Visual Studio y haga clic en Detener para salir del modo de depuración. Resultados Debe agregar código de persistencia a la aplicación para que se conserven los cambios efectuados en el modelo de objetos ReportDocument cuando se vuelvan a cargar las páginas Web. Para comenzar, va a agregar código de persistencia al método ConfigureCrystalReports() agregando un bloque al bloque condicional Not IsPostBack. A continuación, va a establecer valores únicos para la instancia de ArrayList por cada condición del bloque condicional. Al iniciarse la página, va a establecer los valores predeterminados ("París" y "Tokio") en la instancia de ArrayList. Al volver a cargarse la página, va a recuperar la instancia de ArrayList que está almacenada en Session. 1.5.2.5.6.2 Para agregar código de persistencia al método ConfigureCrystalReports() Procedimiento 1. En el método ConfigureCrystalReports(), corte y pegue las dos líneas de código que agregan Paris y Tokyo al ArrayList en la parte inferior del bloque condicional Not IsPostBack. Cuando haya terminado, el aspecto del bloque condicional debe ser parecido al siguiente: If Not IsPostBack Then defaultParameterValuesList.DataSource = GetDefaultValuesFromParameterField(customersByCityReport) defaultParameterValuesList.DataBind() myArrayList.Add("Paris") myArrayList.Add("Tokyo") End If if (!IsPostBack) { defaultParameterValuesList.DataSource = GetDefaultValuesFromParameterField(customersByCityReport); defaultParameterValuesList.DataBind(); arrayList.Add("Paris"); arrayList.Add("Tokyo"); } 2. Agregue una línea final de código al bloque condicional que asigna la instancia ArrayList a Session. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 409 Nota Puede agregar el nombre de variable como el identificador de cadena para el Session que agregue. Session("myArrayList") = myArrayList Session["arrayList"] = arrayList; 3. Agregue una condición Else al bloque condicional Not IsPostBack. 4. En el bloque Else, obtenga la instancia de ArrayList de Session y proyéctela en un objeto ArrayList. myArrayList = Ctype(Session("myArrayList"), ArrayList) arrayList = (ArrayList)Session["arrayList"]; Resultados Cuando haya terminado, el aspecto del bloque condicional debe ser parecido al siguiente: Estas modificaciones del método ConfigureCrystalReports() garantizan que la instancia actual de ArrayList siempre está disponible para pasarla al método SetCurrentValuesForParameterField(). En la siguiente sección, realizará dos cambios en el código del evento de clic de botón: ● Tomar el ArrayList que ha creado y asignarlo a Session. ● Reemplazar las dos últimas líneas de código (que configuran y muestran el informe) con una llamada al método ConfigureCrystalReports() para realizar esta función en un conjunto común de código. 1.5.2.5.6.3 Para modificar el código del método de evento de clic de botón para que funcione con la persistencia de Session Procedimiento 1. Elimine las dos últimas líneas de código del método de evento de clic de botón. La primera línea de código que se eliminará es la llamada al método SetCurrentValuesForParameterField(). La segunda línea de código que se va a eliminar es el código que enlaza la instancia de customersByCityReport de la propiedad ReportSource del control CrystalReportViewer. En el siguiente paso agregará dos nuevas líneas de código para reemplazar el código eliminado. 2. 410 En el método de evento de clic de botón, inmediatamente fura del bucle foreach, agregue una línea de código que asigne la instancia de ArrayList a Session. © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Nota Puede agregar el nombre de variable como el identificador de cadena para el Session que agregue. Session("myArrayList") = myArrayList Session["arrayList"] = arrayList; 3. Llamar al método ConfigureCrystalReports(). De este modo se obtiene la instancia de ArrayList, la aplica al informe y enlaza el informe al control CrystalReportViewer. ConfigureCrystalReports() ConfigureCrystalReports(); Resultados Ahora estará preparado para generar y ejecutar el proyecto para verificar que el campo de parámetro se ha restablecido correctamente. Nota Un enfoque alternativo a la conservación es conservar la instancia de ReportDocument. Para obtener información sobre cómo conservar la instancia de ReportDocument en Session, vea el tutorial Tutorial: Conservar el modelo de objetos ReportDocument con Session [página 337]. 1.5.2.5.6.4 Para probar si está relleno el control ListBox defaultParameterValuesList Procedimiento 1. En el menú Generar, seleccione Generar solución. 2. Si existen errores de generación, continúe y corríjalos ahora. 3. En el menú Depurar, haga clic en Iniciar. 4. En el control ListBox, presione la tecla Mayús mientras hace clic para seleccionar todas las ciudades de la lista. 5. Haga clic en Volver a mostrar el informe. La página se vuelve a cargar y muestra los registros de cliente de todos los clientes de todas las ciudades. Es un informe extenso que contiene muchas páginas. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 411 6. En la barra de herramientas CrystalReportViewer, haga clic en Página siguiente. 7. Ahora se conserva la lista de las ciudades seleccionadas. Se muestra la página 2 del informe. 8. Vuelva a Visual Studio y haga clic en Detener para salir del modo de depuración. 1.5.2.5.7 discretos Anexo: Mejoras en el código de parámetros Ha creado correctamente un informe con un valor de parámetro discreto y un método auxiliar que puede aceptar cualquier conjunto de valores en un formato común (un ArrayList), así mismo ha aplicado estos valores a un informe basado en un nombre de campo de parámetro específico (la constante PARAMETER_FIELD_NAME). Si ha instalado Visual Studio 2005 o posterior, o SAP Crystal Reports Developer, tiene acceso a la API mejorada que establece los parámetros discretos en el informe Crystal. La API de SAP Crystal Reports Developer ayuda a reducir la cantidad de código necesario para establecer parámetros discretos. En los procedimientos anteriores, ha aprendido a crear el método auxiliar SetCurrentValuesForParameterField(). En este tutorial, puede eliminar el método auxiliar y, en su lugar, llamar al método SetParameterValue() de la clase ReportDocument. El método SetParameterValue() se incluye en los siguientes métodos sobrecargados: ● SetParameterValue(int index, object value) ● SetParameterValue(string parameterFieldName, object value) ● SetParameterValue(string parameterFieldName, object value, string subreport) Puede pasar cualquier tipo de objeto en el que el valor satisfaga los valores predeterminados del campo de parámetro. El objeto puede ser una instancia de Array que almacene una lista de valores de parámetro. Requisitos previos: ● Debe crear un proyecto basado en las instrucciones de Configurar un proyecto para el método ExportToStreamTutorial: Leer y configurar parámetros discretos [página 385]. Sin embargo, en Configurar parámetros manualmente en el código [página 393], sólo debe crear la constante PARAMETER_FIELD_NAME. No necesita crear el método auxiliar SetCurrentValuesForParameterField(). ● Si ya tiene un proyecto basado en las instrucciones de Tutorial: Leer y configurar parámetros discretos [página 385], elimine el método auxiliar SetCurrentValuesForParameterField() y la llamada del método ConfigureCrystalReports(). 1.5.2.5.7.1 Para utilizar el método SetParameterValue() para parámetros discretos Procedimiento 1. Abra el proyecto terminado de este tutorial. 2. Abra el formulario Web Forms o Windows Forms. 412 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 3. En el menú Ver, haga clic en Código. 4. En el método ConfigureCrystalReports(), sobre la línea que enlaza el informe a la propiedad ReportSource del control CrystalReportViewer, llame al método SetParameterValue() de la claseCustomerByCity. Pase el nombre de campo de parámetro y los valores del parámetro en una instancia de Array al método al método. customersByCityReport.SetParameterValue(PARAMETER_FIELD_NAME, arrayList.ToArray()) customersByCityReport.SetParameterValue(PARAMETER_FIELD_NAME, arrayList.ToArray()); Resultados Ahora ya está preparado para generar y ejecutar el proyecto con el fin de leer y configurar parámetros discretos. 1.5.2.6 Tutorial: Leer y configurar parámetros con un subinforme En este tutorial se planteará una complicación adicional: ¿qué sucede si el informe que requiere parámetros contiene un subinforme que requiere parámetros distintos? Nota Para realizr los pasos de este tutorial, debe terminar el tutorial anterior, Tutorial: Leer y configurar parámetros discretos [página 385]. Introducción En el tutorial anterior, Tutorial: Leer y configurar parámetros discretos [página 385], obtuvo información sobre cómo crear un informe con un parámetro y cómo escribir código que estableciera dicho parámetro en tiempo de ejecución, tanto con valores de parámetro codificados como con valores de parámetros pasados desde un control ListBox. En este tutorial, aprenderá a agregar parámetros a un subinforme. Necesita realizar cuatro modificaciones al proyecto que ha creado en Tutorial: Leer y configurar parámetros discretos [página 385]: ● Agregará un subinforme al informe original. Este subinforme direcciona la tabla Pedidos de la base de datos Xtreme. La tabla Pedidos está relacionada con la tabla Clientes que se ha utilizado en el tutorial anterior mediante una clave externa ID del cliente. ● Agregará un parámetro de rango al subinforme que filtre por un rango de fechas de pedido. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 413 ● Agregue dos controles Text al formulario, orderStartDate y orderEndDate, para establecer el rango de fechas de pedido en tiempo de ejecución. ● Va a agregar un nuevo método. Este método crea una instancia de ParameterRangeValue que contiene los valores startDate y endDate values, y, a continuación, pasa dicha instancia de ParameterRangeValue al parámetro de rango en el subinforme. Cuando termine este tutorial, podrá filtrar los valores que se muestran en el informe en tiempo de ejecución. El código que agregue limita el número de ciudades que se muestran en el informe principal, así como el rango de las fechas de pedido que se muestran en el subinforme. Este tutorial también se puede realizar con clases del modelo de objetos CrystalReportViewer, aunque se prefiere el modelo de objetos ReportDocument. Código de ejemplo Este tutorial incluye código de ejemplo de C# y Visual Basic que muestra la versión finalizada del proyecto. Siga las instrucciones de este tutorial para crear un nuevo proyecto o para abrir el proyecto de código de ejemplo y trabajar con una versión finalizada. El código de ejemplo se almacena en carpetas que están clasificadas por idioma y tipo de proyecto. Los nombres de las carpetas de cada versión del código de ejemplo son los siguientes: ● Sitio Web en C#: CS_Web_RDObjMod_ParametersSubrpt ● Proyecto para Windows en C#: CS_Win_RDObjMod_ParametersSubrpt ● Sitio Web en Visual Basic: VB_Web_RDObjMod_ParametersSubrpt ● Proyecto para Windows en Visual Basic: VB_Win_RDObjMod_ParametersSubrpt Base de datos Xtreme Este tutorial utiliza una base de datos de muestra llamada Xtreme. El archivo de base de datos xtreme.mdb se incluye en el paquete de código de muestra del SDK de SAP Crystal Reports .NET. Para usar la base de datos Xtreme, deberá crear manualmente una conexión ODBC a ella. Información relacionada Elegir el modelo de objetos correcto para el proyecto [página 31] Tutorial: Leer y configurar parámetros de rango para un subinforme [página 274] En este tutorial se planteará una complicación adicional: ¿qué sucede si el informe contiene un subinforme que requiere parámetros distintos? Directorio de informes de muestra [página 14] 414 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 1.5.2.6.1 Agregar un subinforme al informe original Para empezar, agregará un subinforme al informe original. 1.5.2.6.1.1 Para agregar un subinforme Procedimiento 1. Abra el proyecto creado en el tutorial anterior, Tutorial: Leer y configurar parámetros discretos [página 385]. 2. En el Explorador de soluciones, haga doble clic en el informe CustomersByCity para abrirlo. 3. Haga clic con el botón secundario en la barra gris Detalles y seleccione Insertar sección abajo. 4. Haga clic con el botón secundario en la nueva sección Detalles b que ha creado, seleccione Insertar y, a continuación, haga clic en Subinforme. Aparece un cuadrado gris alrededor del cursor del mouse. 5. Arrastre el rectángulo gris en la nueva sección Detalles b y, a continuación, haga clic para soltarlo. 6. En el cuadro de diálogo Insertar subinforme, en la ficha Subinforme, seleccione Crear un subinforme con el Asistente de informes. Nota El cuadro de diálogo Insertar un subinforme incluye otras opciones que permiten elegir un informe existente y subinformes a petición. Para obtener más información sobre estas funciones, vea Ficha Subinforme (cuadro de diálogo Insertar subinforme) [página 928]. 7. En el campo Nombre del informe nuevo, escriba PedidosClientes. 8. Haga clic en Asistente de informes.... 9. En el panel Orígenes de datos disponibles de la ventana Asistente para la creación de informes estándar, expanda la carpeta Crear nueva conexión. 10. En la subcarpeta que se abre, expanda la carpeta ODBC (RDO). La carpeta contiene el servidor de base de datos, que se ha configurado para el informe al crearlo. Nota Si no se muestra el servidor, siga las instrucciones del tutorial anterior para conectarse con la base de datos Xtreme. 11. Seleccione la tabla Pedidos y haga clic en el símbolo > para moverla al panel Seleccionar tablas y, a continuación, haga clic en Siguiente. 12. En el panel Campos disponibles, seleccione ID del pedido, Fecha del pedido, Fecha de envío y Enviar vía. 13. Haga clic en el símbolo > para mover estos campos al panel Campos a mostrar y, a continuación, haga clic en Finalizar. 14. En el cuadro de diálogo Insertar un subinforme, seleccione la ficha Vínculo. 15. En el panel Campo(s) del informe contenedor para vincular, en la lista Campos disponibles, expanda la tabla Clientes, seleccione ID del cliente y, a continuación, haga clic en el símbolo >. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 415 16. En el panel Vínculo de campo Clientes.ID del cliente que aparece, deje las selecciones predeterminadas inalteradas. Estas selecciones de parámetros y de datos generan automáticamente entre el informe principal y el subinforme. 17. Haga clic en Aceptar. El nuevo subinforme, PedidosClientes, se muestra en la sección Detalles b del informe principal. Nota Al agregar un subinforme a la sección Detalles, el subinforme se muestra por cada fila, lo que agrega un costo de rendimiento al informe. Si no necesita información de subinforme a ese nivel de granularidad, coloque el subinforme en una sección Grupo en vez de hacerlo en una sección Detalles. Resultados Ahora está listo para verificar la configuración del subinforme. 1.5.2.6.1.2 Para verificar la configuración del subinforme Procedimiento 1. En la sección Detalles, haga doble clic en el subinforme PedidosClientes para verlo. En la parte inferior de la vista del diseñador, aparecen botones de desplazamiento para el informe principal y el subinforme PedidosClientes. 2. Si el Explorador de campos no está visible, en la barra de herramientas de Crystal Reports, haga clic en Cambiar la vista del campo. Nota Otro modo de ver el Explorador de campos es ir al menú Crystal Reports y hacer clic en Explorador de campos. 3. En el Explorador de campos, expanda Campos de parámetro. 4. Verifique que el campo de parámetro Pm-Clientes.ID del cliente se ha generado automáticamente al vincular el subinforme. 5. En la barra de herramientas, haga clic en Asistente de selección. 6. En el cuadro de diálogo Asistente de selección, verifique que está establecido el criterio Pedidos.ID del cliente es igual a {Pm-Clientes.ID del cliente} y, a continuación, haga clic en Aceptar. 7. En el menú Archivo, seleccione Guardar todo. 416 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Resultados Ha agregado correctamente un subinforme CustomerOrders al informe CustomersByCity. En la sección siguiente agregará un parámetro OrderDateRange al subinforme. 1.5.2.6.1.3 Para agregar un parámetro OrderDateRange al subinforme Procedimiento 1. En el Explorador de campos, haga clic con el botón secundario en Campos de parámetro y seleccione Nuevo... 2. En el cuadro de diálogo Crear campo de parámetro: ○ Defina el Nombre como OrderDateRange. ○ Establezca el Tipo de valor como Fecha. ○ Defina Texto de solicitud como Especifique un rango de fechas de pedidos para mostrar. ○ Defina Opciones como una sola selección, Rango de valores. 3. Haga clic en Aceptar. 4. En la barra de herramientas, haga clic en Asistente de selección. 5. Haga clic en la ficha Nuevo. 6. En el cuadro de diálogo Elegir campo, expanda la tabla Pedidos, seleccione Fecha del pedido y, a continuación, haga clic en Aceptar. 7. En la nueva ficha Orders.OrderDate, en la lista desplegable de criterios, seleccione fórmula:. 8. Escriba la siguiente fórmula: {Pedidos.Fecha del pedido} en {?OrderDateRange}. 9. Haga clic en Aceptar. 10. En el menú Archivo, seleccione Guardar todo. Resultados Ha agregado correctamente un parámetro OrderDateRange al subinforme y lo ha vinculado a la columna Pedidos.Fecha del pedido. En la sección siguiente agregará código para direccionar el parámetro OrderDateRange en el subinforme. 1.5.2.6.2 Agregar el código de parámetro de subinforme Ahora está listo para agregar el código de parámetro para el subinforme a la clase de código subyacente. Para empezar, cree un método auxiliar privado, SetDateRangeForOrders(). Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 417 1.5.2.6.2.1 Para crear y codificar el método SetDateRangeForOrders() Procedimiento 1. Abra el formulario Web Forms o Windows Forms. 2. En el menú Ver, haga clic en Código. 3. En la parte superior de la clase, agregue dos nuevas constantes debajo de la constante PARAMETER_FIELD_NAME agregada en el tutorial anterior. Private Const SUBREPORT_PARAMETER_FIELD_NAME As String = "OrderDateRange" Private Const SUBREPORT_NAME As String = "CustomerOrders" private const string SUBREPORT_PARAMETER_FIELD_NAME = "OrderDateRange"; private const string SUBREPORT_NAME = "CustomerOrders"; 4. En la parte inferior de la clase, cree un nuevo método privado denominado SetDateRangeForOrders() con tres parámetros: ParameterFields, una cadena startDate y una cadena endDate. Private Sub SetDateRangeForOrders(ByVal myReportDocument As ReportDocument, ByVal startDate As String, ByVal endDate As String) End Sub private void SetDateRangeForOrders(ReportDocument reportDocument, string startDate, string endDate) { } 5. En este método, declare y cree una instancia de la clase ParameterRangeValue. Dim myParameterRangeValue As ParameterRangeValue = New ParameterRangeValue() ParameterRangeValue parameterRangeValue = new ParameterRangeValue(); Nota Para que la clase ParameterRangeValue sea accesible, deberá incluir un enunciado "Imports" [Visual Basic] o "using" [C#] en la parte superior de la clase de código subyacente del espacio de nombres CrystalDecisions.Shared. (Esta declaración se ha agregado en Configuración de proyectos [página 14].) 6. Establezca la propiedad StartValue de la instancia de ParameterRangeValue en el parámetro de método startDate. myParameterRangeValue.StartValue = startDate 418 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net parameterRangeValue.StartValue = startDate; Nota Las propiedades StartValue y EndValue de la clase ParameterRangeValue aceptan valores de tipo Object. Este tipo genérico permite que el valor de rango que se pasa sea de muchos valores, incluidos: texto, número, fecha, moneda o tiempo. 7. Establezca la propiedad EndValue de la instancia de ParameterRangeValue en el parámetro de método endDate. myParameterRangeValue.EndValue = endDate parameterRangeValue.EndValue = endDate; 8. Establezca los límites inferior y superior para que sean bound-inclusive. myParameterRangeValue.LowerBoundType = RangeBoundType.BoundInclusive myParameterRangeValue.UpperBoundType = RangeBoundType.BoundInclusive parameterRangeValue.LowerBoundType = RangeBoundType.BoundInclusive; parameterRangeValue.UpperBoundType = RangeBoundType.BoundInclusive; Nota Para BoundInclusive, los valores de rango superior e inferior no se incluyen en el rango. Ahora está preparado para asignar la instancia de ParameterRangeValue al parámetro del subinforme. 9. Recupere el objeto ParameterFieldDefinitions, que proviene de la propiedad DataDefinition de la instancia de ReportDocument. Nota ParameterFieldDefinitions es una clase indizada que contiene instancias de la clase ParameterFieldDefinition. Dim myParameterFieldDefinitions As ParameterFieldDefinitions = myReportDocument.DataDefinition.ParameterFields ParameterFieldDefinitions parameterFieldDefinitions = reportDocument.DataDefinition.ParameterFields; 10. Recupere la instancia de ParameterFieldDefinition de la clase indizada ParameterFieldDefinitions que se basa en dos valores indizados: el nombre de campo de parámetro de subinforme y el nombre de subinforme. Pase los dos valores de constante que ha declarado al principio de la clase. Dim myParameterFieldDefinition As ParameterFieldDefinition = Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 419 myParameterFieldDefinitions(SUBREPORT_PARAMETER_FIELD_NAME, SUBREPORT_NAME) ParameterFieldDefinition parameterFieldDefinition = parameterFieldDefinitions[SUBREPORT_PARAMETER_FIELD_NAME, SUBREPORT_NAME]; 11. Llame al método Clear() de la propiedad CurrentValues de la instancia de ParameterFieldDefinition para eliminar cualquier valor existente de la propiedad CurrentValues. myParameterFieldDefinition.CurrentValues.Clear() parameterFieldDefinition.CurrentValues.Clear(); 12. Agregue la instancia de ParameterRangeValue, que ha creado anteriormente, a la propiedad CurrentValues de la instancia de ParameterFieldDefinition. myParameterFieldDefinition.CurrentValues.Add(myParameterRangeValue) parameterFieldDefinition.CurrentValues.Add(parameterRangeValue); 13. Llame al método ApplyCurrentValues() y pásele la propiedad CurrentValues de la instancia de ParameterFieldDefinition. myParameterFieldDefinition.ApplyCurrentValues(myParameterFieldDefinition.CurrentV alues) parameterFieldDefinition.ApplyCurrentValues(parameterFieldDefinition.CurrentValue s); Resultados Este procedimiento de varios pasos ha establecido los valores de fecha inicial y final en una instancia de ParameterRangeValue y los ha pasado al parámetro OrderDateRange del subinforme PedidosClientes. 1.5.2.6.3 Agregar controles TextBox para contener valores de parámetro de rango En esta sección, agregará dos controles TextBox que proporcionan los valores de fecha inicial y final en tiempo de ejecución al parámetro de rango OrderDateRange del informe PedidosClientes. 420 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Nota Si implementa este tutorial en un sitio Web, la persistencia de los valores de fecha que el usuario escribe en los cuadros de texto se mantiene mediante ViewState. 1.5.2.6.3.1 Para crear y configurar un botón que vuelva a mostrar el informe en el formulario Procedimiento 1. Abra el formulario Web Forms o Windows Forms. 2. En el menú Ver, haga clic en Diseñador. 3. Si está desarrollando un sitio Web, realice las siguientes acciones: a) Haga clic entre el control ListBox y el control Button. b) Presione INTRO tres veces para crear dos líneas entre el control ListBox y el control Button. c) En la primera línea creada debajo del control ListBox, escriba "Fecha inicial de pedidos". d) En la segunda línea creada debajo del control ListBox, escriba "Fecha final de pedidos". 4. Si está desarrollando un proyecto de Windows, realice las siguientes acciones: a) En el Cuadro de herramientas, arrastre dos controles Label a la derecha del control ListBox. Coloque una etiqueta encima de la otra y ambas encima del control Button. b) Seleccione el primer control Label. En la ventana Propiedades, establezca la propiedad Text en "Fecha inicial de pedidos". c) Seleccione el segundo control Label. En la ventana Propiedades, establezca la propiedad Text en "Fecha final de pedidos". 5. En el Cuadro de herramientas, arrastre un control TextBox hasta la derecha de "Fecha inicial de pedidos". 6. Haga clic en el control TextBox para seleccionarlo. 7. En la ventana Propiedades, establezca ID (o Name) en "orderStartDate". 8. En el Cuadro de herramientas, arrastre un control TextBox hasta la derecha de "Fecha final de pedidos". 9. Haga clic en el control TextBox para seleccionarlo. 10. En la ventana Propiedades, establezca ID (o Name) en "orderEndDate". 11. En el menú Archivo, seleccione Guardar todo. 1.5.2.6.4 Modificar métodos para llamar al subinforme Debe modificar el método ConfigureCrystalReports() y el método de evento redisplay_Click() para recibir información de estos controles TextBox y aplicarlos al método SetDateRangeForOrders() con el fin de que se procese la información de parámetros de los subinformes. En el tutorial anterior, Tutorial: Leer y configurar parámetros discretos [página 385], ha diseñado estos métodos de dos formas distintas, en función de si incluía la persistencia de Session. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 421 Nota Los proyectos de Windows no requieren persistencia de Session. Los sitios Web normalmente requieren persistencia de Session. Elija uno de los procedimientos con pasos siguientes (pero no ambos). Modifique los métodos que excluyen la persistencia de Session o los que la incluyen. 1.5.2.6.4.1 Modificar los métodos que excluyen la persistencia de Session Si ha terminado el tutorial anterior, Tutorial: Leer y configurar parámetros discretos [página 385], y ha excluido la persistencia de Session, realice los siguientes procedimientos. Si desea incluir la persistencia de Session, vea Modificar los métodos que incluyen la persistencia de Session [página 423]. 1.5.2.6.4.1.1 Para modificar el método ConfigureCrystalReports() que excluye la persistencia de Session Procedimiento 1. En el método ConfigureCrystalReports(), agregue un par de saltos de línea al código después de las líneas que asignan "Paris" y "Tokyo" como variables ArrayList. 2. En los saltos de línea, declare y establezca valores codificados para dos variables de cadena, startDate y endDate. Dim startDate As String = "8/1/1997" Dim endDate As String = "8/31/1997" string startDate = "8/1/1997"; string endDate = "8/31/1997"; 3. Agregue un par de saltos de línea en el código encima de la línea que enlaza el informe al control CrystalReportViewer. 4. En los saltos de línea, escriba una llamada al método SetDateRangeForOrders() y pásele el informe CustomersByCity así como las variables startDate y endDate. SetDateRangeForOrders(customersByCityReport, startDate, endDate) SetDateRangeForOrders(customersByCityReport, startDate, endDate); 422 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net A continuación aparece el código original que enlaza el informe al control CrystalReportViewer. 5. En el menú Archivo, seleccione Guardar todo. Resultados A continuación, modificará el método de evento redisplay_Click. 1.5.2.6.4.1.2 Para modificar el método redisplay_Click() que excluye la persistencia de Session Procedimiento 1. En el método de evento redisplay_Click(), agregue un par de saltos de línea al código encima de la línea que enlaza el informe al control CrystalReportViewer. 2. En los saltos de línea, declare y establezca valores para dos variables de cadena, startDate y endDate, de los controles TextBox que ha agregado al formulario Web Forms o Windows Forms. Dim startDate As String = orderStartDate.Text Dim endDate As String = orderEndDate.Text string startDate = orderStartDate.Text; string endDate = orderEndDate.Text; 3. Escriba una llamada al método SetDateRangeForOrders() y pásele el informe CustomersByCity así como las variables startDate y endDate. SetDateRangeForOrders(customersByCityReport, startDate, endDate) SetDateRangeForOrders(customersByCityReport, startDate, endDate); 4. En el menú Archivo, seleccione Guardar todo. 1.5.2.6.4.2 Modificar los métodos que incluyen la persistencia de Session Si ha terminado el tutorial anterior, Tutorial: Leer y configurar parámetros discretos [página 385], y ha incluido la persistencia de Session, realice los siguientes procedimientos. En caso contrario, continúe con Modificar los métodos que excluyen la persistencia de Session [página 422]. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 423 1.5.2.6.4.2.1 Para modificar el método ConfigureCrystalReports() que incluye la persistencia de Session Procedimiento 1. En el método ConfigureCrystalReports(), agregue un par de saltos de línea al código después de la línea que declara y crea una instancia de ArrayList. 2. En los saltos de línea, declare dos variables de cadena, startDate y endDate. Dim startDate As String Dim endDate As String string startDate; string endDate; 3. En el bloque condicional Not IsPostBack, escriba los valores predeterminados para las variables startDate y endDate. startDate = "8/1/1997" endDate = "8/31/1997" startDate = "8/1/1997"; endDate = "8/31/1997"; 4. En el bloque condicional Not IsPostBack, asigne las variables startDate y endDate a Session. Session("startDate") = startDate Session("endDate") = endDate Session["startDate"] = startDate; Session["endDate"] = endDate; 5. En el bloque Else, después de obtener la instancia de ArrayList de Session, obtenga las variables startDate y endDate de Session. startDate = Session("startDate").ToString() endDate = Session("endDate").ToString() startDate = Session["startDate"].ToString(); endDate = Session["endDate"].ToString(); Con este enfoque, se llega al final del bloque con las variables de fecha asignadas en cualquier caso. De este modo se sigue la lógica paralela a la asignación de la variable ArrayList que ha configurado en el tutorial anterior. 6. 424 Agregue un par de saltos de línea en el código encima de la línea que enlaza el informe al control CrystalReportViewer. © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 7. En los nuevos saltos de línea, escriba una llamada al método SetDateRangeForOrders() y pásele el informe CustomersByCity así como las variables startDate y endDate. SetDateRangeForOrders(customersByCityReport, startDate, endDate) SetDateRangeForOrders(customersByCityReport, startDate, endDate); A continuación aparece el código original que enlaza el informe al control CrystalReportViewer. 8. En el menú Archivo, seleccione Guardar todo. Resultados A continuación, modificará el método de evento redisplay_Click. 1.5.2.6.4.2.2 Para modificar el método redisplay_Click() que incluye la persistencia de Session Procedimiento 1. En el método de evento redisplay_Click(), agregue un par de saltos de línea al código después de la línea que asigna la instancia de ArrayList a Session. 2. En los saltos de línea, asigne la propiedad Text del TextBox orderStartDate y orderEndDate a variables de Session. Session("startDate") = orderStartDate.Text Session("endDate") = orderEndDate.Text Session["startDate"] = orderStartDate.Text; Session["endDate"] = orderEndDate.Text; 3. En el menú Archivo, seleccione Guardar todo. Estos valores de Session startDate y endDate se recuperan y aplican cuando se llama al método ConfigureCrystalReports(). Resultados Ahora estará preparado para generar y ejecutar el proyecto para verificar que los valores TextBox restablecen el parámetro de rango del subinforme. w Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 425 1.5.2.6.5 Probar la configuración del parámetro de subinforme Ya está preparado para probar la configuración del parámetro de subinforme desde los valores TextBox. 1.5.2.6.5.1 Para probar la configuración del parámetro de subinforme Procedimiento 1. En el menú Generar, seleccione Generar solución. 2. Si existen errores de generación, continúe y corríjalos ahora. 3. En el menú Depurar, haga clic en Iniciar. 4. En el control ListBox, presione la tecla CTRL mientras hace clic para seleccionar al menos cuatro ciudades diferentes en la lista. 5. En el control TextBox startDate, escriba "1/1/1997". 6. En el control TextBox endDate, escriba "31/12/1997". 7. Haga clic en el botón Volver a mostrar el informe. La página se volverá a cargar y mostrará los registros de cliente para los clientes que vivan en las ciudades de la lista que acaba de seleccionar, así como un subinforme que muestra los pedidos del rango de fechas especificado anteriormente. 8. En el control CrystalReportViewer, aumente el nivel de Zoom al 125%. La página se recargará al 125% de zoom. Se conservan los valores que están seleccionados para ambas ciudades y el rango de fechas de pedido. 9. Vuelva a Visual Studio y haga clic en Detener para salir del modo de depuración. 1.5.2.6.6 Anexo: Mejoras del código de parámetros de rango para subinformes Ha modificado correctamente el proyecto del tutorial para utilizar un informe que contiene un subinforme y ha establecido un rango de fechas de pedidos en el parámetro de rango que se crea en el subinforme. En este apéndice aprenderá a leer y establecer parámetros en un subinforme con funciones de la API mejorada. En los procedimientos anteriores ha aprendido a crear el método auxiliar SetDateRangeForOrders() que utiliza las clases ParameterFieldDefinitions y ParameterFieldDefinition. En este tutorial, debe eliminar las líneas de código que utilizan las clases ParameterFieldDefinitions y ParameterFieldDefinition. A continuación, aprenderá a usar las clases ParameterFields y ParameterField de la API mejorada de SAP Crystal Reports para codificar el método SetDateRangeForOrders(). 426 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Nota La API mejorada incluye el método SetParameterValue(string parameterFieldName, object value, string subreport) para los subinformes con campos de parámetro discretos. Por lo tanto, SetParameterValue() no se puede utilizar en este tutorial porque el subinforme tiene un parámetro de rango. 1.5.2.6.6.1 Para usar la API mejorada de SAP Crystal Reports para subinformes con parámetros de rango Requisitos previos Debe crear un proyecto según las instrucciones de Tutorial: Leer y configurar parámetros con un subinforme [página 413]. Procedimiento 1. Abra el proyecto terminado de este tutorial. 2. Abra el formulario Web Forms o Windows Forms. 3. En el menú Ver, haga clic en Código. 4. En el método SetDateRangeForOrders(), elimine las líneas de código que utilizan las clases ParameterFieldDefinitions o ParameterFieldDefinition. Elimine las siguientes líneas de código: Dim myParameterFieldDefinitions As ParameterFieldDefinitions = myReportDocument.DataDefinition.ParameterFields Dim myParameterFieldDefinition As ParameterFieldDefinition = myParameterFieldDefinitions(SUBREPORT_PARAMETER_FIELD_NAME, SUBREPORT_NAME) myParameterFieldDefinition.CurrentValues.Clear() myParameterFieldDefinition.CurrentValues.Add(myParameterRangeValue) myParameterFieldDefinition.ApplyCurrentValues(myParameterFieldDefinition.CurrentV alues) ParameterFieldDefinitions parameterFieldDefinitions = reportDocument.DataDefinition.ParameterFields; ParameterFieldDefinition parameterFieldDefinition = parameterFieldDefinitions[SUBREPORT_PARAMETER_FIELD_NAME, SUBREPORT_NAME]; parameterFieldDefinition.CurrentValues.Clear(); parameterFieldDefinition.CurrentValues.Add(parameterRangeValue); parameterFieldDefinition.ApplyCurrentValues(parameterFieldDefinition.CurrentValue s); En el siguiente paso, agregará los nuevos métodos de la API de SAP Crystal Reports al método SetDateRangeForOrders(), después del código que establece el tipo de límite de rango. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 427 5. En el método SetDateRangeForOrders(), recupere la instancia de ParameterFields que procede de la propiedad ParameterFields de la instancia de ReportDocument. Dim myParameterFields As ParameterFields = reportDocument.ParameterFields ParameterFields parameterFields = reportDocument.ParameterFields; 6. Recupere la instancia de ParameterField de la clase indizada ParameterFields que se basa en dos valores indizados: el nombre de campo de parámetro de subinforme y el nombre de subinforme. Pase los dos valores de constante que ha declarado al principio de la clase. Dim myParameterField As ParameterField = myParameterFields(SUBREPORT_PARAMETER_FIELD_NAME, SUBREPORT_NAME) ParameterField parameterField = parameterFields[SUBREPORT_PARAMETER_FIELD_NAME, SUBREPORT_NAME]; 7. Llame al método Clear() de la propiedad CurrentValues de la instancia de ParameterField para eliminar cualquier valor existente de la propiedad CurrentValues. myParameterField.CurrentValues.Clear() parameterField.CurrentValues.Clear(); 8. Agregue la instancia de ParameterRangeValue, que ha creado anteriormente, a la propiedad CurrentValues de la instancia de ParameterField. myParameterField.CurrentValues.Add(myParameterRangeValue) parameterField.CurrentValues.Add(parameterRangeValue); Resultados Ahora estará listo para generar y ejecutar el proyecto con el fin de leer y configurar parámetros de rango para un subinforme. 1.5.2.7 Tutorial: Exportar a varios formatos En este tutorial, aprenderá a exportar el informe mediante programación. 428 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Introducción En este tutorial, aprenderá a exportar el informe mediante programación. SAP Crystal Reports puede exportar en una amplia variedad de formatos. Las opciones disponibles dependen de la versión de SAP Crystal Reports que tenga instalada. Cada versión de SAP Crystal Reports, versión para programadores de Microsoft Visual Studio admite las siguientes opciones de exportación: ● SAP Crystal Reports (RPT) ● Sólo lectura de SAP Crystal Reports (RPTR) ● PDF ● Formato de texto enriquecido (RTF) ● Microsoft Word (97-2003) ● Microsoft Excel (97-2003) ● Microsoft Excel (97-2003), sólo datos ● Microsoft Excel (2007), sólo datos ● HTML 4.0 SAP Crystal Reports Developer admite estos formatos adicionales: ● Valores separados (CSV) ● Microsoft Word - Editable (RTF) ● Texto separado por tabuladores (TTX) ● Texto Puede seleccionar cualquiera de estos formatos, haga clic en el botón Exportar del control CrystalReportViewer y exporte un informe en el formato seleccionado al equipo local en el que ejecute SAP Crystal Reports en una aplicación Web o para Windows. Asimismo puede exportar informes mediante programación, a directorios específicos del servidor Web o al equipo con Windows. Para empezar este tutorial, va a agregar un control DropDownList al formulario Web Forms o Windows Forms y, a continuación, a llenarlo con los valores de la enumeración ExportFormatType del espacio de nombres CrystalDecisions.Shared. Después, va a crear tres métodos auxiliares privados que tengan la funcionalidad de exportación y que realicen una configuración específica para cada uno de los formatos exportados. Finalmente, va a crear un método de evento de clic desde un control Button en el formulario Web Forms o Windows Forms y va a llamar a los tres métodos auxiliares privados que realizan la exportación. Código de ejemplo Este tutorial incluye código de ejemplo de C# y Visual Basic que muestra la versión finalizada del proyecto. Siga las instrucciones de este tutorial para crear un nuevo proyecto o para abrir el proyecto de código de ejemplo y trabajar con una versión finalizada. El código de ejemplo se almacena en carpetas que están clasificadas por idioma y tipo de proyecto. Los nombres de las carpetas de cada versión del código de ejemplo son los siguientes: Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 429 ● Sitio Web en C#: CS_Web_RDObjMod_Export ● Proyecto para Windows en C#: CS_Win_RDObjMod_Export ● Sitio Web en Visual Basic: VB_Web_RDObjMod_Export ● Proyecto para Windows en Visual Basic: VB_Win_RDObjMod_Export Información relacionada Directorio de informes de muestra [página 14] 1.5.2.7.1 Agregar controles a los formularios Web Forms o Windows Forms En esta sección, va a agregar controles DropDownList, Button y Label sobre el control CrystalReportViewer en el formulario Web Forms o Windows Forms. 1.5.2.7.1.1 Para agregar controles a los formularios Web Forms o Windows Forms Procedimiento 1. Abra el formulario Web Forms o Windows Forms. 2. En el menú Ver, haga clic en Diseñador. 3. Si está desarrollando un sitio Web, realice las siguientes acciones: a) Haga clic en el control CrystalReportViewer para seleccionarlo. b) Presione la FLECHA IZQUIERDA del teclado de modo que aparezca un cursor parpadeante y, a continuación, presione INTRO. El control CrystalReportViewer bajará una línea. 4. Si está desarrollando un proyecto de Windows, realice las siguientes acciones: a) Haga clic en el control CrystalReportViewer para seleccionarlo. b) Ajuste el tamaño del control CrystalReportViewer, para que disponga del espacio necesario sobre él para un control ComboBox. c) En la ventana Propiedades, establezca el valor de Anchor en "Top, Bottom, Left, Right". 5. En el Cuadro de herramientas, arrastre los controles DropDownList (en sitios Web) o ComboBox (en proyectos Windows) sobre el control CrystalReportViewer. Nota Si aparece una tarea inteligente en DropDownList (ComboBox) cuando utilice Visual Studio 2005 o posterior, presione Esc para cerrarla. 430 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 6. Haga clic en el control DropDownList (ComboBox) para seleccionarlo. 7. En la ventana Propiedades, establezca el valor de la propiedad ID en "exportTypesList". 8. En el Cuadro de herramientas, arrastre un control Button hasta la derecha del control DropDownList (ComboBox). 9. Haga clic en el control Button para seleccionarlo. 10. Desde la ventana Propiedades siga estos pasos: ○ Establezca el valor de la propiedad ID en "exportByType". ○ Establezca el valor de la propiedad Text en "Export As Selected Type". 11. En el Cuadro de herramientas, arrastre un control Label hasta la derecha del control Button. 12. Haga clic en el control Label para seleccionarlo. 13. Desde la ventana Propiedades siga estos pasos: ○ Establezca el valor de la propiedad ID en "message". ○ Establezca el valor de la propiedad Text para que esté vacía. ○ Establezca el valor de la propiedad Visible en "False". 14. En el menú Archivo, seleccione Guardar todo. Resultados Ahora debe llenar el control DropDownList desde la enumeración ExportFormatType del espacio de nombres CrystalDecisions.Shared. 1.5.2.7.1.2 Para llenar el control DropDownList desde la enumeración ExportFormatType para un sitio Web Procedimiento 1. Abra el formulario Web Forms. 2. En el menú Ver, haga clic en Código. 3. En el método ConfigureCrystalReports(), elimine todas las líneas de código que van a continuación del bloque condicional Not IsPostBack. If Not IsPostBack Then End If if (!IsPostBack) { } Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 431 4. En el bloque condicional, establezca el valor de la propiedad DataSource del control ComboBox de exportTypesList en los valores de la enumeración ExportFormatType. exportTypesList.DataSource = System.Enum.GetValues(GetType(ExportFormatType)) exportTypesList.DataSource = System.Enum.GetValues(typeof(ExportFormatType)); 5. Llame al método DataBind() del control DropDownList exportTypesList para enlazar los valores al control. exportTypesList.DataBind() exportTypesList.DataBind(); 1.5.2.7.1.3 Para llenar el control DropDownList desde la enumeración ExportFormatType para un proyecto de Windows Procedimiento 1. Abra el formulario Windows Forms. 2. En el menú Ver, haga clic en Código. 3. En el método ConfigureCrystalReports(), en su parte inferior, establezca el valor de la propiedad DataSource del control ComboBox exportTypesList en los valores de la enumeración ExportFormatType. exportTypesList.DataSource = System.Enum.GetValues(GetType(ExportFormatType)) exportTypesList.DataSource = System.Enum.GetValues(typeof(ExportFormatType)); 1.5.2.7.2 Crear métodos que realizan la exportación En esta sección va a crear los siguientes métodos auxiliares privados que realizan la exportación. ● ExportSetup() ● ExportSelection() ● ExportCompletion() A estos métodos se llama más adelante en este tutorial desde un método de evento de clic de botón. Para empezar, cree el método auxiliar ExportSetup(). 432 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 1.5.2.7.2.1 Para crear el método ExportSetup() Procedimiento 1. Abra el formulario Web Forms o Windows Forms. 2. En el menú Ver, haga clic en Código. 3. En la parte superior de la clase, agregue tres declaraciones de clase. Private exportPath As String Private myDiskFileDestinationOptions As DiskFileDestinationOptions Private myExportOptions As ExportOptions private string exportPath; private DiskFileDestinationOptions diskFileDestinationOptions; private ExportOptions exportOptions; Más tarde va a crear una instancia de esas clases auxiliares en el método ExportSetup(). 4. En la parte inferior de la clase, cree un método auxiliar privado denominado ExportSetup() sin valor de devolución. Public Sub ExportSetup() End Sub private void ExportSetup() { } 5. En el método, establezca el valor de la variable de cadena exportPath en el directorio raíz del disco duro. exportPath = "C:\Exported\" exportPath = "C:\\Exported\\"; Nota Si desea colocar la carpeta Exported en el directorio Web del servidor Web, agregue un prefijo al nombre de la carpeta con la propiedad Request.PhysicalApplicationPath. 6. Cree un bloque condicional que compruebe si ya existe el directorio de la cadena exportPath. If Not System.IO.Directory.Exists(exportPath) Then End If if (!System.IO.Directory.Exists(exportPath)) Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 433 { } 7. En el bloque condicional, llame al método CreateDirectory() de System.IO.Directory para crear el directorio en la cadena exportPath. System.IO.Directory.CreateDirectory(exportPath) System.IO.Directory.CreateDirectory(exportPath); 8. Fuera del bloque condicional, cree una instancia de la clase DiskFileDesintationOptions. myDiskFileDestinationOptions = New DiskFileDestinationOptions() diskFileDestinationOptions = new DiskFileDestinationOptions(); 9. Llene la instancia de ExportOptions con la propiedad ExportOptions de la instancia de hierarchicalGroupingReport. myExportOptions = hierarchicalGroupingReport.ExportOptions exportOptions = hierarchicalGroupingReport.ExportOptions; 10. Establezca el valor de la propiedad ExportDestinationType de la instancia de ExportOptions en la selección de la enumeración ExportDestinationType.DiskFile. myExportOptions.ExportDestinationType = ExportDestinationType.DiskFile exportOptions.ExportDestinationType = ExportDestinationType.DiskFile; 11. Para el proyecto de Windows, borre los valores de la propiedad ExportFormatOptions de la instancia de ExportOptions. (Esa línea de código no es necesaria para un sitio Web ya que la variable se borra automáticamente en cada evento de clic). myExportOptions.ExportFormatOptions = Nothing exportOptions.ExportFormatOptions = null; Resultados Ahora va a crear el método auxiliar ExportSelection(). 434 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 1.5.2.7.2.2 Para crear el método ExportSelection() Procedimiento 1. Abra el formulario Web Forms o Windows Forms. 2. En el menú Ver, haga clic en Código. 3. En la parte superior de la clase, agregue una declaración booleana que se utilice para comprobar si se ha seleccionado un formato de exportación. Private selectedNoFormat As Boolean = True private bool selectedNoFormat = true; 4. En la parte inferior de la clase, cree un método auxiliar privado denominado ExportSelection() sin valor de devolución. Public Sub ExportSelection() End Sub private void ExportSelection() { } 5. En el método, cree un enunciado "Select Case" [Visual Basic] o "switch" [C#] que haga referencia a los miembros de la enumeración ExportFormatType. La enumeración se basa en SelectedIndex del control exportTypesList DropDownList creado en el procedimiento anterior. Select Case exportTypesList.SelectedIndex Case ExportFormatType.NoFormat Case ExportFormatType.CrystalReport Case ExportFormatType.RichText Case ExportFormatType.WordForWindows Case ExportFormatType.Excel Case ExportFormatType.PortableDocFormat Case ExportFormatType.HTML32 Case ExportFormatType.HTML40 Case Else End Select switch ((ExportFormatType)exportTypesList.SelectedIndex) { Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 435 } case ExportFormatType.NoFormat: break; case ExportFormatType.CrystalReport: break; case ExportFormatType.RichText: break; case ExportFormatType.WordForWindows: break; case ExportFormatType.Excel: break; case ExportFormatType.PortableDocFormat: break; case ExportFormatType.HTML32: break; case ExportFormatType.HTML40: break; default: break; Resultados Ha finalizado el método ExportSelection(). Para empezar, cree el método auxiliar ExportCompletion(). 1.5.2.7.2.3 Para crear el método ExportCompletion() Procedimiento 1. Abra el formulario Web Forms o Windows Forms. 2. En el menú Ver, haga clic en Código. 3. En la parte inferior de la clase, cree un método auxiliar privado denominado ExportCompletion() sin valor de devolución. Public Sub ExportCompletion() End Sub private void ExportCompletion() { } 4. En el método, cree un bloque try/catch con la clase Exception a la que se hace referencia como variable denominada "ex". Try Catch ex As Exception End Try 436 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net try { } catch (Exception ex) { } 5. En el bloque try, cree un bloque condicional para probar la variable booleana selectedNoFormat. If selectedNoFormat Then Else End If if (selectedNoFormat) { } else { } 6. En el bloque If, establezca el valor de la propiedad Text del control Label del mensaje en la constante FORMAT_NOT_SUPPORTED de la clase MessageConstants. message.Text = MessageConstants.FORMAT_NOT_SUPPORTED message.Text = MessageConstants.FORMAT_NOT_SUPPORTED; 7. En el bloque Else, llame al método Export() de la instancia de hierarchicalGroupingReport. hierarchicalGroupingReport.Export() hierarchicalGroupingReport.Export(); 8. Aún en este bloque Else, establezca el valor de la propiedad Text del control Label del mensaje en la constante SUCCESS de la clase MessageConstants. message.Text = MessageConstants.SUCCESS message.Text = MessageConstants.SUCCESS; 9. En el bloque catch, establezca el valor de la propiedad Text del control Label del mensaje en la constante FAILURE de la clase MessagesConstants y, a continuación, agréguele la propiedad Message del parámetro Exception. message.Text = MessageConstants.FAILURE & ex.Message Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 437 message.Text = MessageConstants.FAILURE + ex.Message; 10. Fuera del bloque try/catch, establezca el valor de la propiedad Visible del control Label del mensaje en "True". message.Visible = True message.Visible = true; Resultados Ya ha terminado de crear los tres métodos auxiliares privados que realizan la exportación. 1.5.2.7.3 Crear métodos que configuran varios formatos de exportación En esta sección, va a crear los métodos auxiliares privados que configuran los diversos formatos de exportación. Todos estos métodos se utilizan de forma similar, salvo ConfigureExportToHtml32() y ConfigureExportToHtml40(), que proporcionan formas distintas de exportar al formato HTML. ● ConfigureExportToRpt() ● ConfigureExportToRtf() ● ConfigureExportToDoc() ● ConfigureExportToXls() ● ConfigureExportToPdf() ● ConfigureExportToHtml32() ● ConfigureExportToHtml40() 1.5.2.7.3.1 Para crear el método auxiliar ConfigureExportToRpt() Procedimiento 1. Abra el formulario Web Forms o Windows Forms. 2. En el menú Ver, haga clic en Código. 3. En la parte inferior de la clase, cree un método auxiliar privado denominado ConfigureExportToRpt() sin valor de devolución. Public Sub ConfigureExportToRpt() 438 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net End Sub private void ConfigureExportToRpt() { } 4. En el método, establezca el valor de la propiedad ExportFormatType de la instancia de ExportOptions en la selección de enumeración ExportFormatType CrystalReport. myExportOptions.ExportFormatType = ExportFormatType.CrystalReport exportOptions.ExportFormatType = ExportFormatType.CrystalReport; 5. Establezca el valor de la propiedad DiskFileName de la instancia de DiskFileDestinationOptions en la cadena exportPath y, a continuación, agréguele el nombre de un documento con una extensión de archivo .rpt. myDiskFileDestinationOptions.DiskFileName = exportPath & "Report.rpt" diskFileDestinationOptions.DiskFileName = exportPath + "Report.rpt"; 6. Finalmente, establezca el valor de la propiedad ExportDestinationOptions de la instancia de ExportOptions en la instancia de DiskFileDestinationOptions configurada en el paso anterior. myExportOptions.ExportDestinationOptions = myDiskFileDestinationOptions exportOptions.ExportDestinationOptions = diskFileDestinationOptions; 1.5.2.7.3.2 Para crear el método auxiliar ConfigureExportToRtf Procedimiento 1. Abra el formulario Web Forms o Windows Forms. 2. En el menú Ver, haga clic en Código. 3. En la parte inferior de la clase, cree un método auxiliar privado denominado ConfigureExportToRtf() sin valor de devolución. Public Sub ConfigureExportToRtf() End Sub Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 439 private void ConfigureExportToRtf() { } 4. En el método, establezca el valor de la propiedad ExportFormatType de la instancia de ExportOptions en la selección de enumeración ExportFormatType RichText. myExportOptions.ExportFormatType = ExportFormatType.RichText exportOptions.ExportFormatType = ExportFormatType.RichText; 5. Establezca el valor de la propiedad DiskFileName de la instancia de DiskFileDestinationOptions en la cadena exportPath y, a continuación, agréguele el nombre de un documento con una extensión de archivo .rtf. myDiskFileDestinationOptions.DiskFileName = exportPath & "RichTextFormat.rtf" diskFileDestinationOptions.DiskFileName = exportPath + "RichTextFormat.rtf"; 6. Finalmente, establezca el valor de la propiedad ExportDestinationOptions de la instancia de ExportOptions en la instancia de DiskFileDestinationOptions configurada en el paso anterior. myExportOptions.ExportDestinationOptions = myDiskFileDestinationOptions exportOptions.ExportDestinationOptions = diskFileDestinationOptions; 1.5.2.7.3.3 Para crear el método auxiliar ConfigureExportToDoc Procedimiento 1. Abra el formulario Web Forms o Windows Forms. 2. En el menú Ver, haga clic en Código. 3. En la parte inferior de la clase, cree un método auxiliar privado denominado ConfigureExportToDoc() sin valor de devolución. Public Sub ConfigureExportToDoc() End Sub private void ConfigureExportToDoc() 440 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net { } 4. En el método, establezca el valor de la propiedad ExportFormatType de la instancia de ExportOptions en la selección de enumeración ExportFormatType WordForWindows. myExportOptions.ExportFormatType = ExportFormatType.WordForWindows exportOptions.ExportFormatType = ExportFormatType.WordForWindows; 5. Establezca el valor de la propiedad DiskFileName de la instancia de DiskFileDestinationOptions en la cadena exportPath y, a continuación, agréguele el nombre de un documento con una extensión de archivo .doc. myDiskFileDestinationOptions.DiskFileName = exportPath & "Word.doc" diskFileDestinationOptions.DiskFileName = exportPath + "Word.doc"; 6. Finalmente, establezca el valor de la propiedad ExportDestinationOptions de la instancia de ExportOptions en la instancia de DiskFileDestinationOptions configurada en el paso anterior. myExportOptions.ExportDestinationOptions = myDiskFileDestinationOptions exportOptions.ExportDestinationOptions = diskFileDestinationOptions; 1.5.2.7.3.4 Para crear el método auxiliar ConfigureExportToXls Procedimiento 1. Abra el formulario Web Forms o Windows Forms. 2. En el menú Ver, haga clic en Código. 3. En la parte inferior de la clase, cree un método auxiliar privado denominado ConfigureExportToXls() sin valor de devolución. Public Sub ConfigureExportToXls() End Sub private void ConfigureExportToXls() { } Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 441 4. En el método, establezca el valor de la propiedad ExportFormatType de la instancia de ExportOptions en la selección de enumeración ExportFormatType Excel. myExportOptions.ExportFormatType = ExportFormatType.Excel exportOptions.ExportFormatType = ExportFormatType.Excel; 5. Establezca el valor de la propiedad DiskFileName de la instancia de DiskFileDestinationOptions en la cadena exportPath y, a continuación, agréguele el nombre de un documento con una extensión de archivo .xls. myDiskFileDestinationOptions.DiskFileName = exportPath & "Excel.xls" diskFileDestinationOptions.DiskFileName = exportPath + "Excel.xls"; 6. Finalmente, establezca el valor de la propiedad ExportDestinationOptions de la instancia de ExportOptions en la instancia de DiskFileDestinationOptions configurada en el paso anterior. myExportOptions.ExportDestinationOptions = myDiskFileDestinationOptions exportOptions.ExportDestinationOptions = diskFileDestinationOptions; 1.5.2.7.3.5 Para crear el método auxiliar ConfigureExportToPdf Procedimiento 1. Abra el formulario Web Forms o Windows Forms. 2. En el menú Ver, haga clic en Código. 3. En la parte inferior de la clase, cree un método auxiliar privado denominado ConfigureExportToPdf() sin valor de devolución. Public Sub ConfigureExportToPdf() End Sub private void ConfigureExportToPdf() { } 442 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 4. En el método, establezca el valor de la propiedad ExportFormatType de la instancia de ExportOptions en la selección de enumeración ExportFormatType PortableDocFormat. myExportOptions.ExportFormatType = ExportFormatType.PortableDocFormat exportOptions.ExportFormatType = ExportFormatType.PortableDocFormat; 5. Establezca el valor de la propiedad DiskFileName de la instancia de DiskFileDestinationOptions en la cadena exportPath y, a continuación, agréguele el nombre de un documento con una extensión de archivo .pdf. myDiskFileDestinationOptions.DiskFileName = exportPath & "PortableDoc.pdf" diskFileDestinationOptions.DiskFileName = exportPath + "PortableDoc.pdf"; 6. Finalmente, establezca el valor de la propiedad ExportDestinationOptions de la instancia de ExportOptions en la instancia de DiskFileDestinationOptions configurada en el paso anterior. myExportOptions.ExportDestinationOptions = myDiskFileDestinationOptions exportOptions.ExportDestinationOptions = diskFileDestinationOptions; 1.5.2.7.3.6 Para crear el método auxiliar ConfigureExportToHtml32 Procedimiento 1. Abra el formulario Web Forms o Windows Forms. 2. En el menú Ver, haga clic en Código. 3. En la parte inferior de la clase, cree un método auxiliar privado denominado ConfigureExportToHtml32() sin valor de devolución. Public Sub ConfigureExportToHtml32() End Sub private void ConfigureExportToHtml32() { } Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 443 4. En el método, establezca el valor de la propiedad ExportFormatType de la instancia de ExportOptions en la selección de enumeración ExportFormatType HTML32. myExportOptions.ExportFormatType = ExportFormatType.HTML32 exportOptions.ExportFormatType = ExportFormatType.HTML32; 5. Declare y cree una instancia de la clase HTMLFormatOptions con el nombre de variable "html32FormatOptions". Dim html32FormatOptions As HTMLFormatOptions = New HTMLFormatOptions() HTMLFormatOptions html32FormatOptions = new HTMLFormatOptions(); 6. Establezca el valor de la propiedad HTMLBaseFolderName de la instancia de html32FormatOptions en la cadena exportPath y el nombre "Html32Folder". html32FormatOptions.HTMLBaseFolderName = exportPath & "Html32Folder" html32FormatOptions.HTMLBaseFolderName = exportPath + "Html32Folder"; 7. Establezca el valor de la propiedad HTMLFileName de la instancia de html32FormatOptions en el nombre "html32.html". html32FormatOptions.HTMLFileName = "html32.html" html32FormatOptions.HTMLFileName = "html32.html"; 8. Establezca el valor de la propiedad HTMLEnableSeparatedPage de la instancia de html32FormatOptions en "False". html32FormatOptions.HTMLEnableSeparatedPages = False html32FormatOptions.HTMLEnableSeparatedPages = false; 9. Establezca el valor de la propiedad HTMLHasPageNavigator de la instancia de html32FormatOptions en "False". html32FormatOptions.HTMLHasPageNavigator = False html32FormatOptions.HTMLHasPageNavigator = false; 444 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 10. Finalmente, asigne la instancia de html32FormatOptions a la propiedad FormatOptions de la instancia ExportOptions. myExportOptions.ExportFormatOptions = html32FormatOptions exportOptions.ExportFormatOptions = html32FormatOptions; 1.5.2.7.3.7 Para crear el método auxiliar ConfigureExportToHtml40 Procedimiento 1. Abra el formulario Web Forms o Windows Forms. 2. En el menú Ver, haga clic en Código. 3. En la parte inferior de la clase, cree un método auxiliar privado denominado ConfigureExportToHtml40() sin valor de devolución. Public Sub ConfigureExportToHtml40() End Sub private void ConfigureExportToHtml40() { } 4. En el método, establezca el valor de la propiedad ExportFormatType de la instancia de ExportOptions en la selección de enumeración ExportFormatType HTML40. myExportOptions.ExportFormatType = ExportFormatType.HTML40 exportOptions.ExportFormatType = ExportFormatType.HTML40; 5. Declare y cree una instancia de la clase HTMLFormatOptions con el nombre de variable "html40FormatOptions". Dim html40FormatOptions As HTMLFormatOptions = New HTMLFormatOptions() HTMLFormatOptions html40FormatOptions = new HTMLFormatOptions(); Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 445 6. Establezca el valor de la propiedad HTMLBaseFolderName de la instancia de html40FormatOptions en la cadena exportPath y el nombre "Html40Folder". html40FormatOptions.HTMLBaseFolderName = exportPath & "Html40Folder" html40FormatOptions.HTMLBaseFolderName = exportPath + "Html40Folder"; 7. Establezca el valor de la propiedad html40FormatOptions de la instancia de html32FormatOptions en el nombre "html40.html". html40FormatOptions.HTMLFileName = "html40.html" html40FormatOptions.HTMLFileName = "html40.html"; 8. Establezca el valor de la propiedad HTMLEnableSeparatedPage de la instancia de html40FormatOptions en "True". html40FormatOptions.HTMLEnableSeparatedPages = True html40FormatOptions.HTMLEnableSeparatedPages = true; 9. Establezca el valor de la propiedad HTMLHasPageNavigator de la instancia de html40FormatOptions en "True". html40FormatOptions.HTMLHasPageNavigator = True html40FormatOptions.HTMLHasPageNavigator = true; 10. Establezca el valor de la propiedad FirstPageNumber de la instancia de html40FormatOptions en 1. html40FormatOptions.FirstPageNumber = 1 html40FormatOptions.FirstPageNumber = 1; 11. Establezca el valor de la propiedad LastPageNumber de la instancia de html40FormatOptions en 3. html40FormatOptions.LastPageNumber = 3 html40FormatOptions.LastPageNumber = 3; 446 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 12. Finalmente, asigne la instancia de html40FormatOptions a la propiedad FormatOptions de la instancia de ExportOptions. myExportOptions.FormatOptions = html40FormatOptions exportOptions.FormatOptions = html40FormatOptions; Resultados Ha creado los métodos auxiliares privados que configuran los diversos formatos de exportación. 1.5.2.7.4 Llamar a los métodos desde la instrucción Case En la lección anterior ha creado una instrucción Case en el método ExportSelection() con varias instrucciones Case. Cada una de ellas está vinculada a una selección de la enumeración ExportFormatType. Llame ahora a cada método de configuración desde la instrucción Case correspondiente y defina el valor de la variable booleana selectedNoFormat. 1.5.2.7.4.1 Case Para llamar a los métodos desde la instrucción Procedimiento 1. 2. Localice el método ExportSelection() que ha creado en la versión anterior. En la instrucción Case Select Case [Visual Basic] o switch [C#], en la que corresponda a ExportFormatType.NoFormat, establezca el valor de la variable booleana selectedNoFormat en True. selectedNoFormat = True selectedNoFormat = true; 3. En el enunciado Case Select Case [Visual Basic] o switch [C#], en el caso de ExportFormatType.CrystalReport, llame al método ConfigureExportToRpt(). selectedNoFormat = False ConfigureExportToRpt() Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 447 selectedNoFormat = false; ConfigureExportToRpt(); 4. En el enunciado Case Select Case [Visual Basic] o switch [C#], en el caso de ExportFormatType.RichText, llame al método ConfigureExportToRtf(). selectedNoFormat = False ConfigureExportToRtf() selectedNoFormat = false; ConfigureExportToRtf(); 5. En el enunciado Case Select Case [Visual Basic] o switch [C#], en el caso de ExportFormatType.WordForWindows, llame al método ConfigureExportToDoc(). selectedNoFormat = False ConfigureExportToDoc() selectedNoFormat = false; ConfigureExportToDoc(); 6. En el enunciado Case Select Case [Visual Basic] o switch [C#], en el caso de ExportFormatType.Excel, llame al método ConfigureExportToXls(). selectedNoFormat = False ConfigureExportToXls() selectedNoFormat = false; ConfigureExportToXls(); 7. En el enunciado Case Select Case [Visual Basic] o switch [C#], en el caso de ExportFormatType.PortableDocFormat, llame al método ConfigureExportToPdf(). selectedNoFormat = False ConfigureExportToPdf() selectedNoFormat = false; ConfigureExportToPdf(); 8. En el enunciado Case Select Case [Visual Basic] o switch [C#], en el caso de ExportFormatType.HTML32, llame al método ConfigureExportToHtml32(). selectedNoFormat = False ConfigureExportToHtml32() selectedNoFormat = false; ConfigureExportToHtml32(); 448 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 9. En el enunciado Case Select Case [Visual Basic] o switch [C#], en el caso de ExportFormatType.HTML40, llame al método ConfigureExportToHtml40(). selectedNoFormat = False ConfigureExportToHtml40() selectedNoFormat = false; ConfigureExportToHtml40(); 10. En la instrucción Case Select Case [Visual Basic] o switch [C#], en la que corresponda a Switch Else [Visual Basic] o default: [C#], establezca la variable booleana selectedNoFormat en True. selectedNoFormat = True selectedNoFormat = true; Resultados Si va a crear un proyecto en Visual Studio 2005 o posterior, deberá realizar los procedimientos de Crear métodos para los nuevos formatos de exportación [página 451] antes de seguir con Llamar a los métodos para realizar la exportación [página 449]. 1.5.2.7.5 Llamar a los métodos para realizar la exportación Ya está preparado para crear el método de evento de clic de botón para el control exportByType Button y, a continuación, llamar a los métodos para realizar la exportación desde dicho método de evento. 1.5.2.7.5.1 Para crear el método de evento exportByType_Click Procedimiento 1. Abra el formulario Web Forms o Windows Forms. 2. En el menú Ver, haga clic en Diseñador. 3. Haga doble clic en el control exportByType Button. Se crea el método de evento exportByType_Click() y se muestra en la vista Código. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 449 4. En el método de evento exportByType_Click(), especifique llamadas a los tres métodos de evento creados anteriormente para realizar la exportación. ExportSetup() ExportSelection() ExportCompletion() ExportSetup(); ExportSelection(); ExportCompletion(); Resultados Ya está preparado para crear y ejecutar el proyecto y, a continuación, exportar el informe en varios formatos. 1.5.2.7.5.2 Para probar el proyecto Procedimiento 1. En el menú Generar, seleccione Generar solución. 2. Si existen errores de generación, continúe y corríjalos ahora. 3. En el menú Depurar, haga clic en Iniciar. La aplicación Web o para Windows se compila y muestra el informe Hierarchical Grouping. Un control DropDownList presenta varios formatos de exportación y se muestra un botón Exportar como el tipo seleccionado para realizar la exportación. 4. Seleccione uno de los formatos de exportación en el control DropDownList y, a continuación, haga clic en el botón Exportar como el tipo seleccionado. Aparece un mensaje junto al botón que indica si la exportación ha terminado correctamente. De lo contrario, se muestra un mensaje de error. 5. Pruebe a exportar en varios formatos distintos. 6. Vuelva a Visual Studio y haga clic en Detener para salir del modo de depuración. 7. Compruebe en el directorio de archivos exportados del servidor Web o del equipo con Windows si los archivos exportados están en él. 1.5.2.7.6 Anexo: Mejoras del código de exportación Si ha instalado Visual Studio 2005 o posterior, o SAP Crystal Reports, tiene acceso a la API mejorada para exportar el informe de Crystal a varios formatos. 450 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net En la API mejorada de SAP Crystal Reports, la enumeración ExportFormatTypes tiene dos nuevos formatos de exportación: registros de Microsoft Excel (un archivo .xls que sólo contiene los datos) y archivos de texto. Además, ahora tiene los siguientes métodos mejorados de exportación en la clase ReportDocument: ● ExportToDisk(CrystalDecisions.Shared.ExportFormatType formatType, string fileName): exporta un informe a la unidad de disco del servidor Web o al equipo con Windows. ● ExportToHttpResponse(CrystalDecisions.Shared.ExportFormatType formatType, System.Web.HttpResponse response, bool asAttachment, string attachmentName): exporta un informe en el tipo de formato especificado a una ventana de explorador o exporta el informe como datos adjuntos. ● ExportToHttpResponse(CrystalDecisions.Shared.ExportOptions options, System.Web.HttpResponse response, bool asAttachment, string attachmentName): exporta un informe en el tipo de formato especificado a una ventana de explorador o exporta el informe como datos adjuntos. ● ExportToStream(CrystalDecisions.Shared.ExportFormatType formatType): exporta los datos de un informe en el formato especificado a una secuencia de entrada o salida. 1.5.2.7.6.1 Crear métodos para los nuevos formatos de exportación En esta sección, aprenderá a modificar el proyecto, el que creó anteriormente en este tutorial, para incluir los nuevos formatos de exportación. Antes de que modifique el código para incluir los nuevos formatos de exportación, lleve a cabo todos los procedimientos de Tutorial: Exportar a varios formatos [página 428]. 1.5.2.7.6.1.1 Para modificar el código con el fin de que incluya los nuevos formatos de exportación Procedimiento 1. Abra el proyecto terminado de este tutorial. 2. Abra el formulario Web Forms o Windows Forms. 3. En el menú Ver, haga clic en Código. 4. En la instrucción "Select Case" [Visual Basic] o "switch" [C#] del método ExportSelection(), agregue una instrucción Case para el formato ExcelRecord. Case ExportFormatType.ExcelRecord case ExportFormatType.ExcelRecord: break; Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 451 Cree los métodos auxiliares privados que configuran los diversos formatos de exportación. En primer lugar, va a crear el método ConfigureExportToXlsRec() para establecer las opciones de exportación de ExcelRecord. 5. En la parte inferior de la clase, cree un método auxiliar privado denominado ConfigureExportToXlsRec() sin valor devuelto. Public Sub ConfigureExportToXlsRec() End Sub private void ConfigureExportToXlsRec() { } 6. En el método, establezca el valor de la propiedad ExportFormatType de la instancia de ExportOptions en la selección de enumeración ExportFormatType ExcelRecord. myExportOptions.ExportFormatType = ExportFormatType.ExcelRecord exportOptions.ExportFormatType = ExportFormatType.ExcelRecord; 7. Establezca el valor de la propiedad DiskFileName de la instancia de DiskFileDestinationOptions en la cadena exportPath y, a continuación, agréguele el nombre de un documento con una extensión de archivo .xls. myDiskFileDestinationOptions.DiskFileName = exportPath & "ExcelRecord.xls" diskFileDestinationOptions.DiskFileName = exportPath + "ExcelRecord.xls"; 8. Establezca el valor de la propiedad ExportDestinationOptions de la instancia de ExportOptions en la instancia de DiskFileDestinationOptions configurada en el paso anterior. myExportOptions.ExportDestinationOptions = myDiskFileDestinationOptions exportOptions.ExportDestinationOptions = diskFileDestinationOptions; Resultados Ya ha agregado correctamente dos nuevos formatos de exportación al proyecto. Para explorar aún más la API mejorada, elija uno de los siguientes métodos de exportación mejorados: ● Para reducir el código y no tener que establecer el valor de ExportOptions, continúe con Utilizar el método ExportToDisk() [página 453]. ● 452 En un sitio Web, si desea exportar el informe a una ventana de explorador, o como archivo adjunto a una ventana de explorador, continúe con Utilizar el método ExportToHttpResponse() [página 463]. © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net ● Si desea pasar los datos del informe a una secuencia de entrada o salida, continúe con Utilizar el método ExportToStream() [página 468]. 1.5.2.7.6.2 Utilizar el método ExportToDisk() El método ExportToDisk() toma ExportFormatType y un parámetro de nombre de archivo. Este método simplifica la necesidad de utilizar los métodos de configuración de exportación creados en Crear métodos que configuran varios formatos de exportación [página 438]. En esta sección, aprenderá a crear un nuevo proyecto, a modificar un proyecto existente y a agregar código al proyecto para utilizar el método ExportToDisk(). Requisitos previos: ● Debe crear un proyecto basado en las instrucciones de Configurar un proyecto para el método ExportToStreamConfigurar un proyecto para el método ExportToDisk() [página 453]. ● O bien, debe crear un proyecto basado en las instrucciones de Crear métodos para los nuevos formatos de exportación [página 451]. A continuación, debe modificar el proyecto como se describe en Preparar el proyecto para el método ExportToStreamPreparar un proyecto para el método ExportToDisk() [página 455]. 1.5.2.7.6.2.1 Configurar un proyecto para el método ExportToDisk() En esta sección, aprenderá a crear un nuevo proyecto para el método ExportToDisk(). 1.5.2.7.6.2.1.1 Para configurar un nuevo proyecto para el método ExportToDisk() Procedimiento 1. Lleve a cabo todas las instrucciones de Agregar controles a los formularios Web Forms o Windows Forms [página 430]. 2. Cree el método ExportSetup() y el método ExportSelection() en Crear métodos que realizan la exportación [página 432]. 3. En el enunciado "Select Case" [Visual Basic] o "switch" [C#] del método ExportSelection(), agregue una instrucción Case para el formato ExcelRecord. Case ExportFormatType.ExcelRecord Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 453 case ExportFormatType.ExcelRecord: break; 4. Cree un bloque condicional para probar la variable booleana, selectedNoFormat. If selectedNoFormat Then Else End If if (selectedNoFormat) { } else { } 5. En el bloque If, establezca el valor de la propiedad Text del control Label del mensaje en la constante FORMAT_NOT_SUPPORTED de la clase MessageConstants. message.Text = MessageConstants.FORMAT_NOT_SUPPORTED message.Text = MessageConstants.FORMAT_NOT_SUPPORTED; 6. En este bloque Else, establezca el valor de la propiedad Text del control Label del mensaje en la constante SUCCESS de la clase MessageConstants. message.Text = MessageConstants.SUCCESS message.Text = MessageConstants.SUCCESS; 7. Cree un bloque try/catch con la clase Exception a la que se hace referencia como variable denominada "ex". El bloque try incluye los enunciados "Select Case" [Visual Basic] o "switch" [C#], así como el bloque condicional. Try Catch ex As Exception End Try try { } catch (Exception ex) { } 454 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 8. En el bloque catch, establezca el valor de la propiedad Text del control Label del mensaje en la constante FAILURE de la clase MessagesConstants y, a continuación, agréguele la propiedad Message del parámetro Exception. message.Text = MessageConstants.FAILURE & ex.Message message.Text = MessageConstants.FAILURE + ex.Message; 9. Fuera del bloque try/catch, establezca el valor de la propiedad Visible del control Label del mensaje en "True". message.Visible = True message.Visible = true; 10. En el menú Ver, haga clic en Diseñador. 11. Haga doble clic en el control exportByType Button. Se crea el método de evento exportByType_Click() y aparece la vista Código. 12. En el método de evento exportByType_Click(), especifique llamadas a los métodos ExportSetup() y ExportSelection(). ExportSetup() ExportSelection() ExportSetup(); ExportSelection(); 1.5.2.7.6.2.2 Preparar un proyecto para el método ExportToDisk() En esta sección, aprenderá a modificar el proyecto resultante del procedimiento descrito en Crear métodos para los nuevos formatos de exportación [página 451]. Ahora, debe eliminar algunas líneas de código que no son necesarias para el método ExportToDisk(). 1.5.2.7.6.2.2.1 Para modificar el proyecto con el fin de utilizar el método ExportToDisk() Procedimiento 1. Abra el proyecto. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 455 2. Abra el formulario Web Forms o Windows Forms. 3. En el menú Ver, haga clic en Código. 4. En la parte superior de la clase, elimine las siguientes declaraciones de clase: Private myDiskFileDestinationOptions As DiskFileDestinationOptions Private myExportOptions As ExportOptions private DiskFileDestinationOptions diskFileDestinationOptions; private ExportOptions exportOptions; 5. En el método ExportSetup(), elimine todas las líneas de código que van a continuación del bloque condicional. (La última línea de código que llama a la propiedad ExportFormatOptions sólo aparece en los proyectos de Windows.) myDiskFileDestinationOptions = New DiskFileDestinationOptions() myExportOptions = hierarchicalGroupingReport.ExportOptions myExportOptions.ExportDestinationType = ExportDestinationType.DiskFile myExportOptions.ExportFormatOptions = Nothing diskFileDestinationOptions = new DiskFileDestinationOptions(); exportOptions = hierarchicalGroupingReport.ExportOptions; exportOptions.ExportDestinationType = ExportDestinationType.DiskFile; exportOptions.ExportFormatOptions = null; 6. 7. Elimine los siguientes métodos de configuración de exportación: ○ ConfigureExportToRpt() ○ ConfigureExportToRtf() ○ ConfigureExportToDoc() ○ ConfigureExportToXls() ○ ConfigureExportToPdf() ○ ConfigureExportToHtml32() ○ ConfigureExportToHtml40() ○ ConfigureExportToXlsRec() ○ ConfigureExportToTxt() En los enunciados Case Select Case [Visual Basic] o switch [C#] de ExportSelection(), elimine las llamadas a los métodos de configuración de exportación. 8. En el método ExportCompletion(), elimine la llamada al método Export(). 9. Copie y pegue todo el código del método ExportCompletion() en la parte superior del método ExportSelection(). 10. Elimine el método ExportCompletion(), así como la llamada a ExportCompletion() en el evento de clic de botón exportByType. 11. En el método ExportSelection(), corte y pegue los enunciados Case Select Case [Visual Basic] o switch [C#] antes del bloque If del bloque try. El bloque try/catch ahora tiene un aspecto parecido al siguiente: Try 456 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Select Case exportTypesList.SelectedIndex Case ExportFormatType.NoFormat selectedNoFormat = True Case ExportFormatType.CrystalReport Case ExportFormatType.RichText Case ExportFormatType.WordForWindows Case ExportFormatType.Excel Case ExportFormatType.PortableDocFormat Case ExportFormatType.HTML32 Case ExportFormatType.HTML40 End Select If selectedNoFormat Then message.Text = MessageConstants.FORMAT_NOT_SUPPORTED Else message.Text = MessageConstants.SUCCESS End If Catch ex As Exception message.Text = MessageConstants.FAILURE & ex.Message End Try try { switch ((ExportFormatType)exportTypesList.SelectedIndex) { case ExportFormatType.NoFormat: selectedNoFormat = true; break; case ExportFormatType.CrystalReport: break; case ExportFormatType.RichText: break; case ExportFormatType.WordForWindows: break; case ExportFormatType.Excel: break; case ExportFormatType.PortableDocFormat: break; case ExportFormatType.HTML32: break; case ExportFormatType.HTML40: break; case ExportFormatType.ExcelRecord: break; } if (selectedNoFormat) { message.Text = MessageConstants.FORMAT_NOT_SUPPORTED; } else { message.Text = MessageConstants.SUCCESS; } } catch (Exception ex) { message.Text = MessageConstants.FAILURE + ex.Message; } Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 457 1.5.2.7.6.2.3 Modificar el método ExportSetup() En esta sección, aprenderá a modificar el método ExportSetup() con el fin de crear carpetas para los formatos de exportación HTML32 y HTML40. 1.5.2.7.6.2.3.1 Para modificar el método ExportSetup() Procedimiento 1. En la parte superior de la clase, agregue las siguientes declaraciones de clase: Private exportPathHTML32 As String Private exportPathHTML40 As String private string exportPathHTML32; private string exportPathHTML40; 2. En el método ExportSetup(), cree una instancia de las variables de cadena exportPathHTML32 y exportPathHTML40 en el directorio raíz de la unidad de disco duro. exportPathHTML32 = "C:\Exported\HTML32\" exportPathHTML40 = "C:\Exported\HTML40\" exportPathHTML32 = "C:\\Exported\\HTML32\\"; exportPathHTML40 = "C:\\Exported\\HTML40\\"; Nota Si desea colocar las carpetas en el directorio Web del servidor Web, agregue un prefijo al nombre de la carpeta con la propiedad Request.PhysicalApplicationPath. 3. Cree un bloque condicional que compruebe si ya existe el directorio de la cadena exportPathHTML32. If Not System.IO.Directory.Exists(exportPathHTML32) Then End If if (!System.IO.Directory.Exists(exportPathHTML32)) { } 4. En el bloque condicional, llame al método CreateDirectory() de System.IO.Directory para crear el directorio en la cadena exportPathHTML32. System.IO.Directory.CreateDirectory(exportPathHTML32) 458 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net System.IO.Directory.CreateDirectory(exportPathHTML32); 5. Cree un bloque condicional que compruebe si ya existe el directorio de la cadena exportPathHTML40. If Not System.IO.Directory.Exists(exportPathHTML40) Then End If if (!System.IO.Directory.Exists(exportPathHTML40)) { } 6. En el bloque condicional, llame al método CreateDirectory() de System.IO.Directory para crear el directorio en la cadena exportPathHTML40. System.IO.Directory.CreateDirectory(exportPathHTML40) System.IO.Directory.CreateDirectory(exportPathHTML40); 1.5.2.7.6.2.4 Llamar al método ExportToDisk() En esta sección, aprenderá a llamar al método ExportToDisk() de cada instrucción Case del método ExportSelection(). 1.5.2.7.6.2.4.1 Para llamar al método ExportToDisk() en el método ExportSelection() Procedimiento 1. En el método ExportSelection(), declare una variable de cadena y cree una instancia de ésta como una cadena vacía. Dim myFileName As String = "" string fileName = ""; 2. En la instrucción Case ExportFormatType.CrystalReport, siga estos pasos: a) Establezca el valor de la cadena de nombre de archivo en la cadena exportPath y, a continuación, agréguele el nombre de un documento con una extensión de archivo .rpt. myFileName = exportPath & "Report.rpt" Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 459 fileName = exportPath + "Report.rpt"; b) Llame al método ExportToDisk() desde la instancia de hierarchicalGroupingReport y pase ExportFormatType.CrystalReport y la cadena de nombre de archivo. hierarchicalGroupingReport.ExportToDisk(ExportFormatType.CrystalReport, myFileName) hierarchicalGroupingReport.ExportToDisk(ExportFormatType.CrystalReport, fileName); 3. En la instrucción Case ExportFormatType.RichText, siga estos pasos: a) Establezca el valor de la cadena de nombre de archivo en la cadena exportPath y, a continuación, agréguele el nombre de un documento con una extensión de archivo .rtf. myFileName = exportPath & "RichTextFormat.rtf" fileName = exportPath + "RichTextFormat.rtf"; b) Llame al método ExportToDisk() desde la instancia de hierarchicalGroupingReport y pase ExportFormatType.RichText y la cadena de nombre de archivo. hierarchicalGroupingReport.ExportToDisk(ExportFormatType.RichText, myFileName) hierarchicalGroupingReport.ExportToDisk(ExportFormatType.RichText, fileName); 4. En la instrucción Case ExportFormatType.WordForWindows, siga estos pasos: a) Establezca el valor de la cadena de nombre de archivo en la cadena exportPath y, a continuación, agréguele el nombre de un documento con una extensión de archivo .doc. myFileName = exportPath & "Word.doc" fileName = exportPath + "Word.doc"; b) Llame al método ExportToDisk() desde la instancia de hierarchicalGroupingReport y pase ExportFormatType.WordForWindows y la cadena de nombre de archivo. hierarchicalGroupingReport.ExportToDisk(ExportFormatType.WordForWindows, myFileName) hierarchicalGroupingReport.ExportToDisk(ExportFormatType.WordForWindows, fileName); 5. 460 En la instrucción Case ExportFormatType.Excel, siga estos pasos: © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net a) Establezca el valor de la cadena de nombre de archivo en la cadena exportPath y, a continuación, agréguele el nombre de un documento con una extensión de archivo .xls. myFileName = exportPath & "Excel.xls" fileName = exportPath + "Excel.xls"; b) Llame al método ExportToDisk() desde la instancia de hierarchicalGroupingReport y pase ExportFormatType.Excel y la cadena de nombre de archivo. hierarchicalGroupingReport.ExportToDisk(ExportFormatType.Excel, myFileName) hierarchicalGroupingReport.ExportToDisk(ExportFormatType.Excel, fileName); 6. En la instrucción Case ExportFormatType.PortableDocFormat, siga estos pasos: a) Establezca el valor de la cadena de nombre de archivo en la cadena exportPath y, a continuación, agréguele el nombre de un documento con una extensión de archivo .pdf. myFileName = exportPath & "PortableDoc.pdf" fileName = exportPath + "PortableDoc.pdf"; b) Llame al método ExportToDisk() desde la instancia de hierarchicalGroupingReport y pase ExportFormatType.PortableDocFormat y la cadena de nombre de archivo. hierarchicalGroupingReport.ExportToDisk(ExportFormatType.PortableDocFormat, myFileName) hierarchicalGroupingReport.ExportToDisk(ExportFormatType.PortableDocFormat, fileName); 7. En la instrucción Case ExportFormatType.HTML32, siga estos pasos: a) Establezca el valor de la cadena de nombre de archivo en la cadena exportPathHTML32 y, a continuación, agréguele el nombre de un documento con una extensión de archivo .html. myFileName = exportPathHTML32 & "HTML32.html" fileName = exportPathHTML32 + "HTML32.html"; b) Llame al método ExportToDisk() desde la instancia de hierarchicalGroupingReport y pase ExportFormatType.HTML32 y la cadena de nombre de archivo. hierarchicalGroupingReport.ExportToDisk(ExportFormatType.HTML32, myFileName) Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 461 hierarchicalGroupingReport.ExportToDisk(ExportFormatType.HTML32, fileName); 8. En la instrucción Case ExportFormatType.HTML40, siga estos pasos: a) Establezca el valor de la cadena de nombre de archivo en la cadena exportPathHTML40 y, a continuación, agréguele el nombre de un documento con una extensión de archivo .html. myFileName = exportPathHTML40 & "HTML40.html" fileName = exportPathHTML40 + "HTML40.html"; b) Llame al método ExportToDisk() desde la instancia de hierarchicalGroupingReport y pase ExportFormatType.HTML40 y la cadena de nombre de archivo. hierarchicalGroupingReport.ExportToDisk(ExportFormatType.HTML40, myFileName) hierarchicalGroupingReport.ExportToDisk(ExportFormatType.HTML40, fileName); 9. En la instrucción Case ExportFormatType.ExcelRecord, siga estos pasos: a) Establezca el valor de la cadena de nombre de archivo en la cadena exportPath y, a continuación, agréguele el nombre de un documento con una extensión de archivo .xls. myFileName = exportPath & "ExcelRecord.xls" fileName = exportPath + "ExcelRecord.xls"; b) Llame al método ExportToDisk() desde la instancia de hierarchicalGroupingReport y pase ExportFormatType.ExcelRecord y la cadena de nombre de archivo. hierarchicalGroupingReport.ExportToDisk(ExportFormatType.ExcelRecord, myFileName) hierarchicalGroupingReport.ExportToDisk(ExportFormatType.ExcelRecord, fileName); Resultados Ya está preparado para crear y ejecutar el proyecto, para exportar el informe de Crystal en formatos distintos. Si desea utilizar el resto de los métodos de la API mejorada, haga clic en el vínculo adecuado para pasar a esa sección: ● 462 Utilizar el método ExportToHttpResponse() [página 463] © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net ● Utilizar el método ExportToStream() [página 468] 1.5.2.7.6.3 Utilizar el método ExportToHttpResponse() El método ExportToHttpResponse() le permite exportar el informe de Crystal a una ventana de explorador o como archivo adjunto. Este método se utiliza sólo en sitios Web. Los métodos sobrecargados disponibles para ExportToHttpResponse() incluyen los siguientes: ● ExportToHttpResponse(CrystalDecisions.Shared.ExportFormatType formatType, System.Web.HttpResponse response, bool asAttachment, string attachmentName) ● ExportToHttpResponse(CrystalDecisions.Shared.ExportOptions options, System.Web.HttpResponse response, bool asAttachment, string attachmentName) El método ExportToHttpResponse() no es compatible con la exportación a la respuesta HTTP para los formatos HTML32 y HTML40. Por consiguiente, cuando trate de exportar a HTML32 o HTML40, aparecerá un mensaje de error. Si el valor de la variable booleana asAttachment Boolean se establece en True, aparece un cuadro de diálogo Descarga de archivos. Si el valor de la variable booleana asAttachment se establece en False, el informe exportado se abre en la ventana del explorador. Si desea guardar el archivo, su nombre se establece en la variable de cadena attachmentName. Si no especifica la variable attachmentName, el nombre del archivo predeterminado es "Sin título" con la extensión de archivo especificada. Este nombre se puede cambiar en el cuadro de diálogo Guardar como. 1.5.2.7.6.3.1 Utilizar el método ExportToHttpResponse() con la enumeración ExportFormatType Para utilizar el método ExportToHttpResponse() con el parámetro ExportFormatType, debe seguir el procedimiento Agregar controles a los formularios Web Forms o Windows Forms [página 430] para un sitio Web. No necesita los métodos ExportSetup(), ExportSelection() ni ExportCompletion(). El código requerido se coloca en el método de evento de clic exportByType. 1.5.2.7.6.3.1.1 Para utilizar el método ExportToHttpResponse() con el parámetro ExportFormatType Procedimiento 1. Abra el formulario Web Forms. 2. En el menú Ver, haga clic en Diseñador. 3. Haga doble clic en el control exportByType Button. Se crea el método de evento exportByType_Click() y aparece la vista Código. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 463 4. En la parte superior de la clase, agregue una declaración de clase ExportOptions. Private myExportOptions As ExportOptions private ExportOptions exportOptions; 5. En el método de evento exportByType_Click(), cree una instancia de la instancia de ExportOptions. myExportOptions = New ExportOptions() exportOptions = new ExportOptions(); 6. Cree un bloque try/catch con la clase Exception a la que se hace referencia como variable denominada "ex". Try Catch ex As Exception End Try try { } catch (Exception ex) { } 7. En el bloque try, cree un bloque condicional para comprobar si el elemento seleccionado de exportTypesList es igual a ExportFormatType.NoFormat. If (exportTypesList.SelectedIndex = ExportFormatType.NoFormat) Then Else End If if ((ExportFormatType)exportTypesList.SelectedIndex == ExportFormatType.NoFormat) { } else { } 8. En el bloque If, establezca el valor de la propiedad Text del control Label del mensaje en la constante FORMAT_NOT_SUPPORTED de la clase MessageConstants. message.Text = MessageConstants.FORMAT_NOT_SUPPORTED message.Text = MessageConstants.FORMAT_NOT_SUPPORTED; 464 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 9. En el bloque Else, asigne la propiedad ExportFormatType seleccionada de exportTypesList a la propiedad ExportFormatType de la instancia de ExportOptions. myExportOptions.ExportFormatType = exportTypesList.SelectedIndex exportOptions.ExportFormatType = (ExportFormatType)exportTypesList.SelectedIndex; 10. En el bloque Else, llame al método ExportToHttpResponse() de la instancia de hierarchicalGroupingReport. Pase la instancia de ExportOptions, el objeto de respuesta de ASP.NET, un valor booleano True y una cadena de nombre de archivo como parámetros del método. Nota La cadena de nombre de archivo del archivo adjunto no necesita extensión ya que ésta se agrega automáticamente al archivo exportado. hierarchicalGroupingReport.ExportToHttpResponse(myExportOptions, Response, True, "ExportedReport") hierarchicalGroupingReport.ExportToHttpResponse(exportOptions, Response, True, "ExportedReport"); 11. En el bloque catch, establezca el valor de la propiedad Text del control Label del mensaje en la constante FAILURE de la clase MessagesConstants y, a continuación, agréguele la propiedad Message del parámetro Exception. message.Text = MessageConstants.FAILURE & ex.Message message.Text = MessageConstants.FAILURE + ex.Message; 12. Fuera del bloque try/catch, establezca el valor de la propiedad Visible del control Label del mensaje en "True". message.Visible = True message.Visible = true; Resultados Ya está preparado para crear y ejecutar el proyecto, para exportar el informe de Crystal en formatos distintos. Si desea utilizar el método ExportToHttpResponse() con la clase ExportOptions, vea Utilizar el método ExportToHttpResponse() con la clase ExportOptions [página 466]. Para utilizar el resto de los métodos de la API mejorada, haga clic en el vínculo adecuado para pasar a esa sección: Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 465 ● Utilizar el método ExportToDisk() [página 453] ● Utilizar el método ExportToStream() [página 468] 1.5.2.7.6.3.2 Utilizar el método ExportToHttpResponse() con la clase ExportOptions Para utilizar el método ExportToHttpResponse() con el parámetro ExportOptions, debe seguir el procedimiento Agregar controles a los formularios Web Forms o Windows Forms [página 430] para un sitio Web. No necesita los métodos ExportSetup(), ExportSelection() ni ExportCompletion(). El código requerido se coloca en el método de evento de clic exportByType. 1.5.2.7.6.3.2.1 Para utilizar el método ExportToHttpResponse() con el parámetro ExportOptions Procedimiento 1. Abra el formulario Web Forms. 2. En el menú Ver, haga clic en Diseñador. 3. Haga doble clic en el control exportByType Button. Se crea el método de evento exportByType_Click() y aparece la vista Código. 4. En el método de evento exportByType_Click(), cree un bloque try/catch con la clase Exception a la que se hace referencia como variable denominada "ex". Try Catch ex As Exception End Try try { } catch (Exception ex) { } 5. En el bloque try, cree un bloque condicional para comprobar si el elemento seleccionado de exportTypesList es igual a ExportFormatType.NoFormat. If (exportTypesList.SelectedIndex = ExportFormatType.NoFormat) Then Else End If 466 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net if ((ExportFormatType)exportTypesList.SelectedIndex == ExportFormatType.NoFormat) { } else { } 6. En el bloque If, establezca el valor de la propiedad Text del control Label del mensaje en la constante FORMAT_NOT_SUPPORTED de la clase MessageConstants. Nota Se cumple la condición If cuando se selecciona el valor NoFormat de DropDownList. message.Text = MessageConstants.FORMAT_NOT_SUPPORTED message.Text = MessageConstants.FORMAT_NOT_SUPPORTED; 7. En el bloque Else, llame al método ExportToHttpResponse() de la instancia de hierarchicalGroupingReport. Pase la ExportFormatType seleccionada, el objeto ASP.NET Response, un valor booleano True y una cadena de nombre de archivo como parámetros del método. Nota La cadena de nombre de archivo del archivo adjunto no necesita extensión ya que ésta se agrega automáticamente al archivo exportado. hierarchicalGroupingReport.ExportToHttpResponse(exportTypesList.SelectedIndex, Response, True, "ExportedReport") hierarchicalGroupingReport.ExportToHttpResponse((ExportFormatType)exportTypesList .SelectedIndex, Response, True, "ExportedReport"); 8. En el bloque catch, establezca el valor de la propiedad Text del control Label del mensaje en la constante FAILURE de la clase MessagesConstants y, a continuación, agréguele la propiedad Message del parámetro Exception. message.Text = MessageConstants.FAILURE & ex.Message message.Text = MessageConstants.FAILURE + ex.Message; 9. Fuera del bloque try/catch, establezca el valor de la propiedad Visible del control Label del mensaje en "True". message.Visible = True message.Visible = true; Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 467 Resultados Ya está preparado para crear y ejecutar el proyecto, para exportar el informe de Crystal en formatos distintos. Para utilizar el resto de los métodos de la API mejorada, haga clic en el vínculo adecuado para pasar a esa sección: ● Utilizar el método ExportToDisk() [página 453] ● Utilizar el método ExportToStream() [página 468] 1.5.2.7.6.4 Utilizar el método ExportToStream() En esta sección, aprenderá a utilizar el método ExportToStream() para exportar el informe a la secuencia de entrada o salida como secuencia de bytes. Después, aprenderá a escribir la secuencia de bytes en un archivo del formato que especifique. Al exportar el informe a los formatos HTML, las imágenes no se exportan. Se recomienda usar los métodos ExportToHttpResponse() si se desea exportar a los formatos HTML. Requisitos previos: ● Debe crear un proyecto basado en las instrucciones de Configurar un proyecto para el método ExportToStreamConfigurar un proyecto para el método ExportToStream() [página 468]. ● O bien, debe crear un proyecto basado en las instrucciones de Crear métodos para los nuevos formatos de exportación [página 451]. A continuación, debe modificar el proyecto como se describe en Preparar el proyecto para el método ExportToStreamPreparar el proyecto para el método ExportToStream() [página 470]. 1.5.2.7.6.4.1 Configurar un proyecto para el método ExportToStream() En esta sección, aprenderá a crear un nuevo proyecto para el método ExportToStream(). 1.5.2.7.6.4.1.1 Para configurar un nuevo proyecto para el método ExportToStream() Procedimiento 1. Lleve a cabo todas las instrucciones de Agregar controles a los formularios Web Forms o Windows Forms [página 430]. 2. Cree el método ExportSetup() y el método ExportSelection() en Crear métodos que realizan la exportación [página 432]. 468 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 3. En el enunciado "Select Case" [Visual Basic] o "switch" [C#] del método ExportSelection(), agregue una instrucción Case para el formato ExcelRecord. Case ExportFormatType.ExcelRecord case ExportFormatType.ExcelRecord: break; 4. Cree un bloque condicional para probar la variable booleana, selectedNoFormat. If selectedNoFormat Then Else End If if (selectedNoFormat) { } else { } 5. En el bloque If, establezca el valor de la propiedad Text del control Label del mensaje en la constante FORMAT_NOT_SUPPORTED de la clase MessageConstants. message.Text = MessageConstants.FORMAT_NOT_SUPPORTED message.Text = MessageConstants.FORMAT_NOT_SUPPORTED; 6. En este bloque Else, establezca el valor de la propiedad Text del control Label del mensaje en la constante SUCCESS de la clase MessageConstants. message.Text = MessageConstants.SUCCESS message.Text = MessageConstants.SUCCESS; 7. Cree un bloque try/catch con la clase Exception a la que se hace referencia como variable denominada "ex". El bloque try incluye los enunciados "Select Case" [Visual Basic] o "switch" [C#], así como el bloque condicional. Try Catch ex As Exception End Try try { } Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 469 catch (Exception ex) { } 8. En el bloque catch, establezca el valor de la propiedad Text del control Label del mensaje en la constante FAILURE de la clase MessagesConstants y, a continuación, agréguele la propiedad Message del parámetro Exception. message.Text = MessageConstants.FAILURE & ex.Message message.Text = MessageConstants.FAILURE + ex.Message; 9. Fuera del bloque try/catch, establezca el valor de la propiedad Visible del control Label del mensaje en "True". message.Visible = True message.Visible = true; 10. En el menú Ver, haga clic en Diseñador. 11. Haga doble clic en el control exportByType Button. Se crea el método de evento exportByType_Click() y aparece la vista Código. 12. En el método de evento exportByType_Click(), especifique llamadas a los métodos ExportSetup() y ExportSelection(). ExportSetup() ExportSelection() ExportSetup(); ExportSelection(); 1.5.2.7.6.4.2 Preparar el proyecto para el método ExportToStream() En esta sección, aprenderá a modificar el proyecto resultante del procedimiento descrito en Crear métodos para los nuevos formatos de exportación [página 451]. Ahora, debe eliminar algunas líneas de código que no son necesarias para el método ExportToStream(). 470 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 1.5.2.7.6.4.2.1 Para modificar el proyecto con el fin de utilizar el método ExportToStream() Procedimiento 1. Abra el proyecto. 2. Abra el formulario Web Forms o Windows Forms. 3. En el menú Ver, haga clic en Código. 4. En la parte superior de la clase, elimine las siguientes declaraciones de clase: Private myDiskFileDestinationOptions As DiskFileDestinationOptions Private myExportOptions As ExportOptions private DiskFileDestinationOptions diskFileDestinationOptions; private ExportOptions exportOptions; 5. En el método ExportSetup(), elimine todas las líneas de código que van a continuación del bloque condicional. (La última línea de código que llama a la propiedad ExportFormatOptions sólo aparece en los proyectos de Windows.) myDiskFileDestinationOptions = New DiskFileDestinationOptions() myExportOptions = hierarchicalGroupingReport.ExportOptions myExportOptions.ExportDestinationType = ExportDestinationType.DiskFile myExportOptions.ExportFormatOptions = Nothing diskFileDestinationOptions = new DiskFileDestinationOptions(); exportOptions = hierarchicalGroupingReport.ExportOptions; exportOptions.ExportDestinationType = ExportDestinationType.DiskFile; exportOptions.ExportFormatOptions = null; 6. 7. Elimine los siguientes métodos de configuración de exportación: ○ ConfigureExportToRpt() ○ ConfigureExportToRtf() ○ ConfigureExportToDoc() ○ ConfigureExportToXls() ○ ConfigureExportToPdf() ○ ConfigureExportToHtml32() ○ ConfigureExportToHtml40() ○ ConfigureExportToXlsRec() En los enunciados Case Select Case [Visual Basic] o switch [C#] de ExportSelection(), elimine las llamadas a los métodos de configuración de exportación. 8. En el método ExportCompletion(), elimine la llamada al método Export(). 9. Copie y pegue todo el código del método ExportCompletion() en la parte superior del método ExportSelection(). 10. Elimine el método ExportCompletion(), así como la llamada a ExportCompletion() en el evento de clic de botón exportByType. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 471 11. En el método ExportSelection(), corte y pegue los enunciados Case Select Case [Visual Basic] o switch [C#] antes del bloque If del bloque try. El bloque try/catch ahora tiene un aspecto parecido al siguiente: Try Select Case exportTypesList.SelectedIndex Case ExportFormatType.NoFormat selectedNoFormat = True Case ExportFormatType.CrystalReport Case ExportFormatType.RichText Case ExportFormatType.WordForWindows Case ExportFormatType.Excel Case ExportFormatType.PortableDocFormat Case ExportFormatType.HTML32 Case ExportFormatType.HTML40 End Select If selectedNoFormat Then message.Text = MessageConstants.FORMAT_NOT_SUPPORTED Else message.Text = MessageConstants.SUCCESS End If Catch ex As Exception message.Text = MessageConstants.FAILURE & ex.Message End Try try { switch ((ExportFormatType)exportTypesList.SelectedIndex) { case ExportFormatType.NoFormat: selectedNoFormat = true; break; case ExportFormatType.CrystalReport: break; case ExportFormatType.RichText: break; case ExportFormatType.WordForWindows: break; case ExportFormatType.Excel: break; case ExportFormatType.PortableDocFormat: break; case ExportFormatType.HTML32: break; case ExportFormatType.HTML40: break; case ExportFormatType.ExcelRecord: break; } if (selectedNoFormat) { message.Text = MessageConstants.FORMAT_NOT_SUPPORTED; } else { message.Text = MessageConstants.SUCCESS; } 472 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net } catch (Exception ex) { message.Text = MessageConstants.FAILURE + ex.Message; } 1.5.2.7.6.4.3 Modificar las instrucciones Case en el método ExportSelection() En esta sección, aprenderá a establecer una cadena de nombre de archivo para cada instrucción Case de ExportFormatType. 1.5.2.7.6.4.3.1 Para modificar las instrucciones Case en el método ExportSelection() Procedimiento 1. En el método ExportSelection(), declare una variable de cadena y cree una instancia de ésta como una cadena vacía. Dim myFileName As String = "" string fileName = ""; 2. En la instrucción Case ExportFormatType.CrystalReport, establezca la cadena de nombre de archivo en la cadena exportPath que va seguida de un nombre de documento reconocible con una extensión de archivo .rpt. myFileName = exportPath & "Report.rpt" myFileName = exportPath + "Report.rpt"; 3. En la instrucción Case ExportFormatType.RichText, establezca la cadena de nombre de archivo en la cadena exportPath que va seguida de un nombre de documento reconocible con una extensión de archivo .rtf. myFileName = exportPath & "RichTextFormat.rtf" myFileName = exportPath + "RichTextFormat.rtf"; Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 473 4. En la instrucción Case ExportFormatType.WordForWindows, establezca la cadena de nombre de archivo en la cadena exportPath que va seguida de un nombre de documento reconocible con una extensión de archivo .doc. myFileName = exportPath & "Word.doc" fileName = exportPath + "Word.doc"; 5. En la instrucción Case ExportFormatType.Excel, establezca la cadena de nombre de archivo en la cadena exportPath que va seguida de un nombre de documento reconocible con una extensión de archivo .xls. myFileName = exportPath & "Excel.xls" fileName = exportPath + "Excel.xls"; 6. En la instrucción Case ExportFormatType.PortableDocFormat, establezca la cadena de nombre de archivo en la cadena exportPath que va seguida de un nombre de documento reconocible con una extensión de archivo .pdf. myFileName = exportPath & "PortableDoc.pdf" fileName = exportPath + "PortableDoc.pdf"; 7. En la instrucción Case ExportFormatType.HTML32, establezca la cadena de nombre de archivo en la cadena exportPath que va seguida de un nombre de documento reconocible con una extensión de archivo .html. myFileName = exportPath & "HTML32.html" fileName = exportPath + "HTML32.html"; 8. En la instrucción Case ExportFormatType.HTML40, establezca la cadena de nombre de archivo en la cadena exportPath que va seguida de un nombre de documento reconocible con una extensión de archivo .html. myFileName = exportPath & "HTML40.html" fileName = exportPath + "HTML40.html"; 9. En la instrucción Case ExportFormatType.ExcelRecord, establezca la cadena de nombre de archivo en la cadena exportPath que va seguida de un nombre de documento reconocible con una extensión de archivo .xls. myFileName = exportPath & "ExcelRecord.xls" fileName = exportPath + "ExcelRecord.xls"; 474 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 1.5.2.7.6.4.4 Llamar al método ExportToStream() En esta sección, aprenderá a llamar al método ExportToStream() y a escribir los datos del informe exportado en un archivo con el formato que especifique. 1.5.2.7.6.4.4.1 Para llamar al método ExportToStream() en el método ExportSelection() Procedimiento 1. Encima de la firma de clase, agregue una declaración "Imports" [Visual Basic] o "using" [C#] en la parte superior de la clase para el espacio de nombres System.IO. Imports System.IO using System.IO; 2. En el bloque Else del método ExportSelection(), llame al método ExportToStream() de la instancia de hierarchicalGroupingReport, pase el ExportFormatType seleccionado del DropDownList exportTypesList y a asigne la instancia a la clase Stream. Stream myStream = hierarchicalGroupingReport.ExportToStream(exportTypesList.SelectedIndex) Stream stream = hierarchicalGroupingReport.ExportToStream((ExportFormatType)exportTypesList.Selec tedIndex); 3. Cree una nueva matriz de bytes de la misma longitud que la instancia de Stream. Dim myDataArray As byte() = New byte(myStream.Length) byte[] dataArray = new byte[stream.Length]; 4. Lea los datos de la instancia de Stream a la matriz de bytes desde un desplazamiento cero hasta la longitud de la instancia de Stream. myStream.Read(myDataArray, 0, Convert.ToInt32(myStream.Length)); stream.Read(dataArray, 0, Convert.ToInt32(stream.Length)); Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 475 5. Cree una instancia de FileStream que cree el archivo especificado por la variable de cadena de nombre de archivo. Dim myFileStream As FileStream = New FileStream(myFileName, System.IO.FileMode.Create) FileStream fileStream = new FileStream(fileName, System.IO.FileMode.Create); 6. Escriba los datos almacenados en la matriz de bytes en el archivo desde un desplazamiento cero hasta la longitud de la matriz de bytes. myFileStream.Write(myDataArray, 0, myDataArray.Length) fileStream.Write(dataArray, 0, dataArray.Length); 7. Cierre las instancias de FileStream y Stream. myFileStream.Close() myStream.Close() fileStream.Close(); stream.Close(); 8. Establezca el valor de la propiedad Text del control Label del mensaje en la constante SUCCESS de la clase MessageConstants. message.Text = MessageConstants.SUCCESS message.Text = MessageConstants.SUCCESS; Resultados Ya está preparado para crear y ejecutar el proyecto, para exportar el informe de Crystal en formatos distintos. Si desea utilizar el resto de los métodos de la API mejorada, haga clic en el vínculo adecuado para pasar a esa sección: ● Utilizar el método ExportToDisk() [página 453] ● Utilizar el método ExportToHttpResponse() [página 463] 476 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 1.5.2.8 Tutorial: Filtrar datos con fórmulas de selección En este tutorial, aprenderá a filtrar datos dentro del modelo de objetos ReportDocument definiendo la propiedad RecordSelectionFormula de la clase DataDefinition. Introducción Las fórmulas de selección se utilizan para filtrar los registros que desee mostrar en un informe de Crystal. Para escribir fórmulas de selección, puede usar las sintaxis Basic o Crystal. En este tutorial, va a crear una fórmula de selección para filtrar los registros de los clientes cuyo campo Ventas del año pasado es mayor que un valor especificado y el campo Nombre del cliente se compara con otra cadena. Un control DropDownList (Web) o ComboBox (Windows) selecciona un operador de comparación para el campo Nombre del cliente. Puede elegir que se muestren los nombres de los clientes que son iguales a, menores que, mayores que, menores o iguales que, iguales o mayores que o que no son iguales que el valor de cadena especificado. La fórmula se pasa como variable de cadena a la propiedad SelectionFormula de la clase CrystalReportViewer. Una vez establecida la propiedad, el informe de Crystal que enlaza con el control CrystalReportViewer se filtra antes de mostrarse. Este tutorial también se puede realizar con clases del modelo de objetos CrystalReportViewer, aunque se prefiere el modelo de objetos ReportDocument. Código de ejemplo Este tutorial incluye código de ejemplo de C# y Visual Basic que muestra la versión finalizada del proyecto. Siga las instrucciones de este tutorial para crear un nuevo proyecto o para abrir el proyecto de código de ejemplo y trabajar con una versión finalizada. El código de ejemplo se almacena en carpetas que están clasificadas por idioma y tipo de proyecto. Los archivos de cada versión del código de ejemplo se almacenan en las siguientes carpetas: ● Sitio Web en C#: CS_Web_RDObjMod_SavedDataSelectionFormula ● Proyecto para Windows en C#: CS_Win_RDObjMod_SavedDataSelectionFormula ● Sitio Web en Visual Basic: VB_Web_RDObjMod_SavedDataSelectionFormula ● Proyecto para Windows en Visual Basic: VB_Win_RDObjMod_SavedDataSelectionFormula Base de datos Xtreme Este tutorial utiliza una base de datos de muestra llamada Xtreme. El archivo de base de datos xtreme.mdb se incluye en el paquete de código de muestra del SDK de SAP Crystal Reports .NET. Para usar la base de datos Xtreme, deberá crear manualmente una conexión ODBC a ella. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 477 Información relacionada Elegir el modelo de objetos correcto para el proyecto [página 31] Directorio de informes de muestra [página 14] 1.5.2.8.1 Crear un informe Para comenzar, creará un informe de Crystal en el que filtrará datos. 1.5.2.8.1.1 Para crear un informe de Crystal Contexto Nota Este procedimiento sólo funciona con un proyecto creado a partir de la Configuración de proyectos [página 14]. La configuración de proyectos contiene referencias específicas a espacios de nombres y configuración de códigos necesarios para este procedimiento, que no se podrá completar sin dicha configuración. Procedimiento 1. En el Explorador de soluciones, haga clic con el botón secundario en el nombre de proyecto en negrita, elija Agregar y, a continuación, haga clic en Agregar nuevo elemento. 2. En el cuadro de diálogo Agregar nuevo elemento, en la vista Plantillas, seleccione la plantilla Crystal Report. 3. En el campo Nombre, especifique el nombre "CustomerBySalesName.rpt" y haga clic en Agregar. 4. En el panel Crear un nuevo documento de Crystal Reports del cuadro de diálogo Galería de Crystal Reports, seleccione Usar asistente de informes. 5. En el panel Elegir un Asistente, seleccione Estándar y, a continuación, haga clic en Aceptar. 6. En el panel Orígenes de datos disponibles de la ventana Asistente para la creación de informes estándar, expanda la carpeta Crear nueva conexión. 7. En la subcarpeta que se abre, expanda la carpeta ODBC (RDO). 8. En la ventana ODBC (RDO), seleccione la entrada ODBC DSN correcta para la base de datos de muestra Xtreme y haga clic en Finalizar. Se expandirá la carpeta ODBC (RDO) y mostrará la base de datos Xtreme. 9. Expanda el nodo Tablas y seleccione la tabla Cliente. 10. Haga doble clic en la tabla Cliente para moverla al panel Tablas seleccionadas y, a continuación, haga clic en Siguiente. 11. Haga clic mientras presiona Ctrl en Nombre del cliente, Ventas del año pasado y Ciudad. 478 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 12. Haga clic en el símbolo > para mover estos campos al panel Campos a mostrar y, a continuación, haga clic en Finalizar. Se creará el informe CustomerBySalesName y se cargará en la ventana principal de Visual Studio. 13. Haga clic en Vista previa del informe principal. Se mostrará una vista previa del informe con todos los datos disponibles. Más tarde filtrará estos datos mediante programación. 14. Haga clic en Informe principal para salir del modo de vista previa. 1.5.2.8.2 Enlazar el informe En Configuración de proyectos [página 14], va a colocar un control CrystalReportViewer en el formulario Web Forms o Windows Forms. En el paso anterior, ha agregado un informe CustomerBySalesName al proyecto. En esta sección, creará una instancia del informe CustomerBySalesName y la enlazará con el control CrystalReportViewer. Puede crear una copia del informe y enlazarla de dos formas: ● Como informe incrustado. ● Como informe no incrustado. Elija uno de los procedimientos con pasos siguientes (pero no ambos). ● Si utiliza informes incrustados, realice el siguiente procedimiento de pasos para crear una instancia del informe como un informe incrustado. ● Si utiliza informes no incrustados, siga el segundo procedimiento de pasos para crear una instancia del informe como un informe no incrustado. 1.5.2.8.2.1 Para crear una instancia del informe CustomerBySalesName como un informe incrustado y enlazarla al control CrystalReportViewer Procedimiento 1. Abra el formulario Web Forms o Windows Forms. 2. En el menú Ver, haga clic en Código. 3. Agregue una nueva declaración de nivel de clase para la clase contenedora del informe CustomerBySalesName, con el nombre de variable customerBySalesNameReport. Establezca su modificador de acceso como private. Private customerBySalesNameReport As CustomerBySalesName private CustomerBySalesName customerBySalesNameReport; Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 479 4. En el método ConfigureCrystalReports(), cree una instancia de la clase contenedora de informes. Nota Ha creado el método ConfigureCrystalReports() en Configuración de proyectos [página 14]. customerBySalesNameReport = New CustomerBySalesName() customerBySalesNameReport = new CustomerBySalesName(); 5. En la línea siguiente, debajo de la creación de instancias del informe, enlace la propiedad ReportSource del control CrystalReportViewer a la clase de informe de la que ha creado una instancia (nombre de variable: customerBySalesNameReport). myCrystalReportViewer.ReportSource = customerBySalesNameReport crystalReportViewer.ReportSource = customerBySalesNameReport; Resultados Ahora estará listo para crear y ejecutar el proyecto. Pase a la siguiente sección. 1.5.2.8.2.2 Para crear una instancia del informe CustomerBySalesName como un informe no incrustado y enlazarla al control CrystalReportViewer Procedimiento 1. Abra el formulario Web Forms o Windows Forms. 2. En el menú Ver, haga clic en Código. 3. Agregue una nueva declaración de nivel de clase para la clase contenedora del informe ReportDocument, con el nombre de variable customerBySalesNameReport. Establezca su modificador de acceso como private. Private customerBySalesNameReport As ReportDocument private ReportDocument customerBySalesNameReport; Nota La clase ReportDocument es miembro del espacio de nombres CrystalDecisions.CrystalReports.Engine. Agregó una declaración "Imports" [Visual Basic] 480 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net o "using" [C#] para este espacio de nombres en Configuración de proyectos [página 14]. Cuando cree la instancia de ReportDocument y cargue un informe en el espacio de nombres, tendrá acceso al informe a través del SDK, sin incrustar el informe. 4. En el método ConfigureCrystalReports() (que ha creado en Configuración de proyectos [página 14]), cree una instancia de la clase ReportDocument. customerBySalesNameReport = New ReportDocument() customerBySalesNameReport = new ReportDocument(); 5. Declare una variable de cadena, llámela reportPath y asígnele una ruta en tiempo de ejecución al informe local. Esta ruta se determina de forma diferente para los sitios Web y los proyectos para Windows: ○ Para un sitio Web, pase el nombre del archivo de informe local como un parámetro de cadena al método Server.MapPath(). Esto asigna el informe local a la ruta del directorio de archivos de la unidad de disco duro en tiempo de ejecución. Dim reportPath As String = Server.MapPath("CustomerBySalesName.rpt") string reportPath = Server.MapPath("CustomerBySalesName.rpt"); ○ Para un proyecto Windows, concatene la propiedad Application.StartupPath con una barra diagonal inversa y el nombre del archivo de informe local. Esto asigna el informe al mismo directorio del archivo ejecutable de Windows. Nota En la fase de compilación se copiará el informe al directorio que contiene el archivo ejecutable. Dim reportPath As String = Application.StartupPath & "\" & "CustomerBySalesName.rpt" string reportPath = Application.StartupPath + "\\" + "CustomerBySalesName.rpt"; 6. Llame al método Load() de la instancia de ReportDocument y pásele la variable de cadena reportPath. customerBySalesNameReport.Load(reportPath) customerBySalesNameReport.Load(reportPath); 7. En la línea siguiente, debajo la carga del informe, enlace la propiedad ReportSource de CrystalReportViewer a la instancia de ReportDocument. myCrystalReportViewer.ReportSource = customerBySalesNameReport Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 481 crystalReportViewer.ReportSource = customerBySalesNameReport; Resultados Tanto si ha elegido crear una instancia de clase de un informe incrustado como de un informe no incrustado mediante la clase ReportDocument, el nombre de la variable utilizada es el mismo: customerBySalesNameReport. De esta forma, puede utilizar un conjunto de códigos común en los procedimientos que aparecen a continuación. Ahora estará listo para crear y ejecutar el proyecto. 1.5.2.8.2.3 Para probar la carga del informe CustomerBySalesName Procedimiento 1. En el menú Generar, seleccione Generar solución. 2. Si existen errores de generación, continúe y corríjalos ahora. 3. Si usa un informe no incrustado en un proyecto Windows, busque el archivo ejecutable de Windows compilado en el subdirectorio \bin\ [Visual Basic] o \bin\debug\ [C#] y, a continuación, copie el informe en dicho subdirectorio. Nota Para que el archivo ejecutable de Windows cargue el informe no incrustado en tiempo de ejecución, el informe deberá estar almacenado en el mismo directorio que el archivo ejecutable de Windows. 4. En el menú Depurar, haga clic en Iniciar. Se mostrará el informe con todas las filas de datos disponibles. En la sección siguiente, comenzará a filtrar dichos datos con la propiedad RecordSelectionFormula. 5. Vuelva a Visual Studio y haga clic en Detener para salir del modo de depuración. 1.5.2.8.3 Aplicar un filtro a los datos del informe En esta sección, aprenderá a aplicar un filtro a los datos del informe. 482 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 1.5.2.8.3.1 Para aplicar un filtro a los datos del informe Procedimiento 1. Abra el formulario Web o para Windows en la vista Diseño. 2. En el menú Ver, haga clic en Código. 3. En la parte superior de la clase, agregue tres nuevas declaraciones de variable de nivel de clase que representarán los valores por los que se filtrarán los datos. Private salesAmount As String Private operatorValue As String Private customerName As String private string salesAmount; private string operatorValue; private string customerName; 4. Si va a crear un proyecto para Windows, agregue una declaración de variable de nivel de clase adicional, un booleano que se llama useDefaultValues y, a continuación, asígnele un valor de True. Private useDefaultValues As Boolean = True private bool useDefaultValues = true; 5. En el método ConfigureCrystalReports(), cree un bloque condicional. ○ Si va a crear un sitio Web, cree un bloque condicional Not IsPostBack. Coloque este bloque encima del código existente en el método. If Not IsPostBack Then End If if (!IsPostBack) { } ○ Si va a crear un proyecto para Windows, cree un bloque condicional useDefaultValues. Coloque este bloque encima del código existente en el método. If useDefaultValues Then End If if (useDefaultValues) { } 6. Dentro del bloque condicional, asigne los valores de 4000, <, y K a las tres variables de nivel de clase. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 483 Estos valores se asignan dentro de un bloque condicional, porque posteriormente anulará dichos valores con un evento de clic de botón salesAmount = "4000" operatorValue = "<" customerName = "K" salesAmount = "4000"; operatorValue = "<"; customerName = "K"; 7. Justamente fuera y debajo del bloque condicional, cree una cadena selectionFormula en la que mezclará literales con las variables de nivel de clase recién creadas. Dim selectionFormula As String = "{Customer.Last Year's Sales} > " _ & salesAmount _ & " AND Mid({Customer.Customer Name}, 1, 1) " _ & operatorValue _ & "'" _ & customerName _ & "'" string selectionFormula = "{Customer.Last Year's Sales} > " + salesAmount + " AND Mid({Customer.Customer Name}, 1, 1) " + operatorValue + "'" + customerName + "'"; 8. En el código de enlace de informes creado anteriormente, cree un salto de línea justo encima de la línea de código en la que customerBySalesName está asignado a la propiedad ReportSource del control CrystalReportViewer. 9. En este salto de línea, asigne la variable de cadena selectionFormula a la instancia de ReportDocument. customerBySalesNameReport.DataDefinition.RecordSelectionFormula = selectionFormula customerBySalesNameReport.DataDefinition.RecordSelectionFormula = selectionFormula; 10. Compile y vea la aplicación. Ahora los datos deberán estar filtrados. 11. Vuelva a Visual Studio y haga clic en Detener para salir del modo de depuración. Resultados En la siguiente sección creará controles en el formulario que permitan ajustar la fórmula de selección dinámicamente. 484 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 1.5.2.8.4 Agregar controles para el filtrado dinámico En esta sección, agregará controles para utilizarlos en la fórmula de selección. Estos controles permiten filtrar los datos dinámicamente. 1.5.2.8.4.1 Para agregar controles con el fin de utilizarlos en la fórmula de selección Procedimiento 1. Abra el formulario Web Forms o Windows Forms. 2. En el menú Ver, haga clic en Diseñador. 3. Si está desarrollando un sitio Web, realice las siguientes acciones: a) Haga clic en el control CrystalReportViewer para seleccionarlo. b) Presione la FLECHA IZQUIERDA del teclado de modo que aparezca un cursor parpadeante y, a continuación, presione INTRO cinco veces. El control CrystalReportViewer bajará cinco líneas. 4. Si está desarrollando un proyecto de Windows, realice las siguientes acciones: a) Haga clic en el control CrystalReportViewer para seleccionarlo. b) En la ventana Propiedades, establezca el valor de Dock en "Bottom". c) Ajuste el tamaño del control CrystalReportViewer, para que aparezcan tres líneas aproximadamente sobre él. d) En la ventana Propiedades, establezca el valor de Anchor en "Top, Bottom, Left, Right". 5. En el Cuadro de herramientas, arrastre un control Label a la parte superior izquierda del formulario. 6. En la ventana Propiedades, establezca el valor de Text como "Mostrar el nombre de los clientes:" 7. En el Cuadro de herramientas, arrastre un segundo control Label al formulario debajo del primero. 8. En la ventana Propiedades, establezca el valor de Text como "- ventas del año pasado > $". 9. En el Cuadro de herramientas, arrastre un tercer control Label al formulario debajo del segundo. 10. En la ventana Propiedades, establezca el valor de Text como "- la primera letra del nombre es". 11. En el Cuadro de herramientas, arrastre un control TextBox a la derecha del segundo control Label. 12. En la ventana Propiedades, establezca el valor de ID como "lastYearsSales". 13. En el Cuadro de herramientas, arrastre un control DropDownList (Web) o un control ComboBox (Windows) a la derecha del tercer control Label. 14. En la ventana Propiedades, establezca el valor de ID como "operatorValueList". 15. En el Cuadro de herramientas, arrastre un control TextBox a la derecha del control DropDownList (Web) o del control ComboBox (Windows). 16. En la ventana Propiedades, establezca el valor de ID como "letterOfName". 17. En el Cuadro de herramientas, arrastre un control Button debajo del tercer control Label. 18. En la ventana Propiedades, establezca el valor de ID como "redisplay" y el valor de Text como "Volver a mostrar el informe". Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 485 19. En el Cuadro de herramientas, arrastre un control Label debajo del control Button. 20. En la ventana Propiedades, establezca el valor de ID como "formula" y el valor de Text déjelo vacío. Asegúrese de ajustar el control CrystalReportViewer para que quede situado inmediatamente debajo de estos controles. 21. En el menú Archivo, haga clic en Guardar todo. Resultados En la siguiente sección, rellenará el control DropDownList (Web) o el control ComboBox (Windows). 1.5.2.8.5 Rellenar el control DropDownList ComboBox El control DropDownList (Web) o el control ComboBox (Windows) requiere una lista de operatorValues (igual, mayor que, etc.). La forma más genérica de rellenar este control es proporcionar la lista de valores como un enumerador. 1.5.2.8.5.1 Para llenar el control DropDownList ComboBox Procedimiento 1. En el Explorador de soluciones, haga clic con el botón secundario en el nombre de proyecto en negrita, elija Agregar y, a continuación, haga clic en Agregar nuevo elemento. 2. En el cuadro de diálogo Agregar nuevo elemento, seleccione Clase. 3. Especifique el nombre "CeComparisonOperator" y haga clic en Aceptar. 4. En el archivo de clase, cambie la palabra clase por enum. Nota En Visual Basic, no olvide cambiar la firma de apertura y de cierre. En C#, elimine el constructor. 5. Especifique los siguientes valores de enumeración. EqualTo GreaterThan GreaterThanOrEqualTo LessThan LessThanOrEqualTo NotEqualTo EqualTo, GreaterThan, GreaterThanOrEqualTo, 486 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net LessThan, LessThanOrEqualTo, NotEqualTo 6. Abra el formulario Web o para Windows en la vista Diseño. 7. En el menú Ver, haga clic en Código. 8. En el método ConfigureCrystalReports(), ahora rellenará la instancia de operatorValueList con los valores de la enumeración CeComparisonOperator. Este código se colocará en una ubicación diferente, dependiendo de si se crea un sitio Web o un proyecto para Windows. ○ En un sitio Web, coloque la asignación y el enlace de la propiedad DataSource dentro del bloque condicional Not IsPostBack. operatorValueList.DataSource = System.Enum.GetValues(GetType(CeComparisonOperator)) operatorValueList.DataBind() operatorValueList.DataSource = System.Enum.GetValues(typeof(CeComparisonOperator)); operatorValueList.DataBind(); ○ En un proyecto para Windows, coloque únicamente la asignación de la propiedad DataSource dentro del bloque condicional useDefaultValues. operatorValueList.DataSource = System.Enum.GetValues(GetType(CeComparisonOperator)) operatorValueList.DataSource = System.Enum.GetValues(typeof(CeComparisonOperator)); Nota En un proyecto para Windows, no hace falta llamar a un método DataBind(). 9. En la parte inferior del método ConfigureCrystalReports(), asigne la cadena selectionFormula a la propiedad Text del control Label de la fórmula. formula.Text = selectionFormula formula.Text = selectionFormula; 10. Compile y vea la aplicación. La lista de operadores y todos los demás controles se deben mostrar correctamente. 11. Cierre el explorador. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 487 Resultados En la siguiente sección creará un método que recupera selecciones de este control si se hace clic en el botón Volver a mostrar el informe. 1.5.2.8.6 Recuperar selecciones del control En esta sección, recuperará selecciones del control DropDownList (Web) o del control ComboBox (Windows). 1.5.2.8.6.1 Para recuperar selecciones del control Procedimiento 1. Abra el formulario Web Forms o Windows Forms en la vista Diseño. 2. En el menú Ver, haga clic en Código. 3. En la parte inferior de la clase, cree un método auxiliar privado GetSelectedOperator() que devuelve una variable de cadena. Private Function GetSelectedOperator() As String End Function private string GetSelectedOperator() { } 4. Dentro del método, declare una cadena selectedOperator y asígnele un valor de cadena vacío. Dim selectedOperator As String = "" string selectedOperator = ""; 5. Aún dentro del método, cree una instrucción Select Case/switch case que compruebe el índice seleccionado en el control de lista y devuelva el valor de enumeración correspondiente. Nota En C#, deberá proyectar explícitamente el índice seleccionado a la enumeración de la firma switch. Select Case operatorValueList.SelectedIndex Case CeComparisonOperator.EqualTo selectedOperator = "=" Case CeComparisonOperator.GreaterThan selectedOperator = ">" 488 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Case CeComparisonOperator.GreaterThanOrEqualTo selectedOperator = ">=" Case CeComparisonOperator.LessThan selectedOperator = "<" Case CeComparisonOperator.LessThanOrEqualTo selectedOperator = "<=" Case CeComparisonOperator.NotEqualTo selectedOperator = "<>" End Select switch ((CeComparisonOperator)operatorValueList.SelectedIndex) { case CeComparisonOperator.EqualTo: selectedOperator = "="; break; case CeComparisonOperator.GreaterThan: selectedOperator = ">"; break; case CeComparisonOperator.GreaterThanOrEqualTo: selectedOperator = ">="; break; case CeComparisonOperator.LessThan: selectedOperator = "<"; break; case CeComparisonOperator.LessThanOrEqualTo: selectedOperator = "<="; break; case CeComparisonOperator.NotEqualTo: selectedOperator = "<>"; break; } 6. Devuelva selectedOperator desde el método. Return selectedOperator return selectedOperator; 7. En el menú Archivo, haga clic en Guardar todo. Resultados En la última sección, agregará un evento de clic de botón para aplicar los nuevos valores de la formula de selección al informe cuando se hace clic en el botón. 1.5.2.8.7 Agregar un evento de clic de botón El paso final de la configuración del filtrado dinámico consiste en agregar el evento de clic de botón y escribir código para aplicar los nuevos valores de la formula de selección al informe. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 489 1.5.2.8.7.1 Para agregar el evento de clic de botón Procedimiento 1. Abra el formulario Web Forms o Windows Forms en la vista Diseño. 2. Haga doble clic en el control Button. 3. Se cargará la clase de código subyacente y se creará un evento de clic de botón. 4. Dentro del método, defina la variable de nivel de clase "salesAmount" como la propiedad Text de la instancia del control lastYearsSales. salesAmount = lastYearsSales.Text salesAmount = lastYearsSales.Text; 5. Defina la variable de nivel de clase "operatorValue" como el valor devuelto por el método auxiliar GetSelectedOperator. operatorValue = GetSelectedOperator() operatorValue = GetSelectedOperator(); 6. Defina la variable de nivel de clase "customerName" como la propiedad Text de la instancia del control letterOfName. customerName = letterOfName.Text customerName = letterOfName.Text; 7. Si crea un proyecto para Windows, defina la variable de nivel de clase "useDefaultValues" como False. Nota Esto hace que se pase por alto el bloque condicional incluido en ConfigureCrystalReports() que establece los valores predeterminados de las variables de nivel de clase. useDefaultValues = False useDefaultValues = false; 8. Aún dentro del método, llame al método ConfigureCrystalReports() para realizar el filtrado y el enlace del informe. ConfigureCrystalReports() 490 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net ConfigureCrystalReports(); Resultados Ahora ya podrá probar la aplicación. 1.5.2.8.8 Probar el filtrado de los datos En la sección final, probará el filtrado de los datos. 1.5.2.8.8.1 Para probar el filtrado de los datos Procedimiento 1. Compile y vea la aplicación. 2. Verifique que el informe se muestra con los valores de filtrado predeterminados. 3. Indique "200000" en ventas del año pasado. 4. Seleccione GreaterThan en DropDownList (Web) o en ComboBox (Windows). 5. Escriba "M" en TextBox y haga clic en Volver a mostrar el informe. El informe se volverá a mostrar con los datos filtrados como se especificó anteriormente. 6. Cierre el explorador. 1.5.2.8.9 selección Apéndice: Mejoras en el código de fórmulas de Si tiene instalado SAP Crystal Reports 2008, tendrá acceso a la API mejorada que filtra datos con el modelo de objeto ReportDocument mediante la configuración de la fórmula SavedDataSelection de la clase DataDefinition. En los procedimientos anteriores, aprendió a utilizar la fórmula RecordSelection para filtrar los datos después de un clic de botón. En este tutorial, modificará el método redisplay_Click para utilizar la fórmula SavedDataSelection y filtrar los datos después de un clic de boton. La fórmula SavedDataSelection permite filtrar por los datos guardados en vez de volver a acceder a la base de datos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 491 1.5.2.8.9.1 Modificar el proyecto para la fórmula SavedDataSelection Si ha seguido todos los procedimientos de Tutorial: Filtrar datos con fórmulas de selección [página 477], primero debe eliminar algunas líneas de código que se muestran en el siguiente procedimiento. 1.5.2.8.9.1.1 Para modificar el proyecto con el fin de utilizar la fórmula SavedDataSelection Procedimiento 1. Abra el proyecto que ha terminado para este tutorial. 2. Abra el formulario Web Forms o Windows Forms. 3. En el menú Ver, haga clic en Código. 4. Si está desarrollando un proyecto para Windows, elimine la variable de nivel de clave "useDefaultValues". 5. Si está desarrollando un proyecto Web, en el método ConfigureCrystalReports(), elimine el bloque condicional sin eliminar el código que contiene. El método ConfigureCrystalReports() modificado debe ser similar a éste: Private Sub ConfigureCrystalReports() salesAmount = "4000" operatorValue = "<" customerName = "K" Dim selectionFormula As String = "{Customer.Last Year's Sales} > " & salesAmount _ & " AND Mid({Customer.Customer Name}, 1, 1) " & operatorValue & "'" & customerName & "'" operatorValueList.DataSource = System.Enum.GetValues(GetType(CeComparisonOperator)) operatorValueList.DataBind() customerBySalesNameReport = New ReportDocument() Dim reportPath As String = Server.MapPath("CustomerSalesByReport.rpt") customerBySalesNameReport.Load(reportPath) customerBySalesNameReport.DataDefinition.RecordSelectionFormula = selectionFormula myCrystalReportViewer.ReportSource = customerBySalesNameReport formula.Text = selectionFormula End Sub private void ConfigureCrystalReports() { salesAmount = "4000"; operatorValue = "<"; customerName = "K"; string selectionFormula = "{Customer.Last Year's Sales} > " + salesAmount + " AND Mid({Customer.Customer Name}, 1, 1) " + operatorValue + "'" + customerName + "'"; operatorValueList.DataSource = System.Enum.GetValues(typeof(CeComparisonOperator)); operatorValueList.DataBind(); customerBySalesNameReport = new ReportDocument(); string reportPath = Server.MapPath("CustomerBySalesName.rpt"); customerBySalesNameReport.Load(reportPath); 492 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net customerBySalesNameReport.DataDefinition.RecordSelectionFormula = selectionFormula; crystalReportViewer.ReportSource = customerBySalesNameReport; formula.Text = selectionFormula; } 1.5.2.8.9.2 Agregar un evento que aplica la fórmula SavedDataSelection En esta sección, modificará el método redisplay_Click mediante la aplicación de la fórmula SavedDataSelection a los valores selectionFormula del informe. 1.5.2.8.9.2.1 Para agregar el evento de clic de botón Procedimiento 1. Abra el formulario Web Forms o Windows Forms. 2. En el menú Ver, haga clic en Código. 3. En el método redisplay_Click, elimine la línea que llama al método ConfigureCrystalReports(). 4. Cree una cadena selectionFormula en la que mezclará literales con las variables de nivel de clase recién creadas. Dim selectionFormula As String = "{Customer.Last Year's Sales} > " _ & salesAmount _ & " AND Mid({Customer.Customer Name}, 1, 1) " _ & operatorValue _ & "'" _ & customerName _ & "'" string selectionFormula = "{Customer.Last Year's Sales} > " + salesAmount + " AND Mid({Customer.Customer Name}, 1, 1) " + operatorValue + "'" + customerName + "'"; 5. Asigne la variable string selectionFormula a la instancia de ReportDocument. customerBySalesNameReport.DataDefinition.SavedDataSelectionFormula = selectionFormula customerBySalesNameReport.DataDefinition.SavedDataSelectionFormula = selectionFormula; 6. En la línea siguiente, enlace la propiedad ReportSource de CrystalReportViewer a la instancia de ReportDocument. myCrystalReportViewer.ReportSource = customerBySalesNameReport Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 493 crystalReportViewer.ReportSource = customerBySalesNameReport; 7. En la parte inferior del método, asigne la cadena selectionFormula a la propiedad Text del control Label de la fórmula. formula.Text = selectionFormula formula.Text = selectionFormula; Resultados Ahora ya podrá probar la aplicación. 1.5.2.8.9.3 Probar el filtrado de los datos En esta sección, probará el filtrado de los datos. 1.5.2.8.9.3.1 Para probar el filtrado de los datos Procedimiento 1. Compile y vea la aplicación. 2. Verifique que el informe se muestra con los valores de filtrado predeterminados. 3. Indique "30000" en ventas del año pasado. 4. Seleccione GreaterThan en DropDownList (Web) o en ComboBox (Windows). 5. Escriba "H" en TextBox y haga clic en Volver a mostrar el informe. El informe vuelve a mostrarse con todos los clientes cuyos nombres están entre H y K, y tiene ventas mayores que 30000 $. 6. Cambie la "H" por "S" TextBox y haga clic en Volver a mostrar el informe. El informe se vuelve a mostrar sin datos. Esto se debe a que "S" está fuera de los parámetros iniciales que se han configurado en el método ConfigureCrystalReports(). 7. Cierre el explorador. 1.5.2.9 Tutorial: Presentar secciones de informes con el control CrystalReportPartsViewer En este tutorial, aprenderá a dividir un informe en distintos elementos y mostrar cada elemento haciendo clic en una serie de hipervínculos sucesivos. 494 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Introducción En este tutorial, aprenderá a dividir un informe en distintos elementos y mostrar cada elemento haciendo clic en una serie de hipervínculos sucesivos. Los hipervínculos llevan de un grupo de resumen de informe general a una información de informe cada vez más detallada. Se define el punto de inicio general y, a continuación, cada hipervínculo sucesivo del informe. Para mostrar el informe como distintos elementos, se asigna el informe a un control alternativo denominado CrystalReportPartsViewer. Nota Los elementos del informe sólo se usan en sitios Web; no están disponibles para proyectos para Windows. Existen dos métodos principales para ver un informe: ● Puede ver el informe como un todo. ● Puede ver el informe como una serie enlazada de elementos del informe. Ver el informe como un todo Los informes se muestran normalmente como un único documento (de una o varias páginas de longitud) en el que la información detallada aparece agrupada por categorías, subcategorías y, finalmente, como filas individuales de detalles. Por ejemplo, la base de datos de Access Xtreme que se incluye con SAP Crystal Reports contiene datos de clientes sobre tiendas de bicicletas de muchos lugares del mundo. Un modo típico de ver datos de un informe es mostrar las tiendas de bicicletas individuales que están organizadas en grupos basados en regiones y a continuación ciudades, con filas individuales de información de cada tienda de bicicletas con el nivel de detalle. El control CrystalReportViewer se usa para mostrar informes como un todo. Ver el informe como una serie enlazada de elementos Con la introducción de los portales Web y la navegación Web con teléfonos móviles, que ofrecen un área de presentación muy limitada para ver la información, se ha desarrollado una nueva forma de mostrar informes. Para lograrlo, el informe "todo en uno" que consta de categorías de grupo, subcategorías y filas de detalle se redefine como una serie de elementos del informe. Estos elementos se muestran en una serie de vistas de página enlazadas. En este caso, el grupo de información con la categoría más alta aparecerá primero. Si se selecciona un elemento de dicho grupo de nivel superior, se mostrará una subcategoría del grupo de información. Esta profundización continúa hasta que se alcanzan las filas de detalle individuales de una subcategoría particular. Por ejemplo, los datos de Cliente de las tiendas de bicicletas de la base de datos Xtreme se ven inicialmente como una lista de regiones. Si se selecciona una región, se mostrarán las ciudades de dicha región. Si se selecciona una ciudad particular, se mostrarán las filas de detalle de las tiendas de bicicletas pertenecientes a dicha ciudad. Esta ruptura de un informe en distintos elementos permite acceder eficazmente a un informe grande y complejo dentro de un área de presentación muy limitada. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 495 El control CrystalReportPartsViewer se usa para mostrar informes como una serie de secciones vinculadas. Código de ejemplo Este tutorial incluye código de ejemplo de C# y Visual Basic que muestra la versión finalizada del proyecto. Siga las instrucciones de este tutorial para crear un nuevo proyecto o para abrir el proyecto de código de ejemplo y trabajar con una versión finalizada. El código de ejemplo se almacena en carpetas que están clasificadas por idioma y tipo de proyecto. Los nombres de las carpetas de cada versión del código de ejemplo son los siguientes: ● Sitio Web en C#: CS_Web_RDObjMod_ReportParts ● Sitio Web en Visual Basic: VB_Web_RDObjMod_ReportParts Base de datos Xtreme Este tutorial utiliza una base de datos de muestra llamada Xtreme. El archivo de base de datos xtreme.mdb se incluye en el paquete de código de muestra del SDK de SAP Crystal Reports .NET. Para usar la base de datos Xtreme, deberá crear manualmente una conexión ODBC a ella. Información relacionada Directorio de informes de muestra [página 14] 1.5.2.9.1 Crear un informe Para comenzar, cree un informe que obtenga su información de la base de datos Xtreme. 1.5.2.9.1.1 Para crear un informe con parámetros Procedimiento 1. En el Explorador de soluciones, haga clic con el botón secundario en el nombre de proyecto en negrita, elija Agregar y, a continuación, haga clic en Agregar nuevo elemento. 2. En el cuadro de diálogo Agregar nuevo elemento, en la vista Plantillas, seleccione la plantilla denominada "Crystal Report". 3. En el campo Nombre, escriba el nombre "Customer.rpt" y haga clic en Agregar. 496 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 4. En el panel Crear un nuevo documento de Crystal Reports del cuadro de diálogo Galería de Crystal Reports, seleccione Usar asistente de informes. 5. En el panel Elegir un Asistente, seleccione Estándar y, a continuación, haga clic en Aceptar. 6. En el panel Orígenes de datos disponibles de la ventana Asistente para la creación de informes estándar, expanda la carpeta Crear nueva conexión. 7. En la subcarpeta que se abre, expanda la carpeta ODBC (RDO). 8. En la ventana ODBC (RDO), seleccione la entrada ODBC DSN correcta para la base de datos Xtreme y haga clic en Finalizar. Se expandirá la carpeta ODBC (RDO) y mostrará la base de datos Xtreme. 9. Expanda el nodo Tablas y seleccione la tabla Cliente. 10. Haga doble clic en la tabla Cliente para moverla al panel Tablas seleccionadas y, a continuación, haga clic en Siguiente. 11. Haga clic mientras presiona CTRL en País, Nombre del cliente, Ventas del año pasado, Región y Ciudad. 12. Haga clic en el símbolo > para mover estos campos al panel Campos a mostrar y, a continuación, haga clic en el botón Siguiente. 13. En el panel Campos disponibles, en Campos del informe, realice las siguientes instrucciones: a) Seleccione País, haga clic en el símbolo > para mover el campo al panel Agrupar por. b) Seleccione Región, haga clic en el símbolo > para mover el campo al panel Agrupar por. c) Haga clic en Siguiente. Los campos resumidos se crean para el campo Ventas del año pasado de los grupos País y Región. 14. Haga clic en Finalizar. Se creará el informe Customers y se cargará en la ventana principal de Visual Studio. 15. En la parte inferior de la ventana, haga clic en Vista previa del informe principal. El informe se mostrará jerárquicamente en niveles que se ordenan primero por país y a continuación por región. Si modifica el informe para que se muestre como distintos elementos, cada nivel se mostrará por separado. Resultados Ahora ya está preparado para convertir el informe para que se muestre como distintos elementos. 1.5.2.9.2 informe Convertir el informe para mostrar elementos de En este tutorial aprenderá a configurar hipervínculos del informe para enlazar la información general con la detallada. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 497 1.5.2.9.2.1 Para convertir el informe para que se muestre como distintos elementos Procedimiento 1. En la parte inferior de la ventana, haga clic en Informe principal. Nota El grupo más alto, Nombre del grupo #1, se mostrará en dos posiciones, en la parte superior e inferior del informe. En la parte inferior del informe, en la sección Pie de página de grupo #1, Nombre de grupo #1 es una etiqueta seguida de un campo de resumen de Cliente.Ventas del año pasado. Esta etiqueta es la más adecuada para utilizarla como un punto de entrada para los elementos del informe. 2. Haga clic con el botón secundario en Nombre de grupo #2, situado en la sección Pie de página de grupo #2 y haga clic en Copiar. 3. Haga clic con el botón secundario en un área vacía del informe, seleccione Informe y, a continuación, haga clic en Opciones del informe. 4. En el cuadro de diálogo Opciones del informe, haga clic en Pegar y vincular. El ID de la etiqueta del Grupo 1 "GroupNameCountry2" se pegará en el campo Nombre de objeto. El campo Contexto de datos acepta un valor de cadena que filtra datos del informe. Por ahora, este campo debe permanecer vacío. 5. Haga clic en Aceptar. 6. Haga clic con el botón secundario en Nombre de grupo #1, situado en la sección Pie de página de grupo #1 y haga clic en Dar formato a objeto. 7. En el Editor de Formato, haga clic en la ficha Hipervínculo y seleccione Profundizar en parte del informe. 8. En el panel Campos disponibles, expanda Pie de página de grupo #2, haga doble clic en GroupNameRegion2 y, a continuación, haga clic en Aceptar. Ha configurado el Grupo #1 para que se vincule con el Grupo #2 si se hace clic en Grupo #1 en tiempo de ejecución. 9. Haga clic con el botón secundario en Nombre de grupo #2, situado en la sección Pie de página de grupo #2 y haga clic en Dar formato a objeto. 10. En el Editor de Formato, haga clic en la ficha Hipervínculo y seleccione Profundizar en parte del informe. 11. En el panel Campos disponibles, realice lo siguiente: a) Expanda Detalles. b) Presione la tecla Ctrl y haga clic en CustomerName1, LastYearsSales1 y City1. c) Haga clic en el símbolo > para mover estos campos al panel Campos para mostrar. d) Haga clic en Aceptar. Ha configurado el Grupo #2 para vincular con información detallada sobre el cliente, si se hace clic en el Grupo #2 en tiempo de ejecución. 12. En el menú Archivo, seleccione Guardar todo. 498 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 1.5.2.9.3 Enlazar el informe Cuando siguió las instrucciones de la sección Configuración de proyectos [página 14] para preparase para este tutorial, colocó un control CrystalReportViewer en el formulario Web. Sin embargo, para ver elementos del informe, deberá usar el control CrystalReportPartsViewer. En esta sección, creará una instancia del informe Customers y la enlazará con el control CrystalReportPartsViewer. A continuación, compruebe si el informe muestra los elementos creados en los procedimientos anteriores. Puede crear una copia del informe y enlazarla de dos formas: ● Como informe incrustado. ● Como informe no incrustado. Elija uno de los procedimientos con pasos siguientes (pero no ambos). ● Si utiliza informes incrustados, realice el siguiente procedimiento de pasos para crear una instancia del informe como un informe incrustado. ● Si utiliza informes no incrustados, siga el segundo procedimiento de pasos para crear una instancia del informe como un informe no incrustado. Continúe con Filtrar datos en el informe [página 503]. 1.5.2.9.3.1 Para crear una instancia del informe Customers como informe incrustado y enlazarla al control CrystalReportPartsViewer Procedimiento 1. Abra el formulario Web Forms. 2. En el menú Ver, haga clic en Diseñador. 3. Elimine el control CrystalReportViewer. 4. En el Cuadro de herramientas, abra el nodo Crystal Reports para buscar el control CrystalReportPartsViewer. 5. Arrastre el control CrystalReportPartsViewer al formulario Web. 6. En la ventana Propiedades, establezca la propiedad ID: ○ Para los sitios Web de Visual Basic, establezca la propiedad ID en "myCrystalReportPartsViewer". ○ Para los sitios Web de C#, establezca la propiedad ID en "crystalReportPartsViewer". 7. En el menú Ver, haga clic en Código para ver la clase de código subyacente de este formulario Web Forms. 8. Agregue una nueva declaración de nivel de clase para la clase contenedora del informe Customers, con el nombre de variable customersReport. Establezca su modificador de acceso como private. Private customersReport As Customers private Customers customersReport; Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 499 9. En el método ConfigureCrystalReports(), cree una instancia de la clase contenedora de informes. Nota Ha creado el método ConfigureCrystalReports() en Configuración de proyectos [página 14]. customersReport = New Customers() customersReport = new Customers(); 10. En la línea siguiente, debajo de la creación de instancias del informe, enlace la propiedad ReportSource del control CrystalReportPartsViewer a la clase de informe de la que se ha creado una instancia (nombre de variable: customersReport). myCrystalReportPartsViewer.ReportSource = customersReport crystalReportPartsViewer.ReportSource = customersReport; Nota Se tiene acceso a la instancia del control CrystalReportPartsViewer en el código porque agregó el control al formulario Web o para Windows. Si IntelliSense no reconoce la instancia del control CrystalReportPartsViewer, verifique que se ha agregado este control como declaración de nivel de clase a esta clase de código subyacente. 1.5.2.9.3.2 Para crear una instancia del informe Customers como un informe no incrustado y enlazarla al control CrystalReportPartsViewer Contexto Ahora estará listo para crear y ejecutar el proyecto. Procedimiento 1. Abra el formulario Web Forms. 2. En el menú Ver, haga clic en Código. 500 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 3. Agregue una nueva declaración de nivel de clase para la clase contenedora del informe ReportDocument, con el nombre de variable customersReport. Establezca su modificador de acceso como private. Private customersReport As ReportDocument private ReportDocument customersReport; Nota La clase ReportDocument es miembro del espacio de nombres CrystalDecisions.CrystalReports.Engine. Agregó una declaración "Imports" [Visual Basic] o "using" [C#] para este espacio de nombres en Configuración de proyectos [página 14]. Cuando cree la instancia de ReportDocument y cargue un informe en el espacio de nombres, tendrá acceso al informe a través del SDK, sin incrustar el informe. 4. En el método ConfigureCrystalReports() (agregado durante uno de los procedimientos de Configuración de proyectos [página 14]), cree una instancia de la clase ReportDocument. customersReport = New ReportDocument() customersReport = new ReportDocument(); 5. Declare una variable de cadena, llámela reportPath y asígnele una ruta en tiempo de ejecución al informe local. Esta ruta se determina de forma diferente para los sitios Web y los proyectos para Windows: ○ Para un sitio Web, pase el nombre del archivo de informe local como un parámetro de cadena al método Server.MapPath(). Esto asigna el informe local a la ruta del directorio de archivos de la unidad de disco duro en tiempo de ejecución. Dim reportPath As String = Server.MapPath("Customers.rpt") string reportPath = Server.MapPath("Customers.rpt"); ○ Para un proyecto Windows, concatene la propiedad Application.StartupPath con una barra diagonal inversa y el nombre del archivo de informe local. Esto asigna el informe al mismo directorio del archivo ejecutable de Windows. Nota En la fase de compilación se copiará el informe al directorio que contiene el archivo ejecutable. Dim reportPath As String = Application.StartupPath & "\" & "Customers.rpt" string reportPath = Application.StartupPath + "\\" + "Customers.rpt"; Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 501 6. Llame al método Load() de la instancia de ReportDocument y pásele la variable de cadena reportPath. customersReport.Load(reportPath) customersReport.Load(reportPath); 7. En la línea siguiente, debajo de la carga del informe, enlace la propiedad ReportSource de CrystalReportPartsViewer a la instancia de ReportDocument. myCrystalReportPartsViewer.ReportSource = customersReport crystalReportPartsViewer.ReportSource = customersReport; 1.5.2.9.3.3 Para probar la carga del informe Customers Contexto Tanto si ha elegido crear una instancia de clase de un informe incrustado como de un informe no incrustado mediante la clase ReportDocument, el nombre de la variable utilizada es el mismo: customersReport. De esta forma, puede utilizar un conjunto de códigos común en los procedimientos que aparecen a continuación. Ahora estará listo para crear y ejecutar el proyecto. Está previsto que falle la carga del informe, porque aún no se ha escrito el código para establecer un valor para el campo de parámetro Ciudad. Agregará un valor para el campo de parámetro Ciudad más adelante en este tutorial. Procedimiento 1. En el menú Generar, seleccione Generar solución. 2. Si existen errores de generación, continúe y corríjalos ahora. 3. En el menú Depurar, haga clic en Iniciar. Se muestra el informe Customers en el explorador Web. 4. Haga clic en un país para mostrar una lista de regiones. 5. Haga clic en una región para mostrar los campos Nombre de cliente, Ventas del año pasado y Ciudad. 6. Vuelva a Visual Studio y haga clic en Detener para salir del modo de depuración. 502 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 1.5.2.9.4 Filtrar datos en el informe En este tutorial aprenderá a configurar el campo Contexto de datos para filtrar datos que se muestran en el informe. Para obtener más información sobre la configuración de Contexto de datos, vea Implementar la profundización en secciones del informe [página 740]. 1.5.2.9.4.1 Para filtrar datos del informe Procedimiento 1. Abra el informe de Crystal. 2. Haga clic con el botón secundario en un área vacía del informe. Seleccione Informe y haga clic en Opciones del informe. 3. En el campo Contexto de datos, escriba "/País[EE.UU.]". 4. Haga clic en Aceptar para cerrar el cuadro de diálogo Opciones del informe. 5. En el menú Generar, seleccione Generar solución. 6. Si existen errores de generación, continúe y corríjalos ahora. 7. En el menú Depurar, haga clic en Iniciar. El informe sólo mostrará registros de EE.UU. 8. Vuelva a Visual Studio y haga clic en Detener para salir del modo de depuración. 1.5.3 Tutoriales de código reducido en Visual Studio En esta sección se presentan varios tutoriales para el desarrollo de código reducido. Nota Cuando se trate de tutoriales que utilicen el modelo de codificación, vea Tutoriales del modelo de objetos ReportDocument [página 336]. 1.5.3.1 Tutorial: Configurar sitios Web de código reducido con SAP Crystal Reports mediante tareas inteligentes En este tutorial, aprenderá a utilizar el nuevo modelo de desarrollo de aplicaciones basado en etiquetas de Visual Studio. Va a seguir los pasos de un modelo de desarrollo de código reducido para configurar un sitio Web con SAP Crystal Reports, mediante tareas inteligentes. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 503 Introducción En este tutorial, creará un sitio Web ASP.NET en Visual Studio. A continuación, agregará un control CrystalReportViewer al formulario Web Forms, que inicia el nuevo panel Tarea inteligente. A partir de las tareas inteligentes puede crear un control CrystalReportSource y, a continuación, generar un informe de Crystal. Dentro del control CrystalReportSource se hace referencia a este informe. En este tutorial, podrá obtener una vista previa del informe de tres formas: ● En el diseñador de SAP Crystal Reports incrustado, con el nuevo botón Vista previa en SAP Crystal Reports, versión para programadores de Microsoft Visual Studio. ● En el formulario Web, con datos ficticios. Nota La vista previa del formulario Web Forms se realiza con la nueva función de vista previa en tiempo de diseño. ● En tiempo de ejecución, al generar y compilar la aplicación. Al final de este tutorial, cambiará a la vista HTML (vista Código fuente) e investigará la relación entre los controles CrystalReportViewer y CrystalReportSource en el nuevo modelo de aplicación basado en etiquetas de Visual Studio 2005 o posterior. Código de ejemplo Este tutorial incluye código de ejemplo de C# y Visual Basic que muestra la versión finalizada del proyecto. Siga las instrucciones de este tutorial para crear un nuevo proyecto o para abrir el proyecto de código de ejemplo y trabajar con una versión finalizada. El código de ejemplo se almacena en carpetas que están clasificadas por idioma y tipo de proyecto. Los nombres de las carpetas de cada versión del código de ejemplo son los siguientes: ● Sitio Web en C#: CS_Web_ReducedCode_WebSiteSetup ● Sitio Web en Visual Basic: VB_Web_ReducedCode_WebSiteSetup Base de datos Xtreme Este tutorial utiliza una base de datos de muestra llamada Xtreme. El archivo de base de datos xtreme.mdb se incluye en el paquete de código de muestra del SDK de SAP Crystal Reports .NET. Para usar la base de datos Xtreme, deberá crear manualmente una conexión ODBC a ella. Información relacionada Visualizar un informe en tiempo de diseño [página 221] 504 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net Directorio de informes de muestra [página 14] 1.5.3.1.1 Crear un sitio Web con un control CrystalReportViewer Requisitos previos Antes de crear un sitio Web, verifique que se ha instalado SAP Crystal Reports, versión para programadores de Microsoft Visual Studio en el sistema. Procedimiento 1. Inicie Visual Studio. 2. En el menú Archivo, haga clic en Nuevo y después seleccione Sitio Web. 3. En el cuadro de diálogo Nuevo sitio Web, haga clic en Sitio Web ASP.NET. 4. En la lista desplegable Ubicación, seleccione Sistema de archivos. 5. En la lista desplegable Idioma, seleccione el idioma de codificación que desea usar. 6. En el campo de texto Ubicación indique la ruta de directorio C:\WebSites\, seguida del nombre del proyecto. 7. Haga clic en Aceptar. Se abre el proyecto en el Explorador de soluciones y contiene una página Default.aspx. 8. Abra la página Default.aspx (el formulario Web). 9. En el menú Ver, haga clic en Diseñador. Nota También puede cambiar a la vista de diseño haciendo clic en el botón Diseño en la parte inferior de la vista del formulario. 10. En el Cuadro de herramientas, abra el nodo Informes para buscar el control CrystalReportViewer. 11. Arrastre el control CrystalReportViewer al formulario Web Forms. Se abre el panel de Tarea inteligente "Tareas de CrystalReportViewer". Información relacionada Instalaciones necesarias [página 9] Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 505 1.5.3.1.2 Configurar CrystalReportSource mediante tareas inteligentes Visual Studio 2005 y posterior tiene una nueva función de interfaz gráfica de usuario para los controles .NET que se denomina Tareas inteligentes. En el control CrystalReportViewer de sitios Web, el panel Tarea inteligente se denomina "Tareas de CrystalReportViewer". El panel Tarea inteligente "Tareas de CrystalReportViewer" permite configurar varias funciones del control CrystalReportViewer, sin tener que escribir código. Las selecciones que lleve a cabo mediante el uso de tareas inteligentes se generan como configuración basada en etiquetas en la página ASPX. En esta sección, aprenderá a configurar la opción CrystalReportSource disponible en el panel Tarea inteligente "Tareas de CrystalReportViewer". Más adelante, en estos tutoriales de código reducido, va a examinar otras funciones del panel Tarea inteligente "Tareas de CrystalReportViewer". 1.5.3.1.2.1 Para configurar el control CrystalReportSource mediante tareas inteligentes Procedimiento 1. Si el panel Tarea inteligente está abierto, haga clic en el formulario Web Forms para cerrar dicho panel. 2. En la esquina superior derecha del control CrystalReportViewer, haga clic en el botón triangular pequeño. Se volverá a abrir el panel Tarea inteligente denominado "Tareas de CrystalReportViewer". En la lista Elegir origen de informe, se muestra <Ninguna>. 3. Haga clic en la lista Elegir un origen de informe y seleccione <Nuevo origen de informe…>. Se abrirá el cuadro de diálogo Crear ReportSource. 4. En el cuadro de texto Especifique nombre del control, deje la entrada predeterminada CrystalReportSource1. 5. Haga clic en la lista Especifique un informe para el control CrystalReportSource y seleccione <Nuevo informe>. La selección alternativa es <Examinar…>. Esa opción le permite seleccionar un informe de Crystal existente desde el directorio de archivos. Sin embargo, en este tutorial creará un nuevo informe. 6. En el cuadro de diálogo Crear un nuevo informe de Crystal, especifique el nombre "XtremeCustomers.rpt" y, a continuación, haga clic en Aceptar. 7. Vuelva a hacer clic en Aceptar para cerrar el cuadro de diálogo Elegir un origen de informe. 1.5.3.1.3 Configurar el informe del control CrystalReportSource En esta sección, va a utilizar el Asistente de informes para configurar un informe y agregarlo al control CrystalReportSource. Va a crear una conexión de base de datos, establecer los campos del informe y, a continuación, agregar el informe al control. Cuando haya terminado, va a probar el sitio Web de código reducido. 506 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 1.5.3.1.3.1 Para configurar el informe del control CrystalReportSource Procedimiento 1. En el panel Crear un nuevo documento de Crystal Reports del cuadro de diálogo Galería de Crystal Reports, seleccione Usar asistente de informes. 2. En el panel Elegir un Asistente, seleccione Estándar y, a continuación, haga clic en Aceptar. 3. En el panel Orígenes de datos disponibles de la ventana Asistente para la creación de informes estándar, siga estos pasos: a) Expanda la carpeta Crear nueva conexión. b) Expanda la carpeta ODBC (RDO). 4. En la ventana ODBC (RDO), seleccione la entrada ODBC DSN correcta para la base de datos Xtreme y haga clic en Finalizar. Se expandirá la carpeta ODBC (RDO) y mostrará la base de datos Xtreme. 5. Expanda el nodo Tablas y seleccione la tabla Cliente. 6. Haga doble clic en la tabla Cliente para moverla al panel Tablas seleccionadas y, a continuación, haga clic en Siguiente. 7. Expanda la tabla Cliente, mantenga presionada la tecla Ctrl y haga clic en Nombre del cliente, Título del contacto, Dirección1, Apellido del cliente y Ciudad. 8. Haga clic en el símbolo > para mover estos campos al panel Campos a mostrar y, a continuación, haga clic en Siguiente. 9. En el panel Campos disponibles, en Campos del informe, seleccione Cliente.Ciudad, haga clic en el símbolo > para mover el campo al panel Agrupar por y, a continuación, haga clic en Finalizar. Se crea el informe XtremeCustomers y se carga en la ventana principal de Visual Studio. 10. En la parte inferior de la ventana, haga clic en Vista previa del informe principal. Nota El botón Vista previa está disponible por primera vez en el diseñador de SAP Crystal Reports incrustado que se incluye en SAP Crystal Reports para Visual Studio 2005. El informe se muestra en el modo de vista previa y muestra los datos de la base de datos Xtreme. 11. En la parte inferior de la ventana, haga clic en Informe principal para salir del modo de vista previa. 12. Abra el formulario Web Forms. 13. En el menú Ver, haga clic en Diseñador. El informe se muestra en el modo de vista previa en tiempo de diseño, que muestra el diseño gráfico del informe en el formulario Web Forms. 14. En el menú Archivo, haga clic en Guardar todo. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 507 1.5.3.1.3.2 Para probar el sitio Web de código reducido Contexto Se crea el informe y se designa como el informe del control CrystalReportSource. Ahora estará listo para crear y ejecutar el proyecto. Procedimiento 1. En el menú Generar, seleccione Generar solución. 2. Si existen errores de generación, continúe y corríjalos ahora. 3. En el menú Depurar, haga clic en Iniciar. 4. Se muestra el informe XtremeCustomers en el explorador Web. 5. Vuelva a Visual Studio y haga clic en Detener para salir del modo de depuración. 1.5.3.1.4 Origen Explorar el control CrystalReportSource en la vista Contexto En esta sección va a explorar el modelo de aplicación basado en etiquetas que se utiliza en la versión 2.0 de ASP.NET. Este modelo permite configurar un sitio Web con SAP Crystal Reports, versión para programadores de Microsoft Visual Studio, sin tener que escribir código. También va a obtener información sobre el marco del control DataSource y el control CrystalReportSource que forma parte de que forma parte de ASP.NET 2.0. Procedimiento 1. Abra la página Default.aspx. 2. En el menú Ver, haga clic en Diseñador. 3. En la parte inferior del formulario Web Forms, haga clic en el botón Origen. Se muestra el código HTML de la página Default.aspx. Esto incluye dos etiquetas relacionadas de SAP Crystal Reports: ○ La etiqueta CrystalReportSource, que anida la etiqueta Report. La etiqueta Report hace referencia al informe en su propiedad FileName. <CR:CrystalReportSource ID="CrystalReportSource1" Runat="server" EnableCaching="False" GroupPath=""> <Report FileName="XtremeCustomers.rpt"></Report> </CR:CrystalReportSource> 508 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net ○ La etiqueta CrystalReportViewer, que hace referencia a CrystalReportSource por el ID. <CR:CrystalReportViewer ID="CrystalReportViewer1" Runat="server" AutoDataBind="True" Height="1158px" CssFilename="CssFilename" ReportSourceID="CrystalReportSource1" Width="1059px" /> Resultados El código demuestra el nuevo modelo de aplicación basado en etiquetas que formar parte de ASP.NET 2.0. Del mismo modo que en la versión 1.0 de ASP.NET, el control CrystalReportViewer se representa mediante una etiqueta XML. Sin embargo, las propiedades disponibles de este control se han incrementado en ASP.NET 2.0, para admitir el modelo de desarrollo de aplicaciones basado en etiquetas. En ASP.NET 2.0, la conectividad de datos se ha encapsulado en el control DataSource. El control CrystalReportSource adapta el marco del control DataSource pero encapsula la conectividad del informe en vez de la de datos. La propiedad ReportSourceID administra este marco, en el control visual principal. Para obtener más información sobre las propiedades adicionales del control CrystalReportSource consulte Control CrystalReportSource [página 51]. Las propiedades también se muestran en otros tutoriales de código reducido más adelante en esta sección. 1.5.3.2 Tutorial: Configurar proyectos Windows de código reducido con SAP Crystal Reports mediante tareas inteligentes Introducción En este tutorial aprenderá a crear un proyecto de Windows en SAP Crystal Reports, versión para programadores de Microsoft Visual Studio. A continuación agregará un control CrystalReportViewer al formulario Windows Forms. Desde el panel Tarea inteligente, abra el diseñador de SAP Crystal Reports incrustado y cree un informe nuevo. La función de tareas inteligentes genera un código que enlaza el informe al control CrystalReportViewer. En este tutorial, podrá obtener una vista previa del informe de tres formas: ● En el diseñador de SAP Crystal Reports incrustado, con el nuevo botón Vista previa en SAP Crystal Reports, versión para programadores de Microsoft Visual Studio ● En el formulario para Windows, con datos ficticios. ● En tiempo de ejecución, al generar y compilar la aplicación. Al final de este tutorial, cambie a la vista Código para ver cómo funciona el modelo de desarrollo de código reducido en SAP Crystal Reports, versión para programadores de Microsoft Visual Studio. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 509 Código de ejemplo Este tutorial incluye código de ejemplo de C# y Visual Basic que muestra la versión finalizada del proyecto. Siga las instrucciones de este tutorial para crear un nuevo proyecto o para abrir el proyecto de código de ejemplo y trabajar con una versión finalizada. El código de ejemplo se almacena en carpetas que están clasificadas por idioma y tipo de proyecto. Los nombres de las carpetas de cada versión del código de ejemplo son los siguientes: ● Proyecto para Windows en C#: CS_Win_ReducedCode_ProjectSetup ● Proyecto para Windows en Visual Basic: VB_Win_ReducedCode_ProjectSetup Base de datos Xtreme Este tutorial utiliza una base de datos de muestra llamada Xtreme. El archivo de base de datos xtreme.mdb se incluye en el paquete de código de muestra del SDK de SAP Crystal Reports .NET. Para usar la base de datos Xtreme, deberá crear manualmente una conexión ODBC a ella. Información relacionada Directorio de informes de muestra [página 14] 1.5.3.2.1 Crear un proyecto de Windows con un control CrystalReportViewer Requisitos previos Antes de crear un proyecto de Windows, verifique que se ha instalado SAP Crystal Reports, versión para programadores de Microsoft Visual Studio en el sistema. Procedimiento 1. Inicie Visual Studio. 2. En el menú Archivo, seleccione Nuevo y, a continuación, haga clic en Proyecto. 3. En el cuadro de diálogo Nuevo proyecto, seleccione una carpeta de lenguaje para C# o Visual Basic en la lista Tipos de proyecto. 4. En la lista Plantillas, haga clic en Aplicación para Windows. 5. En el campo Nombre, sustituya el nombre de proyecto predeterminado por el nombre de su proyecto. 510 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 6. Haga clic en Aceptar. Se abre el proyecto en el Explorador de soluciones y contiene una clase Form1. 7. Abra la clase Form1. 8. En el Cuadro de herramientas, abra el nodo Informes para buscar el control CrystalReportViewer. 9. Arrastre el control CrystalReportViewer al formulario Windows Forms. 10. En la ventana Propiedades, establezca la propiedad Name: ○ Para proyectos de Visual Basic, defina el valor como "myCrystalReportViewer". ○ Para proyectos de C#, defina el valor como "crystalReportViewer". 11. En el menú Archivo, haga clic en Guardar todo. Información relacionada Instalaciones necesarias [página 9] 1.5.3.2.2 Configurar el informe mediante tareas inteligentes En el control CrystalReportViewer de proyectos para Windows, el panel Tarea inteligente se denomina Tareas de CrystalReportViewer. Las selecciones que lleve a cabo en las tareas inteligentes se generan como código en una clase parcial Form1. En esta sección va a configurar un nuevo informe con el panel Tarea inteligente CrystalReportViewer y el diseñador de SAP Crystal Reports incrustado. Más adelante en estos tutoriales de código reducido, va a examinar otras funciones de tareas inteligentes. 1.5.3.2.2.1 Configurar el informe mediante etiquetas inteligentes Procedimiento 1. En la esquina superior derecha del control CrystalReportViewer, haga clic en el botón triangular pequeño. Se abrirá el panel Tarea inteligente denominado Tareas de CrystalReportViewer. 2. Haga clic en el vínculo Crear un informe nuevo. 3. En el cuadro de diálogo Crear un nuevo informe de Crystal, especifique el nombre XtremeCustomers.rpt y haga clic en Aceptar. Se abre el cuadro de diálogo Galería de informes de Crystal. 4. En el panel Crear un nuevo documento de Crystal Reports del cuadro de diálogo Galería de Crystal Reports, seleccione Usar asistente de informes. 5. En el panel Elegir un Asistente, seleccione Estándar y, a continuación, haga clic en Aceptar. 6. En el panel Orígenes de datos disponibles de la ventana Asistente para la creación de informes estándar, siga estos pasos: Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 511 a) Expanda la carpeta Crear nueva conexión. b) Expanda la carpeta ODBC (RDO). 7. En la ventana ODBC (RDO), seleccione la entrada ODBC DSN correcta para la base de datos de muestra Xtreme y haga clic en Finalizar. Se expandirá la carpeta ODBC (RDO) y mostrará la base de datos Xtreme. 8. Expanda el nodo Tablas y, a continuación, seleccione la tabla Cliente. 9. Haga doble clic en la tabla Cliente para moverla al panel Tablas seleccionadas y, a continuación, haga clic en Siguiente. 10. Presione Ctrl mientras hace clic en Nombre del cliente, Título del contacto, Dirección1 y Ciudad. 11. Haga clic en el símbolo > para mover estos campos al panel Campos a mostrar y, a continuación, haga clic en Siguiente. 12. En el panel Campos disponibles, en Campos del informe, seleccione Cliente.Ciudad, haga clic en el símbolo > para mover el campo al panel Agrupar por y, a continuación, haga clic en Finalizar. Se crea el informe XtremeCustomers y se carga en la ventana principal de Visual Studio. 13. En la parte inferior de la ventana, haga clic en Vista previa del informe principal. Nota El botón Vista previa es una función del diseñador de SAP Crystal Reports incrustado que se incluye en SAP Crystal Reports, versión para programadores de Microsoft Visual Studio. 14. En la parte inferior de la ventana, haga clic en Informe principal para salir del modo de vista previa. 15. Vuelva a la clase Form1. El informe se muestra en el modo de vista previa en tiempo de diseño y muestra el diseño gráfico del informe en el formulario Web Forms. Debajo de Form1, se muestra el informe XtremeCustomers en la bandeja de componentes. 16. En el menú Archivo, haga clic en Guardar todo. 1.5.3.2.2.2 Para cambiar el nombre de la variable de informe Contexto Se crea el informe y se convierte en el informe designado del control CrystalReportViewer. En este punto, es conveniente cambiar el nombre de la variable de informe. Procedimiento 1. Haga clic en XtremeCustomers1 en la bandeja de componentes para seleccionarla. 2. En la ventana Propiedades, establezca el valor del campo Name en "xtremeCustomersReport". 512 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 1.5.3.2.2.3 reducido Para probar el proyecto de Windows de código Contexto Ahora estará listo para crear y ejecutar el proyecto. Procedimiento 1. En el menú Generar, seleccione Generar solución. 2. Si existen errores de generación, continúe y corríjalos ahora. 3. En el menú Depurar, haga clic en Iniciar. 4. Se muestra el informe XtremeCustomers en una nueva aplicación de Windows. 5. Vuelva a Visual Studio y haga clic en Detener para salir del modo de depuración. 1.5.3.2.3 Explorar el código generado por tareas inteligentes En esta sección, va a explorar el código generado por las tareas inteligentes, que le permitía configurar un proyecto para Windows con SAP Crystal Reports sin tener que escribir código. 1.5.3.2.3.1 Para explorar el código generado por las tareas inteligentes Procedimiento 1. Abra la clase Form1. 2. En el menú Ver, haga clic en Código. La clase Form1 se abrirá en la vista de código y mostrará una clase vacía. Nota En C#, la clase vacía se muestra en el constructor de la clase. public Form1() { InitializeComponent(); } Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 513 1.5.3.2.3.2 Para ver la clase parcial Form1 oculta Contexto Observe que falta el siguiente código: ● La declaración de la instancia del control CrystalReportViewer. ● La copia del informe XtremeCustomers. ● El código que enlaza el informe con el control CrystalReportViewer. El código que falta se ha ocultado en una clase parcial. Estas clases permiten que una clase acepte un apéndice de otro archivo de clase, asignando al otro archivo de clase el mismo nombre de clase precedido de la palabra "partial". La clase parcial suele contener código de diseñador autogenerado. Para ver el código autogenerado que no aparece en la clase Form1, explorará CrystalReportViewer y las copias del informe de la clase parcial Form1 oculta. Procedimiento 1. En el Explorador de soluciones, haga clic en el icono de la barra de herramientas Mostrar todos los archivos. 2. Expanda Form1.cs o Form1.vb. Se mostrará Form1.Designer.cs o .vb. 3. Haga clic con el botón secundario en Form1.Designer.cs o .vb y seleccione Ver código. Se abre la clase parcial Form1 y muestra el código autogenerado de esta clase. Se incluye la declaración de la instancia del control CrystalReportViewer, la copia del informe XtremeCustomers, y el código que enlaza el informe con la instancia del control CrystalReportViewer. Nota Si prefiere escribir el código y colocarlo en la clase de código subyacente, vea Configuración de proyectos [página 14]. 1.5.3.3 Tutorial: Conexión de base de datos segura de código reducido en un sitio web En este tutorial de sitio Web de código reducido, va a aprender a mostrar un informe con información de una base de datos segura de SQL Server. Introducción En este tutorial de sitio Web de código reducido, va a aprender a mostrar un informe con información de una base de datos segura de SQL Server. Para proporcionar una conexión de base de datos segura, va a asignar la 514 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net propiedad DataSources del informe al control SQLDataSource, que forma parte del nuevo marco del control DataSource en .Net 2.0. En este tutorial, para mostrar un informe que contenga información de una base de datos segura de SQL Server, va a utilizar el nuevo modelo de desarrollo de aplicaciones basado en etiquetas para conectar los componentes clave: ● Conecte un control CrystalReportViewer a un control CrystalReportSource. ● Conecte el control CrystalReportSource a un informe. ● Conecte la propiedad DataSources del informe a un control SqlDataSource. Nota DataSources se ve como una propiedad de informe en la ventana Propiedades, o como una etiqueta en la vista de origen HTML. Todo este trabajo se realiza sin tener que escribir código. Nota También está disponible un modelo de desarrollo de codificación de este tutorial. Vea Tutorial: Conectar con una base de datos segura de SQL Server utilizando autenticación de SQL [página 348] o Tutorial: Conectar con una base de datos segura de SQL Server utilizando seguridad integrada [página 366]. Para empezar, agregará un control CrystalReportViewer al formulario Web. A partir de las tareas inteligentes puede crear un control CrystalReportSource y, a continuación, generar un informe de Crystal con el diseñador de SAP Crystal Reports incrustado. Este informe se conecta a una base de datos de servidor SQL segura. Dentro del control CrystalReportSource se hace referencia a este informe. A continuación, aprenderá a configurar la conexión a la base de datos segura del servidor SQL para devolver las tablas necesarias que utiliza el informe de Crystal. En primer lugar, active la opción "Habilitar solicitud de conexión con la base de datos" en Tareas inteligentes. Una vez activada esta opción, la excepción que se genera durante un error de conexión a la base de datos se reemplaza por una solicitud que pide al usuario que se conecte manualmente. Para configurar una conexión correcta a la base de datos solicitada, agregue un control SqlDataSource y, a continuación, configúrelo para la dirección de la base de datos segura del servidor SQL y devuelva las tablas necesarias. Finalmente, asignará la propiedad DataSource del informe al control SqlDataSource que ha creado. Código de ejemplo Este tutorial incluye código de ejemplo de C# y Visual Basic que muestra la versión finalizada del proyecto. Siga las instrucciones de este tutorial para crear un nuevo proyecto o para abrir el proyecto de código de ejemplo y trabajar con una versión finalizada. El código de ejemplo se almacena en carpetas que están clasificadas por idioma y tipo de proyecto. Los nombres de las carpetas de cada versión del código de ejemplo son los siguientes: ● Sitio Web en C#: CS_Web_ReducedCode_DBLogon Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 515 ● Sitio Web en Visual Basic: VB_Web_ReducedCode_DBLogon Información relacionada Directorio de informes de muestra [página 14] 1.5.3.3.1 Crear un sitio Web con un control CrystalReportViewer Antes de crear un sitio Web, verifique que se ha instalado SAP Crystal Reports, versión para programadores de Microsoft Visual Studio en el sistema. Este tutorial requiere que se configuren algunos parámetros de base de datos como requisito previo. 1.5.3.3.1.1 datos ● Requisitos previos de configuración de la base de Configuración de SQL Server: ○ Si tiene instalado SQL Server (o la versión OEM, MSDE), debe configurarse de modo que requiera la Autenticación de SQL Server. ○ Si no tiene instalado SQL Server (ni la versión OEM, MSDE), debe instalar MSDE con la autenticación de SQL Server establecida en "True". ● Se debe instalar la base de datos Northwind incluida con SQL Server y verificar que requiere la autenticación de SQL Server. ● Se debe crear una cuenta de acceso limitado para utilizarla en el sitio Web. Una vez configurados SQL Server y la base de datos Northwind de acuerdo a las secciones anteriores, ya podrá crear un sitio Web que muestre un informe de Crystal que obtenga su información de la base de datos Northwind de forma segura. 1.5.3.3.1.2 Para configurar un sitio Web de código reducido en SAP Crystal Reports, versión para programadores de Microsoft Visual Studio Procedimiento 1. 516 Inicie Visual Studio. © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 2. En el menú Archivo, seleccione Nuevo y haga clic en Sitio Web. 3. En el cuadro de diálogo Nuevo sitio Web, haga clic en Sitio Web ASP.NET. 4. En la lista desplegable Ubicación, seleccione Sistema de archivos. 5. En la lista desplegable Idioma, seleccione el idioma de codificación que desea usar. 6. En el campo de texto Ubicación indique la ruta de directorio C:\WebSites\, seguida del nombre del proyecto. 7. Haga clic en Aceptar. Se abre el proyecto en el Explorador de soluciones y contiene una página Default.aspx. 8. Abra la página Default.aspx (el formulario Web). 9. En el menú Ver, haga clic en Diseñador. Nota También puede cambiar a la vista de diseño haciendo clic en el botón Diseño en la parte inferior de la vista del formulario. 10. En el Cuadro de herramientas, abra el nodo Informes para buscar el control CrystalReportViewer. 11. Arrastre el control CrystalReportViewer al formulario Web Forms. Se abrirá el panel Tarea inteligente denominado "Tareas de CrystalReportViewer". 1.5.3.3.2 Configurar CrystalReportSource mediante tareas inteligentes En Visual Studio 2005 se ha agregado una nueva función de GUI para los controles .NET denominada Tareas inteligentes. En el control CrystalReportViewer de sitios Web, el panel Tarea inteligente se denomina "Tareas de CrystalReportViewer". El panel Tarea inteligente "Tareas de CrystalReportViewer" permite configurar varias funciones del control CrystalReportViewer, sin tener que escribir código. Las selecciones que lleve a cabo en las tareas inteligentes se generan como configuración basada en etiquetas en la página ASPX. En esta sección, va a configurar el control CrystalReportSource disponible desde la Tarea inteligente "Tareas de CrystalReportViewer". Más adelante en estos tutoriales de código reducido, va a examinar otras funciones de tareas inteligentes. Para empezar, va a aprender a cerrar y a volver a abrir tareas inteligentes. Información relacionada El panel de tareas inteligentes [página 47] Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 517 1.5.3.3.2.1 Configurar CrystalReportSource mediante tareas inteligentes Procedimiento 1. Si el panel Tarea inteligente está abierto actualmente, haga clic en el formulario Web para cerrar las tareas inteligentes. 2. En la esquina superior derecha del control CrystalReportViewer, haga clic en el botón triangular pequeño. Se volverá a abrir el panel Tarea inteligente denominado "Tareas de CrystalReportViewer". En la lista Elegir origen de informe, se muestra <Ninguna>. 3. Haga clic en la lista Elegir un origen de informe y seleccione <Nuevo origen de informe…>. Se abrirá el cuadro de diálogo Crear ReportSource. 4. En el cuadro de texto Especifique nombre del control, deje la entrada predeterminada CrystalReportSource1. 5. Haga clic en la lista desplegable Especifique un informe para el control ReportSource y seleccione <Nuevo informe>. La selección alternativa es <Examinar…>. Esa opción le permite seleccionar un informe de Crystal existente desde el directorio de archivos. Sin embargo, más adelante creará un nuevo informe que es necesario para este tutorial. 6. En el cuadro de diálogo Crear un nuevo informe de Crystal Reports, especifique el nombre "NorthwindCustomers.rpt". 7. Haga clic en Aceptar y otra vez en Aceptar para cerrar el cuadro de diálogo Crear ReportSource. 1.5.3.3.3 Crear y conectar el informe conectado a una base de datos segura Ahora comenzará el proceso de creación y conexión del informe. 1.5.3.3.3.1 Para crear y conectar el informe a una base de datos segura Procedimiento 1. En el panel Crear un nuevo documento de Crystal Reports del cuadro de diálogo Galería de Crystal Reports, seleccione Usar asistente de informes. 2. En el panel Elegir un Asistente, seleccione Estándar y, a continuación, haga clic en Aceptar. 3. En el panel Orígenes de datos disponibles, expanda la carpeta Crear nueva conexión. 4. En la subcarpeta que se abre, expanda la carpeta OLE DB (ADO). 5. En el cuadro de diálogo OLE DB (ADO), seleccione Proveedor de Microsoft OLE DB para SQL Server y, a continuación, haga clic en Siguiente. 518 © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 6. Ahora puede usar la Autenticación SQL o la Autenticación de Windows con la Seguridad integrada: ○ Si usa la autenticación de SQL, especifique los valores de su servidor de base de datos, id de usuario y contraseña en los campos Servidor, ID de usuario y Contraseña y, a continuación, en la lista Base de datos, seleccione Nota Por razones de seguridad, es importante utilizar una cuenta de base de datos con permisos de acceso limitado. ○ Si usa la autenticación de Windows con Seguridad integrada, especifique el valor de su servidor de base de datos y active la casilla de verificación Seguridad integrada y, a continuación, en la lista Base de datos, seleccione "Northwind". 7. Haga clic en Finalizar. Ahora se expande la carpeta OLE DB para mostrar el servidor de base de datos y dentro de él, la base de datos Northwind. 8. Expanda los nodos Northwind, dbo y Tablas, y, a continuación, seleccione la tabla Customers. 9. Haga clic en el símbolo > para mover la tabla al panel Tablas seleccionadas y, a continuación, haga clic en Siguiente. 10. Mantenga presionada la tecla Ctrl y haga clic en CompanyName, ContactName y City. 11. Haga clic en el símbolo > para mover estos campos al panel Campos a mostrar y, a continuación, haga clic en Siguiente. 12. En el panel Campos disponibles, en Campos del informe, seleccione Cliente.Ciudad, haga clic en el símbolo > para mover el campo al panel Agrupar por y, a continuación, haga clic en Finalizar. Se creará el informe NorthwindCustomers y se cargará en la ventana principal de Visual Studio. 13. En la parte inferior de la ventana, haga clic en Vista previa del informe principal. El informe se muestra en el modo de vista previa y muestra los datos de la base de datos Northwind segura. 14. En la parte inferior de la ventana, haga clic en Informe principal para salir del modo de vista previa. 15. Abra el formulario Web Forms. 16. En el menú Ver, haga clic en Diseñador. El informe se muestra en el modo Vista previa en tiempo de diseño y muestra el diseño gráfico del informe en el formulario Web. 17. En el menú Archivo, haga clic en Guardar todo. 1.5.3.3.3.2 Para probar el sitio Web de código reducido Contexto Se crea el informe y ya es el informe designado para el control CrystalReportSource. Ahora estará listo para crear y ejecutar el proyecto. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. 519 Procedimiento 1. En el menú Generar, seleccione Generar solución. 2. Si existen errores de generación, continúe y corríjalos ahora. 3. En el menú Depurar, haga clic en Iniciar. 4. Aparece una página de solicitud de conexión de base de datos en la que se pide que se especifique la contraseña de la base de datos. Se trata del resultado esperado, por dos razones: ○ Aún no ha configurado el origen de datos. ○ En el control CrystalReportViewer de las tareas inteligentes, está activada la casilla de verificación "Habilitar solicitud de conexión de base de datos" de forma predeterminada. 5. Especifique la contraseña y haga clic en Conectar. 6. Se muestra el informe NorthwindCustomers en el explorador Web. 7. Vuelva a Visual Studio y haga clic en Detener para salir del modo de depuración. 1.5.3.3.4 Configurar solicitud de conexión de base de datos en la tarea inteligente En este procedimiento, va a examinar el efecto de desactivar "Habilitar solicitud de conexión de base de datos" en la tarea inteligente. 1.5.3.3.4.1 Para configurar la solicitud de conexión de base de datos en la tarea inteligente Procedimiento 1. Abra la página Default.aspx (el formulario Web). 2. En el menú Ver, haga clic en Diseñador. 3. En la esquina superior derecha del control CrystalReportViewer, haga clic en el botón triangular pequeño. Se abrirá el panel Tarea inteligente "Tareas de CrystalReportViewer". 4. Desactive la casilla de verificación Habilitar solicitud de conexión de base de datos. 5. Haga clic en el formulario Web Forms para cerrar el panel Tarea inteligente. 6. En el menú Generar, seleccione Generar solución. 7. Si existen errores de generación, continúe y corríjalos ahora. 8. En el menú Depurar, haga clic en Iniciar. Puesto que la solicitud conexión de base de datos ya no está habilitada, se inicia una excepción "No es posible conectar" en la ventana de la aplicación Web. 9. 520 Vuelva a Visual Studio y haga clic en Detener para salir del modo de depuración. © 2014 SAP AG o una filial de SAP. Reservados todos los derechos. Manual del desarrollador del SDK .Net de SAP Crystal Reports para Visual Studio Manual del desarrollador del SDK de SAP Crystal Reports .Net 10. Vuelva al panel Tarea inteligente del control CrystalReportViewer. 11. Active la casilla de verificación Habilitar solicitud de conexión de base de datos. 12. Cierre Tareas inteligentes. 13. En el menú Archivo, haga clic en Guardar todo. 1.5.3.3.5 Agregar un control SqlDataSource En ASP.NET 2.0, los orígenes de datos ya están configurados y se tiene acceso a ellos mediante el nuevo marco del control DataSource. De forma predeterminada, un informe de Crystal pasa por alto la necesidad de tener una base de datos separada porque el acceso a los datos está encapsulado dentro del informe. Sin embargo, si los datos provienen de un servidor SQL, el informe necesita un origen de datos para administrar el proceso de conexión. 1.5.3.3.5.1 Para agregar un control SqlDataSource Procedimiento 1. Abra la página Default.aspx (el formulario Web). 2. En el menú Ver, haga clic en Diseñador. Nota También puede cambiar a la vista de diseño haciendo clic en el botón Diseño en la parte inferior de la vista del formulario. 3. Haga clic a la derecha del control CrystalReportSource y, a continuación, presione INTRO. Aparecerá un cursor parpadeante debajo del control CrystalReportSource. 4. En el Cuadro de herramientas, haga clic en el subnodo Datos para expandir los controles Data. 5. En el s