Working with Table-Column Conditional Blocks
A table-column conditional block represents a conditional block, which body occupies a rectangular area of cells of a single document table. The body of such a block (as well as the body of its every template option) starts at the beginning of the top-left cell of a corresponding area and ends at the end of its bottom-right cell. Typically, this area consists of one or several table columns as follows.
Note – Table cells occupied by different template options in the following templates are highlighted with different colors.
... | <<if ... -horz>> ... | <<elseif ...>> ... | ... | <<else>> ... | ... | ... | ... |
... | ... | ... | ... | ... | ... | ... | ... |
... | ... | ... | ... | ... | ... | ...<</if>> | ... |
Note – The horz switch instructs the engine to affect table columns rather than rows.
However, unlike table-row conditional blocks able to capture only whole rows, table-column conditional blocks can occupy columns even partially as shown in the following template snippet.
... | ... | ... | ... | ... | ... | ... | ... |
... | <<if ... -horz>> ... | <<elseif ...>> ... | ... | <<else>> ... | ... | ... | ... |
... | ... | ... | ... | ... | ... | ... | ... |
... | ... | ... | ... | ... | ... | ...<</if>> | ... |
... | ... | ... | ... | ... | ... | ... | ... |
Let us consider typical use cases for table-column conditional blocks at first defining showRepresentatives
, a Boolean
value, and person
and persons
, an instance and an enumeration of instances of the Person
class respectively, where the Person
class is defined as follows.
public class Person
{
public String getName() { ... }
public int getAge() { ... }
public String getRepresentative() { ... }
...
}
The most typical scenario for table-column conditional blocks is showing or hiding a table column depending on a condition. You can do it using a template as follows.
Name | Age | <<if [showRepresentatives] -horz>>Representative |
<<[person.getName()]>> | <<[person.getAge()]>> | <<[person.getRepresentative()]>><</if>> |
When showRepresentatives
is set to true
, the engine produces a report as follows.
Name | Age | Representative |
---|---|---|
Evan Edger | 47 | Terrence Randolph |
When showRepresentatives
is set to false
, the engine produces a report as follows.
Name | Age |
---|---|
Evan Edger | 47 |
For a table being built using a table-row data band, you can also show or hide a table column depending on a condition like in the following template.
Name | Age | <<if [showRepresentatives] -horz>>Representative<</if>> |
<<foreach [p in persons]>><<[p.getName()]>> | <<[p.getAge()]>> | <<if [showRepresentatives] -horz>><<[p.getRepresentative()]>><</if>><</foreach>> |
Note – Table-row and table-column regions cannot cross, that is why two table-column conditional blocks with the same condition are required in this case.
When showRepresentatives
is set to true
, the engine produces a report as follows.
Name | Age | Representative |
---|---|---|
Evan Edger | 47 | Terrence Randolph |
Kate Abrams | 35 |
When showRepresentatives
is set to false
, the engine produces a report as follows.
Name | Age |
---|---|
Evan Edger | 47 |
Kate Abrams | 35 |
Table-column conditional blocks can also be used to provide different views for a table column depending on a condition. You can use a template as follows to achieve this.
Name | <<if [person.getRepresentative() == “”] -horz>><<[person.getName()]>> | <<else>><<[person.getName()]>> |
Representative | <<[person.getRepresentative()]>><</if>> |
When a representative is present for a person, the engine produces a report as follows.
Name | Evan Edger |
---|---|
Representative | Terrence Randolph |
When a representative is not specified for a person, the engine produces a report as follows.
Name | Kate Abrams |
Representative |
You can use a similar approach to provide different views for columns of a table being built using a table-column data band. A template for this may look as follows.
Name | <<foreach [p in persons] -horz>><<if [p.getRepresentative() == “”] -horz>><<[p.getName()]>> | <<else>><<[p.getName()]>> |
Representative | <<[p.getRepresentative()]>><</if>><</foreach>> |
In this case, the engine produces a report as follows.
Name | Evan Edger | Kate Abrams |
Representative | Terrence Randolph |
Note – You can use common conditional blocks within table-column data bands as well.
In addition, table-column conditional blocks can contain table-column data bands. This is useful, for example, for providing alternate content for an empty table-column data band as shown in the following template.
Name | <<if [!persons.any()] -horz>>No data | <<else>><<foreach [p in persons] -horz>><<[p.getName()]>> |
Representative | <<[p.getRepresentative()]>><</foreach>><</if>> |
When the enumeration of persons is not empty, the engine produces a report as follows.
Name | Evan Edger | Kate Abrams |
---|---|---|
Representative | Terrence Randolph |
When there is no person at all, the engine produces a report as follows.
Name | No data |
Representative |
Note – Table-column conditional blocks can themselves be nested to table-row data bands and conditional blocks, but not conversely: Nesting of table-row data bands and conditional blocks into table-column conditional blocks is forbidden.