转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 数据库 >> Sql Server >> 正文
PostgreSql Plsql 演算Bill of material         

PostgreSql Plsql 演算Bill of material

作者:闵涛 文章来源:闵涛的学习笔记 点击数:1753 更新时间: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 = 父阶料号


[办公软件]如何实现Office工具栏、菜单以及菜单命令重命名  [办公软件]如何在Office文档(大)括号内输入多行文字
[办公软件]如何在office(PowerPoint,Word,Excel)中制作带圈的…  [办公软件]批量删除Office文档(word,excle,powerpoint)中的超…
[办公软件]Office(Word,Excel)密码破解软件(Office Password…  [办公软件]如何让低版本的Office也能顺利编辑2007文档
[办公软件]设置office艺术字的形状  [办公软件]如何将Office菜单设置、工具设置、宏设置等应用到…
[办公软件]在Office(word,excel)中输入各级钢筋符号的方法  [办公软件]打开Office文档就提示安装的原因及解决方案
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

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

    同类栏目
    · Sql Server  · MySql
    · Access  · ORACLE
    · SyBase  · 其他
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

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

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台