datawindow实现更新的一个问题~

crylufa 2002-09-18 06:14:18
当datawindow的allowupdate属性无效时,在代码中执行deleterow()函数,然后update(),运行时系统会提示datawindow不让update的错误信息。此时,数据会有何影响?参考资料有一句没明白的话:如果数据窗口不可更新,则被删行从系统中清除。能否解释一下?update应该永不可能成功吧?
谢谢
...全文
28 14 打赏 收藏 转发到动态 举报
写回复
用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,数据库内容不会被修改.
注:本人只是在TRUEWAY的基础上升级到支付PB11.5上,所有版权归TRUEWAY(TM) 李群巍所有。 ------------------------ 关于PBHelper(PBCOMMENT)这个软件,最新版本 1.0.2 PBHelper的前身是 PBCOMMENT 7.0。 ================================================================ 版权所有 (c) 1999-2000 RC Sizer 保留所有版权。 版权所有 (c) 2003-2006 Welkin 保留所有版权。 版权所有 (c) 2002-2006 TRUEWAY(TM) 保留所有版权。 注册商标 TRUEWAY(TM) 为李群巍所写程序专用。 PBHelper以前的名字叫 PBCOMMENT。 PBHelper(PBCOMMENT)是一个专门为PB程序员设计的综合性编程 助手工具。她能帮助PB程序员自动生成PB脚本代码注释、自动缩进美化 代码、自动完成代码、大小写转换,实现不同数据库类型之间的SQL语句 转换等功能。 PBHelper支持PowerBuilder 6.x/7.0/8.0/9.0/10.0/10.5/11.0。 关于此软件的英文详细说明,请阅读《readme.txt》。 联系方法: E-Mail: truewaylee@163.com, wolcen@sohu.com MSN: truewaylee@hotmail.com 软件包下载地址: http://gforge.osdn.net.cn/projects/pbhelper/ PBHelper(PBCOMMENT)的来历 ================================================================ PBHelper起初的代码参考了国外一个著名的 PBCOMMENT 软件。国外 的这个 PBCOMMENT 对 PB 6.0/6.5 和 PB 7.0 分别做了实现。初期的 版本主要用于自动生成函数、对象、DW内部代码的注释。后来,本人 对该软件核心代码做了重写工作,且在一个版本的 PBCOMMENT 里面 提供了对不同版本PB的支持。 从 PBCOMMENT 3.0 开始,在后续的版本中,加入了代码自动整理 (Indent)、自动完成(插入DW编码模板)、自动删除(根据某个标记) 自动删除某个标记前面的或者后面的代码,从DW自动生成DW字段赋值语句、 从DW生成结构体等的辅助功能。从这些功能的增加来看,PBCOMMENT 已 不再是 COMMENT 的工具。有鉴于此,从 PBCOMMENT 7.0 以后软件名字 更改为 PBHelper。因为 PBHelper 不再仅仅关注于注释方面,而向功能 综合化、多样性方面发展。 PBHelper(PBCOMMENT)重要版本更新 ================================================================ 开始版本号 新增功能 ---------------------------------------------------------------- PBCOMMENT >>>>>>>>>> 5.2 可以处理 *.sr* 类型的文件的整理处理 将对象、窗口、函数等代码先 Export 成文本文件,在PB中 用编辑文本文件的形式打开,然后象其他脚本一样 Indent 5.2 新增自动将工具集成到 PB 开发环境中的功能 目前支持的版本是 PB 6.0/6.5, PB 9.0 5.3 新增自动在某个代码段加每行代码的相同的前缀或者相同的后缀 这个在我们日常生活中经常要用到的 5.31 新增自动根据字段列表,变量列表,datawindow 赋值语句列表, 自动生成 datawindow 之间复制数据的代码 自动生成 结构体变量 和 datawindow 之间的赋值代码 自动生成 变量列表 和 datawindow 之间的赋值代码 具体可看 《pbcomment自动写代码.doc》的说明 5.31 新增双语言显示 pbcomment.ini 文件中, language = 0 表示简体中文 = 1 表示英文 自动集成PBCOMMENT到PB开发环境,现在支持所有的PB版本(6.0-9.0) 新增自动删除每行代码前面和后面以某个字符串为标记,在此 标记之前和之后的代码语句,类似于 Trim, LeftTrim, RightTrim 5.5 新增 PBDataWindow.exe,处理从 PBL 里选择 DataWindow 自动 生成和结构体、变量,别的 DataWindow 交换数据的脚本语句 修改了函数和事件的注释风格,在 PB 6.0/6.5 里面,区分函数和事件 5.5 Plus 新增在 PB 7.0/8.0/9.0 里面,区分函数和事件 新增用户自定义函数 gf_Format_Comment 如果需要修改注释风格 只需要修改这个函数即可,减少复杂度 6.0 修正了一些在美化代码方面处理的错误 新增支持 PB 10.0(在 PB 10.0 beta 2 上测试通过) 新增支持自动判断当前 PB 开发环境的版本号,解决几个版本 的 PB 同时打开时自动处理当前 PB 开发环境的判断问题。 (以前的程序若同时打开几个 PB,自动处理最高版本的开发环境, 不能同时处理几个 PB 开发环境。) (注意:本次程序升级后,需要重新执行“美化”-“集成到PB”菜单, 然后重新启动 PB 开发环境。) 支持 XP 界面风格 6.1 修正了一些处理自动集成PBCOMMENT到PB里面的错误 修正在 PB 8.0 or later 中处理 *.sr* 文件整个美化代码的错误 新增支持函数注释区别不同语言版本 7.0 新增支持 DataWindow SQL 语句画板中对 SQL 语句的大小写转换、 代码优化等。可以帮助大家校正在例如 SYBASE 等数据库对字段 名大小写敏感需要批量修改的 SQL 语句。 新增支持有关 DataWindow 与结构体、变量之间的赋值、获得数据等 操作的 PB 脚本自动生成。在字段特别多的情况下,比较实用。 PBHelper >>>>>>>>>> 0.8 软件名字从 PBCOMMENT 改名为 PBHelper 支持PB 10.5 beta 1 并通过测试 0.8.1 修正了不能保存自动美化选项的参数问题,参数改了后,第二次 进去的时候,自动恢复到默认值。这是错误的。 0.8.2 修正了在双引号、单引号中有 // 的处理错误 新增支持 "TRY...CATCH...FINALLY...END TRY" 句型的代码美化 新增函数注释模板支持,用于可定义模板 template0.txt 是选择 PBHelper 语言环境为中文时的模板 template1.txt 是选择 PBHelper 语言环境为英文时的模板 模板文件可直接用记事本打开修改 0.8.3 新增支持 PB 10.5 beta 2 修正了处理 “loops = flen/32765” 语句导致的一缩进不正确 修正在 PB7.0以上的版本上都存在的判断函数/事件不正确的错误 代码注释开始使用中文,以便 PBHelper 爱好者阅读 0.8.4 使用中文重写重要模块的注释,方便阅读 修正了一些词法分析上的错误 整理内部实现,废弃了部分内部函数,并重新在PB的各个版本上做测试 修正一些情况在提取函数信息上的错误 新增支持 PB 11.0 beta 1 0.8.5 解决含中文变量的脚本代码美化代码时会出现删除中文变量的问题 1.0.0 所有代码进行整理,应用也进行重新设计 原来配置文件pbcomment.ini和文本模板文件合并到pbhelper.ini 界面采用了新的风格,使用任务栏菜单形式,配置选项、DW自动化 处理等界面都作了重新设计,实现新的使用体验 1.0.1 修正在PB7.0以上的版本集成工具条出现两个“单步注释”结点 修正在未安装PB6.x的机器上运行程序中设置参数功能出现错误 1.0.2 修正各类注释模版不能保存的问题 在About窗口上增加单击可直接进入写邮件和URL地址 增加单步注释模版支持,取消设置注释分割线长度的做法 使用方法 ================================================================ 有两种使用方法: 1、任务栏程序方式运行 鼠标双击运行pbhelper.exe。PBHelper将以任务栏程序的形式运行。单击图标 弹出菜单,接着可进行相关操作。 2、集成到PB开发环境(推荐方式) 运行 pbhelper.exe 后,执行菜单“系统”-“智能集成”,可帮助你自动集成 PBHelper 到 PB 开发环境形成工具条,比操作 pbhelper.exe 菜单更方便。 3、注意点:在使用“部分注释”时候,正常情况是修改状态下注释,按住 Ctrl键时是增加状态下注释,按住Shift键时是删除状态下注释。 4、建议使用应用进行参数设置,不直接修改pbhelper.ini 5、PBHelper不需要卸载老的版本,但下载新的安装包后需重新做集成到PB的操作。
数据窗口源码介绍 (举例见d_dbit_example.srd,测试数据库为PB自带的EAS Demo DB V120) 1.第一行:release 12; 数据窗口所属PB的版本号,如果想把高版本的datawindow导入低版本的PB中要修改此数字; 2.datawindow()行 通常用修改processing属性,可以把你的数据窗口由grid变成freeform或其它类型 例:freeform:0 grid:1 3.header()行 可以整行复制粘贴,并命名为header[1],header[2],这样可以让数据窗口有多个header 4.table()行 这里全是定义的数据属性,是setitem,update,object.data等方法访问的根源 如果存在table()里的column,数据窗口里可以不存在任何对象,仍然可以访问数据窗口的数据 如果想创建一个空的数据窗口,可以只定义: release 12; table() 5.table(column行) 是第几个column,它的ID就是多少,其中也定义了是否可以update时和更新到数据表的字段名 6.table(retrieve行) 检索数据时使用的SQL语句,可以通过setsqlselect或modify("table.sqlselect")方法去动态修改 修改后要重新定义数据窗口的更新属性 7.column()行 id即是对应table(column行)里的行次,名称(name)可以随便命名,也可以没有,则默认为table(column行)里的name 8.compute()行 计算列,可以通过表达式计算显示特定值(具体函数可以见共享里的画笔函数). 9.text()行 有时可以代替计算列; 通过定义text的表达式,可以实现一列中显示两个字段值,注意结果必须要转换成string类型(而column和compute则不行); 10.htmltable()行 按照格式导出(saveas)html文件,为了保证格式的完整,数据窗口的单位最好设置成pixels GenerateCSS='1' //保持格式及颜色 Border='0' //不要table边框 CellSpacing='0' //单元格无间距(此项在界面上经常设置不上) 注: (1)Grid生成标签,Freeform生成
+ 标签; (2)生成htmltable时,不知为何会在CSS中的开始自动加一个分号";",导致excel等浏览器打开不能正常显示格式; (3)band为foreground或background的对象导不出来,可以动态修改后再导出. 11.export.xml()行 定义导出xml文件的格式,并为模板保存名称 使用时一定要设置usetemplate值 12.import.xml()行 定义导入xml文件的格式,并为模板保存名称 使用时一定要设置usetemplate值 13.表达式介绍 略 14.其它也略

609

社区成员

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

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