2015-09-04 46 views
0

如何使用DXL OLE機制從Enterprise Architect 12獲取圖表的修改時間?使用DXL從Enterprise Architect檢索「Variant」數據類型

詳情:

我想從EA檢索圖,並將它們作爲OLE對象集成到IBM Rational DOORS中9.5。這已經在工作。我打算在檢索圖表前比較EA圖表和DOORS對象的修改日期,以確定是否真的需要此操作。

問題是,EA提供了圖屬性EA.Diagram.ModifiedDate,它將圖的修改日期返回爲數據類型變體。我如何在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的支持團隊(商業,供付費用戶)不能幫助,並建議對這個問題轉發到服務團隊(額外的$ S)。相當令人失望。

+0

我在Perl中使用它,在那裏我必須使用'variant-> value'來獲取內容。 –

+0

我猜想OleAutoObj應該有一個'value'屬性。 –

回答

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對象,具有DateTime方法。這應該也與DXL一起使用。

編輯2:現在,這裏的大招,最終工作甚至繞繞EA的bug大海的懸崖航運:

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

這將格式化日期時間字符串。根據this page適用於EAP(又名Mickeysoft Access)。其他RDBMS可能具有相似的功能。

+0

問題解決了!使用ulti-ultimate解決方法有所幫助。使用格式(ModifiedDate,\「dd/mm/yyyy hh:mm:ss \」)'可以幫助DXL在轉換爲Date類型時解析日期和時間字符串。從XML結果字符串中提取日期和時間,使用'Regexp fetchDate = regexp2「(。*)<\\/t>」; if(fetchDate result)result = result [match 1];刪除fetchDate;'。非常感謝! – Twonky

0

更新時在評論中對我的陳述有一些更正。

我錯了。它實際上是可能使用OLE自動化接口接收結構化數據類型。正如Thomas提到的,OleAutoObject是正確的DXL返回類型,oleGet()是正確的功能。要訪問返回對象的屬性,需要知道「真實」數據類型,並查看SDK documentation以便知道哪些類屬性可用,因爲DXL不知道數據類型。

但是,在DXL中,檢索結構化數據類型的屬性有點麻煩。示例(旨在附加到inital後的代碼):

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文件,看到托馬斯的解決方法。

如上所述,Variant數據類型無法使用oleGet()檢索,因爲此方法返回NULL結果。

相關問題