【PB】数据窗口的修改属性

数据窗口对象非常强大的原因之一就是能够很容易地修改数据库。当用户修改了数据窗口中的数据,插入了新的数据行或者删除了数据行以后,只要调用update()函数就可以将修改了的数据保存到数据库中。但是,这需要一个前提,就是必须设置数据窗口的修改属性。

数据窗口要修改数据表,首先清楚数据窗口只能修改一个数据表。当数据窗口的数据来源于不止一个数据表时,可以用脚本控制数据窗口的修改属性来对数据表逐个进行修改,这种技术在后面有关章节介绍。下面介绍一次修改一个数据表的设定方法。

当数据窗口是用来接受用户的手工录入数据时,应该设置两方面的属性才能确保数据窗口能够用来修改数据表。一个是修改数据窗口的修改属性,另一个是用户可以修改的字段的相关属性值。

首先介绍数据窗口的修改属性的设置。在数据窗口画板中,使用菜单项Rows->Update Properties,弹出如图6-41所示的窗口。


   数据窗口的所有修改属性都集中在该窗口中。如果数据窗口对应的数据表中定义了主键或者惟一性索引,则数据窗口创建时缺省的就是允许修改,并且正确设置了所有的修改属性。否则就需要手工进行设置。前面介绍过,当增加、删除或者重新选择了字段时,PowerBuilder将数据窗口的修改属性置为不允许,这时也应该进行手工设置。

首先应该选中Allow Updates选项,只有选中该选项,才允许继续进行其他属性的设定。在Allow Updates右面的下拉列表框叫做Table to Update,只能在该下拉列表框中选择一个,并且必须选择一个数据表名,选中的表就是要被更新的表。

选中了Allow Updates属性后,接下来就要指定在数据窗口中哪些列被更新。在Updateable Columns列表框中用鼠标单击被更新的字段。当数据窗口中的字段来自不止一个数据表时,这时一定要选择同一个表中的字段,因为一个数据窗口一次只能更新一个数据表。当数据窗口中增添了字段时,新增添的字段往往是不允许修改的,一定要在该列表框中选择该字段。

选择了可以修改的字段后,就应该在Unique Key Columns(s)列表框中选择惟一标识一行的列。如果在定义数据表时定义了主键,单击右面的Primary Key按钮可以在该列表框中选中主键。

Where Clause for Update/Delete组框中包含了三个选项,用来配置如何在Update和Delete SQL语句中构造where字句的。这三个选项为数据库加锁提供了三种不同的选择。当某行被选中时,用户可以通过DataWindow对象来提供完整性保护,可以防止其他用户检索该行。这三个选项是:Key Columns、Key and Updateable Columns和Key and Modified Columns。下面分别详细介绍。

            1.Key Columns

当开发单用户应用程序或者用户都以加锁方式访问数据库时可以选中该选项。该选项表示数据窗口只使用在Unique Key Column(s)列表框中指定的惟一列进行数据更新。使用这种方式来修改数据库,并发性很高,不同的用户都可以并发地访问数据库,但是数据的完整性却非常差。因此要保证数据完整性,只有在单用户应用程序或者加锁访问方式下才使用这种修改方式。

例如,在add_book(通讯录)数据表中定义了5个字段,id为主键,name、address、telephone、ICQ四个字段为可修改字段,某数据窗口包含这5个字段并且使用Key Columns更新数据库。有如下一条数据:

id230602710327574

name朱义

address胜利油田

telephone945-8557021

ICQ39661314

假设甲用户修改了这条数据,将name改为“郭宝利”,数据窗口产生如下的UPDATE语句:

     update add_book

         set name = "郭宝利"

                   where id = "230602710327574";

其中的where字句中只包含在Unique Key Columns中指定的字段id,用该字段来确定要修改数据库中哪行数据。该update语句将成功执行。如果乙用户要将address字段修改为“冀东油田”,甲、乙用户同时并发修改id为230602710327574的数据,都会修改成功,但会产生如下的数据:

id230602710327574

name郭宝利

address冀东油田

telephone945-8557021

ICQ39661314

两个人同时修改了一条记录,本来地址是胜利油田的郭宝利却成了冀东油田的了。

2.Key and Updateable Columns

这种修改方式是缺省的修改方式,它用主键列和可以修改的列来创建where子句,具有很高的数据完整性,但是并发性却不是太好。推荐使用这种修改方式。

像上面例子一样,如果甲用户做修改操作,保存数据时将产生如下的SQL语句:

update add_book

         set name = "郭宝利"

where id = "230602710327574"

  and name = "朱义"

  and address = "胜利油田"

  and telephone = "945-8557021"

  and ICQ = "39661314";

该SQL语句中的where子句包含了主键id和所有的可修改字段。如果乙用户是在甲保存修改了的数据之前检索的数据,当乙用户要将address修改为“冀东油田”时,产生如下的SQL语句:

update add_book

         set address = "冀东油田"

where id = "230602710327574"

  and name = "朱义"

  and address = "胜利油田"

  and telephone = "945-8557021"

  and ICQ = "39661314";

此时,由于甲用户已经修改了数据,将name改成了“郭宝利”,所以乙用户的where子句中指定的数据在数据库中已经不存在了,乙的修改不成功,从而保证了数据的完整性。

            3.Key and Modified Columns

该方法是上面两种方法的折衷,当不同的用户并发修改同一行数据的不同字段时,都能成功修改,所以它的并发性有了一定的限制,数据的完整性比第一种修改方式有所提高。这种修改方式使用主键和数据发生了变化的列来产生where子句。同样,在上面的例子中,甲用户要将“朱义”修改为“郭宝利”会产生如下的SQL语句:

update add_book

         set name = "郭宝利"

where id = "230602710327574"

  and name = "朱义";

这时的where子句中只包含主键id和要修改的字段name。如果此时乙用户并发修改数据,要将id为“230602710327574”的用户的address修改为“冀东油田”,乙用户也会成功修改。

            4.时间标记

如果数据库管理系统支持时间标记,则可以在DataWindow对象的结果集中包含时间标记来获得最大的数据完整性。PowerBuilder将自动为更新和删除操作的where子句加上时间标记,而不显示在可更新列的列表中。Oracle、SQL Server完全在服务器上处理时间标记,在DataWindow中不要求有额外的工作。

            5.Key Modification

该组框用来指定当用户修改了主键时,数据窗口如何来更新数据表中的主键字段。有两种选择,Use Delete then Insert和Use Update。

       第一个选项是先删除原有主键值,然后再使用新的主键值插入一个完整的行。使用这种更新主键的方式可以减少组织数据的工作量,但在数据库中各个数据表之间存在父子制约关系,并且依赖该主键的外部键被指定为级联删除时,操作就不会成功的。因为级联删除方式要求当依赖主键的外部键有数据时就不能删除主键。

       当DBMS允许更新主键列时,可以使用该选项,该选项直接修改主键值,所以防止了级联删除带来的操作不成功的问题。

            6.Identify Column

该下拉列表框用于为下拉列表框中所指定的列(通常是主键列)生成序号,当且仅当DBMS支持序号生成时该作用才有效。

当正确进行了上述所有操作后,单击OK按钮即完成了修改属性的设置。如果数据窗口允许手工录入数据,接下来就应该设置可修改字段的相关属性了。主要包括如下属性:

l      字段的Tab Order值。

l      字段的Protect属性。

l      字段的DisplayOnly属性。

l      字段的Visible属性。

上述属性前3个中任意一个都可以让用户无法修改字段中的数据;最后一个属性决定字段是否可见,不可见的字段不管其他属性如何设置,用户都无法修改字段中的数据。

首先介绍如何设置字段的Tab Order值。使用菜单项Format->Tab Order可以在Design窗口显示各字段的当前Tab Order值,用鼠标单击要修改Tab Order值的字段,然后手工将Tab Order值改为非0即可。在设置Tab Order时要注意三点:

(1)用户可以手工修改的字段,其Tab Order值不能为0。

(2)在数据窗口修改属性中,不允许修改的字段其Tab Order值应该为0,或者其Display Only属性应该选中。

(3)Tab Order取值决定字段获得焦点的顺序。在数据窗口中使用Tab按钮在字段间切换时,Tab Order取值小的首先获得焦点,最大的最后获得焦点。

字段的Protect属性设置字段是否被保护。如果该属性设置为1,则不允许用户修改字段中的数据,即使Tab Order设置为非零。字段的DisplayOnly属性决定字段中的内容是否只用来显示,当属性设置为1或者True时,字段中的数据不允许用户修改,不管其他几个属性是如何设置的。Protect属性只能使用表达式,选中字段后在属性视窗General属性中单击右侧的红色小按钮(如果已经有表达式,则按钮为绿色),进入到表达式输入对话框,输入该属性的表达式即可。比如,设置用户不能修改字段id原来的数据,可以输入如下的表达式:

if(isRowNew(),0,1)

   字段的Display属性在属性视窗Edit中,选中该选项表示该字段中的数据只用来显示,不允许用户修改。该属性不能使用表达式。在PB中,编辑类型的控件都有该属性,并且属性的作用也是相同的。

       当字段的Tab Order值为0时,肯定不能获得焦点,但是非0时也不一定能获得焦点,还得看字段的Protect属性是否设置为1;当字段的Tab Order值不为0,Protect属性不为1并且字段的Visible属性为True时,肯定可以获得焦点。DisplayOnly属性和焦点是否能够获得无关。
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据窗口源码介绍 (举例见d_dbit_example.srd,测试数据库为PB自带的EAS Demo DB V120) 1.第一行:release 12; 数据窗口所属PB的版本号,如果想把高版本的datawindow导入低版本的PB中要修改此数字; 2.datawindow()行 通常用修改processing属性,可以把你的数据窗口由grid变成freeform或其它类型 例:freeform:0 grid:1 3.header()行 可以整行复制粘贴,并命名为header[1],header[2],这样可以让数据窗口有多个header 4.table()行 这里全是定义的数据属性,是setitem,update,object.data等方法访问的根源 如果存在table()里的column,数据窗口里可以不存在任何对象,仍然可以访问数据窗口数据 如果想创建一个空的数据窗口,可以只定义: release 12; table() 5.table(column行) 是第几个column,它的ID就是多少,其中也定义了是否可以update时和更新到数据表的字段名 6.table(retrieve行) 检索数据时使用的SQL语句,可以通过setsqlselect或modify("table.sqlselect")方法去动态修改 修改后要重新定义数据窗口的更新属性 7.column()行 id即是对应table(column行)里的行次,名称(name)可以随便命名,也可以没有,则默认为table(column行)里的name 8.compute()行 计算列,可以通过表达式计算显示特定值(具体函数可以见共享里的画笔函数). 9.text()行 有时可以代替计算列; 通过定义text的表达式,可以实现一列中显示两个字段值,注意结果必须要转换成string类型(而column和compute则不行); 10.htmltable()行 按照格式导出(saveas)html文件,为了保证格式的完整,数据窗口的单位最好设置成pixels GenerateCSS='1' //保持格式及颜色 Border='0' //不要table边框 CellSpacing='0' //单元格无间距(此项在界面上经常设置不上) 注: (1)Grid生成<Table>标签,Freeform生成<DIV> + <SPAN>标签; (2)生成htmltable时,不知为何会在CSS中的开始自动加一个分号";",导致excel等浏览器打开不能正常显示格式; (3)band为foreground或background的对象导不出来,可以动态修改后再导出. 11.export.xml()行 定义导出xml文件的格式,并为模板保存名称 使用时一定要设置usetemplate值 12.import.xml()行 定义导入xml文件的格式,并为模板保存名称 使用时一定要设置usetemplate值 13.表达式介绍 略 14.其它也略

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值