利用PowerBuilder开发格式生成器在线教程
DataWindow(以下简称DW)是PowerBuilder的核心功能,使程序员可以图形化生成SQL,减少编程工作量,并减少程序对系统资源的占用,扩展了报表的特性。我们知道,面向数据库的应用都是以数据为中心的,数据以一定的格式被封装起来进行存取,而DW正是显示与操作数据的窗口。我们可以简单地将DW视为一种数据格式,一旦生成一个数据格式(不管是由用户还是由程序员),则既可以通过这种数据格式打印报表(此时该数据格式就是一份报表格式),也可以通过该种数据格式录入数据(此时该数据格式就是一个编辑窗口)。本文所述格式生成器, 其本质就是一个汉化的DataWindow生成器,相当于把PowerBuilder中的DataWindow Painter 功能分离出来,使用户在不了解PB4.0的情况下,也能自己独立地产生一份满意的报表(或者数据录入格式),并且如果用户对于某一个数据格式不满意,可以通过格式生成器自己进行修改。DW语法可以通过SyntaxFromSql得到。对于开发人员而言,可以在打开library painter后选中某一个DW在主菜单中点Entry-->Export,生成一个扩展名为.srd的文件,该文件为文本文件,可以通过编辑方式浏览。
1.给用户提供一个图形化的界面选择数据源
以WATCOM数据库为例,systable表中creator字段为0表示为系统表。程序A和程序B中lb -table为listbox控件,显示数据库中所有表名,lb-column显示表中对应列。systemtable为窗口级的布尔变量,表明是否选择系统表(设计思路仿pb4.0中DataWindow Painter中SQL的生成方法)。
程序A 函数f-table-list
STRING table-name
DECLARE curtable CURSOR FOR
SELECT table-name
FROM systable
WHERE creator<>0;
DECLARE cursystem-table CURSOR FOR
SELECT table-name FROM systable;
lb-table.reset()
lb-table.setredraw(FALSE)
lb-column.reset()
OPEN curtable;
OPEN cursystem-table;
DO
IF systemtable THEN
FETCH cursystem-table INTO:table-name;
ELSE
FETCH curtable INTO:table-name;
END IF
IF sqlca.sqlcode=0 THEN
lb-table.additem(table-name)
ELSE
EXIT
ENDIF
LOOP while TRUE
CLOSE curtable;
CLOSE cursystem-table;
lb-table.setredraw(TRUE)
程序B 函数f-column-list():
STRING cname,coltype
DECLARE curcolumn CURSOR FOR
SELECT cname,coltype FROM syscolumns WHERE
tname = :tablename;
lb-column.setredraw(false)
lb-column.reset()
OPEN curcolumn;
DO
FETCH curcolumn INTO:cname,:coltype;
IF sqlca.sqlcode=0 THEN
lb-column.additem(cname)
ELSE
EXIT
END IF
LOOP WHILE TRUE
CLOSE curcolumn;
lb-column.setredraw(TRUE)
2.生成一个新的DW
dw-print.create(sqlca.SYNTAXfromSQL(&
selectstring,&
"Style(Report=Yes Type="+form+")"+&
"Text(Font.Face="楷体"Border=6"+&
"Background.mode=1 Background.color=12632256)"+&
"Column(Border=2 Font.Face="楷体""+&
"Background.mode=1"+&
"Background.color=12632256",errorbuffer),errorbuffer)"
(1)将DW Object的ReadOnly属性和ShowDefinition置为YES,则DW为只读状态且显示每一个数据列的内部定义名称。因为用户是在编辑数据格式而非输入数据,将数据列的内部定义名称显示出来是为了便于用户了解所处理的对象。
(2)在FreeForm方式下,应将列(colunm)、文本(text)等对象(object)的resizeable、m oveable置为1。
3.删除或者增加一个DW的对象
对象(object)是组成DW的基本单元,例如一个标准的数据录入窗口中有文字、输入项,那么这些文字、输入项就是这个DW的object。对象主要有以下几种:列(column)、文本(text) 、计算域(computedfield)、线(line)等。其中,计算域显示的内容是由它的表达式属性(ex divssion)决定的。通过DataWindow Painter Functions组成的函数表达式,我们可以显示诸如日期、报表页码、某几列的和等信息以丰富报表格式的内容。
(1)删除一个对象:<DW控件名>.modify("Destroy<对象名>")
(2)增加一个对象:
以计算域为例(附录程序C)。
程序C:
modstring="create compute(band="+band+&
"alignment="0" exdivssion=""border="6"+&
"color="0"x="5"y=+srting(barheight+5)+&
height="100"width="400"format="[GENERAL]"+&
"name="+namestring+"pointer="Arrow!"resizeable=l moveable=l"+&
font.face="楷体"font.height="-10"font.weight="700+&
"font.famliy="1"font.pitch="2"font.charset="-122""+&
"background.color="12632256"background.mode="1")"
errorsrting=dw-print.Modify(modstring)
IF errorstring=""THEN∥增加操作成功
obj-setting[obj-i].moveable="0"
obj-setting[obj-i].objtype="compute"
obj-setting[obj-i].resizeable="0"
obj-setting[obj-i].name=namestring
dw-print.setposition(namestring,"",false)
newcompute-i++
obj-i++
END IF
说明:
(1).errorstring是一个buffer,用于存放出错信息;dw-print为数据窗口控件名称;
(2).obj-setting[]是一个数组,保存DW对象原始的信息。举例而言,我们在格式生成器中出于编辑的目的,将 每一个对象的resizeable,moveable都置为l,而在具体用这个DW格式录入数据时并不希望它是resizeable或者是moveale。注意在每次载入时保存原始信息在obj- setting数组中,每一个数组元素对应保存一个DW的对象。
其他一些修改外形的方法如颜色(color)、左右对齐(align)、字体、大小等,可以参考PB4.0中DataWindow painter中的toolkits,PB4.0提供了相应的位图,实现起来没有困难。
4.存盘与装载
PBL文件是PowerBuilder Library的缩写,各种BP4.0的控件包括DW控件,脚本(PowerScr ipt),对象等都集成在PBL中,应用以上库管理函数进行DW的调入、删除、存储等。
(1)存盘
或者将编辑好的DW的语法存入一个文本文件,或者直接将该格式存入一个PBL文件中。
libraryimport(<目的文件>,<DW内部名>,ImportDataWindow!,&
<DW控件名>.describe("DataWindow.Syntax",Errorbuffer,&
comment))
(2)调入
syntax=libraryExport(<源文件>,<DW内部名称>)<DW控件名>.create(syntax,errorbuffer)
errorbuffer存放出错信息,comment为该格式的备注,我们可以用comment和DW内部名称一一对应,作为该格式的正式名称提供给用户。
例如:用户给某种DW格式定义一个正式名称如"900型设备录入格式",存储时令comment="900型设备录入格式",给该DW起一个DW内部名称, 调入时将用户选中的comment对应的DW内部名称传递给libraryExport函数。