Я пытаюсь перечислить типы записей, к которым у пользователя есть доступ. К сожалению, это невозможно сделать с помощью SOQL Query (IIRC), и единственный выбор, который у меня есть, — это либо использовать Schema.SObjectType (Apex), либо API метаданных.

Я нашел исходный код, который добавляет этот метод:

// Returns a List of the Names of all RecordTypes
// available to the running user for a given SOBject type
public static List<String> GetAvailableRecordTypeNamesForSObject(
    Schema.SObjectType objType
) {
    List<String> names = new List<String>();
    List<RecordTypeInfo> infos = objType.getDescribe().getRecordTypeInfos();
    // If there are 2 or more RecordTypes...
    if (infos.size() > 1) {
        for (RecordTypeInfo i : infos) {
            if (i.isAvailable() 
                // Ignore the Master Record Type, whose Id always ends with 'AAA'.
                // We check the Id because Name can change depending on the user's language.
                && !String.valueOf(i.getRecordTypeId()).endsWith('AAA'))
                names.add(i.getName());
        }
    } 
    // Otherwise there's just the Master record type,
    // so add it in, since it MUST always be available
    else names.add(infos[0].getName());
    return names;
}

А можно запустить через Anonymous Apex с помощью этого блока:

List <String> availableRecordTypes = GetAvailableRecordTypeNamesForSObject(Case.SObjectType);
System.debug(availableRecordTypes);

Однако я получаю эту ошибку.

Method does not exist or incorrect signature: void GetAvailableRecordTypeNamesForSObject(Schema.SObjectType) from the type anon

Можете ли вы помочь мне исправить исходный код выше? Спасибо.

Источник: здесь ( Определение того, есть ли у каких пользователей доступный им тип записи с помощью SOQL)

0
VanceSOQL 15 Ноя 2021 в 10:15

1 ответ

Лучший ответ

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

public without sharing class SystemUtils {


    public static List<String> GetAvailableRecordTypeNamesForSObject(
            Schema.SObjectType objType
    ) {
        List<String> names = new List<String>();
        List<RecordTypeInfo> infos = objType.getDescribe().getRecordTypeInfos();
        // If there are 2 or more RecordTypes...
        if (infos.size() > 1) {
            for (RecordTypeInfo i : infos) {
                if (i.isAvailable()
                        // Ignore the Master Record Type, whose Id always ends with 'AAA'.
                        // We check the Id because Name can change depending on the user's language.
                        && !String.valueOf(i.getRecordTypeId()).endsWith('AAA'))
                    names.add(i.getName());
            }
        }
        // Otherwise there's just the Master record type,
        // so add it in, since it MUST always be available
        else names.add(infos[0].getName());
        return names;
    }

}

Вам нужно имя class.staticmethod для вызова статического метода, если он вызывается вне этого класса.

SystemUtils.GetAvailableRecordTypeNamesForSObject(Case.SObjectType);

Если и метод, и вызывающий объект были написаны в Anonymous apex, только тогда будет работать его вызов без класса, подобного этому GetAvailableRecordTypeNamesForSObject(Case.SObjectType);.

0
Nagendra Singh 15 Ноя 2021 в 10:44
Привет @Nagendra Большое спасибо! Вызов имени класса до того, как метод сработал для меня! Цените помощь! Я проголосовал за ваш ответ, хотя, поскольку я здесь новичок, мой голос, похоже, не отображался.
 – 
VanceSOQL
15 Ноя 2021 в 11:23
@Yvan-NewbieDeveloper Вместо этого вы можете принять ответ.
 – 
Nagendra Singh
15 Ноя 2021 в 11:27
Привет @Nagendra Ага, сделал это сейчас. Еще раз спасибо!
 – 
VanceSOQL
15 Ноя 2021 в 12:05