Reporting services, sum all rows of a column - reporting-services

I'm using reporting services 2005, I have a report with a table(table1) which displays data from an sql database.
A column on the table displays numbers. I want the total of all rows for that column, on a textbox(textbox3)
of another table(lets call it table2).
I tried placing this on a table2 textbox: =Sum(ReportItems!textbox1.Value)
texbox1 is the one from the table1. But when going to the Preview tab i get:
Error 2 [rsAggregateReportItemInBody] The Value expression for the textbox 'textbox3' uses an aggregate function on a report item. Aggregate functions can be used only on report items contained in page headers and footers.
How can I solve this?
Thanks.

You've got a couple of options.
The first is to use an expression similar to the following in the Textbox:
=Sum(Fields!value.Value, "Values")
Where Values is the name of the DataSet you want to aggregate.
Here you're creating an aggregate expression and specifying the scope where it executes, in this case a DataSet, i.e. aggregate all values in the DataSet.
As you can see from the error you're getting you can reference a report item with an aggregate, but if you're displaying the aggregate in the table header or footer you can reference that Textbox.
Here's a simple report showing both methods:
Hopefully you can adapt one method to your report.

Related

Display selected values of multi-value parameter in tablix rows

I am designing a report for SSRS. I want the user requesting the report to be able to specify, when they generate the report, from a pre-defined selection some values which should be displayed in a tablix on the report.
I have therefore created a multi-value parameter and populated the Available Values with the options I want the user to be able to select from, and, as expected, when the report is generated the user is able to select one or more of these values.
However, what I now want to do is include a tablix in the report, and display a row for every value in the multi-value parameter that the user selected, with the value displayed in the first cell of the row.
If the values were coming from a data table this would obviously be easy. I've also found answers on how to show all of the selected parameter values in a single textbox using the JOIN function, but I don't want to do that.
The only solution I can think of is to replicate the list of available values in the multi-value parameter in a tablix manually, and link the visibility of each row of the tablix to the selected state of the corresponding value in the multi-value parameter, but that's not very elegant and increases the effort involved in maintaining the report definition.
Any ideas on how to do this? I know the selected values from the parameter simply form an array, but I can't see how to bind a tablix to any data that isn't in a dataset, or how to create a dataset from the parameter values.
Considering that a tablix sources from a dataset, I did some experiments to see how to create a low maintenance solution for you.
Option 1: Create a data set with hard-coded options to match your multi-value parameter and select those options WHERE they exist in the parameter.
Example:
SELECT val
FROM (
SELECT 'opt1' as val
UNION SELECT 'opt2'
UNION SELECT 'opt3'
UNION SELECT 'opt4') a
WHERE val IN (#Param)
Thoughts: easier to maintain than visibility on a table, but still two hard-coded places within the report.
Option 2: Create a dataset that selects the multi-value parameter and splits it by each value. This was my first idea, but I ran into some issues with determining how to actually select the multi-value without a syntax error. I came up with a method that creates a deliminated string in the report and than parsed that string back into rows in the dataset:
Step 1) Within the dataset properties, on the parameter tab, join the multiple values together with a JOIN expression
Step 2) Create a simple query which uses the new SQL Server 2016 function string_split. Note that your database compatibility level MUST be 130 or higher to use this function (SQL 2016+). If this isn't your scenario, there are many string split functions that you can find on Stack Overflow to achieve the same thing.
Fun problem!

Filtering an ssrs report on a column created with a lookup function

I have created a transaction report in ssrs reporting data from dataset1 where one of the reported columns is populated using lookup function to get data from another dataset (dataset2). If no data is found in dataset2, the lookup function returns blank, which is what I want. I have now been asked to filter the report so that only includes those transactions which are not included in dataset2.
I have looked for a way and tried using the lookup function in the tablix filter expression, but have read that the lookup function is done after all filtering which would indicate that this may be one of those requests that will not be fulfilled. Have any of you tried this?
Add a filter like this in your tablix in tablix properties / Filters tab:
For Expression use:
=ISNOTHING(
Lookup(Fields!FieldDS1.Value,Fields!FieldDS2.Value,Fields!FieldDS2.Value,"DataSet2")
)
In Value use:
=True

SSRS has a hidded group statement that is not in the dataset query. How to find it?

REPORT BUILDER 3.0
I am changing the data sets of our reports to standard data sets. In some cases the names of fields have changed. Despite changing the cells to the new names I get an error of:
"The Group expression for the grouping ‘companyname’ refers to the field ‘companyname’. Report item expressions can only refer to fields within the current dataset scope or, if inside an aggregate, the specified dataset scope. Letters in the names of fields must use the correct case.
"companyname" changed to CompanyName and there is no group by companyname in the Dataset SQL. How can I change that in SSRS?
Whenever I've faced this, the places to check are:
Row Groups
Column Groups
Header text boxes for interactive sorting
9 times out of 10 when I can't find it, it's in the interactive sorting on text boxes.

Get Row Count in SSRS Report Builder

I have built a report using Report Builder 3.0 (that uses SQL Server 2008 R2). Now i wish to now how many records are being fetched from database to the report?
This is possible either by count function in SSRS or by using RANK/ROW_NUMBER function in SQL Query and assigning that as field to the report (RANK/ROW_NUMBER would give us rank to each row and navigating to last page in report would help me getting the total row count).
I tried count function but that counts on some field in the report. For instance = Count(Field!FieldName.value, "DataSetName") Problem in this approach: "FieldName" is not unique in the report and hence the counts get repetitive
Second option: Added Rank/Row_Number but they too use the same kind of fieldName and hence here too the counts get duplicated.
Main Problem: There is no field in my query that is unique (and hence i tried ROW_NUMBER())
How can i find the total row count or rank (for each row) in SSRS 2008?
Use the CountRows function. For example
=CountRows("MyDataset")
will give you the number of rows in MyDataSet.
As someone else mentioned above, I couldn't get CountRows("DatasetName") to work in the header until I wrapped it thusly:CSTR(CountRows("DatasetName")).
In the Tablix control's properties, there's a property name called NoRowsMessage put your message here when no row is returned.
you can't put aggregation values into the detail wihtout grouping.
Solution is below:
=Count(Fields!rn.Value)
I use it inside the column/header row.
I found a workaround for this. First create a data column with the value always set to 1. This will provide a value of one for each row of data.
Query Column
, 1 AS Unit
Use the "RunningValue" function into your report as shown below.
=RunningValue(Fields!Unit.Value,Sum,"DataSet")
This will also work as a 'running sum' if that's something you're looking for.

SSRS IIF Syntax with Multiple Datasets

I have a report with 2 data sets and would like to perform a SUM operation in a textbox expression. The problem arises when I want to perform an IIF in the sum since I only want a particular category of values summed.
I would like to get a sum of all the "Good" ranking values from the dsRetrieveCustomerAssetScores dataset. Please note there is more than one data set in the report, so I need to specify the scope when using the aggregate function. Below is the code I've tried (along with other permutations).
=Sum(iif(Fields!ranking.Value,"Good",1,0), "dsRetrieveCustomerAssetScores")
Any ideas?
You may have more than one dataset in your report, but I don't think it's possible to have more than one dataset per tablix. (Subreports within the tablix may be bound to a different dataset, but anywhere within the subreport will only be accessing that other dataset.)
The scope specified within aggregation formulas is normally related to groups within the tablix, not the datasources.
So, the code:
=Sum(iif(Fields!ranking.Value,"Good",1,0))
- should work within your tablix, as long as that tablix is accessing the dsRetrieveCustomerAssetScores dataset.