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

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(使用前将#替换为@)

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

  • salesforce 接口国内访问慢的解决方案

    最近接到一个客户 xff0c 他们需要用salesforce作为ToC的后端 xff0c 由salesforce直接提供api给前端页面 我们知道一般做salesforce的 xff0c 基本上是作为公司内部应用系统来使用的 xff0c 即
  • salesforce-潜在客户Lead的视图管理

    当我们收集到一些Lead数据之后 我们需要对这些Lead进行跟踪和管理 如何快速找到自己想要的信息呢 如下图 salesforce的默认视图只提供了一些标准字段信息 那么 我们就需要对视图进行自定义了 新建视图 点击页面右上角的设置图标 在
  • 占位符在 IE9 中不起作用

    我是 Salesforce SFDC 开发人员 在我的输入框的 Visualforce 页面中 我使用占位符代码 div class control group div
  • 在 Salesforce iOS SDK 中查询用户名

    我有一个使用最新 Salesforce iOS SDK 的 iOS 应用程序 它使用 Salesforce 站点上的 oAuth2 0 通过 Web 视图对用户进行身份验证 因此我不会在应用程序中捕获用户名 有没有办法可以使用 API 或会
  • 如何在 WinForms 应用程序中使用 Salesforce OAuth 2.0 隐式流身份验证?

    我编写了一个 Web 应用程序 它使用 OAuth 2 0 Web 服务器流连接到 Salesforce API 一切正常 但现在需要从 WinForms 桌面应用程序访问 Salesforce API 我陷入了困境 Salesforce
  • 覆盖 Salesforce Apex 中抽象类的属性

    我在 apex 中有一个抽象类 其中有几个我想在子类中重写的属性 根据文档 属性支持覆盖和虚拟访问修饰符 但是 当我尝试在父类或子类中使用它们中的任何一个时 我收到一条错误消息 指出变量不能标记为虚拟 覆盖 以下是导致此错误的代码的传真 p
  • Salesforce - 一个用于沙箱和生产的 WSDL?

    因此 我正在创建一个 Salesforce 应用程序 当前可以很好地访问沙盒帐户 我们的生产账户和沙箱账户在字段上是完全一样的 现在 当我在 Visual Studio 中创建 Web 引用时 一个 URL 已添加到 test salesf
  • 使用 SOQL 查询 Salesforce 对象列名称

    我在 Salesforce 实例和 S3 存储桶之间的 SnapLogic 集成中使用 Salesforce SOQL 管理单元 我尝试在 Salesforce SOQL 快照字段 SOQL 查询 中使用 SOQL 查询来返回对象的列名称
  • 如何使用 Python 从 Salesforce 获取文件

    我正在使用 Python Beatbox 访问 Salesforce 案例 service beatbox PythonClient instantiate the object service login login using your
  • Suds 忽略代理设置

    我正在尝试使用 salesforce python toolkit 对 Salesforce API 进行 Web 服务调用 但是我在让客户端通过代理时遇到问题 由于该工具包基于 suds 之上 因此我尝试只使用 suds 本身 看看是否可
  • 使用.NET WebBrowser控件,为什么Salesforce.com在用户会话失效后自动登录用户?

    我正在我的 NET 应用程序中通过 REST 登录用户 为此 我在 WebBrowser 控件构造函数中执行以下操作 string server https login salesforce com var authURI new Stri
  • 使用 PHP 的 Salesforce 标注

    抱歉 因为我可能不知道 salesforce API 的术语 我刚刚开始编写一个连接器来与销售人员交互 但我陷入了困境 我有一个要求 每次将新条目添加到潜在客户部分时 我都必须检索几个字段 名字和产品代码 并将其传递给使用 PHP 的不同软
  • Apex 代码版本控制

    有没有办法集成 Apex 和 Visualforce 代码的版本控制系统 我可以考虑保留一个单独的存储库 但无法将其与 Salesforce Platform 集成 提前致谢 您可以通过使用 Subversion 和 Force com E
  • 将 Heroku Postgres 连接到 PowerBI

    我希望将 Heroku PostgresSQL 直接连接到 PowerBI Desktop 看起来市场上有几种产品可以从 Heroku 复制到 Azure 但希望直接连接到 PowerBI 有人能够做到这一点吗 如果有一个替代数据库选项可与
  • Salesforce .net API 集成

    我有点困惑 我们从 Salesforce 下载了 WSDL 文件 并使用建议的文件路径创建了对其的 Web 引用 它创建了我所理解的代理类 但不是 SforceService 类 其他人建议您必须使用 WSDL exe 生成类文件 我这样做
  • 不支持的授权类型 Salesforce OAUTH2

    我正在使用 VBA 在 Salesforce 中获得授权 然后最终想要运行 Salesforce 报告并将结果转储到 Excel 中 我已编写以下内容来处理授权 但收到 unsupported grant type 错误 到目前为止我的代码
  • 无法通过 SalesForce API (JSforce) 更新自定义日期字段

    我正在使用 Node js 应用程序中的 JSforce 库来更新机会对象上的自定义日期字段 但该字段并未更新 响应表明更新成功 并且对象上的 SystemModstamp 字段已更新 但该字段仍为空 这是我正在使用的 JSforce 调用
  • Salesforce OAuth 身份验证不适用于用户名和密码

    我在 Salesforce 中创建了一个新的连接应用程序 我正在尝试使用用户名和密码进行身份验证 OAuth 方法使用 Postman 获取令牌 我正在到达以下端点https login salesforce com services oa
  • 在 Apex 类中引用远程站点设置 URL?

    我有一个 webservice 类 它将位于托管包中并分发给多个客户端 该类当前有一个变量 其中包含它所访问的服务器的硬编码值 问题 每个客户端的服务器都不同 因此硬编码值不起作用 我认为由于每个客户端都必须将其服务器添加到其远程站点设置中
  • Jenkins Pipeline - 如何使用“工具”选项来指定自定义工具?

    我通过自定义工具插件在 Jenkins 中定义了一个自定义工具 如果我创建一个自由式项目Install custom tools选项在执行期间正确找到并使用该工具 Salesforce DX 但是 我找不到通过管道文件执行相同操作的方法 我

随机推荐

  • 将 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