2014-11-10 2 views
3

Как добавить триггер в область «Свойства-Ограничения-Триггеры» перехода конечного автомата в Enterprise Architect? Кавычки - это то, как вы попадаете туда вручную в EA.Добавить Trigger to Transition

Что я Пробовал

Ниже, это на самом деле приводит к триггеру добавляемого к государственной машине, но мне нужно, чтобы связать его с определенным переходом. Переменная stateMachine имеет тип EA.Element.

EA.Element trigger = (EA.Element)stateMachine.Elements.AddNew("trigger", "Trigger"); 

Государственный имеет тип EA.Element. Коннектор имеет тип EA.Connector (конкретный переход StateFlow, к которому я пытаюсь добавить триггер). Все они, похоже, ничего не делают. Фактически, Ограничения кажется пустой коллекцией, даже после того, как я добавляю новые элементы.

state.Constraints.AddNew("trigger", "Trigger"); 
connector.Constraints.AddNew("trigger", "Trigger"); 
state.StateTransitions.AddNew("trigger", "Trigger"); 

Я проскочил через советник EA и не повезло. Функция поиска не так хороша, хотя, возможно, я что-то пропустил.

Интересная информация (Может быть к чему-то)

MiscData для Connector типа, кажется, государство потока вызвать информацию. Согласно очень надежной книге (спасибо г-ну Килиану), PDATA1 из MiscData, по-видимому, является именем триггера State Flow. Но как добавить новый триггер? MiscData только для чтения.

ответ

3

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

Сначала вам нужно выяснить, где именно EA хранит эту информацию. Проще всего понять это - начать с пустой модели, создать только те элементы, которые вам нужны (конечный автомат, два состояния, переход и триггер) и создать ссылку с помощью GUI EA.

Затем проверьте базу данных. Поскольку у вас есть только эти несколько элементов, должно быть довольно легко найти, где EA хранит отношения.

Если бы я должен был догадаться, я бы сказал, что он, вероятно, будет храниться в таблице t_xref, или где-нибудь в столбце style или styleEx (или в столбце Pdata, как вы указали сами). Затем вам нужно будет добавить эту информацию непосредственно в базу данных с помощью SQL-запроса или запроса на вставку и недокументированной операции Repository.Execute. Вы можете найти пример такой вещи на github:

 /// <summary> 
     /// copy the workingset tot the given user 
     /// </summary> 
     /// <param name="user">the user to copy the working set to</param> 
     /// <param name="overwrite">if true then the first workingset found with the same name 
     /// for the given user will be overwritten</param> 
     public void copyToUser(User user, bool overwrite) 
     { 
      if (overwrite) 
      { 
       //check if a workingset with the same name already exists 
       WorkingSet workingSetToOverwrite = this.model.workingSets.Find(w => 
                    w.user != null 
                    && w.user.login == user.login 
                    && w.name == this.name); 
       if (workingSetToOverwrite != null) 
       { 
        workingSetToOverwrite.delete(); 
       } 
      } 
      string insertQuery = @"insert into t_document (DocID,DocName, Notes, Style,ElementID, ElementType,StrContent,BinContent,DocType,Author,DocDate) 
           select '"+Guid.NewGuid().ToString("B")[email protected]"',d.DocName, d.Notes, d.Style, 
           d.ElementID, d.ElementType,d.StrContent,d.BinContent,d.DocType,'" + user.fullName + @"',d.DocDate from t_document d 
           where d.DocID like '"+this.ID+"'"; 
      this.model.executeSQL(insertQuery); 

     } 
+0

Если у меня есть мой репозиторий (EA.Repository), то, что я должен сделать, чтобы использовать ExecuteSQL()? EA.Repository не имеет определения для executeSQL – Avantol13

+1

@ Avantol13 Repository.Execute (строка SQL). Как уже упоминалось, это не документировано, поэтому ваш intellisense не покажет его как вариант. model.executeSQL - моя оболочка. –

+0

Используйте Repository.SQLquery («SELECT ...»), который возвращает XML и Repository.Execute («UPDATE/DELETE ...»), который ничего не возвращает.В обоих случаях появляется сообщение EA, если есть некоторая ошибка SQL. –