转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件使用 >> 常用软件 >> 正文
PowerBuilder应用开发系列讲座(10)         

PowerBuilder应用开发系列讲座(10)

作者:闵涛 文章来源:闵涛的学习笔记 点击数:658 更新时间:2009/4/24 21:43:38
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")


[办公软件]在sybase中插入图片、PDF、文本文件  [办公软件]安装Sybase ASE
[办公软件]linux指令大全(完整篇)  [办公软件]Linux新手入门常用命令大全
[办公软件]在RedHat Linux 9里安装gaim0.80  [办公软件]浅谈Linux 下Java 1.5 汉字方块问题解决方法
[办公软件]Linux程序员必读:中文化与GB18030标准  [办公软件]linux指令大全
[办公软件]制作Linux启动盘的四种方法  [办公软件]Linux文件系统的反删除方法
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · 办公软件  · 系统软件
    · 常用软件  · 聊天工具
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台