【问题标题】:How to create a Trigger and assign a TriggerTemplate using PowerDesigner VBScript?如何使用 PowerDesigner VBScript 创建触发器并分配 TriggerTemplate?
【发布时间】:2020-06-30 02:44:19
【问题描述】:

我正在使用 PowerDesigner v16,我创建了一个Extension;在这个 Extension 中添加了 Table 类型的 MetaClass;在这个MetaClass 中,使用 VBScript 创建了一个事件处理程序,以遍历所有表并在所有表中默认创建一些字段/列(属性)。

但现在我想利用这一点,我正在遍历所有表格以及 VBScript,以创建一个位于 TriggerTemplate 中的标准 Trigger,但我不知道该怎么做通过 VBScript。

我的主要问题是:如何使用VBScript 创建Trigger 并分配TriggerTemplate

你能举个例子吗?

可能相关的问题:

注意:此功能使用 PDM 建模在 PowerDesigner Extencion 中执行。而这个扩展的路径如下: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


【问题讨论】:

    标签: vbscript powerdesigner


    【解决方案1】:

    我用一个表创建了一个 SAP SQL Anywhere 17 PDM,将其保存为 .pdm 文件;然后在此表上添加基于模板的触发器,并将模型保存为新的 .pdm 文件。通过比较文件,我得到了一些关于触发器+模板表示的提示。

    特别是触发器模板附加到触发器。通过快捷方式,因为模板在 DBMS 中,而触发器在模型中。

    <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
    

    【讨论】:

    • 我无法理解这个例子。您可以详细说明示例,甚至可以添加图像。请。
    • 我添加了一个例子。
    猜你喜欢
    • 2010-10-30
    • 2010-10-24
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    • 2020-09-04
    • 2016-03-06
    • 2010-10-08
    • 1970-01-01
    相关资源
    最近更新 更多