从自引用表/ sObject在VisualForce / Apex中创建树状结构

时间:2013-04-10 23:29:57

标签: tree salesforce apex-code visualforce force.com

我的控制器都是自定义的。

我有一个对象/表,其中的字段引用同一个对象并表示父对象。

对象/表中有很多行。

我希望将它们全部转储到VF,并允许用户检查哪些行适用于它们。如果父对象不适用于用户,则子对象永远不会。

要限制用户在页面上看到的项目数量,我希望仅显示顶级对象,并且只有当用户选择顶级对象时,才会看到其子对象。理论上,顶级对象可以具有无限深度。

如何在VisualForce和Apex中实现最佳效果?

谢谢!

1 个答案:

答案 0 :(得分:0)

仅显示父帐户所需的全部内容

SELECT Id, Name FROM Account WHERE ParentId = null

当您的用户决定要查看一个记录的子项时(例如,可以在复选框上以<apex:actionFunction>完成),您将能够查询最多5 + 1级别的记录。从此查询和实验开始

SELECT Id, Name, (optional subquery here)
FROM Account
WHERE ParentId = :selectedId
    OR Parent.ParentId = :selectedId
    OR Parent.Parent.ParentId = :selectedId
    ... // We can use up to 5 dots
ORDER BY ParentId, Parent.ParentId, Parent.Parent.ParentId ...

按5 + 1我的意思是5“点”和子查询的选项。它不适用于帐户,但在您的自定义对象上,您也可以将(SELECT Id FROM CustomObjects__r)放在那里。

然后你必须以某种方式在树中很好地显示它们;)有很多Javascript工具接受分层JSON数据,或者你可能决定构建大量嵌套<apex:repeat> ...请注意达到viewstate限制!

查看这些链接以获取一些灵感/警告:

  1. https://salesforce.stackexchange.com/questions/4537/how-to-reduce-a-large-internal-view-state-what-is-in-the-internal-view-state
  2. https://appexchange.salesforce.com/listingDetail?listingId=a0N300000016chCEAQ(免费)
  3. https://appexchange.salesforce.com/listingDetail?listingId=a0N30000001gFEWEA2(付费,不知道是否有“试运行”选项,您可以使用该选项查看至少使用的Visualforce。我与该公司无任何关系