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

  PowerBuilder数据窗口对象是其特有智能对象其封装性好、功能强大、表现形式丰富多样为此许多MIS开发人员对PowerBuilder推崇备至将其视为首选开发工具  般情况下个数据窗口只能更新个数据库表但在MIS开发过程中我们经常遇到这种情况:个数据窗口中由两个或更多个数据库表作为数据源并需要对其进行录入或修改如何给出多表更新通用解决方案就成为MIS开发人员不容回避问题笔者在某管理信息系统开发过程中尝试了几种双表更新解决思路方法选出种比较好方案以飨读者

  、具体步骤

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

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

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

  为了使方案具有通用性建立全局f—update—2table有 5个参数:dw—obj、table1、table2、key1、key2分别代表所要更新数据窗口、两表表名和两表主键列名其中dw—obj为DataWindow类型其余 4参数均为String类型返回值为Boolean型返回True表示成功返回False表示失败

   2、思路

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

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

  3. Update更新第 2个表

  4. 两表更新成功后把两表列属性、主键属性改回到状态以便为下两表更新做好准备

   3、清单

// 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.Mody(Name1[i]+″.Update=No″)
NEXT
dw—obj.Mody(Key1+″.Key=No″)
dw—obj.Mody(″DataWindow.Table.Update
Table=′ ″+Table2+″ ′ ″)
FOR i=1 TO n2
dw—obj.Mody(Name2[i]+″.Update=Yes″)
NEXT
dw—obj.Mody(Key2+″.Key=Yes″)
IF dw—obj.Update=1 THEN
Commit;
FOR i=1 TO n1
dw—obj.Mody(Name1[i]+″.Update=Yes″)
NEXT
dw—obj.Mody(Key1+″.Key=Yes″)
dw—obj.Mody(″DataWindow.Table.UpdateTable=′ ″+Table1+″ ′ ″)
FOR i=1 TO n2
dw—obj.Mody(Name2[i]+″.Update=No″)
NEXT
dw—obj.Mody(Key2+″.Key=No″)
True
ELSE
Rollback;
False
END IF
ELSE
Rollback;
False
END IF
   4、思路方法



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

dw_1.AcceptText
IF dw—1.ModiedCount〉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
  综上所述可以看出该方案具有很好可扩展性稍加修改即可解决多表作为数据源数据窗口同步更新问题



Tags:  pb数据窗口内存 pb查询数据窗口 pb数据窗口图片 pb数据窗口

延伸阅读

最新评论

发表评论