使用DXL从Enterprise Architect检索“Variant”数据类型

时间:2015-09-04 11:16:17

标签: ole enterprise-architect jet variant ibm-doors

如何使用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)。相当令人失望。

2 个答案:

答案 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,并且有DateTime方法。 也应该与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结果。