使用PowerDesigner生成数据库测试数据

合集下载

PowerDesigner设置集锦

PowerDesigner设置集锦

在使用PowerDesigner的过程中,经常遇到一些设置上面的问题,每次都去找老鸟帮忙解决,隔一段时间不用,下一次又忘掉了,不好意思再去麻烦他们了,所以现在用博客园记录下来,以后上园子来找以前的东西.1取消Name和Code关联的设置在设计PDM文件的时候,设计一张表,在填写栏位的时候,如果我们输入Name,Code 会跟着变化.这个完全是西方人的习惯,因为他们的Name和Code都是E文,所以不会出现什么问题.但是,我们使用的时候,就会很不习惯,Name应该是中文名字,Code才是资料库的实际字段名.下面记录修改设置的步骤:Step 1:菜单栏找到Tools,点开,找到General Options,点击Step 2:打开Dialog将Operating modes中的 Name To Code mirroring將前面的勾去掉OK!完成sql语句中表名与字段名前的引号去除:打开cdm的情况下,进入Tools-Model Options-Naming Convention,把Name和Code的标签的Charcter case选项设置成Uppercase或者Lowercase,只要不是Mixed Case就行!或者选择Database->Edit current database->Script->Sql->Format,有一项CaseSensitivityUsingQuote,它的comment为“Determines if the case sensitivity for identifiers is managed using double quotes”,表示是否适用双引号来规定标识符的大小写,可以看到右边的values默认值为“YES”,改为“No”即可!或者在打开pdm的情况下,进入Tools-Model Options-Naming Convention,把Name和Code的标签的Charcter case选项设置成Uppercase就可以!在修改name的时候,code的值将跟着变动,很不方便修改方法:PowerDesign中的选项菜单里修改,在[Tool]-->[General Options]->[Dialog]->[Operating modes]->[Name to Code mirroring],这里默认是让名称和代码同步,将前面的复选框去掉就行了。

powerdesigner 教程

powerdesigner 教程

powerdesigner 教程PowerDesigner 是一款数据库建模工具,它可以帮助用户设计和管理数据库结构。

下面是一个简单的教程,介绍了如何使用PowerDesigner。

1. 安装 PowerDesigner:首先,下载并安装 PowerDesigner 软件。

安装完成后,启动该软件。

2. 创建新模型:在 PowerDesigner 的主界面中,选择“文件”>“新建”>“模型”。

然后,选择合适的数据模型类型(如关系型数据库、面向对象数据库等),并为模型命名。

3. 创建数据表:在左侧的模型树中,找到刚创建的模型,右键单击它,并选择“新建”>“数据表”。

然后,输入数据表的名称和其他属性,如列名、数据类型等。

重复此步骤以添加更多的数据表。

4. 定义关系:在数据表上右键单击,并选择“新建”>“关联”。

然后,选择关联的两个数据表,并定义它们之间的关系类型(如一对一、一对多等)。

5. 设计实体属性:在数据表上右键单击,并选择“新建”>“列”。

然后,输入列的名称和其他属性,如数据类型、长度、默认值等。

重复此步骤以添加更多的列。

6. 设计主键和外键:在数据表上右键单击,并选择“新建”>“主键”或“外键”。

然后,选择相关的列,并定义主键或外键的属性。

7. 生成物理模型:在 PowerDesigner 的菜单栏中,选择“工具”>“逆向工程”>“生成物理模型”。

然后,选择想要生成的数据库类型,如 MySQL、Oracle 等。

8. 导出脚本:在生成的物理模型中,选择“文件”>“导出”>“生成脚本”。

然后,选择脚本语言和导出的路径,并点击“导出”按钮。

9. 完成:至此,你已成功设计和生成数据库结构。

根据需要,你可以进一步修改数据模型、增加数据表或进行其他操作。

希望这个简单的教程能帮助你快速上手 PowerDesigner。

请根据实际需要,在不同的步骤中进行相应的操作。

PowerDesigner 生成数据字典

PowerDesigner 生成数据字典

PowerDesigner 生成数据字典打开PowerDesigner 打开一个数据模型CDM 或PDM选择Report → Reports点击New Report 新建一个报告输入报告名,选择中文,标准报告这时显示出来的左边是可使用的项目,右边是报告中已经包含的项目,若是只要数据字典,可以只保留Title-Tables在网上搜到了一个简单的数据字典模板项目如下:+ Title-Tables+--+ Table-表格%ITEM%+--+--- Table Card-表格%ITEM%的卡片+--+--- Table Description-表格%ITEM%的说明+--+--- Table Check Constraint Name-表格%ITEM%的约束名称+--+--- List of all Dependencies-表格%PARENT%的依赖清单+--+--- List of Table Columns-表格%PARENT%的列清单+--+--+ Table Column-表格%PARENT%的列%ITEM%+--+--+--- Table Columns Card-表格%PARENT%的列%ITEM%的卡片+--+--+--- Table Columns Description-表格%PARENT%的列%ITEM%的说明+--+--+--- Table Columns Check Constraint Name-表格%PARENT%的列%ITEM%的约束名称+--+--+--- List of all Dependencies-列%PARENT%的依赖清单+--+--- List of Table Keys-表格%PARENT%的键清单+--+--+ Table Key-表格%PARENT%的键的%ITEM%+--+--+--- Table Key Card-表格%PARENT%的键%ITEM%的卡片+--+--+--- Table Key Description-表格%PARENT%的键%ITEM%的说明+--+--+--- List of Columns of Table Key-键%PARENT%的列清单+--+--+--- List of all Dependen在这里编辑好报告的格式后,选择Report → Generate HTML 或Generate RTF 生成报告即可。

使用PowerDesigner设计数据库

使用PowerDesigner设计数据库

数据库设计练习练习一、学习使用PowerDesigner设计数据库前一个小时:按要求完成以下数据设计。

1.打开PowerDesigner2.界面如下。

3.新建一个文件。

4.选择新建一个概念模型,这个很重要,不要选错了。

5.点击确定后出现的界面如下。

6.工具箱中我们常用的工具有实体和关系,我们用这两个就可以啦。

7.接下来我们将为一个学生管理系统建立模型,首先,单击上图的实体,在工作区中建立两个实体,建立完成后,点击鼠标右健。

如图。

8.更改名称,另外一个实体改成班级,TB_CLASS9.为学生实体设置属性10,接下图所示为班级表建立属性11.实体已经建立完毕,下面设置实体之间的关系。

单击工具箱中的“关系”,在两个实体之间点击拖动。

建立两个实体之间的关系,结果如下。

12.双击关系后,按下图修改关系属性。

13.修改文件名,如图14.保存此文件15.将概念模型转换成物理模型。

如图16.选择数据库17.查看生成后的物理模型,查看一下,这个物理模型与概念模型有什么不同,在学生实体中是不是增加了一个“班级编号”的属性。

想一想这个属性有什么作用。

18.在物理模型下,准备生成数据库脚本文件。

如图19.修改选项后,生成脚本文件。

20.如果没有问题,查看脚本文件。

后一个小时:在这个概念模型中增加一个学生成绩实体,存储学生的学习成绩。

并生成脚本文件。

作业:1.为自动提款机设计一个概念模型,提示:用户通过银行卡来取款,存款,而取款,存款的信息需要记录下来。

2.做一个进销存系统概念模型(进货、销售和库存)。

PowerDesigner设计数据库使用规范

PowerDesigner设计数据库使用规范

PowerDesigner设计数据库使用规范PowerDesigner设计数据库使用步骤及规范使用PowerDesigner可以方便地对管理信息系统进行分析设计,它几乎包括了数据库模型设计的全过程。

它可以制作多种数据模型,也能对团队设计模型进行控制。

还可以与许多流行的软件开发工具,例如PowerBuilder、Delphi、VB等相配合使系统设计更优化并缩短开发时间。

并不是每个设计都需要用到PD,对于比较大型的项目,它是很好的,对于短平快类型的项目,例如时间要求一周左右的系统,没有必要使用,直接维护数据库即可,对于表的数量超过10个的系统,建议使用PD进行设计和交流。

1.创建概念数据模型(CDM)1.1创建CDM步骤选择文件建立新模型,弹出如图所示对话框,选择ConceptualDataModel 模型(即概念数据模型),单击OK,即确认创建。

双击资源浏览窗口中新创建的CDM 名称图标,打开CDM 模型属性窗口,进行相关属性信息设置。

如下图:1.2对象命名通用规范以下三种规范属于基本规范,适用于本文所有数据库对象命名规范。

1、长度规范:凡是需要命名的对象其标识符均不能超过3个英文单词长度(30个字符),也即:Oracle中的表名、字段名,函数名,过程名,触发器名,序列名,视图名的长度均不能超过3个英文单词长度(30个字符);2、构成规范:数据库各种名称必须以字母开头,但严禁使用SYS 开头;名称只能含有字母,数字和下划线“_”三类字符,“_”用于间隔名称中的各语义字段;不要使用DUAL作表名;3、大小写规范:构成Oracle数据库中的各种名称(表明,字段名,过程名,视图名等等)的所有字符,必须使用大写,也就是不能在脚本中,对任何名称添加双引号“”来设定字符的大小写形式,只要不采用“”限制,Oracle自动会将各名称转化成大写。

2.进行ER设计的准备工作2.1实体命名不相同检查PowerDesigner默认不能存在相同名称的实体属性,这也是考虑到可能产生的一些如主键外键等名称冲突问题,但当进行实际数据库设计时,可能会多次使用相同数据项(DataItem)便于理解各实体。

powerdesigner数据库设计

powerdesigner数据库设计

powerdesigner数据库设计
(1)创建物理数据模型
打开PowerDesigner,然后点击File-->New Model然后选择如下图所⽰的物理数据模型(物理数据模型的名字⾃⼰起,然后选择⾃⼰所使⽤的数据库即可)
(创建好主页⾯如图所⽰,但是右边的按钮和概念模型略有差别,物理模型最常⽤的三个是table(表),view(视图),reference(关系));
(⿏标先点击右边table这个按钮然后在新建的物理模型点⼀下,即可新建⼀个表,然后双击新建如下图所⽰,在General的name和code填上⾃⼰需要的,点击应⽤即可),如下图:
(然后点击Columns,如下图设置,灰常简单,需要注意的就是P(primary主键) , F (foreign key外键) , M(mandatory强制性的,代表不可为空)这三个,多看⼏遍理解其意思。


(在此设置学号的⾃增(MYSQL⾥⾯的⾃增是这个AUTO_INCREMENT),班级编号同理,不作多啰嗦!)
(在下⾯的这个点上对号即可,就设置好了⾃增)
(全部完成后如下图所⽰。


(2)⽣成sql⽂件,依次点击database>generate database,出现如下界⾯,选择⽬录和⽂件名,点击确定。

注意:创建表时必须带有主键,否则保存SQL不成功。

(3)导⼊外部SQL⽂件
mysql> source c:/test/crebas.sql;
此时mysql数据库中已经创建好了相应的表。

实验12 数据库设计之PowerDesign使用

实验12 数据库设计之PowerDesign使用

实验十二数据库设计之PowerDesigner Data Model【实验目的与要求】1. 熟悉PowerDesigner的操作环境与使用者接口,并学习设定PowerDesigner的操作环境与相关设定;2. 熟练掌握概念数据模型(CDM)的创建;3. 掌握如何使用PowerDesigner完成整个数据库工程的初步技能.【实验内容与步骤】12.1.PowerDesigner 环境熟悉启动PowerDesigner,选择“File/New”命令,在弹出的对话框中选择Conceptual Data Model(概念数据模型),单击“确定”按钮,进入概念模型设计界面。

概念设计阶段是通过调查、分析和整理数据,确定实体、属性及它们之间的联系。

概念数据模型是对实体和实体间的关系的定义(即数据库的逻辑模型),是独立于数据库和数据库管理系统的。

单击面板中的实体,然后在画布上分别单击,创建若干个实体。

创建实体后,单击面板上的光标图标,设置实体的属性。

双击刚才创建的实体,如“Entity_3”,弹出“实体属性”对话框。

在“General(常规)”选项卡中,修改实体的名称为“Student”;单击“Attributes(属性)”标签,设置实体的属性,输入“StudentID”、“StudentNo”、“StudentName”、“Sex”、“Grade”、“Discourse”、“Class”、“Remark”等属性,见下图。

输入属性后,要设置属性的数据类型以及主关键字。

设置属性的方法是对每个属性单击其Data Type单元格,在弹出的“标准数据类型”对话框中进行配置。

例如,设置“StudentID”属性为Variable Character类型,长度为6位,见下图。

设置完毕后,单击“确定”按钮回到“实体属性”对话框的“属性”选项卡中。

设置主关键字的方法是,向右拖动最下边的滚动条,能看到M、P、D三个带有复选框的列。

使用PowerDesigner+VBA脚本自动生成数据库详细设计文档

使用PowerDesigner+VBA脚本自动生成数据库详细设计文档

使⽤PowerDesigner+VBA脚本⾃动⽣成数据库详细设计⽂档1、需求描述数据库详细设计⽂档是软件项⽬众多交付⽂档中⾮常重要的⼀份⽂档,在代码开发后期,数据库表结构已稳定,为了保证数据库表结构与数据库详细设计⽂档信息保持⼀致,往往需要投⼊很⼤的⼈⼒和时间去维护,且还存在⼈为操作偏差。

这时候,⼀款可以随时能同步数据库表结构与数据库详细设计⽂档的⼯具,显得⾮常重要。

2、⼯具概述⾸先使⽤PowerDesigner(简称“PD”)反向⼯程构建⼀份pdm⽂档,然后使⽤PD中内置的VBA脚本编辑器,⾃定义VBA脚本,导出数据表结构成excel⽂档3、版本要求PowerDesigner16.5、jdk74、操作步骤在PD的安装⽬录中,⾃定义脚本startup.batset JAVA_HOME=D:\software\Java\jdk1.7.0_79set CLASSPATH=D:\Sybase\PowerDesigner 16\ojdbc6.jarpdshell16.exe在VB Scripts⽬录中新建extends⽬录,存放⾃定义脚本Export2Excel.vbaOption ExplicitDim savePath,curdate,tabList,codeList,colCodeList,codeStyle,codeGroup,titleColorcurdate = DatesavePath = "数据库表结构-"&curdate&"-V1.0.xlsx"tabList = "tablist.txt"codeList = "codelist.xlsx"colCodeList = "colcodelist.xlsx"codeStyle = "s01"'s01,s02codeGroup = False'码值sheet是否分组titleColor = "15"Output savePath'-----------------------------------------------------------------------------' Main function'-----------------------------------------------------------------------------' Get the current active modelDim ModelSet Model = ActiveModelIf (Model Is Nothing) Or (Not Model.IsKindOf(PdPDM.cls_Model)) ThenMsgBox"The current model is not an PDM model."Else' Get the tables collection' 创建EXCEL APPDim EXCEL, BOOK, sheetList,vcntvcnt = 0Dim varray (1000) '表清单Dim carray (1000) '字段-码值映射Dim rarray (500) '字段-码值映射索引范围Dim larray (1000) '码值-单元格位置映射Set EXCEL = CreateObject("Excel.Application")EXCEL.Visible = TrueSet BOOK = EXCEL.Workbooks.Add(-4167) '新建⼯作簿BOOK.Sheets.Add , BOOK.Sheets(BOOK.Sheets.count) '添加sheetBOOK.Sheets(1).Name = "码表"BOOK.Sheets.Add , BOOK.Sheets(BOOK.Sheets.count) '添加sheetBOOK.Sheets(2).name ="⽬录"'添加⽬录sheet页Set sheetList = BOOK.sheets("⽬录") '⽬录sheet对象'读取表清单ReadCsvFile'读取字段-代码映射ReadTabCodeFile'⽣成码表sheet页ReadCodeFile'初始化⽬录Sheet标题InitsheetListHeader Model,sheetList'输出数据库表元信息ShowProperties Model,sheetList'显⽰⽹格线EXCEL.ActiveWindow.DisplayGridlines = True'BOOK.SaveAs savePath'EXCEL.Quit'Set BOOK = Nothing'Set EXCEL = NothingEnd If'-----------------------------------------------------------------------------' Init Sheet List Header'-----------------------------------------------------------------------------Sub InitsheetListHeader(mdl, sheetList)Dim rowsNorowsNo=1output "初始化⽬录Sheet标题..."'设置标题内容sheetList.cells(1, 1) = "序号"sheetList.cells(1, 2) = "表名"sheetList.cells(1, 3) = "备注"'设置标题列宽sheetList.Columns(3).ColumnWidth = 20'sheetList.Columns(1).WrapText =true'设置边框sheetList.Range(sheetList.Cells(1, 1),sheetList.Cells(1, 3)).Borders.LineStyle = "1"'设置背景颜⾊sheetList.Range(sheetList.Cells(1, 1),sheetList.Cells(1, 3)).Interior.ColorIndex = titleColor sheetList.Columns("A:B").EntireColumn.AutoFit '列宽⾃适应sheetList.ActivateEXCEL.ActiveWindow.SplitRow = 1EXCEL.ActiveWindow.SplitColumn = 0EXCEL.ActiveWindow.FreezePanes = Trueoutput "初始化⽬录Sheet标题完毕!"End Sub'-----------------------------------------------------------------------------' Show properties of tables'-----------------------------------------------------------------------------Sub ShowProperties(mdl, sheetList)Dim tabIndextabIndex = 2Output "输出表结构元信息..."Dim tab,bln,i,j,cntbln = Falsej = 0cnt = 10For i = LBound(varray) To UBound(varray) '表清单If varray(i) = ""Thenj = j + 1bln = FalseElsebln = Falsej = 0For Each tab In mdl.tablesIf varray(i) = Thenbln = TrueExit ForEnd IfNextEnd IfIf j > cnt ThenExit ForEnd IfIf bln = True ThenShowTable tab,tabIndex,sheetListtabIndex = tabIndex + 1End IfNextOutput "输出表结构元信息完成!"End Sub'-----------------------------------------------------------------------------' read csv file'-----------------------------------------------------------------------------Sub ReadCsvFile()Dim system, fileSet system = CreateObject("Scripting.FileSystemObject")' Open mode constants...Dim ForReading, ForWriting, ForAppendingForReading = 1' Open a file for reading only. You can't write to this file.ForWriting = 2' Open a file for writing.ForAppending = 8' Open a file and write to the end of the file.Output "读取⽂件"&tabList&"..."Set file = system.OpenTextFile(tabList, ForReading)vcnt = 0Do While file.AtEndOfStream <> Truevarray(vcnt) = Trim(file.ReadLine)vcnt = vcnt + 1Loopfile.CloseOutput "共读取⽂件有效⾏数:"&vcntEnd Sub'-----------------------------------------------------------------------------'-----------------------------------------------------------------------------Sub ReadCodeFile()Dim cExcel,cWorkbook,cSheet,ctSheet,startRow,startCol,totalRow,totalCol,i,j,rNum,gNum startRow = 2startCol = 2rNum = 1gNum = 1j=0Output "读取代码配置⽂件"&codeList&"..."Set cExcel = CreateObject("Excel.Application")Set cWorkbook = cExcel.Workbooks.Open(codeList)Set cSheet = cWorkbook.Worksheets(1)totalRow = edRange.Rows.CounttotalCol = edRange.Columns.CountOutput "获取sheet1有效⾏"&totalRow&",有效列"&totalColDim shtn,codeNo,codeName,itemNo,itemName,isInuse,isStandardSet shtn = BOOK.Sheets("码表")codeNo = ""If codeStyle = "s01"Thenshtn.cells(rNum, 1) = "代码编号"'代码编号-标题shtn.cells(rNum, 2) = "代码名称"'代码名称-标题shtn.cells(rNum, 3) = "代码项编号"'代码项编号-标题shtn.cells(rNum, 4) = "代码项名称"'代码项名称-标题shtn.cells(rNum, 5) = "是否使⽤"'是否使⽤-标题shtn.cells(rNum, 6) = "是否落标"'是否落标-标题'设置背景颜⾊shtn.Range(shtn.cells(rNum, 1),shtn.cells(rNum, 6)).Interior.ColorIndex = titleColor '设置字体shtn.Range(shtn.cells(rNum, 1),shtn.cells(rNum, 6)).Font.Bold = TruerNum = rNum + 1For i = startRow To totalRowIf codeNo <> cSheet.Cells(i,startCol) Thenshtn.cells(rNum, 1) = cSheet.Cells(i,startCol) '代码编号-取值shtn.cells(rNum, 2) = cSheet.Cells(i,startCol+1) '代码名称-取值shtn.cells(rNum, 6) = cSheet.Cells(i,startCol+5) '是否落标-取值If codeNo <> ""ThenIf codeGroup Thenshtn.Range("A"&(rNum-gNum)&":A"&(rNum-2)).Rows.GroupEnd Iflarray(j) = shtn.cells(rNum-gNum, 1)&",A"&(rNum-gNum)j = j+1shtn.Range(shtn.cells(rNum-gNum, 1),shtn.cells(rNum-1, 1)).Mergeshtn.Range(shtn.cells(rNum-gNum, 2),shtn.cells(rNum-1, 2)).Mergeshtn.Range(shtn.cells(rNum-gNum, 6),shtn.cells(rNum-1, 6)).Merge End IfcodeNo = cSheet.Cells(i,startCol) '代码编号gNum = 1ElsegNum = gNum + 1End Ifshtn.cells(rNum, 3) = cSheet.Cells(i,startCol+2) '代码项编号-取值shtn.cells(rNum, 4) = cSheet.Cells(i,startCol+3) '代码项名称-取值shtn.cells(rNum, 5) = cSheet.Cells(i,startCol+4) '是否使⽤-取值shtn.Range(shtn.cells(rNum, 1),shtn.cells(rNum, 6)).Borders.LineStyle = "1"rNum = rNum + 1NextIf codeGroup Thenshtn.Range("A"&(rNum-gNum)&":A"&(rNum-2)).Rows.GroupEnd Iflarray(j) = shtn.cells(rNum-gNum, 1)&",A"&(rNum-gNum)j = j+1shtn.Range(shtn.cells(rNum-gNum, 1),shtn.cells(rNum-1, 1)).Mergeshtn.Range(shtn.cells(rNum-gNum, 2),shtn.cells(rNum-1, 2)).Mergeshtn.Range(shtn.cells(rNum-gNum, 6),shtn.cells(rNum-1, 6)).MergeElseIf codeStyle = "s02"ThenFor i = startRow To totalRowIf codeNo <> cSheet.Cells(i,startCol) ThenIf codeNo <> ""and codeGroup Thenshtn.Range("A"&(rNum-gNum-1)&":A"&(rNum-1)).Rows.GroupEnd IfcodeNo = cSheet.Cells(i,startCol) '代码编号shtn.cells(rNum, 1) = "代码编号"'代码编号-标题larray(j) = shtn.cells(rNum, 1)&",A"&rNumj = j+1shtn.cells(rNum, 2) = codeNo '代码编号-取值shtn.cells(rNum, 3) = "代码名称"'代码名称-标题shtn.cells(rNum, 4) = cSheet.Cells(i,startCol+1) '代码名称-取值shtn.cells(rNum, 5) = "是否落标"'是否落标-标题shtn.cells(rNum, 6) = cSheet.Cells(i,startCol+5) '是否落标-取值'设置背景颜⾊'shtn.Range(shtn.cells(rNum, 1),shtn.cells(rNum, 6)).Interior.ColorIndex = "15"'设置字体shtn.cells(rNum, 1).Font.Bold = Trueshtn.cells(rNum, 3).Font.Bold = Trueshtn.cells(rNum, 5).Font.Bold = TruerNum = rNum + 1shtn.cells(rNum, 1) = "代码项编号"'代码项编号-标题shtn.cells(rNum, 2) = "代码项名称"'代码项名称-标题shtn.cells(rNum, 3) = "是否使⽤"'是否使⽤-标题rNum = rNum + 1gNum = 0End Ifshtn.cells(rNum, 1) = cSheet.Cells(i,startCol+2) '代码项编号-取值shtn.cells(rNum, 2) = cSheet.Cells(i,startCol+3) '代码项名称-取值shtn.cells(rNum, 3) = cSheet.Cells(i,startCol+4) '是否使⽤-取值rNum = rNum + 1gNum = gNum + 1Nextshtn.Range("A"&(rNum-gNum-1)&":A"&(rNum-1)).Rows.GroupElseOutput "不⽀持的代码表样式"&codeStyleEnd Ifshtn.Columns("A:F").EntireColumn.AutoFit '列宽⾃适应shtn.Columns(6).ColumnWidth = 10shtn.Columns("A:F").NumberFormatLocal = "@"'单元格内容为⽂本格式shtn.ActivateEXCEL.ActiveWindow.SplitRow = 1EXCEL.ActiveWindow.SplitColumn = 0EXCEL.ActiveWindow.FreezePanes = TruecWorkbook.CloseEnd Sub'-----------------------------------------------------------------------------' read table's column code mapper file'-----------------------------------------------------------------------------Sub ReadTabCodeFile()Dim cExcel,cWorkbook,cSheet,ctSheet,startRow,startCol,totalRow,totalCol,tabName,colName,codeNo,cnt,cnt2,tmp,tmp2,i,j startRow = 2startCol = 2cnt = 0cnt2 = 0tmp = ""Output "读取字段-代码映射配置⽂件"&colCodeList&"..."Set cExcel = CreateObject("Excel.Application")Set cWorkbook = cExcel.Workbooks.Open(colCodeList)Set cSheet = cWorkbook.Worksheets(1)totalRow = edRange.Rows.CounttotalCol = edRange.Columns.CountOutput "获取sheet1有效⾏"&totalRow&",有效列"&totalColFor i = startRow To totalRowtabName = cSheet.Cells(i,startCol) '表名colName = cSheet.Cells(i,startCol+1) '字段名codeNo = cSheet.Cells(i,startCol+2) '代码编号If tmp <> tabName&","&colName Thencarray(cnt) = tabName&","&colName&","&codeNotmp = tabName&","&colNamecnt = cnt + 1Elsecarray(cnt-1) = carray(cnt-1)&","&codeNoEnd IfNextcWorkbook.Closetmp = ""For i = 0To cnt-1tabName = Split(carray(i),",")(0)If tmp <> tabName Thenrarray(cnt2) = tabName&","&i&","&itmp = tabNamecnt2 = cnt2 +1Elsetmp2 = Split(rarray(cnt2-1),",")rarray(cnt2-1) = tmp2(0)&","&tmp2(1)&","&iEnd IfNextEnd Sub'-----------------------------------------------------------------------------' Show table properties'-----------------------------------------------------------------------------Sub ShowTable(tab, tabIndex, sheetList)Dim tabDespIf IsObject(tab) ThenIf ment <> ""ThentabDesp = tab.code + "(" + ment + ")"ElsetabDesp = tab.codeEnd IfOutput "输出"&tabDesp&"..."sheetList.Cells(tabIndex, 1) = tabIndex-1sheetList.Cells(tabIndex, 2) = tabDespBOOK.Sheets.Add , BOOK.Sheets(BOOK.Sheets.count) '添加sheetBOOK.Sheets(tabIndex+1).Name = tab.codeDim shtnSet shtn = BOOK.Sheets(tab.code)'表名标题shtn.Range(shtn.cells(1, 1),shtn.cells(1, 7)).Mergeshtn.Cells(1, 1) = tabDespshtn.Cells(1, 1).Font.Size = 12shtn.Cells(1, 1).Font.Bold = Trueshtn.Cells(1, 1).HorizontalAlignment = 3'设置边框'shtn.Range(shtn.cells(1, 1),shtn.cells(1, 7)).Borders.LineStyle = "1"'返回链接shtn.Cells(1, 8) = "<<⽬录"'设置列标题shtn.cells(2, 1) = "字段中⽂名"shtn.cells(2, 2) = "字段英⽂名"shtn.cells(2, 3) = "字段类型"shtn.cells(2, 4) = "是否主键"shtn.cells(2, 5) = "是否⾮空"shtn.cells(2, 6) = "默认值"shtn.cells(2, 7) = "备注"'设置列宽和换⾏shtn.Columns(1).ColumnWidth = 30shtn.Columns(2).ColumnWidth = 20shtn.Columns(3).ColumnWidth = 20shtn.Columns(4).ColumnWidth = 10shtn.Columns(5).ColumnWidth = 10shtn.Columns(6).ColumnWidth = 10shtn.Columns(7).ColumnWidth = 30shtn.Columns(1).WrapText =trueshtn.Columns(2).WrapText =trueshtn.Columns(3).WrapText =trueshtn.Columns(4).WrapText =trueshtn.Columns(5).WrapText =trueshtn.Columns(6).WrapText =trueshtn.Columns(7).WrapText =true'设置边框shtn.Range(shtn.cells(2, 1),shtn.cells(2, 7)).Borders.LineStyle = "1"'设置背景颜⾊shtn.Range(shtn.cells(2, 1),shtn.cells(2, 7)).Interior.ColorIndex = titleColor '输出字段信息Dim colDim rNum,i,j,cnt,bln,tarray,m,n,k,tmp,codeNo,location,back,left,rightrNum = 1j = 0cnt = 5back = 0left = 0right = 0For i = LBound(rarray) To UBound(rarray)If rarray(i) = ""ThenExit ForEnd Iftmp = Split(rarray(i),",")If tab.code = tmp(0) Thenleft = tmp(1)right = tmp(2)Exit ForEnd IfNextFor Each col in tab.columnsrNum = rNum + 1shtn.cells(rNum+1, 1) = ment '字段中⽂名shtn.cells(rNum+1, 2) = col.code '字段英⽂名shtn.cells(rNum+1, 3) = col.datatype '字段类型If col.Primary = true Thenshtn.cells(rNum+1, 4) = "Y"'是否主键Elseshtn.cells(rNum+1, 4) = ""End IfIf col.Mandatory = true Then'是否⾮空shtn.cells(rNum+1, 5) = "Y"Elseshtn.cells(rNum+1, 5) = ""End Ifshtn.cells(rNum+1, 6) = col.defaultvalue '默认值shtn.cells(rNum+1, 7) = ment '备注For i = left To right'字段-码值映射k = 0tarray = Split(carray(i),",")If UBound(tarray) < 2ThenOutput "字段-代码配置项["&carray(i)&"]格式有误"back = 1Exit ForElseIf col.code = tarray(1) ThenIf UBound(tarray) > 1ThenFor m = 2To UBound(tarray)For n = LBound(larray) To UBound(larray) '码值-单元格位置映射If larray(n) = ""Thenj = j + 1Elsej = 0tmp = Split(larray(n),",")codeNo = tmp(0)location = tmp(1)If tarray(m) = codeNo ThenOutput col.code&":"&codeNoshtn.cells(rNum+1+k, 7) = "关联码值("&codeNo&")"shtn.Hyperlinks.Add shtn.cells(rNum+1+k, 7), "","码表!"&locationOutput shtn.cells(rNum+1+k, 7)&"添加链接码表!"&locationk = k + 1Exit ForEnd IfEnd IfIf j > cnt ThenExit ForEnd IfNextNextIf k = 0ThenOutput "字段-代码配置项["&carray(i)&"]对应码值丢失,请检查码表sheet页"Elseif k > 1Thenshtn.Range(shtn.cells(rNum+1, 1),shtn.cells(rNum+k, 1)).Mergeshtn.Range(shtn.cells(rNum+1, 2),shtn.cells(rNum+k, 2)).Mergeshtn.Range(shtn.cells(rNum+1, 3),shtn.cells(rNum+k, 3)).Mergeshtn.Range(shtn.cells(rNum+1, 4),shtn.cells(rNum+k, 4)).Mergeshtn.Range(shtn.cells(rNum+1, 5),shtn.cells(rNum+k, 5)).Mergeshtn.Range(shtn.cells(rNum+1, 6),shtn.cells(rNum+k, 6)).Mergeshtn.Range(shtn.cells(rNum+1, 1),shtn.cells(rNum+k, 7)).Borders.LineStyle = "1"rNum = rNum+k-1End IfEnd IfEnd IfEnd IfNextIf back = 1ThenExit ForEnd Ifshtn.Range(shtn.cells(rNum+1, 1),shtn.cells(rNum+1, 7)).Borders.LineStyle = "1"Next'设置超链接,从⽬录点击表名去查看表结构sheetList.Hyperlinks.Add sheetList.Cells(tabIndex,2), "",tab.code&"!A1"shtn.Hyperlinks.Add shtn.Cells(1, 8), "","⽬录!B"&tabIndex'shtn.Columns("A:G").EntireColumn.AutoFit '列宽⾃适应'shtn.Columns(6).ColumnWidth = 10shtn.Columns("A:G").NumberFormatLocal = "@"'单元格内容为⽂本格式shtn.ActivateEXCEL.ActiveWindow.SplitRow = 2EXCEL.ActiveWindow.SplitColumn = 0EXCEL.ActiveWindow.FreezePanes = TrueOutput "输出"&tabDesp&"完成!"End IfEnd Sub为了丰富表字段与码值对应的映射,还需⼀段辅助sql脚本--create table mytab (tablename varchar2(100)); --表清单--drop table column_code_mapper purge;--select * from column_code_mapper order by tablename,columnname;create table column_code_mapper asselectdistinct upper(colactualtablename) as tablename,upper(colactualname) as columnname,replace(replace(coleditsource5,'''',''),'','') as coleditsourcefrom (selectt.*,case when instr(coleditsource4,'=',1) >0then trim(substr(coleditsource4,instr(coleditsource4,'=',1)+1))when instr(coleditsource4,'(',1) >0and instr(coleditsource4,')',1) >0then trim(substr(coleditsource4,instr(coleditsource4,'(',1)+1,instr(coleditsource4,')',1)-instr(coleditsource4,'(',1)-1)) else trim(coleditsource4)end as coleditsource5from (selectt.*,case when instr(lower(coleditsource3),' order ',1)>0then substr(coleditsource3,1,instr(lower(coleditsource3),' order ',1))else coleditsource3end as coleditsource4from (selectt.*,case when instr(lower(coleditsource2),' and ',1)>0then substr(coleditsource2,1,instr(lower(coleditsource2),' and ',1))else coleditsource2end as coleditsource3from (selectadc.dono,adc.jboclass,adc.jbofrom,adc.jbowhere,adl.colindex,case when lower(adl.coltablename) ='o'or adl.coltablename is null or trim(adc.jboclass) = trim(adc.jbofrom) then substr(jboclass,instr(jboclass,'.',-1)+1) else substr(substr(adc.jbofrom,1,instr(upper(adc.jbofrom),upper(''||trim(adl.coltablename)))),instr(substr(adc.jbofrom,1,instr(upper(adc.jbofrom),upper(''||trim(adl.coltablename)))),'.',-1)+1)end as colactualtablename,adl.coltablename,adl.colactualname,adl.colheader,adl.coleditsourcetype,coleditsource,case when lower(adl.coleditsourcetype) ='jbo'then substr(adl.coleditsource,instr(adl.coleditsource,',',1,3)+1)else adl.coleditsourceend as coleditsource2fromawe_do_catalog adc,awe_do_library adlwhereadc.dono = adl.dono and adl.coleditsource is not null and instr(adl.colactualname,'NameManager.',1) =0and ((lower(adl.coleditsourcetype) ='jbo'and instr(adl.coleditsource,'jbo.ui.system.CODE_LIBRARY')>0) or lower(adl.coleditsourcetype) ='code')) t)t)t)t,user_tab_columns ucwhere uc.table_name =upper(t.colactualtablename) and uc.column_name =upper(t.colactualname)and exists (select1from mytab where uc.table_name = tablename)--检查字段中⽂乱码select t1.table_name,t1.column_name,ments,'comment on column '|| t3.table_name||'.'||t3.column_name||' is '''';'from user_col_comments t1,mytab t2,user_tab_columns t3,user_tab_comments t4 where t1.table_name = t2.tablename and (ments is null or ments like'%?%')and t1.table_name = t3.table_name and t1.column_name = t3.column_name and t3.table_name = t4.table_nameorder by t1.table_name,t1.column_name--导出成codelist.xlsxselectdistinct cl.codeno as "代码编号",nvl(cc.codename,cc.codetypetwo) as "代码名称",cl.itemno as "代码项编号",cl.itemname as "代码项名称",decode(cl.isinuse,'1','Y') as "是否使⽤",decode(cc.codetypeone,'数据标准化','Y') as "是否落标"from code_library clleft join code_catalog cc on cl.codeno = cc.codenoinner join column_code_mapper ton cl.codeno = t.coleditsource or t.coleditsource like cl.codeno||',%'or t.coleditsource like'%,'||cl.codeno||',%'or t.coleditsource like'%,'||cl.codenoorder by cl.codeno,cl.itemno;--导出成colcodelist.xlsxselectdistinct t.tablename as "表名",t.columnname as "字段名",cl.codeno as "代码编号"from code_library clleft join code_catalog cc on cl.codeno = cc.codenoinner join column_code_mapper ton cl.codeno = t.coleditsource or t.coleditsource like cl.codeno||',%'or t.coleditsource like'%,'||cl.codeno||',%'or t.coleditsource like'%,'||cl.codenoorder by t.tablename,t.columnname,cl.codeno;反向⽣成pdmFile/New Model/Physical ProgramDatabase/Update Model From Database/,选择Connection Type 为JDBCTools/Execute Commands/Run Scripts,选择上⾯的Export2Excel.vba。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

使用PowerDesigner生成数据库测试数据
1、环境
PowerDesigner15.2.0.3042-BEAN+ MySQL5.5 + mysql-connector-odbc-5.1.8
以上软件在网上都很容易找到,这里就不再给出相关链接!系统环境为WindowsXP。
2、具体流程
既然是生成测试数据,首先数据库一定存在,这里我以对MySQL的操作为例,假设我
的数据库名称为db_generate_test。
流程如下:

2.1数据库反向工程
在PowerDesigner环境中,只能对PDM(物理数据模型)生成测试数据所以,首先将需要
生成测试数据的数据库反向工程为PowerDesigner的PDM模型。
2.1.1配置数据源
针对MySQL5.0系列版本需要安装mysql-connector-odbc-5.1.8,这里没有什么选择项,
直接“下一步”就行。安装好后,打开控制面板 | 管理工具 | 数据源(ODBC) 如图:
添加数据源:
创建数据源:
填完相关选项后点击“Test”连接成功,OK确定即完成数据源的创建。

2.1.2数据库反向工程
数据源建好后打开PowerDesigner,选择File | Reverse Engineer |Database…,如下
图:


你可以为物理数据模型命名,确定即可,这里我命名为GenerateTestDataModel_1,接着:


点击红色箭头处配置数据源:

另外在“Options”选项下可以配置编码类型等选项:

确定后如下:

选择数据库用户,选择表,OK即可完成数据库到物理数据模型的转换
我这里只有两个表,而且表结构也极其简单,这个过程很快就会完成,但是如果你的数据库
表多、表结构复杂,那么这将是一个非常耗时的过程。我曾遇到过耗了三天三夜险些未完成
的(果真是那样的话,不建议使用PowerDesigner生成测试数据,因为在生成测试数那一
步会更加耗时,自己编写程序插入模拟数据会快很多)。
2.2配置测试数据摘要文档
这一步相当于是制定你的测试数据生成规则,可以单独做也可以和下一步“应用测试数
据摘要文档”一起做,单独做的话点击Model | Test Data Profile…,不过我个人更建议和下
一步一起做,因为那样使你更加明确需要配置哪些测试数据摘要文档。
2.3应用测试数据摘要文档
在PowerDesigner PDM模型下双击Table,Columns选项卡下再双击相应字段,如下:
在出现的ColumnProperties选项板中Detail选项卡下点击红色箭头可创建测试数据摘要文
档:
这里我为id列创建的测试数据摘要文档名为Num_id,是Number类型,自动产生。其中这
里有三种类型可以选择,分别是:Number(数值型)、Character(字符型)、Data&Time
(日期时间型)。在”Generaction Source”项上为测试数据摘要文件指定数据的产生方式:
Automatic是自动产生、List是根据列表值产生、ODBC是根据其它的数据库产生。
再双击“Num_id”可制定更细致的规则,如下我这里指定的是一序列的方式从1递增至
1000,步长为1(我假设在这里要产生1000条数据):
制定摘要文档完成后确定回到Column Properties - id选项板下,为列应用摘要文档,
如下:

制定完所有测试数据生成规则后可进入下一步“生成测试数据”。
2.4生成测试数据
选择Database | Generate Test Data…如下:
确定即可开始生成测试数据。
2、总结
每当我们完成数据库的构建,接下就需要数据库性能测、相关接口测试以及报表测试
等等,这时就需要大量的测试数据。相比手工创建,使用PowerDesigner自动生成不失为
一种方便简捷的办法。但是这一切都是建立在我们的数据库结构并不复杂庞大的情况下,如
果你的数据库结构庞大复杂,那么你看到的将是PowerDesigner未响应,这时
PowerDesigner的效率还不如我们自己写程序生成。
另,在生成大量测试数据的过程中,为了节约时间我们可以采用并行生成测试数据,
即在不影响相关外键及其他约束的情况下,我们可以将数据库分为几个相对独立的模块,分
别生成。

相关文档
最新文档