PowerBuilder(以下简称PB)是Powersoft公司(已被Sybase收购)推出的基于客户机/服务器体系结构的强有力的开发工具自问世以来深受开发人员的好评Datawindow是PB中获取专利技术的控件它对数据的处理方法相当简洁数据窗口能处理各种显示格式进行报表打印对复杂的嵌套报表同样处理自如
数据窗口的处理机制首先是根据所需的显示方式将数据源表中的域设计好在运行时将所要的数据从数据库服务器上下载到客户机上处理然后将更改后的数据进行提交(Commit)或回滚(Rollback)这种处理机制大大降低了数据的传输量减轻了网络的负担也提高了数据的处理速度充分利用数据窗口的特点可达到事半功倍的效果但是如果有些问题不加注意就会出现意想不到的错误
几个函数
AcceptText()
AcceptText()函数的功能是将数据窗口当前编辑的数据转移到数据窗口的缓沖区中程序通常在关闭窗口及其他情况下判断是否改变了当前数据如果已改变数据应提示用户保存这就杜绝了用户在偶然的情况下丢失更改数据的现象一般用ModifiedCount和DeletedCount函数判断数据是否改变
PB在处理数据窗口时对应开辟了四个数据缓沖区分别为Primary BufferDeleted BufferFilter BufferSortBuffer其中Deleted Buffer存放被删除的记录Filter Buffer存放被过滤的记录Sort Buffer存放排序的记录Primary Buffer存放其他记录函数ModifiedCount从Primary and Filter Buffers中取数据进行判断DeletedCount则从Deleted Buffer中取数据进行判断
PB在接受用户输入时设置了一个浮动编辑框用户输入或更改的内容并不直接进入Primary Buffer而是在用户输入完后进入下一个域时PB首先对它进行有效性检测通过后转入Primary Buffer如果只改变一项数据就关闭窗口则相关数据并没有进入Primary Buffer系统判断ModifiedCount()为所以不会提示保存数据用AcceptText()函数就可以将浮动编辑框中的数据转入缓沖区中在相应的程序段前加上Accepttext()问题就解决了
FindRequired()
在实际应用中经常需要限制表中一些域的属性例如银行客户表中账号就不能为Null在提交数据前检查是否将必须输入的数据都赋值是一个很好的编程习惯FindRequired函数可以解决此问题它通过对数据窗口中数据的检查将数据窗口中域的属性为Required而并未赋值的域(包括相应的行列)找出来
为了利用此函数在构造数据窗口时就要注意将表中具有NOT NULL属性的数据列设为Required(方法为:在数据窗口相应域上按鼠标右键或双击左键弹出Column Object 框选Edit页将Required前的框选中按Ok钮即可)在相应事件中插入下列程序:
longror= //行数赋
integercolnbr= //列数赋
string colname //用来存储列名
mle_requiredText = //窗口中的多行编辑控件用来存储找到域的行列号
DO WHILE row <>
colnbr++ //继续找下一列
IF dw_FindRequired(Primary!row colnbrcolname FALSE) < THEN EXIT
//若程序出错则返回
IF row <> THEN
mle_requiredText = mle_requiredText + String(row) + ~t &+ colname + ~r~n //保存查出的行列号
END IF
//当ROW返回为 则意味再没有查出跳出循环
LOOP
程序执行完后多行编辑框中显示的为出错的地方用户根据提示可以轻易地更改
FindRequired函数中的RowColnbr参数能自动增加或重置Colname用来存放列的字符名
数据的突出显示及保护:程序运行中用户希望显示的数据具有明显的区分例如学生的成绩(不及格的分数要用红色显示)有些数
据必须只能显示不能让用户修改;还有些数据在有些时候可以修改有些时候不能修改等以上情况可归结为两点:
数据的突出显示
数据窗口应该能使用户很快找到他们想要的信息以颜色区分既满足用户的习惯又不占系统资源实现起来也很简单以学生管理为例要求成绩低于分的以红色显示其他不变方法是:在数据窗口中对应成绩的列(例如/CJ)上双击鼠标左键或单击鼠标右键弹出Column Object对话框选取Expressions页在Color后的框中输入:
if(cj<rgb()rgb())此句表示当成绩小于则显红色否则灰色显示
IF语句只可能有两种选择如果要更多的条件判断则必须用CASE语句例如成绩大于等于用蓝色小于用红色其他用绿色则应该用以下语句:
Case(cjWHEN IS >= THEN RGB() WHEN IS < THEN RGB() E
LSE RGB())
我们还可以输入更加复杂的公式
图形是最好的说明语言为了更好体现数据的直观性可以采用条件位图的方法之所以称为条件位图是因为它随数据的性质而决定是否显示用可以在上述的成绩管理数据窗口的前面加上一个图片双击位图弹出Picture Object对话框选Expressions页在Visible右的编辑框写入if(xb=)此句的意义为当性别为(女)时蝴蝶出现否则蝴蝶消失程序运行起来相当直观读者可以触类旁通充分利用列的属性使用户的界面更加友善漂亮
数据的保护
有很多情况需要对数据进行保护(即只能显示而不允许修改)学生查询成绩时就是这种情况进行数据保护的方法有很多第一种是双击要保护的列弹出Column Object选取Edit页将Display Only框选中;第二种将要保护的列的TabOrder置则此列得不到焦点当然就无从修改;第三种是从根本作起选取Rows菜单再选取Update Properties弹出Specify Update Properties对话框将Allow Updates设为空这样即使用户更改了也无法更新数据库使更改毫无意义
以上情况都是事先已经确定需要保护的数据如果有些数据要保护有些不要保护则以上的方法就无法实现例如合同台账管理:对于一个没有实施的合同可以更改对于一个已经实施的合同则必须加以保护这需要用列的保护属性来实现方法如下:
双击每一列弹出Column Object对话框选取Expressions页在Protect后的框中写入:if(sfss=)其中sfss为表示合同是否实施如果实施(值为)则进行数据保护否则可以更改此方法可以在程序运行中动态控制数据的保护方式
数据窗口的多表更新
在处理数据时经常需要将几个表中的数据放入一个数据窗口中进行处理一般情况下多表数据源的数据窗口只能用于数据的检索而不能更新想要更新数据则采用的方法为:创建数据窗口(将各个表的主键包括进去)修改Taborder使数据能被更改然后对应各个表创建相应的隐含数据窗口隐含数据窗口的数据项和主数据窗口中对应表的数据项应完全一致存盘时将主数据窗口中的数据拷贝到相应的隐含数据窗口中去逐个保存各隐含数据窗口中的数据即可由此看来第二种方法更容易理解和接受实现起来也很简单