0

如何使用 DXL OLE 机制从Enterprise Architect 12获取图表的修改时间?

细节:

我想从 EA 检索图表并将它们作为 OLE 对象集成到IBM Rational DOORS 9.5中。这已经在起作用了。我打算在检索图表之前比较 EA 图表和 DOORS 对象的修改日期,以确定是否真的需要此操作。

问题是,EA 提供了一个图表属性EA.Diagram.ModifiedDate,它将图表的修改日期作为数据类型Variant返回。我如何在 DXL 中处理这个问题?的结果参数oleGet() 可以是其中一种类型string|int|bool|char|OleAutoObj。没有结构化类型(可能是DxlObject)。string 和 int 参数在调用后都不包含任何有用的数据——只是空值。

测试代码:

OleAutoObj  eaRepository, eaProject, eaDiagram
OleAutoObj  eaApp    = oleGetAutoObject("EA.App")
OleAutoArgs autoArgs = create
string      guid     = "{729F140F-9DA4-4ff6-A9B2-75622AD1C22D}"

// connect to an existing EA instance
oleGet (eaApp, "Repository", eaRepository)
oleMethod (eaRepository, "GetProjectInterface", autoArgs, eaProject)

// call EA to a diagram which has this GUID
put(autoArgs, guid)
oleMethod(eaRepository, "GetDiagramByGuid", autoArgs, eaDiagram)
delete autoArgs

// access diagram attributes
string eaModifiedDate // DXL accepts [string|int|bool|char|OleAutoObj] only
oleGet(eaDiagram, "ModifiedDate", eaModifiedDate)
print "ModifiedDate = '" eaModifiedDate"'\n"

IBM 的支持团队(商业,可用于付费客户)无法提供帮助,并建议将此问题转发给服务团队(额外收费)。比较失望。

4

2 回答 2

1

试试这个(只是猜测:-)

OleAutoObj eaModifiedDate
oleGet(diagram, "ModifiedDate", eaModifiedDate)
if (null eaModifiedDate)
    print "no eaModifiedDate\n"
else {
    string diaDate
    oleGet(eaModifiedDate, "Value", diaDate)
    print "ModifiedDate = '" diaDate"'\n"
}

如果这不起作用,那么这里是最终的解决方法:

string err
string result

put(autoArgs, "SELECT ModifiedDate FROM t_diagram WHERE ea_guid = '"  guid  "'")
err = oleMethod (eaRepository, "SQLQuery", autoArgs, result)
if (!null err)
    print "ERROR: " err "\n"
delete autoArgs

print "result= '" result"'\n"

这将返回一个 XML 格式的字符串 (!),其中包含您喜欢的格式的日期。

编辑 1:原来 EA 的 SQLQuery 有问题,只返回日期。由于 Perl 以类似的方式处理 OLE 变体,我发现了这个代码片段:

my $dia = $rep->getdiagrambyguid("{63EFF3FA-0D5C-4986-AC0A-C723D2F755E3}");
my $value = $dia->ModifiedDate->Value;
print $value->Date( 'yyyy/MM/dd' );
print $value->Time( 'hh:mm:ss' );

所以 theModifiedDate是一个 ole-object 并且有一个Date和一个Time方法。这适用于 DXL。

编辑 2:现在这是最终的工作,甚至可以在 EA 的虫子海洋的悬崖上运输:

my $dia = $rep->SQLQuery("SELECT Format (ModifiedDate, \"Short Time\") AS T FROM t_diagram");

这会将日期格式化为时间字符串。根据此页面适用于 EAP(又名 Mickeysoft Access) 。其他 RDBMS 可能具有类似的功能。

于 2015-09-09T07:59:24.067 回答
0

更新,对我在评论中的陈述进行了一些更正。

我错了。确实可以使用 OLE 自动化接口接收结构化数据类型正如 Thomas 所提到的,这OleAutoObject是正确的 DXL 返回类型,oleGet()是正确的函数。要访问返回对象的属性,需要了解“真实”数据类型并查看SDK 文档以了解哪些类属性可用,因为 DXL 不了解数据类型。

但是,在 DXL 中,检索结构化数据类型的属性有点麻烦。示例(旨在附加到初始帖子的代码中):

OleAutoObj  diaLinksCollection
int         count    = -1
string      buffer   = ""

// access simple diagram attributes
err = oleGet(eaDiagram, "Version", buffer)      
if (!null err) print "ERROR in Diagram.Version: " err "\n"
print "diagram version = " buffer "\n"

// access structured diagram attribute
err = oleGet(eaDiagram, "DiagramLinks", diaLinksCollection)
if (!null err) print "ERROR in Diagram.DiagramLinks: " err "\n"

err = oleGet(diaLinksCollection, "Count", count)
if (!null err) print "ERROR in Collection.Count: " err "\n"

print "count = " count "\n"

因此,即使存储库位于普通的 *.eap 文件中,也确实可以执行 SQL 查询,请参阅 Thomas 的解决方法。

如前所述,由于此方法返回 NULL 结果,因此Variant无法检索数据类型。oleGet()

于 2015-09-15T13:01:30.667 回答