I have a structure of record type A like this:
{id:
other business field:,
relationships:
record Type2: {
id,
A_id,
other business field
}
recordType3:
{
},
After user change the data, I want to check whether the business field is actually modified. What I thought is to traverse the list of this record and construct new objects using the business field, use the new objects to compare. I want to know is this the only way to solve my problem? Is there any easy way can solve this.
Discussion posts and replies are publicly visible
edwardc8281 What I understand is that you want to verify if the business field has been changed. Before saving the data into the table, you are comparing the old field value with the newly added values from Appian. Is that correct?
I think this is a good way of doing it. In the end, the meaning of "record has changed" very much depends on business requirements. Not every field in a record is affected.
yes that what I want to say.
yes, the requirement is just a CRUD for a table. But user's behavior may be like this, remove a row, and add a new row, but the new row's data same as the deleted one. the reason I want to compare the data is if the user's behavior like I mentioned, I will make the submit button disable, not allow user to submit.
For detecting business field changes in your record, store the original record when the form loads, then use direct field comparison. Simply compare original.otherBusinessField <> current.otherBusinessField for each business field you care about. This is much more efficient than traversing and reconstructing objects. You can wrap this in a reusable rule that returns true/false for whether any business fields changed. For real-time tracking, add change flags in your saveInto parameters. Avoid object reconstruction - direct comparison is faster, simpler, and more maintainable.Give it a try..
both the original data and new data are list, I want to use symmetricdifference() to compare the original data and the new data, so I try to reconstruct the objects,
Instead of creating new objects you can simply compare the business fields for similarity and depending on output disable/enable the submit button.
Keep the data before any changes are made in a variable and keep one variable to do comparison of old data with variable having changes due to user interaction. The output of this variable can build the logic to manage the submit button. Below is an example for reference,
a!localVariables( local!oldItems: { {id:1,item: "Item 1", qty: 1, unitPrice: 10,user:"JAdoe"}, {id:2,item: "Item 2", qty: 2, unitPrice: 20,user:"AHer"} }, local!newItems: { {id:1,item: "Item 1", qty: 1, unitPrice: 10,user:"JAdoe"}, {id:null,item: "Item 2", qty: 2, unitPrice: 20,user:"PTer"} }, /*If true, disable button*/ and(a!isNullOrEmpty(symmetricdifference(local!oldItems.item,local!newItems.item)), a!isNullOrEmpty(symmetricdifference(local!oldItems.qty,local!newItems.qty)), a!isNullOrEmpty(symmetricdifference(local!oldItems.unitPrice,local!newItems.unitPrice))) )
I'm having a hard time understanding this. Since you only need to find out whether the business field has been modified or not (true/false), you can directly use symmetricDifference() for this. Why are you traversing and constructing a new object?length( symmetricdifference( local!originalArray, local!updatedArray ) ) <> 0
length( symmetricdifference( local!originalArray, local!updatedArray ) ) <> 0
This is a little hacky, but I have eventually settled on doing something like this:
local!areChangesMade: not( exact( tostring(local!originalSavedValue), tostring(local!userEditableValue) ) ),
/* evaluates to true or false, catches changes as small as changed capitalization */
because the original data has ID field, if user remove the original data and add a same data, the id field is different, symmetricdifference() thinks they are different, But what I want is they should be same.