当前位置:首页>> PowerBuilder>> PB入门

全文搜索

精华导读

·EasyERP2004 制造行业通用性ERP管理系统
·PB中表的修改对数据窗口和报表的影响的解决办法
·在PB中实现Word内容的替换
·office xp风格菜单基本版
·用PB制作outlook界面源程序(非原来的老外版本)(
·将所见dw内容(包括计算字段)输出到execl中
·ERP在中国应用面临的问题
·PB中使用FORMULA ONE(实例篇
·控制打印机的动态库,兼容win98/98/me/nt2000/xp
·易佳自定义报表系统
·用例驱动的需求过程实践

最新发表

·仿windows优化大师界面(源码)
·常见问题的经典解决之SPLITBAR
·pb技巧
·PowerBuilder 10 Beta1下载和相关信息
·如何在pb9中调用WebService
·在非PB9 JSP Target的jsp网页中调用EAServer组件
·质量管理的十三项步骤和八项原则
·用预测性对象点度量面向对象软件(下)
·用预测性对象点度量面向对象软件(上)
·软件开发度量及考核方法
·点度量(4)—最新发布度量方法及参考
·点度量(3)—功能规模度量方法选择
·点度量(2)—功能规模度量方法评价
·点度量(1)—功能规模度量方法概述
·如何对软件质量进行评估
·从印度软件项目管理谈我国软件质量保障
·步步为营,把好质量关
·软件产品的可用性的测试
·软件测试认识的几个误区

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

文章来源:互联网络 文章编辑:admin 添加时间:2004-4-6

 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. 两表更新成功后,把两表的列属性、主键属性改回到初始状态,以便为下一次的两表更新调用做好准备。 

  三、程序清单 

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

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

[ ]

首页 评论 打印 刷新 返回顶部 关闭
【相关文章】  【相关评论】
目前暂时没有相关文章