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
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?
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) )
I whipped up my own version of this real quick and it appears to be working fine.
a!localVariables( local!suppliers: {}, a!gridLayout( headerCells: { a!gridLayoutHeaderCell(label: "Description") }, rows: a!forEach( local!suppliers, a!gridRowLayout( contents: { a!textField( value: fv!item.description, saveInto: fv!item.description, validations: if( count( wherecontains( tostring(fv!item.description), touniformstring(local!suppliers.description) ) ) > 1, "Supplier already exists", "" ) ) } ) ), addRowLink: a!dynamicLink( label: "Add", saveInto: a!save( local!suppliers, append( local!suppliers, { id: 1, description: "" } ) ) ) ) )
Hi Mike,
That's great!
But sadly, isn't working for me still.
a!localVariables( local!QRSuppliers: a!queryEntity( entity: cons!BC_SUPPLIER_DSE, query: a!query( selection: a!querySelection( columns: { a!queryColumn(field: "supplierId"), a!queryColumn(field: "description"), a!queryColumn(field: "displayOrder"), a!queryColumn(field: "isActive"), a!queryColumn(field: "createdDate"), a!queryColumn(field: "createdBy"), a!queryColumn(field: "modifiedDate"), a!queryColumn(field: "modifiedBy"), } ), pagingInfo: a!pagingInfo(startIndex: 1, batchSize: - 1) ), fetchTotalCount: true ).data, local!deletedSuppliers, local!addedSuppliers, local!suppliers: local!QRSuppliers, a!formLayout( label: "Manage Supplier", contents: { a!gridLayout( headerCells: { a!gridLayoutHeaderCell(label: "Supplier Name"), a!gridLayoutHeaderCell(label: "Active"), a!gridLayoutHeaderCell(label: "") }, columnConfigs: { a!gridLayoutColumnConfig(width: "DISTRIBUTE", weight: 3), a!gridLayoutColumnConfig(width: "DISTRIBUTE", weight: 3), a!gridLayoutColumnConfig(width: "ICON") }, 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( tostring(fv!item.description), touniformstring(local!suppliers.description) ) ) > 1, "Supplier already exists", "" ), required: true
Where am I making the mistake?
It's hard to tell without knowing what the value of local!suppliers is, which apparently depends on the result of your initial query. It looks, though, as if the data rows you're getting back don't contain a ".description" property. The error message we're seeing here is the standard error message received when you try to take a dot property from a dictionary/CDT for a property it doesn't have.
To circumvent this, we can try to get the dot property safely by using the property() function, i.e.
touniformstring(property(local!suppliers, "description", {}))
At last, It worked.
Thank you so much Mike and others for help.
Have a good day
The best way to check for duplicates is to union the array by itself and compare the size of the original with the resultant array.
Darn! You beat me to it! Yes, the union() function will remove any duplicate entries between two sets of data. If you union() a dataset with itself and it's smaller than the original dataset then it mu8st have contained duplicated. Way easier to implement and use and read.
In this use case that would cause *all* rows to throw a validation error whenever a duplicated description is typed, not just the row(s) containing the duplicated entries. TBH, this does not seem a good balance between a (very?) minor performance optimization versus pretty significant decrease in UX functionality.