Извлечение типа данных "Вариант" из 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()
так как этот подход возвращает нулевой результат.