Artículos, trucos y comentarios sobre el Crystal...

 

Autor: Juan José Fernández López (jj2fernandez@recol.es)
Fecha: 18/Ene/98


(Parte de la "conversación" antes de enviarme la colaboración)

Juan José (18/Dic/97)
La verdad es que asi sin un tema en contreto sobre el crystal no se que decirte, como ya te dije he tenido la ocasion de hacer unos cuantos informes, y aun me quedan algunos por hacer en el trabajo.

Yo trabajo con Visual Basic y por extension con el Crystal Reports, y como podras observar mi ingles es pesimo. Estamos desarrollando software para la gestion hospitalaria y como te podras imaginar en un programa para hospitales hay una cantidad enorme de listados a sacar, desde las etiquetas para la admision de los pacientes hasta listados de enfermedades, etc.

No sé en particular que dudas puedas tener pero te puedo decir que con crystal lo mejor es enviar la consulta SQL desde VB donde tu puedes perfectamente decidir lo que le mandas. En CR solo puedes modificar la SQL que haces sobre las tablas que has insertado, y no puedes cambiar desde VB ni la SELECT ni el FROM, pero si afortunadamente el WHERE.

Tambien te puedo comentar a grandes rasgos que despues de muchos quebraderos de cabeza descubrimos que el objeto CR es unico para VB que tu puedes insertar varios pero es como si fuese uno solo. Este le debes insertar en la MDI que tengas y en los demas formularios que le vayas a usar le llamas. Esto surgio porque cuando abrias a la vez varias ventanas que tuvieran abierto una ventana de CR al cerrar una y volver a lanzar la otra saltaba un error desconocido, soltaba un chorro de numeros tremendo.

Bueno no se que mas contarte a grandes rasgos, y necesitas algo mas concreto me lo dices y te paso algo si es que lo se claro 8-).

el Guille (20/Dic/97)
Pues consejillos y trucos como ese que me dices al final es lo que se debría ir poniendo sobre el CR, ya te comenté que no lo uso, así que poco puedo preguntarte y empezar a "revisar" todos los mails que hay con consultas, sería demasiado laborioso, así que si te parece bien, mandame algunos "consejos" y trucos para el CR... lo que tu creas conveniente, una vez que se empiecen a poner, ya surgirán gente que quieran poner otros o cunsultar más cosas... la cuestión es empezar a "dar" algo...

-----

Juan José (03/Ene/98)

Aquí te mando un trozo de código, he intentado comentarlo lo mejor posible, pero es que me parece que el tema del crystal es un poco complicado de comentarlo asi tan general y por escrito, ya que dá mucha guerra como podras comprobar si es que te toca usarlo.

Como ya te dije seria mas facil hablar sobre algo mas concreto. Lo más importante es la posibilidad de poder rellenar campos de formulas desde VB que serán los que te permitan poner en el informe campos que hasta el momento de imprimir el informe desconoces, por ejemplo el rango de fechas que te eligen para el informe, o los parametros de restricción, etc.

Para las formulas, decirte que se crea una matriz que el recuerda y que cada vez que lanzes un informe asegurate de limpiar esa matriz, porque si no la proxima vez que lanzas un informe si el numero de formulas no coincide con la matriz que el se ha creado ‘casca’. (Por ahi vienen los tiros de solo insertar una vez el objeto crystal ya que aunque tu en cada ventana te pongas un
control crystal para VB es un unico objeto)

También te comenté que para visual el CR es como un solo objeto que se inserta una sola vez en el proyecto, y que le puedes llamar las veces que quieras, pero solo insértalo una vez y preferible en la MDI.

En cuanto a la consulta SQL solo le puedes cambiar la clausula WHERE, el resto tiene que tener lo mismo que en el crystal
Ej:

	SQL= “ SELECT * “ _
		& “ FROM tabla1, tabla2 ,etc “ _
		& “ WHERE aqui le pones las condiciones que quieras que 
                                               cumpla el cruce de tablas”

Aqui es donde aprovechas y para restringir el informe, y puedes poner por ejemplo que te traga aquellos campos para un elemento determinado que te han elegido en ejecución. Ej: te seleccionan a un empleado y entonces haces los cruces de tablas necesarios para sacar todos los datos de ese empleado en concreto. Con lo cual cuando diseñas el informe en el CR no sabes que empleado te seleccionarán en ejecución, tu preparas el informe y luego es cuando le mandas la clausula definitiva.

Dim cadena1 As String
Dim cadena2 As String
Dim cadena3 As String

Dim viForm As Integer
    
    PathString = App.Path	‘Para saber la ruta de donde está la aplicación, que luego 
‘empleamos para situar el informe

	‘ Opciones de como mostrar el report
    CMDIMenu.CrystalReport.WindowState = crptMaximized
    CMDIMenu.CrystalReport.Destination = crptToWindow
	
‘ Cuando haya campos en el informe que quieras rellenar, pero que su contenido es 
completamente variable, es decir solo sabes que hay que poner en ese campo cuando en 
ejecucion te hallan seleccionado algo, por ejemplo un rango de fechas para un informe, hay que 
emplear campos de formulas vacios, y que luego desde VB los rellenamos con las siguientes 
sentencias:
    CMDIMenu.CrystalReport.Formulas(0) = "FORM1= """ & cadena1 & """"
    CMDIMenu.CrystalReport.Formulas(1) = "FORM2= """ & cadena2 & """"
    CMDIMenu.CrystalReport.Formulas(2) = "FORM3= """ & cadena3 & """"
    ‘ Etc. Tantas como formulas vacias haya en el informe y se quieran rellenar desde VB
‘ En cadena1, cadena2, etc. Se pone el contenido que quieres que aparezca en la formula una 
vez que se ejecute el programa y se lanze el CR, eso si hay que asegurarse de que cuando el 
programa pase por estas lineas las variables de cadena tengan algo, si no te saldran unas lineas 
en blanco, que son las correspondientes a las formulas que se han metido en blanco.

    CMDIMenu.CrystalReport.WindowTitle = "Listado de .........." 	El titulo que quieras 
que tenga la ventana

‘ Ruta donde se encuentra el informe, con el pathstring le dices que lo busque en el directorio de 
‘ la Aplicación colgando de una carpeta llamada RPT, por ejemplo
    CMDIMenu.CrystalReport.ReportFileName = PathString & “\RPT\informe.rpt”
    ‘ Con esto le mandas la consulta SQL que tu quieres para el informe

    CMDIMenu.CrystalReport.SQLQuery = stSql	‘ Aqui se pone una cadena que 
‘contenga la sentencia SQL
‘ Es yo creo lo más importante, ya que te permite mandar una consulta variable al crystal , es 
decir que en ejecución te van eligiendo las restricciones que va a tener tu informe si es que las 
tiene, y al final cuando te pulsen imprimir ya sabes todas las restricciones que hay que emplear 
para sacar el listado. Aqui solo puedes cambiar la clausula WHERE, en cuanto al SELECT y al 
FROM debes poner las mismas tablas y campos que tienes insertados en el informe.

    CMDIMenu.CrystalReport.Action = 1	‘ Comando que dispara el Crystal

    viForm = 3		‘ Variable en la que le dices el numero de formulas que has empleado 
para rellenar, que luego hay que borrar. Me explico, el CR se crea una matriz de formulas, y si 
no tienes la precaución de limpiarlas cada vez que lanzas el informe tendrás problemas ya que 
digamos que ‘recuerda’ esa matriz de formulas que se va creando el solito y cuando lanzas otro 
informe si no coincide el numero de formulas que empleas en esa nueva ocasión salta un error.

    vacia_formulas CMDIMenu.CrystalReport, viForm		‘Procedimiento que limpia las 
formulas



Public Sub vacia_formulas(listado As Crystal.CrystalReport, numero As Integer)
    
'Procedimiento que limpia la matriz de formulas que se crea el ibjeto CR
    Dim tiForm As Integer
    
    For tiForm = 0 To numero
        listado.Formulas(tiForm) = ""
    Next tiForm
    For tiForm = 0 To 10
        listado.SortFields(tiForm) = ""
    Next tiForm

End Sub


Es pero que mas o menos te sirva de algo si tienes alguna duda sobre algo me lo comentas


 

ir al índice