Enlazar a un informe no incrustado cargado en una clase de utilidad de administración de caché
Modelo de objetos
Este caso de enlace de informes utiliza ReportDocument (vea Enlazar informes al modelo de objetos 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é. 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 Cuándo utilizar informes incrustados o no incrustados.
Crystal Reports para 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é, 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.
Para obtener información detallada sobre el almacenamiento en caché de los informes y el uso de la clase de utilidad de almacenamiento en caché, vea Cuándo utilizar informes normales o almacenados en caché.
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. Para obtener información sobre cuándo se debe utilizar el almacenamiento en caché, vea Almacenar en caché informes con "alta compartibilidad".
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. Vea Session y persistencia del modelo de objetos ReportDocument.
Para almacenar en caché y, a continuación, enlazar un informe no incrustado a un control CrystalReportViewer
Nota |
---|
Este procedimiento sólo funciona con un proyecto creado a partir de la Configuración de proyectos. 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. Por lo tanto, antes de empezar con este procedimiento, primero debe seguir los pasos de Configuración de proyectos. |
Busque el archivo World Sales Report.rpt en el subdirectorio General Business. Para obtener información sobre informes de ejemplo, vea Directorio de informes de muestra.
Copie la ruta de directorio de archivos completa al Portapapeles, incluido World Sales Report.rpt.
En el método ConfigureCrystalReports() (creado en Configuración de proyectos), 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.
``` vb
Dim reportPath As String = _
"C:\Program Files\Microsoft Visual Studio 9.0\" _
& "Crystal Reports\Samples\En\Reports\General Business\" _
& "World Sales Report.rpt"
```
``` csharp
string reportPath =
"C:\\Program Files\\Microsoft Visual Studio 9.0\\"
+ "Crystal Reports\\Samples\\En\\Reports\\General Business\\"
+ "World Sales Report.rpt";
```
- Declare y cree una instancia de la clase NonEmbeddedReportCacher y, a continuación, pásela a la variable de cadena reportFile.
<table>
<colgroup>
<col style="width: 100%" />
</colgroup>
<thead>
<tr class="header">
<th><img src="images\z15yzzew.alert_note(es-es,VS.90).gif" class="note" />Nota</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><p>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.</p></td>
</tr>
</tbody>
</table>
``` vb
Dim myNonEmbeddedReportCacher As NonEmbeddedReportCacher = _New NonEmbeddedReportCacher(reportFile)
```
``` csharp
NonEmbeddedReportCacher nonEmbeddedReportCacher = new NonEmbeddedReportCacher(reportFile);
```
- Asigne la instancia de la clase de utilidad de administración de almacenamiento en caché de informes a la propiedad ReportSource del control CrystalReportViewer.
``` vb
myCrystalReportViewer.ReportSource = myNonEmbeddedReportCacher
```
``` csharp
crystalReportViewer.ReportSource = nonEmbeddedReportCacher;
```
Para crear la clase de utilidad de administración de almacenamiento en caché de la clase NonEmbeddedReportCacher
- Cree una nueva clase en el proyecto denominada NonEmbeddedReportCacher.
``` vb
Public Class NonEmbeddedReportCacher
End Class
```
``` csharp
using System;
namespace MyWebApplication
{
public class NonEmbeddedReportCacher
{
public NonEmbeddedReportCacher()
{
}
}
}
```
- Agregue la interfaz ICachedReport a la firma de la clase.
``` vb
Public Class NonEmbeddedReportCacher
Implements ICachedReport
```
``` csharp
public class NonEmbeddedReportCacher : ICachedReport
```
- Agregue tres instrucciones "Imports" [Visual Basic] o "using" [C#] en la parte superior de la clase.
``` vb
Imports CrystalDecisions.Shared
Imports CrystalDecisions.ReportSource
Imports CrystalDecisions.CrystalReports.Engine
```
``` csharp
using CrystalDecisions.Shared;
using CrystalDecisions.ReportSource;
using CrystalDecisions.CrystalReports.Engine;
```
- En la clase, declare dos instancias de nivel de clase: una instancia de clase denominada reportFileName y una instancia de ReportDocument denominada nonEmbeddedReportDocument.
``` vb
Private reportFileName As String
Private nonEmbeddedReportDocument As ReportDocument
```
``` csharp
private string reportFileName;
private ReportDocument nonEmbeddedReportDocument;
```
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:
- IsCacheable
- ShareDBLogonInfo
- CacheTimeOut
- CreateReport()
- GetCustomizedCacheKey(solicitud RequestContext)
Cree la propiedad IsCacheable, que debe devolver true.
``` vb
Public Overridable Property IsCacheable() As Boolean Implements ICachedReport.IsCacheable
Get
Return True
End Get
Set(ByVal Value As Boolean)
End Set
End Property
```
``` csharp
public virtual Boolean IsCacheable
{
get
{
return true;
}
set
{
}
}
```
- Cree la propiedad ShareDBLogonInfo, que debe devolver false.
``` vb
Public Overridable Property ShareDBLogonInfo() As Boolean Implements ICachedReport.ShareDBLogonInfo
Get
Return False
End Get
Set(ByVal Value As Boolean)
End Set
End Property
```
``` csharp
public virtual Boolean ShareDBLogonInfo
{
get
{
return false;
}
set
{
}
}
```
- Cree la propiedad CacheTimeOut, que devuelve una constante desde la clase CachedReportConstants.
``` vb
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
```
``` csharp
public virtual TimeSpan CacheTimeOut
{
get
{
return CachedReportConstants.DEFAULT_TIMEOUT;
}
set
{
}
}
```
- Cree el método CreateReport(), que devuelve un informe no incrustado cargado en la instancia ReportDocument de nivel de clase.
``` vb
Public Overridable Function CreateReport() As ReportDocument Implements ICachedReport.CreateReport
If nonEmbeddedReportDocument Is Nothing Then
nonEmbeddedReportDocument = New ReportDocument()
nonEmbeddedReportDocument.Load(reportFileName)
End If
Return nonEmbeddedReportDocument
End Function
```
``` csharp
public virtual ReportDocument CreateReport()
{
if (nonEmbeddedReportDocument == null)
{
nonEmbeddedReportDocument = new ReportDocument();
nonEmbeddedReportDocument.Load(reportFileName);
}
return nonEmbeddedReportDocument;
}
```
- Cree el método GetCustomizedCacheKey() y devuelva el valor nulo.
<table>
<colgroup>
<col style="width: 100%" />
</colgroup>
<thead>
<tr class="header">
<th><img src="images\z15yzzew.alert_note(es-es,VS.90).gif" class="note" />Nota</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><p>Si este método devuelve el valor nulo, hace que el propio SDK de 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.</p></td>
</tr>
</tbody>
</table>
``` vb
Public Overridable Function GetCustomizedCacheKey(ByVal request As RequestContext) As String Implements ICachedReport.GetCustomizedCacheKey
Return Nothing
End Function
```
``` csharp
public virtual String GetCustomizedCacheKey(RequestContext request)
{
return null;
}
```
- Para ver el informe, cree y ejecute el proyecto.