obj1__c
obj1__c.ParentObj1__c
obj1__c.Obj2__c
Вот сть у меня такое. Пользователь берет объект1 и я должен ему показать объект2 в его родителе. Если у родителя нет объекта2, то искать дальше в родителе родителя. И так далее по иерархии.
Первое, что пришло в голову, это вычитать родителя, проверить наличие объекта2 и повторять посинения.
но меня напрягает, вызов простого SOQL для вычитки всего одного поля.
Может можно каким-то оброзом в куда-то вычитать всю иерархию и птм по ней бегать?
obj1__c obj1__c.ParentObj1__c obj1__c.Obj2__c Вот сть у меня такое. Пользователь берет объект1 и я должен ему показать объект2 в его родителе. Если у родителя нет объекта2, то искать дальше в родителе родителя. И так далее по иерархии. Первое, что пришло в голову, это вычитать родителя, проверить наличие объекта2 и повторять посинения. но меня напрягает, вызов простого SOQL для вычитки всего одного поля. Может можно каким-то оброзом в куда-то вычитать всю иерархию и птм по ней бегать?
Это ты строишь что-то по типу дерева и тебе надо найти последнего в ветке?
Это ты строишь что-то по типу дерева и тебе надо найти последнего в ветке?
Как вариант для быстрого получения информации, можешь завести служебное текстовое поле, куда генерировать информацию при изменении иерархии родителей для данного объекта. Небольшой гемор с дублирование информации по связям, но зато нужная информация сразу при первом запросе и не надо каждый раз всех родителей вверх перебирать.
Как вариант для быстрого получения информации, можешь завести служебное текстовое поле, куда генерировать информацию при изменении иерархии родителей для данного объекта. Небольшой гемор с дублирование информации по связям, но зато нужная информация сразу при первом запросе и не надо каждый раз всех родителей вверх перебирать.
[quote="Dmitry Shnyrev"]Это ты строишь что-то по типу дерева и тебе надо найти последнего в ветке?[/quote]Первого в ветке, у которого obj1__c.Obj2__c != null
1. select Id, Obj2__c FROM obj1__c WHERE obj1__c.Obj2__c != null
2. циклом ещи тот элемент, ид которого нет в других в поле Obj2__c
Это и будет твой первый элемент
1. select Id, Obj2__c FROM obj1__c WHERE obj1__c.Obj2__c != null 2. циклом ещи тот элемент, ид которого нет в других в поле Obj2__c Это и будет твой первый элемент
Без рекурсии не обойтись, но можно это значительно ускорить. Просто в каждом запросе выгребай Object_1__r на максимально возможную глубину (или высоту, как посмотреть), по-моему 5 в форсе будет, что-то в духе:
select Object_2__c, Object_1__r.Object_2__c, Object_1__r.Object_1__r.Object_2__c, ..., Object_1__r.-n раз-.Object_2__c from Object_1__c
if (record.Object_2__c != null)
{
//do something
}
else if (record.Object_1__r.Object_2__c != null)
{
//do something
}
...
Без рекурсии не обойтись, но можно это значительно ускорить. Просто в каждом запросе выгребай Object_1__r на максимально возможную глубину (или высоту, как посмотреть), по-моему 5 в форсе будет, что-то в духе: [code]select Object_2__c, Object_1__r.Object_2__c, Object_1__r.Object_1__r.Object_2__c, ..., Object_1__r.-n раз-.Object_2__c from Object_1__c[/code] И бегай себе: [code] if (record.Object_2__c != null) { //do something } else if (record.Object_1__r.Object_2__c != null) { //do something } ... [/code]
Хороший вариант, хоть и выглядит костыльно.
Сам так делал однажды.
Но единственное ограничение - максимальная глубина 5 в одном запросе.
Хотя я это тоже обходил хитро - расширял до 10 (больше не надо было) - на последнем шаге если не достиг конца делал еще один запрос к последнему родителю еще на 5 уровней.
Хороший вариант, хоть и выглядит костыльно. Сам так делал :) однажды. Но единственное ограничение - максимальная глубина 5 в одном запросе. Хотя я это тоже обходил хитро - расширял до 10 (больше не надо было) - на последнем шаге если не достиг конца делал еще один запрос к последнему родителю еще на 5 уровней.
Не вижу ничего костыльного. Ну и как расширенный вариант, с подачи Дмитрия - добавить в объект Object_1__c formula-полей которые сразу будут вытаскивать Object_2__c из родительских объектов на максимально возможную глубину, таким образом до 10 и расширится.
[quote="Dmitry Shnyrev"]Хороший вариант, хоть и выглядит костыльно. [/quote] Не вижу ничего костыльного. Ну и как расширенный вариант, с подачи Дмитрия - добавить в объект Object_1__c formula-полей которые сразу будут вытаскивать Object_2__c из родительских объектов на максимально возможную глубину, таким образом до 10 и расширится.
Но я все-таки голосую за предварительный просчет конечного родителя. Я думаю лучше делать это один раз при изменении записи и хранить инфу в специальном поле.
Я думаю НЕ Salesforce разработчики поступают именно так.
Но я все-таки голосую за предварительный просчет конечного родителя. Я думаю лучше делать это один раз при изменении записи и хранить инфу в специальном поле. Я думаю НЕ Salesforce разработчики поступают именно так.
Не соглашусь - на первый взгляд просто, а по факту - поддерживать просчитанные данные в актуальном виде - слишком затратная и запутанная операция.
[quote="Dmitry Shnyrev"]Но я все-таки голосую за предварительный просчет конечного родителя. Я думаю лучше делать это один раз при изменении записи и хранить инфу в специальном поле. Я думаю НЕ Salesforce разработчики поступают именно так.[/quote] Не соглашусь - на первый взгляд просто, а по факту - поддерживать просчитанные данные в актуальном виде - слишком затратная и запутанная операция.