以文本方式查看主题

-  Foxtable(狐表)  (http://www.foxtable.com/bbs/index.asp)
--  专家坐堂  (http://www.foxtable.com/bbs/list.asp?boardid=2)
----  【求助】关于动态加载后出现的问题  (http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=29300)

--  作者:even0898
--  发布时间:2013/3/4 11:15:00
--  【求助】关于动态加载后出现的问题

If e.DataCol.Name = "数量_本次交"
    DataTables("客户订单主表").LoadFilter = "客户订单编号 = \'" & e.DataRow("客户订单编号") & "\'"
    DataTables("客户订单主表").Load()
    If DataTables("客户订单主表").DataRows.Count = 0 Then \'如果订单表没有数据
        DataTables("客户订单子表").LoadFilter = "客户订单编号 Is Null" \'不加载订单明细
    Else
        Dim ids As String
        For Each dr1 As DataRow In DataTables("客户订单主表").DataRows
            ids = ids & ",\'" & dr1("客户订单编号") & "\'"
        Next
        ids= ids.Trim(",")
        DataTables("客户订单子表").LoadFilter = "客户订单编号 In (" & ids & ")"
    End If
    DataTables("客户订单子表").LoadTop = ""
    DataTables("客户订单子表").Load()
    Dim dr As DataRow = DataTables("客户订单子表").Find("客户订单编号 = \'" & e.DataRow("客户订单编号") & "\'And OPN =\'" & e.DataRow("料号") & "\'")
    DataTables("产品资料子表").LoadFilter = "料号 = \'" & e.DataRow("料号") & "\'"
    DataTables("产品资料子表").load()
    Dim cr As DataRow = DataTables("产品资料子表").Find("料号 = \'" & e.DataRow("料号") & "\'")
    DataTables("销售出库单子表").LoadFilter ="客户订单编号 = \'" & e.DataRow("客户订单编号") & "\'"
    \'DataTables("销售出库单子表").load()
  Dim v As Integer = DataTables("销售出库单子表").Compute("sum(数量_本次交)","客户订单编号 = \'" & e.DataRow("客户订单编号") & "\'And 料号 =\'" & e.DataRow("料号") & "\'")

    For Each pr As DataRow In DataTables("销售出库单子表").Select("客户订单编号 = \'" & e.DataRow("客户订单编号") & "\' And 料号 =\'" & e.DataRow("料号") & "\'")
        pr("数量_累交数") =  v
        pr("数量_未交数") = e.DataRow("数量_订单数")-v
    Next
    dr("累交数") = e.DataRow("数量_累交数")
    dr("未交数") = dr("数量")-dr("累交数")
    cr("当前库存") = cr("当前库存")- e.NewValue+e.OldValue
    DataTables("客户订单主表").LoadFilter ="客户订单编号 = \'" & e.DataRow("客户订单编号") & "\'"
    DataTables("客户订单主表").load()
    Dim vr As DataRow = DataTables("客户订单主表").Find("客户订单编号 = \'" & e.DataRow("客户订单编号") & "\'")
    Dim temp As Integer = DataTables("客户订单子表").Compute("sum(未交数)","客户订单编号 = \'" & e.DataRow("客户订单编号") & "\'")
    If temp > 0 Then
        vr("结案")  = False
    Else
        vr("结案") = True
    End If
End If

 

==========================================

这段代码写在Datacolchanged事件里

我需要通过“数量_本次交”的事件来更新{客户订单子表},{客户订单主表},{产品资料子表},{销售出库单子表}的相关数据

问题处在标红的这句代码上

如果没有这句,后台的数据无法加载到前台来进行COMPUTE的统计,会导致数据出错,如果有这句,compute的代码又无法执行出错,因为当前数据被刷新,想到用SQL的UPDATE来写,后面的代码又涉及到更复杂的逻辑,不知道怎么办了

[此贴子已经被作者于2013-3-4 11:16:38编辑过]

--  作者:even0898
--  发布时间:2013/3/4 11:28:00
--  
以下是引用muhua在2013-3-4 11:20:00的发言:

Dim cmd As New SQLCommand
Dim dt As DataTable
cmd.C
cmd.CommandText = "SELECT DISTINCT Name From {Users}"
dt = cmd.ExecuteReader()

 

通过这种方法来获取外部数据源表

 

 

也就是

 

Dim v As Integer = DataTables("销售出库单子表").Compute("sum(数量_本次交)","客户订单编号 = \'" & e.DataRow("客户订单编号") & "\'And 料号 =\'" & e.DataRow("料号") & "\'")

 

换成:

 

Dim cmd As New SQLCommand
Dim dt As DataTable
cmd.C
cmd.CommandText = "SELECT * From {销售出库单子表} where 客户订单编号 = \'" & e.DataRow("客户订单编号") & "\'And 料号 =\'" & e.DataRow("料号") & "\'"
dt = cmd.ExecuteReader()

Dim v As Integer = dt.Compute("sum(数量_本次交)","")

 

这个方法只能查询,我需要的是同时把后台数据给替换掉,你看这句

For Each pr As DataRow In DataTables("销售出库单子表").Select("客户订单编号 = \'" & e.DataRow("客户订单编号") & "\' And 料号 =\'" & e.DataRow("料号") & "\'")
        pr("数量_累交数") =  v
        pr("数量_未交数") = e.DataRow("数量_订单数")-v
    Next

如果我用UPDATE来直接更新后台数据的话

dr("累交数") = e.DataRow("数量_累交数")
    dr("未交数") = dr("数量")-dr("累交数")

...

等等这些值的更新又会涉及到当前行是新增的还是在已经在数据库里的判断,非常复杂,我昨晚上全部用COMMAND写的,自己都看晕了,也没完成,我把代码也贴一下吧

所以今天我想把数据加载到前台来,统计完了后保存到后台去,这样子最方便,可是就碰到上面的问题

=================

If e.DataCol.Name = "数量_本次交" Then
    Dim dt As DataTable
    Dim cmd As New SQLCommand
    cmd.C
    cmd.CommandText = "select * from {客户订单子表} where 客户订单编号 =\'" & e.DataRow("客户订单编号") & "\' And OPN =\'" & e.DataRow("料号") & "\'"
    dt = cmd.ExecuteReader \'生成客户订单子表
    Dim dr As DataRow = dt.Find("客户订单编号 =\'" & e.DataRow("客户订单编号") & "\'And OPN =\'" & e.DataRow("料号") & "\'")
msgbox(dr("OPN"))
    Dim cmd1 As New SQLCommand
    cmd1.C
    cmd1.CommandText ="select * from {销售出库单子表} where 客户订单编号 = \'" & e.DataRow("客户订单编号") & "\'And 料号 =\'" & e.DataRow("料号") & "\'"
    Dim dt1 As DataTable = cmd1.ExecuteReader \' 生成销售出库单子表
    Dim v As Integer = dt1.Compute("sum(数量_本次交)","客户订单编号 = \'" & e.DataRow("客户订单编号") & "\'And 料号 =\'" & e.DataRow("料号") & "\'")
msgbox(v)  
 Dim cmd2 As New SQLCommand
    cmd2.C
    cmd2.CommandText = "UPDATE {销售出库单子表} SET 数量_未交数 = V 数量_未交数 = \'" & e.DataRow("数量_订单数") & "\' - v Where 客户订单编号 = \'" & e.DataRow("客户订单编号") & "\'And 料号 =\'" & e.DataRow("料号") & "\'"
    Dim dr1 As DataRow = dt1.Find("_Identify =\'" & e.DataRow("_Identify") & "\'")
    If dr1 Is Nothing Then
        e.DataRow("数量_累交数") = V + e.NewValue
    Else
        e.DataRow("数量_累交数") =V + e.NewValue -e.OldValue
    End If
    e.DataRow("数量_未交数") =  e.DataRow("数量_订单数") - e.DataRow("数量_累交数")
    Dim cmd3 As New SQLCommand
    cmd3.C
    cmd3.CommandText ="UPDATE {客户订单子表} SET 累交数 = V 未交数 = 数量-v Where 客户订单编号 = \'" & e.DataRow("客户订单编号") & "\'And OPN =\'" & e.DataRow("料号") & "\'"
    Dim cmd4 As New SQLCommand
    cmd4.C
    cmd4.CommandText = "UPDATE {产品资料子表} SET 当前库存= 当前库存 - \'" & e.NewValue & "\' +  \'" & e.OldValue & "\' where 料号 =\'" & e.DataRow("料号") & "\'"
    Dim cmd5 As New SQLCommand
    cmd5.C
    Dim temp As Integer = dt.Compute("sum(未交数)","客户订单编号 = \'" & e.DataRow("客户订单编号") & "\'")
    If temp > 0 Then
        cmd5.CommandText = "UPDATE {客户订单主表} SET 结案 = 0 where 客户订单编号 = \'" & e.DataRow("客户订单编号") & "\'"
    Else
        cmd5.CommandText = "UPDATE {客户订单主表} SET 结案 = 1 where 客户订单编号 = \'" & e.DataRow("客户订单编号") & "\'"
    End If
End If

 



 

[此贴子已经被作者于2013-3-4 11:28:24编辑过]

--  作者:even0898
--  发布时间:2013/3/4 11:32:00
--  

我做个简单的例子吧,很简单,就是把所有的表加载条件设置为[_Identify] Is Null后可以达到我全部加载后的效果

全部加载后的代码我已经写好了

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:库存演算.foxdb


--  作者:even0898
--  发布时间:2013/3/4 11:35:00
--  

狐狸爸爸,我不知道是自己还有地方没看到,还是狐表关于动态加载的设计还有待完善的地方,在动态加载后需要同步更新后台数据方面我真的感觉太吃力了


--  作者:even0898
--  发布时间:2013/3/4 15:08:00
--  
顶!
--  作者:狐狸爸爸
--  发布时间:2013/3/4 15:10:00
--  
下次更新,给ExcuteReader生成的表,加上Save功能吧。
--  作者:狐狸爸爸
--  发布时间:2013/3/4 15:12:00
--  

此外,计算也并非一定要加载才能计算啊,也可以用SQL语句直接计算后台数据的。


--  作者:even0898
--  发布时间:2013/3/4 15:12:00
--  
以下是引用狐狸爸爸在2013-3-4 15:10:00的发言:
下次更新,给ExcuteReader生成的表,加上Save功能吧。

那现在,狐爸爸,我的问题要如何解决呢?现在卡这了...


--  作者:even0898
--  发布时间:2013/3/4 15:16:00
--  
以下是引用狐狸爸爸在2013-3-4 15:12:00的发言:

此外,计算也并非一定要加载才能计算啊,也可以用SQL语句直接计算后台数据的。

是后面的代码要更新的,这一句是可以用后台直接统计,后面的for..next里就是涉及到很麻烦的问题了,我上面跟帖有说的


--  作者:狐狸爸爸
--  发布时间:2013/3/4 15:48:00
--  

如果有这句,compute的代码又无法执行出错

 

这是什么意思?