使用UNION把不同字段放在一个字段下,更新出现问题,怎么解决?

jadeqqq 2004-10-06 08:56:06
我有两个表,a,b, 它们中都有一个字段name,我在DW中是这样选择的
select name
from a
union
select name
from b

当我要删除表b中的数据,并update()之后,系统报错了,报的是
Row changed between retrieve and update.

No changes made to database.

DELETE FROM a WHERE name = xxx

这里面好象是系统自动把表b的值放入到a当中,可是在update()时系统在表a中又找不到b的数值,大家说这个问题应该怎么解决呢?
...全文
301 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
lzheng2001 2004-10-09
  • 打赏
  • 举报
回复
1. 确认已经使用了settransobject(sqlca)语句

2. 确保你的update properties 中的设置正确.

jadeqqq 2004-10-09
  • 打赏
  • 举报
回复
我想你这样的应该是好的。可是还是有一个问题,我使用update()后居然不能触发sqlpreview事件,好像只能触发一回啊。这是怎么回事呢?
lzheng2001 2004-10-08
  • 打赏
  • 举报
回复
记错写法了,好象应该这样写才对:
choose case buffer
case primary!
if ii_updatedtimes = 1 and dw_1.object.标识列.primary[row] = 'b' then
return 2 //跳过这行
elseif ii_updatedtimes = 2 and dw_1.object.标识列.primary[row] = 'a' then
return 2
end if
case delete!
if ii_updatedtimes = 1 and dw_1.object.标识列.delete[row] = 'b' then
return 2 //跳过这行
elseif ii_updatedtimes = 2 and dw_1.object.标识列.delete[row] = 'a' then
return 2
end if
end choose
lzheng2001 2004-10-08
  • 打赏
  • 举报
回复
这样吧
choose case buffer
case primary!
if ii_updatedtimes = 1 and dw_1.object.primary!.标识列[row] = 'b' then
return 2 //跳过这行
elseif ii_updatedtimes = 2 and dw_1.object.primary!.标识列[row] = 'a' then
return 2
end if
case delete!
if ii_updatedtimes = 1 and dw_1.object.delete!.标识列[row] = 'b' then
return 2 //跳过这行
elseif ii_updatedtimes = 2 and dw_1.object.delete!.标识列[row] = 'a' then
return 2
end if
end choose

jadeqqq 2004-10-08
  • 打赏
  • 举报
回复
老大,还是不行啊。这句错了dw_1.object.buffer.标识列[row] = 'b'
说没有buffer这个属性值。
lzheng2001 2004-10-07
  • 打赏
  • 举报
回复
删除的话比较麻烦,还是改一下方法:

思路:还是要分开两次执行UPDATE(),且要设置update table

实例变量
int ii_updatedtimes
dw_1.modify("datawindow.Table.UpdateTable='a'")
ii_updatedtimes = 1
if dw_1.update() = 1 then
//如果成功,第二次
dw_1.modify("datawindow.Table.UpdateTable='b'")
ii_updatedtimes = 2
if dw_1.update() = 1 then
commit;
end if
end if

在sqlpreview 事件中
if ii_updatedtimes = 1 and dw_1.object.buffer.标识列[row] = 'b' then
return 2 //跳过这行
elseif ii_updatedtimes = 2 and dw_1.object.buffer.标识列[row] = 'a' then
return 2
end if

这次应该行了
jadeqqq 2004-10-07
  • 打赏
  • 举报
回复
lzheng2001(1加1=0) ,你的方法按理来说应该是可以实现的,但是你有没有注意到,当我把表a,b中的数据都删除了,即把它们的一些数据放在delete缓存区里,而过滤函数只能把主缓存区的数据过滤到过滤区里,而不能过滤delete缓存区了,所以还是出现问题报错,但在报错去掉之后,还是能UPDATE的。
有什么办法也可以过滤delete缓存区吗?
jadeqqq 2004-10-07
  • 打赏
  • 举报
回复
还是不行啊,还是出现那个错误。这是怎么回事呢?
lzheng2001 2004-10-06
  • 打赏
  • 举报
回复
上面改一下sql 语句
select name, 'a' as 标识列
from a
union
select name, 'b' as 标识列
from b
lzheng2001 2004-10-06
  • 打赏
  • 举报
回复
这种情况可以自己生成SQL更新数据

也可试试以下方法:

select name, 'a' as a
from a
union
select name, 'b' as b
from b

1.先在update properties 设置更新的表为a表
2.在DW.UPDATE()前,先过虑b表的数据,然后update(true,false),
3.update 成功后,再过虑a表的数据,剩下B表的数据,然后更改表名:
dw_1.modify("datawindow.Table.UpdateTable='b'")
4.然后再执行第二次dw_1.update()
5.如果两次都成功 则commit及resetupdate()


圣殿骑士18 2004-10-06
  • 打赏
  • 举报
回复
不能用union的dw作为更新用的datawindow.
luotitan 2004-10-06
  • 打赏
  • 举报
回复
这种情况应该直接用SQL

611

社区成员

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

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