如何使用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
)。字符串和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的支持团队(商业化,可供付费客户使用)无法帮助并建议将此问题转发给服务团队(额外的$ s)。相当令人失望。
答案 0 :(得分: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' );
因此ModifiedDate
是一个ole-object,并且有Date
和Time
方法。 也应该与DXL一起使用。
编辑2 :现在,即使是在EA的小虫海洋悬崖周围运送,也可以进行最终的工作:
my $dia = $rep->SQLQuery("SELECT Format (ModifiedDate, \"Short Time\") AS T FROM t_diagram");
这会将日期格式化为时间字符串。根据{{3}}为EAP(又名Mickeysoft Access)工作。其他RDBMS可能具有类似的功能。
答案 1 :(得分:0)
在评论中对我的陈述进行一些更正的更新。
我错了。 确实可以使用OLE自动化接口接收结构化数据类型。正如Thomas所说,OleAutoObject
是正确的DXL返回类型,oleGet()
是正确的函数。要访问返回对象的属性,需要了解" real"数据类型并查看SDK documentation以了解哪些类属性可用,因为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"
因此,确实可以执行SQL查询,即使存储库位于普通* .eap文件中,请参阅Thomas'解决方法。
如上所述,无法使用Variant
检索 oleGet()
数据类型,因为此方法会返回NULL结果。