【问题标题】:You have uncommitted work pending. Please commit or rollback before calling out您有未提交的工作待处理。请在调用前提交或回滚
【发布时间】:2021-07-31 13:11:50
【问题描述】:

今天我做了一件我想分享并想了解更多的事情。我正在做一个标注。用例如下。

创建案例时,在插入触发器之前,我正在更新一个字段,可以将 F1 值设为“SF”。在 WF 中,如果 F1 = SF,则邮件将发送到地址(从电子邮件服务生成)并属于电子邮件服务标注完成。在课堂上,我捕捉到异常并插入一个自定义对象。如下所示

Public class {
    public void mehod() {
        try{
            response = http.send(request);
        }
        catch(Exception error) {
            system.debug('--error--'+error);
            ExceptionClass.logException(Exception error);
        }
    }
} 

在这种情况下,我收到错误消息“您有未提交的工作待处理。请在调用之前提交或回滚。” Callout stats code 为 200 表示调用成功。

但是当我注释掉 catch 块时,它的工作正常。根据我的理解,如果有异常,则 catch 将执行,我们必须克服(因为我们不能使用 Callout 进行 DMLL)错误。 恶魔请分享您对此的想法,感谢您阅读和回复我的帖子。

【问题讨论】:

  • 您根本无法通过触发器进行标注。这是在 @future 方法或其他异步上下文中执行的吗?

标签: salesforce apex


【解决方案1】:

我希望您知道,您不能直接从触发器发出标注。 因此,请创建一个新函数来制作标注并为该函数使用 @future(callout=true) 注释。

这里是KNOWLEDGE ARTICLE的链接,请参考 https://help.salesforce.com/articleView?id=000328873&type=1&mode=1

如果您还有其他问题,请告诉我。

【讨论】:

    【解决方案2】:

    我遇到了同样的错误,但是,我决定在调用之前更新帐户,因为我需要连接一些值,我遵循了这个策略,下面是一个简单的例子:

    public static void updateAccount(Id recordId, String City, String PostalCode, String Country, String Street, String State_Province, String AddressType, String Complement, String Neighborhood, String Number_Address){
        
        String Number_Address_nm = Number_Address.replaceAll('[^0-9]', '');
        String PostalCode_nm = PostalCode.replaceAll('[^0-9]', '');
        String acId = [SELECT Id FROM Account WHERE Id =: recordId LIMIT 1].Id;  
        
        Account ct = new Account();
        ct.Id = acId;
        ct.BillingCity = City;
        ct.BillingCountry = Country;
        ct.BillingPostalCode = PostalCode_nm;
        ct.BillingState = State_Province;
        ct.BillingStreet = AddressType + ' ' + Street + '   Nº: ' + Number_Address_nm + '  ' + Complement + '   BAIRRO: ' + Neighborhood ;
        update ct;      
    }
    
    @future(callout=true)
    public static void Call_API(Id recordId, String City, String PostalCode, String Country, String Street, String State_Province, String AddressType, String Complement, String Neighborhood, String Number_Address){        
            ChangeAddressAPI.CallChangeAddressAPI(recordId, City, PostalCode, Country, Street, State_Province, AddressType, Complement, Neighborhood, Number_Address); 
    }
    

    }

    【讨论】:

      【解决方案3】:
      • 如果您在触发器中调用该方法:您不能。
      • 如果您在标注前有一些 DML(插入/更新)一些记录:您不能。

      -> 让我们使用@future 来代替

      【讨论】:

        猜你喜欢
        • 2019-06-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-31
        • 1970-01-01
        • 2012-07-10
        • 1970-01-01
        • 2022-07-01
        相关资源
        最近更新 更多