Как я могу получить имя Лидера в поле пользовательской формулы Лида? - PullRequest
3 голосов
/ 16 апреля 2010

У меня есть приложение, которое читает записи Lead из Salesforce через API, и я хочу связать поле Lead Owner с атрибутом в приложении. Поле «Ведущий владелец» не отображается в списке доступных полей, но все пользовательские поля.

Итак, моей первой попыткой было создать настраиваемое поле, в котором отображалось имя ведущего владельца. Насколько я могу судить, в редакторе формул SF он не отображает поле фактических данных, а отображает строку идентификатора. Что довольно бессмысленно в контексте, в котором я нуждаюсь.

альтернативный текст http://skinny.fire -storm.net / forposting / insertfield.JPG

Есть ли способ, которым мы можем получить данные в объекте, на который ссылается строка идентификатора?

альтернативный текст http://skinny.fire -storm.net / forposting / havewant.JPG

У меня КРАСНАЯ КОРОБКА, но нужна ЗЕЛЕНАЯ КОРОБКА.

РЕДАКТИРОВАТЬ: я не могу изменить код приложения, который вызывает API. Я могу только изменить силу продаж. Таким образом, это скорее вопрос о суперпользователе / ​​составителе формул Salesforce, а не о написании кода, который вызывает SF API.

Ответы [ 4 ]

5 голосов
/ 16 апреля 2010

Salesforce позволяет получить доступ к связанным данным через то, что они называют запросами отношения . Вместо присоединения вы указываете запрос следующим образом:

System.debug ([ВЫБРАТЬ имя владельца. ОТ ЛИЦА, ГДЕ Id = '00QS00000037lvv']. Имя владельца.) *

Попробуйте запустить это в системном журнале, просто замените идентификатор отведения на тот, который вы просматриваете.

При доступе к данным через API принцип тот же, ваши прокси-объекты должны позволять вам обращаться к Lead.Owner.Name.

EDIT:

Я согласен с eyescream, так как вы не можете изменить код приложения, создание триггера 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.

3 голосов
/ 19 ноября 2012

У меня была похожая проблема, но я хотел, чтобы все текущие и будущие поля пользователя были доступны. Поскольку настраиваемое поле поиска для пользователя не ограничено полями формулы, я создал поле с именем OwnerLookup на объектах Opportunity и Account, затем использовали триггеры для заполнения при создании или редактировании. Например, триггер Opportunity выглядит так:

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
2 голосов
/ 16 апреля 2010

VLOOKUP функция будет хорошей попыткой, но

  • доступно только в правилах проверки, но не в определениях полей
  • он может использоваться только для пользовательских объектов, и вам нужны данные от пользователя

Я бы сказал, что вам нужно запросить у вашего приложения

SELECT Owner.FirstName, Owner.LastName FROM Lead

Кроме этого ... какой-нибудь триггер "после вставки, после обновления", который будет заполнять ваше пользовательское поле при смене владельца?

1 голос
/ 24 ноября 2014

Просто публикация для полноты (и для поиска в Google): проблема возникает с любым объектом, который может быть поставлен в очередь, а не только с Lead, так как источник этого в том, что владелец может ссылаться на любого пользователя (как обычно) или объект очереди.

Это можно решить, используя поле формулы вместо триггеров, как показано ниже:

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

По сути, функция BLANKVALUE в формуле проверяет, является ли owner.queuename пустым, и, если да, дает имя пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...