Foxtable(狐表)用户栏目专家坐堂 → 目录树刷新问题


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

主题:目录树刷新问题

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


加好友 发短信
等级:超级版主 帖子:13837 积分:69650 威望:0 精华:0 注册:2016/11/1 14:42:00
  发帖心情 Post By:2016/12/22 16:23:00 [只看该作者]

 没看懂你的意思。这样?

 

Dim dic As new Dictionary(of String,Integer)
'定义字典,键类型为字符串,值类型为整数
Dim rc As Integer = DataTables("生产计划").DataRows.Count-1
DataTables("采购需求").DataRows.Clear()
'清空采购需求表

Dim i As Integer
For i = 0 To rc
    Dim dr1 As DataRow
    dr1 = DataTables("生产计划").DataRows(i)
    '循环生产计划中的每一行数据
    For Each dr2 As DataRow In DataTables("商品结构").Select("[父级编码] = '" & dr1("商品编码") & "'")
        '以集合的形式返回符合条件的数据,并遍历每一行,而不是傻傻的遍历表中所有数据了.
        Dim ly As DataRow = DataTables("商品资料").Find("[商品编码] = '"& dr2("子级编码")&"'")
        If ly("来源")="自产" Then
            Dim ziji As DataRow = DataTables("生产计划").find("商品编码 = '" & dr2("子级编码") & "' and 数量 = '" & dr1("数量") * dr2("数量") & "'")
            If ziji Is Nothing Then
                ziji = DataTables("生产计划").AddNew
                ziji("商品编码")=dr2("子级编码")
                ziji("数量")=dr1("数量") * dr2("数量")
            End If
            rc=rc+1
        ElseIf ly("来源")="外购"  Then
            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
        End If
    Next
Next

For Each key As String In dic.keys
    '遍历字典中所有的键的集合
    Dim dr As DataRow = DataTables("采购需求").AddNew()
    '增加新的数据行
    dr("商品编码") = key
    dr("需求数量") = dic(key)
Next


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


加好友 发短信
等级:一尾狐 帖子:443 积分:3530 威望:0 精华:0 注册:2013/2/9 12:45:00
  发帖心情 Post By:2016/12/22 16:54:00 [只看该作者]

谢谢回复哈~

意思可能是我没表达清楚,不好意思。

我的目的是这样的:
首先说下业务背景:

成品A=(半成品B1*5+半成品B2*10)
半成品B1=原料C1*10
半成品B2=原料C2*10+原料C3*10

现在假设订单需求成品A*2,

那么我想要得到两个表:
1、生产计划表(包括A的数量,B1/B2的数量)
2、采购需求表(C1/C2/C3的数量)

我现在写的代码的方法是:
1、为所有物料加了一个属性【来源】,其中A/B1/B2自产,C1/C2/C3外购。
2、统计订单表,得到成品需求数量,写入生产计划表,假设为A,数量为2.
此时,生产计划表是这样的:
  A   2 
      
      

3、先根据商品结构表查询到生产计划表中的第一行数据,也就是A的子级物料及数量,即成品A=(半成品B1*5+半成品B2*10)
4、判断B1/B2的属性【来源】,是自产还是外购,如果是自产,那就新增记录到生产计划表中,
此时,生产计划表是这样的:
  A   2 
  B1  10 
  B2  20
5、关键:继续查询生产计划表中的数据,也就是B1/B2,判断其子级的属性【来源】,如果是外购,就在采购需求表上增加采购需求记录。
半成品B1=原料C1*10
半成品B2=原料C2*10+原料C3*10

最终效果:
【生产计划表】
  A   2 
  B1   10
  B2  20

【采购需求表】
  C1  100  
  C2 200
  C3 200

问题出在第5步,我用for来循环生产计划的row,因为在第一次取值时,其行数是1,后面的row是新增的,虽然实际行数已经增加,但是第一次取值的数字1不会变,也就是循环完第一条记录A就不会继续往下计算B1/B2了。
这说明我的方法是错的,我想问的是有什么其他办法可以达成我想要的效果,谢谢~

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


加好友 发短信
等级:一尾狐 帖子:443 积分:3530 威望:0 精华:0 注册:2013/2/9 12:45:00
  发帖心情 Post By:2016/12/22 16:55:00 [只看该作者]

已上传,希望能解答一下~

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


加好友 发短信
等级:超级版主 帖子:13837 积分:69650 威望:0 精华:0 注册:2016/11/1 14:42:00
  发帖心情 Post By:2016/12/22 17:50:00 [只看该作者]

Dim dic As new Dictionary(of String,Integer)
Dim dt1 As DataTable = DataTables("生产计划")
Dim dt3 As DataTable = DataTables("采购需求")
Dim dt2 As DataTable = DataTables("商品结构")
Dim dt4 As DataTable = DataTables("商品资料")
dt1.ReplaceFor("第四列", Nothing)
Do While True
    Dim drs As List(Of DataRow) = dt1.Select("第四列 is null")
    If drs.count = 0 Then Exit Do
    For Each dr1 As DataRow In drs
        dr1("第四列") = 1
        For Each dr2 As DataRow In dt2.Select("[父级编码] = '" & dr1("商品编码") & "'")
            Dim ly As DataRow = dt4.Find("[商品编码] = '"& dr2("子级编码")&"'")
            If ly("来源")="自产" Then
                Dim ziji As DataRow = dt1.AddNew
                ziji("商品编码")=dr2("子级编码")
                ziji("数量")=dr1("数量") * dr2("数量")
               
            ElseIf ly("来源")="外购"  Then
                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
            End If
        Next
    Next
Loop
For Each key As String In dic.keys
    '遍历字典中所有的键的集合
    Dim dr As DataRow = DataTables("采购需求").AddNew()
    '增加新的数据行
    dr("商品编码") = key
    dr("需求数量") = dic(key)
Next

 


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


加好友 发短信
等级:一尾狐 帖子:443 积分:3530 威望:0 精华:0 注册:2013/2/9 12:45:00
  发帖心情 Post By:2016/12/23 8:10:00 [只看该作者]

非常感谢!!!

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


加好友 发短信
等级:一尾狐 帖子:443 积分:3530 威望:0 精华:0 注册:2013/2/9 12:45:00
  发帖心情 Post By:2016/12/23 8:21:00 [只看该作者]

你这相当于用第四列来标记已经查询过的数据,然后把未查询过的数据在每次遍历的开始时重新定义为集合,再进行查询,妙~

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


加好友 发短信
等级:一尾狐 帖子:443 积分:3530 威望:0 精华:0 注册:2013/2/9 12:45:00
  发帖心情 Post By:2016/12/23 8:27:00 [只看该作者]

追问:
do while true
这一句的true是根据那里来判断的?

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


加好友 发短信
等级:超级版主 帖子:107135 积分:544918 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2016/12/23 8:46:00 [只看该作者]

意思就是条件永远为真,一直循环,跳出循环的判断留到循环体中处理,如:If drs.count = 0 Then Exit Do

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


加好友 发短信
等级:一尾狐 帖子:443 积分:3530 威望:0 精华:0 注册:2013/2/9 12:45:00
  发帖心情 Post By:2016/12/23 9:26:00 [只看该作者]

学到了,非常感谢!

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


加好友 发短信
等级:小狐 帖子:358 积分:2573 威望:0 精华:0 注册:2020/7/24 10:30:00
现在这种问题用最新版的分级数据是不是很好解决?  发帖心情 Post By:2022/1/7 11:14:00 [只看该作者]

现在这种问题用最新版的分级数据是不是很好解决?

 回到顶部
总数 20 上一页 1 2