【问题标题】:How can I get the name of the Lead Owner in a Lead custom formula field?如何在潜在客户自定义公式字段中获取潜在客户所有者的姓名?
【发布时间】:2010-04-15 23:06:15
【问题描述】:

我有一个通过 API 从 Salesforce 读取潜在客户记录的应用程序,我想将潜在客户所有者字段链接到应用程序中的一个属性。 Lead Owner 字段不在可用字段列表中,但所有自定义字段都在。

因此,我第一次尝试解决方案是创建一个显示潜在客户所有者姓名的自定义字段。在 SF 公式编辑器中,据我所知,它不显示实际数据字段,而是显示 ID 字符串。在我需要它的情况下,这毫无意义。

alt text http://skinny.fire-storm.net/forposting/insertfield.JPG

有没有办法获取 ID 字符串引用的对象中的数据?

alt text http://skinny.fire-storm.net/forposting/havewant.JPG

我有红盒,但需要绿盒。

编辑:我无法更改调用 API 的应用程序代码。我只能更换销售人员。所以,这更像是一个 Salesforce 超级用户/公式编写者的问题,而不是关于编写调用 SF API 的代码的问题。

【问题讨论】:

    标签: salesforce


    【解决方案1】:

    Salesforce 允许通过他们称为relationship queries 的方式访问相关数据。您可以像这样指定查询,而不是加入:

    System.debug([SELECT Owner.Name FROM Lead WHERE Id = '00QS00000037lvv'].Owner.Name);

    尝试在系统日志中运行它,只需将潜在客户 ID 替换为您正在查看的 ID。

    通过API访问数据时,原理是一样的,你的代理对象应该允许你访问Lead.Owner.Name。

    编辑:

    我同意 eyecream,因为您无法更改应用程序代码,因此创建 Apex 触发器将是最好的方法。以下是一些帮助您入门的代码:

    trigger Lead_UpdateOwner on Lead(before insert, before update)
    {
        Map<Id, String> ownerMap = new Map<Id, String>();
        for (Lead lead : Trigger.new)
        {
            ownerMap.put(lead.OwnerId, null);
        }
    
        if (ownerMap.size() > 0)
        {
            for (User[] users : [SELECT Id, Name FROM User WHERE Id IN :ownerMap.keySet()])
            {
                for (Integer i=0; i<users.size(); i++)
                {
                    ownerMap.put(users[i].Id, users[i].Name);
                }
            }
            for (Lead lead : Trigger.new)
            {
                lead.OwnerName__c = ownerMap.get(lead.OwnerId);
            }
        }
    }
    

    lead.OwnerName__c 需要是您在潜在客户对象上的自定义字段的名称,该字段将包含所有者名称。输入文本,长度 121。

    【讨论】:

    • 这可行,但我无法更改调用 Salesforce API 的代码。我只能更改 Salesforce。我应该在我的原始帖子中指定这一点。
    • 我的公司 SF 帐户中没有顶点触发器,但我正在努力获取它们!谢谢。
    【解决方案2】:

    我遇到了类似的问题,但希望所有当前和未来的用户字段都可用。由于用户的自定义查找字段不受公式字段的限制,因此我创建了一个名为 所有者查找 在 Opportunity 和 Account 对象上,然后使用触发器在创建或编辑时填充它。例如,机会触发器是这样的:

    trigger OpportunityTrigger on Opportunity (before insert, after insert, before update, after update) {
        if(trigger.isBefore && trigger.isInsert) {
            OpportunityTriggerHandler.newOpportunity(Trigger.old, Trigger.new);
        }    
        else if(trigger.isAfter && trigger.isInsert){
            //OpportunityTriggerHandler.futureUse(Trigger.new);
        }
        else if(trigger.isBefore  && trigger.isUpdate){
            OpportunityTriggerHandler.updateOpportunity(Trigger.new, Trigger.oldMap);
        }
        else if(trigger.isAfter && trigger.isUpdate){
            //OpportunityTriggerHandler.futureUse(Trigger.new, Trigger.oldMap);
        }
    }
    

    OpportunityTriggerHandler 类(Apex 代码)是:

    public with sharing class OpportunityTriggerHandler {
        public static void newOpportunity( List<Opportunity> oldOpportunitys, List<Opportunity> newOpportunitys ) {
            for (Opportunity opp: newOpportunitys) {
                updateOwnerData( opp );
            }
        }
    
        public static void updateOpportunity( List<Opportunity> oldOpportunitys, Map<Id, Opportunity> newOpportunitys ) {
            for (Opportunity opp: oldOpportunitys) {
                updateOwnerData( opp );
            }
        }
    
        public static void updateOwnerData( Opportunity opp ) {
            opp.OwnerLookup__c = opp.OwnerId;
        }
    }
    

    然后我在 Opportunity/Account 对象上创建公式字段以访问任何所有者(用户)对象字段,例如 Oppty Owner Name 公式字段:

    OwnerLookup__r.FirstName & " " & OwnerLookup__r.LastName
    

    【讨论】:

      【解决方案3】:

      VLOOKUP 函数是个不错的尝试,但是

      • 仅在验证规则中可用,在字段定义中不可用
      • 它只能用于自定义对象,您需要来自用户的数据

      我想说你需要从你的应用程序中查询

      SELECT Owner.FirstName, Owner.LastName FROM Lead
      

      除此之外...一些“插入后,更新后”触发器会在所有者更改时填充您的自定义字段?

      【讨论】:

        【解决方案4】:

        仅出于完整性考虑(以及 Google 搜索):问题出现在任何可以排队的对象上,而不仅仅是 Lead,因为它的来源是所有者可以引用任一用户(像往常一样)或队列对象。

        这可以使用公式字段而不是触发器来解决,如下所示:

        BLANKVALUE(Owner:Queue.QueueName, Owner:User.FirstName & " " & Owner:User.LastName)
        

        基本上,公式中的BLANKVALUE 函数会检查owner.queuename 是否为空,如果是则给出用户名。

        【讨论】:

        • OMFG 你的救命恩人!!!这个解决方案甚至比使用 APEX 更好
        猜你喜欢
        • 2012-12-23
        • 1970-01-01
        • 1970-01-01
        • 2014-12-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多