У меня есть пользовательский объект с именем RoleLevel__c . Supervisor__c выполняет самостоятельный поиск в RoleLevel__c. Мое требование - получить высшую запись в RoleLevel__c. Например,

У меня есть записи, как показано ниже R1-> R2-> R3-> R4-> R5-> R6-> R7-> R7-> R8-> R9-> R10-> R11

R11 (запись) имеет Supervisor__c поиск R10 (запись), R10 (запись) имеет Supervisor__c поиск R9 (запись), как и должно быть.

У нас есть другие имена полей TopRole__C, которые будут обновляться перед запуском на основе Supervisor__c он получает следующую запись до тех пор, пока Supervisor__c не станет нулевым ... в настоящее время мы достигаем этой функциональности с помощью SOQL внутри цикла while для получения верхней записи. Есть ли возможность получить Top запись без нескольких SOQL?
Перебор чего-то вроде Supervisor__r.Supervisor__r.Supervisor__r.id не работал после 5 уровней. Например, используются имена R1, R2.

0
Vishnu Sundar 4 Май 2020 в 09:19

1 ответ

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

Основная задача состоит в том, чтобы поддерживать актуальность всех полей toprole__c, даже если отношения наверху меняются (у вас уже есть эта задача прямо сейчас). Для этого вы можете реализовать триггер, который проверяет, изменяется ли поле supervisor__c в записи. В этом случае обновите поле toprole__c в этой записи на toprole__c нового супервизора, а также инициируйте обновление поля toprole__c всех дочерних записей (тех, которые имеют эту запись как supervisor__c).

Это вызывает цепочку нисходящих обновлений записей, поэтому в зависимости от объема ваших данных у вас могут возникнуть проблемы. В качестве альтернативы можно было бы выполнить 1 запрос для всех записей с одним и тем же полем toprole__c, построить дерево в памяти (на основе поля supervisor__c) и решить, какие из записей нуждаются в обновлении поля toprole__c (только те, которые относятся к измененная запись).

2
Guy Clairbois 4 Май 2020 в 12:18