4

子の最上位の親アカウントを見つける必要があるという問題があります。私ができる最善のことは、子供からフィルターをかけることです。

 SELECT id, name, parent.id, parent.parent.id, parent.parent.parent.id,
 FROM Account WHERE id=CHILD_ID

次に、最上位のアカウントを示すnullのparent.idが見つかるまで繰り返します。あまりエレガントではなく、「トップレベル」のアカウントを保証するものではありません。

SELECT id, name, 
    (SELECT id, name, 
     FROM Accounts WHERE id = CHILD_ID)
FROM Account WHERE parent.id = null

しかし、セールスフォースではアカウント間で親子関係をたどることができないため、これは機能しません。誰かここに何か提案がありますか?

4

2 に答える 2

4

その通りです。単一のSOQLクエリでこれを行う方法はありません。2番目の望ましいクエリでも正しい結果が得られないことに注意してください(子アカウントの直接の親に親がない場合にのみレコードが返されます)。

あなたの最善の策は、最初のコードブロックであなたが言ったことをすることです。最大5つのオブジェクトの深さの関係をトラバースできるため、SOQL選択にparent.parent.parent.parent.parent.idを含めることができます。フィールドを繰り返し処理します。いずれもnullでない場合は、CHILD_IDをparent.parent.parent.parent.parent.idの値に変更する2番目のSOQLクエリを発行します。そうすれば、最終的に親のいない親を見つけることが保証されます(セールスフォースはサイクルを保証しないため)。

クエリでparent.idを選択し、より多くの個別のクエリを実行するだけで、これをよりエレガントにすることができますが、API /ガバナーの制限にぶつかるので、おそらく良い考えではありません。

Accountの代わりにカスタムオブジェクトを使用できる場合は、2番目のクエリのようなことを行うことができます。これは、そのカスタムオブジェクトからそれ自体への親子関係をトラバースできるためですが、それでも、あなたが望むものを与える単一のクエリ。

于 2011-01-03T19:32:58.007 に答える
1

私は顧客のサイトでこれに何度も遭遇しました。私が見つけた最良の解決策は、「Ultimate Parent」または「Legal Entity」と呼ばれることもあるカスタム フィールドですが、基本的には同じものです。トラバーサルを行うためにトリガーを使用しました。

基本的な考え方は、子アカウントであるアカウントを作成するときはいつでも、「究極の親」フィールドを子レコードにコピーすることです。

通常、フィールドをルックアップとしてセットアップするので、あなたのようなクエリがはるかに簡単になります。また、非常に興味深いデータの視覚化を行うこともできます。たとえば、親のルックアップ フィールドと最終的な親のルックアップ フィールドを使用して、兄弟、いとこ、2 番目のいとこなどの取引先を見つけることができます。

于 2011-02-11T06:42:40.083 に答える