Batch file System.AsyncException:无法从批启动、批执行或未来方法调用Database.executeBatch
通过外部应用程序更新记录时出现以下错误。 当更新此记录时,触发器正在调用批处理Batch file System.AsyncException:无法从批启动、批执行或未来方法调用Database.executeBatch,batch-file,triggers,salesforce,apex,Batch File,Triggers,Salesforce,Apex,通过外部应用程序更新记录时出现以下错误。 当更新此记录时,触发器正在调用批处理 Update failed. First exception on row 0 with id 0013H000008gq59QAA; first error: CANNOT_INSERT_UPDATE_ACTIVATE_ENTITY, ivybat.AccountOperation: execution of AfterUpdate caused by: System.AsyncException: Databa
Update failed. First exception on row 0 with id 0013H000008gq59QAA; first error: CANNOT_INSERT_UPDATE_ACTIVATE_ENTITY, ivybat.AccountOperation: execution of AfterUpdate
caused by: System.AsyncException: Database.executeBatch cannot be called from a batch start, batch execute, or future method.
Trigger.ivybat.AccountOperation: line 121, column 1: []
还将在一个自定义对象中记录以下错误描述,该自定义对象主要用于在从外部应用程序更新/插入时记录错误
Update failed. First exception on row 0 with id 0013H000008gq59QAA; first error: CANNOT_INSERT_UPDATE_ACTIVATE_ENTITY, ivybat.AccountOperation: execution of AfterUpdate
caused by: System.AsyncException: Database.executeBatch cannot be called from a batch start, batch execute, or future method.
Trigger.ivybat.AccountOperation: line 121, column 1: []
调试错误描述中提到的类时,发现正在发生递归。
所以我试图停止递归,但仍然面临同样的问题
我不会讨论以下博客中针对System.AsyncException的建议解决方案:无法从批启动、批执行或将来的方法调用Database.executeBatch。因为这不会在使用相同托管包的其他组织中引发任何问题
从触发器附加以下代码块
if(trigger.isUpdate && trigger.isafter)
{
Map<String, Boolean> triggerLogicMap = TriggerLogicService.getDuplicationCheck(new Set<String>{'SKIP_AccountUpdate_Operation'});
if(triggerLogicMap.get('SKIP_AccountUpdate_Operation') == Null
|| triggerLogicMap.get('SKIP_AccountUpdate_Operation') == false) {
AccountOperationTriggerHelper.updateSalesOrgKey(trigger.new); // method calling to set SalesOrg key and tax classification key
Set<Id> accId = new Set<Id>();
Set<String> endMkts = new Set<String>();
map<Id,String> accmap = new map<id,String>();
boolean isReactivated = false;
for(Account acc : trigger.new){
system.debug(acc.ivybase__Status__c);
system.debug(trigger.oldMap.get(acc.Id).ivybase__Status__c);
if(acc.ivybase__Status__c != null && acc.ivybase__Status__c.equals('Active') && (acc.ivybase__Status__c != trigger.oldMap.get(acc.Id).ivybase__Status__c)){
isReactivated = true;
accmap.put(acc.Id,acc.market_iso__c);
accid.add(acc.id);
}
}
if(isReactivated && (accId.size() > 0)){
if(!RoutePlanDetailsService.firstRun){
RoutePlanDetailsService.firstRun = true;
System.debug('Run the batch clas');
batchCalVisitRecords br = new batchCalVisitRecords(accId);
database.executeBatch(br);
}
}
if(isReactivated && (accmap != null)){
CampaignTriggerHelper.insertvfonACCReactivation(accmap);
}
}
}
if(trigger.isUpdate&&trigger.isafter)
{
Map triggerLogicMap=TriggerLogicService.GetReplicationCheck(新集合{'SKIP\u AccountUpdate\u Operation'});
if(triggerLogicMap.get('SKIP_AccountUpdate_Operation')==Null
||triggerLogicMap.get('SKIP\u AccountUpdate\u Operation')==false){
AccountOperationTriggerHelper.updateSalesOrgKey(trigger.new);//方法调用以设置SalesOrg密钥和税务分类密钥
Set accId=new Set();
Set endMkts=新集合();
map accmap=新映射();
布尔值isReactivated=false;
对于(科目科目:触发器新){
系统调试(根据ivybase\uuuuu状态\uuuu c);
调试(trigger.oldMap.get(acc.Id.ivybase\uuuu Status\uuu c);
if(acc.ivybase\uu Status\uu c!=null和acc.ivybase\uu Status\uu c.equals('Active')&(acc.ivybase\uu Status\uu c!=trigger.oldMap.get(acc.Id.ivybase\uu Status\uu c)){
isReactivated=真;
accmap.put(acc.Id、acc.market\u iso\u\c);
会计标识添加(会计标识);
}
}
如果(isReactivated&(accId.size()>0)){
如果(!RoutePlanDetailsService.firstRun){
RoutePlanDetailsService.firstRun=true;
调试(“运行批处理clas”);
batchCalVisitRecords br=新的batchCalVisitRecords(accId);
数据库执行包(br);
}
}
if(isReactivated&(accmap!=null)){
ActivityTriggerHelper.InsertvFonac重新激活(accmap);
}
}
}
在这种情况下会有什么建议?
提前感谢。您似乎使用了术语
批处理
,并使用了标记[],但是,我在您的问题中看不到任何批处理文件代码,也看不到任何对扩展名为.bat
或.cmd
的文件的引用,这表明使用了一个。你能澄清一下你的问题与那张用过的标签的关系吗?(请将鼠标悬停在批处理文件标签上方或单击该标签,以获取该标签在整个网站中的使用说明。)