Регистрация  |  Вход

Вытянуть все возможные значеняи Picklist для определенного Record Type. Apex

Конкретный пример - Converted Lead Status.
Очень хочется чтоб

[SELECT MasterLabel FROM LeadStatus WHERE IsConverted = true ORDER BY SortOrder]
вернул мне только те LeadStatus, которые возможны для текущего Lead (у которого определенный Record Type).

Конкретный пример - Converted Lead Status.  
Очень хочется чтоб [code][SELECT MasterLabel FROM LeadStatus WHERE IsConverted = true ORDER BY SortOrder][/code] вернул мне только те LeadStatus, которые возможны для текущего Lead (у которого определенный Record Type).
[url=https://success.salesforce.com/ideaView?id=08730000000gNpLAAU]Idea - Getting Picklist values based on Record Type[/url]

UI API (по ссылке) не знаю не пробовал, но есть злой хак на основе VF + JS
Но я его когда-то давно подсмотрел у Димы Лисовского, поэтому не могу раскрывать способ без его согласия (возможно эта наработка собственность компании). Но способ крайне интересный и элегантный

UI API (по ссылке) не знаю не пробовал, но есть злой хак на основе VF + JS
Но я его когда-то давно подсмотрел у Димы Лисовского, поэтому не могу раскрывать способ без его согласия (возможно эта наработка собственность компании). Но способ крайне интересный и элегантный :D 

Хотя тут вот погуглил на счет UI API и нагуглил вот такую ссылку
https://salesforce.stackexchange.com/questions/103837/how-do-i-get-the-intersection-of-recordtype-and-picklist-values-inside-apex/202519#202519

Нет под рукой подходящего орга чтобы попробовать но вот этот код выглядит крайне любопытно!

Http http = new Http();
HttpRequest request = new HttpRequest();
String shost = System.Url.getSalesforceBaseURL().toExternalForm();
String url = shost + '/ui-api/object-info/{objectApiName}/picklist-values/{recordTypeId}/{fieldApiName}';
request.setEndpoint(url);
request.setMethod('GET');

// set Authorization
request.setHeader('Authorization', 'OAuth '+UserInfo.getSessionId());
HttpResponse response = http.send(request);

Хотя тут вот погуглил на счет UI API и нагуглил вот такую ссылку
https://salesforce.stackexchange.com/questions/103837/how-do-i-get-the-intersection-of-recordtype-and-picklist-values-inside-apex/202519#202519

Нет под рукой подходящего орга чтобы попробовать но вот этот код выглядит крайне любопытно!

[code]
Http http = new Http();
HttpRequest request = new HttpRequest();
String shost = System.Url.getSalesforceBaseURL().toExternalForm();
String url = shost + '/ui-api/object-info/{objectApiName}/picklist-values/{recordTypeId}/{fieldApiName}';
request.setEndpoint(url);
request.setMethod('GET');

// set Authorization 
request.setHeader('Authorization', 'OAuth '+UserInfo.getSessionId());
HttpResponse response = http.send(request);
[/code]

Дима, можно сделать простой apex:inputField для Status. Там будут ВСЕ возможные значения для этого Record Type. Я их фильтрую с теми, что мне вернулись из моего запроса. Это не красиво.

Дима, можно сделать простой apex:inputField для Status. Там будут ВСЕ возможные значения для этого Record Type. Я их фильтрую с теми, что мне вернулись из моего запроса. Это не красиво.

По ссылке не только UI API, но и Metadata API (https://github.com/financialforcedev/apex-mdapi)

По ссылке не только UI API, но и Metadata API (https://github.com/financialforcedev/apex-mdapi)

А! Еще можно через Metadata API. Но я надеялся на что-то более простое, чем делать callout и парсить ответ.

А! Еще можно через Metadata API. Но я надеялся на что-то более простое, чем делать callout и парсить ответ.

Andrii Muzychuk
Дима, можно сделать простой apex:inputField для Status

Да, это. Да не элегантно, но для инициализации SPA подходит.

[quote="Andrii Muzychuk"]Дима, можно сделать простой apex:inputField для Status[/quote]
Да, это. Да не элегантно, но для инициализации SPA подходит.

Сорри, не дочитал название темы для конца - что тебе нужно именно в Apex.

Сорри, не дочитал название темы для конца - что тебе нужно именно в Apex.

Andrii Muzychuk
Но я надеялся на что-то более простое, чем делать callout и парсить ответ.

Не раньше, чем Salesforce добавит обычный простой апекс метод с параметром RecordType.

[quote="Andrii Muzychuk"]Но я надеялся на что-то более простое, чем делать callout и парсить ответ.[/quote]

Не раньше, чем Salesforce добавит обычный простой апекс метод с параметром RecordType.

Я только писал, что если ты делаешь кучу своего UI, то норм решение :-)

Я только писал, что если ты делаешь кучу своего UI, то норм решение :-)

Developer
Andrii Muzychuk
Но я надеялся на что-то более простое, чем делать callout и парсить ответ.

Не раньше, чем Salesforce добавит обычный простой апекс метод с параметром RecordType.


Это точно = ))

[quote="Developer"][quote="Andrii Muzychuk"]Но я надеялся на что-то более простое, чем делать callout и парсить ответ.[/quote]

Не раньше, чем Salesforce добавит обычный простой апекс метод с параметром RecordType.[/quote]
Это точно = ))

Ну, знач сначала у меня был хардкод в Apex. Птм товарищи подумали и решили, что если вдруг (очень малая вероятность, но все-равно) поменяют название статуса, то придется код менять.
Решили сделать Custom Label, в который записывают статус, который надо выставлять. Записи будут одного и того же Record Type.
Я хотел, что б было красиво, но СФ говорит свое "ФЕ" :-)

Ну, знач сначала у меня был хардкод в Apex. Птм товарищи подумали и решили, что если вдруг (очень малая вероятность, но все-равно) поменяют название статуса, то придется код менять.  
Решили сделать Custom Label, в который записывают статус, который надо выставлять. Записи будут одного и того же Record Type.  
Я хотел, что б было красиво, но СФ говорит свое "ФЕ" :-)

Я б лучше Custom Settings для этого использовал. Больше по смыслу подходит чем Custom Labels.

Я б лучше Custom Settings для этого использовал. Больше по смыслу подходит чем Custom Labels.

Я их и предложил. Но более опытные Джедаи решили по-своему.

Я их и предложил. Но более опытные Джедаи решили по-своему.

Блин, оказалось что проверка пары Picklist + Record Type происходит чисто на клиентской стороне, а базе вообще пофиг... А то можно было бы просто в цикле завернуть в транзакцию и try..catch и тупо сохранять запись со всеми возможными значениями статуса, те что не отвалились - были бы признаны валидными для Record Type... А по факту оказалось - что базе на это с высокой колокольни и туда можно пропихнуть всё что угодно и это даже не restricted picklist (по крайней мере в организации где я это проверил по-быстрому)

Блин, оказалось что проверка пары Picklist + Record Type происходит чисто на клиентской стороне, а базе вообще пофиг... А то можно было бы просто в цикле завернуть в транзакцию и try..catch и тупо сохранять запись со всеми возможными значениями статуса, те что не отвалились - были бы признаны валидными для Record Type... А по факту оказалось - что базе на это с высокой колокольни и туда можно пропихнуть всё что угодно и это даже не restricted picklist (по крайней мере в организации где я это проверил по-быстрому)