以文本方式查看主题

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

--  作者:liuyixin662
--  发布时间:2015/12/10 10:19:00
--  [求助]添加"初始库存表"修改代码

老师你好,我有一个"初始库存表",  初始库存表的[数量]及[不含税金额]列,麻烦添加进下列代码中,谢谢!

材料月结表涉及:入库明细表,出库明细表,初始库存表,共3个表

 

Dim st As Date = Date.Now \'用于计算时间

Dim s As String = e.Form.Controls("起始月").Value
If s <> "" Then
Tables("材料月结").StopRedraw() \'停止重绘
DataTables("材料月结").DataRows.Clear
Dim dt_in As List(Of DataRow)
dt_in = DataTables("材料入库明细表").Select("材料编号 is not null", "材料编号,材料名称,规格型号,材料_大类,材料_中类,月份") \'排序取出 入仓 全部数据

Dim r As Row
Dim sum_curr_money, sum_prev_money As Double
Dim sum_curr_count, sum_prev_count As Single

r = Tables("材料月结").AddNew
r("材料编号") = dt_in(0)("材料编号")
r("材料名称") = dt_in(0)("材料名称")
r("规格型号") = dt_in(0)("规格型号")
r("材料_大类") = dt_in(0)("材料_大类")
r("材料_中类") = dt_in(0)("材料_中类")

If dt_in(0)("月份") < s Then \'之前月
sum_prev_count = sum_prev_count + dt_in(0)("数量")
sum_prev_money = sum_prev_money + dt_in(0)("不含税金额")
Else If dt_in(0)("月份") = s Then \'本月份
sum_curr_money = sum_curr_money + dt_in(0)("不含税金额")
sum_curr_count = sum_curr_count + dt_in(0)("数量")
End If

For i As Single = 1 To dt_in.Count - 1 \'写入型号和规格,同时统计入仓数量和金额
If dt_in(i)("材料编号") <> dt_in(i-1)("材料编号") OrElse dt_in(i)("材料名称") <> dt_in(i-1)("材料名称") OrElse dt_in(i)("规格型号") <> dt_in(i-1)("规格型号") OrElse dt_in(i)("材料_大类") <> dt_in(i-1)("材料_大类") OrElse dt_in(i)("材料_中类") <> dt_in(i-1)("材料_中类") Then \'不同产品
r("本月入库_数量") = sum_curr_count
r("本月入库_不含税金额") = sum_curr_money
r("月初结存_数量") = sum_prev_count \'暂存
r("月初结存_不含税金额") = sum_prev_money \'暂存

r = Tables("材料月结").AddNew \'插入新数据
r("材料编号") = dt_in(i)("材料编号")
r("材料名称") = dt_in(i)("材料名称")
r("规格型号") = dt_in(i)("规格型号")
r("材料_大类") = dt_in(i)("材料_大类")
r("材料_中类") = dt_in(i)("材料_中类")

sum_curr_money = 0
sum_curr_count = 0
sum_prev_count = 0
sum_prev_money = 0
End If

If dt_in(i)("月份") < s Then \'之前月
sum_prev_count = sum_prev_count + dt_in(i)("数量")
sum_prev_money = sum_prev_money + dt_in(i)("不含税金额")
Else If dt_in(i)("月份") = s Then \'本月份
sum_curr_money = sum_curr_money + dt_in(i)("不含税金额")
sum_curr_count = sum_curr_count + dt_in(i)("数量")
End If
Next

r("本月入库_数量") = sum_curr_count
r("本月入库_不含税金额") = sum_curr_money
r("月初结存_数量") = sum_prev_count \'暂存
r("月初结存_不含税金额") = sum_prev_money \'暂存

\'MessageBox.Show("复制型号和规格耗时: " & (Date.Now - st).TotalSeconds & "秒")
\'st = Date.Now \'用于计算时间

For Each dr As DataRow In DataTables("材料月结").DataRows \'填充统计数据
sum_curr_count = 0 \'累计本月出仓数量
sum_prev_count = 0 \'累计之前出仓数量
Dim drs_out As List(Of DataRow)
Dim filter As String = "材料名称 = \'" & dr("材料名称") & "\' And 规格型号 = \'" & dr("规格型号") & "\'"
drs_out = DataTables("材料出库明细表").Select(filter, "月份") \'排序取出 出仓 全部数据
For Each dr_out As DataRow In drs_out
If dr_out("月份") < s Then
sum_prev_count = sum_prev_count + dr_out("数量")
Else If dr_out("月份") = s Then
sum_curr_count = sum_curr_count + dr_out("数量")
Else
Exit For
End If
Next

Dim sum_in_prev_count As Single = dr("月初结存_数量") \'从表中取出暂存数据
Dim sum_in_prev_money As Double = dr("月初结存_不含税金额") \'从表中取出暂存数据
dr("本月出库_数量") = sum_curr_count
dr("月初结存_数量") = sum_in_prev_count - sum_prev_count
dr("月初结存_不含税金额") = sum_in_prev_money / sum_in_prev_count * dr("月初结存_数量")

dr("加权平均单价") = (dr("月初结存_不含税金额") + dr("本月入库_不含税金额"))/(dr("月初结存_数量") + dr("本月入库_数量"))
dr("月末结存_数量") = dr("月初结存_数量") + dr("本月入库_数量") - dr("本月出库_数量")

dr("月末结存_不含税金额") = dr("加权平均单价") * dr("月末结存_数量")
dr("本月出库_不含税金额") = dr("加权平均单价") * dr("本月出库_数量")
Next
Tables("材料月结").ResumeRedraw()
End If


--  作者:大红袍
--  发布时间:2015/12/10 10:25:00
--  
上传foxtable例子测试,说明逻辑。
--  作者:大红袍
--  发布时间:2015/12/10 10:27:00
--  
这么多年,你还没看懂代码啊?没有一点进步,逻辑是什么,项目上传上来。
--  作者:liuyixin662
--  发布时间:2015/12/10 10:32:00
--  
今年9月份才认真研究,以前一直用电子表格,不好意思,因为电子表格有局限性
--  作者:大红袍
--  发布时间:2015/12/10 10:33:00
--  

逻辑是什么,项目发上来。


--  作者:liuyixin662
--  发布时间:2015/12/10 10:43:00
--  
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:月结表.table


--  作者:大红袍
--  发布时间:2015/12/10 11:11:00
--  

比如

 

Dim st As Date = Date.Now \'用于计算时间

Dim s As String = e.Form.Controls("月份").Value
If s <> "" Then
    Tables("月报表").StopRedraw() \'停止重绘
    DataTables("月报表").DataRows.Clear
    Dim dt_in As List(Of DataRow)
    dt_in = DataTables("入仓").Select("型号 is not null", "型号,规格,月份") \'排序取出 入仓 全部数据
   
    Dim r As Row
    Dim sum_curr_money, sum_prev_money As Double
    Dim sum_curr_count, sum_prev_count As Integer
   
    r = Tables("月报表").AddNew
    r("型号") = dt_in(0)("型号")
    r("规格") = dt_in(0)("规格")
    If dt_in(0)("月份") < s Then \'之前月
        sum_prev_count = sum_prev_count + dt_in(0)("入仓数量")
        sum_prev_money = sum_prev_money + dt_in(0)("入仓金额")
    Else If dt_in(0)("月份") = s Then \'本月份
        sum_curr_money = sum_curr_money + dt_in(0)("入仓金额")
        sum_curr_count = sum_curr_count + dt_in(0)("入仓数量")
    End If
   
    For i As Integer = 1 To dt_in.Count - 1 \'写入型号和规格,同时统计入仓数量和金额
        If dt_in(i)("型号") <> dt_in(i-1)("型号") OrElse dt_in(i)("规格") <> dt_in(i-1)("规格") Then \'不同产品
            r("本月入仓_数量") = sum_curr_count
            r("本月入仓_金额") = sum_curr_money
            r("上月结存_数量") = sum_prev_count \'暂存
            r("上月结存_金额") = sum_prev_money \'暂存
           
            r = Tables("月报表").AddNew \'插入新数据
            r("型号") = dt_in(i)("型号")
            r("规格") = dt_in(i)("规格")
            sum_curr_money = 0
            sum_curr_count = 0
            sum_prev_count = 0
            sum_prev_money = 0
        End If
       
        If dt_in(i)("月份") < s Then \'之前月
            sum_prev_count = sum_prev_count + dt_in(i)("入仓数量")
            sum_prev_money = sum_prev_money + dt_in(i)("入仓金额")
        Else If dt_in(i)("月份") = s Then \'本月份
            sum_curr_money = sum_curr_money + dt_in(i)("入仓金额")
            sum_curr_count = sum_curr_count + dt_in(i)("入仓数量")
        End If
    Next
   
    r("本月入仓_数量") = sum_curr_count
    r("本月入仓_金额") = sum_curr_money
    r("上月结存_数量") = sum_prev_count \'暂存
    r("上月结存_金额") = sum_prev_money \'暂存
   
    MessageBox.Show("复制型号和规格耗时: " & (Date.Now - st).TotalSeconds & "秒")
    st = Date.Now \'用于计算时间
   
    For Each dr As DataRow In DataTables("月报表").DataRows \'填充统计数据
        sum_curr_count = 0 \'累计本月出仓数量
        sum_prev_count = 0 \'累计之前出仓数量
        Dim drs_out As List(Of DataRow)
        Dim filter As String = "型号 = \'" & dr("型号") & "\' And 规格 = \'" & dr("规格") & "\'"
        drs_out = DataTables("出仓").Select(filter, "月份") \'排序取出 出仓 全部数据
        For Each dr_out As DataRow In drs_out
            If dr_out("月份") < s Then
                sum_prev_count = sum_prev_count + dr_out("出仓数量")
            Else If dr_out("月份") = s Then
                sum_curr_count = sum_curr_count + dr_out("出仓数量")
            Else
                Exit For
            End If
        Next
       
        Dim qcsl As Double = DataTables("初始库存").compute("sum(数量)", "型号 = \'" & dr("型号") & "\' And 规格 = \'" & dr("规格") & "\'")
        Dim sum_in_prev_count As Integer = dr("上月结存_数量") \'从表中取出暂存数据
        Dim sum_in_prev_money As Double = dr("上月结存_金额") \'从表中取出暂存数据
        dr("本月出仓_数量") = sum_curr_count
        dr("上月结存_数量") = sum_in_prev_count - sum_prev_count + qcsl
        dr("上月结存_金额") = sum_in_prev_money / sum_in_prev_count * dr("上月结存_数量")
       
        dr("本月加权平均单价") = (dr("上月结存_金额") + dr("本月入仓_金额"))/(dr("上月结存_数量") + dr("本月入仓_数量"))
        dr("本月结存_数量") = dr("上月结存_数量") + dr("本月入仓_数量") - dr("本月出仓_数量")
       
        dr("本月结存_金额") = dr("本月加权平均单价") * dr("本月结存_数量")
        dr("本月出仓_金额") = dr("本月加权平均单价") * dr("本月出仓_数量")
    Next
    Tables("月报表").ResumeRedraw()
End If

MessageBox.Show("统计和写入耗时: " & (Date.Now - st).TotalSeconds & "秒")


--  作者:wei0769
--  发布时间:2015/12/10 14:18:00
--  
这样做有什么目的?把计算方法发上来,会更容易明白
--  作者:liuyixin662
--  发布时间:2015/12/10 15:22:00
--  
谢谢老师,我调整了一下,问题解决了
--  作者:yyxwl
--  发布时间:2019/11/30 14:39:00
--  
你好,能不能将调好的传给我学习一下,引用初始库存的数量和金额不懂,QQ:453790289,谢谢