以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  物料BOM 设计 的问题  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=157192)

--  作者:文竹2017
--  发布时间:2020/10/7 11:42:00
--  物料BOM 设计 的问题

物料需求(BOM)统计

假定有下面三个表。

生产计划表,用于输入每个产品计划的生产数量:

零件用量表,用户输入每单个产品使用各零件的数量:

零件需求表,用于根据生产计划表和零件需求表,统计出各种零件总的需求数量:

这是一个很经典的跨表统计的实例,下面我们用三种不同的方法,来得到这个需求统计表。

方法一

SQLGroupTableBuilder,在窗口或者菜单新建一个按钮,将其代码设置为:

Dim gb As new SQLGroupTableBuilder("统计表","零件用量")
gb.AddTable(
"零件用量","产品","生产计划","产品")
gb.Groups.AddDef(
"零件")
gb.Totals.AddExp(
"需求数量","[生产数量] * [用量]")
gb.Build()

MainTable = Tables(
"统计表")

方法二

SQLJoinTableBuilder,在窗口或者菜单新建一个按钮,将其代码设置为:

Dim jb As new SQLJoinTableBuilder("统计表","零件用量")
jb
.AddTable("零件用量","产品","生产计划","产品")
jb
.AddCols("零件",True)
jb
.AddExp("需求数量","sum([生产数量] * [用量])")
jb
.Build()
MainTable
= Tables("统计表")

方法三

我们也可以自己直接编码实现,步骤:

1、需要事先设计一个名为“零件需求”的表,包括零件和需求数量两列。
2、然后新建一个菜单或窗口按钮,将其代码设置为:

Dim dic As new Dictionary(of String,Integer)
DataTables
("零件需求").DataRows.Clear()
For
Each dr1 As DataRow In DataTables("生产计划").DataRows
    For
Each dr2 As DataRow In DataTables("零件用量").Select("[产品] = \'" & dr1("产品") & "\'")
        Dim
nm As String = dr2("零件")
        Dim
vl As Integer = dr1("生产数量") * dr2("用量")
        If
dic.ContainsKey(nm) = False
            dic.Add(nm,vl)

        Else

            dic(nm) = dic(nm)+ vl

        End
If
    Next
Next
For
Each key As String In dic.keys
    Dim
dr As DataRow = DataTables("零件需求").AddNew()
    dr(
"零件") = key
    dr(
"需求数量") = dic(key)
Next

提示:

1、方法一和方法二是直接统计后台数据,所以新增或修改数据后,应该先保存,然后再统计,才能得到正确的结果。
2、方法三显然比方法一和方法二繁琐很多,之所以提供这个方法,目的是让大家再次熟悉一下字典(
Dictionary)的用法

 

 

 

 

 

所需要的表格我已经建立起来再往下如何往下操作 请指导


--  作者:有点蓝
--  发布时间:2020/10/7 11:45:00
--  
啊,1楼不是有详细的代码了吗。到底哪一步不会?