以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  统计零件需求  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=19806)

--  作者:wilson
--  发布时间:2012/5/22 9:37:00
--  统计零件需求

以下代码统计 零件需求.

我想改为统计出来的需求数量填充到零件需求表的空格行,零件需求表原有的数据保持不变,能否实现

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


--  作者:狐狸爸爸
--  发布时间:2012/5/22 11:33:00
--  

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

 

改为:

 

For Each key As String In dic.keys
       Dim dr As DataRow 

       dr = DataTables("零件需求").Find("零件 Is Null ")

       if dr is nothing then

             dr = DataTables("零件需求").AddNew()

       end if
       dr("零件") = key
      dr("需求数量") = dic(key)
Next


--  作者:wilson
--  发布时间:2012/5/23 21:08:00
--  

狐爸非常感谢你对我的帮助

我按照你提供的代码修改,还是不可行,不知道问题出在哪


--  作者:wilson
--  发布时间:2012/5/23 21:21:00
--  

能不能用锁定行


--  作者:wilson
--  发布时间:2012/5/23 23:24:00
--  

我改用以下代码还是有错,请狐爸帮我看看

 

Dim dtb As New DataTableBuilder("配件需求表A")
dtb.AddDef("配件名称", Gettype(String), 32)
dtb.AddDef("需求数量", Gettype(Integer))
dtb.Build()
MainTable= Tables("配件需求表A")

Dim dic As new Dictionary(of String,Integer)
DataTables("配件需求表A").DataRows.Clear()
For Each dr1 As DataRow In DataTables("下单生产窗口_Table1").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 dr3 As DataRow = DataTables("配件需求表A").AddNew()
    dr3("配件名称") = key
    dr3("需求数量") = dic(key)
    \'End If
Next

With DataTables("下单生产窗口_Table1")
    .DataRows.Clear()

End With

Dim rr As Row = Tables("产品配件用量表").Current
For Each r3 As DataRow In DataTables("配件需求表A").Select("配件名称 Is Not Null")
    Dim dr4 As DataRow = DataTables("配件需求表").Addnew()
    dr4("配件统计日期") = Date.today
    dr4("配件品类") = rr("配件品类")
    dr4("配件名称") = r3("配件名称")
    dr4("配件规格") = rr("配件规格")
    dr4("配件颜色") = rr("配件颜色")
    dr4("配件单位") = rr("配件单位")
    dr4("需求数量") =r3("需求数量")
Next


--  作者:wilson
--  发布时间:2012/5/24 0:27:00
--  

填入到配件需求表的  配件品类列 、配件规格列、配件颜色列、配件单位列 数据错误


--  作者:狐狸爸爸
--  发布时间:2012/5/24 8:02:00
--  

帮助的物料需求示例,其实有更简单的方法,看看:

 

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

 

方法一

用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)的用法。

 

 

 


--  作者:wilson
--  发布时间:2012/5/24 22:45:00
--  

我用方法一与方法二怎么都提示错误


--  作者:狐狸爸爸
--  发布时间:2012/5/25 9:15:00
--  
用简单例子说话。
--  作者:wilson
--  发布时间:2012/5/25 12:41:00
--  

问题已解决,

谢谢狐爸