Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Salesforce 批处理和设计?_Salesforce_Apex Code - Fatal编程技术网

Salesforce 批处理和设计?

Salesforce 批处理和设计?,salesforce,apex-code,Salesforce,Apex Code,我需要一个设计问题和批处理Apex中发生的事情的帮助 这就是我们的情况: 我们有一个territory对象,当您更新单个字段时,需要更新多达数百个联系人的字段。为此,我使用Batch Apex。并在领土记录更新之前调用它 问题: 假设用户将区域从A更新为B,然后单击保存。这会导致大量联系人更新,需要一段时间,然后,他将B更改为C。我们是否保证所有受影响记录的最终更新为C?为什么 或者,有没有办法安排批处理作业?我正在研究asyncApexJob并将其用作框架 有更好的设计吗 Batch Apex

我需要一个设计问题和批处理Apex中发生的事情的帮助

这就是我们的情况: 我们有一个territory对象,当您更新单个字段时,需要更新多达数百个联系人的字段。为此,我使用Batch Apex。并在领土记录更新之前调用它

问题:

  • 假设用户将区域从A更新为B,然后单击保存。这会导致大量联系人更新,需要一段时间,然后,他将B更改为C。我们是否保证所有受影响记录的最终更新为C?为什么

  • 或者,有没有办法安排批处理作业?我正在研究asyncApexJob并将其用作框架

  • 有更好的设计吗

  • Batch Apex的工作方式与触发器的工作方式不同。出现问题1中描述的情况的唯一方式是从触发器调用/执行批处理,如果可能的话,我强烈建议避免这种情况
  • (和3.)批次通常计划在夜间运行,或在非工作时间运行,使用。这是推荐的解决方案

  • 首先,您需要将逻辑放在Territory对象的AFTER UPDATE触发器中,而不是放在BEFORE UPDATE部分。作为一般规则,如果您需要更新触发操作所针对的记录/对象(即您案例中的Territory对象)上的字段或值,那么您可以使用更新前或插入前部分,如果您想要创建/更新/删除其他记录/对象(即您案例中的联系人)使用“更新后”或“插入后”部分

    其次,我认为从触发器启动批处理apex过程没有任何错误

    例如,假设您有一个名为“BatchUpdateContactsBasedOnTerritory”的批处理类,该类有三(3)个关键特性:

  • 除了“Database.Batchable”之外,它还实现了“Database.Stateful”
  • 它有一个构造函数方法,该方法将区域列表作为参数/参数
  • 它有一个成员变量来保存传入的区域列表
  • 批处理类的一部分

    global list<Territory> TerritoryList;
    
    global BatchUpdateContactsBasedOnTerritory(list<Territory> updatedTerritories){
        TerritoryList = updatedTerritories;
    }
    
    trigger TerritoryTrigger on Territory (after delete, after insert, after undelete, after update, before delete, before insert, before update)
    {
        if(trigger.isInsert)
        {
            if(Trigger.isBefore){
                // before insert event not implemented 
            }
            else if(Trigger.isAfter){
                // after insert event not implemented 
            }
        }else if(trigger.isUpdate){
            if(Trigger.isBefore){
                // before update event not implemented 
            }
            else if(Trigger.isAfter){
                // after update event - call batch class to process 1000 records at a time
                Database.ExecuteBatch(new BatchUpdateContactsBasedOnTerritory(trigger.new),1000);
            }
        }else if(trigger.isDelete){
            if(Trigger.isBefore){
                // before delete event not implemented 
            }
            else if(Trigger.isAfter){ 
                // after delete event not implemented 
            }
        }
        else if(Trigger.isUnDelete){ 
            // undelete event not implemented
        }
    }
    

    嘿,马特-作为对1的回应,这就是我如何调用我的批次。。。你为什么要避免这种情况?作为对2&3的回应,我现在正在研究调度程序。这是我的设计:@Matt-F/U这里有问题:如果您要从Territory对象上的触发器执行批处理,则可能会同时运行两个批处理以获取Territory记录。我认为这在你的情况下是不可取的,因为结果(对于联系人)是不可预测的。