前往Shuct.Net首页

Shudepb PB反编译专家长时间以来,为业内同类软件事实上的唯一选择.细节,彰显专业.态度,决定品质.

关于PowerBuilder的搜索

PowerBuilder应用开发系列讲座(10) | 巧巧电脑网络 - www.qqread.com 首页 资讯 电脑入门 操作系统 上网 办公 技巧 硬件 软件 网络 图像 多媒体 程序 数据库 网页网站 网游 安全 加密 企业 .Net技术VBVisual C++/MFCC/C++DelphiC++BuilderJavaPowerBuilder其他语言文件格式荟萃数据结构&算法分析 电脑频道 > 程序开发 > PowerBuilder PowerBuilder应用开发系列讲座(10) 巧巧电脑网络 2005-12-06 中国计算机世界出版服务公司 张健姿 收藏此文 大 中 小 分享到 QQ空间 人人网 开心网 豆瓣 新浪微博 腾讯微博 更多 PowerBuilder只能同时对一张要修改的表进行管理,所以我们不能一下子指出所有表中所有要修改的列。 p>  在开发中,我们有时会遇到用一个DataWindow来表现数据库中多个表中数据的情形,这时DataWindow用到的SQLSelect语句是一个多张表连接的视图。当我们对这样一个DataWindow中的数据进行修改并提交数据库时,我们将会发现我们并不能简单地使用一条dw.update()来实现同时对数据库中多张表的修改。   事实上,系统在DataWindow中提交数据库并生成UPDATE语句时所根据的仍然是图一这个窗口。在以前的章节中我们曾介绍过利用这个窗口中一些不同的选项实现数据库的并发控制,这里我们再讲一下这个窗口中的选项对生成UPDATE语句的其它影响。   当我们调用UPDATE函数时,这个窗口中有四个域将被涉及:Where Clause for Update/Delete where子句的生成依据。这个选项主要是用来进行并发控制的,这里不再赘述。Update table Columns可修改的列。这是一个我们将遇到麻烦的地方。PowerBuilder只能同时对一张要修改的表进行管理,所以我们不能一下子指出所有表中所有要修改的列。在这里我们只能指出某一张表中要修改的列,以后在程序中用Modify语句依次指定其它每一张表中要修改的列。Table to Update将要修改的表。PowerBuilder只支持一张表的修改,所以我们也只能在这里只指定其中的某一张表,其余的表也将要利用Modify语句修改。Unique KeyColumns唯一键的列。这也是我们要注意的地方,因为PowerBuilder生成的UPDATE语句只是在要修改的表名中使用DATABASE.OWNER.TABLE这样的全称,而引用某列时只是简单指出列名,而不用DATABASE.OWNER.TABLE.COLUMN这样的全称。所以,如果我们这里用到的唯一列标识不属于上面"TabletoUpdate"中定义的表的列,这一条SQL语句将出现语法错误。   PowerBuilder在DataWindow中产生的UPDATE语句和DELETE语句如下: UPDATEdatabase.owner.table SETcolumn=somevalue,WHEREUniqueKeyColumn=somevalue; DELETEFROMdatabase.owner.table WHEREUniqueKeyColumn=somevalue;   在一条SQLUPDATE和DELETE语句中,所有引用的列名均不使用列的全称,因此对列名的确定完全由updatetable来决定,在UPDATE语句中所有修改属性均设为TRUE,而且用户进行过修改的列都将加到SET子句中。PowerBuilder根据用户对"Where Clause for Update/Delete"的选择形成WHERE子句,由于系统自动地将多个表中所有的列都加到SET子句和WHERE子句中,而PowerBuilder又是根据用户指定的updatetable来确定列,因此我们显 俏薹ǖ玫揭桓鲎既返腟QL语句的。我们来看这样一个实例(本表可以在PowerBuilder DEOM数据库中得到,注意:如果我们希望某一列不被修改,我们可以在DataWindow画笔中将TABorder设置为0): CUSTOMER.Customer-ID=101 CUSTOMER.FirstName=Michaels CUSTOMER.LastName=Devlin CUSTOMER.Address=3114PioneerAvenue SALES-ORDER.ID=2001 SALES-ORDER.order-date=09/14/94 我们将其改为: CUSTOMER.Address=1905MapleAvenue SALES-ORDER.order-date=12/11/94   如果我们只是用dw.update()语句来形成UPDATE语句,PowerBuilder将自动构造成这样的一条语句:   上述三条SQL语句在提交数据库时都将产生"Invalidcolumnname‘id"的错误,很明显,"id"这一个字段并不在custumer这一张表中。此外SALES-ORDER这张表的内容并没有进行修改。   为真正实现对多表数据的修改,我们可以编写这样一个函数f-MUpdate()。 integerf-MUpdate(a-dw,as-update-table) a-dw-DataWindow名称;as-update-table-将要修改的表名的全称。 Longll-ipos,ll-maxcol,i Stringls-colnam,ls-mod,ls-table-name,ls-err,ls-updatekeyll,ls-qualifier="" //从传递的参数中分离出表名和域名 ll-ipos=Pos(as-update-table,"?",l) If(ll-ipos>0)Then ls-qualifier=Left(as-update-table,ll-ipos) as-update-table=Mid(as-update-table,&ll-ipos+1) ll-ipos=Pos(as-update-table,"?",l) If(ll-ipos>0)Then ls-qualifier=ls-qualifier+& Left(as-update-table,ll-ipos) as-update-table=Mid(as-update-table,&ll-ipos+1) endIf EndIf //得到这个DataWindow包含列的数量 ls-err=a-dw.object.DataWindow.Column.Count ll-maxcol=Integer(Is-err) If(ll-maxcol<1)Then Return1 EndIF   //确认DataWindow中的每一列是否属于要修改的表中的列, 如是将其update属性设为Yes,否则为No. FORi=1Toll-maxcol ls-mod="#"+String(i)+".Name" ls-colnam=a-dw.Descibe(ls-mod) ls-table-name=a-dw.Descibe(ls-colnam+&".dbName") ls-table-name=Left(ls-table-name,&) (Pos(ls-table-name,"?",l)-l)) If(Upper(as-update-table)=Upper(ls-table-name))Then ls-mod=ls-colnam+".Update=Yes" Else //如果该列不在可修改的表中, //而其为主键的属性为TRUE //将其列名存在ls-updatekey[]中 //并将其主键的属性设为FALSE。 //由于PB不保留列的全名,我们不能。 //保留非修改表的键的名称。 //所以我们将其保留在数组之中,以便其恢复 If(Upper(a-dw.Descibe(ls-colnam+".Key"))="YES")Then ls-updatekey[UpperBound(ls-updatekey[])+1]=ls-colnam ls-mod=ls-colnam+".Key=No" If(a-dw.Modify(ls-mod)$#@60;$#@62;"")Then Return-2 EndIf EndIf ls-mod=ls-colnam+".Update=No" EndIF //确认修改是否成功 If(a-dw.Modify(ls-mod)$#@60;$#@62;"")Then Return-2 EndIF NEXT //将修改表名设置为全称 a-dw.object.DataWindow.Table.UpdateTable=ls-qualifier+as-update-table //修改DataWindow If(a-dw.Update(TRUE,FALSE)$#@60;$#@62;1)Then Return-5 Else //将DataWindow恢复为其原来的状态 ll-maxcol=UpperBound(ls-updatekey) FORi=ltoll-maxcol ls-mod=ls-updatekey[i]+".key=Yes" If(a-dw.Modify(ls-mod)$#@60;$#@62;"")Then Return-6 EndIf Return0 EndIf   调用这一函数时应遵守以下规则: 保证数据的参照完整性,应当先修改父表后修改子表; 在DataWindow画笔中为每张表建立唯一主键; 在图一窗口中,将该DataWindow设为允许修改; 指定所涉及的任意一张表为修改表,表中的任一列为可修改列。以保证DataWindow有修改权,这样我们调用的函数就可以覆盖这一设置。不要将并发控制选为keyandmodifiedcolumns,这个函数无法在这一条件下工作。将表名的全称DATABASE.OWNER.TABLE传递给这个函数,特别是在这个DataWindows是对多个数据库进行操作时。   在上例中,我们可以这样调用这个函数 f-MUpdate(dw-l,"dbo.sales-order") f-MUpdate(dw-l,"dbo.customer")拓展阅读:PowerBuilder数据窗口编程技巧十则PowerBuilder取得巨大成就的原因就是有Datawindow对象,DataWindow是具有功能强大和灵活多变的特点,本人用PowerBuilder开发过一段时间后,总结出一些技巧,以供广大的PB开发者借鉴使用。五.如何在DataWindow中快速删除多行在开发过程中可能经常有要进行多行删除的操作。 分享到QQ空间新浪微博人人网腾讯微博豆瓣 收藏此文大中小打印关闭 上一篇:PowerBuilder应用开发系列讲座(12) 下一篇:PB中实现图片按钮mousemove事件 相关文章阅读: PowerBuilder数据窗口编程技巧十则如何发布独立的PowerBuilder应用PowerBuilder应用开发系列讲座(9)用PowerBuilder开发WEB数据库Sybase推出面向.NET平台的PowerBuilder 11 相关专题阅读: (5467篇文章)Wlan组网----家庭专题 本类最热图文 最新咨询 PowerBuilder编程过程中的数据窗口函数用PB做一个通用右键菜单循序渐进学习Power Builder 6.0(2-1-4)PowerBuilder数据窗口编程技巧十则循序渐进学习Power Builder 6.0(循序渐进学习Power Builder 6.0(3-0)更改Oracle数据库表的表空间(1)PowerBuilder与EXCEL的巧 最新软件应用 权限设计的探讨PB下动态SQL语句的应用PB通过OLEObject使用WordPowerBuilder程序中的并发控制如何制作PSR文件浏览器循序渐进学习Power Builder 6.0(PowerBuilder菜单属性的修改让PowerBuilder制作查询系统的界面更加酷 一周阅读排行 >>更多排行 标题 点击数 1226在PB程序中实现ODBC数据源的添加1195用PowerBuilder开发多媒体播放器1186PowerBuilder中数据窗口的精确1162PowerBuilder应用开发系列讲座(15)1154自适应屏幕分辨率的基类窗口1125Windows映射模式及相关问题的解决1123循序渐进学习Power Builder&nbsp1096循序渐进学习Power Builder&nbsp 推荐电脑图文 搜索您感兴趣的内容 输入您的搜索字词 提交搜索表单 Web qqread.com 巧巧电脑网络编辑信箱 告诉我们您想看的专题或文章