datawindow实现更新的一个问题~

crylufa 2002-09-18 06:14:18
当datawindow的allowupdate属性无效时,在代码中执行deleterow()函数,然后update(),运行时系统会提示datawindow不让update的错误信息。此时,数据会有何影响?参考资料有一句没明白的话:如果数据窗口不可更新,则被删行从系统中清除。能否解释一下?update应该永不可能成功吧?
谢谢
...全文
36 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
ouyi2002 2002-09-19
  • 打赏
  • 举报
回复
如果是两张表的话,allowupdate()只能更新指定的那张表。但是可以用程序来改变数据窗口的更新属性,所以要想两张表同时更新也是可以实现的。

用程序实现的方法是:
dw_1.modify("DataWindow.Table.UpdateTable='table1'"")
dw_1.modify("column1.key=yes")
dw_1.modify("column1.Update=yes")
dw_1.modify("column2.update=yes")
.............
ouyi2002 2002-09-19
  • 打赏
  • 举报
回复
应该是没有什么影响的。数据内容应该是没有任何改变的。你用DELETEROW()删除数据,其实只是将数据由主缓冲区移动到删除缓冲区里,并没有真正的删除掉。只是不显示而已。不过你光UPDATE(),不COMMIT,数据库也不能更新。

  我还不是太明白你提问要达到的目的是什么?
crylufa 2002-09-19
  • 打赏
  • 举报
回复
忘了说,这个datawindow对应两张表,allowupdate()能有效吗?
crylufa 2002-09-19
  • 打赏
  • 举报
回复
to muxuan(三生石) :
对,我也在怀疑这点。我修改datawindow某个字段的名字保存后,可能会使allowupdate的属性改变。
xzh76215 2002-09-19
  • 打赏
  • 举报
回复
上面deleterow的后果是把tab_1.tp_2.dw_de的数据全部移到了删除缓冲区,但Rollback后,操作全部被取消
muxuan 2002-09-19
  • 打赏
  • 举报
回复
是不是allowupdate属性变化了,如果你修改了datawindow,allowupdate可能会从有效变成无效
crylufa 2002-09-19
  • 打赏
  • 举报
回复
哎,不会没人能解答吧,帖出脚本:
//=======================
//事件:clicked
//描述:将当前账单作废
//=======================
STRING ls_refno,ls_ccy,ls_cacode
INT li_count,li_i,li_orgca,li_trnca,li_ctry,li_ca
LONG ll_rec,ll_ini,ll_mod,ll_smon,ll_cmon,ll_calls,ll_mins
DECIMAL ld_amt,ld_rate
DATETIME ld_now

li_count=tab_1.tp_2.dw_de.rowcount()
IF li_count=0 THEN return

//插入历史表//这个历史表就是datawindow对应的表的历史表。
FOR li_i=1 to li_count
ls_refno=tab_1.tp_2.dw_de.getitemstring(li_i,"ref_no")
ll_rec=tab_1.tp_2.dw_de.getitemnumber(li_i,"rec_no")
ll_ini=tab_1.tp_2.dw_de.getitemnumber(li_i,"ini_rec_no")
ll_mod=tab_1.tp_2.dw_de.getitemnumber(li_i,"mod_rec_no")
ld_amt=tab_1.tp_2.dw_de.getitemdecimal(li_i,"amount")
INSERT INTO A_GO_TELEX_ACCOUNT_HIS VALUES (:ls_refno,:ll_rec,:ll_ini,:ll_mod,:ld_amt);
IF sqlca.sqlcode<>0 THEN
messagebox("错误","处理第"+string(li_i)+"行时错误!")
rollback;
return
END IF
NEXT
//从当前表中删除
FOR li_i=1 to li_count
tab_1.tp_2.dw_de.deleterow(1)
NEXT
IF tab_1.tp_2.dw_de.update()=1 THEN//想问的就是update()应该不成功,这段代码不可能执行???上面deleterow的后果又是什么?
DELETE FROM ACCOUNT_RECORD WHERE REF_NO=:ls_refno AND TYPE_='TELEX';
SELECT MIN(CARRIER_CODE) INTO :ls_cacode FROM CARRIER_CODE WHERE CARRIER_ID=:li_ca;
DELETE FROM NPHN_MONTH_ACCOUNT_LOG WHERE CARRIER_CODE=:ls_cacode AND SETTLE_MONTH=:ll_smon AND SETTLE_DIRECTION='2' AND TYPE_='TELEX';
COMMIT;
tab_1.tp_1.em_mon.triggerevent("modified")
tab_1.SELECTTAB(1)
ELSE
ROLLBACK;
messagebox("警告","作废操作失败!")
return
END IF
galaxypilot 2002-09-19
  • 打赏
  • 举报
回复
我是新手,有一点不明白:用嵌入式SQL语句插入一条记录时不用COMMIT就可以保存吧?
heijj 2002-09-19
  • 打赏
  • 举报
回复
update()要不要commit是要看你的sqlca.autocommit 是否为true
如果autocommit = false 那么,在你update()之后要commit或者rollback

你最好先看一下你的autocommit是真还是假
不过好像代码有问题,看这段代码:
//////////////////////////////////
INSERT INTO A_GO_TELEX_ACCOUNT_HIS VALUES (:ls_refno,:ll_rec,:ll_ini,:ll_mod,:ld_amt);
IF sqlca.sqlcode<>0 THEN
messagebox("错误","处理第"+string(li_i)+"行时错误!")
rollback;
return
////////////////////////////

如果sqlca.autcommit = false 那么它在insert into 成功后没有commit,数据库仍然没有保存进去
如果sqlca.autocomit = true 那么它的rollback就有问题,它是一个循环内的rollback;意思就是说这一条insert into 成功就保存到数据库了,如果没有rollback;假设我有10条数据要insert ,如果我在第5条insert 不成功的话,那我的rollback是给谁的,前4条?但是前4条已经commit了,第5条?它根本就是错误的,还用的着rollback吗?然后程序就return ,于是就产生了前4条已经保存了,后6条没保存,因为是return,所以也就不会执行下面删除当前表的操作,这跟事务的原子性相违背,你的数据库还能保持一致性?至少你历史表跟当前表里相同的数据存在了。

然后再看下面的代码,整个代码都没有commit,如果当初程序能正常执行的话,我是说程序,不去管数据的完整性,那么应该可以肯定autocommit = true,那么你提的问题的答案就是update不成功,数据没有从数据库里删除,如果你再retrivev一次,deleterow后的数据仍旧在。当然同样的毛病,update()不成功,数据自动回滚,那个rollback是给谁的?

这个程序应该是有问题的,不管是autocommmit 是true 还是flase,好像都不能正常的执行数据完整性操作。


joss 2002-09-19
  • 打赏
  • 举报
回复
如果是单单针对数据窗口操作,则这些语句应该不会改变数据

除非你UPDATE成功并提交事务!

但如果你直接使用了SQL语句来实现删除,则有可能避开数据窗口的UPDAT属性

从而实现改变数据库的操作!

实在不行,你换个做法吧!@

实现作废功能方法很多的!!
crylufa 2002-09-18
  • 打赏
  • 举报
回复
这是别人的代码,我在移植
我就是看不明白。
现在想问的是update()怎么执行(因为datawindow不可更新),会怎么影响数据
还没到执行commit的时候啊!
参考资料的那句:被删行从系统中清除,不明白,什么系统?数据库还是程序系统
xmouse_2001 2002-09-18
  • 打赏
  • 举报
回复
数据库中的数据不会被修改。PB应该会自动commit或rollback
joss 2002-09-18
  • 打赏
  • 举报
回复
你删除的行UPDATE后没有了!!

为什么要这样处理数据窗口??

我认为你的设计有问题!
pufan 2002-09-18
  • 打赏
  • 举报
回复
数据窗口的update()执行后,还得 commit才能保存数据库.
未commit或rollback,数据库内容不会被修改.

611

社区成员

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

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