以文本方式查看主题

-  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=30573)

--  作者:zpx_2012
--  发布时间:2013/3/30 14:42:00
--  累计出库自动更新的问题?(已解决)
各位老师,关于累计出库的问题

为了简化问题,重新上传了例子,免得大家一看很多就不想看了。只有一个关键问题,

就是出库明细的数量改变时怎么样让订单明细的datacolchanged事件触发。(不论订单明细有没有加载)。
即下面这句出库明细中的代码要怎么写才能触发订单明细中的datacolchanged事件?(贴出的当然是不起作用的。)

If e.datacol.name  = "数量" Then 
     \'先加载订单明细表中的数据
    Dim flt = "产品编码 = \'" & e.DataRow("产品编码") & "\' And 订单编号 = \'" & e.DataRow("来源单号") & "\'"
    DataTables("订单明细").Loadfilter = flt
    DataTables("订单明细").Load()
    
    Dim pr As DataRow \'\'触发事件更新累计出库
    pr = DataTables("订单明细").Find("[产品编码] = \'" & e.DataRow("产品编码") & "\'" & _
    "And 订单编号 = \'" & e.DataRow("来源单号") & "\'")
    If pr IsNot Nothing Then
        DataTables("订单明细").DataCols("产品编码").RaiseDataColChanged(pr)
    End If
    
End If


 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:累计出库自动更新的问题.foxdb



谢谢!



[此贴子已经被作者于2013-4-1 15:28:49编辑过]

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

不管你是红色的还是蓝色的代码,单单就这些代码,你的设计思路都大大的有问题,岂能因为更改一个数据,就去重新加载整个表? 岂能因为要计算一个值,就加载相关数据进来计算?

计算后台数据,可以看看:

 

http://www.foxtable.com/help/topics/0696.htm

 

Dim ld As Long
Dim 
cmd As New SQLCommand
cmd.CommandText = 
"Select sum(数量) From {订单} Where 产品 = \'PD01\' "

ld = cmd.ExecuteScalar()

 

 

表示统计产品PD01的总销量。


--  作者:晕了快扶我
--  发布时间:2013/3/30 15:15:00
--  

哈,楼主的问题跟我的一样的,解决这个问题的思路在狐爸没有更新的情况下很复杂,要分4种情况来分别写代码


--  作者:晕了快扶我
--  发布时间:2013/3/30 15:18:00
--  

http://www.foxtable.com/bbs/dispbbs.asp?BoardID=2&ID=29331&replyID=&skin=1

 

解决问题的思路是狐狸爸爸提供的:

http://www.foxtable.com/bbs/dispbbs.asp?BoardID=2&ID=29426&replyID=&skin=1

 

楼主先看看,搞不定我把我的代码贴给你


--  作者:zpx_2012
--  发布时间:2013/3/30 15:48:00
--  
谢谢二位,其实我要求也很简单,就是在订单明细的datachanged事件中的代码计算累计出库
Select Case e.DataCol.Name
    Case "产品编码","来源单号"
        \'计算累计出库
        Dim flt1 As String = "[产品编码] = \'" & e.NewValue & "\'and [来源单号] = \'" & e.DataRow("订单编号") & "\'"
        Dim cmd As New Sqlcommand
        Dim sd As Single
        cmd.CommandText = "SELECT Sum(数量) From {出库明细} where " & flt1
        sd = cmd.ExecuteScalar()
        e.DataRow("累计出库") = sd     
End Select

而每次当出库明细中的数量改变时用订单明细中的下述代码触发一下订单明细中的事件即可。
Select Case e.DataCol.Name
    Case "数量"
        If e.OldValue <> e.NewValue Then  \'如果数量改变重置生产明细中的列更新出库累计
            \'先加载订单明细表中的数据
            Dim flt = "产品编码 = \'" & e.DataRow("产品编码") & "\' And 订单编号 = \'" & e.DataRow("来源单号") & "\'"
            DataTables("订单明细").Loadfilter = flt
            DataTables("订单明细").Load()
            
            Dim pr As DataRow \'\'触发事件更新累计出库
            pr = DataTables("订单明细").Find("[产品编码] = \'" & e.DataRow("产品编码") & "\'" & _
            "And 订单编号 = \'" & e.DataRow("来源单号") & "\'")
            If pr IsNot Nothing Then
                DataTables("订单明细").DataCols("产品编码").RaiseDataColChanged(pr)
            End If
        End If
End Select

关键是出库明细中的数量改变后订单明细中的累计出库没有改变,但若用手动重置列的就可以,请问一下是哪里出的问题啊?


[此贴子已经被作者于2013-3-30 15:49:47编辑过]

--  作者:狐三
--  发布时间:2013/3/30 15:51:00
--  

你这么改一下看看:

 

If pr IsNot Nothing Then

     DataTables("订单明细").DataCols("产品编码").RaiseDataColChanged(pr)

     MessageBox.show("我触发了")

Else  

    MessageBox.show("订单明细表没有符合条件的行,是不是合成的条件有问题")

End If


--  作者:zpx_2012
--  发布时间:2013/3/30 15:59:00
--  
我当然有测试过啦,显示是没问题的,就是事件不会触发,但若我在订单明细中的事件改为加载表的形式(蓝色的代码)就可以,但那样就会出现我说的一楼的问题了。
--  作者:晕了快扶我
--  发布时间:2013/3/30 16:01:00
--  
以下是引用zpx_2012在2013-3-30 15:48:00的发言:
谢谢二位,其实我要求也很简单,就是在订单明细的datachanged事件中的代码计算累计出库
Select Case e.DataCol.Name
    Case "产品编码","来源单号"
        \'计算累计出库
        Dim flt1 As String = "[产品编码] = \'" & e.NewValue & "\'and [来源单号] = \'" & e.DataRow("订单编号") & "\'"
        Dim cmd As New Sqlcommand
        Dim sd As Single
        cmd.CommandText = "SELECT Sum(数量) From {出库明细} where " & flt1
        sd = cmd.ExecuteScalar()
        e.DataRow("累计出库") = sd     
End Select

而每次当出库明细中的数量改变时用订单明细中的下述代码触发一下订单明细中的事件即可。
Select Case e.DataCol.Name
    Case "数量"
        If e.OldValue <> e.NewValue Then  \'如果数量改变重置生产明细中的列更新出库累计
            \'先加载订单明细表中的数据
            Dim flt = "产品编码 = \'" & e.DataRow("产品编码") & "\' And 订单编号 = \'" & e.DataRow("来源单号") & "\'"
            DataTables("订单明细").Loadfilter = flt
            DataTables("订单明细").Load()
            
            Dim pr As DataRow \'\'触发事件更新累计出库
            pr = DataTables("订单明细").Find("[产品编码] = \'" & e.DataRow("产品编码") & "\'" & _
            "And 订单编号 = \'" & e.DataRow("来源单号") & "\'")
            If pr IsNot Nothing Then
                DataTables("订单明细").DataCols("产品编码").RaiseDataColChanged(pr)
            End If
        End If
End Select

关键是出库明细中的数量改变后订单明细中的累计出库没有改变,但若用手动重置列的就可以,请问一下是哪里出的问题啊?


[此贴子已经被作者于2013-3-30 15:49:47编辑过]

疯掉了,这个太简单了,你怎么搞那么复杂

你直接在出库单里用UPDATE更新订单明细不就好了吗?


--  作者:晕了快扶我
--  发布时间:2013/3/30 16:02:00
--  
Dim cmd As New SQLCommand
    cmd.C
    cmd.CommandText = "update {客户订单子表} SET 未交数 = \'" & e.DataRow("数量_未交数") & "\' where 客户订单编号 = \'" & e.DataRow("客户订单编号") & "\' And OPN = \'" & e.DataRow("料号") & "\'"
    cmd.ExecuteNonQuery()

--  作者:晕了快扶我
--  发布时间:2013/3/30 16:07:00
--  
我觉得楼主问题没你想得那么简单的,你动态加载的话要考虑到没有可能没有加载到前台来的数据的...