数据窗口是一个很重要的组成部分,它前连接用户窗口,后连接数据库,它就像一座桥梁,连接着河流的两岸的数据与用户界面。数据窗口把数据从数据库提到用户窗口中,使用户能够观看、使用和更新数据库。
PowerBuilder提供给开发人员快速建立应用程序的强有力的工具,也是PowerBuilder与其它面向对象的数据库应用前端开发工具的最主要区别。它以自动化的用户/数据库接口为开发人员最大限度地节省了时间和精力,但这种自动化并不限制开发人员的主观能动性,开发者能够以独具特色的方式灵活运用数据窗口。
数据窗口包括两方面的内容:数据窗口对象和数据窗口控件。数据窗口对象主要用于展示数据并允许用户增删改数据,数据窗口控件则把数据窗口对象放置到窗口上并呈现在用户面前。本章主要介绍数据窗口对象。
构造数据窗口对象时,首先要考虑两方面的内容:数据和显示风格。数据窗口对象中的数据来源于数据源,数据源决定了数据窗口对象从什么地方得到数据。显示风格决定了数据窗口以何种方式展示、表现数据。
PowerBuilder 支持五种数据源:
快速选择、SQL选择、查询对象、外部数据源以及存储过程,每种数据源都有其独到之处,开发应用程序时往往会多种数据源并用。
PowerBuilder的数据窗口提供了十一种显示风格:
列表(Tabular)、表格(Grid)、自由格式(Freeform)、标签(Label)、分栏(N-Up)、分组(Group)、交叉列表(Crosstab)、统计图(Graph)、OLE 2.0、超文本(RichText)、复合(Composite)风格。
在数据窗口对象内部,我们还能够校验、过滤、排序其中的数据,并随时查看设计效果。
使用数据窗口对象的一般方法为:
1.使用数据窗口画笔创建数据窗口对象,并把它保存到应用库中。创建数据窗口对象时一般包括下述内容:定义数据源、选择数据窗口的显示风格、设置数据窗口对象及其该对象内其它对象的属性等,例如显示格式、编辑风格、跳转次序、有效性规则、排序与检索条件等;
2.在窗口或用户对象中建立一个数据窗口控件;
3.通过数据窗口控件的属性设置或编写代码将数据窗口控件与数据窗口对象联系起来,使其成为一个整体;
4.在窗口画笔或用户对象画笔中编写代码以操作数据窗口控件以及放置在该控件中的数据窗口对象,例如使用数据窗口控件的对象函数Retrieve( )提取数据,使用Update( )函数更新数据库中的数据等。
10.2.1 创建数据窗口对象的一般步骤
1.单击“PowerBar1”工具栏中的“New”按钮,激活“DataWindow”选项卡;
2.在“New”对话框中,有11种数据窗口显示风格,选择其中的一种显示风格,假设选择“Grid”;单击“OK”按钮,进入“Choose Data Source for Grid DataWindow ”对话框;
3.在“Choose Data Source for Grid DataWindow ”对话框中,有5种数据源可供选择,假设选择“SQL Select”数据源;
4.单击“Next”,出现“Select Tables”对话框,列出了可供选择的表名或视图名,单击所要选择的表,然后单击“Open”按钮,将打开该数据表;
5.单击数据表所要出现在数据窗口中的列名;
6.单击PainterBar1工具栏中的“Return”按钮,出现“Select Color and Border Settings” 对话框,在此对话框中可完成数据窗口的背景颜色、编辑框字体和边框颜色及列颜色的设置,如果采用PowerBuilder默认属性,则可直接单击“Next”按钮即可;
7.设置完毕后,单击对话框中的“Next”按钮,打开“Ready to Create Grid DataWindow”对话框,在该对话框中列出了所要创建数据窗口的属性设置,如果这时并不满意这些属性的设置,可以单击该对话框的“Back”按钮返回,重新设置其属性;
8.单击“Ready to Create Grid DataWindow”对话框中的“Finish”按钮即可完成数据窗口的设置,此时如果不满意,也可通过修改数据窗口的属性进行设置;
9.单击PainterBar1工具栏中的“Close”按钮,出现一个信息提示框,提示存储数据窗口,单击“是”按钮,出现“Save DataWindow”对话框;
10.在DataWindows编辑框中输入数据窗口名称,在Comments编辑框中输入对该数据窗口的注释信息,输入完毕后,单击“OK”按钮,完成数据窗口的创建。
10.2.2 调整对象
1.数据窗口中选择对象的方法
在数据窗口画笔中,显示的所有项目都是可以选择的对象。一般说来,无论想对它们做什么操作,首要的任务就是选择对象。对象被选中后,对象的四角出现四个黑点,没有被选中的对象则没有这四个黑点。
选择对象的方法有两种:一种与窗口画笔中选择控件的方法相同,即单击选中一个对象,多次Ctrl+单击选中多个对象;另一种方法则使用菜单项来完成,这在对象被遮挡的情况下尤其有用,下面介绍这种方法:
①从“Edit”菜单中选择“Select”菜单项,系统弹出级联菜单;
②其中:菜单项“Select All” 选中所有对象;
“Select Above” 选中当前选中对象上面的对象;
“Select Below” 选中当前选中对象下面的对象;
“Select Right” 选中当前选中对象右边的对象;
“Select Left” 选中当前选中对象左边的对象;
“Select Columns” 选中所有的列对象;
“Select Text” 选中所有的文本对象。
⒉移动与改变对象的大小
移动和改变对象大小的方法与窗口画笔中移动和改变控件大小的方法完全相同。
⒊对齐对象、调整对象间间距与大小
数据窗口中的对象能够沿共同轴线对齐,也能够使它们隔开相同的间距,还能够使选中的对象具备相同的大小。对齐对象、调整对象间间距与大小的方法与窗口画笔中对应的操作控件的方法相同。
⒋使用网格和标尺
PowerBuilder提供了网格和标尺工具帮助我们对齐对象、调整对象间间距与大小。网格就是显示在数据窗口画笔中的一个个小点,这些小点将来并不会出现在运行的数据窗口中。标尺主要用于设计报表,它的度量单位在数据窗口的属性页中指定,从标尺上我们能够看到数据窗口的实际大小。
设置网格大小以及显示标尺的方法为:
1)从“Design”菜单中选择“Options…” 菜单项,系统显示“DataWindow Options”对话框;
2)在“General”选项卡中根据下述介绍设置各选项:
当选中“Show Grid”复选框时,系统将在数据窗口画笔工作区中显示网格,否则不显示网格;
当选中“Snap to Grid”复选框后,移动或放置数据窗口中的对象时对象自动与最近的网格线对齐;
选中“Show Ruler”复选框时,系统在数据窗口画笔工作区的边缘显示标尺,帮助开发人员确定数据窗口的大小;
X、Y编辑框用来指定网格线之间的像素数,缺省值为8,如果将其设置为4,用起来更灵活;
选中“Show Edges”复选框时,系统将在没有边框的对象周围显示一个方框,以表明对象的外形尺寸;
选中“Retain Data to Design”复选框后,PowerBuilder会把当前数据窗口的数据保存到临时文件中,这样在设计模式和预览模式之间进行转换时,系统就不需要每次都从数据库中重新检索数据了;
选中“Retrieve on Preview ”复选框后,从设计模式切换到预览模式时系统将检索数据。
⒌改变数据窗口的显示比例
1)从“Design”菜单中选择“Zoom…” 菜单项,系统显示如下图所示的对话框。
2)该选项卡中预设了四种缩放比例:200%(放大两倍)、100%(正常显示)、65%(比标准显示稍小)、30%(最小显示)。
当这些选项不能满足使用要求时,通过单击选中“Custom”单选钮,然后在该选项后面的编辑框中键入希望的缩放比例,数字大于100时放大视图,小于100时缩小视图。
⒍对象的跳转次序
与窗口中控件的跳转次序相似,数据窗口中的对象也有跳转次序。跳转次序是个0~999的整数,表示用户按Tab键移动焦点时,焦点从当前对象移动到那个对象。在跳转次序中,序号0有特殊的含义。
设置数据窗口中对象跳转次序的步骤为:
1)单击数据窗口画笔工具栏上的“Tab Order(跳转次序)”图标,数据窗口画笔进入设置跳转次序模式,此时大多数菜单项和窗口画笔工具栏上的图标处于不可用状态;
2)红色数字出现在各列的上方,文本对象、线段、方框、椭圆、位图、计算列、按钮、组框等对象没有跳转次序;
3)通过单击选中某列上方的红色数字,键入新的序号,即设置了该列的跳转次序。序号的有效值为0~999,其中0表示该列不能得到焦点,因此运行时也就不能修改该列的值。其它数字的意义为:运行时当数据窗口得到焦点时,焦点首先移动到序号最小的列,用户第一次按Tab时焦点移动到序号第二小的列,用户第二次按Tab时焦点移动到序号第三小的列,依次类推。定义跳转次序时选择的序号值只要保持合适的大小次序也就可以了,因为退出设置跳转次序模式后并重新进入该模式时,PowerBuilder自动以10增量重新设置跳转次序。
4)再次单击数据窗口画笔工具栏上的“Tab Order(跳转次序)”图标或选择“Design”菜单中的“Tab Order”菜单项,返回设计模式。
⒎预览数据窗口对象
在设计数据窗口对象的过程中,随时可以通过预览(Preview Object)查看数据窗口的运行效果,预览时我们不仅能够看到数据窗口的外观,而且看到的结果就是实际运行时的结果,这点与窗口对象的预览不同。
10.2.3 数据窗口的布局结构
页眉区(Header)页眉区主要用来放置每页或每屏顶部显示的信息,如报表名、列标题等。
组标题区(Group Header)只有选择了分组风格或创建了分组后,PowerBuilder才会自动地把组标题区放进数据窗口。在组标题区通常放置每组数据前出现的信息,比如按部门分组时的部门名称。
细目区(Detail)细目区主要用于显示查询到的数据。
组尾区(Group Trailer)与组标题区相似,只有选择了分组风格或创建了分组时,PowerBuilder才会自动地把组标题区与组尾区一起显示在数据窗口,在该区中通常放置每组数据的统计与汇总信息。每个分组只有一个组尾区。
汇总区(Summary)汇总区里的数据只有当显示完所有细目数据后才会出现在最后一屏或最后一页数据的后面。通常在该区中汇总整个数据窗口的统计信息,比如数据行总数等。
脚注区(Footer)脚注区与页眉区相对应,该区中的数据出现在每一屏或每一页的底部。通常在脚注区中放置一些计算列,比如显示页码等。
10.2.4 控制列对象的显示与编辑
数据窗口主要用于显示和输入数据,它提供的显示格式可以定义列的显示方式,编辑风格能够控制用户如何输入数据,有效性规则判断输入数据的有效性。
1.显示格式
显示格式(Display Format)决定数据以何种方式呈现在用户面前。当用户单击带有显示格式的列时(即将输入焦点移动到该列),显示格式消失,代之以编辑风格。显示格式常用于不允许用户修改的列上。步骤为:
⑴选择“Properties”,单击“Format”标签;
⑵从右部的格式列表中选择一种格式或直接在“Format”编辑框中键入显示格式,然后返回。
2.编辑风格
与显示格式相似,编辑风格(Edit Style)改变了数据的显示方式。与显示格式不同的是,当定义了编辑风格的列得到输入焦点时,编辑风格并不消失。编辑风格影响用户输入和修改数据的方法。编辑风格有六种不同的类型:编辑框(缺省风格)(EditBox)、编辑掩码(EditMask)、复选框(CheckBox)、单选钮(RadioButton)、下拉列表框(DropDownListBox)、下拉数据窗口(DropDownDataWindow)。
设置列对象编辑风格的步骤为:
1)右击要设置编辑风格的列对象,选择“Properties”,单击“Edit”标签,系统显示该选项卡,如下图所示;
2)在“Style type”列表框中选择所需的编辑风格;
3)在“Style Name”列表框中选择编辑样式,然后返回。
10.2.5 控制数据行
1.记录过滤
过滤针对存放在数据窗口缓冲区中的数据进行,不生成新的SQL语句,也不访问数据库。过滤条件是个逻辑表达式,条件为真(TRUE)的数据被显示,为假(FALSE)的数据被隐藏。定义过滤条件的步骤为:
⑴从“Rows”菜单中选择“Filter…” 出现“Specify Filter”对话框;
⑵在编辑框中键入一个逻辑表达式,用来检测每条记录是否满足条件,使逻辑表达式的值为真(TRUE)的记录被显示,为假(FALSE)的记录不显示。定义逻辑表达式时,通过在“Functions”列表框中选择函数和“Columns”列表框中选择列能够减少键入错误。另外,使用逻辑运算符AND、OR能够构成复杂的逻辑表达式;
⑶单击“Verify”按钮,验证逻辑表达式的有效性;
⑷单击“OK”按钮完成过滤条件的定义。
2.记录排序
定义数据源时,通过ORDER BY子句可以对检索到的数据排序,这种方式下排序工作由DBMS完成。但有时我们希望数据检索出来后按不同顺序查看数据,指定数据窗口的排序方式可以完成这种任务,此刻排序工作由客户端的数据窗口完成。为数据窗口指定排序方式的步骤为:
⑴在“Rows”菜单中选择“Sort…” ,如下图所示的 “Specify Sort Columns”对话框;
⑵将要排序的列依次从左边的列表框中拖曳到右边的列表框中,此刻每个排序项后面“Ascending”列都有一个复选框,选中该复选框表示按升序排序,否则按降序排序;
⑶如果想按某个表达式排序,那么双击右边列表框中的一列,系统显示“Modify Expression”对话框,在此对话框中键入所需要的表达式,之后关闭该对话框;
⑷单击“OK”按钮返回画笔工作区。
删除排序的方法是:在“Specify Sort Columns”对话框中,将“Columns”列表框中指定的排序列重新拖曳到左部的“Source Data”列表框中。
3.记录分组
与记录排序相似,我们也可以在数据窗口中分组记录,步骤为:
⑴在“Rows”菜单中选择“Create Group…” 出现“Specify Group Columns”对话框;
⑵从“Source Data”列表框中把要分组的列拖曳到“Columns”列表框中;
⑶如果想按某个表达式分组,那么双击右边“Columns”列表框中的一列,之后关闭该对话框。
PowerBuilder的数据窗口对象有十一种显示风格,每种风格都有其独特的外观,这十一种显示风格为:列表(Tabular)、表格(Grid)、自由格式(Freeform)、标签(Label)、分栏(N-Up)、分组(Group)、交叉列表(Crosstab)、统计图(Graph)、OLE 2.0、超文本(RichText)、复合(Composite)
10.3.1 列表(Tabular)风格
在列表风格中,数据按列排列在数据窗口中,每列的上方都有一个标题,说明该列的数据。每屏显示的数据行数取决于数据窗口的大小,而且支持运行时由用户调整各列位置。另外,在每页中都可以显示页标题。列表风格的数据窗口常用于数据输入,有时也用于生成报表。
10.3.2 表格(Grid)风格
表格风格数据窗口中,数据的行与列之间通过网格线分隔,数据的每一项都位于其中一个网格中,运行时用户通过拖曳操作既能改变列的宽度,也能调整列的左右位置,但是,在设计数据窗口对象时我们不能移动列以及列标题的左右次序,这一点有别于列表风格和自由风格。表格风格的数据窗口既可用于数据输入,又能作为报表输出。
10.3.3 自由格式(Freeform)
自由格式的显示样式十分灵活,所有字段前面都加有字段标题(称为标签),并且以垂直方式排列在数据窗口中。在数据窗口画笔里,我们能够根据需要灵活地安排字段、标签、以及其它对象的位置。一般情况下,自由格式的数据窗口一屏显示一条记录,常用于单记录输入。
10.3.4 标签(Label)风格
标签风格的数据窗口以标签形式显示每行数据,用它可以制作各种标签。如果选择了标签风格,则在定义数据源后,还必须在“Specify LabelSpecifications”对话框中定义标签的各项参数。
10.3.5 分栏(N-Up)风格
分栏风格能够在一行中显示多条记录,如果选择了这种风格,在定义数据源之后,系统显示“Specify Rows inDetail”对话框,在这个对话框中指定一行显示几条记录(即分成几栏)。
10.4.6 分组(Group)风格
分组风格的数据窗口提供了一种对数据进行分组的简便途径,在这种风格下,数据被分成一个一个的组,组中可以带有统计数据。实际上,我们可以把它看成是带有分组特性的列表风格。当选择了此风格且定义了数据集后,系统将弹出“Group Report”对话框,在这个对话框中指定按哪些列进行分组。
10.3.7 交叉列表(Crosstab)风格
交叉列表风格支持按行和/或按列分析数据,该风格的数据窗口对数据进行加工处理后以汇总形式展现出来。当选择了此风格并定义了数据集后,系统将弹出“Crosstab Definition”对话框,在这个对话框中分配交叉列表中的行、列及行列交叉点的数据值,通过双击分配后的行、列或值可以编辑相应的表达式。
10.3.8 统计图(Graph)风格
统计图风格的数据窗口以统计图的形式表现数据,在这里,数据不是通过行、列一个个孤立地显示出来,而是以图形的方式呈现在用户面前。该风格的数据窗口提供了多种统计图,包括:面积图(Area)、条形图(Bar)、列形图(Column)、线形图(Line)、饼图(Pie)、散点图(Scatter)、堆积图(Stacked)以及上述图形的三维形式。
10.3.9 OLE 2.0风格
OLE 2.0风格的数据窗口既能够显示非数据库数据(比如Word文档),也能够显示数据库中的BLOB(二进制大对象)列。
10.3.10 超文本(RichText)风格
超文本风格的数据窗口能够处理超文本数据,它可以利用Windows系统的字体、字型、颜色等属性以丰富多采的形式显示与编辑超文本,并且能够将数据库中的数据插入到超文本文档中。
10.3.11 复合(Composite)风格
复合风格的数据窗口没有自己的数据源,它通过特殊方式将其它数据窗口对象组合起来,从而创建形式更复杂的数据窗口。
数据源决定了数据窗口对象获取数据的方式。PowerBuilder支持五种数据源:
10.4.1 快速选择(Quick Select)
Quick Select是最简单的一种数据源,它允许开发人员从一个表或与该表有外部键关联的表中选择一个或多个列。Quick Select数据源定义出一条简单的Select语句,这条语句中可以指定选择的列、查询条件、以及排序方式,但不支持分组、计算列、提取参数等复杂的SQL Select功能。
10.4.2 SQL选择(SQL Select)
以可视化的方式建立SQL Select语句,SQL Select语句的所有细节均能通过该界面创建,SQL Select数据源能够从多个表中选择列、指定查询条件、对数据排序、分组、增加计算列、定义提取参数等,主要用于从一个或多个表中建立复杂的SQL Select语句,当然也能生成各种各样的计算列;
10.4.3 查询(Qurey)数据源
Query数据源选取Query对象作为数据源,Query对象实际上就是条保存在应用库中的SELECT语句。定义Query对象的目的是为了在多个数据窗口中重复使用相同的SELECT语句而避免反复定义。与定义SQL Select数据源相似,Query对象中可以定义检索参数、指定排序方式和分组方式、定义检索条件等。
10.4.4 外部(External)
External数据源从外部文件(比如文本文件)中提取数据,它是数据窗口唯一不需要连接数据库的数据源,其数据或由应用程序生成、或由用户输入。定义外部数据源的数据窗口时,必须定义它的每一列及其数据类型。
10.4.5 存储过程(Stored Procedure)
Stored Procedure数据源就是把存储过程作为数据源。存储过程(StoredProcedure)是一组保存在数据库中的、经过预先编译和优化的、执行数据库操作的SQL语句。与其它SQL语句相比,存储过程的执行效率更高(省掉了每次执行时的编译与优化时间)。Stored Procedure数据源只在当前连接的数据库支持存储过程时才会出现在“New DataWindow”对话框中。
除了前面介绍的各种手段定义数据窗口的数据和改进数据窗口的性能外,我们还可以在数据窗口对象中放置其它对象,以进一步增强数据窗口的功能。能够放置到数据窗口对象上的对象包括:静态文本框(Static Text)、计算列(Computed Field)、位图(Picture)、统计图(Graph)、嵌套报表(NestedReport)、OLE对象、以及各种绘图对象(直线、椭圆、矩形、圆角矩形)等。这些对象可以通过在数据窗口画笔工具栏的下拉对象图标列表或“Object”菜单中选择后放置到数据窗口对象中。
10.5.1 增加与删除数据窗口中对象
初步设计的数据窗口经过适当的修改可能更符合应用程序的需求,比如有个修改人员档案的数据窗口,人员编号对用户来说意义不大,它无须修改,但人员编号是主键,为了让数据窗能够自动修改数据库,通常要把这个主键保留在数据窗口的Select语句中,而在数据窗口对象中把人员编号列删除。删除了某列后发现操作失误,这也无关紧要,再把它增加到数据窗口对象中也就解决问题了。
1.删除某个列对象
删除数据窗口对象中的列对象的步骤为:
⑴在数据窗口画笔工作区中选择要删除的列;
⑵按Delete键或单击画笔工具栏上的“Clear”图标,选中列即被删除。
2.在数据窗口中增加列对象
在数据窗口对象中增加列对象的步骤为:
⑴单击数据窗口画笔工具栏图标上的箭头,系统打开对象图标列表,通过单击选择列对象图标;
⑵单击数据窗口中要放置该列的位置,系统显示“Select Column”对话框;
⑶在这个对话框中通过单击选择所需列,然后单击“OK”按钮关闭对话框;
⑷选择的列即被放置到数据窗口对象中。
在数据窗口中增加其它对象的方法与此类似,可参照使用。
10.5.2 静态文本对象
在生成数据窗口时,根据数据源的不同,系统自动在数据窗口中添加一些标题或标签,用于说明数据的作用,这些标题或标签都是静态文本对象。需要时开发人员可以在数据窗口中增加额外的静态文本对象。
静态文本对象的放置方法是:通过单击在数据窗口画笔工具栏的下拉对象图标列表中选择静态文本图标,然后在希望放置该对象的地方单击。放置了静态文本对象后,在文字风格栏中可以修改它的标题、对齐方式、字体、字型、文字大小等。如果还想改变它的其它属性,那么双击该对象,在属性对话框中进一步设置。修改静态文本对象的标题时,可以通过在标题中加入回车(~r)换行(~n)字符而使静态文本对象的标题多行显示。
例如,某个静态文本对象的标题修改为:“这是~r~n静态文本对象~r~n标题”,该标题将显示为三行。
10.5.3 计算域
在定义数据窗口对象的数据源时,我们能够定义一个计算列,此时计算列的数值在数据检索时就被计算出来,在下次检索之前,计算列的值保持不变。计算过程由数据库管理系统承担,数据窗口只不过按要求的格式显示出来。但有时候我们希望计算列的内容随用户数据的输入而调整,此时就需要在数据窗口中定义计算列(这种计算列我们把它称作计算域),这时,计算任务在客户端完成。