Foxtable(狐表)用户栏目专家坐堂 → BOM数据展开,制造业的高手请进!


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

主题:BOM数据展开,制造业的高手请进!

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


加好友 发短信 一级勋章
等级:MVP荣誉狐 帖子:858 积分:6071 威望:0 精华:19 注册:2008/9/1 9:13:00
  发帖心情 Post By:2010/4/16 9:48:00 [显示全部帖子]

数据源是sql server的话好说,可以用递归查询。
你最好是贴出大概的表结构


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


加好友 发短信 一级勋章
等级:MVP荣誉狐 帖子:858 积分:6071 威望:0 精华:19 注册:2008/9/1 9:13:00
  发帖心情 Post By:2010/4/16 12:10:00 [显示全部帖子]

数据源不同实现方式不同。
如果是sql server的话直接可以用T-SQL 实现递归查询。
如果是内部表的话只能用代码来递归,重复查询数据库。效率要低一点。

不知道你实际的数据源是内部表还是sql server


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


加好友 发短信 一级勋章
等级:MVP荣誉狐 帖子:858 积分:6071 威望:0 精华:19 注册:2008/9/1 9:13:00
  发帖心情 Post By:2010/4/16 13:46:00 [显示全部帖子]

以下是引用唐尸三摆手在2010-4-16 13:04:00的发言:
是sql server

哦 那应该简单。

展开后怎么显示.我不懂单级正展 多级正展 原材料正展的区别。
还有childlevel字段非常重要。有这个字段 展开的时候效率能高很多。但是你的1楼的文件里面没有这个字段


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


加好友 发短信 一级勋章
等级:MVP荣誉狐 帖子:858 积分:6071 威望:0 精华:19 注册:2008/9/1 9:13:00
  发帖心情 Post By:2010/4/16 14:08:00 [显示全部帖子]

你在SQL Server里面执行一下看看
with cte As
(
select *,0 As level,Cast(LTRIM(序号)+'/' As VarChar(100)) As Path ,Cast(RTRIM(子件编码)+'/' As VarChar(300))As FullPath from BOM表 where 母件编码 = 'CP-WG-JSG-0210'
union all
select a.*,level + 1,Cast(path + LTRIM(a.序号) + '/' As VarChar(100)),Cast(FullPath + RTRIM(a.子件编码) + '/' As VarChar(300)) from BOM表 a
join cte on a.母件编码  = cte.子件编码
)
select  * from cte
[此贴子已经被作者于2010-4-16 14:17:11编辑过]

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


加好友 发短信 一级勋章
等级:MVP荣誉狐 帖子:858 积分:6071 威望:0 精华:19 注册:2008/9/1 9:13:00
  发帖心情 Post By:2010/4/16 15:49:00 [显示全部帖子]

单级正展:select * from BOM表 where parentitem = 'B-WG-XJ-QG-12'

多级正展:
;with cte As
(
select * from BOM表 where parentitem = 'CP-WG-JSG-0210'
union all
select a.* from BOM表 a
join cte on a.parentitem  = cte.childitem
)
select  * from cte

至于原材料正展,不知道childtype 有没有表示出原材料。假设 childtype 等于 00为原材料的话:
;with cte As
(
select * from BOM表 where parentitem = 'CP-WG-JSG-0210'
union all
select a.* from BOM表 a
join cte on a.parentitem  = cte.childitem
)
select  * from cte
where childtype = '00'

 

可以用fill 方法把数据直接填充到 表里面去
tables("窗口1_table1").Fill("SQL语句","外部数据源",true)











[本帖被加为精华]
 回到顶部
帅哥哟,离线,有人找我吗?
lxl
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:MVP荣誉狐 帖子:858 积分:6071 威望:0 精华:19 注册:2008/9/1 9:13:00
  发帖心情 Post By:2010/4/16 15:58:00 [显示全部帖子]

单级反展:select * from BOM表 where childitem= 'B-WG-XJ-QG-12'
多级反展:
;with cte As
(
select * from BOM表 where childitem = 'YCL-WXJ-YZJ-0246                        '
union all
select a.* from BOM表 a
join cte on a.childitem  = cte.parentitem
)
select  * from cte


用途反展。假设childlevel = 0 表示最顶端的母件
;with cte As
(
select * from BOM表 where childitem = 'YCL-WXJ-YZJ-0246                        '
union all
select a.* from BOM表 a
join cte on a.childitem  = cte.parentitem
)
select  * from cte
where childlevel = 0




[此贴子已经被作者于2010-4-16 15:58:13编辑过]

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


加好友 发短信 一级勋章
等级:MVP荣誉狐 帖子:858 积分:6071 威望:0 精华:19 注册:2008/9/1 9:13:00
  发帖心情 Post By:2010/4/17 12:04:00 [显示全部帖子]

以下是引用唐尸三摆手在2010-4-17 10:54:00的发言:
多级正展为什么不执行呢

;with cte As
(
select * from abt00000 where parentitem = 'CP-WG-JSG-0210'
union all
select a.* from abt00000 a
join cte on a.parentitem  = cte.childitem
)
select  * from cte
[此贴子已经被作者于2010-4-17 10:54:39编辑过]

再企业管理器里面应该能执行吧。

foxtable 的执行sql窗口有一点小bug
你先执行select 1 
在弹出新的窗口里面输入上面sql


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


加好友 发短信 一级勋章
等级:MVP荣誉狐 帖子:858 积分:6071 威望:0 精华:19 注册:2008/9/1 9:13:00
  发帖心情 Post By:2010/4/17 16:25:00 [显示全部帖子]

字符串不能直接换行。可以把的回车符删掉,让sql全部放到一行

或者
dim al as string=Forms("frm_a").Controls("TextBox1").value
Dim s As String =  " ;with cte As "  & _
                           "(select * from abt00000 where parentitem = '"  & al  & "'  "  & _
                           "union all  "  & _
                           "select a.* from abt00000 a  "  & _
                           "join cte on a.parentitem  = cte.childitem) "  & _
                           "select  * from cte " 
tables("frm_a_table1").Fill(s,"erp",true)


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


加好友 发短信 一级勋章
等级:MVP荣誉狐 帖子:858 积分:6071 威望:0 精华:19 注册:2008/9/1 9:13:00
  发帖心情 Post By:2010/4/17 17:13:00 [显示全部帖子]

以下是引用唐尸三摆手在2010-4-17 16:39:00的发言:
呵呵,深受启发,终于显示结果了,不过还有两个问题
第一,childtype并没有指定出原材料,所以原料正展存在一点小问题
第二,顶层BOM按理说childlevel 应该是0,但是在此BOM表中并没有体现出来

第一个问题 只能通过它是否还有下级来判断是否是原材料了。
原材料正展:
;with cte As
(
select * from abt00000  where parentitem = 'CP-WG-JSG-0210'
union all
select a.* from abt00000  a
join cte on a.parentitem  = cte.childitem
)
select  cte.* from cte
   --查询得到所有下级物料,再和BOM 表做一次联接,筛选出这些物料中没有下级的记录,即为原材料
left join abt00000 b on cte.childitem = b.parentitem 
where b.parentitem is null


第二个顶层BOM你看看它的parentitem字段是什么? 是'' 还是null
可以通过parentitem的值来把顶层的物料筛选出来。


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


加好友 发短信 一级勋章
等级:MVP荣誉狐 帖子:858 积分:6071 威望:0 精华:19 注册:2008/9/1 9:13:00
  发帖心情 Post By:2010/4/18 13:12:00 [显示全部帖子]

正展不慢,反展慢?
你看看parentitem是不是没加索引?


语法错误可以 output.show(s)。然后把结果放到企业管理器里面检查


 回到顶部
总数 17 1 2 下一页