使用PowerDesigner 12生成数据库表报告
- 格式:doc
- 大小:402.00 KB
- 文档页数:15
实验五:使用PowerDesigner设计数据库[目的和意义]掌握将现实世界的事物转换成E-R 图的基本技术,能够正确判断给定表的关键词;了解将E-R 图转换成关系表的技术;掌握使用PowerDesigner 工具创建CDM概念数据模型的方法,以及完成数据库表的创建和修改等工作。
[实验内容]本实验的主要内容:使用PowerDesigner按下列要求创建用户数据库模型:1.PowerDesigner软件的安装;2.数据库需求分析;3.设计数据库并创建CDM概念数据模型;[实验步骤]1 安装与破解PowerDesigner软件目前主要的建模工具厂商有Sybase PowerDesigner, IBM Rational Rose, Computer Associates ERWin等。
PowerDesigner是Sybase公司的CASE工具集,使用它可以方便地对信息系统进行分析设计, 其中主要受关注的有数据设计模型、对象模型、和业务流程模型等,它几乎包括了数据库模型设计的全过程。
目前的最新版本是 PowerDesigner 15,我们实验安装的版本为PowerDesigner v12.5。
1.1 安装PowerDesigner软件在给定的安装文件夹Sybase.PowerDesigner.v12.5-EDGE下找到安装文件powerdesigner 125_eval.exe,点击直接安装。
点击“Next”继续,接受默认设置,直至安装完成。
1.2 破解PowerDesigner软件安装文件夹子目录中的两文件pdflm12.dll和license.lic用于破解。
安装完成后,在安装文件下找到pdflm12.dll文件,用它去替换PowerDesigner 安装目录下的pdflm12.dll同名文件。
然后在“开始”->“所在程序”―>“Sybase”―>PowerDesigner12中点击“PowerDesigner”打开软件。
将数据库中的表导入到PowerDesigner中并转为excel文档1、打开PowerDesigner12,在菜单中按照如下方式进行操作file->Reverse Engineer->DataBase点击后,弹出 New Physical Data Model 的对话框2、在General选项卡中Model name:模板名字,自己命名。
DMBMS :根据需要选择,我选择的是ORACLE Version 10g 点确定后弹出 Database Reverse Engineering Option 对话框3 Selection选项卡中,选中Using a data source选项注意如果是第一次导入数据,需要你先自己配制ODBC数据源,方法如下:1)点击下面右侧的数据库连接按钮,弹出 Connect to a Data Source 的对话框2)选中 ODBC machine data source 选项,点击 Modify按钮右边的Configure 按钮弹出Configure Data Connections3)在 ODBC Machine Data Sources选项卡下面的工具栏中点击第二个数据库配置按钮(Add Data Source(Ctrl+N)) 弹出创建新数据源窗口,选择文件数据源,选择相应的数据源驱动程序(我选Oracle),点下一步(Modify),给数据源起个名字,选择服务器,下一步,输入相应的密码配置完毕后点击确定4,选择刚刚配置的数据源,输入相应的用户名和密码即可。
、选择需要导入的表powerDesigner生成excel版本的数据库文件在PowerDesigner中,shift+ctrl+X,打开脚本运行,脚本如下:'******************************************************************** **********'* File: pdm2excel.txt'* Title: pdm export to excel'* Purpose: To export the tables and columns to Excel'* Model: Physical Data Model'* Objects: Table, Column, View'* Author: ziyan'* Created: 2012-05-03'* Version: 1.0'******************************************************************** **********Option ExplicitDim rowsNumrowsNum = 0'-----------------------------------------------------------------------------' Main function'-----------------------------------------------------------------------------' Get the current active modelDim ModelSet Model = ActiveModelIf (Model Is Nothing) Or (Not Model.IsKindOf(PdPDM.cls_Model)) Then MsgBox "The current model is not an PDM model."Else' Get the tables collection'创建EXCEL APPdim beginrowDIM EXCEL, SHEETset EXCEL = CREATEOBJECT("Excel.Application")EXCEL.workbooks.add(-4167)'添加工作表EXCEL.workbooks(1).sheets(1).name ="test"set sheet = EXCEL.workbooks(1).sheets("test")ShowProperties Model, SHEETEXCEL.visible = true'设置列宽和自动换行sheet.Columns(1).ColumnWidth = 20sheet.Columns(2).ColumnWidth = 40sheet.Columns(4).ColumnWidth = 20sheet.Columns(5).ColumnWidth = 20sheet.Columns(6).ColumnWidth = 15sheet.Columns(7).ColumnWidth = 10sheet.Columns(8).ColumnWidth = 10sheet.Columns(9).ColumnWidth = 10sheet.Columns(1).WrapText =truesheet.Columns(2).WrapText =truesheet.Columns(4).WrapText =trueEnd If'-----------------------------------------------------------------------------' Show properties of tables'-----------------------------------------------------------------------------Sub ShowProperties(mdl, sheet)' Show tables of the current model/packagerowsNum=0beginrow = rowsNum+1' For each tableoutput "begin"Dim tabFor Each tab In mdl.tablesShowTable tab,sheetNextif mdl.tables.count > 0 thensheet.Range("A" & beginrow + 1 & ":A" & rowsNum).Rows.Groupend ifoutput "end"End Sub'-----------------------------------------------------------------------------' Show table properties'-----------------------------------------------------------------------------Sub ShowTable(tab, sheet)If IsObject(tab) ThenDim rangFlagrowsNum = rowsNum + 1' Show propertiesOutput "================================"sheet.cells(rowsNum, 1) = "实体名"sheet.cells(rowsNum, 2) =sheet.cells(rowsNum, 3) = ""sheet.cells(rowsNum, 4) = "表名"sheet.cells(rowsNum, 5) = tab.codesheet.Range(sheet.cells(rowsNum, 5),sheet.cells(rowsNum, 9)).MergerowsNum = rowsNum + 1sheet.cells(rowsNum, 1) = "属性名"sheet.cells(rowsNum, 2) = "说明"sheet.cells(rowsNum, 3) = ""sheet.cells(rowsNum, 4) = "字段中文名"sheet.cells(rowsNum, 5) = "字段名"sheet.cells(rowsNum, 6) = "字段类型"sheet.cells(rowsNum, 7) = "是否主键"sheet.cells(rowsNum, 8) = "是否外键"sheet.cells(rowsNum, 9) = "是否必填"'设置边框sheet.Range(sheet.cells(rowsNum-1, 1),sheet.cells(rowsNum, 2)).Borders.LineStyle = "1"sheet.Range(sheet.cells(rowsNum-1, 4),sheet.cells(rowsNum, 9)).Borders.LineStyle = "1"Dim col ' running columnDim colsNumcolsNum = 0for each col in tab.columnsrowsNum = rowsNum + 1colsNum = colsNum + 1sheet.cells(rowsNum, 1) = sheet.cells(rowsNum, 2) = mentsheet.cells(rowsNum, 3) = ""sheet.cells(rowsNum, 4) = sheet.cells(rowsNum, 5) = col.codesheet.cells(rowsNum, 6) = col.datatypesheet.cells(rowsNum, 7) = col.primarysheet.cells(rowsNum, 8) = col.foreignkeysheet.cells(rowsNum, 9) = col.mandatorynextsheet.Range(sheet.cells(rowsNum-colsNum+1,1),sheet.cells(rowsNum,2)). Borders.LineStyle = "2"sheet.Range(sheet.cells(rowsNum-colsNum+1,4),sheet.cells(rowsNum,9)). Borders.LineStyle = "2"rowsNum = rowsNum + 1Output "FullDescription: " + End IfEnd Sub。
利用PowerDesigner创建数据库来源于:在PowerDesigner可以设计数据库,但是由于他是英文版本的,所以用起来很不方便,在这里做一简单介绍。
先在PowerDesigner 中画表:先选种table工具,然后在页面上点鼠标坐键,一个表就创建了。
但是列名还需要自己添加。
点鼠标右键,释放table工具,在表上双击左键或者点右键选择proaperties或者是同时按下alt+enter 键,出现新的对话框,有很多选项,其中默认的是打开了general,在name中填写表的汉语名字,在code中填写表名。
然后,选columns,仍然是在name中填写列的汉语名字,在code中填写列名,在data type中选择字段类型,然后设置主键,在p先的方框中选择。
表的内容添好后,点一下应用,就要建立表之间的关系,如果一个一个的建很麻烦,现有一很方便的方法,使用此方法要在填表的列的时候要注意一些东西:1、要分清那个是主键,那个是外键;2、在第一个表中的外键要和另外表中的主键命名和类型要一致。
做完这些之后在工具拦中选择tools,在他的下拉框中选择 rebuild general 工具,点确定,就可以自动创建表之间的关系了。
表的内容添好了,关系也有了,然后还在表上双击左键或者点右键选择proaperties或者是同时按下alt+enter键,在preview中把sql脚本语言全选,或者只选注释以下的语句,在sql查询分析器中执行就可以了。
它只能创建表,不能创建数据库,所以用户要自己先创建数据库,在执行sql语句的时候,要先选择数据库。
就这样,一个表创建了,但是对于多个表,表之间有关系的,这样用起来就不方便了,怎么办?当然有好的方法了!在dastabase中选择generate database或者ctrl+g出现新的对话框,在director中选择路径,在file中填写个文件名字,怎么命名,看你的爱好了。
PowerDesigner12.5的使用说明一.PowerDesigner12.5数据库的连接及数据表的导入 (2)(1)sql server的连接 (2)(2 ) sql server的数据表导入 (7)(3)Oracle的连接 (11)(4)Oracle的数据导入 (13)(5)导入表之后显示字段注释: (15)二.新建的表的导入和导出 (17)(1)逆向导出新建的表 (17)(2)正向从PowerDesigner设计表导入到oracle (19)三.关联表的导入和导出 (22)(1)数据库向PowerDesigner中导入关联表 (22)(2) PowerDesigner向数据库中导入关联表 (24)一.PowerDesigner12.5数据库的连接及数据表的导入(1)sql server的连接打开PowerDesigner12.5,新建一个工作空间创建数据源:点击数据库>configure conn….在弹出的窗口中选择创建新数据源(系统数据源)点击下一步下拉选择SQL Server下一步点击完成。
输入数据库名称以及服务器IP选择使用用户输入登录,写上登录ID和密码记得更改默认的数据库名点击完成,测试成功,说明连接成功(2) sql server的数据表导入连接数据源进行数据表的导入:数据库>connect…选择数据源,输入登录ID和密码,选择文件>逆向工程>Daeabase…选择数据源点确定,勾选要列出的表,点OK(3)Oracle的连接新建工作空间选择ORACLE重复1.1中的步骤修改数据源驱动输入数据源名称和用户名称(4)Oracle的数据导入文件>逆向工程>选择数据源,输入用户ID和密码OK,表生成了(5)导入表之后显示字段注释:右击单表点属性,在弹出窗口中点击Columns下的Cutomize Col….按钮在窗口中勾选Comment查看表注释,完成二.新建的表的导入和导出(1)逆向导出新建的表在数据库中新建两张表:表A和表B。
powerdesign12PDM导出带有字段说明的sql及逆向⼯程导⼊字段说明⼀、从PDM导出带有字段说明的sql⽂件 1、新建DBMS2、点击新建3、输⼊新建DBMS的名称,并选择拷贝源为Miscrosoft SQL Server2005。
4、点击保存后弹出如下窗⼝ 5、选择左侧树节点 Script-->Objects-->Column-->ColumnComment,设置其值为EXEC sys.sp_addextendedproperty@name=N'MS_Description', @value=N'%Name%',@level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'%TABLE%', @level2type=N'column', @level2name=N'%COLUMN%'说明:该字段是为了导出符合Sqlserver2005字段说明的模板,%%为变量,不可修改,其它可视情况变更。
6、选择左侧树节点 Script-->Objects-->Table-->TableComment,去掉其值内容。
说明:因为我的例⼦中不需要表说明。
7、点击确定,返回上层并关闭设置DBMS窗⼝。
8、新建PDM ,选择DBMS为刚才新建的SQLSERVER2005[EXT]. 9、新建⼀张表,并定义字段说明。
10、选择⽣成数据库,就得到sql脚本了。
11、把这段脚本放在SQLSERVER2005中执⾏就能得到带有字段说明的表了。
⼆、逆向⼯程导⼊字段说明 1、新建⼀个PDM,选择DBMS为刚才定义好的SQLSERVER2005[EXT]。
实验十二数据库设计之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脚本⾃动⽣成数据库详细设计⽂档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。
使用PowerDesigner反向工程生成数据字典报告这里生成的数据字典的每个表的格式如下:1、打开PowerDesigner,选择菜单:File ---> Reverse Engineer ---> Database...1)在弹出的New Physical Data Model窗口中,在Model name处写好名字,在DBMS 选择好相应的数据库,然后点击确定。
2)在弹出的Database Reverse Engineer Options窗口中,选中Using a data source,然后点击Connect to a Data Source3)在弹出的Connect to a Data Source窗口,按如下操作,然后点击Connect4)在弹出的Configure Data Connections 窗口中,按如下操作,然后点击确定5)在弹出的创建新数据源窗口,做如下操作,然后点击下一步6)在弹出的窗口中选择相应的数据库驱动,然后点击下一步7)完成8)点击完成后,弹出Oracle驱动配置窗口其中TNS Service Name是在tnsnames.ora文件中配置的要连接的数据库的服务名字填好后可以点击T est Connection测试一下,最后点击ok9)点击确定10)点击确定后11)点击Connect后12)点击确定后在这一步,可以根据实际情况选择需要哪些表,视图等。
点击ok,就会把所选的表、视图等物理视图生成。
2、生成数据字典报表1)菜单Report ---> Report Wizard点击下一步2)选择生成的报表文档类型其他的默认,直接点击完成,完成后的视图如下:3)设置显示的属性4)我这里只显示名称、代码、数据类型、注释这个四个属性选好好点击ok5)最后菜单Report ---> Generate RTF生成数据字典报告。
RTF 格式文件打开后可以另存为doc格式。
PowerDesigner如何自定义报表模板
PowerDesigner如何自定义报表模板
帅宏军
使用PowerDesigner设计数据库非常方便,但是它自带的报表模板一般不符合中国的使用情况。
如何设计一个自己的报表模板,并在做项目的数据库设计时引用这个模板呢?本文就这个问题提出一个解决方案。
1、新建一个自己的报表
使用上面菜单新建一个自己的报表,之后调整为自己需要的报表格式。
2、将自行修改的报表存为模板
使用上面菜单将自己定义的这个报表生成为模板,并另存为“我的报表模板.rtp”。
3、引用自己的报表模板
将这个文件复制到在你的安装路径E:\Program Files (x86)\Sybase\PowerDesigner 16\Resource Files\ReportT emplates 下,下次再新建报表时,就可以使用自己的报表模板了。
使用PowerDesigner 12生成数据库表报告
1.创建物理数据模型
File > New > Physical Data Model
2.配置数据库连接
Database > Configure Data Connections > 单击Add ODBC Machine Data Source
3.创建系统数据源
4.添加测试数据源连接
5.添加了mysql_tomxam数据源
6.选择逆向数据库引擎
7.创建新的物理数据模型
8.单击选择数据源
9.选择添加的数据源
10.单击反选所有用户的表
11.选择用户,单击选择此用户下的所有表
12.生成的物理数据模型
13.单击工具栏中的Reports图标
14.点击图表,添加新的Reports
15.生成报告中的语言为中文
16.双击添加Table到报告项目Section_1中
17.只生成表格列信息
18.设置列表布局
19.预览生成的报告(其中出现中文乱码)
20.解决中文乱码
21.生成报告
22.生成RTF WORD格式文档。