Hello, again.
This is a strange one.... and I'm on version 24.1.281.0
I have two expression rules... one generates some error messages (or none) and the other deals with the errors. However, in the scenario where the first expression rule generates no errors, the second one still thinks there are errors.
Expression 1: (called SH_ErrorGenerator)
a!localVariables( local!stringArray: {"a", "b"}, local!error1: "", /* value from another expression rule normally */ local!error2: "", /* value from another expression rule normally */ local!error3: {""}, /* value from another expression rule normally */ local!errors: { local!error1, local!error2, local!error3 }, local!allErrors: cast( /* make sure this is list of string not list of variant */ typeof(local!stringArray), reject(a!isNullOrEmpty, a!flatten(local!errors)) ), local!anyErrors: and(not(isnull(local!allErrors)), length(local!allErrors) > 0), { errors: local!allErrors, anyErrors: local!anyErrors } )
Expression 2:
a!localVariables( local!result: rule!SH_ErrorGenerator(), local!errors: local!result.errors, local!anyErrors: and(not(isnull(local!errors)), length(local!errors) > 0), local!anyErrors )
Here is the result I see.
result.anyErrors (calculated by SH_ErrorGenerator) is false (as it should be), but local!anyErrors (calculated by second rule) says true. And even the local variables screen says there are 0 items in the array.
Any idea what's going on here?
Thank you.
Discussion posts and replies are publicly visible
You are correct in that isNullOrEmpty does return true in this case.
What I learn from your blog is essentially that I should be using isNullOrEmpty (the same thing everyone else here is saying). I don't have a need for the edge cases you mention, but it is good info to know about.
So, overall, the answer is to use isNullOrEmpty to test a list for no items. I had never considered this thinking it was more a string function than an array functions.
Still, there is a technical nuance here I would like to understand if I can (and if I even have time to). It may have something to do with what osanchea is saying about using Map vs Dictionary. I might try to play with that and see if it helps.
Thank you, all for your responses!!
Given the usecase length() function is not suitable here. It seems length() in expression 2 is considered as a string rather than an array which is why 1 is returned. Below code might explain the deviation between 0 sometimes and sometimes 1. The difference is just whether its an array or not.
a!map( arrayLength: length({ "" }), /*returns 0*/ stringLength: length("") /*returns 1*/ )
So, In practice, as mentioned by almost everyone here, a!isNullOrEmpty() is best solution for cases like this.
Yep. Tested and it works. Thank you.