以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  负库存销售问题  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=100486)

--  作者:minxizai
--  发布时间:2017/5/12 10:53:00
--  负库存销售问题
            With DataTables("库存")
                dd = .Find("[商品名称] = \'" & e.DataRow("商品名称") & "\'","业务日期 Desc",1) \'找出倒数第二次订购PD01产品的记录
                If dd Is Nothing Then
                    MessageBox.Show("当前产品没有库存","提示",MessageBoxButtons.OK)
                    e.DataRow("数量") = 0
                    If dd("库存_数量") - e.DataRow("数量") >= 0 Then
                        dt("出库_数量") = e.DataRow("数量")
                    Else
                        MessageBox.Show("输入数量超过库存数量:" & dd("库存_数量") & ",请重新输入","提示",MessageBoxButtons.OK)
                        e.DataRow("数量") = 0
                    End If
                End If
            End With     

上面代码当产品未录入库存数据时,会把销售数量设置为0 ,数量列默认值是1 
执行时出现
Exception has been thrown by the target of an invocation.
Object reference not set to an instance of an object.

该如何解决?      
[此贴子已经被作者于2017/5/12 10:54:37编辑过]

--  作者:有点色
--  发布时间:2017/5/12 11:01:00
--  

查不到dd的时候,你不能使用 dd("库存_数量") 的值的

 

With DataTables("库存")
    dd = .Find("[商品名称] = \'" & e.DataRow("商品名称") & "\'","业务日期 Desc",1) \'找出倒数第二次订购PD01产品的记录
    If dd Is Nothing Then
        MessageBox.Show("当前产品没有库存","提示",MessageBoxButtons.OK)
        e.DataRow("数量") = 0
    Else
        If dd("库存_数量") - e.DataRow("数量") >= 0 Then
            dt("出库_数量") = e.DataRow("数量")
        Else
            MessageBox.Show("输入数量超过库存数量:" & dd("库存_数量") & ",请重新输入","提示",MessageBoxButtons.OK)
            e.DataRow("数量") = 0
        End If
    End If
End With


--  作者:minxizai
--  发布时间:2017/5/12 11:26:00
--  
   Case "数量"
        Dim dt As DataRow        \'否则在库存表查找同名的产品行,将找到的行赋值给变量dt
        dt = DataTables("库存").Find("[销售关联列] = \'" & e.DataRow("_Identify") & "\'")
        If dt IsNot Nothing Then \'如果找到了同名的产品行,也就是dt不是Nothing
            Dim dd As DataRow
            With DataTables("库存")
                dd = .Find("[商品名称] = \'" & e.DataRow("商品名称") & "\'","业务日期 Desc",1) \'找出倒数第二次订购PD01产品的记录
                If dd Is Nothing Then
                    MessageBox.Show("当前产品没有库存","提示",MessageBoxButtons.OK)
                    e.DataRow("数量") = 0
                Else
                    If dd("库存_数量") - e.DataRow("数量") >= 0 Then
                        dt("出库_数量") = e.DataRow("数量")
                    Else
                        MessageBox.Show("输入数量超过库存数量:" & dd("库存_数量") & ",请重新输入","提示",MessageBoxButtons.OK)
                        e.DataRow("数量") = 0
                    End If
                End If
            End With
        End If
        e.DataRow("金额") = e.DataRow("单价") * e.DataRow("数量")
上面代码为什么在连续销售同一个产品时,不再判断负库存销售的情况?
而在销售产品1,再销售产品2,再销售产品1时就没问题
[此贴子已经被作者于2017/5/12 11:31:56编辑过]

--  作者:有点色
--  发布时间:2017/5/12 11:33:00
--  

你为什么要写第一个判断?

 

Case "数量"
    Dim dd As DataRow
    With DataTables("库存")
        dd = .Find("[商品名称] = \'" & e.DataRow("商品名称") & "\'","业务日期 Desc",1) \'找出倒数第二次订购PD01产品的记录
        If dd Is Nothing Then
            MessageBox.Show("当前产品没有库存","提示",MessageBoxButtons.OK)
            e.DataRow("数量") = 0
        Else
            If dd("库存_数量") - e.DataRow("数量") >= 0 Then
                dd("出库_数量") = e.DataRow("数量")
            Else
                MessageBox.Show("输入数量超过库存数量:" & dd("库存_数量") & ",请重新输入","提示",MessageBoxButtons.OK)
                e.DataRow("数量") = 0
            End If
        End If
    End With
    e.DataRow("金额") = e.DataRow("单价") * e.DataRow("数量")

[此贴子已经被作者于2017/5/12 11:33:50编辑过]

--  作者:minxizai
--  发布时间:2017/5/12 11:50:00
--  
谢谢
应该是日期排序出问题了,换别的列排序就解决了。同一个订单明细日期都是一样的,
第一个判断是重复了,复制前面输入商品时的判断。


--  作者:有点色
--  发布时间:2017/5/12 11:57:00
--  

加入多个列判断呗

 

dd = .Find("[商品名称] = \'" & e.DataRow("商品名称") & "\'","业务日期 Desc, _Identify desc",1) \'找出倒数第二次订购PD01产品的记录