回 帖 发 新 帖 刷新版面

主题:这样锁定表对吗?

ck_cp_op.dbf  是表头,  ck_cp_o.dbf是明细表, 它们是通过字段bm_bh相关联。  字段bm_bh是编号的意思( 二个表中都有该字段) 

在多用户操作中, 

因为有多用户同时在二个表中增加数据, 为了避免二个表中的数据不会混乱和相同编号的记录

因此我用下面蓝色的代码先把表头锁定, 当第二个用户同时增加记录时会出现('表被其他用户使用中')

请问我下面修改的对吗???  蓝色的是我修改的代码?

 

if h_choice = 0         **增加数据
      SELECT ck_cp_o
    if flock('ck_cp_o')               **锁定表头

      set order to bm_bh
      go bott
      l_bm_bh = '6'+PADL(alltrim(str(val(substr(ck_cp_o.bm_bh,2,8))+1,7)),7,'0')
      APPEND BLANK
      REPL ck_cp_o.bm_bh WITH  L_BM_BH
      THISFORM.LABEL3.CAPTION = ck_cp_o.bm_bh
      THISFORM.tck_date.VALUE = DTOC(DATE())
      select ck_cp_op
      append blank   
      REPL ck_cp_op.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.tdw_buy.setfocus

    else

       MESSAGEBIX('表被其他用户使用中')
   endi

else

"存盘"代码为:  tableupdate(.t.,.f.,"ck_cp_o")

                      tableupdate(.t.,.f.,"ck_cp_op")

rollback
unlock all         解除锁定

endi

回复列表 (共2个回复)

沙发

几个建议:
1.用SQL语句,可以免去加锁解锁的步骤,但速度略慢.但仍然比你的例子占优.
2.加锁失败时,Messagebox( )可以使用定时,最好还加上(自动)重试的选择.
3.有了加锁解锁,好像不需要事件回滚了吧?我没用过事件回滚,只是感觉.

板凳

很好的文章啊!-------------------------------------------Jordan brand continues to prosper and expansion of its stores throughout the many countries around the world.[url=http://www.cheapjordanforsale.us]cheap jordans[/url] , [url=http://www.cheapjordanforsale.us/air-jordan-11-retro-c-11.html]retro jordan 11[/url] , [url=http://www.cheapjordanforsale.us/air-jordan-13-retro-c-13.html]retro jordan 13[/url] , [url=http://www.cheapjordanforsale.us/air-jordan-5-retro-c-5.html]retro jordan 5[/url]

我来回复

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