dw里面一次查询2张表,但是修改就只能修改一张表的内容,该怎么解决?

yueyuee9999 2009-07-20 03:08:06
我一个DW里面查询了2张表
SELECT sb_dqwh.bh,
sb_dqwh.ccbh,
sb_dqwh.fl,
sb_dqwh.lastdate,
sb_dqwh.period,
sb_dqwh.unit,
    sb_sbtz.sbbh,
sb_sbtz.xh,
sb_sbtz.sbmc,
sb_sbtz.sbxh,
sb_sbtz.azwz,
FROM sb_dqwh,sb_sbtz
where sb_dqwh.bh = sb_sbtz.sbbh

然后之后我就进ROWS -- Updateproperties 里面设置  ,首先他第一排选表那个地方就会有2张表,我只能2选一,也就是说我选了一张表,那他另外一张表的字段我就不能选,我把程序运行出来后,查出来2张表的内容我就只能修改一张表的内容,另外一张表的我就修改不起,应该怎么解决啊!!
...全文
189 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
K1933 2009-07-23
  • 打赏
  • 举报
回复
建议不要这样做,尽可能在分表保存,特别是多用户环境!
yueyuee9999 2009-07-21
  • 打赏
  • 举报
回复
他说我无效的标识 "manager"
就是我上面的一个字段,我找了数据窗口和数据库,这个字段是没问题的
然后我就去数据窗口把这个字段在注销了在试,他又说我无效的标识符"nextdate"
就是 manager上面的那个,我不晓得是不是我的语法写错了哦,试了半天了还是不行啊
永生天地 2009-07-21
  • 打赏
  • 举报
回复
把这句放在最前面,否则肯定找不到那些字段
dw_list.Modify("DataWindow.Table.UpdateTable = 'sb_dqwh'")
pmmhjj 2009-07-21
  • 打赏
  • 举报
回复
可以交替更新所有的表:

ll_rtn = dw_1.update(true, false)
if ll_rtn = 1 then
dw_1.modify("column_name.update = 'NO'") //关闭一个表的列的修改
dw_1.modify("column_name.key = 'NO' ") //关闭主键

dw_1.modify("datawindow.table.updatetable = 'table_name'") //要更新的第二个表
dw_1.modify("column_name.update = 'YES'") //打开第二张表所有要更新的列的修改
dw_1.modify("column_name.key = 'YES'")

ll_rtn = dw_1.update()
……

上面就能实现多表更新了
永生天地 2009-07-20
  • 打赏
  • 举报
回复
多表更新的做法,本人收藏了一文

http://blog.csdn.net/xys_777/archive/2009/07/20/4364968.aspx
永生天地 2009-07-20
  • 打赏
  • 举报
回复
哇,不太好维护,

不过要想解决问题,lz要吧报错的内容给贴一下,大家好帮忙分析那里有问题

[Quote=引用 6 楼 yueyuee9999 的回复:]
我2个表的字段太多了`试了半天他在保存的时候要报错
long ll_rtn

ll_rtn = dw_list.update(true, false)

if ll_rtn = 1 then
    //关闭对dqwh表的修改
  dw_list.Modify("sb_dqwh_bh.Update = 'No'")
dw_list.Modify("sb_dqwh_bh.Key = 'No'")
dw_list.Modify("sb_dqwh_ccbh.Update = 'No'")
dw_list.Modify("sb_dqwh_ccbh.Key = 'No'")
dw_list.Modify("sb_dqwh_fl.Update = 'No'")
dw_list.Modify("sb_dqwh_lastdate.Update = 'No'")
dw_list.Modify("sb_dqwh_period.Update = 'No'")
dw_list.Modify("sb_dqwh_unit.Update = 'No'")
dw_list.Modify("sb_dqwh_nextdate.Update = 'No'")
dw_list.Modify("sb_dqwh_manager.Update = 'No'")


dw_list.Modify("DataWindow.Table.UpdateTable = 'sb_sbtz'")   
dw_list.Modify("sb_sbtz_sbbh.Update = 'Yes'")
dw_list.Modify("sb_sbtz_sbbh.key = 'Yes'")
dw_list.Modify("sb_sbtz_xh.Update = 'Yes'")
dw_list.Modify("sb_sbtz_sbmc.Update = 'Yes'")
dw_list.Modify("sb_sbtz_sbxh.Update = 'Yes'")
dw_list.Modify("sb_sbtz_azwz.Update = 'Yes'")
dw_list.Modify("sb_sbtz_azsj.Update = 'Yes'")
dw_list.Modify("sb_sbtz_yjz.Update = 'Yes'")
dw_list.Modify("sb_sbtz_biz.Update = 'Yes'")
dw_list.Modify("sb_sbtz_sbzt.Update = 'Yes'")
dw_list.Modify("sb_sbtz_ccbh.Update = 'Yes'")

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

dw_list.Modify("sb_dqwh_bh.Update = 'yes'")
dw_list.Modify("sb_dqwh_bh.Key = 'yes'")
dw_list.Modify("sb_dqwh_ccbh.Update = 'yes'")
dw_list.Modify("sb_dqwh_ccbh.Key = 'yes'")
dw_list.Modify("sb_dqwh_fl.Update = 'yes'")
dw_list.Modify("sb_dqwh_lastdate.Update = 'yes'")
dw_list.Modify("sb_dqwh_period.Update = 'yes'")
dw_list.Modify("sb_dqwh_unit.Update = 'yes'")
dw_list.Modify("sb_dqwh_nextdate.Update = 'yes'")
dw_list.Modify("sb_dqwh_manager.Update = 'yes'")
dw_list.Modify("DataWindow.Table.UpdateTable = 'sb_dqwh'")
dw_list.Modify("sb_sbtz_sbbh.Update = 'no'")
  dw_list.Modify("sb_sbtz_sbbh.key = 'no'")
dw_list.Modify("sb_sbtz_xh.Update = 'no'")
dw_list.Modify("sb_sbtz_sbmc.Update = 'no'")
dw_list.Modify("sb_sbtz_sbxh.Update = 'no'")
dw_list.Modify("sb_sbtz_azwz.Update = 'no'")
dw_list.Modify("sb_sbtz_azsj.Update = 'no'")
dw_list.Modify("sb_sbtz_yjz.Update = 'no'")
dw_list.Modify("sb_sbtz_biz.Update = 'no'")
dw_list.Modify("sb_sbtz_sbzt.Update = 'no'")
dw_list.Modify("sb_sbtz_ccbh.Update = 'no'")
ELSE
  ROLLBACK USING SQLCA;
    MessageBox('提示信息', '更新失败!')


end if

顺便一题 sb_dqwh 的主键是bh 和 ccbh    sb_sbtz的主键是sbbh 和 ccbh
[/Quote]
  • 打赏
  • 举报
回复
有时候没必要这么麻烦,绝对有一种答案可以避免多表更新,只是方法的问题
www8523 2009-07-20
  • 打赏
  • 举报
回复
楼上说的对到是对,就是第二个表不保存
yueyuee9999 2009-07-20
  • 打赏
  • 举报
回复
我2个表的字段太多了`试了半天他在保存的时候要报错
long ll_rtn

ll_rtn = dw_list.update(true, false)

if ll_rtn = 1 then
//关闭对dqwh表的修改
dw_list.Modify("sb_dqwh_bh.Update = 'No'")
dw_list.Modify("sb_dqwh_bh.Key = 'No'")
dw_list.Modify("sb_dqwh_ccbh.Update = 'No'")
dw_list.Modify("sb_dqwh_ccbh.Key = 'No'")
dw_list.Modify("sb_dqwh_fl.Update = 'No'")
dw_list.Modify("sb_dqwh_lastdate.Update = 'No'")
dw_list.Modify("sb_dqwh_period.Update = 'No'")
dw_list.Modify("sb_dqwh_unit.Update = 'No'")
dw_list.Modify("sb_dqwh_nextdate.Update = 'No'")
dw_list.Modify("sb_dqwh_manager.Update = 'No'")


dw_list.Modify("DataWindow.Table.UpdateTable = 'sb_sbtz'")
dw_list.Modify("sb_sbtz_sbbh.Update = 'Yes'")
dw_list.Modify("sb_sbtz_sbbh.key = 'Yes'")
dw_list.Modify("sb_sbtz_xh.Update = 'Yes'")
dw_list.Modify("sb_sbtz_sbmc.Update = 'Yes'")
dw_list.Modify("sb_sbtz_sbxh.Update = 'Yes'")
dw_list.Modify("sb_sbtz_azwz.Update = 'Yes'")
dw_list.Modify("sb_sbtz_azsj.Update = 'Yes'")
dw_list.Modify("sb_sbtz_yjz.Update = 'Yes'")
dw_list.Modify("sb_sbtz_biz.Update = 'Yes'")
dw_list.Modify("sb_sbtz_sbzt.Update = 'Yes'")
dw_list.Modify("sb_sbtz_ccbh.Update = 'Yes'")

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

dw_list.Modify("sb_dqwh_bh.Update = 'yes'")
dw_list.Modify("sb_dqwh_bh.Key = 'yes'")
dw_list.Modify("sb_dqwh_ccbh.Update = 'yes'")
dw_list.Modify("sb_dqwh_ccbh.Key = 'yes'")
dw_list.Modify("sb_dqwh_fl.Update = 'yes'")
dw_list.Modify("sb_dqwh_lastdate.Update = 'yes'")
dw_list.Modify("sb_dqwh_period.Update = 'yes'")
dw_list.Modify("sb_dqwh_unit.Update = 'yes'")
dw_list.Modify("sb_dqwh_nextdate.Update = 'yes'")
dw_list.Modify("sb_dqwh_manager.Update = 'yes'")
dw_list.Modify("DataWindow.Table.UpdateTable = 'sb_dqwh'")
dw_list.Modify("sb_sbtz_sbbh.Update = 'no'")
dw_list.Modify("sb_sbtz_sbbh.key = 'no'")
dw_list.Modify("sb_sbtz_xh.Update = 'no'")
dw_list.Modify("sb_sbtz_sbmc.Update = 'no'")
dw_list.Modify("sb_sbtz_sbxh.Update = 'no'")
dw_list.Modify("sb_sbtz_azwz.Update = 'no'")
dw_list.Modify("sb_sbtz_azsj.Update = 'no'")
dw_list.Modify("sb_sbtz_yjz.Update = 'no'")
dw_list.Modify("sb_sbtz_biz.Update = 'no'")
dw_list.Modify("sb_sbtz_sbzt.Update = 'no'")
dw_list.Modify("sb_sbtz_ccbh.Update = 'no'")
ELSE
ROLLBACK USING SQLCA;
MessageBox('提示信息', '更新失败!')


end if

顺便一题 sb_dqwh 的主键是bh 和 ccbh sb_sbtz的主键是sbbh 和 ccbh
newease 2009-07-20
  • 打赏
  • 举报
回复
数据窗口的多表更新
原理分析:
数据窗口数据源来自两个或两个以上的表,相当于多个表连接建立的一个视图,对于这种数据窗口,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
这样就完成了对两个表的更新。当然我们可以将上面功能编成一个函数,在需要时调用。
newease 2009-07-20
  • 打赏
  • 举报
回复
数据窗口的多表更新
原理分析:
数据窗口数据源来自两个或两个以上的表,相当于多个表连接建立的一个视图,对于这种数据窗口,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
这样就完成了对两个表的更新。当然我们可以将上面功能编成一个函数,在需要时调用。
zottff 2009-07-20
  • 打赏
  • 举报
回复
呵呵,在没有人回复前你可以删除那2个贴子

好久没用pb了,应该是更新完1个表后,更改修改表的属性和字段,再次update()
yueyuee9999 2009-07-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 fm20027 的回复:]
多表更新可以、看看PB带的列子即可。
[/Quote]

能具体点吗..我新手,不会啊

随便在问个问题..刚才我网速慢,发帖子的时候我这个帖子发了3份出来...那我不是要给60分..怎么办???
fm20027 2009-07-20
  • 打赏
  • 举报
回复
多表更新可以、看看PB带的列子即可。

609

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder DataWindow
社区管理员
  • DataWindow社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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