【问题标题】:Salesforce apex csv file generationSalesforce 顶点 csv 文件生成
【发布时间】:2021-05-20 07:45:06
【问题描述】:

希望每个人都安全。 我正在尝试使用顶点代码生成一个 csv 文件。从 salesforce 我只想从具有已付款状态的付款对象中取出所有付款,然后检查 Number 字段的值(来自 salesforce 中的付款对象)是否存在于我的付款 api 响应中。我只想为该记录生成 csv 文件并将其通过电子邮件发送给自己。 现在在 salesforce 沙盒中,当我测试 csv 时,我得到了很好的结果,所有支付状态的付款记录都显示在 csv 文件中,但是

当我开始生产时,我的 csv 文件中只有 1 条记录。别 知道为什么在沙盒中它运行良好,但在生产中却不是。

public with sharing class EmailCsv {
public static String APIAccessID;
public static String APISecureKey;
public static String orgId;
Public static String locId;
public static String apiBaseUrl;
public static String finalstr;


@InvocableMethod(label=‘Invoke From Flow' description=‘Invokable Method') 
public static void invokeFromFlow() {
    makeCallout();
}


@future(callout=true)
public static void makeCallout() {
    List<String> paymentNo = new List<String>();
    List<Payments__c> paymentQuery= [SELECT Number__c, Status__c FROM Payments__c where Status__c = ‘Paid’];
    for(Payments__c pNo : paymentQuery){
        paymentNo.add(pNo.Number__c);
    }
    string header = 'Order Number,Status,Amount,Received Date,Received Time \n';
    finalstr = header;
    if(Test.isRunningTest()) {
        APIAccessID = '';
        APISecureKey = '';
        orgId = '';
        apiBaseUrl = '';
        locId = '';
    } else {
         APIAccessID = Email_Csv__c.getInstance('APIAccessID').value__c;
        APISecureKey = Email_Csv__c.getInstance('APISecureKey').value__c;
        orgId = Email_Csv__c.getInstance('orgId').value__c;
        apiBaseUrl = Email_Csv__c.getInstance('apiBaseUrl').value__c;
        locId = Email_Csv__c.getInstance('locId').value__c;
        
    }

    String authHeader = 'Basic ' + EncodingUtil.base64Encode(Blob.valueOf(APIAccessID + ':' + APISecureKey));
    String endpoint = apiBaseUrl + '/organizations/' + orgId + '/locations/' + locId + '/transactions/';
    System.debug('Endpoint is ==> ' +endpoint);
    HTTP http = new HTTP();
    HTTPRequest request = new HTTPRequest();
    request.setEndpoint(endpoint);
    request.setMethod('GET');
    request.setHeader('Accept', 'application/json');
    request.setHeader('Authorization', authHeader);
    request.setHeader('X-Forte-Auth-Organization-Id', orgId);
    request.setTimeout(5000);
    HttpResponse response = http.send(request);
    if(response.getStatusCode() == 200) {
        EmailCsvWrapper resWrapper = EmailCsvWrapper.parse(response.getBody());
        for(Integer i=0; i<resWrapper.results.size(); i++) {
        EmailCsvWrapper.Results res = resWrapper.results.get(i);
        String s = res.received_date;
        Double authAmount = res.authorization_amount;
        String authAmountConverted = String.valueOf(authAmount);
        String oNumber = res.order_number;
        if(oNumber != null){
        String[] splittedoNumber = oNumber.split(',');
        oNumber = oNumber.contains(',') ? splittedoNumber[0] : oNumber;
        }
            for(String s : paymentNo){
            if(s == oNumber){
                    String cfn = +oNumber + ',' +res.status + ',' +authAmountConverted + ',' +s  + '\n';
                    finalstr = finalstr +cfn;
                    System.debug('CSV => ' +cfn);
            }
            }
    }
        
    List<Messaging.SingleEmailMessage> emails = new List<Messaging.SingleEmailMessage>();
    Messaging.SingleEmailMessage semail = new Messaging.SingleEmailMessage();
    Messaging.EmailFileAttachment attach = new Messaging.EmailFileAttachment();
    blob csvBlob = blob.valueOf(finalstr);
    attach.setFileName(‘Payments.csv');
    attach.setBody(csvBlob);
    List<String> emailAddresses = new List<String>();
    emailAddresses.addAll((Email_Csv__c.getInstance('EmailAddresses').value__c).split(';'));
    semail.setSubject('Csv File’);  
            semail.setToAddresses(emailAddresses);
    semail.setPlainTextBody(‘Transactions csv file’);
    semail.setFileAttachments(new Messaging.EmailFileAttachment[]{attach});
    emails.add(semail);
    Messaging.sendEmail(emails);
        
    }
    
    
}

}

【问题讨论】:

  • SELECT Number__c, Status__c FROM Payments__c where Status__c = 'Paid' - 好吧,这会在生产中返回超过 1 行吗?以系统管理员或最终用户身份运行,也许您有一些共享规则问题。如果您向 API 发送了 1 条以上的记录,但只收到 1 条结果 - 您必须联系支持此 API 的人员,这不完全是 Salesforce 问题...
  • 是的,它在生产中显示了 17 行
  • 我没有向 API 发送记录。我只是比较 salesforce 对象(支付对象)中的记录,然后比较 API Get 调用中是否存在特定记录(基于 API 响应和 Salesforce 字段中常见的 Number)。如果存在特定记录,我想在 csv 文件中显示(简而言之,将 Salesforce 字段数据与 API 响应数据进行比较)
  • API 是否返回超过 1 行。也许您的拆分逻辑在生产中必须不同,订单号由相同的标识符分隔?您确定您在 SF 中有超过 1 条记录应该匹配吗?老实说,我会这样做,首先调用 API,将收到的订单号收集到Set&lt;String&gt;,然后只查询WHERE Status__c = 'Paid' AND Number__c IN :paymentNumbers。使用调试日志并检查返回的 API,比较数字。没有样本(甚至是混淆)数据很难为您提供帮助
  • Api 总共返回 600 行,但与 salesforce 付款对象比较时,它应该显示 17 条状态为已付款的此类记录。我已经在 API 中测试了 10 行,并且它可以工作,但对于更多行它不起作用。请求.setTimeout(5000)。我认为是因为这个 setTimeout 为 5sec

标签: csv salesforce apex apex-code


【解决方案1】:

完成了。代码很好。我只是从 api 的第一页获取数据,这就是为什么我没有获取所有行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多