以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  移动平均单价计算代码求助  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=176056)

--  作者:段虎成
--  发布时间:2022/3/28 22:23:00
--  移动平均单价计算代码求助
老师您好,求助一段代码,谢谢!
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:移动平均单价.rar


--  作者:有点蓝
--  发布时间:2022/3/28 22:51:00
--  
业务的东西我不懂。请提供实例,然后说明具体的计算公式
--  作者:段虎成
--  发布时间:2022/3/29 8:27:00
--  
老师您好。附件中有具体的公式,在文档的最后一行。谢谢。
--  作者:段虎成
--  发布时间:2022/3/29 8:42:00
--  
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:移动加权平均案例_202203290840.zip

老师您好,已经上传案例及公式,请您帮忙,谢谢!
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:移动平均单价公式.rar


--  作者:有点蓝
--  发布时间:2022/3/29 9:00:00
--  
请以示例的数据说明一下,下面红色的值指的是哪个单元格的数据?比如计算SP002,本产品原有库存金额指的是哪个数据?

每个产品的【库存_单价】 = (本产品原有库存金额 + 本产品本次入库金额 ) /  (本产品原库存数量 + 本产品本次入库数量)
 
每个产品本次领用【出库_单价】 = 本产品本次领用前的库存单价


--  作者:段虎成
--  发布时间:2022/3/29 11:37:00
--  
比如产品SP002: 
1、本产品原有库存金额指的是:列【库存—金额】(也就是在本产品入库或者出库时,本产品上一行中的列【库存-金额】对应的值)
2、本产品原库存数量指的是:列【库存—数量】(也就是在本产品入库或者出库时,本产品上一行中的列【库存-数量】对应的值)
3、本产品本次入库金额是:当前增加行对应的列【入库—金额】
4、本产品本次入库数量是:当前增加行对应的列【入库—数量】

5、本产品本次领用前的库存单价:列【库存—单价】(也就是在本产品入库或者出库时,本产品上一行中的列【库存-单价】对应的值)

--  作者:有点蓝
--  发布时间:2022/3/29 12:03:00
--  
参考流水账的用法即可:http://www.foxtable.com/webhelp/topics/2136.htm
--  作者:段虎成
--  发布时间:2022/3/29 13:18:00
--  
\' 即时库存数量计算
Select Case e.DataCol.Name
    Case "物料编号","入库_数量","出库_数量"
        Dim drs As List(of DataRow)
        Dim Filter As String
        Filter = "[_SortKey] >= " & e.DataRow("_SortKey") & " And [物料编号] = \'" & e.DataRow("物料编号") & "\'"
        drs = e.DataTable.Select(Filter)
        For Each dr As DataRow In drs
            Filter = "[_SortKey] <= " & dr("_SortKey") & " And [物料编号] = \'" & dr("物料编号") & "\'"
            Dim Val1 As Double = e.DataTable.Compute("Sum(入库_数量)",Filter)
            Dim Val2 As Double = e.DataTable.Compute("Sum(出库_数量)",Filter)
            dr("库存_数量") = Val1 - Val2
        Next
        If e.DataCol.Name = "物料编号" AndAlso e.OldValue IsNot Nothing AndAlso e.OldValue <> e.NewValue Then
            Filter = "[_SortKey] > " & e.DataRow("_SortKey") & " And [物料编号] = \'" & e.OldValue & "\'"
            drs = e.DataTable.Select(Filter)
            For Each dr As DataRow In drs
                Filter = "[_SortKey] <= " & dr("_SortKey") & " And [物料编号] = \'" & dr("物料编号") & "\'"
                Dim Val1 As Double = e.DataTable.Compute("Sum(入库_数量)",Filter)
                Dim Val2 As Double = e.DataTable.Compute("Sum(出库_数量)",Filter)
                dr("库存_数量") = Val1 - Val2
            Next
        End If
End Select

这个数量我调出来了,但是单价的代码我没调出来。麻烦老师给添加一下单价部分代码图片点击可在新窗口打开查看

--  作者:有点蓝
--  发布时间:2022/3/29 13:41:00
--  
请按照流水账的用法。8楼的代码没有获取上一行

Select Case e.DataCol.Name
    Case "收入","支出"
        Dim dr As DataRow
        Dim drs As List(of DataRow)
        dr = e.DataTable.Find("[_SortKey] < " & e.DataRow("_SortKey"), "[_SortKey] Desc") \'找出上一行
        If dr Is Nothing Then \'如果没有找到上一行,说明本行就是第一行
            e.DataRow("余额") = e.DataRow("收入") - e.DataRow("支出")
            dr = e.DataRow
        End If
        drs = e.DataTable.Select("[_SortKey] >= " & dr("_SortKey"), "[_SortKey]")
        For i As Integer = 1 To drs.Count - 1 \'重算余下行的余额
            drs(i)("余额") = drs(i-1)("余额") + drs(i)("收入") - drs(i)("支出") \'这里的drs(i-1)就是上一行
        Next   
End Select