Salesforce API:有没有办法确定两个随机表之间的关系

时间:2013-12-20 19:32:49

标签: salesforce

给定两个Salesforce表名,我想确定它们之间是否存在父/子关系,以及关系是否存在哪个表是父表。

我有这种方法适用于简单的情况,但它没有优化,因为在最坏的情况下我必须经历两个表的所有子关系。我也不相信这种方法可以处理所有情况。

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 个答案:

答案 0 :(得分:1)

我不确定我会在这里改变什么。这很简单,清楚易懂。保持代码。

你只能描述一个对象 - 向下“向下”到子关系,通过检查所有字段并检查像getReferenceTo()这样的fieldDescribe方法是否返回有意义的东西来“向上”。 / p>

但我不会这样做:

  1. 这意味着您必须描述每个字段 - 实际上只有少数字段会被查找。
  2. 当查找“突变”时,这意味着额外的头痛:
    • Case.OwnerId可以指向UserQueue
    • Event.WhoId可以指向任何已勾选“允许活动”的对象
    • Report.ParentId可以指向FolderUserOrganization
  3. 如果你担心表现......这是外在的,对吗?不是Apex而是Java或者C#(这个throws Exception位)。

    您可以尝试在数据库中预先填充一些帮助程序表,然后引用此缓存数据。

    您可以尝试为您的组织提供“Enterprise WSDL”的缓存副本,并且我确信扫描本地保存的XML比go&更快。每次都要问SF(你需要记住每隔一段时间拿一份新的副本)。您甚至可以将它组合起来,将“本地数据库作为从WSDL生成的缓存加上,如果找不到任何内容 - 然后进行昂贵的描述调用”......