有兴趣讨论pb多表数据更新问题的,请进。。。。。

keer 2001-07-30 03:19:05
本人不幸遇到多表数据更新的问题,由于小妹阅历尚浅,望众位大哥把曾经遇到的多表数据更新的经历、教训、注意事项道来听听。
不胜感激........
...全文
260 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
wideken 2002-01-07
  • 打赏
  • 举报
回复
呵呵,我这个地方有段例程,可以看看
原理分析:
数据窗口数据源来自两个或两个以上的表,相当于多个表连接建立的一个视图,对于这种数据窗口,PB默认是不能修改的。当然我们可以通过设置它的Update 属性,数据窗口的Update Properties用来设置数据窗口是否可Update、可Update的表、可Update列等,但不能同时设置两个表可更新;所以当修改它的数据项时,我们不能简单地用dw_1.update()来更新table,我们可以在程序中设置数据窗口可更新的一个表A(及其可更新列),其他表为不可更新,更新完表A后,再设置另一表B为可更新,表A设置为不可更新,依次类推。

解决示例:
我们以PowerBuilder7自带的ASA6数据库为例:
1、新建一个数据窗口d_grid_dep_emp,它的Select语句为
SELECT department.dept_id,
department.dept_name,
employee.emp_id,
employee.emp_fname,
employee.emp_lname
FROM department, employee
where employee.dept_id = department.dept_id

2、设置数据窗口d_grid_dep_emp的属性,将列的taborder改为非0值;并点击菜单Rows——>Update Properties,设置此数据窗口Allow Updates,Table to Update设为department,Updateable Columns为department.dept_id,department.dept_name。

3、在窗口中更新数据窗口按钮的clicked事件编写脚本:
long ll_rtn
// 修改Department表(Department表在第2步已设置为可更新)
ll_rtn = dw_1.update(true, false)

if ll_rtn = 1 then
//关闭对Department表的修改
dw_1.Modify("department_dept_name.Update = 'No'")
dw_1.Modify("department_dept_id.Update = 'No'")
dw_1.Modify("department_dept_id.Key = 'No'")

//设置Employee表成为新的可修改表
dw_1.Modify("DataWindow.Table.UpdateTable = 'employee'")
dw_1.Modify("employee_emp_id.Update = 'Yes'")
dw_1.Modify("employee_emp_fname.Update = 'Yes'")
dw_1.Modify("employee_emp_lname.Update = 'Yes'")
dw_1.Modify("employee_emp_id.Key = 'Yes'")

//修改Employee表
ll_rtn = dw_1.Update()
IF ll_rtn = 1 THEN
COMMIT USING SQLCA;
dw_1.retrieve()
messagebox('提示信息','更新成功!')
ELSE
ROLLBACK USING SQLCA;
MessageBox('提示信息', '更新失败!')
END IF

//重设修改标志
dw_1.Modify("department_dept_name.Update = 'Yes'")
dw_1.Modify("department_dept_id.Update = 'Yes'")
dw_1.Modify("department_dept_id.Key = 'Yes'")
dw_1.Modify("DataWindow.Table.UpdateTable = 'department'")
dw_1.Modify("employee_emp_id.Update = 'No'")
dw_1.Modify("employee_emp_fname.Update = 'No'")
dw_1.Modify("employee_emp_lname.Update = 'No'")
dw_1.Modify("employee_emp_id.Key = 'No'")
ELSE
ROLLBACK USING SQLCA;
MessageBox('提示信息', '更新失败!')
END IF
这样就完成了对两个表的更新。当然我们可以将上面功能编成一个函数,在需要时调用。

nanjQQ 2002-01-06
  • 打赏
  • 举报
回复
我们要考虑的是效率的问题,所以我建议我们多做服务器端编程,多用一些触发器和存储过程
chenhuijun 2001-08-03
  • 打赏
  • 举报
回复
同意楼上的。
sun_qiqi 2001-08-03
  • 打赏
  • 举报
回复
利用Update Properties,以两个表为例。table1,table2
编程时使用"Table to Update","Updateable Columns","Unique Key Columns"三个属性来指定要更新的表、列和健列。

代码如下:(pb6.5)
string change,err
int li_return
li_return = dw_1.update(true,false)
if li_return = 1 then
//关闭table1的列更新属性,两列
dw_1.modify("table1.book_id.update = no")
dw_1.modify("table1.book_name.update = no")
change = "DataWindow.Table.UpdateTable = 'table2'"
//设定新的更新表和键列
err= dw_1.modify(change)
dw_1.modify("table2.book_id.update = yes")
change = "table2.name.update = yes"
//设定表中可更新的列
err=dw_1.modify(change)
if err<>"" then messagebox("failed",err)
li_return = dw_1.update()
if li_return = 1 then
commit;
if sqlca.sqlcode<>0 then
messagebox("commit error",sqlca.sqlerrtext)
end if
else
messagebox("update err","table2 update failed")
rollback;
end if
else messagebox("update err","table1 update failed")
rollback;
end if
dw_1.modify("table1.book_id.update = yes")
dw_1.modify("table1.book_name.update = Yes")
//恢复原属性
dw_1.mofify("datawindow.table.updatetable = 'table2'")
………………………………
例子可能有错误,不过大概想法是对的,见谅。
eastseaofdragon 2001-08-03
  • 打赏
  • 举报
回复
如果你真是小妹,还可以理解,否则的话我看你还是改行吧......
Methodor 2001-08-02
  • 打赏
  • 举报
回复
1、多表更新不太常用~~
2、多表更新代码实现比较简单,网上相关例子也比较多~~
3、能用DBMS实现的功能最好不要用代码来做(比如:Trigger、sp或其它约束之类)~~
pbdesigner 2001-08-02
  • 打赏
  • 举报
回复
不推荐在前台写程序实现,我通常是在后台通过写触发器来实现。这样不管你是在前台操作还是后台维护都能保证数据的一致性。
luck_boy 2001-08-02
  • 打赏
  • 举报
回复
多表更新是个比较麻烦的问题,代码比较多,仅谈谈思想:以两个表为例:建立DATAWINDOW时,先将一个表设为是可更新的,然后用代码控制这两个表的可更新性,(设定TABLE。UPDAETABLE以及COLUMN.UPDATE的属性),建议你看看PB自带的例子吧!
qinqindodo 2001-08-02
  • 打赏
  • 举报
回复
对不起了,我只用过mssql和sqlanywhere,别的数据库还是请各位高手指教吧!
perfect 2001-07-31
  • 打赏
  • 举报
回复
怎样做触发器啊,我是新手,请各位大哥赐教 ,
在powerdesign中 有例子,很简单
ghostsheng 2001-07-31
  • 打赏
  • 举报
回复
怎样做触发器啊,我是新手,请各位大哥赐教
ExitWindows 2001-07-31
  • 打赏
  • 举报
回复
up
ExitWindows 2001-07-31
  • 打赏
  • 举报
回复
up
qinqindodo 2001-07-31
  • 打赏
  • 举报
回复
打开sql Enterprise manager,(sql的控制台)选中你要控制的表,在右健菜单中选manage
triggers,在那里写!语法的话你找专门的书看一看,就是些sql的语句!
下面是一个删除的例子

CREATE TRIGGER jd_del ON dbo.jd_main
FOR DELETE
AS
BEGIN
delete jd_detail from dbo.jd_detail a, deleted b
where a.cfk=b.cpk
END
wangsw 2001-07-31
  • 打赏
  • 举报
回复
动态改变窗口的更新属性!!
shawnguo 2001-07-30
  • 打赏
  • 举报
回复
可以在数据库中做个trriger啊
caolei1974 2001-07-30
  • 打赏
  • 举报
回复
用trigger呀,方便简洁
keer 2001-07-30
  • 打赏
  • 举报
回复
如:做图书馆管理系统。注销一本书需要删除“主题词表”、“主控书库表”、“辅助题名信息表”等表的相应记录。
glongjun 2001-07-30
  • 打赏
  • 举报
回复
具体问题具体分析,太笼统说不清!
keer 2001-07-30
  • 打赏
  • 举报
回复
为何关心多表更新问题的人那么少???
加载更多回复(5)

1,076

社区成员

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

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