每当更改订单行项目时触发以在文本区域自定义字段中显示以逗号分隔的产品

Trigger to show comma-separated products in the text area custom field whenever the order line item is changed

当订单行项目为 added/updated/deleted 时,触发在下面的自定义字段中显示以逗号分隔的产品。订单上的自定义字段 - xyz(textArea)

我对开发完全陌生,一直在努力写作,但无法真正前进。不确定是写在 Order Object 上还是写在哪个 Order Object 上。此外,我收到错误 1) 方法不存在或签名不正确:类型为 Map 的 void put(String, Order) .

下面是我写的代码:-

trigger trigger_name on OrderItem (after insert, after update) {

    if (trigger.isInsert || trigger.isUpdate || trigger.isDelete) {
        Map<Id,OrderItem> items = new Map<Id,OrderItem>([Select id, Product2Id from OrderItem]);
  
        for (Order ord: trigger.new) {            
            if (ord.OrdersProduct__c != null) {
                items.put(ord.OrdersProduct__c, ord);  
            } 
        }
    }
}

这有点天真,不适用于更改订单 header 的更新(然后您需要更新旧订单和新订单)、删除、取消删除(从回收站恢复)。只是给大家一个思路。

这应该可以帮助您入门。没有承诺它会编译,用记事本写的。

// Collect Ids of all order headers we must check
Set<Id> orderIds = new Set<Id>();
if(trigger.isInsert || trigger.isUpdate){
    for(OrderItem oi : trigger.new){
        orderIds.add(oi.OrderId);
    }
}
// Query them and all their line items in one go.
List<Order> orders = [SELECT Id,
    (SELECT Product2Id, Quantity, ListPrice 
    FROM OrderItems
    ORDER BY OrderItemNumber)
    FROM Order
    WHERE Id IN :orderIds];

// actual "rollup"
for(Order o : orders){
    if(o.OrderItems.isEmpty()){
        o.OrdersProduct__c = null;
    } else {
        List<String> rows = new List<String>();
        for(OrderItem oi : o.OrderItems){
            rows.add(String.join(new List<String>{
                String.valueOf(oi.Product2Id),
                String.valueOf(oi.Quantity),
                String.valueOf(ListPrice)
            }, ';'));
        }
        o.OrdersProduct__c = String.join(rows, '\n');
    }
}
update orders;

欢迎来到社区!你在正确的轨道上,你的触发器应该在 OrderItem 对象上。我注意到缺少的一件事是触发器定义中的 after delete 事件。

像下面这样的触发器应该可以解决问题:

trigger OrderItemTrigger on OrderItem (after insert, after update, after delete) {

    // Get the modified OrderItems depending on the operation
    List<OrderItem> modifiedOrderItems;

    if (Trigger.isInsert || Trigger.isUpdate) {
        modifiedOrderItems = Trigger.new;
    }
    else if (Trigger.isDelete) {
        modifiedOrderItems = Trigger.old;
    }

    // Use the modified OrderItems to get the IDs of their parent Orders
    Set<Id> orderIds = new Set<Id>();

    for (OrderItem oi : modifiedOrderItems) {
        orderIds.add(oi.OrderId);
    }

    // Retrieve all OrderItems related to the modified Orders
    List<OrderItem> orderItems = [
        SELECT Id, OrderId, Product2.Name
        FROM OrderItem
        WHERE OrderId IN :orderIds
    ];

    // Update text area field (Order_Products__c) on Orders
    Map<Id, Order> orderMap = new Map<Id, Order>();

    for (OrderItem oi : orderItems) {
        Id parentOrderId = oi.OrderId;

        if (!orderMap.containsKey(parentOrderId)) {
            orderMap.put(parentOrderId, new Order(Id = parentOrderId));
        }

        Order parentOrder = orderMap.get(parentOrderId);
        parentOrder.Order_Products__c += oi.Product2.Name + '\n';
    }

    if (!orderMap.isEmpty()) {
        List<Order> parentOrders = orderMap.values();
        update parentOrders;
    }
}