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

Поиск по родителям

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 для вычитки всего одного поля.

Может можно каким-то оброзом в куда-то вычитать всю иерархию и птм по ней бегать?

Это ты строишь что-то по типу дерева и тебе надо найти последнего в ветке?

Это ты строишь что-то по типу дерева и тебе надо найти последнего в ветке?

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

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

Dmitry Shnyrev
Это ты строишь что-то по типу дерева и тебе надо найти последнего в ветке?
Первого в ветке, у которого obj1__c.Obj2__c != null

[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 уровней.

Dmitry Shnyrev
Хороший вариант, хоть и выглядит костыльно.

Не вижу ничего костыльного. Ну и как расширенный вариант, с подачи Дмитрия - добавить в объект Object_1__c formula-полей которые сразу будут вытаскивать Object_2__c из родительских объектов на максимально возможную глубину, таким образом до 10 и расширится.

[quote="Dmitry Shnyrev"]Хороший вариант, хоть и выглядит костыльно. [/quote]
Не вижу ничего костыльного. Ну и как расширенный вариант, с подачи Дмитрия - добавить в объект Object_1__c formula-полей которые сразу будут вытаскивать Object_2__c из родительских объектов на максимально возможную глубину, таким образом до 10 и расширится.

Но я все-таки голосую за предварительный просчет конечного родителя. Я думаю лучше делать это один раз при изменении записи и хранить инфу в специальном поле.
Я думаю НЕ Salesforce разработчики поступают именно так.

Но я все-таки голосую за предварительный просчет конечного родителя. Я думаю лучше делать это один раз при изменении записи и хранить инфу в специальном поле.
Я думаю НЕ Salesforce разработчики поступают именно так.

Dmitry Shnyrev
Но я все-таки голосую за предварительный просчет конечного родителя. Я думаю лучше делать это один раз при изменении записи и хранить инфу в специальном поле.
Я думаю НЕ Salesforce разработчики поступают именно так.

Не соглашусь - на первый взгляд просто, а по факту - поддерживать просчитанные данные в актуальном виде - слишком затратная и запутанная операция.

[quote="Dmitry Shnyrev"]Но я все-таки голосую за предварительный просчет конечного родителя. Я думаю лучше делать это один раз при изменении записи и хранить инфу в специальном поле.
Я думаю НЕ Salesforce разработчики поступают именно так.[/quote]

Не соглашусь - на первый взгляд просто, а по факту - поддерживать просчитанные данные в актуальном виде - слишком затратная и запутанная операция.