有未提交的工作待处理。请在调用前提交或回滚

2024-03-15

我有一个批处理课程

 public class BatchCreateGCalendars implements Database.Batchable<SObject>, Database.Stateful, Database.AllowsCallouts {

        private String query;
        private String pageToken ;
        private String accessToken;
        private String CalendarId;

        public BatchCreateGCalendars(){

            this.query = 'Select Id, Name, CalendarId__c from CalendarSettings__c'; // Query to get the CalendardID (Google ID)

        }

        public Database.Querylocator start(Database.BatchableContext BC){

            return Database.getQueryLocator(query);

        }

        public void execute(Database.BatchableContext BC, List<sObject> scope){

            GoogleForce__c gApp           = GoogleForce__c.getAll().values()[0];        
            GCalendarUtil.Calendar cal    = new GCalendarUtil.Calendar();
            GCalendarUtil.GResponse gResp = new GCalendarUtil.GResponse();  


            String endPoint = GCalendarUtil.CALENDAR_BASE + GCalendarUtil.CAL_URL; // Calendar Endpoint

            // Iterate over the records, delete each calendar and create the calendar again.

            for(CalendarSettings__c c : (List<CalendarSettings__c>)scope){



                String delEndpoint = endpoint + '/' + c.CalendarId__c;

                if(gApp.ExpiresIn__c < system.now()){
                    gResp               = GCalendarUtil.getNewToken(gApp);
                    accessToken         = gResp.access_token;
                    gApp.AccessToken__c = gResp.access_token;
                    gApp.ExpiresIn__c   = System.now().addSeconds(gResp.expires_in);

                }else{
                    accessToken = gApp.AccessToken__c;
                    System.debug('Calendar Id  is '+ c.CalendarId__c);
                }
              String re=  GCalendarUtil.doApiCall(null,'GET','https://www.googleapis.com/calendar/v3/calendars/'+c.CalendarId__c+'/events',accessToken);

            re = re.replaceAll('"end":','"end1":');
    re = re.replaceAll('"dateTime":','"dateTime1":');  
              System.debug('response is' +re);
               JSON2Apex1 aa = JSON2Apex1.parse(re);

               List<JSON2Apex1.Items> ii = aa.items ;
                        System.debug('next token is'+ aa.nextPageToken);
               List<String> event_id =new List<String>();
               if(ii!= null){
               for(JSON2Apex1.Items i: ii){
               event_id.add(i.id);
               }
               }
           for(String s:event_id)
           {GCalendarUtil.doApiCall(null,'DELETE','https://www.googleapis.com/calendar/v3/calendars/'+c.CalendarId__c+'/events/'+s,accessToken);

           }
       pageToken = aa.nextPageToken;
       CalendarId=c.CalendarId__c;

               if(pageToken!=null)
               deleteEvents(accessToken , pageToken,c.CalendarId__c);

            }

            update gApp;
        }

        /*
            After the batch job is finished, trigger the other batch jobs where the Campaigns are sent as Events to the calendars. 
            Use the CalendarQuery field on the each calendarSettings record.
        */

        public void finish(Database.BatchableContext BC){   

        BatchDeleteEvents bjob1 = new BatchDeleteEvents(CalendarId,accessToken);
                Database.executeBatch(bjob1,9); 


            for(CalendarSettings__c c  : [Select Id, Name, CalendarQuery__c, CalendarId__c,FieldToDisplay__c from CalendarSettings__c WHERE Name IN ('Public Calendar', 'Internal marketing Calendar')]){

                BatchPublicCampaignsToGoogle bjob = new BatchPublicCampaignsToGoogle(c.CalendarQuery__c,c.CalendarId__c,c.FieldToDisplay__c);
                Database.executeBatch(bjob,9); // This is set to process 9 records, allowing 1 extra callout for refresh token in case needed.

            }


        }

        public static void deleteEvents(String accessToken,String pageToken,String CalendarId){
         List<Event__c> event_id =new List<Event__c>();

        while(pageToken != null)
    {   String re = GCalendarUtil.doApiCall(null,'GET','https://www.googleapis.com/calendar/v3/calendars/'+CalendarId+'/events?pageToken='+pageToken,accessToken);
                    System.debug('next page response is'+ re);
                     re = re.replaceAll('"end":','"end1":');
    re = re.replaceAll('"dateTime":','"dateTime1":');  
      JSON2Apex1 aa = JSON2Apex1.parse(re);
       List<JSON2Apex1.Items> ii = aa.items ;
      System.debug('size of ii'+ii.size());
      pageToken = aa.nextPageToken ;

               if(ii!= null){
               for(JSON2Apex1.Items i: ii){
               event_id.add(new Event__c(name = i.id));
               }
               }



     }   
     insert event_id;


        }

    }

在这段代码中我在这一行遇到错误

String re=  GCalendarUtil.doApiCall(null,'GET','https://www.googleapis.com/calendar/v3/calendars/'+c.CalendarId__c+'/events',accessToken);

错误是

You have uncommitted work pending. Please commit or rollback before calling out

为什么我遇到这个错误请帮忙,还有一个疑问是当我在完成方法中调用此代码时

 BatchDeleteEvents bjob1 = new BatchDeleteEvents(CalendarId,accessToken);
                    Database.executeBatch(bjob1,9); 

它将同步执行此代码 na 意味着 9 个批次中的所有对象均已处理,然后控制权将在此代码上

BatchPublicCampaignsToGoogle bjob = new BatchPublicCampaignsToGoogle(c.CalendarQuery__c,c.CalendarId__c,c.FieldToDisplay__c);
                    Database.executeBatch(bjob,9);

您无法在 Salesforce/Apex 中与 DML 语句一起进行标注。

您可以首先根据可以调用 DML 语句的 Callout Status 执行 CallOut。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有未提交的工作待处理。请在调用前提交或回滚 的相关文章

随机推荐

  • 将 IAsyncEnumerable 转换为列表

    所以在 C 8 中我们添加了IAsyncEnumerable界面 如果我们有一个正常的IEnumerable我们可以做一个List或者我们想要从中得到的几乎任何其他集合 感谢那里的 Linq var range Enumerable Ran
  • 如何在 openGL ES 2.0 中执行 2 遍以获得模糊效果

    为了创建模糊效果 理论上需要创建 2 个顶点着色器 一个用于水平通道 第二个用于垂直通道 然后使用一个片段着色器进行实际采样 我的问题是 如何实际执行 2 个顶点着色器 我是否需要渲染 然后通过 glReadPixels 返回像素 然后再次
  • jQuery 如果宽度等于百分比

    我知道以像素为单位你可以做这种事情 但如果使用百分比 则不会返回任何内容 如果我的 CSS 使用百分比 我该如何处理 我基本上需要查看具有特定值的 div 然后触发脚本的变体 jQuery if modPopUp css width 32
  • 使用 DirectX 或 OpenGL 显示 100 个浮动立方体

    我想使用显示 100 个浮动立方体DirectX or OpenGL 我正在寻找一些示例源代码或该技术的描述 我无法正确显示多个立方体 我在网上搜索了一系列很好的教程 尽管他们谈论了如何做3D基元 我找不到有关如何进行大量操作的信息3D原语
  • 如何为 VB.net 程序创建启动屏幕

    如何为 vb net 程序创建启动屏幕 我想制作一个在程序开始之前和结束之后出现的视觉效果 这可能吗 打开你的 vb net 添加新项目 转到表单的属性 清除文本 Set the 表单边框样式没有 插入背景图像 将背景图像设置为拉伸 Add
  • 如何删除xlwings中的列?

    我在用着xlwings在 Windows 上 带有 Python 2 7 的 Excel 2007 并且想要使用以下命令删除范围或列xlwings 据我所知 删除范围或列是一个缺失的功能 所以我尝试按照给出的说明进行操作here http
  • 隐式本地化和嵌入资源

    我们可以在使用嵌入资源文件 resx 的同时在 asp net meta resourcekey 中使用隐式本地化吗 如果 app localresouces 中的资源设置为 内容 则一切正常 但如果将其设置为 嵌入 则无法使其工作 使用隐
  • Android:如何以编程方式使活动窗口半透明?

    有没有办法以编程方式使活动窗口显示为半透明 出于我的目的 我无法使用静态 XML 资源 我尝试将背景资源设置为半透明颜色 但这只会使背景显示为纯黑色 把它写在你的活动课上 Window window this getWindow windo
  • 如何管理需要AsyncTask调用的不同任务

    我有一个外部库可以使用 它通过互联网与服务器进行通信 每当我需要从互联网获取一些信息时 Android 都会强制我使用异步任务 到目前为止没有问题 但是 我收到越来越多的任务来从互联网检索 以不同方式 数据 并且我不喜欢为每个调用增加不同的
  • 为什么我的 Julia 代码运行速度比 JavaScript 慢?

    最近 我对 Julia lang 很感兴趣 因为它声称是一种具有接近 C 性能的动态语言 然而 到目前为止我的经验并不好 至少在性能方面 我正在编写的应用程序需要随机访问特定的数组索引 然后将它们的值与其他特定的数组索引进行比较 经过多次迭
  • 返回 AJAX 调用数据的 JavaScript 函数 [重复]

    这个问题在这里已经有答案了 我想创建一个 JavaScript 函数 它返回 jQuery AJAX 调用的值 我想要这样的东西 function checkUserIdExists userid return ajax url theur
  • Spring 属性占位符不起作用

    我在 stackoverflow com 上读过类似的问题 但没有一个解决方案对我有帮助 我使用的配置如下 maven项目结构 这src main resources properties app properties file possi
  • angular.js 控制器作为使用 $template 缓存服务的语法模板绑定

    我之前已经使用过 Angular JS 但现在我在 Angular JS 中使用控制器作为语法 并且无法绑定模板 我的控制器代码 function angular module vkApp controller Feeds Feeds fu
  • 支持语音的 ASP.NET 应用程序

    我们正在开发一个 ASP NET Web 应用程序 该应用程序需要通过语音输入一些数据 用户可以使用普通用户界面输入一些数据 但是 我们需要一个附加功能 让他可以通过语音输入数据 我们可以修复语音命令 例如输入 value1 到 data1
  • Jooq、Spring 和 BoneCP 连接关闭两次错误

    我正在将 Spring 4 0 0 以及 jOOQ 3 2 0 和 BoneCP 0 8 0 用于 Web 应用程序 我的 PersistenceContext 配置与本指南相同 请浏览一下 代码有点太多 无法粘贴到此处 http www
  • 无法找到资源 ID - Android Gradle 插件 3.4.0

    当从多模块项目中的 Android Gradle Plugin 3 3 2 迁移到 3 4 0 并执行时connectedAndroidTest我看到一个致命的异常 Google Play 服务共享类StringResourceValueR
  • 循环遍历datagridview

    我的是一个Windows应用程序 包含名为 BOM 和 BOMSelected 的表单 BOM中有一个datagridview 其中包含checkbox列 当用户选择checkbox时 所选行应该在其他形式的datagridview中看到
  • 如何在 Laravel 5.5 中进行迁移?

    我创建了一个 Auth 项目拉拉维尔 5 5并创建了新的迁移 当我迁移时 我收到此错误消息 在 Connection php 第 647 行 SQLSTATE 42S01 Base table or view already exists
  • 安装 apk 文件时出现错误“软件包似乎已损坏”

    我遇到了一个奇怪的问题 将 Android Studio 从 2 3 3 更新到 3 0 后 我收到此错误 问题是当我尝试安装 apk 文件时 它说 应用程序未安装 该软件包似乎已损坏 我尝试过在调试版本和发布版本中生成 apk 并尝试安装
  • 有未提交的工作待处理。请在调用前提交或回滚

    我有一个批处理课程 public class BatchCreateGCalendars implements Database Batchable