Compare two different SOQL queries

时间:2018-02-05 12:50:23

标签: salesforce visualforce apex force.com

enter image description hereI am new to salesforce and I am stuck with a situation here.

I have a class which is scheduled every hour. I hit an account with the below code and an email is sent out to MAROPOST (Marketing automation tool). When this happen I want to track the Account and create a case or a log which says Welcome Email is sent so that I don't hit the same Account again.

Please help. Below is the working class. Please help

public class PD_WelcomeMaroPost {
public static string sendEmailThroughMaro(string myInpEmail) {
    string successContacts = '';
    string failureContacts = '';


    // SQL to fetch FBO who Joined Today
    list<Account> conts = new list<Account> ([SELECT name, Email_FLP_com__c,
    (SELECT Id
    FROM Stripe_Subscriptons__r
    WHERE Start_Date__c= TODAY
        AND Status__c='active'
        AND Welcome_Email__C = false
    LIMIT 1)
from account
where ID IN (
    select Distributor__c
    from Stripe_Subscripton__c
    where Start_Date__c= TODAY
        AND Status__c='active'
        AND Welcome_Email__C = false)
AND  Email_FLP_com__c != NULL
LIMIT 100]);



    system.debug('>>>>>>>>>>' + conts);
    overallEmail myEmail = new overallEmail();
    List<Stripe_Subscripton__c> subsToUpdate = new List<Stripe_Subscripton__c>();
    for(Account c : conts){

        myEmail.email.campaign_id = 172;
        myEmail.email.contact.Email = c.Email_FLP_com__c;
        myEmail.email.contact.first_name = c.name;
        /**MAp<String, String> tags = new Map<String, String>();
        tags.put('firstName', c.name);
        myEmail.email.tags = tags;**/
        system.debug('#### Input JSON: ' + JSON.serialize(myEmail));


        try{
            String endpoint = 'http://api.maropost.com/accounts/1173/emails/deliver.json?auth_token=j-V4sx8ueUT7eKM8us_Cz5JqXBzoRrNS3p1lEZyPUPGcwWNoVNZpKQ';
            HttpRequest req = new HttpRequest();
            req.setEndpoint(endpoint);
            req.setMethod('POST');
            req.setHeader('Content-type', 'application/json');
            req.setbody(JSON.serialize(myEmail));
            Http http = new Http();
            system.debug('Sending email');
            HTTPResponse response = http.send(req); 
            system.debug('sent email');
            string resultBodyGet = '';
            resultBodyGet = response.getBody();
            system.debug('Output response:' + resultBodyGet);
            maroResponse myMaroResponse = new maroResponse();
            myMaroResponse = (maroResponse) JSON.deserialize(resultBodyGet, maroResponse.class);
            system.debug('#### myMaroResponse: ' + myMaroResponse);
            if(myMaroResponse.message == 'Email was sent successfully')
               successContacts = successContacts + ';' + c.Email_FLP_com__c;
            else
                failureContacts = failureContacts + ';' + c.Email_FLP_com__c;
        }
        catch (exception e) {
            failureContacts = failureContacts + ';' + c.Email_FLP_com__c;
            system.debug('#### Exception caught: ' + e.getMessage());                
        }

        c.Stripe_Subscriptons__r[0].Welcome_Email__c = true;
        subsToUpdate.add(c.Stripe_Subscriptons__r[0]);

    }
    Update subsToUpdate;
   return 'successContacts=' + successContacts + '---' + 'failureContacts=' + failureContacts;   

}

public class maroResponse {
    public string message {get;set;}
}

public class overallEmail {
    public emailJson email = new emailJson();
}

public class emailJson {
    public Integer campaign_id;
    public contactJson contact = new contactJson();
   // Public Map<String, String> tags;
}

public class contactJson {
    public string email;
    public string first_name;
}

}

2 个答案:

答案 0 :(得分:1)

您正在循环中制作标注,其中governor limit of max 100 callouts。请参阅Limits class以获取最新&amp;最大数字以编程方式而不是硬编码。

除此之外,它应该是非常简单的改变。首先将您的过滤器添加到查询中并添加一个&#34;子查询&#34; (类似于JOIN)拉出相关的订阅列表

list<Account> conts = new list<Account> ([SELECT name, Email_FLP_com__c,
        (SELECT Id
        FROM Stripe_Subscriptions__r
        WHERE Start_Date__c= TODAY
            AND Status__c='active'
            AND Welcome_Email__C = false
        LIMIT 1)
    from account
    where ID IN (
        select Distributor__c
        from Stripe_Subscripton__c
        where Start_Date__c= TODAY
            AND Status__c='active'
            AND Welcome_Email__C = false)
    AND  Email_FLP_com__c != NULL
    LIMIT 100]);

然后它只有几行

List<Stripe_Subscription__c> subsToUpdate = new List<Stripe_Subscription__c>();

for(Account a : conts){
    // do your maropost code here

    a.Stripe_Subscriptions__r[0].Welcome_Email__c = true;
    subsToUpdate.add(a.Stripe_Subscriptions__r[0]);
}
update subsToUpdate;

当然,您可能只想在callout一切正常时将该复选框设置为true;)

答案 1 :(得分:0)

在阅读完代码后,我看不到您在哪里尝试完成此操作。如果您发布您的尝试,我很乐意帮助解决它。

相反,我会为你要做的事情给出不同的逻辑。

1.) create new checkbox field
2.) in batch query where box is not checked
3.) send email
4.) check checkbox

在这里回答您的评论是一些示例代码,您需要自己修复它,我只是制作临时名称

for(sobjectname gg:[your query]){
Send email;
gg.checkbox = checked;
update gg;
}

最好通过

进行批量化
list<yourSObject> tobeupdated = new list<yourSObject>([Your query]);

for(yourSObject gg: tobeupdated){
send email;
gg.checkbox = true;
}
update tobeupdated;
相关问题