Este link te llevará a la entrega anterior
Minicursillo de Cristal Reports (Segunda)
SelectionFormulaAquí 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 DateDim Ultima As DatePrimera = CDate(Fecha1.Text) se supone que en Fecha1.text y Fecha2.Text tengo fechas validasUltima = CDate(Fecha2.Text)Dia1 = Day(Primera) Ahora descompongo la fecha en trocitos para que CR no seMes1 = Month(Primera) atraganteAgno1 = 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=1CR1.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 DateDim Ultima As DatePrimera = CDate(Fecha1.Text) se supone que en Fecha1.text y Fecha2.Text tengo fechas válidasUltima = 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 DateFecha = 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 [email protected] y tened un poco de paciencia porque estoy "muy cargado".
Gracias a todos