Блог

    Основные аспекты внедрения информационно-аналитических систем на основе хранилищ данных от лица руководителя проектами.

Последние записи


Теги

Информация

Практикум управления требованиями. Пример 2. Сопряжение с физической моделью данных.

добавлено: 13 окт 17
понравилось:0
просмотров: 488
комментов: 1

теги:

Автор: Дмитрий Зиновьев

При работе с требованиями в PowerDesigner, помимо простого сокращения ручных операций за счет автоматического заполнения некоторых атрибутов требований (см. Пример 1), жизнь аналитика можно облегчить за счет улучшения эргономики инструмента. В качестве примера таких доработок инструмента может послужить ситуация, когда требования необходимо увязать со структурами данных в физической модели.

Сложность для аналитика заключается в необходимости многократного поиска необходимых таблиц и полей для каждого требования. Отчасти проблему можно было бы решить, используя матричное представление для связей (dependency matrix view), но даже для средних по объему моделей, где количество таблиц составляет десятки – работа с матрицей становиться практически невозможной, поскольку такой объем информации не вмещается ни в один дисплей.

В  такой ситуации возникает соблазн отказаться от case-средства и продолжить работу в Excel, просто копируя названия таблиц и полей. Если такие меппинги нужны только для одного проекта и не будут использованы в дальнейшем, возможно, так и следует поступить. Однако если проект ведется с моделями и требованиями, которые являются частью систематического развития информационных средств, сведения о взаимосвязях все же необходимо сохранять в соответствующих инструментах для дальнейшего использования.

Разумным выходом из ситуации будет предоставление аналитику сходного с Excel по простоте интерфейса для ввода целевых структур в меппинге через стандартные средства PowerDesigner. Для этого необходимо использовать форму для ввода текстовой информации с дальнейшим поиском соответствия в названиях или кодах структур в физических моделях данных, которые расположены в рамках проекта.

Поскольку диалоговая форма должна отображаться по инициативе пользователя, создадим в настройках модели метод для всех объектов типа Requirement и назовем его «Add trace from tree». В самом коде метода, прежде всего, необходимо убедиться в том, что модель, в которой расположено требование, принадлежит к какому-либо проекту (иначе будет непонятно, где искать физические модели данных). Для этого следует обратиться к свойству SourceModelDocument в ссылке на объекте Model, который есть у любого объекта класса Requirement. Указанное свойство содержит ссылку на проект, если модель является частью открытого проекта или содержит пустоту, если модель вне какого-либо проекта.

После того, как мы убедились, что модель открыта в рамках проекта, следует вызвать форму для ввода текста методом InputBox.  Метод возвращает строку введенную пользователем или пустую строку, если пользователь отменил ввод.

После того, как достигнуты необходимые вводные условия, нам получить найти все физические модели данных в проекте для дальнейшего поиска соответствия в таблицах и их колонках. Для этого необходимо создать коллекцию класса Selection (это делается через метод CreateSelection в объекте класса Project) и заполнить ее ссылками на физические модели в проекте. Ссылки на эти модели можно получить из коллекции ModelDocuments в проекте, при этом стоит открыть те модели, которые еще не были открыты в проекте. Таким образом, блок по первичной подготовке имеет следующий вид:



   ' Проверяем находится ли модель в проекте

   if not (actMod.Model.SourceModelDocument is nothing)  then     

     set project =  actMod.Model.SourceModelDocument.Parent   

     ' Запрашиваем название колонки/таблицы для создания связи

      pattern = InputBox("Введите название колонки/таблицы")

      if (not pattern = "") then

         set project =  actMod.Model.SourceModelDocument.Parent 

         set targetPDMS = project.CreateSelection

         ' Просматриваем все модели в проекте

         for each models in project.ModelDocuments

           if models.isKindOf(cls_ModelDocument) then ' проверяем что это ссылка на модель

              if (models.TargetModelObject is nothing) then ' проверяем что модель открыта

                  set oModel = OpenModel(models.Location, omf_DontOpenView Or omf_Hidden)

              else

                  set oModel = models.TargetModelObject

              end if 'конец проверки что модель открыта

              'Если модель – ФМД, добавляем в свою коллекцию

              if  oModel.IsKindOf(cls_PdmModel) then

                  targetPDMS.Objects.Add(oModel)

              end if 'конец поиска искомой модели

           end if 'конец проверки на модель

          next 'конец поиска моделей в проекте

      end if 'конец проверки на ввод паттерна

    end if 'конец проверки на модель в проекте



После того, как мы нашли все физические модели в проекте можно переходить к добавлению соответствующих критериям таблиц и полей в форму для окончательного выбора.  Для диалоговой формы необходимо создать еще одну коллекцию класса Selection, в которой мы сохраним объекты для заполнения формы.

Для поиска подходящих таблиц и их колонок следует просмотреть объекты в коллекции Children каждой найденной ранее физической модели данных. Поскольку таблицы могут быть расположены не только в корневом каталоге модели, но и в пакетах (Package) создадим функцию, которая рекурсивно обработает все дочерние элементы.



function scanElements(selection, subObj, pattern)

   dim child, istrue

   istrue = false

   if subobj.IsKindOf(cls_Table) then

      if Instr(subobj.Name, pattern) > 0 then

            selection.Objects.Add(subObj)

            istrue = true

      end if

      for each child in subObj.Columns

         if Instr(child.Name, pattern) > 0 then

            selection.Objects.Add(child)

            istrue = true

         end if

      next

      if istrue then

         selection.objects.Add(subObj)

      end if

   else

      for each child in subObj.Children

            if scanElements(((selection)), ((child)), pattern) then

               selection.Objects.Add(child)

               istrue = true

            end if

      next

   end if

   scanElements = istrue

end function 



В вызове данной функции можно увидеть последствия не совсем удачного решения с передачей параметров в Visual Basic, в результате которого появляется достаточно странный на вид код с двойными скобками для передаваемых параметров.

После того, как все таблицы и поля, названия которых соответствуют введенному тексту, найдены, можно отображать диалоговую форму для выбора объекта, с которым будет установлена связь. Это делается вызовом метода ShowObjectPicker.

Когда пользователь выбрал таблицу или колонку, с которыми необходимо установить связь мы должны создать объект связи  класса ExtendedDependencу. При этом следует не забывать, что связи с объектами в других моделях в PowerDesigner реализованы посредством объектов ссылки (Shortcut), поэтому при создании связи проверить наличие такой ссылки и при необходимости создать ее.



               for each existingShortcuts in actMod.LinkShortcuts 'ищем выбранный объект в ссылках

                  if existingShortcuts.TargetObject = selected then                                                                            

                     existingShortcuts.TargetObject.Name

                     scExist = true

                     set newSc = existingShortcuts

                  end if

               next 'конец поиска объекта в ссылках

               if scExist = false then 'cоздаем новую ссылку

                  set newSc = selected.CreateShortcut(actMod)

               end if

               isTraceExist = false

               for each traces in obj.ExtendedDependencies 'проверяем существует ли связь в исходном объекте

                  if traces.InfluentObject = newSc then

                     isTraceExist = true

                  end if

               next 'конец проверки на существование связи

               if not isTraceExist then 'создаем связь, если такой не было

                  Set newTrace = actMod.CreateObject(cls_ExtendedDependency)

                  Set newTrace.InfluentObject = newSc

                  Set newTrace.DependentObject = obj

                  msgBox(("Связь успешно добавлена")), ((64)), "Результат"

               end if




Таким образом, наш метод в завершенном варианте имеет вид:


Sub %Method%(obj)

   ' Implement your method on <obj> here

  

   dim filename, actMod, selected, selection, object, project, models, targetPDM, targetPDMS, oModel, pattern, existingShortcuts, scExist, newSc, traces, isTraceExist, newTrace, exModel

   set actMod = obj.Model

     

   set targetPDM = nothing  

  

   if not actMod.Model.SourceModelDocument is nothing  then       ' проверяем находится ли модель в проекте  

  

      pattern = InputBox("Введите название колонки/таблицы")' Спрашиваем название колонки/таблицы для создания связи

      if not pattern = "" then

         set project =  actMod.Model.SourceModelDocument.Parent 

         set targetPDMS = project.CreateSelection

         for each models in project.ModelDocuments ' просматриваем все модели в проекте

           if models.isKindOf(cls_ModelDocument) then ' проверяем что это ссылка на модель

              if models.TargetModelObject is nothing then ' проверяем что модель открыта

                  set oModel = OpenModel(models.Location, omf_DontOpenView Or omf_Hidden)

              else

                  set oModel = models.TargetModelObject

              end if 'конец проверки что модель открыта

          

              if  oModel.IsKindOf(cls_PdmModel) then 'ищем искомую фмд

                  targetPDMS.Objects.Add(oModel)

              end if 'конец поиска искомой модели

           end if 'конец проверки на модель

          next 'конец поиска моделей в проекте

         set selection = project.CreateSelection 'создаем выборку для диалога

         if targetPDMS.Objects.Count > 0 then 'проверяем что фмд найдены

        

            for each targetPDM in targetPDMS.Objects 'цикл по найденным фмд  

  

               for each object in targetPDM.Children 'просматриваем все объекты в фмд

                  if (Instr(object.Name, pattern) > 0) and (object.IsKindOf(cls_Table)) then 'если таблица и ее имя соответствует паттерну добавляем в выборку для диалога

                     selection.objects.Add(object)

                  end if

                  if scanElements(((selection)), ((object)), pattern) then 'если не таблица, то ищем по всем дочерним объектам если в дочерних таблицах есть соответствие паттерну - добавляем верхний уровень в выборку

                     selection.objects.Add(object)

                  end if

               next 'конец поиска в фмд

              

             next 'конец цикла по найденным фдм

             set selected = nothing 

             set  selected =  selection.ShowObjectPicker ("","","",true,false) 'запускаем диалог для выбора объекта

            

             set newSc = nothing

             if not selected is nothing then 'проверяем, что в диалоге был выбран объект

             scExist = false

               for each existingShortcuts in actMod.LinkShortcuts 'ищем выбранный объект в ссылках

                  if existingShortcuts.TargetObject = selected then

                     existingShortcuts.TargetObject.Name

                     scExist = true

                     set newSc = existingShortcuts

                  end if

               next 'конец поиска объекта в ссылках

               if scExist = false then 'cоздаем новую ссылку

                  set newSc = selected.CreateShortcut(actMod)

               end if

               isTraceExist = false

               for each traces in obj.ExtendedDependencies 'проверяем существует ли связь в исходном объекте

                  if traces.InfluentObject = newSc then

                     isTraceExist = true

                  end if

               next 'конец проверки на существование связи

               if not isTraceExist then 'создаем связь если такой не было

                  Set newTrace = actMod.CreateObject(cls_ExtendedDependency)

                  Set newTrace.InfluentObject = newSc

                  Set newTrace.DependentObject = obj

                  msgBox(("Связь успешно добавлена")), ((64)), "Результат"

               end if ' конец проверки на несуществующую связь

            end if ' конец проверки на выбор объекта в диалоге

         end if 'конец проверки на фмд

      end if 'конец проверки на ввод паттерна

    end if 'конец проверки на модель в проекте

End Sub

function scanElements(selection, subObj, pattern)

   dim child, istrue

  

   istrue = false

  

   if subobj.IsKindOf(cls_Table) then

      if Instr(subobj.Name, pattern) > 0 then

            selection.Objects.Add(subobj)

            istrue = true

      end if

      for each child in subobj.Columns

         if Instr(child.Name, pattern) > 0 then

            selection.Objects.Add(child)

            istrue = true

         end if

      next

      if istrue then

         selection.objects.Add(subobj)

      end if

   else

      for each child in subobj.Children

            if scanElements(((selection)), ((child)), pattern) then

               selection.Objects.Add(child)

               istrue = true

            end if

      next

   end if

   scanElements = istrue

end function 



Поскольку данный метод должен применяться при работе со связями требований, внесем небольшие изменения в форме требования. Для этого необходимо в настройках модели (Local Extensions) добавить новый элемент типа Form. Что бы изменить закладку со связями необходимо в типе формы выбрать замену соответствующего элемента (Replace Traceability Links Tab). При этом в поле Form появится состав закладки из базовой конфигурации, который состоит только из одного элемента – собственно коллекции связей Outgoing Traceability Links. Добавим в форму разделитель и кнопку вызова нашего метода.

Теперь, когда мы зайдем в форму любого требования на закладку Traceability Links, на ней будет дополнительная кнопка, которая по нажатию сначала отобразит форму для ввода текста, а затем форму для выбора соответствующих по названию таблиц и полей.

Комментарии




Необходимо войти на сайт, чтобы оставлять комментарии