带有自定义查询的嵌套模板片段?

Nested Template Fragments with Custom Queries?

首先,在我阅读的 Sparx 帮助中 'Creating a Template Fragment':

"如果将一个模板片段嵌入到另一个片段中,从父模板生成报告的速度会变慢"。

所以,我知道一般来说嵌套模板片段应该是可能的。

我有许多图表要从中生成文档。 对于每个图表,我想处理该图表上某些类型(例如活动)的元素。 因此,我的主要模板(处理图表)引用了一个基于自定义查询的模板片段:

select o.Name as ActivityName, ...
from t_object o, t_diagramobjects do
where 
   o.Object_ID = do.Object_ID 
   and do.Diagram_ID = #DIAGRAMID# 
   and o.Object_Type = 'Activity'

有效 - 例如,我可以在模板片段中插入自定义字段 {ActivityName}。

不过,我还想查询链接到每个 activity 的对象的 标记值... 为此,我有另一个基于自定义查询的模板片段,如下所示:

select op.Property as LinkedTagName, op.Value as LinkedTagValue
from 
   t_object o1, t_connector c, t_object o2, t_objectproperties op
where
   o1.Object_ID = #OBJECTID#
   and o1.Object_ID = c.Start_Object_ID
   and c.End_Object_ID = o2.Object_ID
   and o2.Object_ID = op.Object_ID

直接使用,第二个模板片段也可以正常工作,我可以构建一个 table 引用 {TagName} 和 {TagValue}

但是,我不知道如何让两者一起工作,所以第二个模板片段嵌套在第一个模板片段中,这样对于每个图表元素,我还可以显示链接的标记值。

可能 'inner' 自定义查询没有收到 #OBJECTID#? 我试过了 a.o。 return OBJECTID 作为 'outer' 自定义查询中的字段,但这没有任何区别。

是否可以通过自定义查询嵌套模板片段...?

问题是您的片段应该用在图表下方的元素部分,但 EA 不允许这样做

package >
Package Name: {Pkg.Name}
diagram >
Diagram name: {Diagram.Name}
element >
The fragment should be added here but EA doesn't allow that
< element
< diagram
< package

我猜你随后将它添加到了 diagram> 部分,但这不会起作用,因为它没有可用的 #OBJECTID#

可能的解决方案

  1. 在片段中使用 #DIAGRAMID# 并为图表中的所有元素及其标记值创建一个大 table 您可以使用

    等查询

    select o.[Name] AS Owner, tv.[Property] as TV_Name, tv.[VALUE] AS TV_Value, tv.[Notes] as TV_Notes from (((t_object o inner join t_diagramObjects dob on dob.[Object_ID] = o.[Object_ID]) inner join t_diagram d on dob.[Diagram_ID] = d.[Diagram_ID]) left join t_objectproperties tv on tv.[Object_ID] = o.[Object_ID]) where d.[Diagram_ID] = #DIAGRAMID#

然后将 SQL 片段添加到模板的图表部分

package >
Package Name: {Pkg.Name}
diagram >
Diagram name: {Diagram.Name}
{My SQL Template Fragment}
< diagram
< package
  1. 使用虚拟文档,您可以在其中为模板的图表部分添加一个模型文档,并为模板的元素部分添加一个模型文档。在这种情况下,您可以使用 SQL 搜索来定义片段应报告的元素。使用类似:

    select o.[ea_guid] AS CLASSGUID, o.[Object_Type] AS CLASSTYPE, o.[Name] as Name from ((t_object o inner join t_diagramObjects dob on dob.[Object_ID] = o.[Object_ID]) inner join t_diagram d on dob.[Diagram_ID] = d.[Diagram_ID]) where d.[ea_guid] = '<Search Term>'

将搜索的名称放入标记值 SearchName 并将图表的 GUID(在项目浏览器中右键单击图表并选择 Copy/Paste..|Copy Node GUID to clipboard)放入标记值 SearchValue

然后制作一个普通模板并使用类似

的东西
package >
element >
Element Name: {Element.Name}
tagged value >
Tagged Value Name: {ElementTagVal.Name} 
Tagged Value Value: {ElementTagVal.Value}
Tagged Value Notes: {ElementTagVal.Notes}
< tagged value
< element
< package