一.数据窗口对象(Object)与数据窗口控件(Control)
数据窗口对象是利用PowerBuilder所提供的数据窗口绘图器所产生的对象,可以利用对象管理库(Library Painter)中看到数据窗口对象的存在。
数据窗口控件是窗口上许多控件中的一种,用来将数据窗口对象的数据显示在窗口控件上面,因为数据窗口控件是封装在窗口中的一个控件,所以
在对象管理库中看不到,数据窗口控件上面可以编写程序码。
在数据窗口上显示数据步骤:
(1)利用数据窗口绘图器绘制一个数据窗口对象(DataWindow Object)。
(2)利用窗口绘图器绘制一个窗口对象(Window Object),并且在窗口上放置一个数据窗口控件(DataWindow Control)。
(3)指定数据窗口对象(DataWindow Object)给窗口上的数据窗口控件(DataWindow Control)。
(4)将所要连接数据库的信息指定给交易对象(Transaction Object)。
(5)利用Connect指令连接数据库和交易对象。
(6)利用SetTransObject()函数连接数据窗口和交易对象。
(7)利用Retrieve()从数据库读取数据。
二.数据窗口对象(Object)的语法表示
1.获得数据对象的属性
(1)点状表示法(Dot Notation)
·数据窗口对象本身
数据窗口控件.Object.DataWindow.数据窗口对象本身属性
·数据窗口对象内的其它对象
数据窗口控件.Object.数据窗口对象内的对象.对象的属性
(2)Describe()函数
数据窗口控件.Describe(表示属性的字符串)
·数据窗口对象本身
表示属性的字符串 = "DataWindow.数据窗口对象本身属性"
·数据窗口对象内的其它对象
表示属性的字符串 = "数据窗口对象内的对象.对象的属性"
dwcontrol.object
dwcontrol.object.field
dwcontrol.object.datawindow.
2.数据窗口对象属性的改变
(1)点状表示法(Dot Notation)
·数据窗口对象本身
数据窗口控件.Object.DataWindow.数据窗口对象本身属性 = 新属性值
·数据窗口对象内的其它对象
数据窗口控件.Object.数据窗口对象内的对象.对象的属性 = 新属性值
(2)Modify()函数
数据窗口控件.Modify(表示属性的字符串)
·数据窗口对象本身
表示属性的字符串 = "DataWindow.数据窗口对象本身属性 = 新属性值"
·数据窗口对象内的其它对象
表示属性的字符串 = "数据窗口对象内的对象.对象的属性 = 新属性值"
3.有条件地改变字段属性
利用数据窗口对象内部的if()函数设置条件,格式:
if(条件子句,条件成立时的属性数值,条件不成立时的属性数值).
例:
ls_modstring = "Salary.Color = '0~tif(Salary > 5000,255,0)'"
dw_1.modify(ls_modstring)
其中~t前面的0表示为缺省值.
4.数据窗口对象的列
DataWindow的列可以用两种方式表示
(1)列名
(2)#列序号
遍历DataWindow的列时会用到#列号。
三.数据窗口对象的应用
1.数据来源(Data Source)
·Quick Select
·SQL Select
·Query
·External
·Stored Procedure
2.显示类型(Presentation)
(1)只能当报表显示
·Composite
·Crosstab
·Graph
·Label
·OLE2.0
(2)同时具有数据维护和报表显示的功能
·FreeForm
·Grid
·Group
·Tabular
·RichText
·N-Up
四.数据窗口控件的缓冲区
1.数据窗口控件的四个缓冲区:
·主缓冲区(Primary Buffer)
·删除缓冲区(Delete Buffer)
·过滤缓冲区(Filter Buffer)
·原始缓冲区(Original Buffer)
2.各缓冲区的数据
·主缓冲区保存显示在数据窗口控件中的所有数据行,检索及插入的数据存放在主缓冲区。
·当删除数据行时,被删除行从主缓冲区移到删除缓冲区,Update()将数据窗口的修改发送到数据库管理系统后,被成功删除的记录均从删除缓冲
区中清除。
·过滤缓冲区保存检索到原始缓冲区的行经过过滤放入主缓冲区后剩余的行。
·原始缓冲区保存数据窗口从数据库中检索出的原始数据。
dwbuffer: Primary! Delete! Filter!
保存数据时: 过滤缓冲区与主缓冲区一起生成Insert或Update语句,删除缓冲区用于生成Delete语句。
访问缓冲区使用 GetItem簇函数
GetItemString()
GetItemDecimal()
GetItemDate()
第四个参数设置为True可访问原始缓冲区。
3.行数表示函数
·主缓冲区行数: RowCount()
·数据被删除的行数: DeletedCount()
·过滤缓冲区行数: FilteredCount()
·数据被修改的行数: ModifiedCount()
4.编辑状态标志
·NotModified!
·DataModified!
·New!
·NewModified!
函数
GetItemStatus()
SetItemStatus()
GetNextModified(): 在指定缓冲区搜索下一个修改了的行。
5.数据窗口缓冲区内数据的读写
两种读取方式:
·函数表示法(function notation)
·点状表示法(dot notation)
(1)函数表示法
SetItem(): 将数据写入缓冲区
格式: 数据窗口控件.SetItem(行数,字段,数值)
·行数: 写入缓冲区的行数
·字段: 可以是数字(SQL语句中的字段排列顺序)或是字符串(字段名称)
·数值: 可以是任何类型数据.
GetItemX(): 读取缓冲区内的数据
格式: 数据窗口控件.GetItem(行数,字段)
·行数: 希望读出缓冲区的行数
·字段: 可以是数字或是字符串
·X: 表示不同的数据类型 GetItemNumber(), GetItemString()
(2)点状表示法
格式: 数据窗口控件.Object.(字句)
在Object后面可以接以下字句:
·保留字DATA
·字段名称
·[]内含行数数字或者是一个范围
·缓冲区(buffer): primary,filter或delete.
·数据来源(Data Source): Current和Original.
例: 主缓冲区内有两个字段dept_id和dept_name.
·读取dept_id字段的第一笔数据
li_id = dw_1.object.dept_id[1]
·读取第一行中的第二个字段的数据
ls_name = dw_1.object.DATA[1,2]
·读取dept_id字段的所有数据
li_array = dw_1.object.dept_id.CURRENT
·读取过滤缓冲区(filter buffer)内dept_id字段第一笔数据
li_id = dw_1.object.dept_id.Filter[1]
·读取从第二笔数据的第一个字段到第二笔数据的二个字段之间的数据
lstr_array = dw_1.object.DATA[2,1,3,2]
·读取整个第二笔的数据
lstr_dept = dw_1.object.DATA[2]
·读取主缓冲区内的所有数据
la_any = dw_1.object.DATA
·将dw_1数据窗口内主缓冲区的所有数据复制到dw_2数据窗口内主缓冲区内
dw_2.object.DATA = dw_1.object.DATA
·将dw_1数据窗口内主缓冲区的部分数据复制到dw_2数据窗口内主缓冲区内
dw_2.object.DATA = dw_1.object.DATA.Select
函数点状表示法比较
单笔数据读取: 使用GetItemX()函数会比使用点状表示法稍快.
多笔数据读取: 使用点状表示法比使用GetItemX()快很多.
6.用函数处理数据窗口缓冲区的数据.
·数据的读取
格式: 数据窗口控件.Retrieve()
·增加数据
格式: 数据窗口控件.InsertRow(行数)
参数为0表示增加到最后一笔
·删除数据
格式: 数据窗口控件.DeleteRow(行数)
参数为0表示删除当前所在行数据
·数据的排序
格式: 数据窗口控件.SetSort(排序条件字符串)
数据窗口控件.Sort()
·数据的清除
格式: 数据窗口控件.Reset()
·主缓冲区数据的行数统计
格式: 数据窗口控件.RowCount()
·过滤缓冲区数据的行数统计
格式: 数据窗口控件.FilteredCount()
·删除缓冲区数据的行数统计
格式: 数据窗口控件.DeletedCount()
·修改过的数据的行数统计
格式: 数据窗口控件.ModifiedCount()
·数据的复制
格式: 数据窗口控件.RowsCopy(开始行数,结束行数,来源缓冲区,目的数据窗口,插入目的缓冲区的行数,目的缓冲区)
·数据的移动
格式: 数据窗口控件.RowsMove(开始行数,结束行数,来源缓冲区,目的数据窗口,插入目的缓冲区的行数,目的缓冲区)
·数据窗口的滚动
格式: 数据窗口控件.ScrollToRow(行数)
用法: 将特定的一笔数据滚动到数据窗口显示范围内,并将这笔数据设成当前行数(Current Row),例:
dw_1.ScrollToRow(100)
五.数据窗口上的数据共享(Share Data)
1.数据共享的条件
选择字段的数目相同
选择字段的数据类型相同
选择字段的排列顺序相同
2.数据共享语法:
格式: 主数据窗口控件.ShareData(次数据窗口控件)
dw_emp_list.SetTransObject(SQLCA)
dw_emp_list.Retrieve()
dw_emp_list.ShareData(dw_empdetail)
只有第一个数据窗口需要运行SetTransObject()和Retrieve()
取消数据共享: ShareDataOff()
3.数据窗口函数对于数据共享的影响
(1)对于所有数据窗口都有影响
Retrieve() Update() InsertRow()
SetSort() GetRow() SetFilter()
Filter() ImportFile()
(2)只对单一的数据窗口有影响
Show() AcceptText() Resize()
Sort() SetRow() ScrollToRow()
六.数据查询的应用
1.数据的过滤:
·SetFilter(字符串): 设置过滤的条件
·Filter(): 根据SetFilter()所设立的条件进行过滤
条件字符串设为null,则用户可以自行设置条件字符串
2.Query状态的应用:
格式: 数据窗口控件.object.DataWindow.QueryMode = 'yes'
在Query的状态中,一共提供了24行空白允许用户输入查询条件
3.动态改变Where条件子句
可以利用Modify()函数动态更改数据窗口的SQL语句,在程序中有两种方式可改变Where条件子句:
·利用数据窗口的SetSQLSelect()函数
·直接读取DataWindow.Table.Select属性
(1)利用数据窗口的SetSQLSelect()函数
·须先连接数据库,调用SetTransObject()函数
·使用GetSQLSelect()函数得到原始的SQL语句
·将条件子句增加到SQL语句中,注意下列事项:
·如果原始SQL语句已有Where条件子句,必须用ADD增加条件
·如果原始SQL语句已有Order By子句,必须将Order By移到Where条件之后
(2)直接读取DataWindow.Table.Select属性
dw_1.object.DataWindow.Table.Select = ls_sql
dw_1.Retrieve()
七.数据窗口的错误处理方式
1.利用Embedded SQL发生错误时的处理:
检查transaction object中的SQLCode属性
SQLCode 意义
0 成功
-1 失败
100 没有合适的数据
2.利用数据窗口函数发生错误时的处理.
数据的保存: Update()
返回值 描述
1 成功
-1 失败
数据的读取: Retrieve()
返回值 描述
>=1 成功
0 没有适当值返回
-1 失败
3.DBError Event
在数据窗口的DBError Event中,在程序码的最后一列加上return 1,可以避免显示缺省的错误信息,然后再利用MessageBox()函数显示用户自定义
的中文错误信息即可.
八.数据仓库(DataStore)对象
1.数据仓库对象的特性
数据仓库对象与数据窗口控件的特性比较像,但数据仓库对象是不可视对象,在这个对象中可以放置一个数据窗口对象,可以将数据仓库想象成一
个看不到的数据窗口控件。
·数据仓库可以使用大部分在数据窗口控件中所提供的方法:
Retrieve()
Update()
InsertRow()
DeleteRow()
RowCount()
·不支持需要看到才能处理的函数
SetRowRocusIndicator()
GetClickedRow()
2.数据仓库的使用
(1)声明数据仓库变量
(2)创建数据仓库实例: Create
(3)指定数据窗口对象
(4)析构数据仓库实例 Destory
例:
DataStore ids_mystore
ids_mystore = Create DataStore
isd_mystore.DataObject = "d_reports"
......
Destroy ids_mystore