PowerBuilder的数据窗口 PowerBuilder(以下简称PB)是Powersoft公司推出的基于客户机／服务器体系结构的开发工具，自问世以来深受开发人员的好评。数据窗口是PB中获取专利技术的控件，它对数据的处理方法相当简洁，既能处理各种显示格式、进行报表打印，又能处理复杂的嵌套报表。 数据窗口的处理机制首先是根据所需的显示方式将数据源表中的域设计好，在运行时将所要的数据从数据库服务器上下载到客户机上进行处理，然后将更改后的数据进行提交(Commit)或回滚(Rollback)。这种处理机制大大降低了数据的传输量，减轻了网络的负担，也提高了数据的处理速度。
充分利用数据窗口的特点，可达到事半功倍的效果，但是如果有些问题不加注意就会出现意想不到的错误。
几个函数
1.AcceptText()
其功能是将数据窗口当前编辑的数据转移到数据窗口的缓冲区中。
程序通常在关闭窗口及其他情况下判断是否改变了当前数据。如果已改变数据，则提示用户保存，杜绝用户在偶然的情况下丢失更改数据的现象。一般用ModifiedCount和DeletedCount函数判断数据是否改变。
PB在处理数据窗口时，开辟了四个数据缓冲区，分别为Primary Buffer、Deleted Buffer、Filter Buffer、Sort Buffer， 其中Deleted Buffer存放被删除的记录，Filter Buffer存放被过滤的记录，Sort Buffer存放排序的记录，Primary Buffer存放其它记录。函数ModifiedCount 从Primary Buffer和Filter Buffer中取数据进行判断，DeletedCount则从Deleted Buffer中取数据进行判断。
PB在接受用户输入时设置了一个浮动编辑框，用户输入或更改的数据并不直接进入Primary Buffer，而是当用户输入完后进入下一个域时，PB首先对它进行有效性检测，通过后转入Primary Buffer。如果只改变一项数据就关闭窗口，则相关数据并没有进入Primary Buffer，系统判断ModifiedCount()为0，所以不会提示保存数据。
用AcceptText()函数就可以将浮动编辑框中的数据转入缓冲区中，在相应的程序段前加上AcceptText(),问题就解决了。
2.FindRequired()
在实际应用中经常需要限制表中一些域的属性，例如学生档案表中的档案编号不能为Null。在提交数据前通常需检查数据是否有效。FindRequired函数可以解决此问题，它通过对数据窗口中数据的检查，将数据窗口中域的属性为Required，而把未赋值的域(包括相应的行、列)找出来。
为了利用此函数，在构造数据窗口时就要将表中具有NOTNULL属性的数据列设为Required，在相应事件中插入下列程序：
long ror=1 //行数赋1
integer colnbr=0 //列数赋0
string colname//用来存储列名
mle_required.Text = “”//窗口中的多行编辑控件，
用来存储找到域的行、列号
DO While row < > 0
colnbr ＋＋//继续找下一列
IF dw_1.FindRequired(Primary!,row, colnbr,colname, FALSE)< 0 THEN EXIT//若程序出错则返回
IF row <> 0 THEN
mle_required.Text = mle_required.Text＋String(row)＋“～t”＆＋colname＋“～r～n” //保存查出的行、列号
END IF
//当row返回值为0则意味再没有查出，跳出循环
Loop
程序执行完后，多行编辑框中将显示出错的地方，用户根据提示可以轻易地更改。FindRequired函数中的Row、Colnbr参数能自动增加或重置，Colname用来存放列的字符名。
数据的突出显示及保护
程序运行中，用户希望显示的数据具有明显的区分，有些数据只能显示，不能让用户修改；还有些数据在有些时候可以修改，有些时候不能修改等。以上情况可归结为两点：
1.数据的突出显示
数据窗口应该能使用户很快找到他们想要的信息，以颜色区分既满足用户的习惯，又不占系统资源，实现起来也很简单。以学籍管理为例，要求成绩低于60分的以红色显示，其他不变。方法是：
在数据窗口中对应成绩的列上（例如cj列）双击鼠标左键或单击鼠标右键，弹出Column Object对话框，选取Expressions页，在Color后的框中输入：
if(cj<60,rgb(255,0,0),rgb(192,192,192))//当成绩小于60则显红色，否则灰色显示。
图形是最好的说明语言，为了更好体现数据的直观性，可以采用条件位图的方法。例如在上述的成绩管理数据窗口的前面加上一个图片，双击图片，弹出Picture Object对话框，选Expressions页，在Visible右的编辑框写入if(xb=‘0’,1,0)，此句的意义为当性别为0(女)时图片显示，否则消失。程序运行起来相当直观。读者可以触类旁通，充分利用列的属性使用户的界面更加友善、漂亮。
2．数据的保护
进行数据保护的方法有很多，第一种是双击要保护的列，弹出Column Object对话框，选取Edit页，将Display Only框选中；第二种将要保护的列的TabOrder置0，则此列得不到焦点，当然就无从修改；第三种是选取Rows菜单，再选取Update Properties，弹出Specify Update Properties对话框，将Allow U1pdates设为空，这样即使用户更改了也无法更新数据库。
以上情况都是事先已经确定需要保护的数据。如果有些数据要保护，有些不要保护，则以上的方法就无法实现。例如合同台帐管理，对于一个没有实施的合同可以更改，对于一个已经实施的合同则必须加以保护。这需要用列的保护属性来实现，方法如下：
双击每一列，弹出Column Object对话框，选取Expressions页，在Protect后的框中写入：if(sfss=‘1’,1,0),其中sfss为表示合同是否实施，如果实施(值为‘1’)则进行数据保护，否则可以更改，此方法可以在程序运行中动态控制数据的保护方式。
数据窗口的多表更新
在处理数据时，经常需要将几个表中的数据放入一个数据窗口中进行处理。一般情况下多表数据源的数据窗口只能用于数据的检索，而不能更新。想要更新数据则采用的方法为：
创建数据窗口(将各个表的主键包括进去)，修改Taborder使数据能被更改，然后对应各个表创建相应的隐含数据窗口，隐含数据窗口的数据项和主数据窗口中对应表的数据项应完全一致。存盘时将主数据窗口中的数据拷贝到相应的隐含数据窗口中去，逐个保存各隐含数据窗口中的数据即可。
(牟丛军）