| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1428 人关注过本帖, 1 人收藏
标题:数据表缓冲数据更新不正确,无论在表单中确认还是放弃,表中都只有一条记录 ...
只看楼主 加入收藏
xdzhhq
Rank: 2
等 级:论坛游民
帖 子:32
专家分:33
注 册:2011-11-23
结帖率:60%
收藏(1)
已结贴  问题点数:10 回复次数:13 
数据表缓冲数据更新不正确,无论在表单中确认还是放弃,表中都只有一条记录。求教!
求教,如题用缓冲数据进行记录生成与更新,但生成的数据没问题,却无法按我想的在确认后正确更新。请高手指点什么地方有误!
下面是定义的函数内容

****前面的数据定义过程省了,前面有函数定义和参数传递接收
SELECT 10   **为了避免冲突,设了个远的。
USE JKXFJHBLSB EXCLUSIVE  
DELETE ALL  **这是个临时表,以前数据没用。
=CURSORSETPROP("BUFFERING",4)  
=FLOCK()

****中间是记录赋值过程
MEMZJS=2+MEMSYYS+IIF(MEMSYTS>0,1,0)+1
MEMZHFZE=LXJS(MEMJKBJ,MEMQSRQ,MEMZZRQ,MEMLX1,MEMLX2,MEMLX3,MEMLX4)
MEMJDZXF=RZGWFJS(MEMJKBJ,MEMQSRQ,MEMZZRQ,MEMLX1,MEMLX2,MEMLX3,MEMLX4,MEMLX5)
MEMLXZE=MEMZHFZE-MEMJDZXF
FOR MEMLS=1 TO MEMZJS
   APPEND BLANK
ENDFOR
GO 1
REPLACE DABH WITH MEMDABH
GO 2
REPLACE DABH WITH MEMDABH*GO 3
IF MEMSYYS>0
   FOR MEMLS=1 TO MEMSYYS
      MEMMC='MEMYUE'+ALLTRIM(STR(MEMLS,2))
      SKIP
      REPLACE DABH WITH MEMDABH,KHBM WITH MEMKHBM,KHMC WITH MEMKHMC,JHRQ WITH &MEMMC,JHJE WITH ROUND(MEMJKBJ*(MEMLX4-MEMLX5),2),;
         CZYBM WITH SYSCZYBM,CZYXM WITH SYSCZYXM,CZRQ WITH DATE()
   ENDFOR
   MEMJLH=RECNO()
   SUM JHJE TO MEMYSX FOR ALLTRIM(JHXS)='收回'
   GO MEMJLH
ENDIF
IF MEMSYTS<>0 .AND. MEMSYYS<>0
   SKIP
   REPLACE DABH WITH MEMDABH,KHBM WITH MEMKHBM,KHMC WITH MEMKHMC,JHRQ WITH MEMZZRQ,JHJE WITH MEMLXZE-MEMYSX,;
      CZYBM WITH SYSCZYBM,CZYXM WITH SYSCZYXM,CZRQ WITH DATE()
ENDIF
SKIP
IF MEMSYYS<>0
   REPLACE DABH WITH MEMDABH,KHBM WITH MEMKHBM,KHMC WITH MEMKHMC,JHRQ WITH MEMZZRQ,JHJE WITH MEMJKBJ,;
      CZYBM WITH SYSCZYBM,CZYXM WITH SYSCZYXM,CZRQ WITH DATE()
ELSE
   REPLACE DABH WITH MEMDABH,KHBM WITH MEMKHBM,KHMC WITH MEMKHMC,JHRQ WITH MEMZZRQ,JHJE WITH MEMJKBJ+MEMLXZE-MEMYSX,;
      CZYBM WITH SYSCZYBM,CZYXM WITH SYSCZYXM,CZRQ WITH DATE()
ENDIF
REPLACE ALL JHXLH WITH RECNO()
MEMQR=''
GO TOP
****赋值结束
DO FORM JHBZ WITH MEMQR TO MEMQR1   ***调用表单在表格中显示生成的数据并修改,设两个按钮,一个返回.T. 一个返回.F.
IF MEMQR1=.T.
GO TOP
   BEGIN TRANSACTION
   MEMCG=TABLEUPDATE()
   IF MEMCG=.F.
      MEMZT=MESSAGEBOX('  数据保存未成功,请检查服务器及网络状态......',(5+48),'提示信息')
      IF MEMZT=4
         ROLLBACK    **选择重试,返回。
      ELSE
         TABLEREVERT(.T.)
         END TRANSACTION
      ENDIF
   ELSE
      END TRANSACTION
   ENDIF
   UNLOCK
ENDIF
USE
SELECT 1
RETURN
ENDFUNC
搜索更多相关主题的帖子: 数据表 
2012-05-28 10:39
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9810
专家分:26997
注 册:2012-2-5
收藏
得分:3 
逐段代码或逐行代码测试
加入MESSAGEBOX("123456") 测试运行情况
另外断章取意的代码说明不了问题

[ 本帖最后由 sdta 于 2012-5-28 20:29 编辑 ]

坚守VFP最后的阵地
2012-05-28 20:25
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11787
专家分:43421
注 册:2006-5-13
收藏
得分:3 
题外话:
建议不要指定工作区来打开表,这样很容易将其中正在使用的表关闭,从而造成程序运行出错。应该使用use 表名 in 0的方式打开表,然后用表别名来选择工作区。

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2012-05-29 06:45
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9810
专家分:26997
注 册:2012-2-5
收藏
得分:0 
不知你的代码在单机时运行是否正常

坚守VFP最后的阵地
2012-05-29 11:30
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:3 
在1楼的代码中,表本身已用独占模式打开,没必要再用什么缓冲,也无需锁定之类,本来就不存在这样的问题。

授人以渔,不授人以鱼。
2012-05-29 14:22
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9810
专家分:26997
注 册:2012-2-5
收藏
得分:0 
在数据录入的过程中,是否用了过程表。

坚守VFP最后的阵地
2012-05-29 15:08
arefeng
Rank: 2
等 级:论坛游民
帖 子:69
专家分:61
注 册:2012-5-30
收藏
得分:3 
好不容易看完了楼主的代码......辛苦啊,
建议楼主以后发代码上来时, 先使用VFP系统菜单--工具--修饰把代码给整理一下....:)

现在有一个关键问题需要确认:
JKXFJHBLSB 这个表是楼主要处理更新的表吗?

假设JKXFJHBLSB是楼主要处理更新的表吧, 谈谈我的意见:

以下这段代码以外的部分一定不会影响楼主的结果, 因为在这之前已经有一个form用于确认数据是否已经准备好了, 对吧?
IF MEMQR1=.T.
GO TOP
   BEGIN TRANSACTION
   MEMCG=TABLEUPDATE()
   IF MEMCG=.F.
      MEMZT=MESSAGEBOX('  数据保存未成功,请检查服务器及网络状态......',(5+48),'提示信息')
      IF MEMZT=4
         ROLLBACK    **选择重试,返回。
      ELSE
         TABLEREVERT(.T.)
         END TRANSACTION
      ENDIF
   ELSE
      END TRANSACTION
   ENDIF
   UNLOCK
ENDIF
好了,范围缩小了,再来细读吧......
在上代码段中, 发现对更新表真正起作用的其实只有一句:
=TABLEUPDATE()
其它都是保护性措施.
好了,范围更小了,再研究一下吧.....
这一句有问题吗?

有!
这一句有大问题,哈哈!

用下面这一句, 相信楼主的问题就会被解决掉了
=TABLEUPDATE(1)

这是最典型的一字之差,误国误民啊.
我不想打字, 大家看看VFP联机帮助TABLEUPDATE()函数的内容就明白了.

另外,
5楼tony说到楼主的做法没有必要, 我觉得楼主的思路还是有道理的,
应该主要是不想在复杂的数据处理过程中, 反反复复的replace中, 频繁地更新基本表,
如果是网络应用的话, 还是有较好的效果的.
2012-06-01 20:53
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
USE JKXFJHBLSB EXCLUSIVE  

授人以渔,不授人以鱼。
2012-06-01 21:35
arefeng
Rank: 2
等 级:论坛游民
帖 子:69
专家分:61
注 册:2012-5-30
收藏
得分:0 
tony,
楼主的编程技巧方面当然有许多欠缺, 代码中体现出来有一些明显是对VFP理解上的偏差,
但使用表缓冲的作法和想法我觉得是应当提倡的,这也是一个好的编程习惯.
就算是本地表也多少可以减少一些磁盘读写啊.
在1楼的代码中,表本身已用独占模式打开,没必要再用什么缓冲,也无需锁定之类,本来就不存在这样的问题
我不太赞同的是在5楼的观念, 独占打开表, 并不意味着表缓冲没有作用了.
例如:如果一个中间计算过程需要重写表中某些字段N次, 表缓冲对节省系统开销和提高速度作用是惊人的.
2012-06-01 22:04
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
我说的是不需要锁定那些共享指令。独占打开数据库本身就是带缓冲的。

授人以渔,不授人以鱼。
2012-06-01 22:07
快速回复:数据表缓冲数据更新不正确,无论在表单中确认还是放弃,表中都只有一条 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.012429 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved