AllFusion ERwin Data Modeler API - это проще, чем кажетсяЗайцев С.Л.
Обновленный программный интерфейс приложения (API) продукта AllFusion ERwin Data Modeler (ранее: ERwin) (версии 4.0 SP2 или более поздней) намного проще в использовании по сравнению со своим предшественником. В этой статье даются некоторые основные советы о начале работы с данным API, которые можно рассматривать как введение в "Справочное руководство API". Перед чтением данной статьи следует убедиться в том, что установлены все компоненты, необходимые для использования AllFusion ERwin Data Modeler API. Устанавливая AllFusion ERwin Data Modeler версии 4.0 SP2 или более поздней, нужно выставить флажок для установки утилиты ERwin Spy Utility и ERwin API Sample Client. Эти компоненты устанавливаются в подкаталог "\Samples" основного каталога установки. Более простая и согласованная модель объектов делает AllFusion ERwin Data Modeler API версии 4 проще в эксплуатации, чем ERwin версии 3.5. Ниже перечислены некоторые улучшения. Парные объекты (таблицы, столбцы и индексы) удалены, остались только категории, атрибуты и ключевые группы. Это только несколько основных отличий между API версий 3.5 и 4. Однако код для версии 3.5 может быть беспрепятственно перенесен в версию 4. Такой переход к новому API выполняется очень несложно и код, получающийся в версии 4, будет проще. Основная структура API версии 4 столь же проста и однородна, как и в версии 3.5.
Одним из сходств API версий 4 и 3.5 является то, что оба они основаны на модели компонентных объектов Microsoft (COM) и фактически являются COM-серверами. Это означает, что любые инструменты, совместимые с COM, могут быть использованы для разработок с использованием API. Например, можно применять такие инструменты как Visual Basic, Visual C++, Delphi и другие. В примерах данной статьи используется VB, чтобы сделать представление материала более простым и понятным. Перед началом работ с AllFusion ERwin Data Modeler API, используя VB, необходимо добавить в текущем проекте ссылку на файл SCAPI.dll, который является COM-сервером динамически подсоединяемых библиотек (DLL). Как и в API версии 3.5, можно использовать версию 4 для разработки дополнительных функций. Дополнительные функции активируются с помощью опции Add-In в меню Tools программы AllFusion ERwin DM и могут быть использованы для работы с моделями, открытыми в программе. API можно также использовать для разработки автономных программ, работающих с моделями, которые открывают сами программы. Фактически нет ограничений для расширений и интеграции, которые можно разрабатывать с помощью ERwin API. Модель объектов в API версии 4В этой статье будут обсуждаться три уровня API версии 4:
Уровень приложений содержит четыре объекта, с которыми будет вестись работа:
Объект приложения является точкой входа - необходимо задать хотя бы один объект данного типа. Для уровня приложения нужно использовать следующий код: Постоянным модулем является либо модель ERwin DM, либо предметная область модели ERwin DM. Таким образом, коллекция постоянных модулей представляет уже открытые модели и используется либо для выбора открытой модели, либо для задания новой модели посредством добавления нового объект в коллекцию. Для того чтобы добавить новый объект в коллекцию можно использовать следующий код: 'Открытие новой модели через добавление объекта в коллекцию постоянных модулей Однако если попытаться добавить объект к уже открытой модели, то возникнет ошибка "модель уже открыта в памяти". Для проверки того, открыта модель или нет, можно использовать следующую функцию: Эта функция помимо того, что показывает, насколько легко проводить итерацию по всей коллекции, также реализует нужную операцию. Имя открытой модели содержит только имя файла, а не весь путь к нему. Это является некоторой проблемой, так как имя модели не уникально. Поэтому нужно использовать свойство Locator, которое задается префиксами "erwin://" или "mmart://" перед полным именем. Сама модель имеет свойство "file name", которое в принципе можно было бы использовать, но оно требует открытия модели. Поэтому использование локатора более эффективно. После задания постоянного объекта необходимо начать сессию, в которой нужно открыть модель для работы с ней. Уровень сессии содержит объект Session и коллекцию Sessions. Для уровня сессии можно использовать следующий код: Если метод Open был выполнен успешно, то практически можно начинать работать с моделью. (Параметр SCD_SL_MO указывает уровень модели. M1 определяет уровень метамодели для доступа к данным метамодели. Для манипулирования моделями всегда используется параметр M0). Чтобы работать с моделью дальше, нужно инициировать транзакцию. Это очень важный шаг. Если транзакция не будет начата, то при первой же попытке обновить любое из свойств возникнет ошибка. Активизация транзакции не будет успешной, если сессия закрыта или недействительна. Так же нужно следить за тем, чтобы идентификатор транзакции возвращался методом Open. Для безопасного и простого обращения с транзакциями лучше использовать следующие функции (здесь также используются некоторые особенности VB): Следует помнить о том, что целостность модели после обновлений поверяется во время фиксации изменений. Например, если создается взаимосвязь между родительской и дочерней сущностями, не указав тип, который является обязательным свойством, то во время фиксации возникнет ошибка, сообщающая о том, что задание типа является обязательным, и создание взаимосвязи будет отклонено. Производительность может пострадать, если будет слишком много обновлений не прошедших фиксацию. Тест на портативном компьютере с частотой процессора 500 МГц и ОЗУ 512 МВ показал, что проведение фиксации после 100-200 обновлений является оптимальным. Наличие 5000 и более обновлений без фиксации может существенно увеличить время прогона программы, в некоторых случаях вплоть до 5-10 раз. Оптимальный выбор проведения фиксации может зависеть от конкретного приложения. Теперь обратимся к уровню модели, который содержит активные объекты. Ниже перечислены объекты, принадлежащие уровню модели.
Доступ к объекту осуществляется с помощью коллекции объектов модели, возвращаемой методом ModelObjects уровня модели, или через коллекцию подмножеств, которую создает программный код, использующий метод Collect. Например, доступ к предметной области можно получить следующим образом: Метод ModelObjects возвращает коллекцию объектов модели целиком, тогда как ModelObjects.Root дает только родительские или контекстные объекты из всей коллекции. Для того чтобы создать новую предметную область, нужно просто добавить новый объект к данной коллекции: Добавление нового атрибута к сущности в точности соответствует той же парадигме. Следующие функции осуществляют это совместно: Эта функция облегчает использование API. В функции CreateAttribute новый атрибут сущности создается простым добавлением его в коллекцию атрибутов данной сущности. Доступ к элементам коллекции объектов осуществляется следующим образом: Можно заметить, что присвоение значений выполняется для элементов коллекции свойств (например "A.properties.item(NameProperty)"), а не напрямую через "A.Name". Кроме того, присвоение значений свойствам всегда происходит в массивах (например, A.Properties.Item(NameProperty).Value(0) = Name). Это получается из-за того, что все значения свойств потенциально многозначны. Легко проверить, является ли свойство многозначным: Если значение не является скаляром, то назначение осуществляется нулевому элементу, как было показано выше. Если оно - скаляр, то число элементов можно получить с помощью свойства Count. Например, следующая функция обращает значение массива в коллекцию: Для доступа к свойствам используется метод HasProperty: Другая ценная возможность API версии 4 - метод FormatAsString. Рассмотрим следующий пример: в качестве альтернативы коду: В этом случае, в результате будут возвращены идентификаторы объектов источников данных. Тогда, для получения объекта нужно использовать следующую функцию: Однако если используется метод FormatAsString, API дает нужную интерпретацию даже тогда, когда значение типа "строка" и значения свойств разделены запятой. В конечном итоге, важно помнить о том, что утилита ERwin SPY снабжена интерфейсом API для того, чтобы облегчить исследование того, как в точности назначены свойства, какие свойства существуют и какие являются обязательными. Эта утилита очень полезна при работе с API. Для получения более подробной информации рекомендуется обратиться к "Справочному руководству API" (ERwinAPI.pdf), которое находится в подкаталоге "\docs" основного каталога установки. |