Is there a straight forward way to save to an individual field within a multi-va

Is there a straight forward way to save to an individual field within a multi-value CDT variable in SAIL? For example having a customer CDT and trying to populate auto-generated IDs for all the customers as part of a component saveInto, the pseudo-code below doesn’t work:
a!save(local!customers.id, enumerate(length(local!customers)) + 1) - this will save the first target value index(1 in this case) into all customer IDs instead of saving them correctly as 1,2,3...
a!save(local!customers.id[enumerate(length(local!customers)) + 1], enumerate(length(local!customers)) + 1) - still same behavior as above
The problem seems to be that you can specify a list of indices on the left hand side of the a!save function but there doesn't seem to be a way to specify a list of new values on the right hand side - the function is expecting a single value or a rule/function reference. It also looks like the a!save function cannot be placed within looping f...

OriginalPostID-157710

OriginalPostID-157710

  Discussion posts and replies are publicly visible

Parents
  • The plugin works but with some quirks. I was able to make it work by externalizing the code below is a separate rule and calling that rule within an apply function:
    /*rule!updateCustomerID*/
    updateCDT(ri!customer, {id: ri!id})
    /*rule!updateCustomerIDs*/
    apply(rule!updateCustomerID(_, _), merge(local!customers, enumerate(length(local!customers)) + 1))

    One issue I observed is that the plugin function fails with an exception when trying to clear a field(set to null):
    updateCDT(ri!customer, {id: null}) - this will always fail with an exception
    updateCDT(ri!customer, {id: ""}) - this seems to work but makes it hard to use this in a dynamic way with a functional that can return null and non-null values at run time

    Also this uses Appian dictionaries making it quite difficult to make this code dynamic and generic since this requires being able to dynamically create dictionary keys which is not very well-supported. I was able to do this is a pretty fragile way using a recently introduced json function: jsontodictionary("{"""&tostring(ri!field)&""": "&ri!value&"}")!

    Haven't decided which way to go yet but at least I've several options...
Reply
  • The plugin works but with some quirks. I was able to make it work by externalizing the code below is a separate rule and calling that rule within an apply function:
    /*rule!updateCustomerID*/
    updateCDT(ri!customer, {id: ri!id})
    /*rule!updateCustomerIDs*/
    apply(rule!updateCustomerID(_, _), merge(local!customers, enumerate(length(local!customers)) + 1))

    One issue I observed is that the plugin function fails with an exception when trying to clear a field(set to null):
    updateCDT(ri!customer, {id: null}) - this will always fail with an exception
    updateCDT(ri!customer, {id: ""}) - this seems to work but makes it hard to use this in a dynamic way with a functional that can return null and non-null values at run time

    Also this uses Appian dictionaries making it quite difficult to make this code dynamic and generic since this requires being able to dynamically create dictionary keys which is not very well-supported. I was able to do this is a pretty fragile way using a recently introduced json function: jsontodictionary("{"""&tostring(ri!field)&""": "&ri!value&"}")!

    Haven't decided which way to go yet but at least I've several options...
Children
No Data