两个关联表的数据怎样更新到另外一个表?

xm137 2003-08-22 12:38:49
各位大侠:
两个关联表的数据怎样更新到另外一个表?应该怎么样编写代码?
...全文
336 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
eminena 2003-10-04
  • 打赏
  • 举报
回复
实现PB数据窗口的多表更新
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
综上所述﹐可以看出﹐该方案具有很好的可扩展性﹐稍加修改即可解决多表作为数据源的数据窗口的同步更新问题。
20011521 2003-08-23
  • 打赏
  • 举报
回复
对少一个分号
不过也不一定要用INSERT
可以用数据窗口

for i=1 to dw_2.rowcount()
ll_row=dw_2.insertrow(0)
dw_2.setitem(ll_row,"examnameid",ls_user)
dw_2.setitem(ll_row,"qustionid",eaxmtcnr_phid)
dw_2.setitem(ll_row,"answerpt",eaxmtcnr_daan)
next
if dw_2.update()=1 then
commit;
else
rollback;
end if
klbt 2003-08-22
  • 打赏
  • 举报
回复
请把表结构描述一下。
xm137 2003-08-22
  • 打赏
  • 举报
回复
有没有代码给我参考一下?先谢了!
xingxing 2003-08-22
  • 打赏
  • 举报
回复
直接从表中读出数据,然后insert到新表就可以了。
rogery 2003-08-22
  • 打赏
  • 举报
回复
上面话在execute中执行没什么问题,只需要最后加一个分号。

在程序代友中是不是还有其它的内容
xm137 2003-08-22
  • 打赏
  • 举报
回复
错误提示!
error c0031:syntax error
blackcorbie 2003-08-22
  • 打赏
  • 举报
回复
insert into table(a,b,c)
value(:a,:b,:c)
where .....;
你写的sql语句value在哪儿呢?看看sql语句的正确书写!
prain2003 2003-08-22
  • 打赏
  • 举报
回复
把错误提示贴出来看看,否则只能乱猜
xm137 2003-08-22
  • 打赏
  • 举报
回复
这样也报错!
insert into material_output_copy
(material_output.product_number,
material_output.in_date,
material_output.quantity,
material_output.po,
material_output.material_number,
material_output.unit_dosage,
material_output.bad_rate,
material_output.actual_dosage)
SELECT product_input.product_number,
product_input.in_date,
product_input.quantity,
product_input.po,
bom_input.material_number,
bom_input.unit_dosage,
bom_input.bad_rate,
bom_input.actual_dosage
FROM bom_input,
product_input
WHERE ( bom_input.product_number = product_input.product_number )
xyqiqi 2003-08-22
  • 打赏
  • 举报
回复
你插入到表中三个字段,而你一共选择了七个字段,当然会报错。
xm137 2003-08-22
  • 打赏
  • 举报
回复
大侠们帮我看看哪不对?有错误显示!
insert into material_input
(material_input.quantity,
material_input.Unit_price,
material_input.in_date)
SELECT "product_input"."product_number",
"product_input"."in_date",
"product_input"."quantity",
"product_input"."po",
"bom_input"."material_number",
"bom_input"."unit_dosage",
"bom_input"."bad_rate",
"bom_input"."actual_dosage"
FROM "bom_input",
"product_input"
WHERE ( "bom_input"."product_number" = "product_input"."product_number" )
xm137 2003-08-22
  • 打赏
  • 举报
回复
表1:material_input 字段:material_input.material_number,
material_input.quantity,
Product_input.po,
material_input.in_date
"bom_input"."unit_dosage",
"bom_input"."bad_rate"
表2:bom 字段:
"bom_input"."product_number",
"bom_input"."material_number",
"bom_input"."unit_dosage",
"bom_input"."bad_rate"
表3:product_input 字段:Product_input.Product_number,
Product_input.quantity,
Product_input.po,
Product_input.in_date
从表2,表3 更新到 表1
incats 2003-08-22
  • 打赏
  • 举报
回复
insert into t3 (c1, c2, c3) select t1.c1, t2.c2, t2.c3 from t1, t2 where t1.c1 = t2.c1;
runsoft 2003-08-22
  • 打赏
  • 举报
回复
动态修改UPDATE属性,你看看PB带的DATAWINDOW的语法工具,很方便
jdsnhan 2003-08-22
  • 打赏
  • 举报
回复
也可以用dw实现,分别按条件检索出来,填到dw中,更新

1,077

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 相关问题讨论
社区管理员
  • 基础类社区
  • WorldMobile
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧