Foxtable(狐表)用户栏目专家坐堂 → [求助]老师您好请问怎么动态加权平均设计进销存表思路呢


  共有6987人关注过本帖树形打印复制链接

主题:[求助]老师您好请问怎么动态加权平均设计进销存表思路呢

帅哥哟,离线,有人找我吗?
有点蓝
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:106097 积分:539590 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2019/8/31 13:54:00 [显示全部帖子]

我不懂这些业务,具体怎么计算?使用文字描述一下。并给出实际的结果进行对比

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:106097 积分:539590 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2019/8/31 15:49:00 [显示全部帖子]

销售表,datacolchanged事件

If e.DataCol.name = "销售数量"
    Dim oldCount As Integer = e.DataTable.compute("sum(销售数量)","货号='" & e.DataRow("货号") & "' and 日期 < #" & e.DataRow("日期") & "#")
    Dim cnt As Integer = 0
    Dim c1 As Integer = 0
    Dim c2 As Integer = 0
    Dim csum As Double = 0
    Dim drs As List(of DataRow) = DataTables("采购").Select("货号='" & e.DataRow("货号") & "'","日期")
    Dim idx As Integer = -1
    For i As Integer = 0 To drs.count - 1
        cnt += drs(i)("数量")
        If cnt > oldCount Then
            idx = i
            Exit For
        End If
    Next
    If idx > -1
        Dim dr As DataRow = drs(idx)
        c1 = cnt - oldcount
        csum = c1 * dr("单价")
        Do While c1 < e.DataRow("销售数量") AndAlso idx <drs.count - 1
            idx += 1
            dr = drs(idx)
            c2 = dr("数量")
            csum += c2 * dr("单价")
            c1 += c2
        Loop
        e.DataRow("平均价格") =  csum / c1
    End If
End If

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:106097 积分:539590 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2019/9/1 22:02:00 [显示全部帖子]

我测试没有问题,旧数据重置一下列

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:106097 积分:539590 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2019/9/2 9:00:00 [显示全部帖子]

重新输的数量不行?这个不应该,我测试也没有问题,输了什么数据?

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:106097 积分:539590 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2019/9/2 9:23:00 [显示全部帖子]

我的理解是按照先进先出原则,第二次输入50个,没有超出采购第一次的数量100,所以仍然是按照采购第一次的数量100的价格80,有什么不对。

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:106097 积分:539590 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2019/9/2 9:38:00 [显示全部帖子]

这样就更简单了,没有必要使用循环。

直接使用compute统计这个销售时间之前的所有采购数据的总金额除以总数量即可

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:106097 积分:539590 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2019/9/2 10:21:00 [显示全部帖子]

If e.DataCol.name = "销售数量"
    Dim oldCount As Integer = e.DataTable.Compute("sum(销售数量)","货号='" & e.DataRow("货号") & "' and 日期 < #" & e.DataRow("日期") & "#")
    Dim cnt As Integer = 0
    Dim c1 As Integer = 0
    Dim c2 As Integer = 0
    Dim csum As Double = 0
    Dim drs As List(of DataRow) = DataTables("采购").Select("货号='" & e.DataRow("货号") & "' and 日期 <= #" & e.DataRow("日期") & "#","日期")
    Dim idx As Integer = -1
    For i As Integer = 0 To drs.count - 1
        cnt += drs(i)("数量")
        If cnt > oldCount Then
            idx = i
            Exit For
        End If
    Next
    If idx > -1
        Dim dr As DataRow = drs(idx)
        c1 = cnt - oldCount
        csum = c1 * dr("单价")
        For j As Integer = idx+1 To drs.count - 1
            dr = drs(j)
            c2 = dr("数量")
            csum += c2 * dr("单价")
            c1 += c2
        Next
        e.DataRow("平均价格") = csum / c1
    End If
End If

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:106097 积分:539590 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2019/9/2 12:01:00 [显示全部帖子]

这个是您业务的问题,不是代码可以解决的。先确定所谓的加权平均价格的算法是正确的!

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:106097 积分:539590 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2019/9/2 13:32:00 [显示全部帖子]

Foxtable使用的是vb.net,编程基础看:http://www.foxtable.com/webhelp/topics/1592.htm

 回到顶部