以文本方式查看主题

-  Foxtable(狐表)  (http://www.foxtable.com/bbs/index.asp)
--  专家坐堂  (http://www.foxtable.com/bbs/list.asp?boardid=2)
----  Datatable("xx").save() 数据一致问题  (http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=50369)

--  作者:tommyfung
--  发布时间:2014/5/5 19:19:00
--  Datatable("xx").save() 数据一致问题

数据环境 : 远程连接 ( VPN )

 

5-6发布 数据库事务 解决后台 数据一致问题

 

但在前台的如何解决 ?

 

以下代码为需一致更新以下数据表 :

分配备料单( PRWIRH, PRWIRD ),

物料主档 (GBITEM),

物料分仓库存(ICBALN)

交易帐(ICMOVH, ICMOVD)

 

问题 : 由於是远程数据, 有时网络速度不稳定, 致 "数据超时", 请教如何有效处理 ?

 

 

以下是主要更新代码 : 

 

    Dim drx As Row=Tables("PRWIRH").Current
        drx("STATUS") = 3
        DataTables("PRWIRH").save()

    Dim dry As Row=Tables("PRWIRD").Current
    Dim dra As Row=Tables("ICBALN").Current
    stno = Functions.Execute("Get_STNO")   \' Get and Update the EPN STNO
    Dim hrec As DataRow = DataTables("ICMOVH").AddNew()
        hrec("REF_NO") = stno
        hrec("TRAN_TYPE") = "MVMT"
        hrec("MOVE_DATE") = Date.Today
        hrec("VALUE_DATE") = Date.Today
        hrec("POSTED") = "N"
        hrec("POSTED_STEP1") = "N"
        hrec("FLOW_TYPE") = "T"
        hrec("MOVE_TYPE") = "DirTrn"
        hrec("LOC_FROM") = dry("Loc_from")
        hrec("LOC_TO") = dry("Loc_to")
        hrec("REFERENCE") = dry("Ref_no")
        hrec("LOG_NO") = 0
        hrec("SOURCE_TYPE") = "Entry"
        hrec("FINAL") = "N"
        hrec("BATCH_SELECT") = "N"
        hrec("GL_LINK") = "N"
        hrec("OWNER_BRANCH") = "01"
        hrec("SOURCE_BRANCH") = "01"
        hrec("FOLLOW_LIST") = "N"
        hrec("FROZEN") = "N"
        hrec("EXCLUDE_SCRAP") = "N"
        hrec("STEP_NO") = 0
        hrec("PERIOD") = PERIOD
        hrec("FISCAL_YEAR") = FISCAL_YEAR
        hrec("PERIOD_NO") = PERIOD_NO
        hrec("CREATED_BY") = "EPN2"
        hrec("CREATED_DATE") = servertime
        hrec("REVISED_BY") = "EPN2"
        hrec("REVISED_DATE") = servertime
        If Functions.Execute("RequestDataTable","EPN数据","select * from prwird where POSTED = 1 AND FINISHED = 0 AND [Assign_Qty] > 0 And [LOC_FROM] = \'" & hrec("LOC_FROM") & "\' AND [LOC_TO] = \'" & hrec("LOC_TO") & "\'" & " And REVISED_BY=N\'" & Functions.Execute("GetChUser") & "\' And REVISED_DATE=\'" & Date.Today & "\'").DataRows.Count>0 Then
           DataTables("ICMOVH").Save()
        End If

        \'Modify at 2013-09-09
        DataTables("PRWIRD").LoadFilter = "POSTED = 1 AND FINISHED = 0 AND [Assign_Qty] > 0 And [LOC_FROM] = \'" & hrec("LOC_FROM") & "\' AND [LOC_TO] = \'" & hrec("LOC_TO") & "\'" & " And REVISED_BY=N\'" & Functions.Execute("GetChUser") & "\' And REVISED_DATE=\'" & Date.Today & "\'"
        DataTables("PRWIRD").Load
        If(Tables("PRWIRD").Rows.Count=0) Then
           MessageBox.Show("没有分配数量","提示",MessageBoxButtons.Ok,MessageBoxIcon.Information)
           DataTables("ICMOVH").RejectChanges()
           Return
        End If
        Functions.Execute("ModifyRecord","EPN数据","UPDATE ICMOVH SET CREATED_DATE=GETDATE(),REVISED_DATE=GETDATE() WHERE REF_NO=\'" & stno & "\'")

      Dim LINENO As Integer = 1
      Dim dri As DataRow
      Dim dt As DataTable
      \'Return
      For Each dr As DataRow In DataTables("PRWIRD").DataRows
          dri = DataTables("ICBALN").Find("[item_no] = \'"&dr("ITEM_NO") & "\' and [LOC] = \'" & dr("LOC_FROM") & "\'")
          If dri IsNot Nothing Then   
             dri("QTY_COMMITTED") = dri("QTY_COMMITTED") + dr("ASSIGN_QTY")
             dri("QTY_RESERVED") = dri("QTY_RESERVED") - dr("ASSIGN_QTY")
             DataTables("ICBALN").Save()
          Else
             MessageBox.Show("Cannot write to ICBALN " & dr("Item_no"))
             Exit For
          End If

 

\'         ** Update GBITEM
         cmd.CommandText = "Select * FROM {GBITEM} Where Item_no = \'" & dr("ITEM_NO") & "\'"   \'注意要包括主键列
         dt = cmd.ExecuteReader(True) \'注意可选参数设置为True

         For Each drg As DataRow In dt.DataRows
             drg("QTY_COMMITTED") = drg("QTY_COMMITTED") + dr("ASSIGN_QTY")
             drg("QTY_RESERVED") = drg("QTY_RESERVED") - dr("ASSIGN_QTY")
             drg("QTY_NET_AVAILABLE")=drg("QTY_NET_AVAILABLE")-dr("ASSIGN_QTY")
         Next
         dt.Save()

 

         Dim nrec As DataRow = DataTables("ICMOVD").AddNew()
          nrec("REF_NO") = stno
          nrec("LINE_NO") = lineno
          nrec("ITEM_NO") = dr("ITEM_NO")
          nrec("DESCRIPTION") = dr("DESCRIPTION")
          nrec("UOM") = dr("Uom")
          nrec("LOT_SIZE") = 1
          nrec("LINE_REF") = dr("Job_no")
          nrec("QTY") = dr("Assign_Qty")
          nrec("BASE_QTY") = dr("Assign_qty")
          nrec("FINAL") = "N"
          nrec("FLOW_TYPE") = "T"
          nrec("ALLOC_METHOD") = "N"
          nrec("SOURCE_TYPE") = "Entry"
          nrec("SOURCE_ENTRY_NO") = 0
          nrec("LOC_FROM") = dr("Loc_from")
          nrec("LOC_TO") = dr("Loc_to")
          dr("issued_qty") = dr("issued_qty") + dr("assign_qty")
          dr("assign_qty") = 0
          If(Cstr(dr("st_no"))<>"") Then
            dr("st_no") = dr("st_no")+","+stno
          Else
            dr("st_no") =stno
          End If
          dr("Finished") = iif(dr("Need_Qty")-dr("Issued_qty")-dr("Assign_Qty") = 0,1,0)
          DataTables("ICMOVD").Save()
          dr.Save()
          lineno = lineno + 1
      Next
      DataTables("PRWIRD").Save

 

[此贴子已经被作者于2014-5-5 19:25:54编辑过]

--  作者:有点甜
--  发布时间:2014/5/5 19:28:00
--  

 5.6版本的事务,不能用于Datatables().Save方法,只有用sqlCommand的,才能用事务。

 

 或许以后可能会对save方法进行事务的支持,而现在,你只能是用sql语法的方法才能达到你的功能需求。


--  作者:tommyfung
--  发布时间:2014/5/5 20:04:00
--  

以上代码有改善吗, 可减少数据不一致情况 ?

 


--  作者:有点甜
--  发布时间:2014/5/5 20:12:00
--  
以下是引用tommyfung在2014-5-5 20:04:00的发言:

以上代码有改善吗, 可减少数据不一致情况 ?

 

 

只要是大量数据的save操作,都有网络断开导致一些数据保存一些数据不保存的可能。

 

如果要精确的话,就必须把你的dr.save() 改成sql语句,如 update {表A} set 第一列 = 2 where _Identify = 123