local!data: { a!map(SAPNumber: "1111111", Qty: "1", Spare: "0"), a!map(SAPNumber: "1111111", Qty: "2", Spare: "1"), a!map(SAPNumber: "1111111", Qty: "3", Spare: "0"), a!map(SAPNumber: "2222222", Qty: "1", Spare: "0") },
In the above list, If a duplicate combination of 'SAPNumber' and 'Spare' exists in the list, display a message indicating that duplicate data is present.
Example :
a!map(SAPNumber: "1111111", Qty: "1", Spare: "0"),
a!map(SAPNumber: "1111111", Qty: "3", Spare: "0"),
here, 'SAPNumber' and 'Spare' are same so it must shows a message.
Discussion posts and replies are publicly visible
You can build an expression rule to check duplicates and call that in the validations section of the grid/section.
a!localVariables( local!data: { a!map(SAPNumber: "1111111", Qty: "1", Spare: "0"), a!map(SAPNumber: "1111111", Qty: "2", Spare: "1"), a!map(SAPNumber: "1111111", Qty: "3", Spare: "0"), a!map(SAPNumber: "2222222", Qty: "1", Spare: "0") }, if( contains( a!foreach( local!data, a!localVariables( local!arrayTemp: remove(local!data, fv!index), local!SAPCheck: property( local!arrayTemp, wherecontains( fv!item.SAPNumber, local!arrayTemp.SAPNumber ), {} ), local!spareCheck: property( local!arrayTemp, wherecontains(fv!item.Spare, local!arrayTemp.Spare), {} ), a!isNullOrEmpty( intersection(local!SAPCheck, local!spareCheck) ), ) ), true() ), "Validation Message", {} ) )
a!localVariables( local!data: { a!map(SAPNumber: "1111111", Qty: "1", Spare: "0"), a!map(SAPNumber: "1111111", Qty: "2", Spare: "1"), a!map(SAPNumber: "1111111", Qty: "3", Spare: "0"), a!map(SAPNumber: "2222222", Qty: "1", Spare: "0") }, a!forEach( items:local!data, expression:a!localVariables( local!innerData:index(local!data,fv!index,null()), local!SAPnumber:property(local!innerData,"SAPnumber"), local!spare:property(local!innerData,"Spare"), if( contains( property(remove(local!data,fv!index),"SAPnumber"), local!SAPnumber ), if( contains( property(remove(local!data,fv!index),"Spare"), local!spare ), "Duplicates Found", null() ), null() ) ) ) )
a!localVariables( local!data: { a!map(SAPNumber: "1111111", Qty: "1", Spare: "0"), a!map(SAPNumber: "1111111", Qty: "2", Spare: "1"), a!map(SAPNumber: "1111111", Qty: "3", Spare: "2"), a!map(SAPNumber: "2222222", Qty: "1", Spare: "0") }, local!dataset: a!foreach( local!data, a!localVariables( local!arrayTemp: remove(local!data, fv!index), local!SAPCheck: property( local!arrayTemp, wherecontains( fv!item.SAPNumber, local!arrayTemp.SAPNumber ), {} ), local!spareCheck: property( local!arrayTemp, wherecontains(fv!item.Spare, local!arrayTemp.Spare), {} ), a!isNotNullOrEmpty( intersection(local!SAPCheck, local!spareCheck) ) ) ), if( contains(local!dataset, true()), "Validation Message", "" ) )
Rishu Kumar Gupta I noticed an issue in the above code while testing with a negative dataset, here is an adjusted one to resolve that. Pls refer this one.
Thankyou Harsha Sharma
Thankyou PavanSrihari
A simple approach is to create a list of combined keys, get the unique combined keys, and then compare the number of combined keys to the number of items in your list. Below the code:
a!localVariables( local!data: { a!map(SAPNumber: "1111111", Qty: "1", Spare: "0"), a!map(SAPNumber: "1111111", Qty: "2", Spare: "1"), a!map(SAPNumber: "1111111", Qty: "3", Spare: "0"), a!map(SAPNumber: "2222222", Qty: "1", Spare: "0") }, local!combinedKey: a!forEach( items: local!data, expression: concat(fv!item.SAPNumber, "-", fv!item.Spare) ), if( count(local!data) <> count(union(local!combinedKey, local!combinedKey)), "Validation Message", "" ) )
Another simple way to do this is as below, Note: I have not handle any null errors etc.. just a targeted answer for the requirement
a!localVariables( local!data: { a!map(SAPNumber: "1111111", Qty: "1", Spare: "0"), a!map(SAPNumber: "1111111", Qty: "2", Spare: "1"), a!map(SAPNumber: "1111111", Qty: "3", Spare: "0"), a!map(SAPNumber: "2222222", Qty: "1", Spare: "0") }, if( length(local!data) > length( /* This union can be a rule named like XXX_removeDuplicate() */ union( merge(local!data.SAPNumber, local!data.Spare), merge(local!data.SAPNumber, local!data.Spare) ) ), "Error Message", "" ) )