Objeto
Crystal
una
clase que encapsula el control crystal para facilitar el acceso a
los informes con una base de datos SQL SERVER.
Fecha: 24/Ago/98 (20/Ago/98)
Autor: Javier Nieto Jnieto@syseca.es
Autor: Javier
Nieto Esteban
e-mail jnieto@syseca.es
Fecha: 16 Agosto 1998
OBJETO CRISTAL
FUNCIONALIDAD
Encapsular el control crystalReport con el fin de proporcionar la mayor automatización posible en las conexiones de este desde Visual Basic a una base de datos SQL Server.
Para ello, el objeto se encargará de gestionar el limpiado y asignación de las propiedades usadas más frecuentemente, sin perder por ello todas las demás facilidades que el control crystal ofrece.
CICLO DE USO
| Instanciación del objeto. El objeto podrá ser global a la aplicación y accesible desde cualquier parte de esta. Otra opción es arrastrar por la aplicación la referencia al objeto mediante el paso de parámetros. | |
| Inicialización del objeto. Call CrystalObj.Init(g_strDBNAME, g_strUSR, g_strPWD, 1, CrystalReport). |
|
| Configuración del objeto. Call CrystalObj.Configure("informe.rpt", "Nombre del informe", SCREENMODE) |
|
| Paso de parámetros y fórmulas. Si el informe usa algún procedimiento almacenado o alguna fórmula, pueden ser pasados mediante los métodos UspParama y rptForumulas. |
|
| Ejecución del informe. Call CrystalObj.Execute |
| El resto de las propiedades y métodos del objeto Crystal, pueden ser usados mediante CrystalObj.Obj. .... | |
| El objeto se descarga automáticamente al terminar la aplicación. |
NOTAS AL USO
Para tener acceso a todas las funcionalidades del objeto Crysta, tendremos que instanciarlo With Events. Para ello, debe ser declarado en un formulario o módulo de objeto, o en su defecto, pasado como referencia a un formulario y definida dicha referencia como With Events.
El objeto generará eventos al conectarse a la base de datos y al lanzar informes. Dichos eventos pueden ser fácilmente capturados para nuestros propósitos, como mostrar mensajes informativos etc.
No es necesario limpiar las propiedades del control después de lanzar un informe, puesto que el propio objeto gestiona internamente el borrado, teniendo en cuenta el número de fórmulas y parámetros del procedimiento almacenados.
En teoría, la conexión del objeto a la base de datos se hará cuando sea necesaria. En la práctica, he estado haciendo pruebas y sospecho que el propio cristal se encarga de esto, aunque no esta de más hacer esta comprobación, asegurando que la conexión no se abre si el usuario no pide ningún informe (las conexiones en SQL Server consumen recursos en la máquina servidor). Esto debería ser especialmente importante en aplicaciones multiusuario.
CÓDIGO
Option Explicit
'Objeto de conexión de informes CRYSTAL mediante SQL-SERVER 'Objeto creado por Javier Nieto , Julio del 98
'variables locales que contienen valores de propiedad
Enum PRINTMODES
PRINTERMODE
SCREENMODE
QUESTIONMODE
End Enum
Private mvarDSN As String 'copia local
Private mvarUID As String 'copia local
Private mvarPWD As String 'copia local
Private mvarPrintMode As PRINTMODES 'copia local
Private mvarErrorHandlerMode As Byte 'copia local
Private mvarMaxParam As Integer 'Número máximo de parámetros usados
Private mvarMaxFormulas As Integer 'Número máximo de fórmulas usadas
Private mvarConnected As Boolean 'Para guardar si el objeto está conectado
'Para activar este evento, use RaiseEvent con la siguiente sintaxis:
'RaiseEvent StartAction[(arg1, arg2, ... , argn)]
Public Event StartAction(strAction As String)
'Para activar este evento, use RaiseEvent con la siguiente sintaxis:
'RaiseEvent EndAction[(arg1, arg2, ... , argn)]
Public Event EndAction(strAction As String)
Private mvarObj As CrystalReport 'copia local
Public Sub Clear(Optional maxFormulas As Variant, Optional maxParam As Variant)
' Limpia las propiedades del objeto cristal.
Dim intI As Integer
Dim intMaxF As Integer
Dim intMaxP As Integer
If IsMissing(maxFormulas) Then
intMaxF = mvarMaxFormulas
Else
intMaxF = maxFormulas
End If
If IsMissing(maxParam) Then
intMaxP = mvarMaxParam
Else
intMaxP = maxParam
End If
'Guardo los valores más altos que entren en el clear
'Así me aseguro de que son los más altos.
If intMaxP > mvarMaxParam Then
mvarMaxParam = maxParam
End If
If intMaxF > mvarMaxFormulas Then
mvarMaxFormulas = maxFormulas
End If
With mvarObj
.ReportFileName = Empty
.WindowTitle = Empty
.GroupSelectionFormula = Empty
.SelectionFormula = Empty
.SQLQuery = Empty
For intI = 0 To intMaxF - 1
.Formulas(intI) = Empty
Next
For intI = 0 To intMaxP - 1
.StoredProcParam(intI) = Empty
Next
End With
End Sub
Private Sub rptConnect()
'Abre la conexión con le informe
On Error GoTo ConnectError
RaiseEvent StartAction("Abriendo la conexión para los informes")
mvarObj.Connect = "DSN =" & mvarDSN & ";UID = " & mvarUID & ";PWD =" & mvarPWD
mvarConnected = True
RaiseEvent EndAction("Inicializada la conexión para los informes")
Exit Sub
ConnectError:
mvarConnected = False
If ErrorHandlerMode = 0 Then
Call err.Raise(err.Number, "CristalObj", err.Description)
Else
Call MsgBox(err.Description, vbCritical, "Error de informe")
End If
RaiseEvent EndAction(" ")
End Sub
Public Sub Execute()
On Error GoTo ExecuteError
If Not mvarConnected Then 'Si todavia no se ha conectado me conecto
Call rptConnect
End If
Select Case mvarPrintMode
Case PRINTERMODE
mvarObj.Destination = crptToPrinter
Case SCREENMODE
mvarObj.Destination = crptToWindow
Case QUESTIONMODE
If MsgBox("¿ Desea imprimir directamente el informe?", _
vbYesNo) = vbYes Then
mvarObj.Destination = crptToPrinter
Else
mvarObj.Destination = crptToWindow
End If
End Select
RaiseEvent StartAction("Lanzando el informe...")
mvarObj.Action = 1 'lanzo el informe
RaiseEvent EndAction(" ")
Call Clear 'BORRO EL INFORME
Exit Sub
ExecuteError:
'Se ha producido un error de ejecución al lanzar el informe
Dim lngErr As Long
Dim strErr As String
lngErr = err.Number
strErr = err.Description
RaiseEvent EndAction(" ")
Clear
If ErrorHandlerMode = 0 Then
Call err.Raise(lngErr, "CristalObj", strErr)
Else
Call MsgBox("Error : " & lngErr & vbCrLf & strErr, vbCritical, _
"Error de informe:" & strErr)
End If
End Sub
Public Sub rptFormulas(ParamArray paramFormulas())
'Guarda las fórmulas en orden
Dim intI As Integer
If UBound(paramFormulas) + 1 > mvarMaxFormulas Then
mvarMaxFormulas = UBound(paramFormulas) + 1
End If
With mvarObj
For intI = LBound(paramFormulas) To UBound(paramFormulas)
.Formulas(intI) = paramFormulas(intI)
Next intI
End With
End Sub
Public Sub UspParam(ParamArray paramProc())
'Guarda los parámetros del procedimiento almacenado en orden
Dim intI As Integer
If UBound(paramProc) + 1 > mvarMaxParam Then
mvarMaxParam = UBound(paramProc) + 1
End If
With mvarObj
For intI = LBound(paramProc) To UBound(paramProc)
.StoredProcParam(intI) = paramProc(intI)
Next intI
End With
End Sub
Public Sub Configure(strName As String, strDescription As String, _
printMode As PRINTMODES)
'Configura el nombre del informe,
'la caption de la ventana,
'el modelo de impresión del informe...
Call Clear
mvarPrintMode = printMode
With mvarObj
.ReportFileName = strName
.WindowTitle = strDescription
End With
End Sub
Public Sub Init(strDSN As String, strUID As String, strPWD As String, _
errorMode As Byte, crtObj As CrystalReport)
'inicializa la conexión , no conecta.
mvarDSN = strDSN
mvarUID = strUID
mvarPWD = strPWD
mvarErrorHandlerMode = errorMode
Set mvarObj = crtObj
mvarConnected = False 'en un principio, no se conecta
End Sub
Public Property Set obj(ByVal vData As CrystalReport)
'se usa cuando se asigna un objeto a una propiedad, en el lado izquierdo de la instrucción Set.
'Syntax: Set x.Obj = Form1
Set mvarObj = vData
End Property
Public Property Get obj() As CrystalReport
'se usa cuando se asigna un valor a una propiedad, en el lado derecho de la asignación.
'Syntax: Debug.Print X.Obj
Set obj = mvarObj
End Property
Public Property Let ErrorHandlerMode(ByVal vData As Byte)
mvarErrorHandlerMode = vData
End Property
Public Property Get ErrorHandlerMode() As Byte
ErrorHandlerMode = mvarErrorHandlerMode
End Property
Public Property Let printMode(ByVal vData As PRINTMODES)
mvarPrintMode = vData
End Property
Public Property Get printMode() As PRINTMODES
printMode = mvarPrintMode
End Property
Public Property Let PWD(ByVal vData As String)
mvarPWD = vData
End Property
Public Property Get PWD() As String
PWD = mvarPWD
End Property
Public Property Let UID(ByVal vData As String)
mvarUID = vData
End Property
Public Property Get UID() As String
UID = mvarUID
End Property
Public Property Let DSN(ByVal vData As String)
mvarDSN = vData
End Property
Public Property Get DSN() As String
DSN = mvarDSN
End Property
Private Sub Class_Terminate()
Clear
Set mvarObj = Nothing
End Sub