JasperReports / iReport Designer: Can i show a band conditionally? - jasper-reports

I have created a report as follow:
Multiple detail band
each detail band contains 1 table. Each table is linked to 1 dataset.
Can I hide the detail band whenever the result set of the query returns Empty set (no result found)?
how can I achieve this?

In the "Properties" of each Detail band you have an option called "Print When Expression" there you can place logic that evaluates to boolean.
When you fill it with your logic and it returns true this detail band is printed.
So, you will need to have the information if the table will be filled in advance and cannot address the dataset within.
If your datasets are too different to do this, you should overwrite the Dataset for the main report with a custom one that gathers the information and sets the fields appropriately.

Related

How to show data in multiple columns in report

Requirement:
I have a table in DB as below:
COP_MASTER
-----------------
CopDuty CopName
Duty1 Alpha1
Duty2 Alpha2
Duty1 Alpha3
Duty1 Alpha4
Duty2 Alpha5
Using iReport I need to prepare a report where the report looks like this:
CopDuty CopName
Duty1 Alpha1 Aplpha3 Alpha4
Duty2 Alpha2 Aplha5
Here the list of CopNames grows horizontally (or in a simpler terms the columns are dynamic).
I have already tried using subReport and inside the subReport's detail band a List element where the PrintOrder for the list element is kept "Horizontal". But the list grows vertically and not horizontally.
Any advice or help?
Prepare an independent report with the copName as a field to be displayed.
Make the printOrder properties available in the report properties tab as "Horizontal"
Change the Columns value:n (where n>1)
Go the main report and add the subreport element with the choice "Just add the subreport element".
Go to the Properties tab of the subreport element do the following changes as below:
Subreport Expression: $P{SUBREPORT_DIR}+"CopSubReportFileName.jasper"
DataSourceExpression: new net.sf.jasperreportsengine.data.JRBeanCollectionDatasource($F{cops})
Here we have to note that if the "cops" is a BO associated in the "Duty" BO then the above solution is just fine. But if it is to be tested through DB conn directly then the "dutyId" must be passed as report input parameter to the subreport for the corresponding copNames to be fetched and printed.

How to pass variable's value from subreport to main report and show/hide detail band on the basis of that value in iReportDesigner Jasper Reports?

I am storing Value of one field in a variable in subreport. This variable I am returning to Main report. On the basis of this value I want to show/hide detail band 2. But I am not able to implement this as the value returned by the subreport is always Null which is a shock to me as when I am displaying the same value in subreport itself it is giving me 2 (integer). Please help me out with this.
For the First part of your question
The value returned by the subreport is always Null
In your Main report please cross check the following things.
You return variables from your sub report as in specified in here.
If the subreport and the text field in which you're using the returned value are placed on the same band, you need to set evaluationTime="Band" for the text field.
For the later part of your question,
I want to show/hide detail band 2
Using the report inspector, select detail band 2.
Access the properties of the band, using the properties tab.
You can find the property PrintWhenExpression.
Edit its value to hide/display detail band 2.
The second part of the answer works on the following logic
PrintWhenExpression will be evaluated at the start of the band rendering process, before starting to render the elements.
So, if the sub-report too is in the same band, detail band 2 in your case, this method would not hold good.

Hide space between elements of a report

I have one report with various subreports. These subreports are within a table cell. When the subreport doesn't have any data available, I hide the components (tables, textbox, charts) in that subreport. However, this creates some blank space and I need to eliminate this space.
I already used the properties ConsumeContainerWhiteSpace and KeepTogether, but the blank space is still there.
Any suggestions to remove the blank space?
To hide or show an entire row based on another reports results will be difficult, if not impossible. You will need to get this data in your parent report somehow.
I would create a cut down version of your subreport's query that returns row count for every subreport, but within the parent report. Might look like this:
UserID RecordCount
Abby 3
Bob 0
Carl 1
If you are using SSRS 2008r2 you can then use a lookup function to set row visibility. For example the row visibility expression might be
=IIF(Lookup(Fields!UserID.Value,
Fields!UserID.Value,
Fields!RecordCount.Value,
"LookupDatasetName") > 0,
false,
true)
If an earlier version of SSRS, then join that dataset into the dataset for your table.

SSRS no data in report

I have a single tablix on the SSRS report which fetches data from a stored procedure.
I am trying to show a meesage to the User when no data is present say, "** There is no data for this report*". I can do this easily by specifying this message in the **NoRowsMessage property of the tablix. But I want to show the headers of the tablix along with this message.
If I don't set the NoRowsMessage property, I get the headers but no message, but if I do, I get the message but no headers.
I need some help with this.
Note: I am using SSRS 2008.
Edit:
I can also put up a textbox with the relevant text message below the tablix and set it visible only if the tablix contains no rows. But I am not able to figure out as to how do I find out from the Visibility expression of the textbox whether the tablix contains any rows or not.
A tablix object is related to the underlying dataset, so if there's no data, there's no table in the output.
Other than using the NowRowsMessage property, the only other way I can think of to enforce this would be to ensure your query returns an empty value placeholder when there are now rows returned. This way you would have, in essence, a single data row.
You could then try and add a conditional expression on the table (i.e. on the Visibility property of the details row) to prevent any rows containing your placeholder from showing up.
So in your query you could have:
IF (##ROWCOUNT= 0)
BEGIN
SELECT
'[IAMEMPTY]' as [Col1]
,'[IAMEMPTY]' as [Col2]
,'[IAMEMPTY]' as [Col3]
END
And then in the Visibility property of your table's detail row:
=Iif(Fields!Col1.Value = "[IAMEMPTY]",True,False)
EDIT: Alternatively, to check if the DataSet is empty in SSRS and show a rectangle containing your message/headers (as mentioned in TooSik's comment), you could set up a rectangle with this in the Visibility expression:
=Iif(Rownumber("Dataset_Name")=0, False,True)

Iterating with the subreport parameter

I have place a subreport in my master report. I have my query like, for a application I have some 3 jobID. Based on this jobID I need to fetch the related data. I placed the jobID in the detail band and passed the same to the subreport as parameter.
Since the subreport is reporting only once in the master report, even though I have 3 jobID, it is display the first jobID data in the master report.
I need to get data for all the jobID of a application.
please see whether your sub report shows value for 3id if not then it cant appear data from three reports.
also place the subreport on the details band.
simple query with tree id returnce three row in the sub report is must. then only it will apear in the main report.
Note : if you place the report on the non repeating band. then that band only show the first comming data insted of showing 3 lines.
donot place sub report on title/pageheader/column heder with repeting value.
place only those sub report on this band which give only one value or one row