Ocultar columnas o campo en LazReport (Lazarus)


Ocultar campo según una condición dada.

Veamos el problema es el siguiente:

Tengo un listado en el que muestra una cabecera y un detalle, en el detalle tengo un campo que, dependiendo de una condición, estará visible o no.

Para ello lo primero que voy a hacer es evaluar el campo que condiciona la visibilidad del campo «Concepto» y en el evento del listado «OnGetValue» añadiré el siguiente código:

Código Fuente del programa.

Evalúo si el parámetro es «MOSTRAR_CONCEPTO»
Si el campo es null
Indico que «MOSTRAR_CONCEPTO» vale 1
Si no «MOSTRAR_CONCEPTO» vale 0

procedure Tfrmfacturas.frFacturaGetValue(const ParName: String;
var ParValue: Variant);
begin
if ParName='MOSTRAR_CONCEPTO' THEN
BEGIN
IF cExpediciones.FieldByName('SERVICIO').IsNull THEN
ParValue:='1'
ELSE
ParValue:='0';
end;
 
end;

Listado creado en LazReport

Tengo varios campos en el detalle y un campo «CONCEPTO» que está sobre el resto de campos. Dependiendo del valor «MOSTAR_CONCEPTO» se mostrará el campo «CONCEPTO» en todo el detalle o se mostrarán el resto de campos y ocultaremos «CONCEPTO»

Se marca el check «Script» en el campo «CONCEPTO» que ocupará por completo el detalle.

Evaluamos la variable «MOSTRAR_CONCEPTO» que le hemos pasado un valor en el programa.

Se marca el check «Script» en el campo «EXP_NOM_CIU» que estarán por debajo de «CONCEPTO». Este solo es un ejemplo de un campo, tendremos que realizar lo mismo en todos los campos que irán en el detalle.

Evaluamos la variable «MOSTRAR_CONCEPTO» que le hemos pasado un valor en el programa.

Ocultar una columna según condición dada

Ahora voy a explicar como he ocultado una columna únicamente con código fuente, sin tocar el listado.

He creado un campo calculado en el zReaderOnly (Zeos)

En el evento «OnCalcFields» de zReaderOnly agrego el siguiente código:

procedure Tfrmfacturas.cExpedicionesCalcFields(DataSet: TDataSet);
 
begin
cExpediciones.FieldByName('PESO').AsFloat:=cExpediciones.FieldByName('PESO_ORIGEN').AsFloat 
IF cTarifa.FieldByName('TIPO').AsString='B' THEN
   cExpediciones.FieldByName('PESO').AsFloat:=0;
 
end;

Con esto conseguimos que si el tipo de tarifa es «B» el «PESO» será 0.

Si en el informe utilizamos el siguiente check comprobaremos que la columna desaparece si la tarifa del cliente es «B»

Espero que os sirva de ayuda.