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).
 
 
 
El objeto necesita los par�metros de conexi�n, as� como el control crystal a�adido al formulario principal del proyecto. El objeto, una vez inicializado, guardar� una referencia a dicho control y lo usar� para lanzar los informes.

Tambi�n incializamos el modo en el que el objeto tratar� los errores. Podemos hacer que los eleve a un nivel superior o que los mensajes de error sean lanzados por el propio control.

 Configuraci�n del objeto. Call CrystalObj.Configure("informe.rpt", "Nombre del informe", SCREENMODE)
 
 
 
Configuramos qu� tipo de impresi�n queremos: PRINTMODE, SCREENMODE, QUESTIONMODE. De esta forma, para cada informe de la aplicaci�n, podemos decidir si queremos que aparezca en la pantalla, que se mande directamente a la cola de impresi�n o que el usuario decida.
 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.
 
 
 
Ejemplo:

CrystalObj.UspParam(1, ‘Parametro2’, ......)

CrystalObj.rptFormulas ("Formula1=’Primera F�rmula’" , _

"Formula2=" & intVariable, _

....)

 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

ir al índice