如何从两个不同对象的两个不同字段中减去值并在 Apex 触发器中填充自定义字段?
How can I subtract values from two different fields in two different objects and populate a custom field in Apex Trigger?
我的计划是通过从总数量“[=]中减去另一个对象“Invoice_Log__c”中的“Quantity_Used__c”来填充Invoice__c中的新自定义字段“剩余数量” 18=]”。我希望每次使用另一个项目并更新 Quantity_Used__c 字段时触发它。
我是 Apex 的新手,所以我不确定我的起步是否正确,而且我不知道如何用计算填充新字段。
trigger InvoiceTrigger on Invoice__c(after update) {
Integer I;
for (Invoice__c p : Trigger.new) {
I = p.Quantity__c;
List<Invoice_Log__c> a = [select Quantity_Used__c from Invoice_Log__c];
Integer j = I - a;
system.debug('Quantity left: ' + j);
}
}
Invoice_Log__c
与 Invoice__c
有关,对吧?如果关系是“master-detail”,您甚至可能不需要为此编写代码。如果它只是一个“查找”,请考虑是否要将其转换为 M-D。您将获得“汇总摘要”字段(我们将要使用)、级联删除(删除发票后您不想留下自由浮动行项目,对吧)、共享规则将自动“如果您可以看到发票 - 您可以看到所有订单项”和其他好东西。
所以最简单的方法是
- 确保
Invoice__c
、Parent__c
或 Invoice_Log__c
上的类似字段指向您的 Invoice__c
对象。而且它是 Master-Detail.
- 在
Invoice__c
对象上创建新字段,将其命名为 QuantityUsed__c
。类型应为“汇总摘要”。作为计算选择 SUM()
行项目的 Quantity__c
.
- 在
Invoice__c
对象上创建另一个字段 QuantityLeft__c
。输入公式,数字。将公式写成Quantity__c - QuantityUsed__c
.
繁荣,无需代码。顺丰会在 create/edit/delete/restore 从回收站中正确计算它。
如果你想用代码的方式来做(例如,如果有很好的理由,没有关系或者不可能master-detail......有一些模糊的案例,比如每个销售代表只看到他们的小整个订单的一部分,只收到一点佣金……它很薄弱,但我已经看到它发生了)-它的工作。理想情况下,您将涵盖插入、更新、删除和取消删除。它可能比你想象的更棘手。更新应该处理更改数量或将行从一张发票重新添加到另一张发票;)即使 - 我仍然会要求您考虑最终计算的公式字段,因为当有人编辑父级的数量时会怎样?
有点天真,但可以完成工作(只要您没有大量订单项并进行批量编辑)将在 Invoice_Log__c
上触发(因为那是正在编辑的内容,而不是Invoice__c
).
trigger InvoiceLogTrigger on InvoiceLog__c (after update){
Set<Id> invoiceIds = new Set<Id>();
for(InvoiceLog__c il : trigger.new){
InvoiceLog__c old = trigger.oldMap.get(il.Id);
if(il.Quantity__c != old.Quantity__c || il.Invoice__c != old.Invoice__c){
invoiceIds.add(il.Invoice__c);
invoiceIds.add(old.Invoice__c);
}
}
if(!invoiceIds.isEmpty()){
List<Invoice__c> invoices = [SELECT Id, Quantity__c,
(SELECT QuantityUsed__c FROM InvoiceLogs__r WHERE QuantityUsed__c != null)
FROM Invoice__c
WHERE Id IN :invoiceIds];
for(Invoice__c i : invoices){
Integer total = 0;
for(InvoiceLog__c il : i.InvoiceLogs__r){
total += il.QuantityUsed__c;
}
i.QuantityLeft__c = i.Quantity__c - total; // as I said, I'd just save total and do final calculation as formula
}
update invoices;
}
}
我的计划是通过从总数量“[=]中减去另一个对象“Invoice_Log__c”中的“Quantity_Used__c”来填充Invoice__c中的新自定义字段“剩余数量” 18=]”。我希望每次使用另一个项目并更新 Quantity_Used__c 字段时触发它。
我是 Apex 的新手,所以我不确定我的起步是否正确,而且我不知道如何用计算填充新字段。
trigger InvoiceTrigger on Invoice__c(after update) {
Integer I;
for (Invoice__c p : Trigger.new) {
I = p.Quantity__c;
List<Invoice_Log__c> a = [select Quantity_Used__c from Invoice_Log__c];
Integer j = I - a;
system.debug('Quantity left: ' + j);
}
}
Invoice_Log__c
与 Invoice__c
有关,对吧?如果关系是“master-detail”,您甚至可能不需要为此编写代码。如果它只是一个“查找”,请考虑是否要将其转换为 M-D。您将获得“汇总摘要”字段(我们将要使用)、级联删除(删除发票后您不想留下自由浮动行项目,对吧)、共享规则将自动“如果您可以看到发票 - 您可以看到所有订单项”和其他好东西。
所以最简单的方法是
- 确保
Invoice__c
、Parent__c
或Invoice_Log__c
上的类似字段指向您的Invoice__c
对象。而且它是 Master-Detail. - 在
Invoice__c
对象上创建新字段,将其命名为QuantityUsed__c
。类型应为“汇总摘要”。作为计算选择SUM()
行项目的Quantity__c
. - 在
Invoice__c
对象上创建另一个字段QuantityLeft__c
。输入公式,数字。将公式写成Quantity__c - QuantityUsed__c
.
繁荣,无需代码。顺丰会在 create/edit/delete/restore 从回收站中正确计算它。
如果你想用代码的方式来做(例如,如果有很好的理由,没有关系或者不可能master-detail......有一些模糊的案例,比如每个销售代表只看到他们的小整个订单的一部分,只收到一点佣金……它很薄弱,但我已经看到它发生了)-它的工作。理想情况下,您将涵盖插入、更新、删除和取消删除。它可能比你想象的更棘手。更新应该处理更改数量或将行从一张发票重新添加到另一张发票;)即使 - 我仍然会要求您考虑最终计算的公式字段,因为当有人编辑父级的数量时会怎样?
有点天真,但可以完成工作(只要您没有大量订单项并进行批量编辑)将在 Invoice_Log__c
上触发(因为那是正在编辑的内容,而不是Invoice__c
).
trigger InvoiceLogTrigger on InvoiceLog__c (after update){
Set<Id> invoiceIds = new Set<Id>();
for(InvoiceLog__c il : trigger.new){
InvoiceLog__c old = trigger.oldMap.get(il.Id);
if(il.Quantity__c != old.Quantity__c || il.Invoice__c != old.Invoice__c){
invoiceIds.add(il.Invoice__c);
invoiceIds.add(old.Invoice__c);
}
}
if(!invoiceIds.isEmpty()){
List<Invoice__c> invoices = [SELECT Id, Quantity__c,
(SELECT QuantityUsed__c FROM InvoiceLogs__r WHERE QuantityUsed__c != null)
FROM Invoice__c
WHERE Id IN :invoiceIds];
for(Invoice__c i : invoices){
Integer total = 0;
for(InvoiceLog__c il : i.InvoiceLogs__r){
total += il.QuantityUsed__c;
}
i.QuantityLeft__c = i.Quantity__c - total; // as I said, I'd just save total and do final calculation as formula
}
update invoices;
}
}