Office中国论坛/Access中国论坛

标题: 搞不懂,看了几个都不懂。求帮忙。 [打印本页]

作者: zhafs    时间: 2018-6-22 19:36
标题: 搞不懂,看了几个都不懂。求帮忙。

Bom吧。想查询打印个3层左右的全阶。

最笨的是一层一层弄3个层表关系串起来,再把3个层表摆弄到一张表里。是不是要6个追加查询才能解决啊?有简单的啊?

有人说树形的,或者,反正看了几个搞不起来,别人的BOM都觉得太复杂了。

请大神看附件啊,先谢谢!

[attach]62658[/attach]

或者需要添加个子件的序号。
拜托,拜托!

作者: roych    时间: 2018-9-27 14:56
层级展开需要写递归算法的。具体可以参考下:
http://www.office-cn.net/thread-66634-1-1.html
主界面里有一个生成树结构的函数。
  1. Public Sub SubTree(rs As DAO.Recordset, key As String)
  2. '本过程添加一些子节点
  3. '参数:rs是ADO记录集,key是节点的关键字

  4.     Dim Book As Variant
  5.     '遍历所有的记录,如果关键字相同,则添加子节点
  6.     rs.MoveFirst
  7.     Do Until rs.EOF
  8.         If "R" & rs(1) = key Then
  9.             '如果没有为该节点指定图标,则用一个文件夹图标
  10.             Set nod = Tree.Nodes.Add(key, tvwChild, "R" & rs(0), rs(2), Nz(Trim(rs(3)), "folder"))
  11.             '记录下当前的记录指针
  12.             Book = rs.Bookmark
  13.             '递归调用过程生成子节点
  14.             SubTree rs, "R" & rs(0)
  15.             '恢复记录指针
  16.             rs.Bookmark = Book
  17.         End If
  18.         rs.MoveNext
  19.     Loop

  20. End Sub
复制代码
前段时间用Python写了一个,不过一时半会儿没法将它转为VBA,供参考。
  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Mon Sep  3 22:17:44 2018

  4. @author: Roych
  5. """

  6. import pandas as pd
  7. import numpy as np
  8. df = pd.DataFrame({'cls': ['a', 'b', 'c', 'd' ,'e', 'f'],
  9.                    'pCls': [np.nan, 'a', 'b', np.nan, np.nan, 'e']})
  10. print(df)
  11. '''树结构 cls--子类名称,pCls--父类名称
  12.   cls pCls  结果显示
  13. 0   a  NaN   a(一级)
  14. 1   b    a   a--b(二级)
  15. 2   c    b   a--b--c(三级)
  16. 3   d  NaN   d
  17. 4   e  NaN   e
  18. 5   f    e   e--f
  19. '''
  20. def getData(cls):
  21.     if pd.isna(df[df['cls']==cls]['pCls'].values) == True:
  22.         df1 = df[df['cls']==cls]
  23.         result0, result1 = cls, ''.join(df1['cls'])
  24.     else:
  25.         df1 = df[df['cls']==cls]
  26.         result0, result1 = cls, getData(''.join(df1['pCls']))
  27.         result1 = result1+'--'+result0
  28.     return result1

  29. print(getData('c'))
  30. #返回:a--b--c
复制代码

作者: cgsilicone    时间: 2018-9-28 17:09
一个查询就可以做到。下面做了一个4层的例子,看看能不能用。层数只受access关联表数的限制。层数太多,IIF语句不好写,可自编一个函数代替。

SELECT A.父编码, IIf(IsNull([C].[子编码]),IIf(IsNull([B].[子编码]),[A].[层级],[B].[层级]),[C].[层级]) AS 层, IIf(IsNull([C].[子编码]),IIf(IsNull([B].[子编码]),[A].[子编码],[B].[子编码]),[C].[子编码]) AS 码, IIf(IsNull(A.用量),1,A.用量)*IIf(IsNull(B.用量),1,B.用量)*IIf(IsNull(C.用量),1,C.用量) AS 量
FROM (Bom明细表 AS A LEFT JOIN Bom明细表 AS B ON A.子编码=B.父编码) LEFT JOIN Bom明细表 AS C ON B.子编码=C.父编码;


作者: zhafs    时间: 2018-10-9 17:58
谢谢,学习学习再说。   




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3