Salesforce:是否可以将以下2个SOQL查询简化为1个SOQL

时间:2014-02-22 07:57:33

标签: salesforce

我需要将下面代码中的2个SOQL合并为一个,是否可能?

要求: - 插入商机时,检查帐户是否已选中私有标志,如果是,则检查该帐户是否在登录用户区域内。如果是,则允许创建机会,否则显示错误消息。 仅当触发上下文的大小为1时才执行上述功能。

代码:
触发器:

\\Only for one record Insertion
if (Trigger.new.size()==1) 
{
    \\Get all Accounts which are marked private(Confidential)
    Account acc = [select id, Confidential_Account__c 
                   from Account 
                   where id= :Trigger.new[0].AccountId];
    if (acc.Confidential_Account__c==true)
    {
        OpportunityTriggerUtil
        .checkIfAccountExistInUserTerritory(Trigger.new[0], 
                                            Trigger.new[0].AccountID, 
                                            userInfo.getUserID());
    }
}

类别:

public static void checkIfAccountExistInUserTerritory(Opportunity opp,ID AccountID,ID currentuserid)
{
    Boolean isAccountInTerritory=false;

    \\Get all Sales territory Account for logged in user
    for(Sales_Territory_Account_Assignment__c SA: 
        [select id, Account__c 
        from Sales_Territory_Account_Assignment__c 
        where Sales_Territory__c in 
            (select Sales_Territory__c 
            from Sales_Territory_User_Assignment__c 
            where user__c = :currentuserid)])
    {
        \\Check whether the Account is in Logged in user territory
        if(SA.Account__c==AccountID)
        {
            isAccountInTerritory = true;
        }
    }
    system.debug('@@@@@  '+ isAccountInTerritory);
    if(isAccountInTerritory == false)
    {
        opp.addError('Selected account is not in your territory');
        return;
    }
}

1 个答案:

答案 0 :(得分:0)

存在多个问题 - 性能(您的代码不是"批量")和逻辑(仅检查第一个机会 - 对于从Web界面发生的编辑而言可能没有问题,但可能不会像您一样#39; d喜欢在使用Data Loader等工具时工作。通过查看您提供的代码,我可以说它可能会达到50K返回行的限制,而不是101个查询限制。因此,必须有一些更大的流量导致该触发器的多个条目 - 如果您没有发布整个上下文,您期望什么样的魔法?

通常情况下,这些问题应该按照"以及你为实际尝试解决问题而采取的措施进行评论。但是我怀疑如果你原来写的这本书还有很多东西要学习......

欢迎使用StackOverflow,但下次请花一些时间阅读https://stackoverflow.com/questions/how-to-ask中的右侧链接?

请 - 请不要这样做"请尽快提供解决方案。" ...


如果我正确阅读了您的数据库模型,那么:

enter image description here

(在https://www.draw.io/中创建)

这样的事情应该给你足够的想法开始:

SELECT Id, Account__c
FROM Sales_Territory_Account_Assignment__c
WHERE Account__c = :AccountID
    AND Sales_Territory__r.User__c = :currentuserid

您仍然有很多改进机会:

  • 一次开始检查超过1个Opp
  • 但要确定要检查哪些帐户并且不要重新检查它们(如果同时修改了10个opps,但它们只属于2个帐户 - 只进行2次检查)
  • 可能会添加LIMIT 1 - 以防万一有多个条目 - 只要知道至少存在1个匹配就可以了解尝试将这个全部合并到一个通过帐户的巨型查询中(以获取信息)关于这个机密旗帜)和相关的指定地区列表。
  • 在整个事务中只检查一次(如果您的逻辑很复杂并且多次更新机会,则可能有多个条目同一触发器。)

实际上如果你有101个查询有问题,这最后一点对你来说可能是最重要的。你需要一个像not execute same piece of code more than once的静态变量标志这样的技巧。


更多阅读材料:

  1. https://www.salesforce.com/us/developer/docs/apexcode/Content/apex_triggers_bestpract.htm
  2. http://blog.jeffdouglas.com/2009/04/20/writing-bulk-triggers-for-salesforce/
  3. http://developer.force.com/cookbook/recipe/controlling-recursive-triggers
  4. https://salesforce.stackexchange.com/questions/16322/trigger-isexecuting-clarification
  5. http://developer.force.com/cookbook/recipe/controlling-recursive-triggers