2008-09-22 24 views
7

Me gustaría mostrar/ocultar una columna en tiempo de ejecución en función de una condición en particular. Estoy usando "Imprimir cuando expresión" para mostrar/ocultar condicionalmente esta columna (y su encabezado) en mi informe. Cuando la columna está oculta, el espacio que habría ocupado se deja en blanco, lo que no es particularmente atractivo.¿Cómo mostrar/ocultar una columna en tiempo de ejecución?

yo preferiría si se ha utilizado el espacio extra de una manera más eficaz, las posibilidades incluyen:

  • la anchura del informe se reduce por la anchura de la columna oculta
  • el espacio adicional se distribuye entre las columnas restantes

En teoría, podría lograr la primera al establecer el ancho de la columna (y el encabezado) en 0, pero también indicar que la columna debe cambiar de tamaño para ajustar su contenido. Pero JasperReports no proporciona una opción de "cambiar el tamaño para ajustar el contenido".

Otra posibilidad es generar informes utilizando la API de Jasper en lugar de definir la plantilla de informe en XML. Pero eso parece un gran esfuerzo para un requisito tan simple.

Respuesta

0

Si solo se trata de una columna, ¿es posible ubicar esta columna en el extremo derecho y, a continuación, usar la expresión imprimir cuando se exprese? De esa manera no hay un agujero en el medio. Sé que esto no es ideal, ya que intenté hacer lo que actualmente está tratando de lograr en el pasado, y no pude encontrar lo que llamo una buena solución.

Una segunda idea sería crear un segundo informe basado en el primero sin salir de la columna, y luego al llamar al informe verificar la condición, para decidir a cuál llamar. De nuevo, no es ideal, pero funcionaría.

Sé que esta no es realmente la respuesta que estaba buscando, pero una de estas sugerencias puede funcionar para usted.

+0

La primera solución no funcionará realmente porque hay más de una columna y hay un color de fondo en el encabezado del informe, por lo que todavía se verá extraño si faltan columnas. La segunda solución implica duplicar el informe, que es el tema que estoy tratando de evitar :) ¡Gracias de todos modos! –

1

Una ligera variación en el tema del "segundo informe" que he utilizado es aislar la parte del informe donde tiene una columna opcional en su propio subinforme, y luego crear dos subinformes, uno con y otro sin la columna y luego use las condiciones para determinar qué subinforme imprimir.

0

Verificar THIS En ese tutorial están utilizando una plantilla XML con Velocity framework. Esto es bastante complejo. Y para hacerlo más simple, puede llamarnos al DynamicJasper. Esta biblioteca es una API Java de código abierto que funciona sobre JasperReports y resuelve el problema de columnas dinámicas.

1

Eliminar línea cuando está en blanco: esta opción quita el espacio vertical ocupado por un objeto, si es no visible; la visibilidad del elemento está determinada por el valor de la expresión contenida en el atributo Imprimir cuando expresión. Piense en la página como una cuadrícula donde se colocan los elementos, con una línea que es el espacio que ocupa el elemento. La Figura 4-17 resalta la línea del elemento A; en para eliminar realmente esta línea, todos los elementos que comparten una parte de la línea deben ser nulos (es decir, no se imprimirán).

+0

'Eliminar línea cuando está en blanco': la pregunta era cómo ocultar la columna, no la fila –

1

Recomiendo usar DynamicReports, es de código abierto y se basa en JasperReports. El principal beneficio de esta biblioteca es un diseño de informe dinámico y sin necesidad de un diseñador visual de informes.

0

Supongo que esta respuesta llega demasiado tarde, pero la agrego para el registro. En mi caso, podría resolverlo sin dependencias ni herramientas adicionales.En el archivo JRXML, acabo de agregar el ancho de los campos de texto un ancho dinámico varias veces. Una vez por ancho posible eso es. Luego, en cada campo de texto, he establecido que solo se debe imprimir en caso de una determinada condición.

Esto puede no ser tan elegante como establecer el ancho dinámicamente, pero lo hace sin complicaciones con bibliotecas adicionales.

3

JasperDesign se utiliza para modificar el objeto de plantilla (JasperReport) desde dentro del código en tiempo de ejecución. Supongo que esto podría encajar en tu caso.

8

En versión posterior (v5 o superior) del jasperreports se puede utilizar el componente jr:table y verdaderamente lograrlo (sin el uso de código de Java como el uso dinámico-Jasper-o informes dinámicos).

El método utiliza una <printWhenExpression/> bajo la <jr:column/>

Ejemplo

datos de muestra

+----------------+--------+ 
|  User  | Rep | 
+----------------+--------+ 
| Jon Skeet  | 854503 | 
| Darin Dimitrov | 652133 | 
| BalusC   | 639753 | 
| Hans Passant | 616871 | 
| Me    | 6487 | 
+----------------+--------+ 

jrxml Muestra

Nota: el parámetro $P{displayRecordNumber} y la <printWhenExpression> bajo primero jr:column

<?xml version="1.0" encoding="UTF-8"?> 
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="reputation" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="a88bd694-4f90-41fc-84d0-002b90b2d73e"> 
    <style name="table"> 
     <box> 
      <pen lineWidth="1.0" lineColor="#000000"/> 
     </box> 
    </style> 
    <style name="table_TH" mode="Opaque" backcolor="#F0F8FF"> 
     <box> 
      <pen lineWidth="0.5" lineColor="#000000"/> 
     </box> 
    </style> 
    <style name="table_CH" mode="Opaque" backcolor="#BFE1FF"> 
     <box> 
      <pen lineWidth="0.5" lineColor="#000000"/> 
     </box> 
    </style> 
    <style name="table_TD" mode="Opaque" backcolor="#FFFFFF"> 
     <box> 
      <pen lineWidth="0.5" lineColor="#000000"/> 
     </box> 
    </style> 
    <subDataset name="tableDataset" uuid="7a53770f-0350-4a73-bfc1-48a5f6386594"> 
     <field name="User" class="java.lang.String"/> 
     <field name="Rep" class="java.math.BigDecimal"/> 
    </subDataset> 
    <parameter name="displayRecordNumber" class="java.lang.Boolean"> 
     <defaultValueExpression><![CDATA[true]]></defaultValueExpression> 
    </parameter> 
    <queryString> 
     <![CDATA[]]> 
    </queryString> 
    <title> 
     <band height="50"> 
      <componentElement> 
       <reportElement key="table" style="table" x="0" y="0" width="555" height="47" uuid="76ab08c6-e757-4785-a43d-b65ad4ab1dd5"/> 
       <jr:table xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd"> 
        <datasetRun subDataset="tableDataset" uuid="07e5f1c2-af7f-4373-b653-c127c47c9fa4"> 
         <dataSourceExpression><![CDATA[$P{REPORT_DATA_SOURCE}]]></dataSourceExpression> 
        </datasetRun> 
        <jr:column width="90" uuid="918270fe-25c8-4a9b-a872-91299cddbc31"> 
         <printWhenExpression><![CDATA[$P{displayRecordNumber}]]></printWhenExpression> 
         <jr:columnHeader style="table_CH" height="30" rowSpan="1"> 
          <staticText> 
           <reportElement x="0" y="0" width="90" height="30" uuid="5cd6da41-01d5-4f74-99c2-06784f891d1e"/> 
           <textElement textAlignment="Center" verticalAlignment="Middle"/> 
           <text><![CDATA[Record number]]></text> 
          </staticText> 
         </jr:columnHeader> 
         <jr:detailCell style="table_TD" height="30" rowSpan="1"> 
          <textField> 
           <reportElement x="0" y="0" width="90" height="30" uuid="5fe48359-0e7e-44b2-93ac-f55404189832"/> 
           <textElement textAlignment="Center" verticalAlignment="Middle"/> 
           <textFieldExpression><![CDATA[$V{REPORT_COUNT}]]></textFieldExpression> 
          </textField> 
         </jr:detailCell> 
        </jr:column> 
        <jr:column width="90" uuid="7979d8a2-4e3c-42a7-9ff9-86f8e0b164bc"> 
         <jr:columnHeader style="table_CH" height="30" rowSpan="1"> 
          <staticText> 
           <reportElement x="0" y="0" width="90" height="30" uuid="61d5f1b6-7677-4511-a10c-1fb8a56a4b2a"/> 
           <textElement textAlignment="Center" verticalAlignment="Middle"/> 
           <text><![CDATA[Username]]></text> 
          </staticText> 
         </jr:columnHeader> 
         <jr:detailCell style="table_TD" height="30" rowSpan="1"> 
          <textField> 
           <reportElement x="0" y="0" width="90" height="30" uuid="a3cdb99d-3bf6-4c66-b50c-259b9aabfaef"/> 
           <box leftPadding="3" rightPadding="3"/> 
           <textElement verticalAlignment="Middle"/> 
           <textFieldExpression><![CDATA[$F{User}]]></textFieldExpression> 
          </textField> 
         </jr:detailCell> 
        </jr:column> 
        <jr:column width="90" uuid="625e4e5e-5057-4eab-b4a9-c5b22844d25c"> 
         <jr:columnHeader style="table_CH" height="30" rowSpan="1"> 
          <staticText> 
           <reportElement x="0" y="0" width="90" height="30" uuid="e1c07cb8-a44c-4a8d-8566-5c86d6671282"/> 
           <textElement textAlignment="Center" verticalAlignment="Middle"/> 
           <text><![CDATA[Reputation]]></text> 
          </staticText> 
         </jr:columnHeader> 
         <jr:detailCell style="table_TD" height="30" rowSpan="1"> 
          <textField pattern="#,##0"> 
           <reportElement x="0" y="0" width="90" height="30" uuid="6be2d79f-be82-4c7b-afd9-0039fb8b3189"/> 
           <box leftPadding="3" rightPadding="3"/> 
           <textElement textAlignment="Right" verticalAlignment="Middle"/> 
           <textFieldExpression><![CDATA[$F{Rep}]]></textFieldExpression> 
          </textField> 
         </jr:detailCell> 
        </jr:column> 
       </jr:table> 
      </componentElement> 
     </band> 
    </title> 
</jasperReport> 

de salida con $ P {displayRecordNumber} = true

true

de salida con $ P {displayRecordNumber} = false

false

Como puede ver, las columnas se adaptan muy bien sobre la base de las cuales se muestran.

+0

Aquí hay un video tutorial que pasa por un enfoque similar: https://www.youtube.com/watch?v=Bmrqo9fDkOs – Kamal

Cuestiones relacionadas