转至繁体中文版     | 网站首页 | 文章中心 | 下载中心 | 图片中心 | 笑话频道 | 教程频道 | 会员中心 | 雁过留声 | 
最新公告:     "MinTao学以致用网"欢迎您的光临,你的支持便是我们的动力,欢迎广大网友和各界人士亲临指导,你们的一个小小的建议便是我们发展的开路石!  [MinTao  2007年9月5日]        
您现在的位置: MinTao学以致用网 >> 文章中心 >> 电子课堂 >> 数据库 >> Sql Server >> 文章正文
专题栏目
更多内容
最新推荐 更多内容
相关文章
2006-03-01 PL/SQL Deve
[PL/SQL] 用For Loop 替
Tips to optimize plsql
PostgreSQL 8.0上手(Wi
任何学习都要使用从实践
My First PL/SQL Proced
PL/SQL DEVELOPER 6模板
PL/SQL DEVELOPER 6 模板
PL/SQL DEVELOPER 6模板
ColdFusion 7添加Postgr
更多内容
PostgreSql Plsql 演算Bill of material         
PostgreSql Plsql 演算Bill of material
作者:renwei_sz 文章来源:不详 点击数: 更新时间:2007-11-14 13:07:42
使用 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;

--BOM 展开函数
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;


--使用这个函数
SELECT * FROM bomia_part(''''xxx''''); --xxx = 父阶料号

文章录入:mintao    责任编辑:mintao 
  • 上一篇文章:

  • 下一篇文章:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007 MinTao学以致用网(www.mintao.net) Inc All Rights Reserved.
    QQ:543098146有事请Q我! QQ:261561092有事请Q我 QQ:179647303有事请Q我 MSN:min906@126.com
    站长:MinTao 信息产业部ICP备案号:鄂ICP备07500065号

    学以致用是我们学习者的至高境界和不懈追求,[MinTao学以致用网]与大家共同学习,共同进步……
    信息产业部备案
    *鄂ICP备07500065号