以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  关于月结表的小数计算问题  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=74814)

--  作者:实话实说
--  发布时间:2015/9/19 19:23:00
--  关于月结表的小数计算问题
如何使""上月结存_金额"" = 上月的月末结存_金额

图片点击可在新窗口打开查看此主题相关图片如下:月结表.jpg
图片点击可在新窗口打开查看

以下是生成月结表的代码
DataTables("材料月结").DataRows.Clear
Dim Arys As List(Of String())
Arys = DataTables("材料明细").GetValues("月|材料分类|材料名称|型号规格","月 >= \'" & e.Form.Controls("起始月").Text & "\' And 月 <= \'" & e.Form.Controls("截止月").Text & "\' ")
For Each Ary As String() In Arys
    Dim r As Row = Tables("材料月结").AddNew
    r("月") = Ary(0)
    r("材料分类") = Ary(1)
    r("材料名称") = Ary(2)
    r("型号规格") = Ary(3)
Next
Dim dt As DataTable = DataTables("材料明细")
For Each dr As DataRow In DataTables("材料月结").DataRows
    Dim Filter As String = "材料分类 = \'" & dr("材料分类") & "\' and 材料名称 = \'" & dr("材料名称") & "\' and 型号规格 = \'" & dr("型号规格") & "\'"
    Dim Sum,Sum1 As Double
    
    dr("本月入仓_数量") = dt.Compute("Sum(入仓数量)",Filter & " And 月 = \'" & dr("月") & "\'")
    dr("本月入仓_金额") = dt.Compute("Sum(入仓金额)",Filter & " And 月 = \'" & dr("月") & "\'")
    dr("本月出仓_数量") = dt.Compute("Sum(出仓数量)",Filter & " And 月 = \'" & dr("月") & "\'")
    dr("上月结存_数量") = dt.Compute("Sum(入仓数量)",Filter & " And 月 < \'" & dr("月") & "\'") - dt.Compute("Sum(出仓数量)",Filter & " And 月 < \'" & dr("月") & "\'")
    Sum = DataTables("材料明细").Compute("Sum(入仓金额)",Filter & " And 月 < \'" & dr("月") & "\'")
    Sum1 = DataTables("材料明细").Compute("Sum(入仓数量)",Filter & " And 月 < \'" & dr("月") & "\'")
    dr("上月结存_金额") = Sum / Sum1 * dr("上月结存_数量")
    dr("本月结存_数量") = dr("上月结存_数量") + dr("本月入仓_数量") - dr("本月出仓_数量")
    dr("本月加权平均单价") = (dr("上月结存_金额") + dr("本月入仓_金额"))/(dr("上月结存_数量") + dr("本月入仓_数量"))
    dr("本月出仓_金额") = dr("本月加权平均单价") * dr("本月出仓_数量")
    dr("本月结存_金额") = dr("本月加权平均单价") * dr("本月结存_数量")
    \'dr("本月结存_金额") = dr("上月结存_金额") + dr("本月入仓_金额") - dr("本月出仓_金额") 
Next

[此贴子已经被作者于2015/9/19 19:23:51编辑过]

--  作者:实话实说
--  发布时间:2015/9/20 11:55:00
--  
有老师指点一下吗?
例: 第2行的"上月结存_金额" = 第1行的"本月结存_金额"

--  作者:大红袍
--  发布时间:2015/9/20 12:14:00
--  

Dim pdr As DataRow = Nothing

For Each dr As DataRow In DataTables("材料月结").DataRows
   
    If pdr IsNot Nothing Then
       
        dr("上月结存_金额") = pdr("上月结存_金额")
       
    End If
   
    pdr = dr
   
Next


--  作者:实话实说
--  发布时间:2015/9/20 12:50:00
--  
大红袍老师,我的问题不是这样的
--  作者:大红袍
--  发布时间:2015/9/20 13:22:00
--  

 

Dim pdr As DataRow = Nothing

For Each dr As DataRow In DataTables("材料月结").DataRows
   
    If pdr IsNot Nothing Then
       
        dr("上月结存_金额") = pdr("本月结存_金额")
       
    End If
   
    pdr = dr
   
Next


--  作者:实话实说
--  发布时间:2015/9/20 13:26:00
--  
to 5楼:我已经改过"本月结存_金额",得不到我要的结果
不知道我1楼和2楼的描述是否明确
[此贴子已经被作者于2015/9/20 13:27:21编辑过]

--  作者:大红袍
--  发布时间:2015/9/20 13:28:00
--  
无法理解你的问题,如果修改后依然要一致,就去编写datacolchanged事件。
--  作者:实话实说
--  发布时间:2015/9/20 13:47:00
--  
大红袍老师,这是企业财务需要的仓库材料月结表,该表是通过"材料明细"统计计算得来的,1楼的代码就是计算过程和结果。正确的结果是:“上月结存_金额”应等于上一行的 "本月结存-金额",由于有小数,所以计算结果产生了误差,数据越多,误差越大。(数量列没有误差)现在我想直接用代码设置第2行的"上月结存_金额" = 第1行的"本月结存_金额"

"材料月结“实际上是一个统计表
[此贴子已经被作者于2015/9/20 13:47:51编辑过]

--  作者:大红袍
--  发布时间:2015/9/20 13:51:00
--  
5楼的代码就是啊,获取上一行的信息,然后赋值啊
--  作者:实话实说
--  发布时间:2015/9/20 13:59:00
--  
有个问题:1楼图例是数据是经过筛选的,5楼代码得不到想要的结果