以文本方式查看主题

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

--  作者:whx007
--  发布时间:2018/5/2 5:02:00
--  表达式有时候不能计算

销售明细表DataColChanged事件代码:

If forms("销售主界面").opened = True AndAlso (e.DataCol.Name ="数量" OrElse e.DataCol.Name ="单价")  Then
    Dim Filter As String = "订单号 = \'" & e.DataRow("订单号") & "\'"
    Dim sum As Double = 0
    For Each r As Row In Tables("销售明细表").Rows
        sum + = r("金额")
    Next
    Forms("销售主界面").Controls("TextBox9").Text =  sum - val(Forms("销售主界面").Controls("TextBox3").Text)
End If

If e.DataCol.name = "金额" Then
    Dim pr As DataRow = e.DataRow.GetParentRow("销售订单") \'找出对应的父行
    If pr IsNot Nothing Then
        DataTables("销售订单").DataCols("金额").RaiseDataColChanged(pr)  \'通知系统此父行的数量列发生了改变,触发DataColChanged事件
    End If
End If

\'自动输入
If e.DataCol.Name ="产品型号" Then \'发生变化的是产品名称吗?
    \'在产品表找出该产品
    Dim dr As DataRow = DataTables("产品入库表").Find("产品型号 = " & "\'" & e.DataRow("产品型号") & "\'" )
    If dr IsNot Nothing\'如果找到,则设置各列内容
        e.DataRow("产品类别")= dr("产品类别")
        e.DataRow("单价")= dr("销售单价")
    End If
End If

\'计算已提数量

If e.DataCol.Name = "产品型号" Then \'发生变化的是产品列.
    \'则累计订单表中同名产品总的销售量,然后赋值给变动行的数量列
    e.DataRow("已提数量") = Tables("订单出库明细表").Compute("Sum(已提数量)","产品型号 = \'" & e.DataRow("产品型号") & "\' And 订单号 = \'" & e.DataRow("订单号") & "\'")
End If

 

订单出库明细表DataColChanged事件代码:

Select Case e.DataCol.Name
    Case "产品型号","数量","已提数量","订单号"
        Dim dr As DataRow
        Dim mr As DataRow = e.DataRow
        Dim drs As List(of DataRow)
        dr = e.DataTable.Find("[_SortKey] < " & mr("_SortKey") & " And [产品型号] = \'" & mr("产品型号") & "\'And [订单号] = \'" & mr("订单号") & "\'",  "[_SortKey] Desc")
        If dr Is Nothing Then
            mr("未提数量") = mr("数量") - mr("已提数量")
            dr = mr
        End If
        drs = e.DataTable.Select("[_SortKey] >= " & dr("_SortKey") & " And [产品型号] = \'" & dr("产品型号") & "\'And [订单号] = \'" & dr("订单号") & "\'",  "[_SortKey]")
        For i As Integer = 1 To drs.Count - 1
            drs(i)("未提数量") = drs(i-1)("未提数量") - drs(i)("已提数量")
        Next
        If e.DataCol.Name = "产品型号" AndAlso e.OldValue IsNot Nothing AndAlso e.OldValue <> e.NewValue Then
            dr = e.DataTable.Find("[_SortKey] < " & mr("_SortKey") & " And [产品型号] = \'" & e.OldValue & "\'And [订单号] = \'" & e.OldValue & "\'", "[_SortKey] Desc")
            If dr Is Nothing Then
                dr = e.DataTable.Find("[产品型号] = \'" & e.OldValue & "\'", "[_SortKey]")
                If dr IsNot Nothing Then
                    dr("未提数量") = dr("数量") - dr("已提数量")
                End If
            End If
            If dr IsNot Nothing Then
                drs = e.DataTable.Select("[_SortKey] >= " & dr("_SortKey") & " And [产品型号] = \'" & dr("产品型号") & "\'", "[_SortKey]")
                For i As Integer = 1 To drs.Count - 1
                    drs(i)("未提数量") = drs(i-1)("未提数量") - drs(i)("已提数量")
                Next
            End If
        End If
End Select


\'强制重置

DataTables("销售明细表").DataCols("产品型号").RaiseDataColChanged()  \'通知系统此父行的数量列发生了改变,触发DataColChanged事件

 

问题1:销售明细表和订单出库明细表通过订单号关联,销售明细表的已提数量通过红色的代码计算得来,但有时候不计算。

问题2:订单明细表的强制重置,触发销售明细表的DataColChanged事件代码,如下代码重置:

\'自动输入
If e.DataCol.Name ="产品型号" Then \'发生变化的是产品名称吗?
    \'在产品表找出该产品
    Dim dr As DataRow = DataTables("产品入库表").Find("产品型号 = " & "\'" & e.DataRow("产品型号") & "\'" )
    If dr IsNot Nothing\'如果找到,则设置各列内容
        e.DataRow("产品类别")= dr("产品类别")
        e.DataRow("单价")= dr("销售单价")
    End If
End If

运行这段代码后把所有修改过价格的订单都恢复到原始的价格数值了。

    


此主题相关图片如下:无标题.png
按此在新窗口浏览图片

 

新增明细按钮的代码如下:

Dim r As Row = Tables("订单出库明细_Table2").Current
Dim dr As Row = Tables("订单出库明细表").Addnew
dr("提货日期") = Date.Today \'将新增行的日期设为当天日期.
dr("产品型号") = r("产品型号")
dr("订单号") = r("订单号")
dr("数量") = r("数量")

点击该按钮运行时间很长,大约2-3秒。是不是因为强制重置后,使得每个销售明细的价格发生了变化(回复原值)造成的。

 

以上3个问题请专家指点,谢谢!

[此贴子已经被作者于2018/5/2 5:08:41编辑过]

--  作者:有点甜
--  发布时间:2018/5/2 8:47:00
--  

1、

 

If e.DataCol.Name = "产品型号" orElse e.DataCol.Name = "订单号" Then \'发生变化的是产品列.
    \'则累计订单表中同名产品总的销售量,然后赋值给变动行的数量列
    e.DataRow("已提数量") = Tables("订单出库明细表").Compute("Sum(已提数量)","产品型号 = \'" & e.DataRow("产品型号") & "\' And 订单号 = \'" & e.DataRow("订单号") & "\'")
End If

 

2、

 

If e.DataCol.Name ="产品型号" Then \'发生变化的是产品名称吗?
    \'在产品表找出该产品
    Dim dr As DataRow = DataTables("产品入库表").Find("产品型号 = " & "\'" & e.DataRow("产品型号") & "\'" )
    If dr IsNot Nothing\'如果找到,则设置各列内容
        e.DataRow("产品类别")= dr("产品类别")
        If e.DataRow("单价") = Nothing Then
            e.DataRow("单价")= dr("销售单价")
        End If
    End If
End If

 

3、强制重置代码,不要写到datacolchanged事件。如果要写请加上条件,如

 

DataTables("销售明细表").DataCols("产品型号").RaiseDataColChanged("产品型号 = \'" & e.DataRow("产品型号") & "\' And 订单号 = \'" & e.DataRow("订单号") & "\'"


--  作者:whx007
--  发布时间:2018/5/4 1:47:00
--  
谢谢有点甜!
--  作者:whx007
--  发布时间:2018/5/7 16:02:00
--  表达式不能正常计算
在销售开单界面,新增订单的时候同时向销售明细表和订单出库明细表中添加数据,销售明细表的datacolchanged没有触发,不能计算已提数量和未提数量:


图片点击可在新窗口打开查看此主题相关图片如下:tim截图20180506200820.jpg
图片点击可在新窗口打开查看

 
但在订单出库明细窗口增加出库明细时可以正常计算:

图片点击可在新窗口打开查看此主题相关图片如下:tim截图20180506201731.jpg
图片点击可在新窗口打开查看

 
ADD product click代码:
Dim ddh As String = e.Form.Controls("textbox2").value
Dim dr As DataRow = DataTables("销售订单").find("订单号 = \'" & ddh & "\'")
If dr IsNot Nothing Then
    MessageBox.Show("该订单号已经存在,请重新输入订单号!", "错误提示")
Else
    Dim rq As String = e.Form.Controls("DateTimePicker1").Value
    \'Dim khmc As String = e.Form.Controls("textbox12").Value
    \'Dim khdh As String = e.Form.Controls("textbox1").Value
    Dim cpxh As String = e.Form.Controls("dropbox1").Value
    Dim dj As String = e.Form.Controls("textbox5").Value
    Dim sl As String = e.Form.Controls("NumericComboBox2").Value
    If rq = "" Then
        MessageBox.Show("请输入销售日期,不能为空!", "错误提示")
        \'ElseIf khmc = "" Then
        \'MessageBox.Show("客户名称不能为空,请输入!", "错误提示")
        \'ElseIf khdh = "" Then
        \'MessageBox.Show("客户电话不能为空,请输入!", "错误提示")
    ElseIf cpxh = "" Then
        MessageBox.Show("The product model cannot be empty,please enter产品型号不能为空,请输入!", "错误提示")
    ElseIf sl = "" Then
        MessageBox.Show("The quantity cannot be empty,please enter(请输入数量,不能为空!)", "错误提示")
    Else
        Dim tbl As Table = Tables("销售明细表")
        Dim tb As Table = Tables("订单出库明细表")
        Dim r As Row = tbl.AddNew()
        Dim r1 As Row = tb.AddNew()
        r1("提货日期") = e.Form.Controls("datetimepicker1").Text
        r("订单号") = e.Form.Controls("TextBox2").Text
        r1("订单号") = e.Form.Controls("TextBox2").Text
        r("产品型号") = e.Form.Controls("dropbox1").Text
        r1("产品型号") = e.Form.Controls("dropbox1").Text
        r("产品类别") = e.Form.Controls("产品类别").Text
        r("成本") = e.Form.Controls("成本").Text
        r("单价") = e.Form.Controls("TextBox5").Text
        r("数量") = e.Form.Controls("NumericComboBox2").Text
        r1("数量") = e.Form.Controls("NumericComboBox2").Text
        \'r("已提数量") = e.Form.Controls("NumericComboBox1").Text
        r1("已提数量") = e.Form.Controls("NumericComboBox1").Text
        If tbl.Current IsNot Nothing Then
            tbl.Current.Save()
            \'tb.Current.Save()
        End If
    End If
End If

e.Form.Controls("DropBox1").Value = " "
e.Form.Controls("textbox5").Value = " "
e.Form.Controls("NumericComboBox2").Value = " "
e.Form.Controls("未提数量").Text = "未知"

销售明细表datacolchanged:
If forms("销售主界面").opened = True AndAlso (e.DataCol.Name ="数量" OrElse e.DataCol.Name ="单价")  Then
    Dim Filter As String = "订单号 = \'" & e.DataRow("订单号") & "\'"
    Dim sum As Double = 0
    For Each r As Row In Tables("销售明细表").Rows
        sum + = r("金额")
    Next
    Forms("销售主界面").Controls("TextBox9").Text =  sum - val(Forms("销售主界面").Controls("TextBox3").Text)
End If

If e.DataCol.name = "金额" Then
    Dim pr As DataRow = e.DataRow.GetParentRow("销售订单") \'找出对应的父行
    If pr IsNot Nothing Then
        DataTables("销售订单").DataCols("总金额").RaiseDataColChanged(pr)  \'通知系统此父行的数量列发生了改变,触发DataColChanged事件
    End If
End If

\'自动输入
If e.DataCol.Name ="产品型号" Then \'发生变化的是产品名称吗?
    \'在产品表找出该产品
    Dim dr As DataRow = DataTables("产品入库表").Find("产品型号 = " & "\'" & e.DataRow("产品型号") & "\'" )
    If dr IsNot Nothing\'如果找到,则设置各列内容
        e.DataRow("产品类别")= dr("产品类别")
        If e.DataRow("单价") = Nothing Then
            e.DataRow("单价")= dr("销售单价")
        End If
    End If
End If

If e.DataCol.Name = "产品型号" OrElse e.DataCol.Name = "订单号" Then \'发生变化的是产品列和订单号
    \'则累计订单出库明细表中同名产品总的销售量,然后赋值给变动行的已提数量列
    e.DataRow("已提数量") = Tables("订单出库明细表").Compute("Sum(已提数量)","产品型号 = \'" & e.DataRow("产品型号") & "\' And 订单号 = \'" & e.DataRow("订单号") & "\'")
End If

订单出库明细表datacolchanged:
Select Case e.DataCol.Name
    Case "产品型号","数量","已提数量","订单号"
        Dim dr As DataRow
        Dim mr As DataRow = e.DataRow
        Dim drs As List(of DataRow)
        dr = e.DataTable.Find("[_SortKey] < " & mr("_SortKey") & " And [产品型号] = \'" & mr("产品型号") & "\'And [订单号] = \'" & mr("订单号") & "\'",  "[_SortKey] Desc")
        If dr Is Nothing Then
            mr("未提数量") = mr("数量") - mr("已提数量")
            dr = mr
        End If
        drs = e.DataTable.Select("[_SortKey] >= " & dr("_SortKey") & " And [产品型号] = \'" & dr("产品型号") & "\'And [订单号] = \'" & dr("订单号") & "\'",  "[_SortKey]")
        For i As Integer = 1 To drs.Count - 1
            drs(i)("未提数量") = drs(i-1)("未提数量") - drs(i)("已提数量")
        Next
        If e.DataCol.Name = "产品型号" AndAlso e.OldValue IsNot Nothing AndAlso e.OldValue <> e.NewValue Then
            dr = e.DataTable.Find("[_SortKey] < " & mr("_SortKey") & " And [产品型号] = \'" & e.OldValue & "\'And [订单号] = \'" & e.OldValue & "\'", "[_SortKey] Desc")
            If dr Is Nothing Then
                dr = e.DataTable.Find("[产品型号] = \'" & e.OldValue & "\'", "[_SortKey]")
                If dr IsNot Nothing Then
                    dr("未提数量") = dr("数量") - dr("已提数量")
                End If
            End If
            If dr IsNot Nothing Then
                drs = e.DataTable.Select("[_SortKey] >= " & dr("_SortKey") & " And [产品型号] = \'" & dr("产品型号") & "\'", "[_SortKey]")
                For i As Integer = 1 To drs.Count - 1
                    drs(i)("未提数量") = drs(i-1)("未提数量") - drs(i)("已提数量")
                Next
            End If
        End If
End Select

DataTables("销售明细表").DataCols("产品型号").RaiseDataColChanged("产品型号 = \'" & e.DataRow("产品型号") & "\' and 订单号 = \'" & e.DataRow("订单号") & "\'")\'通知系统此父行的数量列发生了改变,触发DataColChanged事件


 


[此贴子已经被作者于2018/5/7 16:06:18编辑过]

--  作者:有点蓝
--  发布时间:2018/5/7 16:16:00
--  
表达式列?http://www.foxtable.com/webhelp/scr/2381.htm
--  作者:whx007
--  发布时间:2018/5/7 16:39:00
--  

e.DataRow("已提数量") = Tables("订单出库明细表").Compute("Sum(已提数量)","产品型号 = \'" & e.DataRow("产品型号") & "\' And 订单号 = \'" & e.DataRow("订单号") & "\'")


已提数量不是表达式列


--  作者:有点蓝
--  发布时间:2018/5/7 16:47:00
--  
窗口表都是什么类型的?normal?副本?sqltable?
--  作者:whx007
--  发布时间:2018/5/7 17:05:00
--  
 绑定的销售明细表是本表,类型normal
--  作者:有点蓝
--  发布时间:2018/5/7 17:28:00
--  
请上传实例测试
--  作者:whx007
--  发布时间:2018/5/7 18:01:00
--  
 我清除所有记录,删除BIN,新增订单5个订单都可以。但我离开开单界面去订单出库明细窗口查询后再回到开单界面,新增订单就不能计算已提数量