如何从两个不同对象的两个不同字段中减去值并在 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__cInvoice__c 有关,对吧?如果关系是“master-detail”,您甚至可能不需要为此编写代码。如果它只是一个“查找”,请考虑是否要将其转换为 M-D。您将获得“汇总摘要”字段(我们将要使用)、级联删除(删除发票后您不想留下自由浮动行项目,对吧)、共享规则将自动“如果您可以看到发票 - 您可以看到所有订单项”和其他好东西。

所以最简单的方法是

  1. 确保 Invoice__cParent__cInvoice_Log__c 上的类似字段指向您的 Invoice__c 对象。而且它是 Master-Detail.
  2. Invoice__c 对象上创建新字段,将其命名为 QuantityUsed__c。类型应为“汇总摘要”。作为计算选择 SUM() 行项目的 Quantity__c.
  3. 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;
    }
}