Let me explain:
I’ve got a document reference including a document Reference List.
In this list I’ve got 2 fields (string) one we call case1 and th other case2.
First step, I have to replicate the list:
if my list is A;B;C , I want A;B;C;A;B;C (there is plenty of manners to do this)
next I have to map values from another list like this:
A.case1= value;B;C;A.case2=value;B;C
to do this I have a lenth of list (3 in the example) I create 2 int one equal to $iteration-1 and the second equal to the first one plus the length of the list and then I map my value to case1 and case2 with 2 differents indexes.
If I run only the part that map values to a list type A;B;C;A;B;C I get what I want
BUT if I run the part that copy the list what I get with the map of th value is:
Can you post the steps you are performing in the loop? It’s likely that you’re getting caught by the “copy by reference” vs. “copy by value” behavior. If you’re mapping at the document level, it is copy by reference. If you’re mapping at a field level, it is copy by value.
Typically in looping one uses a work record. It is important to drop that record from the pipeline for each loop iteration otherwise you’ll keep modifying the same record for each iteration.
I tried several means to copy the list: pub.list:appendToDocumentList with the list in toList and fromList , copy one by one in a loop, map from the list to a work list…
I’m at loss why every method create a dependencie between the source and the copy.
even when I create two separate lists from the source, if I map only to one of theese the second is also updated. It’s quite driving me mad.
Please post the details of your loop and the mapping steps. I’m certain someone here will be able to point out the correct way to do what you need.
When thinking about lists, it can be useful to keep in mind that they are simply Java arrays under the covers. In a Java array, if you want unique objects in each array element, you need to create a new object. If you copy an object from one array position to another, those 2 positions refer to the same object.
Same sort of principle applies to documents, which are really just Java objects (similar to a hashmap). If you want a new document, you need to create one, not map one document to another.
loop over /entrylist
-map $iteration-1 → counter
-map entrylist[i] → temporary element of List
-map temporary element of List → exitList1[%counter%] with drop of temporary element List
I do it twice(with a second loop) and I’ve got 2 lists exitList1 and exitList2 but they are still linked. What is the correct pattern ? Or what do I do wrong ?
That is indeed the way to go (copying each element, not the record). Copying the record did a copy by reference: You had multiple pointers to the same record in multiple places. That’s why that were “linked”.
loop over /entrylist
-map $iteration-1 → counter
-map entrylist[i] → temporary element of List <— Map the fields, not the docs
-map temporary element of List → exitList1[%counter%] with drop of temporary element List <— Okay to map the docs here (always drop the temp)