Вы думали в правильном направлении.Однако, прежде чем назначить OppID для позиции, вы должны вставить эту возможность.Я полагаю, что этот вид нарушает ваш транзакционный контроль, но вы всегда можете использовать точки сохранения базы данных, чтобы сделать всю операцию атомарной.
Например:
SavePoint sp = Database.setSavepoint();
try {
upsert newOpportunities;
// now create line items and assign IDs
}
catch (Exception ex) {
Database.rollback(sp);
// cleanup
}
Чтобы отобразить старые возможности нановые, вам нужно Map<ID, Opportunity>
и список и заполнить их теми же новыми возможностями, чтобы eb мог повторно использовать новые идентификаторы в сопоставлении (я использовал псевдокод, если у вас возникли проблемы с его интерпретацией, дайте мне знать)
foreach(oldopp) {
newopp = clone oldopp;
list.add(newopp);
map.put(oldopp.id, newopp);
}
upsert list;
// now we have new oppids for cloned items, use them to map
foreach(oldlineitem) {
newlineitem = clone oldlineitem;
newlineitem.OpportunityId = map.get(oldlineitem.OpportunityId).Id;
...
}
upsert listofnewlineitems;
}