2013-12-20 33 views
1

給定兩個Salesforce表名,我想確定它們之間是否存在父/子關係,以及如果關係存在哪個表是父項。Salesforce API:是否有辦法確定兩個隨機表之間的關係

我有這種方法適用於簡單的情況,但它沒有優化,因爲我必須在最壞的情況下通過兩個表的所有子關係。我也不相信這種方法處理所有情況。

private String getParent(String table1, String table2) throws Exception 
{ 
    DescribeSObjectResult[] describeSObjectResults = 
     pc.describeSObjects(new String[] {table1, table2}); 

    // Child relationships of table1 
    for (ChildRelationship cr : describeSObjectResults[0].getChildRelationships()) 
    { 
     // table1 has a child matching table2 
     if (table2.equalsIgnoreCase(cr.getChildSObject())) 
     { 
      return table1; 
     } 
    } 
    // Child relationships of table2 
    for (ChildRelationship cr : describeSObjectResults[1].getChildRelationships()) 
    { 
     // table1 has a child matching table2 
     if (table1.equalsIgnoreCase(cr.getChildSObject())) 
     { 
      return table2; 
     } 
    } 

    throw new Exception("There is no parent/child relationship."); 
} 

有沒有更好的方法來做到這一點?

回答

1

我不確定我會在這裏改變任何東西。這很簡單,清楚明白&維護代碼。

你可以做只描述1個對象 - 向下「去」子關係,通過檢查所有字段並檢查fieldDescribe方法是否返回有意義的東西來「向上」。

但我不會那麼做的:

  1. 這意味着你必須描述每一個領域 - 而且只有少數會實際上查找。
  2. 這意味着額外的頭痛當查找是「突變」:
    • Case.OwnerId可以指向UserQueue
    • Event.WhoId可以指向打勾
    • Report.ParentId任何對象已「允許活動」可以指向FolderUserOrganization

如果你擔心表現......這是外在的東西,對吧?不是Apex,而是Java或者C#(這個throws Exception位)。

您可以嘗試預先填充數據庫中的某個輔助表,然後引用此緩存的數據。

您可以嘗試爲您的組織準備一份「企業WSDL」的緩存副本,並且我確信它會更快地掃描本地保存的XML而不是去&每次請求SF(您需要記住提取每隔一段時間重新複製一次)。你甚至可以把它合併爲「本地數據庫作爲從WSDL產生的緩存加上,如果沒有發現 - 然後進行昂貴的描述調用」...

相關問題