祝愿大家身体健康!

 站点注册  找回密码
 站点注册

QQ登录

只需一步,快速开始

查看: 8405|回复: 6

[参考资料] 实现PowerBuilder数据窗口的多表更新

[复制链接]

[参考资料] 实现PowerBuilder数据窗口的多表更新

[复制链接]
ehxz

主题

0

回帖

58万

积分

管理员

积分
589551
贡献
在线时间
小时
2011-3-12 23:10:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?站点注册

×
  PowerBuilder的数据窗口对象是其特有的智能对象,其封装性好、功能强大、表现形式丰富多样,为此,许多MIS开发人员对PowerBuilder推崇备至,将其视为首选开发工具。

  一般情况下,一个数据窗口只能更新一个数据库表,但在MIS开发过程中,我们经常遇到这种情况:一个数据窗口中由两个或更多个数据库表作为数据源,并需要对其进行录入或修改,如何给出多表更新的通用解决方案就成为MIS开发人员不容回避的问题。笔者在某管理信息系统的开发过程中,尝试了几种双表更新的解决方法,选出一种比较好的方案,以飨读者。

  一、具体步骤

  1. 在数据窗口建立时,选择SQL Select,显示风格可以是Tabular、Grid或FreeForm中的任一种。选出两表需要录入或修改的列,其中两表的主键和非空列必须选中,确定选择条件,建立连接关系。

  2. 在选单“Rows/Update”中选择第一个表的全部数据项为可更新项。

  3. 把两表需要修改项的Tab Order数值改为非0值,使其在数据窗口中成为可修改项。

  为了使方案具有通用性,建立全局函数f_update_2table,有五个参数:dw_obj、table1、table2、key1、 key2,分别代表所要更新的数据窗口、两表表名和两表主键列名,其中dw_obj为DataWindow类型,其余四参数均为String类型。该函数返回值为Boolean型,返回True表示成功,返回False表示失败。

  二、函数思路

  1. 先针对第一个数据库表调用Update函数更新。注意参数的使用:第一个参数作用是控制数据窗口更新前是否强制性调用AcceptText(),在数据窗口更新前通过有效性验证;第二个参数是控制更新标志的复位,为True时更新标志复位,为False时更新标志不复位。

  2. 更改数据窗口的UpdateTable属性,使其指向第二个表,并把第一个表的各数据项Update属性和主键列的Key属性改为No,接着把第二个表的各数据项Update属性和主键列的Key属性改为Yes。

  3. 调用Update函数更新第二个表。

  4. 两表更新成功后,把两表的列属性、主键属性改回到初始状态,以便为下一次的两表更新调用做好准备。
三、程序清单

//====================================================================
// 事件: .f_update_2table()
//--------------------------------------------------------------------
// 描述:
//--------------------------------------------------------------------
// 参数:
//         value        datawindow        dw_obj       
//         value        string            table1       
//         value        string            table2       
//         value        string            key1         
//         value        string            key2         
//--------------------------------------------------------------------
// 返回:  boolean
//--------------------------------------------------------------------
//====================================================================

// ColName:数据窗口列名
// Name1[],Name2[]:两数据库表选中项列名
// n1,n2:两数据库表选中项数量
// i:循环计数器
// Columns:数据窗口总列数

String ColName,Name1[],Name2[]

Integer Columns,i,n1 = 0,n2 = 0

//下面程序:找出dw_obj的两表列名赋给Name1[],Name2[]

Columns = Integer(dw_obj.Describe("DataWindow.Column.Count"))

FOR i = 1 To Columns
       
        ColName = Upper(dw_obj.Describe("#"+String(i)+".Name"))
       
        IF Left(ColName,Len(Table1)) = Table1 And ColName <> Key1 THEN
               
                n1 = n1+1
               
                Name1[n1] = ColName
               
        END IF
       
        IF Left(ColName,Len(Table2)) = Table2 And ColName <> Key2 THEN
               
                n2 = n2 + 1
               
                Name2[n2] = ColName
               
        END IF
       
NEXT

// 下面程序:存储dw_obj,确定返回值(True:成功,False:失败)

IF dw_obj.Update(True,False) = 1 THEN
       
        FOR i = 1 To n1
               
                dw_obj.Modify(Name1[i] + '.Update = No')
               
        NEXT
       
        dw_obj.Modify(Key1+".Key=No")
       
        dw_obj.Modify("DataWindow.Table.Update Table = ' "+Table2+" ' ")
       
        FOR i = 1 To n2
               
                dw_obj.Modify(Name2[i]+".Update=Yes")
               
        NEXT
       
        dw_obj.Modify(Key2+".Key=Yes")
       
        IF dw_obj.Update() = 1 THEN
               
                COMMIT;
               
                FOR i = 1 To n1
                       
                        dw_obj.Modify(Name1[i]+".Update=Yes")
                       
                NEXT
               
                dw_obj.Modify(Key1+".Key=Yes")
               
                dw_obj.Modify("DataWindow.Table.UpdateTable=' "+Table1+" ' ")
               
                FOR i = 1 To n2
                       
                        dw_obj.Modify(Name2[i]+'.Update=No')
                       
                NEXT
               
                dw_obj.Modify(Key2+".Key=No")
               
                RETURN True
               
        ELSE
               
                ROLLBACK;
               
                RETURN False
               
        END IF
       
ELSE
       
        ROLLBACK;
       
        RETURN False
       
END IF
  四、调用方法

  假设窗口名为w_update,数据窗口为dw_1,数据库表名和主键名分别为t1、t2、k1、k2,放置“存盘”按钮,按钮Clicked事件的Script语句如下:

  dw_1.AcceptText()

  IF dw_1.ModifiedCount() > 0 or dw_1.DeletedCount() > 0 THEN

IF MessageBox("提示信息","是否存盘?",Question!,YesNo!)=1 THEN

   IF f_update_2table(dw_1,"t1","t2","k1","k2") THEN

   Commit;

ELSE

Rollback;

   END IF

   END IF

  END IF

    综上所述,可以看出,该方案具有很好的可扩展性,稍加修改即可解决多表作为数据源的数据窗口的同步更新问题。
共享共进共赢Sharing And Win-win Results
SYBASEBBS - 免责申明1、欢迎访问“SYBASEBBS.COM”,本文内容及相关资源来源于网络,版权归版权方所有!本站原创内容版权归本站所有,请勿转载!
2、本文内容仅代表作者观点,不代表本站立场,作者自负,本站资源仅供学习研究,请勿非法使用,否则后果自负!请下载后24小时内删除!
3、本文内容,包括但不限于源码、文字、图片等,仅供参考。本站不对其安全性,正确性等作出保证。但本站会尽量审核会员发表的内容。
4、如本帖侵犯到任何版权问题,请立即告知本站 ,本站将及时删除并致以最深的歉意!客服邮箱:admin@sybasebbs.com
swimchen

主题

0

回帖

6145

积分

论坛元老

积分
6145
贡献
在线时间
小时
2011-3-15 01:55:29 | 显示全部楼层
不要用这种方式
有时候可能会只更新一个成功,另一个失败
用影子DS数组,同步更新最好
共享共进共赢Sharing And Win-win Results
ehxz 楼主

主题

0

回帖

58万

积分

管理员

积分
589551
贡献
在线时间
小时
2011-3-16 13:57:55 | 显示全部楼层
楼上的,提供一下具体的方法吧。我这是从网上搜索来的,看上去是不可靠的{:lh_39:}
共享共进共赢Sharing And Win-win Results
swimchen

主题

0

回帖

6145

积分

论坛元老

积分
6145
贡献
在线时间
小时
2011-3-18 00:35:54 | 显示全部楼层
用影子模式,
两个DataStore(可更新),一个可视DataWindow,完成之后把数据带给DataStore
然后同步Update就可以了
ds_1.Object.xxx[1]=dw_1.Object.xxx[1]...........
第二个继续这么做
ds_2.Object.yyy[1]=dw_1.Object.yyy[1]
然后ds_1.Update(),ds_2.Update()
具体内容看你什么表
共享共进共赢Sharing And Win-win Results
genius

主题

0

回帖

1001

积分

金牌会员

积分
1001
贡献
在线时间
小时
2011-3-23 19:52:02 | 显示全部楼层
高人啊,正在看PowerBuilder实训指导的菜鸟学习了。
共享共进共赢Sharing And Win-win Results
bombshell

主题

0

回帖

1248

积分

金牌会员

积分
1248
贡献
在线时间
小时
2011-4-2 21:57:56 | 显示全部楼层
swimchen 发表于 2011-3-18 00:35
用影子模式,
两个DataStore(可更新),一个可视DataWindow,完成之后把数据带给DataStore
然后同步Update就可 ...

请4#的朋友说的详细些。
共享共进共赢Sharing And Win-win Results
bombshell

主题

0

回帖

1248

积分

金牌会员

积分
1248
贡献
在线时间
小时
2011-4-2 22:01:12 | 显示全部楼层
请楼主整理影子模式的详细写法,大家学习!
共享共进共赢Sharing And Win-win Results
您需要登录后才可以回帖 登录 | 站点注册

本版积分规则

免责声明:
本站所发布的一切破解补丁、注册机和注册信息及软件的解密分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:Admin@SybaseBbs.com

QQ|Archiver|PowerBuilder(PB)BBS社区 ( 鲁ICP备2021027222号-1 )

GMT+8, 2024-12-4 16:59 , Processed in 0.063466 second(s), 8 queries , MemCached On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表