LAST WHERE clause in SSRS expression - reporting-services

For the visibility of some fields, i want to check if a field has a specific value.
Right now i'm using this visibility expression:
=IIF (Sum(IIF(Fields!TagName.Value = "Option1" , Fields!Val.Value, 0), "ParamDataset") > 0, true, false)
If option1 is 1, the field is shown, if its 0 then its hidden.
Its working, but the solution is bad.
It checks all the entrys of Option1, and if it were at one time 1, the field is shown, even if the last entry is 0. Also it differentiates only between 0 and 1.
I'm searching for a expression which checks only the last entry of "Option1", and if possible also if the value is a specific value, not only 0 or 1. For example if its 23 or whatever.
PS: i cannot use tablix and the corresponding filters, because the process data is in a different dataset than the configuration data.

I don't think this is possible in an SSRS expression. I thought of using LAST but you want the LAST where OPTION = 1.
You might be able to make it work if you could sort the data so that Option1 is the last sorted followed by your current sorting:
ORDER BY CASE WHEN TagName = 'Option1' THEN 1 ELSE 2 END, <CURRENT SORT CRITERIA>
Now since your Option 1 TagName is last and you want the last of the Option1, you could use LAST:
=IIF(LAST(Fields!Val.Value, "ParamDataset") > 0, true, false)
It would work better if you could add a ROW_NUMBER to the ParamDataset:
,ROW_NUMBER()OVER(PARTITION BY TagName ORDER BY SOME_FIELD DESC) ROW_NUM
Then you could check for Tag Name = Option1 and ROW_NUM = 1:
=IIF(SUM(IIF(Fields!TagName.Value = "Option1" AND ROW_NUM = 1, Fields!Val.Value, 0), "ParamDataset") > 0, true, false)

Related

How to not COUNT a value in SSRS matrix when value is NULL

I cannot make the my expression NOT count a NULL value in my SSRS matrix.
In my SSRS matrix, I have 2 columns one for AppraisalCompany and a count under the SubmittedDate column. In my report this what is happening:
Per Derrick's suggestion here is the change I made in the ColumnGroup properties for the SubmittedDate:
Here is my expression change in the ColumnGroup properties:
Unfortunately I got this error:
I'm suspicious of your Dataset, I'm not entirely sure how you're getting a null value to return 1 in the COUNT. I have been unable to reproduce your results.
Dataset Query
SELECT 'Drive In' AS AppraisalCompany, NULL AS SubmittedDate
UNION
SELECT 'Photo App - English', 'Dec-18'
Next I created a Row Group on AppraisalCompany and a Column Group on SubmittedDate.
I filtered the column group to remove the null grouping, using the expression =IsNothing(Fields!SubmittedDate.Value), operator <>, and Value true.
In the textbox in the matrix I used [Count(SubmittedDate)].
OUTUT
Appraisal Company | Dec-18
-------------------------------
Drive In | 0
Photo App - English | 1
By a Decimal (Number) datatype Nothing and 0 are the same. You can test this.
Put a tablix into your report with year from 2017 to 2019. Then put the year in a column of the tablix as a number format, then write the following expression in the detail textbox:
=CDec(IIF(CDec(Fields!Year.Value) = 2017, 0, Nothing))
After executing your report you will notice that every value in the year column is 0.
The same goes for the check. Both of these expressions will always return Yes. I basically check for 0 and the second one for for Nothing:
=IIF(CDec(IIF(CDec(Fields!Jahr.Value) = 2017, 0, Nothing)) = 0, "Yes", "No")
=IIF(CDec(IIF(CDec(Fields!Jahr.Value) = 2017, 0, Nothing)) = Nothing, "Yes", "No")
But remember your textbox/column has the be a number format.
So if you want to return Nothing and you display it in a number format textbox, it will show you a 0.
With this in mind it will make sense that a Count() returns the value 1 for 0 AND Nothing. So basically this will do the trick:
'Cont
=Sum(IIF(Fields!YourValue.Value = Nothing, 0, 1))

SSRS: How to add an condition in the expression while counting rows?

I need help with writing a conditional expression for counting specific rows of the dataset using which I determine to make a textbox visbile
DataSet_Example
Name value Level
ABC 12345 PG1
DEF 45677 PG2
FEG 98098 PG1
I want to count the rows based on the level. Something Like the one below
iff(CountRows("DataSet_Example").Level == PG1 < 1)
How do I do it in SSRS expressions?
You need insert a row group for "Level" and then set your visibility expression for each row to the following:
=IIF(CountRows("Level") > 1 , condition if true, condition if false )

SSRS 2012 using switch statement with LookupSet count in group footer

Apologies for the long post.
I have an SSRS 2012 report looking at 2 datasets, Dataset1 and Dataset2.
Dataset2 may return 0, 1 or 2 records, so I'm using LookupSet to do this. From the records returned, I need to display several fields.
The report is grouped by Main_ID. In the footer of Main_ID, I am counting the number of returned records from Dataset2.
=LookupSet(Fields!MainID.Value, Fields!MainID.Value, Fields!Record_Name.Value, "Dataset2").Length
This works fine, I'm getting 0, 1 or 2 as appropriate.
In Dataset2 the field:
HasIP
will be used to determine which record in the array I display (as I need to test a field value in Dataset2).
I'm trying to use a switch statement to use the length of the LookupSet array to return the correct fields.
If there are no records (eg length of array = 0) then return the
number 2
If there is 1 record (eg length of array = 1), then return
Record_Name
If there are 2 records (eg length of array = 2), then
check the field HasIP.
If HasIP = YesYes, then return the Record_Name of that matching entry
If HasIP = YesNo, then return the Record_Name of that matching entry.
If all else fails, return the number 2
This is what I'm up to at the moment.
=Switch(
'if no returns returned, display the numeral 2
LookupSet(Fields!Main_ID.Value, Fields!Main_ID.Value, Fields!Record_Name.Value, "Dataset2").Length=0, 2,
'if one return returned, then display Record Name
LookupSet(Fields!Main_ID.Value, Fields!Main_ID.Value, Fields!Record_Name.Value, "Dataset2").Length=1,
LookUp(Fields!Main_ID.Value,Fields!Main_ID.Value,Fields!Record_Name.Value,"Dataset2"),
'if two records returned, check the HasIP field. If HasIP = YesYes, then use this combination first.
LookupSet(Fields!Main_ID.Value, Fields!Main_ID.Value, Fields!Record_Name.Value, "Dataset2").Length=2 AND
LookUpSet(Fields!Main_ID.Value,Fields!Main_ID.Value,Fields!HasIP.Value,"Dataset2")(0)="YesYes",
LookUpSet(Fields!Main_ID.Value,Fields!Main_ID.Value,Fields!Record_Name.Value,"Dataset2")(0),
LookupSet(Fields!Main_ID.Value, Fields!Main_ID.Value, Fields!Record_Name.Value, "Dataset2").Length=2 AND
LookUpSet(Fields!Main_ID.Value,Fields!Main_ID.Value,Fields!HasIP.Value,"Dataset2")(1)="YesYes",
LookUpSet(Fields!Main_ID.Value,Fields!Main_ID.Value,Fields!Record_Name.Value,"Dataset2")(1),
'if two records returned, check the HasIP field. If HasIP = YesNo, then use this combination second.
LookupSet(Fields!Main_ID.Value, Fields!Main_ID.Value, Fields!Record_Name.Value, "Dataset2").Length=2 AND
LookUpSet(Fields!Main_ID.Value,Fields!Main_ID.Value,Fields!HasIP.Value,"Dataset2")(0)="YesNo",
LookUpSet(Fields!Main_ID.Value,Fields!Main_ID.Value,Fields!Record_Name.Value,"Dataset2")(0),
LookupSet(Fields!Main_ID.Value, Fields!Main_ID.Value, Fields!Record_Name.Value, "Dataset2").Length=2 AND
LookUpSet(Fields!Main_ID.Value,Fields!Main_ID.Value,Fields!HasIP.Value,"Dataset2")(1)="YesNo",
LookUpSet(Fields!Main_ID.Value,Fields!Main_ID.Value,Fields!Record_Name.Value,"Dataset2")(1),
'If all else fails, display the number 2
True, 2)
I'm getting the correct one returned for 2 records, but getting #ERROR for zero and 1 records. If I break the formula down to their individual parts:
=SWITCH(
LookupSet(Fields!MainID.Value, Fields!MainID.Value, Fields!Record_Name.Value, "Dataset2").Length=0,
2)
This works. The number 2 is displayed in my report where the are no entries in Dataset2 (the field is blank for any other combination).
If I use:
=SWITCH(LookupSet(Fields!MainID.Value, Fields!MainID.Value, Fields!Record_Name.Value, "Dataset2").Length=1, LookUp(Fields!MainID.Value,Fields!MainID.Value,Fields!Record_Name.Value,"Dataset2"))
This works fine for when I have 1 record returned from Dataset2 (the field is blank for any other combination).
No matter what I tried with the third part (handling the 2 records), I'm getting issues. I can get the correct Record Name returned, but I'm getting #ERROR for 0 or 1 records.
I've tried nesting the third part in IIF statements, flipping it round to look at the length first, etc, but no success.
I cannot edit the underlying query of either dataset.
Any guidance much appreciated.
Solved
See:
SSRS 2012. Replicate grouping results in report in Query Designer
Essentially it was adding a numeric value to HasIP and also add in the Primary key of the second dataset.
Then sort the LookupSet array to get the value you want.
In the expression, you can use this to assign a default value, even when there are not results returned by the LookupSet:
=iif(
LookupSet(
Fields!Main_ID.Value,Fields!Main_ID.Value,Fields!Main_ID.Value,"Dataset2"
).Length>0,
Mid(
Split(
Join(
Code.JoinSorted(
LookupSet(
Fields!Main_ID.Value,Fields!Main_ID.Value,Fields!Q12b.Value,"Dataset2")
)
,";")
,";").GetValue(0)
, 'start point of mid
InStr(
Join(
Code.JoinSorted(
LookupSet(
Fields!Main_ID.Value,Fields!Main_ID.Value,Fields!Q12b.Value,"Dataset2"
)
)
,";")
,"$")
+1,
1),
"2"
)

How to display a textbox in SSRS based on not null value in a column from dataset

in my SSRS from dataset I get a column called TargetValues.
I need to display a textbox (Seting up the visbility rule) if I have at least one value (Not Null) for this column.
Is there any way to browse through the list and check if I have at least one not null value?
My dataset has 3 columns, Id - indicating the id of the row(int), ActualValue (int) and Target Value (int)
example 1: In this case I need to show the text box
Id ActaulValue TargetValue
1, 555, Null
2, 556, Null
3, 557, 75
example 2: In this case I need to hide the text box
Id ActaulValue TargetValue
1, 555, Null
2, 556, Null
3, 557, Null
Do you require null in your TargetValues? What is the min of the field?
I would look at trying to manipulate the query to make the logic for hiding the text box simpler.
For instance if you won't have negative numbers make the nulls 0 and test the Min() for 0 and use that to show/hide.
Like =IFF(Min(Fields!TargetValues.Value) = 0,TRUE,FALSE)
Also =IFF(IsNothing(Sum(Fields!TargetValues.Value)),TRUE,FALSE) might work
Set the below expression in the visibility property of the textbox after making it Show or Hide based on an expression -
=IIF(IIF( MAX( iif( IsNothing(Fields!TargetValues.Value ), -1, Fields!TargetValues.Value ), "give your dataset name" ) = -1, "Null Values", FormatNumber( MAX( iif( IsNothing(Fields!TargetValues.Value ), -1, Fields!TargetValues.Value ), "give your dataset name"),0)) = "Null Values", TRUE, FALSE)
Edit - Works fine for me, see the screen shot for reference.

Reporting Services - Find value in a group

I have a column with three possible values:
-1, 0 and any value greater than 0.
In each group, I must verify if ALL values are equal to -1 and if present ALMOST 0 value.
Is it possible?
I tried to solve it in this way:
=IIf(CountDistinct(Fields!Flag_09.Value,"Group1") = CountRows("Group1")
And First(Fields!Flag_09.Value = "-1"), "-",
[ ???? ])
Thanks
As far as I can tell, you want to see if all the detail rows in a group are -1 and then do something. Fortunately your data allows a very simple solution:
=IIF(CountRows("Group1") = 0 - SUM(Fields!MyField.Value), "-", "They aren't all -1")
That is, if the number of rows is equal to the negative of the sum of this field, then all the fields have -1 in them.