Hi
I want to check for duplicates in Supplier list when I am adding a new supplier.
I tried using this expresssion:
a!textField( label: "Supplier Name", value: fv!item.description, saveInto: fv!item.description, validations: { if( count(wherecontains(local!suppliers,index(fv!item,fv!index,{})))>1, "Supplier already exists",{} ) },
But I am getting the error -> Could not display interface. Please check definition and inputs. Interface Definition: Expression evaluation error at function a!forEach [line 39]: Error in a!forEach() expression during iteration 1: Expression evaluation error at function 'wherecontains' [line 52]: Invalid types, can only act on data of the same type (Any Type, Text)
I tried the methods mentioned in earlier posts but not able to fix it yet. Can someone help me?
Thanks
Discussion posts and replies are publicly visible
You need to wrap 'local!suppliers' in the function touniformstring() which will make sure that you're acting on data of the same type
Hi Danny,
Thanks for the tip but I tried it earlier and it didn't work.
I am getting the same error
rows: a!forEach( items: local!suppliers, expression: a!gridRowLayout( contents: { a!textField( label: "Supplier Name", value: fv!item.description, saveInto: fv!item.description, validations: { if( count(wherecontains(touniformstring(local!suppliers),index(fv!item,fv!index,{})))>1, "Supplier already exists",{} ) },
Hi, first thing you need to use touniformstring () as Danny said ,to make sure you are working on same type of data. Apart from this why are you indexing fv!index from fv!items? I think you need to correct this too.
Hi Gopal,
I am trying the check for duplicates.
Should I use the column name directly instead of fv!index?
If you are storing supplier name in fv!item.description then you should use this field only to check whether value provided by user exists in local! suppliers or not.i assume you have list of suppliers in local!suppliers then your expression should be like below,
WhereContains(touniformstring (local! suppliers),fv!item.description)
also it would be "local!suppliers.description", since local!suppliers is apparently a dictionary containing a "description" field that's the target of the text field in question.
Hi Mike,
I tried that too.
I am getting this error:
Could not display interface. Please check definition and inputs. Interface Definition: Expression evaluation error at function a!forEach [line 39]: Error in a!forEach() expression during iteration 1: Expression evaluation error at function 'wherecontains' parameter 1 [line 51]: Invalid index: Cannot index property 'description' of type Text into type List of Variant
validations: { if( count( wherecontains( touniform(local!suppliers.description), fv!item.description ) ) > 1, "Supplier already exists", {} ) },
I tried with and without nouniformstring().
I was working on it yesterday and it worked. Don't what I changed to get the error today.
There is typo in your code. "touniform"
If the dictionary is empty then the ".description" property might not evaluate correctly before an initial entry is added.
Also the function is "touniformstring()", not "touniform()" like you have in your code currently.
Additionally, whereContains() requires the unique item (and/or item(s)) you're trying to find the positions of in the longer/original array, to be listed first in the function, not second.
And if your local!suppliers is a generic dictionary, the .description property will probably need to be typecast because whereContains() is picky about types.
Thus, it would be properly written like this:
wherecontains( tostring(fv!item.description), touniformstring(local!suppliers.description) )