2011-01-03 9 views
4

子供のトップレベルの親アカウントを見つける必要があるという問題があります。私が行うことができました最高のあなたは、トップレベルのアカウントを示すヌルparent.idを見つけるまで、そして、反復処理Salesforce/SOQL - 「トップレベル」の親アカウントを返す方法を教えてください。

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

/wの子からアップフィルタです。非常にエレガントではないと、「トップレベル」のアカウントを保証するものではありません、私は

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

のようなものを優先しているだろうが、それは明らかにあなたが口座から口座に親子関係をトラバースすることはできませんSalesforceのように動作しません。誰でもここに提案はありますか?

答えて

4

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

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

これは、クエリでparent.idを選択してより多くの個別のクエリを実行するだけで、より洗練されたものにすることができますが、API /ガバナの制限に反します。

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

+0

はい、私はできるだけ多くのデータをループできますアプローチすると、コードはかなり醜いものになってしまいましたが、今はうまくいくと思います。ありがとう –

0

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

基本的な考え方は、子アカウントであるアカウントを作成するたびに、「Ultimate Parent」フィールドを子レコードにコピーすることです。

通常、あなたのようなクエリがはるかに簡単になるようにフィールドをルックアップとして設定します。また、非常に面白いデータの視覚化を行うこともできます。たとえば、親ルックアップフィールドと最終的な親ルックアップフィールドを使用すると、兄弟、いとこ、秒のいとこなどのアカウントを見つけることができます。

関連する問題