0

DXL OLE メカニズムを使用して、 Enterprise Architect 12からダイアグラムの変更時間を取得するにはどうすればよいですか?

詳細:

EA からダイアグラムを取得し、それらを OLE オブジェクトとしてIBM Rational DOORS 9.5に統合したいと考えています。これはすでに機能しています。この操作が本当に必要かどうかを判断するために、ダイアグラムを取得する前に、EA ダイアグラムと DOORS オブジェクトの変更日を比較するつもりです。

問題は、EA がダイアグラム属性EA.Diagram.ModifiedDateを提供し、ダイアグラムの変更日をデータ型Variantとして返すことです。これを DXL 内で処理するにはどうすればよいですか? の結果パラメーターoleGet() は、タイプの 1 つにすることができますstring|int|bool|char|OleAutoObj。構造化された型はありません (おそらくDxlObject)。string パラメーターにも int パラメーターにも、呼び出し後に有用なデータは含まれません。null 値だけです。

テストコード:

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' );

したがって、ModifiedDateは ole オブジェクトであり、DateTimeメソッドがあります。これは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 に答える