在 Before 事件中实现此代码的所有功能
To achieve all the functionality of this code in Before event
我将如何在之前的事件中实现此代码的所有功能,无论是重新父子关系、更新、插入还是其他任何功能。所以,这是在每种情况下都可以正常工作的代码,但是如果我想在 Before 事件中做所有相同的事情怎么办。
谢谢
//Trigger
trigger InvoiceProductTrigger on Invoice_Product__c (before insert, before update, after insert, after update, after delete) {
if((Trigger.isInsert || Trigger.isUpdate) && Trigger.isBefore){
InvoiceClass.invoiceProduct(Trigger.new);
}
if(Trigger.isAfter && (Trigger.isInsert || Trigger.isUpdate)){
InvoiceClass.invoiceAmountUpdate(Trigger.new);
}
if(Trigger.isAfter && Trigger.isDelete){
InvoiceClass.invoiceAmountUpdate(Trigger.old);
}
if(Trigger.isAfter && Trigger.isUpdate){
InvoiceClass.invoiceAmountUpdate(Trigger.old);
}
}
//Handler class
public class InvoiceClass {
public static void invoiceProduct(List<Invoice_Product__c> invProduct){
for(Invoice_Product__c inv : invProduct){
inv.Total_Price__c = inv.Price__c * inv.Quantity__c;
}
}
public static void invoiceAmountUpdate(List<Invoice_Product__c> invProduct ){
Set<id> invoiceIds = new Set<id>();
for(Invoice_Product__c invPro : invProduct){
if(invPro.InvoiceLookUp__c != Null){
invoiceIds.add(invPro.InvoiceLookUp__c);
}
}
List<Invoice__c> invoices = [Select id, Total_Amount__c, (Select id, Total_Price__c
From Invoice_Products__r)
From Invoice__c where id in : invoiceIds];
for(Invoice__c inv: invoices){
inv.Total_Amount__c = 0;
for(Invoice_Product__c invProd : inv.Invoice_Products__r){
inv.Total_Amount__c += invProd.Total_Price__c;
}
}
if(invoices != Null){
update invoices;
}
}
}
您不能仅在 before
事件中实施汇总触发器 - 至少,这并不容易,而且您不清楚为什么要这样做。您无法从 Invoice_Product__c
before insert
或 before update
触发器查询您的 Invoice_Product__c
记录,因为它们尚未提交到数据库。
考虑使用 Declarative Lookup Rollup Summaries 定义汇总而不是从头开始编写汇总触发器。
我将如何在之前的事件中实现此代码的所有功能,无论是重新父子关系、更新、插入还是其他任何功能。所以,这是在每种情况下都可以正常工作的代码,但是如果我想在 Before 事件中做所有相同的事情怎么办。 谢谢
//Trigger
trigger InvoiceProductTrigger on Invoice_Product__c (before insert, before update, after insert, after update, after delete) {
if((Trigger.isInsert || Trigger.isUpdate) && Trigger.isBefore){
InvoiceClass.invoiceProduct(Trigger.new);
}
if(Trigger.isAfter && (Trigger.isInsert || Trigger.isUpdate)){
InvoiceClass.invoiceAmountUpdate(Trigger.new);
}
if(Trigger.isAfter && Trigger.isDelete){
InvoiceClass.invoiceAmountUpdate(Trigger.old);
}
if(Trigger.isAfter && Trigger.isUpdate){
InvoiceClass.invoiceAmountUpdate(Trigger.old);
}
}
//Handler class
public class InvoiceClass {
public static void invoiceProduct(List<Invoice_Product__c> invProduct){
for(Invoice_Product__c inv : invProduct){
inv.Total_Price__c = inv.Price__c * inv.Quantity__c;
}
}
public static void invoiceAmountUpdate(List<Invoice_Product__c> invProduct ){
Set<id> invoiceIds = new Set<id>();
for(Invoice_Product__c invPro : invProduct){
if(invPro.InvoiceLookUp__c != Null){
invoiceIds.add(invPro.InvoiceLookUp__c);
}
}
List<Invoice__c> invoices = [Select id, Total_Amount__c, (Select id, Total_Price__c
From Invoice_Products__r)
From Invoice__c where id in : invoiceIds];
for(Invoice__c inv: invoices){
inv.Total_Amount__c = 0;
for(Invoice_Product__c invProd : inv.Invoice_Products__r){
inv.Total_Amount__c += invProd.Total_Price__c;
}
}
if(invoices != Null){
update invoices;
}
}
}
您不能仅在 before
事件中实施汇总触发器 - 至少,这并不容易,而且您不清楚为什么要这样做。您无法从 Invoice_Product__c
before insert
或 before update
触发器查询您的 Invoice_Product__c
记录,因为它们尚未提交到数据库。
考虑使用 Declarative Lookup Rollup Summaries 定义汇总而不是从头开始编写汇总触发器。