Kristian Bautista
Kristian Bautista

Reputation: 45

JasperReports: Hide frame B within frame A, if one the fields inside frame B is null or is empty

I am having a problem in jasper reports regarding designing a document template. It's like a resume.

I have this document:


Title [static text]

Age [static text] | [some field A]

Gender [static text] | [some field B]

Location [static text] | [some field C]

The current structure of my jasper reports is this:

I have this frame A, which has a vertical layout. Every row in the template (age, gender, location) corresponds to the frame I've created frames 1, 2 and 3.

Say, frame 1 has horizontal layout with 'Age [static text]' and '[some field A]' as its contents. The applies to frames 2 and 3.

Frame 1 has a position type of fix relative to top, while frames 2 and 3 are in float.

I want the row gender be hidden and be moved upwards if [some field] B is null or empty. How can I do that?

I've tried working on Remove Line When Blank but it only works inside a frame which has several fields in it. Basically, I want frame 1 to be hidden and have frames 2 and 3 be moved upwards if [some field A] is null or empty.

I hope for the soonest response.

Upvotes: 3

Views: 3219

Answers (2)

Rajat Arora
Rajat Arora

Reputation: 56

I tried the solution mentioned above and also from a few other posts. This only works when your band height should remain the same, that means when the report gets printed, there was still empty space at the bottom of the report because of the fixed height of the band and the hidden content left empty space.

The solution which worked for me was to create multiple detail bands and put the content to be hidden in separate detail bands. Then use the printWhenExpression on those detail bands. This helped me hide the fields as well as remove the space from the bottom of the report too.

Upvotes: 0

Petter Friberg
Petter Friberg

Reputation: 21710

To achieve you desired result set:

  1. positionType="Float" on the reportElement inside the frame (it needs to move on the basis of the other elements.

  2. isRemoveLineWhenBlank="true", to remove it if its not visible according to printWhenExpression

  3. Include the check for all the fields inside the frame in the printWhenExpression es. new Boolean($F{field1}==null || $F{field2}==null || $F{field3}==null)

Example

<frame>
   <reportElement positionType="Float" x="13" y="12" width="287" height="35" isRemoveLineWhenBlank="true" uuid="ee6707a4-bcb4-402b-95c0-6f4613747d2f">
      <printWhenExpression><![CDATA[new Boolean($F{field1}==null || $F{field2}==null || $F{field3}==null)]]></printWhenExpression>
       .. your textFields ...
   </reportElement>
</frame> 

NOTE: for compatibility with jasper report 3 and jdk 1.4 I have used new Boolean(...) this is not necessary in jasper report 5,6

Upvotes: 3

Related Questions