lunes, 24 de septiembre de 2018

LazReport: cambiar el alto de una banda en tiempo de ejecución.


En este caso se trata de un reporte del libro I.V.A. y necesito cambiar el alto de la banda de los datos maestros según tengan 1, 2 o 3 discriminaciones o tasas de IVA en un mismo comprobante, para no desperdiciar espacio, entonces si un comprobante tiene un solo IVA el alto (height) será de 15, si son dos, será de 30 y si son tres será de 45 pixeles.
Como se ve en la imagen, durante el diseño del reporte se toma el máximo, será luego en run time que variará el valor de la banda MasterData1.

Para ello nos valemos del evento del reporte TfrReport OnBeginBand y su nombre lo indica todo: tareas a realizar al comienzo de la banda. Lo resolví muy simple de la siguiente manera:

procedure TFLibCompras.frRepBeginBand(Band: TfrBand);
begin
if ((Band.Name='MasterData1') and (ZQ.FieldByName('cnetogravado2').AsCurrency<>0)) then
  begin
    Band.Height:=45;
    Exit;
end;
if ((Band.Name='MasterData1') and (ZQ.FieldByName('cnetogravado1').AsCurrency<>0)) then
  begin
    Band.Height:=30;
    Exit;
  end;
if ((Band.Name='MasterData1') and (ZQ.FieldByName('cnetogravado1').AsCurrency=0)) then
  begin
    Band.Height:=15;
    Exit;
  end;
end;


El código es el que tengo funcionando y lo expongo a modo de ejemplo, la condición para establecer el alto de la banda puede ser cualquiera. También en el mismo evento podrían modificarse otros componentes del reporte.


Y así queda parte del reporte, con valores de prueba.

2 comentarios:

  1. Consulta de LazReport:
    desde un script en LazReport ¿puedo leer un registro de una tabla que es visible desde el reporte?
    Algo como:

    if [sqlCuentas.Locate('CTACOD',[Cuenta],[loPartialKey])] then ;
    Text:= [sqlCuentas.FieldByName('CTANOM').AsString] ;
    else Text:= 'No identificada';

    La instrucción anterior (locate) está en un GroupHeader
    en MasterData tengo la tabla "sqlMovim"
    "sqlCuentas" es visible desde el reporte en modo "design"
    "Cuenta" en una variable (Otras) que contiene sqlMovim.CtaCod que tiene su equivalente en sqlCuentas
    He probado con "begin // end", he incluido "uses db;"

    invariablemente el resultado es "No identificada"

    hay un cuadro de texto que contiene sqlCuentas.CtaNom y siempre muestra el primer registro

    ¿es posible lo que pretendo?
    si lo es, ¿cuál es mi error?
    Gracias.
    Nota: ya realicé esta consulta, pero no se registró

    ResponderEliminar
  2. Lamento la demora, respecto de si es posible if [sqlCuentas.Locate('CTACOD',[Cuenta],[loPartialKey])] como script en un Memo, la respuesta es no, LazReport no maneja métodos de clases de Free Pascal, solo las funciones que LazReport trae incorporadas para manejo de strings, números (como la función Sum por ejemplo) y valores booleanos.
    EL resto de lo que consultas, no lo entiendo.
    Saludos.

    ResponderEliminar