Как создать триггер и назначить шаблон триггера с помощью PowerDesigner VBScript?

Я использую PowerDesigner v16 и создал файл Extension; в этом Extension добавлен MetaClass типа Таблица; в этом MetaClass был создан обработчик событий с использованием VBScript для просмотра всех таблиц и создания некоторых полей/столбцов (атрибутов) по умолчанию во всех таблицах.

Но теперь я хочу воспользоваться тем, что я просматриваю все таблицы, а также VBScript, чтобы создать стандартную Trigger, которая находится в TriggerTemplate, и я не знаю, как это сделать через VBScript.

Мой главный вопрос: как создать Trigger с помощью VBScript и назначить TriggerTemplate?

Можете ли вы привести пример?

Возможно сопутствующий вопрос:

Примечание. Эта функция выполняется в PowerDesigner Extencion с использованием моделирования PDM. А путь этого расширения такой: DEFAULT COLUMNS::Profile\Table\Event Handlers\Initialize


'******************************************************************************
' Função para checar se a coluna já existe na tabela.
'******************************************************************************
function ColumnExists(tab, name)
   'output "ClassName: " + tab.ClassName
   
   'Checa se a o objeto passano no parâmetro "tab" é do tipo Table (tabela)
   if tab.ClassName = "Table" then
      dim col
      'Passa por todas as colunas da tabela
      for each col in tab.Columns
         'Checa se o nome da coluna atual já existe igual ao passado por parâmetro ("name")
         if col.Name = name then
            'output "... já existe " + col.Name
            ColumnExists = true
            exit function
         end if
      next 
   end if
   ColumnExists = false
end function

'******************************************************************************
' Função responsável por criar as colunas padrao de uma tabela.
'******************************************************************************
Sub DoCreateColumns(tab)
   
   ' Checa se o objeto passado no parâmetro ("tab") é do tipo "Table"
   if not tab.ClassName = "Table" then exit sub
   dim c
   dim myColumns, column

 
   ' Executa função "DefaultColumns()" serve para criar um array com todas as colunas padrão
   myColumns = DefaultColumns()
   
   'Passa por todas as colunas salvas'
   for each column in myColumns
       
       'Checa se esta coluna é um ID
       if column.Name = "ID_" then
            ' Adiciona o nome da tabela junto com a palavra ID
            column.Name = "ID_" + tab.Name
            column.Code = column.Name
       end if
       
       'Checa se a coluna ja existe
       if not ColumnExists(tab, column.Name) then
           set c = tab.Columns.CreateNewAt(column.Position) 
           c.Name = column.Name
           c.Code = column.Code
           c.domain = column.Domain
           c.Mandatory = column.Mandatory
           output "... adding column " + column.Name + " table " + tab.Name
       end if
   next
    
End Sub



person Bruno Nogueira Silva    schedule 30.06.2020    source источник


Ответы (1)


Я создал SAP SQL Anywhere 17 PDM с одной таблицей, сохранил ее как файл .pdm; затем добавил триггер на основе шаблона в этой таблице и сохранил модель в виде нового файла .pdm. Сравнивая файлы, я получаю некоторые намеки на представление триггеров + шаблонов.

Тем более, что шаблон триггера прилагается к триггеру. Через ярлык, т.к. шаблон в СУБД, а триггер в модели.

<o:Table Id="o9">
    <a:Name>Table_1</a:Name>
    <a:Code>TABLE_1</a:Code>
    <c:Triggers>
        <o:Trigger Id="o10">
            <a:Name>Trigger_1</a:Name>
            <a:Code>TRIGGER_1</a:Code>
            <c:BaseTrigger.TriggerItems>
                <o:Shortcut Ref="o5"/>
                <o:Shortcut Ref="o6"/>
            </c:BaseTrigger.TriggerItems>
            <c:TriggerTemplate>             <===
                <o:Shortcut Ref="o4"/>      <===
            </c:TriggerTemplate>
        </o:Trigger>
    </c:Triggers>

Глядя на файл справки SAP PowerDesigner 16 OLE Help, я вижу TriggerTemplate как свойство класса BaseTrigger, производным от которого является Trigger.

Вот пример, который использует это.

option explicit
' create model
dim mdl : set mdl = CreateModel(PDPdm.cls_PdmModel, "|DBMS=SAP SQL Anywhere 17")
' create table and trigger
dim tbl : set tbl = mdl.CreateObject(PDPdm.cls_Table)
dim trig : set trig = tbl.CreateObject(PDPdm.cls_Trigger)
' set trigger template
SetTemplate trig, "BeforeUpdateTrigger"

function SetTemplate(trg, typ)
   SetTemplate = false
   ' find template
   dim db : set db = trg.Model.DBMS
   ' in case of shared DBMS instead of embedded one
   if db.IsShortcut() then set db = db.TargetObject
   dim tm, found
   for each tm in db.TriggerTemplates
      if tm.name = typ then
         set found = tm
         exit for
      end if
   next
   if IsEmpty(found) then exit function
   ' create shortcut alongside the table
   dim fld : set fld = trg.Parent.Folder
   dim short : set short = found.CreateShortcut(fld)
   ' assign, and initialize
   set trg.TriggerTemplate = short
   trg.InitFromTemplate
   SetTemplate = true
end function
person pascal    schedule 30.06.2020
comment
Я не мог понять пример. Вы можете детализировать пример или даже добавить изображения. Пожалуйста. - person Bruno Nogueira Silva; 07.07.2020
comment
Я добавил пример. - person pascal; 07.07.2020