每当更改订单行项目时触发以在文本区域自定义字段中显示以逗号分隔的产品
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;
}
}
当订单行项目为 added/updated/deleted 时,触发在下面的自定义字段中显示以逗号分隔的产品。订单上的自定义字段 - xyz(textArea)
我对开发完全陌生,一直在努力写作,但无法真正前进。不确定是写在 Order Object 上还是写在哪个 Order Object 上。此外,我收到错误 1) 方法不存在或签名不正确:类型为 Map
下面是我写的代码:-
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;
}
}