Извлечение типа данных "Вариант" из Enterprise Architect с использованием DXL

Как я могу использовать механизм 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 (коммерческая, доступная для платящих клиентов) не смогла помочь и предложила направить этот вопрос в службу поддержки (за дополнительные $). Скорее разочаровывает.

2 ответа

Решение

Попробуйте это (просто угадайте:-)

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: Оказывается, что SQLQuery EA глючит и возвращает только дату. Поскольку 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 является оле-объектом и имеет Date и Time метод. Это должно работать и с DXL.

Редактировать 2: Теперь вот ульти-ультимативная работа по доставке даже через скалы океана жуков EA:

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

Это отформатирует дату как строку времени. Работает для EAP (он же Mickeysoft Access) согласно этой странице. Другие СУБД, вероятно, имеют аналогичные функции.

Обновление с несколькими исправлениями моих высказываний в комментариях.

Я был неправ. Действительно возможно получить структурированные типы данных, используя интерфейс автоматизации OLE. Как сказал Томас, 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"

Таким образом, действительно возможно выполнить SQL-запрос, даже если хранилище находится в простом *.eap-файле, см. Обходной путь Томаса.

Как уже упоминалось, Variant тип данных не может быть получен с помощью oleGet() так как этот подход возвращает нулевой результат.

Другие вопросы по тегам