回 帖 发 新 帖 刷新版面

主题:局域网中同时输入出错

各位师付你们好:  有一个问题想请教大家,详细说明一下:

我用VFP编的一个程序放在服务器上,  有三个客户端, 当只有一个客户端输入数量时:保存的数据正确, 但是当二个或三个客户端同时输入数据时, 保存的数量就有问题了(数据头和数据明细混乱:  同一组数据,数据头是张三输入的, 明细是李四输入的)

 

此数据界面的init过程中有以下代码:

IF .NOT. USED ('ck_yl_i')
USE IN SELECT(1) ck_yl_i shared
ENDI
select ck_yl_i
set order to bm_bh

IF .NOT. USED ('ck_yl_ip')
USE IN SELECT(1) ck_yl_ip shared
ENDI
select ck_yl_ip
set order to bm_bh

select ck_yl_i
thisform.label3.caption = ck_yl_i.bm_bh
SELECT ck_yl_ip
SET FILTER TO ck_yl_i.bm_bh=ck_yl_ip.bm_bh
SUM bao_num TO A_1 FOR ck_yl_i.bm_bh=ck_yl_ip.bm_bh
SUM baoh TO A_2 FOR ck_yl_i.bm_bh=ck_yl_ip.bm_bh
THISFORM.CONTAINER1.CONTAINER2.LABEL4.CAPTION = STR(A_1,6)
THISFORM.CONTAINER1.CONTAINER2.LABEL5.CAPTION = STR(A_2,4)
GO TOP
thisform.refresh

 

 

按“增加”按钮时出现以下代码:

 

if h_choice = 0  &&增加

SELECT ck_yl_i
      set order to bm_bh
      go bott
      l_bm_bh = PADL(alltrim(str(val(substr(ck_yl_i.bm_bh,1,8))+1,8)),8,'0')
      APPEND BLANK
      REPL ck_yl_i.BM_BH WITH  L_BM_BH
      THISFORM.LABEL3.CAPTION = ck_yl_i.BM_BH
      THISFORM.crk_date.VALUE = DTOC(DATE())
      select ck_yl_ip
      append blank   
      REPL ck_yl_ip.BM_BH WITH  L_BM_BH
      thisform.setena           &&h_choice = 1  
      THISFORM.CONTAINER1.CONTAINER2.LABEL4.CAPTION = STR(0,6)
      THISFORM.CONTAINER1.CONTAINER2.LABEL5.CAPTION = STR(0,4)     
      THISFORM.REFRESH
      thisform.cfrom_wh.setfocus

 

 

请问怎样修改代码可以解决问题???

回复列表 (共10个回复)

沙发

局域网内的多用户,没那么简单吧。
好好研究表的锁定与更新问题。弄懂后你的问题就解决了。

板凳


看了VFP几本书, 还是没弄明白。 能帮我改一下上面的代码吗?

3 楼

先解释一下锁定:

一个办公室三个人,只有一间洗手间.
三个人同时要上洗手间,怎么办?
那肯定是谁先进去谁先用,而且,还要上锁 Lock
否则,其他人有可能急得不得了了,要抢用.

另外,共享数据库最好是使用SQL语句,可以最大程度的减少冲突.

而我自己,通常是双管齐下.

关键词: Lock, SQL

4 楼


谢谢moz这位大哥让我理解了lock的意思。 但是我最好希望有三个洗手间, 这样大家互不冲突。 至少要二个工作台同时使用。

可以的话我能把表单发给你吗? 帮我看一下?

5 楼

其实我想批评你,但又好像没有这个资格.
再回过头来检查一下我自己的耐心,确实是有限度.
不过,我应该尽自己的努力去控制吧.

我举例的洗手间,相当于数据库存放的主机.
你要两间或三间,那就各自整独立的数据库嘛.
这么一来,就不是共享了.

我不知道你是怎么学的,或者说学来做什么的.
一般到这里来的,都是学生或是有一定基础的,
通常情况下,不可能没学会走路,就先学跑的.

基础课程里面,都应该会有介绍如何处理冲突,
或者解释什么叫分时之类的东西吧,(虽然我已经很多很多年没接触教材了.)

我不太明白你所说的同时输入是什么意思.
比如甲在输入第9条数据,乙不可能也在输入第9条数据吧?
如果这两个人都同时在输入同一条数据,冲突是摆明是要存在的,该以谁的为准?
如果这两个人输入的是不同的数据,那不简单了?
谁先完成输入,谁先保存.
(这是程序里面实现的,并不是说你想让谁保存的意思,我觉得向你解释这个问题真的很郁闷.)
即使这两个人同时保存,就好比是双胞胎出生一样,肯定是会有一个先一个后的,
不可能是同一时刻的.
不管是网络数据传输的先后也好,指令序列的先后也好,肯定是会有一个先后顺序的.
就拿千分之一秒的计算机时序来说,这两个人在那千分之一秒钟里面同时保存,这个机率会有多低,可以想想看是不是该去买双色球了.

几个人同时去洗手间是怎么处理的?
先看看上锁了没有,如果上锁了,等多一会再检查看看.
如果没锁,就上锁,用完之后解锁.让下一位上,

不知道这样解释是不是太哆哩哆嗦了.
实在看不明白我也没办法了,找你们老师去吧,顺便带瓶可乐去,估计他已经被你气得不行了.

6 楼

pfan连换行符都删了,唉,不知道怎么说了.

7 楼

很不错呢------------------------------- [url=http://www.sacchanelpascher2013.com]sac chanel[/url] ,[url=http://www.chaussuresgucci2013.com]chaussures gucci[/url] , [url=http://www.chaussureslacostehomme.com]chaussures lacoste[/url] , [url=http://www.chaussuresprada2013.com]chaussures prada[/url] , [url=http://www.zapatosprada.es]zapatos prada[/url]

8 楼

不是三言两语能说清楚的。

9 楼

6666666666666666666666666666

10 楼

5楼说对了,你的数据库打开方式,非共享方式,即独占式,就引发其他人操作错误啦

我来回复

您尚未登录,请登录后再回复。点此登录或注册