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

 

Autor: Fernando Alvarez Lama (nueva dirección de e-mail: falvarez@intermac.com)
Fecha: 30/Ene/98

Este link te llevará a la entrega anterior



Minicursillo de Cristal Reports (Segunda)

SelectionFormula

Aquí vemos la madre de todas las propiedades. Con ella montamos los filtros que queremos usar para que nuestro informe muestra una u otra cosa.

Su uso

Form1.CR1. SelectionFormula ="{Ofertas.OferCliente} ='" & Cliente.Text & "'"

Descargamos una variable de tipo String sobre una tabla

o…

Total_Final = Val(Total.Text)

Form1.CR1. SelectionFormula ="{Ofertas.Total} =" & Total_Final & ""

Descargamos una variable de tipo Numérico sobre una tabla

o…

Form1.CR1. SelectionFormula ="{Ofertas.OferCliente} ='Yo Mismo'"

Descargamos una cadena fija sobre una tabla

o…

Form1.CR1. SelectionFormula ="{Ofertas.Total} =12"

Descargamos un Número fijo sobre una tabla

 

Bueno, esto está claro para este tipo de cosas. Recordemos que lo que va entre corchetes es:

{Nombre_de_ la_ tabla . Campo}

Pero ahora, las complicaciones.

Esta propiedad admite encadenamientos de tipo AND , así como reordenamientos de ficheros con ORDER BY. Su síntaxis es de tipo SQL aunque no admite todos sus parámetros y tiene ciertas particularidades.

Veamos como se comporta SelectionFormula en un selección sobre un rango de fechas, que es donde difiere de verdad del SQL tradicional.

Observa esta proción de código:

Dim Primera As Date
Dim Ultima As Date
Primera = CDate(Fecha1.Text) ‘ se supone que en Fecha1.text y Fecha2.Text tengo fechas validas
Ultima = CDate(Fecha2.Text)
Dia1 = Day(Primera)  ‘ Ahora descompongo la fecha en trocitos para que CR no se 
Mes1 = Month(Primera)    ‘ atragante
Agno1 = Year(Primera)
Dia2 = Day(Ultima)
Mes2 = Month(Ultima)
Agno2 = Year(Ultima)
CR1.SelectionFormula="{Ofertas.OferFechaPropuesta} in Date(" & Agno1 & "," & Mes1 & "," _
& Dia1 & ") to Date(" & Agno2 & "," & Mes2 & "," & Dia2 & ")"
CR1.Destination=1
CR1.Action=1

 

Como puedes ver es un "prodigio" de sencillez, un ejercicio de estilo propio de los mas refinados creadores de motores de bases de datos.

Si comparamos la sintaxis SQL ( que no nos sirve para nada en CR ) tenemos:

Dim Primera As Date
Dim Ultima As Date
Primera = CDate(Fecha1.Text) ‘ se supone que en Fecha1.text y Fecha2.Text tengo fechas válidas
Ultima = CDate(Fecha2.Text)
MySQL= "SELECT * FROM Ofertas WHERE OferFechaPropuesta BETWEEN #" & Primera & "# AND #" & Ultima & "#"

Mas fácil y lógico , ¿no?…

Observad como para que la formula reconozca el formato fecha, se introduce la variable entre

#" variable "#

Esto es valido si quiero seleccionar un dia concreto en mi informe:

Dim Fecha As Date
Fecha = Date$
Form1.CR1. SelectionFormula ="{Ofertas.FechaEmision} = #" Fecha "# "

El uso general del rango de fehcas en CR es:

"{Tabla.CampoFecha} in Date(Año,Mes,Dia) to Date(Año,Mes2,Dia2)"

Me he extendido mas en el tema de rango de fechas, porque el otro, a poco que conozcais la sintaxis SQL lo dominais sin problemas.

La forma más facil de depurar estas formulas, es usar el Debug.Print CR1.SelectionFormula y poner un Stop inmediatamente después. Asi revisamos la formula antes de su impresión. Con esto veremos si un argumento que debe ser numérico aparece entre comillas, o si una cadena cerece de ellas.

Por ejemplo, un codigo de este tipo:

Form1.CR1. SelectionFormula ="{Ofertas.Total} =" & Total_Final & ""

En ejecución , y pasado por el Debug.Print ,debe dar un resultado de este

"{Ofertas.Total} =1275"

si obtenemos este

"{Ofertas.Total} =’1275’ "

es que algo falla.

Antes de desesperaros, y empezar a acordarse de los parientes y afectos de los programadores del Crystal, cosa que yo he hecho miles de veces, os aconsejo usar este metodo. Tanta comilla puede dar errores de esos que no vemos ni a la de tres y tenemos delante de los ojos.

 

 

WindowControlBox

 

Ahora vamos con una facilita.

Cr1. WindowControlBox=True

Nos muestra la caja de control de Maximizar, minimizar y cerrar. Con false no lo hace

WindowState

Nos da el estado en el que veremos la pantalla de preimpresión

CR1.WindowState = 0

Aparecera la pantalla Normal

CR1.WindowState = 1

Aparecera la pantalla Minimizada

CR1.WindowState = 2

Aparecera la pantalla Maximizada

 

WindowTitle

Pone un titulo a la ventana de previsualización. Tambien podemos usar variables del tipo que queramos para cargar esta propiedad

CR1.WindowTitle = "Listado de Todos los Cientes"

o…

Dim TipoListado As String

TipoListado = "Listado de Todos los Cientes"

CR1.WindowTitle = TipoListado

 

 

Bueno, y con esto ya se pueden hacer , práctimanente, todos los informes que querais.

Dentro de unos días, cuando esté más despejado, prepararé una documento donde explique algunos trucos e historias específicas para casos poco normales. También quiero dar una idea de trucos para el diseñador y otras cosillas más, pero ya os digo, dentro de unos dias.

Por lo demás, podeis seguir consultandome en falvarez@interec.com y tened un poco de paciencia porque estoy "muy cargado".

Gracias a todos


 

ir al índice