在 Salesforce 中根據訂單項目拆分訂單的 Apex 解決方案



在處理 Salesforce 的訂單管理時,我們可能會遇到需要根據訂單項目(Order Line Items)拆分訂單的情況。最近,我遇到了這樣一個挑戰:在特定合同下有18張訂單,每個訂單包含三個訂單項目。任務是將這些訂單拆分,使每張新訂單只包含一個訂單項目。

這個任務的第一步是查詢特定合同下的所有訂單。然後,對於每個訂單,我們需要查詢其相關的訂單項目。最初,我考慮直接修改 OrderItem 記錄的 OrderId 字段,但是這在 Salesforce 中是不允許的,因為一旦 OrderItem 被創建,其 OrderId 就不能更改。

因此,我採取了不同的方法:為每個訂單項目創建一個新的訂單和一個新的訂單項目記錄。這樣,每個新的訂單都將只有一個與之關聯的訂單項目。這需要插入新訂單後,再將新訂單項目與新訂單關聯。

以下是實現此功能的 Apex 代碼示例: 

public class SplitOrders {

    public static void splitOrdersByLineItems(String contractId) {

        // 查詢特定合同下的所有訂單

        List<Order> originalOrders = [SELECT Id FROM Order WHERE ContractId = :contractId];

        List<Order> newOrders = new List<Order>();

        List<OrderItem> newOrderItems = new List<OrderItem>();


        for (Order originalOrder : originalOrders) {

            List<OrderItem> orderItems = [SELECT Id, Product2Id, Quantity, UnitPrice FROM OrderItem WHERE OrderId = :originalOrder.Id];

            for (OrderItem originalItem : orderItems) {

                Order newOrder = new Order();

                newOrder.ContractId = contractId;

                newOrders.add(newOrder);


                OrderItem newItem = new OrderItem();

                newItem.Product2Id = originalItem.Product2Id;

                newItem.Quantity = originalItem.Quantity;

                newItem.UnitPrice = originalItem.UnitPrice;

                newOrderItems.add(newItem);

            }

        }

        insert newOrders;

        for (Integer i = 0; i < newOrders.size(); i++) {

            newOrderItems[i].OrderId = newOrders[i].Id;

        }

        insert newOrderItems;

    }

}


留言

這個網誌中的熱門文章

Salesforce證照考試心得 (Administrator and Advanced Administrator)

ISC2 CC (Certified in Cybersecurity Certification) 考試心得

Apex Solution for Splitting Orders Based on Order Line Items in Salesforce