楼主: Format

[精华] 求BOM展开方法及代码

[复制链接]
论坛徽章:
0
11#
发表于 2005-6-11 18:57 | 只看该作者
好东西呀,谢谢了

使用道具 举报

回复
论坛徽章:
12
授权会员
日期:2005-10-30 17:05:332010新春纪念徽章
日期:2010-03-01 11:20:00生肖徽章2007版:兔
日期:2009-09-10 11:22:26ERP板块每日发贴之星
日期:2008-02-01 01:05:56生肖徽章2007版:牛
日期:2008-01-02 17:35:53生肖徽章2007版:虎
日期:2008-01-02 17:35:53生肖徽章2007版:兔
日期:2008-01-02 17:35:53生肖徽章2007版:猴
日期:2008-01-02 17:35:53生肖徽章2007版:鸡
日期:2008-01-02 17:35:53会员2007贡献徽章
日期:2007-09-26 18:42:10
12#
发表于 2005-6-13 15:49 | 只看该作者
如果是做报表,用datalink很好展开的,通过关键字段bill_sequence_id关联;不过,此方法比较奔,你要预留足够多的循环框,有六七层应该也足够了

使用道具 举报

回复
论坛徽章:
39
灰彻蛋
日期:2011-07-28 09:31:04双黄蛋
日期:2013-06-23 10:48:13阿斯顿马丁
日期:2013-08-12 14:45:01日产
日期:2013-09-01 13:01:12雪佛兰
日期:2013-09-22 10:51:50凯迪拉克
日期:2013-12-17 14:10:00日产
日期:2014-01-26 11:52:34本田
日期:2014-02-08 14:08:542014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11
13#
 楼主| 发表于 2005-6-16 11:29 | 只看该作者
我觉得用标准程序,还是效果好些,速度也快些。

使用道具 举报

回复
论坛徽章:
1
授权会员
日期:2005-10-30 17:05:33
14#
发表于 2005-6-17 20:51 | 只看该作者
用递归,很快就写好了。Standard 的,看到头都昏。

使用道具 举报

回复
论坛徽章:
18
管理团队2006纪念徽章
日期:2006-04-16 22:44:45马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:36
15#
发表于 2005-6-18 09:55 | 只看该作者
系统有没有提供一个根据子装配件的BOM展开任务的组件的包?

使用道具 举报

回复
论坛徽章:
4
ITPUB元老
日期:2007-04-19 13:22:13ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44
16#
发表于 2005-6-18 10:42 | 只看该作者
挺 好的,謝謝了

使用道具 举报

回复
论坛徽章:
0
17#
发表于 2005-6-18 15:55 | 只看该作者
一个朋友写的,给大家参考下吧。

使用 PostgreSql 几天,我被其新颖的功能以及效率深深吸引,我非常喜欢她!然而 PostgreSql 较稳定的版本在8.0以前通常在Unix以及Linux系统下运行,让一些普通开发人员入门很难!而同时我发觉国内开发人员不怎么愿意与别人分享成功的经验,看来传统文化“绝技不外传”的影响力依然不可小看。BOM之算法虽然非什么绝技但确实难到一些开发人员,本人一直研究MRP,在国内外BBS以及网上还没有看见谁将MRP最核心的算法公布出来,而MRP核心的核心BOM之算法也不多见。而以PostgreSql 的扩展语言plpgsql撰写BOM算法我还没有在国内外的网站上看见过,现在我将完整的BOM算法公布出来,无阶层限制。当然更好的BOM算法还有,如最终报告实现树形结构的SQL算法。此算法待我有空再发布出来。

    第一步,建立两个表。第一个表存放BOM结构数据,而另外一个表存放你查询一个产品BOM报告。

--BOM 数据存放表
CREATE TABLE bomib
(
  ib010 char(12),  --父阶
  ib020 char(12),  --子阶
  ib030 int4       --用量
)WITH OIDS;


--测试数据
INSERT INTO BOMIB
VALUES('01OS620000GS',
       '1040-1212212,
       1);
INSERT INTO BOMIB
VALUES('01OS620000GS',
       '1041-1212212,
       1);
INSERT INTO BOMIB
VALUES('01OS620000GS',
       '13OS-6200010,
       1);
INSERT INTO BOMIB
VALUES('01OS620000GS',
       '13OS-6200020,
       1);
INSERT INTO BOMIB
VALUES('1040-1212212',
       '2411-0602700,
       1);
INSERT INTO BOMIB
VALUES('13OS-6200010,
       '2012-1212212,
       1);


--BOM 报表存放地
CREATE TABLE bomzz
(
  zz010 char(12),  --父阶
  zz020 char(12),  --子阶
  zz030 int4,      --用量
  zz040 int8       --阶层码
)WITH OIDS;


CREATE OR REPLACE FUNCTION ps_temp_table("varchar"
  RETURNS bool AS
$BODY$
DECLARE

BEGIN

perform n.nspname ,c.relname
    FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
   WHERE n.nspname like 'pg_temp_%'
     AND pg_catalog.pg_table_is_visible(c.oid)
     AND Upper(relname) = Upper($1);

     IF FOUND THEN
        RETURN TRUE;
     ELSE
        RETURN FALSE;
     END IF;

END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;


CREATE OR REPLACE FUNCTION bomia_part(bpchar)
  RETURNS SETOF bomzz AS
$BODY$
DECLARE
   ENDTREE INT8;
   NLVL INT8;
   REC INT8;
   RESULT RECORD;
BEGIN

  ENDTREE:=0;
  NLVL:=1;

  --Clear bill of material report data
  DELETE FROM bomzz;

  --Check temp table "STACK" exists
  IF  ps_temp_table('STACK') THEN
    RAISE NOTICE 'TEMP TABLE "STACK" EXISTS!';   
  ELSE   
    CREATE  TEMP TABLE STACK
    (
     PARENT    CHAR(12),
     PARTNO    CHAR(12),
     USAGE     INT8,
     LVLS      INT8
    ) WITHOUT OIDS ON COMMIT DELETE ROWS;
  END IF;

  INSERT INTO STACK
  SELECT IB010,IB020,IB030,1
    FROM BOMIB
   WHERE IB010=$1;  

  WHILE (ENDTREE=0)  LOOP
    NLVL := NLVL + 1;

    INSERT INTO STACK(LVLS,PARENT,PARTNO,USAGE)  
         SELECT NLVL,
                A.IB010,
                A.IB020,
                A.IB030
           FROM BOMIB A, STACK B
          WHERE A.IB010 =B.PARTNO
            AND B.LVLS= NLVL -1;
         
   IF NOT EXISTS(SELECT PARTNO FROM STACK WHERE LVLS =NLVL) THEN
      ENDTREE := 1;
   END IF;
     
  END LOOP;
  
  INSERT INTO BOMZZ(ZZ010,ZZ020,ZZ030,zz040)
       SELECT PARENT,PARTNO,USAGE,LVLS
         FROM STACK;

  FOR RESULT IN SELECT * FROM BOMZZ LOOP
    RETURN NEXT RESULT;
  END LOOP;

  RETURN;
END$BODY$
  LANGUAGE 'plpgsql' VOLATILE;

使用道具 举报

回复
论坛徽章:
0
18#
发表于 2005-6-21 21:09 | 只看该作者
可以用递归SQL实现,一个SQL就搞定啦

使用道具 举报

回复
论坛徽章:
3
授权会员
日期:2005-10-30 17:05:33会员2006贡献徽章
日期:2006-04-17 13:46:34ITPUB 11周年纪念徽章
日期:2012-10-10 13:11:14
19#
发表于 2005-6-21 21:28 | 只看该作者
你有用递归写好的程式吗?有上传一个给大家参考下

使用道具 举报

回复
论坛徽章:
0
20#
发表于 2005-6-22 11:40 | 只看该作者
最初由 LZJKEVIN 发布
[B]你有用递归写好的程式吗?有上传一个给大家参考下 [/B]

刚好,现在的项目有需要递归的,梢梢复杂,但也很容易懂的:

        SELECT level, group_id, related_group_id, group_name
        
          FROM (SELECT jrgr.group_id, jrgr.related_group_id, jrgt.group_name,jrgt_parent.group_name parent_group_name
                  FROM jtf_rs_grp_relations jrgr,
                       jtf_rs_groups_tl     jrgt,
                       jtf_rs_groups_b      jrgb,
                       
                       jtf_rs_groups_tl     jrgt_parent,
                       jtf_rs_groups_b      jrgb_parent
               
                 WHERE trunc(SYSDATE) between jrgr.start_date_active AND
                       nvl(jrgr.end_date_active, '31-DEC-4712')
                   and jrgt.group_id = jrgr.group_id
                   and jrgb.group_id = jrgr.group_id
                   and trunc(SYSDATE) between jrgb.start_date_active AND
                       nvl(jrgb.end_date_active, '31-DEC-4712')
                   and jrgr.delete_flag ='N'   
                  
                   and jrgr.related_group_id = jrgb_parent.group_id
                   and jrgr.related_group_id = jrgt_parent.group_id
                   and trunc(SYSDATE) between jrgb_parent.start_date_active AND
                       nvl(jrgb_parent.end_date_active, '31-DEC-4712')
                       
                       )
        CONNECT BY PRIOR group_id = related_group_id
         START WITH parent_group_name = 'DIRECT BISG SALES'

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表