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 [email protected]
Autor: Javier
Nieto Esteban
e-mail [email protected]
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