IDに基づいてアカウントの階層モデルを取得する方法を知っている人はいますか?
このクエリを使用してみましたが、取得したのは子ノードの最初のセットだけです。
select a.Name,a.parentId,a.ownerid,a.id from Account a where Parent.id ='00711314'
IDに基づいてアカウントの階層モデルを取得する方法を知っている人はいますか?
このクエリを使用してみましたが、取得したのは子ノードの最初のセットだけです。
select a.Name,a.parentId,a.ownerid,a.id from Account a where Parent.id ='00711314'
SOQLは階層検索をサポートしていません。レベルごとに取得する必要があります。各レベルで、IDのリストを生成し、in <list>
where演算子を使用して次のレベルを取得します。
ただし、ガバナーの制限が適用され、大きなツリーがある場合は、非常に簡単に制限に遭遇することに注意してください。
すでに述べたように、SOQLでは階層検索を利用できません。他のオブジェクトでこの機能が必要になったとき(および1万行未満であることがわかっているとき)、すべてのレコードを選択し、代わりにリストのマップを使用してメモリ内に階層を構築しました。
map<id, list<id>> mapParentToChildren = new map<id, list<id>>();
for(Record__c [] sRecordArr : [select Id, Parent__c from Record__c limit 10000])
{
for(Record__c sRecord : sRecordArr)
{
if(mapParentToChildren.get(sRecord.Parent__c) == null)
{
mapParentToChildren.put(sRecord.Parent__c, new list<id>{sRecord.Id});
}
else
{
mapParentToChildren.get(sRecord.Parent__c).add(sRecord.Id);
}
}
}
次に、再帰関数を使用して、データに対して操作などを実行できます。たとえば、(テストされていない)次のようになります。
// top level records will have a null parent, so be in the 'null' list
for(id idRecord : mapParentToChildren.get(null))
{
PrintTree(idRecord, 0);
}
public void PrintTree(id idRecord, int iLevel)
{
string strLevel = '*';
for(integer i = 0; i < iLevel; i++)
{
strLevel += '*';
}
System.Debug(strLevel + idRecord);
if(mapParentToChildren.get(idRecord) != null)
{
for(id idChild : mapParentToChildren.get(idRecord))
{
PrintTree(idChild, iLevel + 1);
}
}
}
このコードは非効率的でテストされていません(このバージョンをブラウザーに直接書き込んだばかりです)が、プラットフォームで階層データを処理する方法を理解できるはずです。
select a.Name,a.parentId,a.ownerid,a.id from Account a where a.parentId ='00711314'
階層内のレベルの数が限られていることがわかっていて、各レベルで限られた数のフィールドをクエリしている場合は、次のようにすることができます。
select Id, Name, ownerid,
parent.Id, parent.Name, parent.OwnerId,
parent.parent.Id, parent.parent.Name, parent.parent.OwnerId,
parent.parent.parent.Id, parent.parent.parent.Name, parent.parent.parent.OwnerId
from Account where Parent.id ='00711314'
醜いですが、1回のクエリで固定数の階層レベルを取得できます。