PB实现数据窗口的多表更新

本文介绍了一种通用解决方案,用于在MIS开发中处理一个数据窗口同时更新两个或更多数据库表的情况。通过创建全局函数f_update_2table,实现了双表更新的自动化,确保了数据一致性并提高了开发效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

    一、具体步骤 

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

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

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

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

    二、函数思路 

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

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

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

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

    三、程序清单 

    //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

           Name1[n1]=ColName 
        END IF 
        IF Left(ColName,Len(Table2))=Table2 and ColName
〈〉
Key2 THEN 
           n2=n2

           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.UpdateTable='"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,数据库表名和主键名分别为t1t2k1k2,放置“存盘”按钮,按钮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 

    综上所述,可以看出,该方案具有很好的可扩展性,稍加修改即可解决多表作为数据源的数据窗口的同步更新问题。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值