百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

PowerDesigner如何巧用脚本支持开发?

bigegpt 2024-08-31 16:42 3 浏览

很多做数据模型开发的小伙伴应该都对PowerDesigner不陌生,这款软件可算是模型开发界长盛不衰的开发工具了。软件功能非常强大的,支持了当先各种主流或非主流数据库的可视化模型开发,而且还能实现逆向工程数据库的表,尤其为做数据仓库小伙伴们实现在线运维提供了强大的平台。

好了前面一段话说完了,下面就说下干货,给大家分享一下如何巧用VB的脚本来辅助我们实现快速的模型设计和调整。

模型设计一般几个基础操作包括模型创建、字段的设计和调整,我举例说下传统的方式是如何的如下图

步骤一、创建数据表

步骤二、创建字段,所有字段均是手动填写

步骤三、调整字段,红格部分是修改的内容。

通过以上三个步骤,可利用可视化的方式创建表和字段信息,但是我们创建模型不仅仅是一个而是几十个或者上百个,而且调整字段也需要基于上百个模型进行调整,所以我们需要借助脚本的方式来实现,会大大增加我们的工作效率。

首先打开脚本页面,如图1,2


第一步,我们如果需要创建大批量的数据表,需要EXCEL来帮助我们一起来实现。

我们可以通过EXCEL先编辑好我们想创建好的表,然后编辑VB脚本创建我们想要的数据表,脚本1


脚本执行后,快速生成了三张数据表,(参考脚本请在文章后面寻找)


以下两个图中,需要对两个表进行调整。如果一两张表手动调整就好,但是如果表非常多一个个调整需要时间成本非常大。所以建议利用脚本实现批量修改

以上两个图中,需要对两个表进行调整。如果一两张表手动调整就好,但是如果表非常多一个个调整需要时间成本非常大。所以建议利用脚本实现批量修改

输入脚本2,让所有表的name列等于所有的COMMENT列(参考脚本请在文章后面寻找)


点击"run"运行,则将所表的name列等于所有的COMMENT列。(参考脚本请在文章后面寻找)


输入脚本3,为所有表增加同样的采集时间字段。(参考脚本请在文章后面寻找)


以上就是PowerDesigner利用脚本开发模型几个基本案例,脚本功能还是非常强大的,利用脚本我们可以把一些设计上重复工作让程序来做,大大提升了我们模型设计工作效率,把更多时间放在模型设计上。

注释:脚本原型均来自网上,作者在原型的基础上进行调整。

运行脚本1代码:

Option Explicit

Dim mdl ' the current model

Set mdl = ActiveModel

If (mdl Is Nothing) Then

MsgBox "There is no Active Model"

End If

Dim HaveExcel

Dim RQ

RQ = vbYes 'MsgBox("Is Excel Installed on your machine ?", vbYesNo + vbInformation, "Confirmation")

If RQ = vbYes Then

HaveExcel = True

' Open & Create Excel Document

Dim x1 '

Set x1 = CreateObject("Excel.Application")

x1.Workbooks.Open "….. \MXSJ.XLSX" '选择你需要读取的EXCEL文件

x1.Workbooks(1).Worksheets("Sheet1").Activate

Else

HaveExcel = False

End If

a x1, mdl

sub a(x1,mdl)

dim rwIndex

dim tableName

dim colname

dim table

dim col

dim count

'on error Resume Next

For rwIndex = 1 To 1000 step 1

With x1.Workbooks(1).Worksheets("Sheet1")

'MsgBox "生成数据表结构共计1 ="+CStr(.Cells(2,2).Value ), vbOK + vbInformation, "表"

If .Cells(rwIndex, 1).Value = "" Then

Exit For

End If

If .Cells(rwIndex, 4).Value = "" Then

set table = mdl.Tables.CreateNew

table.Name = .Cells(rwIndex , 1).Value '表名

table.Code = .Cells(rwIndex , 2).Value '表CODE

table.Comment = .Cells(rwIndex , 3).Value' 表注释

count = count + 1

Else

colName = .Cells(rwIndex, 1).Value

set col = table.Columns.CreateNew

'MsgBox .Cells(rwIndex, 1).Value, vbOK + vbInformation, "列"

'MsgBox col.Name, vbOK + vbInformation, "列"

col.Code = .Cells(rwIndex, 1).Value '字段CODE

col.Name = .Cells(rwIndex, 2).Value '字段NAME

col.Comment = .Cells(rwIndex,3).Value '字段注释

col.DataType = .Cells(rwIndex, 4).Value '字段类型

End If

End With

Next

MsgBox "生成数据表结构共计" + CStr(count), vbOK + vbInformation, "表"

Exit Sub

End sub

--------------------------------------------------------

脚本2代码:

Option Explicit

ValidationMode = True

InteractiveMode = im_Batch

Dim mdl ' the current model

' get the current active model

Set mdl = ActiveModel

If (mdl Is Nothing) Then

MsgBox "There is no current Model "

ElseIf Not mdl.IsKindOf(PdPDM.cls_Model) Then

MsgBox "The current model is not an Physical Data model. "

Else

ProcessFolder mdl

End If

' This routine copy name into comment for each table, each column and each view

' of the current folder

Private sub ProcessFolder(folder)

Dim Tab 'running table

for each Tab in folder.tables

if not tab.isShortcut then

tab.comment = tab.name

Dim col ' running column

for each col in tab.columns

col.comment= col.name

next

end if

next


Dim view 'running view

for each view in folder.Views

if not view.isShortcut then

view.comment = view.name

end if

next


' go into the sub-packages

Dim f ' running folder

For Each f In folder.Packages

if not f.IsShortcut then

ProcessFolder f

end if

Next

end sub

脚本3代码:

Option Explicit

ValidationMode = True

InteractiveMode = im_Batch


'ceaate by runnerrunning


' get the current active model

Dim mdl ' the current model

Set mdl = ActiveModel

If (mdl Is Nothing) Then

MsgBox "There is no Active Model"

Else

ListObjects(mdl)

End If

'-----------------------------------------------------------------------------

Private Sub ListObjects(fldr) '列出所有的对象

output "Scanning " & fldr.code

Dim obj ' running object

For Each obj In fldr.children

' Calling sub procedure to print out information on the object

TableSetComment obj

Next


' go into the sub-packages

Dim f ' running folder

For Each f In fldr.Packages '递归调用列出所有的对象

'calling sub procedure to scan children package

ListObjects f

Next

End Sub


Private Sub TableSetComment(CurrentObject)

if not CurrentObject.Iskindof(cls_Table) then exit sub

'output "Found "+CurrentObject.ClassName+" """+CurrentObject.Name+""", Created by "+CurrentObject.Creator+" On "+Cstr(CurrentObject.CreationDate)

'output "Found "+CurrentObject.ClassName+" ; "+CurrentObject.Name

if not CurrentObject.isShortcut then

'CurrentObject.Comment = CurrentObject.name &vbCrLf& CurrentObject.Comment

Dim col ' running column

Dim num

Dim cjtime

cjtime=10

if cjtime then

CurrentObject.columns.CreateNewAt(num)


for each col in CurrentObject.columns

'修改新加的那个字段的属性

'if left(col.Name,6)="Column" then

'col.Name="采集时间"

'col.Code="CJ_TIME"

'col.Comment="采集时间"

'col.DataType="DATE"

'end if

next

num=num+1

end if

end if

End Sub

相关推荐

Java 泛型大揭秘:类型参数、通配符与最佳实践

引言在编程世界中,代码的可重用性和可维护性是至关重要的。为了实现这些目标,Java5引入了一种名为泛型(Generics)的强大功能。本文将详细介绍Java泛型的概念、优势和局限性,以及如何在...

K8s 的标签与选择器:流畅运维的秘诀

在Kubernetes的世界里,**标签(Label)和选择器(Selector)**并不是最炫酷的技术,但却是贯穿整个集群管理与运维流程的核心机制。正是它们让复杂的资源调度、查询、自动化运维变得...

哈希Hash算法:原理、应用(哈希算法 知乎)

原作者:Linux教程,原文地址:「链接」什么是哈希算法?哈希算法(HashAlgorithm),又称为散列算法或杂凑算法,是一种将任意长度的数据输入转换为固定长度输出值的数学函数。其输出结果通常被...

C#学习:基于LLM的简历评估程序(c# 简历)

前言在pocketflow的例子中看到了一个基于LLM的简历评估程序的例子,感觉还挺好玩的,为了练习一下C#,我最近使用C#重写了一个。准备不同的简历:image-20250528183949844查...

55顺位,砍41+14+3!季后赛也成得分王,难道他也是一名球星?

雷霆队最不可思议的新星:一个55号秀的疯狂逆袭!你是不是也觉得NBA最底层的55号秀,就只能当饮水机管理员?今年的55号秀阿龙·威金斯恐怕要打破你的认知了!常规赛阶段,这位二轮秀就像开了窍的天才,直接...

5分钟读懂C#字典对象(c# 字典获取值)

什么是字典对象在C#中,使用Dictionary类来管理由键值对组成的集合,这类集合被称为字典。字典最大的特点就是能够根据键来快速查找集合中的值,其键的定义不能重复,具有唯一性,相当于数组索引值,字典...

c#窗体传值(c# 跨窗体传递数据)

在WinForm编程中我们经常需要进行俩个窗体间的传值。下面我给出了两种方法,来实现传值一、在输入数据的界面中定义一个属性,供接受数据的窗体使用1、子窗体usingSystem;usingSyst...

C#入门篇章—委托(c#委托的理解)

C#委托1.委托的定义和使用委托的作用:如果要把方法作为函数来进行传递的话,就要用到委托。委托是一个类型,这个类型可以赋值一个方法的引用。C#的委托通过delegate关键字来声明。声明委托的...

C#.NET in、out、ref详解(c#.net framework)

简介在C#中,in、ref和out是用于修改方法参数传递方式的关键字,它们决定了参数是按值传递还是按引用传递,以及参数是否必须在传递前初始化。基本语义对比修饰符传递方式可读写性必须初始化调用...

C#广义表(广义表headtail)

在C#中,广义表(GeneralizedList)是一种特殊的数据结构,它是线性表的推广。广义表可以包含单个元素(称为原子),也可以包含另一个广义表(称为子表)。以下是一个简单的C#广义表示例代...

「C#.NET 拾遗补漏」04:你必须知道的反射

阅读本文大概需要3分钟。通常,反射用于动态获取对象的类型、属性和方法等信息。今天带你玩转反射,来汇总一下反射的各种常见操作,捡漏看看有没有你不知道的。获取类型的成员Type类的GetMembe...

C#启动外部程序的问题(c#怎么启动)

IT&OT的深度融合是智能制造的基石。本公众号将聚焦于PLC编程与上位机开发。除理论知识外,也会结合我们团队在开发过程中遇到的具体问题介绍一些项目经验。在使用C#开发上位机时,有时会需要启动外部的一些...

全网最狠C#面试拷问:这20道题没答出来,别说你懂.NET!

在竞争激烈的C#开发岗位求职过程中,面试是必经的一道关卡。而一场高质量的面试,不仅能筛选出真正掌握C#和.NET技术精髓的人才,也能让求职者对自身技术水平有更清晰的认知。今天,就为大家精心准备了20道...

C#匿名方法(c#匿名方法与匿名类)

C#中的匿名方法是一种没有名称只有主体的方法,它提供了一种传递代码块作为委托参数的技术。以下是关于C#匿名方法的一些重要特点和用法:特点省略参数列表:使用匿名方法可省略参数列表,这意味着匿名方法...

C# Windows窗体(.Net Framework)知识总结

Windows窗体可大致分为Form窗体和MDI窗体,Form窗体没什么好细说的,知识点总结都在思维导图里面了,下文将围绕MDI窗体来讲述。MDI(MultipleDocumentInterfac...