5

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

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

替代文字 http://skinny.fire-storm.net/forposting/insertfield.JPG

有没有一种方法可以获取 ID 字符串引用的对象中的数据?

替代文字 http://skinny.fire-storm.net/forposting/havewant.JPG

我有红盒,但需要绿盒。

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

4

4 回答 4

5

Salesforce 允许通过他们所谓的关系查询访问相关数据。您可以像这样指定查询,而不是加入:

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。

于 2010-04-16T00:20:43.963 回答
3

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

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
于 2012-11-19T19:27:48.450 回答
2

VLOOKUP函数将是一个很好的尝试,但是

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

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

SELECT Owner.FirstName, Owner.LastName FROM Lead

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

于 2010-04-16T00:33:54.573 回答
2

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

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

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

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

于 2014-11-24T13:23:09.880 回答