There is an error on line 58 of custom code: [BC30201] Expression expected
Asked Answered
H

1

4

When we deploy a report SSRS generates the following error:

There is an error on line 58 of custom code: [BC30201] Expression expected

However, the report works fine on preview mode and displays the field correctly.

The custom code segment here is also written and tested in visual studio.

Here's the custom code:

If (evaluationDate.Day = 31) Then '* affected line 
    returnValue.Append(String.Format("{0}{1:dd.MM}{2}", _
        If(index = 2, " und ", String.Empty), _
        New DateTime(evaluationDate.Year, evaluationDate.Month, lastDayOfMonthDictionary(evaluationDate.Month)), _
        If(index = 2, ".", String.Empty)))

End If

As you can see, the problem is by an IF..THEN block. evaluationDate is of type DateTime and the value is either equal to the DateTime argument startdate or six months ahead of startDate - which is a datetime argument in the function's signature.

I cannot see what's wrong with this and I need to know what I can do to resolve this issue. Any ideas?

Heidy answered 11/12, 2014 at 8:17 Comment(4)
6 months ahead is June (which has 30 days), so instinctively I'd fixate on that 31-day magic number there to start debugging with. Whether that's actually the root cause I'm not sure.Dimitris
Remove the () around the statement? If evaluationDate.Day = 31 ThenCrosby
@VisualVincent I tried that. The error turned into invalid definition. @NathanTuggy, I have written and tested this in Visual studio, when the date was 31 December on startdate and 6 months were added, the evaluation date was 30 June - that didn't cause issues. as I say, this error only happens during deployment. on Preview, it works correctlyHeidy
Nevermind. @VisualVincent. I retried it, this time it gave me expression expected. This is starting to confuse me xDHeidy
H
7

The conclusion - SSRS has an evil way to deal with ternaries, even though it fully expects VB code in the custom code segment.

This error I had received was misdirecting, and pointed to the wrong line even - it was the line right below this one I marked in the question.

Notice the Usage of ternaries : If(index = 2, " und ", String.Empty) - SSRS tries to run the If-ternary (as you would declare it in VB.NET) as a If..Then block - and because no Then is found, and there are multiple arguments comma-separated, this muddles SSRS and thus it prints Expression Expected

The way to fix this issue is the Traditional SSRS Expressional way

'Instead of this:
If(index = 2, " und ", String.Empty)

'Use This:
IIf(index = 2, " und ", String.Empty)

This should still allow you to preview your code (even the normal If allowed you to preview, but breaks during deploy)

Heidy answered 11/12, 2014 at 15:51 Comment(2)
Upvoted. I'm annoyed because I just got bitten by this - I can't use the IIF operator because I need short-circuiting, but I don't have a choice because SSRS sucks. Sigh. Guess you can't win 'em all, huh?Lazo
@jedd.ahyoung The Custom Code of a report can handle plain old VB.NET, so why not write a helper method instead using old school if-statements (which supports short-circuiting) and reference those helpers in your expressions toolbox with ... & !Code.methodName(argument) & ...Heidy

© 2022 - 2024 — McMap. All rights reserved.