现在,我建立了一个数据窗口,涉及到两个表,比如 A 表,和B表,两个表之间用一个外键连接,B表的主键是A表的外键!
在数据窗口更新的时候,由于我是建立一个新的记录,并且要对两个表都要写,因此,在数据窗口的更新属性中,我设置为更新A表。更新的字段为 a.id、a.name……,在更新成功的情况下,修改数据窗口的更新属性,变为B表更新,并修改相应的字段更新属性。
代码示意如下:
初始数据窗口更新属性为 A 表,更新字段为A表的所有字段。
……
long rtcode
rtcode = dw_1.update(true,false)
if rtcode = 1 then //更新第一个表成功
dw_1.modify("a_id.update = 'No'") //修改第一个表的字段更新属性为不更新
dw_1.modify("a_name.update = 'No'"
dw_1.modify("a_id.key = 'no'))
……
//修改第二个表的更新属性为可更新
dw_1.modify("datawindow.Table.updatetable = 'B'")
dw_1.modify("b_id.update = 'yes'")
dw_1.modify("b_name.update = 'yes')
dw_1.modify("b_id.key = 'yes')
……
if dw_1.update() = 1 then //更新第二个表成功
COMMIT;
else
messagebox("错误", "提交不成功")
end if
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
综上所述,可以看出,该方案具有很好的可扩展性,稍加修改即可解决多表作为数据源的数据窗口的同步更新问题。
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
综上所述,可以看出,该方案具有很好的可扩展性,稍加修改即可解决多表作为数据源的数据窗口的同步更新问题。