记录学习

2008年11月12日星期三

昨天梦到公司是的MM了

搞笑

可能这几天总是跟俞佳妮打交道,昨天晚上做梦竟然梦到她了

好像在一个学校里,好像是去上课的样子

还有阮菲菲也出现了

阮菲菲在梦里还对人开玩笑的说是我女朋友了-_-!

可恶啊,人家都已经身怀几甲了,罪过罪过……哦弥陀佛,善哉善哉

呵呵,莫名其妙啊哈哈

2008年10月27日星期一

row column changed2

关天ORACLE分析函数和行列转换通用包程序

1:介绍关于行列转换前的通用知识

Pivot查询是这样的,当你想要取出一些如下的数据时:

C1 C2 C3

������������

a1 b1 x1

a1 b1 x2

a1 b1 x3

想按如下格式显示:

C1 C2 C3(1) C3(2) C3(3)

A1 b1 x1 x2 x3

这样就将行转变成了列。

2:

在我们的日常开发中,经常会遇到这样的情况,就是分类汇总,而用一般的SQL写出的程序,数据是向行的方向展开的,但大部分报表的设计是希望向列的方向展开,这样的话,行列转换是非常必要和有用的!

3:通用转换包的实现

首先看一段代码

这段代码是将部门的收入前3名选择出来并用列的形式显示出来。(关于partiton by ,order by,

row_number over请参考相关分析函数的说明

http://www.emagister.cn/cursos-oracle%E7%AC%94%E8%AE%B0-%E5%88%86%E6%9E%90%E5%87%BD%E6%95%B0-simcour-2201109.htm)

下边是关于通包的包头说明:

create or replace package r_c_pkg

as

type refcursor is ref cursor; --定义一个结果信类型,用来返回结果集

type array is table of varchar2(30);--定义表结构类型。

procedure dbpivot(p_class_code_array in array ,

p_query in varchar2,

p_row_value in array,

p_class_value in array,

p_sum_row in varchar2,

p_cursor in out refcursor);

end ;

��������������

包体:

create or replace package body r_c_pkg

as

procedure dbpivot(p_class_code_array in array ,--存储类编号的值

p_query in varchar2,--必须有一项为CLASS_code,别名也可以

p_row_value in array,--需要做为列的值

p_class_value in array,--需要根据分类取的值

p_sum_row in varchar2,--如果还要在进行SUM的一些值

p_cursor in out refcursor)

as

------------------------------------------------

/*参数示例

p_class_code=> r_c_pkg.array('001','002','005') -其中001,002为需要分列显示的分类值

p_query =>'select a.pdep_code,c.class_code,sum(a.c_pay) as c_pay,sum(a.base_qty) as b_qty,

row_number()over

(partition by a.pdep_code

order by c.class_code nulls last) seq

from user_charge_tbl a,user_tbl c

where a.pdep_code='18' and a.user_id=c.user_id

group by a.pdep_code,c.class_code

'

p_row_value => r_c_pkg.array('pdep_code') 所有查询最前边那个GROUP BY 对像

p_class_value => r_c_pkg.arry('c_pay','b_qty') 是那个CLASS――CODE后边需要显示的值

p_cursor =>r_c_pkg.refcursor 目的是将得到的结果返回出来

p_sum_row=>'sum(base_cost),sum(f_cost)

*/

-------------------------------------------------

v_ncol_count number;

l_query long ;

v_class LONG;

l_row_value varchar2(500);

v_test_string varchar2(500);

begin

l_query:='select'||' ' ;

for j in 1..p_row_value.count -1

loop

l_row_value:=l_row_value||' '||p_row_value(j)||',';

end loop;

l_query:=l_query||l_row_value ;

--------------mxfhhh20060330

--l_query:=rtrim(l_query,',');

--------------mxfhhh20060330

for i in 1..p_class_code_array.count

loop

for k in 1..p_class_value.count-1

loop

--max(decode(class_code,'005',c_pay,0))f005

v_class:=v_class||' '||'max(decode(class_code,'||p_class_code_array(i)||

','||p_class_value(k)||',0))'||

' f'||p_class_code_array(i)||p_class_value(k)||',';

end loop;

end loop;

l_query:=l_query||v_class;

if p_sum_row='' then

l_query:=rtrim(l_query,',')||' from('||p_query||') group by ';

else

l_query:=l_query||p_sum_row||' from('||p_query||') group by ';

end if;

for j in 1..p_row_value.count

loop

l_query:=l_query||p_row_value(j);

v_test_string :=p_row_value(j)||v_test_string;

end loop;

l_query:=rtrim(l_query,',');

execute immediate 'alter session set cursor_sharing=force';

open p_cursor for l_query;

execute immediate 'alter session set cursor_sharing=exact';

---select user_id into l_query from user_tbl;

end;

end;

整个包的目的是动态生成您需要的行列转换内容,并返回结果集.

动态生成的SQL语句如下所示:

select sarea_code,

max(decode(class_code,004,c_pay,0)) f004c_pay,

max(decode(class_code,004,b_qty,0)) f004b_qty,

max(decode(class_code,005,c_pay,0)) f005c_pay,

max(decode(class_code,005,b_qty,0)) f005b_qty,

max(decode(class_code,006,c_pay,0)) f006c_pay,

max(decode(class_code,006,b_qty,0)) f006b_qty,

max(decode(class_code,007,c_pay,0)) f007c_pay,

max(decode(class_code,007,b_qty,0)) f007b_qty,

max(decode(class_code,008,c_pay,0)) f008c_pay,

max(decode(class_code,008,b_qty,0)) f008b_qty,

sum(base_cost),

sum(f_cost)

from

(

select a.sarea_code,c.class_code,sum(a.c_pay) as c_pay,

sum(a.base_qty+a.closs_qty+a.ex_qty+a.ad_qty) as b_qty,sum(a.base_cost) as base_cost,

sum(a.fadjust_cost) as f_cost,

row_number()over

(partition by a.sarea_code

order by c.class_code nulls last) seq

from user_charge_tbl a,user_tbl c

where a.sarea_code>='18001' and a.sarea_code<='18002' and a.user_id=c.user_id

group by a.sarea_code,c.class_code

)

group by sarea_code

以上程序根据工作需要而完成的,希望对那些报表设计有需要的同行有帮助。

参考书:oracle-one-on-one
--
Guyq <guyq@dealeasy.com>

row column change method

Oracle一个典型行列转换的几种实现方法
作者:NinGoo | 【转载须以超链接形式标明文章原始出处和作者信息】

假如有如下表,其中各个i值对应的行数是不定的
SQL> select * from t;

I A D
---------- ---------- -------------------
1 b 2008-03-27 10:55:42
1 a 2008-03-27 10:55:46
1 d 2008-03-27 10:55:30
2 z 2008-03-27 10:55:55
2 t 2008-03-27 10:55:59

要获得如下结果,注意字符串需要按照D列的时间排序:
1 d,b,a
2 z,t

这是一个比较典型的行列转换,有好几种实现方法

1.自定义函数实现
create or replace function my_concat(n number)
return varchar2
is
type typ_cursor is ref cursor;
v_cursor typ_cursor;
v_temp varchar2(10);
v_result varchar2(4000):= '';
v_sql varchar2(200);
begin
v_sql := 'select a from t where i=' || n ||' order by d';
open v_cursor for v_sql;
loop
fetch v_cursor into v_temp;
exit when v_cursor%notfound;
v_result := v_result ||',' || v_temp;
end loop;
return substr(v_result,2);
end;

SQL> select i,my_concat(i) from t group by i;

I MY_CONCAT(I)
---------- --------------------
1 d,b,a
2 z,t

虽然这种方式可以实现需求,但是如果表t的数据量很大,i的值又很多的情况下,因为针对每个i值都要执行一句select,扫描和排序的次数和i的值成正比,性能会非常差。

2.使用sys_connect_by_path
select i,ltrim(max(sys_connect_by_path(a,',')),',') a
from
(
select i,a,d,min(d) over(partition by i) d_min,
(row_number() over(order by i,d))+(dense_rank() over (order by i)) numid
from t
)
start with d=d_min connect by numid-1=prior numid
group by i;

从执行计划上来看,这种方式只需要扫描两次表,比自定义函数的方法,效率要高很多,尤其是表中数据量较大的时候:
eplan1

3.使用wm_sys.wm_concat

这个函数也可以实现类似的行列转换需求,但是似乎没有办法做到直接根据另外一列排序,所以需要先通过子查询或者临时表排好序
SQL> select i,wmsys.wm_concat(a) from t group by i;

I WMSYS.WM_CONCAT(A)
---------- --------------------
1 b,a,d
2 z,t

SQL> select i,wmsys.wm_concat(a)
2 from
3 (select * from t order by i,d)
4 group by i;

I WMSYS.WM_CONCAT(A)
---------- --------------------
1 d,b,a
2 z,t

执行计划上看,只需要做一次表扫描就可以了,但是这个函数是加密过的,执行计划并不能显示函数内部的操作。


--
Guyq <guyq@dealeasy.com>

2008年10月19日星期日

MCFrame右クリックMenuの定義クラスについて

一覧の右クリックMenuの定義クラスは以下です:
FMGDataSetController7


replaceNullToSpace: aString
"Written By fmg33201 27 April 2007 17:58."

"16r0000の文字をスペースに置き換える。"

^self dataSetExcelClass new replaceNullToSpace: aString


--
Guyq <guyq@dealeasy.com>

2008年10月15日星期三

MPS主生产计划

主生产计划(The Master Production Schedule 缩写为MPS)
由于主生产计划要驱动集优先级(物料)、能力与成本的计划与控制于一体的
正式系统,它比生产计划要更加详细些。MPS中规定的产品必须由具体、个别的
BOM来描述。
MPS有三种功能:
1、把企业计划同日常的作业计划联锁起来。
2、为日常作业的管理提供一个"控制把手"。
3、驱动正式的、一体化的计划与控制系统。
如果没有一个由现代系统提供的健全地一体化的正式的计划编制能力,管理者
无法确定他手下对成千种物品作着上百决定的成打的人员是否在为支持公司的战略
事业与生产计划而工作着。今天的知识与现代的信息管理系统使得一个充分一体化
的多层计划系统成为可能,其特征是:
1、从上到下较短的视界与时间期间。
2、自上而下越来越细。
3、能够维持所有计划的完整性的定期重新计划。
4、能提出多种计划去满足特定需要。
原理30.孤立、不受约束而且多目的的计划比无用还要坏;它们是危险的。
MPS着重于要被制造的产品,而且通过详细的计划系统,识别所需资源(物
料、劳力、工厂设备与资金)及其需要时机。虽然现已被广泛接受与使用,它的名
字起得并不好。主与生产这两个词在这里应用得很恰当;但日程计划(schedule)
这个词正当地含蓄着安排时机与细节,它给中层与高层管理人员传达一幅细节的图
象,订货日期与其它琐事(对他们而言)。要更换名字现在已经太晚了。然而必须
消除他们的误解;MPS提供给他们的是对企业的控制把手之一。
MPS的基本目的是去发起获得为实施该计划所需的资源。注意着重点是发起
而非完成获得所需物料、人员、设备、资金等等的过程。计划阶段推测何时需要多
少什么东西的估计量;执行阶段最后地确定──通常要晚得多──将具体地得到与
生产出什么。这是一种极其重要的区别,不只是语义问题。
MPS是什么
根据定义,MPS是详细陈述在何时要生产出多少物品的计划。因此,任何一
家公司的MPS总是计划内物品与每一计划内物品所复盖的时间期间所构成的一个
矩阵。所使用的时间期间往往是一周,虽然对大而复杂的产品如发电设备与船舶有
时用两周或一个月。有些理论家,被假设的重新安排计划的威力冲昏了头脑,鼓吹
以每天作为时段,但这是不实际的;它们可能更精确但不会是更准确。这在第二册
第2章中讨论。MPS陈述能够而且应该生产什么;它并不是管理者将喜欢去生产
什么的一张希望──表。由于夸大MPS而引起的问题是非常紧迫与严重的。详见
第二册。
如前所述,MPS为企业管理提供一个控制把手。它是通过提供下列手段、机
制与方法而做到这一点的:
1、一种授权与控制支持着客户服务、获利能力与资本投资目标的劳动力水平
、库存投资与现金流的手段。
2、一种协调市场营销、销售、工程设计、制造与财务活动以开发一共同计划
与改进集体协作的机制。
3、一种调和市场营销及销售方面的需求与制造能力的方法。
4、一种度量每一群体在执行共同计划中的绩效的手段。
MPS不是什么
销售预测不是MPS;它推测客户的需求,而MPS陈述满足这一需求的生产。
当间歇地成批生产以满足持续的需求时,当生产平稳而需求是季节性的或起伏不定
的时候以及当成品库存正被显著地提高或降低之时,这两者就会有大的区别。只有
难得地,当这些情况不存在时,MPS才会与销售预测相同。
MPS也不是一个装配或包装日程计划,后者是执行活动。对于消费产品、药
品、化妆品、食品、精细化工产品及简单的硬货(BOM中层次与组件少的物品),
MPS与完工日程计划在所用数字上可能相同,但在心目中必须明确保持它们的不
同概念,以便恰当地为最大利益来应用它们。
原理31.MPS驱动计划过程,而非执行过程。
MPS的输入
提出MPS时必须考虑许多因素,它们既有技术性的也有非技术性的,这包括:
1、产品是备货生产的还是订货生产的还是两者结合的。
2、仓储与生产设施的数目与地点。
3、服务件政策。
4、客户服务目标。
5、组件的厂际转移。
6、自制与外购的政策。
7、客户订单与需求预测。
8、安全存货水平。
9、关于雇佣稳定性与工厂利用方面的政策。
10、由物料清单定义的产品结构。
显然,准备MPS不属文书人员的任务。它是一种高层次计划作业,应被高层
经理透彻地理解并由他们来指导。在为MPS开发输入数据时,对备货生产与订货
生产产品二者,分时段订货点法的逻辑提供一种同时考虑多个存货地点、需求预测、
安全存货水平、已收客户订单与已在进行加工的生产批的有效方法。此技法的机制
见第5章,它对完工产品计划的应用将在第二册作更充分的讨论。分时段订货点法
的已计划订单输出数据为每种产品提供制订主生产计划的一个起点。也常用S-P
-I报告去开发MPS的输入;注意其逻辑同分时段订货点法非常相似。

MPS可用两种方法建立:
1、表示出已完工并准备好待发货到客户、仓库或所属工厂的最终物品(同M
PS一道用来开发MRP输出的物料清单的最高层物品)的数量。
2、陈述准备好可用来制造最终物品的成套组件数,该最终物品的数量则陈述
在所用时间期间开始的MRP中。
这两种方法选用哪一种将根据产品的类型。当一产品有几种功能特色(不只是
颜色或包装)可供客户选用时,或如果被客户选用时可包括有多种附属品与附件时,
MPS用第2种方法陈述。这类产品包括计算机、机床、汽车、卡车、飞机与重型
非公路车辆。对于具有许多通用件或成份的较简单产品,如果完工快时,也使用这
种方法。典型例子是钢笔、自动铅笔、电话与电子计算器。当选用第1种方法时,
来自分时段订货点法的已计划订单收货数量与时机为MPS提供输入;当MPS陈
述完工开始时要用的成套组件数时,使用已计划订单的发放数据。其机制见第3章。
MPS必须包括工厂设施上全部显著的需求。这些需求来自客户对产品与服务
件的需求,来自分销商、代理商及公司仓储它们的分配中心,来自使用组件或产品
的所属设施,并且来自建立这类物品库存的计划(注意当降低库存时,这需求是负
的)。勿视其中任何一种需求将使工厂的负荷被显著地打了折扣。
在具有多层供 ── 需关系的工厂中,供方车间的MPS必须从用户车间中由
MRP程序提出的已计划订单推导出来。例如在纺织厂中,纺纱生产必须有计划去
满足织坯布设施的需求,而后者又必须支持完工车间中织物、衣服等等的输出。为
这种一体化设施作独立的计划是浪费,特别是如果它们都属于同一公司家族。同理,
即使它们属于不同企业而且即使用户工厂只取供方产出的一部份,公司同其供应商
密切地合作也有实际的好处。外购物料的适时(JIT)交货要求这种类型的合作
的计划与执行。

MRP知�を勉�3

┏━━━━━━━┳━━━━━━┳━━━━━┳━━━━━━━━━━━━┓
┃ 是否展开到 ┃是否自动重新┃是否生成例┃用户对数量、开始与需用日┃
┃ 较低层? ┃安排日程? ┃外信息? ┃期有无控制? ┃
┏━━━━━━╋━━━━━━━╋━━━━━━╋━━━━━╋━━━━━━━━━━━━┫
┃ 已计划订单┃ 是 ┃ 是 ┃ 否 ┃必须使用MRP程序中的规则 ┃
┣━━━━━━╋━━━━━━━╋━━━━━━╋━━━━━╋━━━━━━━━━━━━┫
┃ 已发放订单┃仅当首次发放时┃ 否 ┃ 是 ┃ 是 ┃
┣━━━━━━╋━━━━━━━╋━━━━━━╋━━━━━╋━━━━━━━━━━━━┫
┃不变计划订单┃ 是 ┃ 否 ┃ 否 ┃ 是 ┃
┗━━━━━━┻━━━━━━━┻━━━━━━┻━━━━━┻━━━━━━━━━━━━┛
图6-15 MRP的订单处理

┏━━━━━━┳━━━━━┳━━━━━┓
┃ 重新生成 ┃ 需求更改 ┃ 净改变 ┃
┏━━━━━━╋━━━━━━╋━━━━━╋━━━━━┫
┃ 库存未了结 ┃ ┃ ┃ ┃
┃ 订单被更新 ┃ 是 ┃ 是 ┃ 是 ┃
┣━━━━━━╋━━━━━━╋━━━━━╋━━━━━┫
┃ 全部主生产 ┃ ┃ ┃ ┃
┃ 计划被展开 ┃ 是 ┃ 否 ┃ 否 ┃
┣━━━━━━╋━━━━━━╋━━━━━╋━━━━━┫
┃ MRP运行 ┃ 每周 每二周┃ 每日 ┃ ┃
┃ 的频度 ┃每月(难得)┃ 每半周 ┃ 每日 ┃
┣━━━━━━╋━━━━━━╋━━━━━╋━━━━━┫
┃ 每一事务被 ┃ ┃ ┃ ┃
┃ 分析的效果 ┃ 否 ┃ 否 ┃ 是 ┃
┗━━━━━━┻━━━━━━┻━━━━━┻━━━━━┛
图6-17 MRP的更新

订货生产作业中的MRP
客户定制产品的制造商曾经迟迟未采用MRP程序。这主要是由于MRP被误
认为只是一种全视界、典型的净、分时段的、多层次技法,因为大多数文献是这样
说的。纯订货生产产品的制造商(真正的单件或小批生产车间),包括船舶、飞机、
特种机床与电子单元、导弹与重型建筑机械,它们难于开发出一传统的MPS;它
们的产品产量很低(即使大于1的话)而且是间歇地生产的(即使多于1次)。其
物料清单零零碎碎地被开发与发放,往往直到该产品被发货才算是最终的与完全的。
设计更改频繁,许多更改发生在接收检验时的最后时刻。
同时,大多数这类制造商正在计划对外购与自制品都只使用毛需求量与很宽松
的提前期。他们只使用手工的或粗糙的计算机子系统,只具有很小的能力去算出已
经可用的物料。因此,他们认识到MRP的逻辑可以应用但并不清楚如何去应用它。
MRP的应用要求:
1、对于重复生产的产品,即便它完全是客户定做的,要有属物料清单。
2、由组件设计按尽可能满足计划人员所需的日程发放部份物料清单以使他们
去订货物料与安排设施。
3、由工程设计、计划、采购与生产人员共用一个物料清单文件。
4、较宽的时段(几周与几月)
5、缓冲度最小的提前期
当客户允许的提前期明显地短于采购与加工物料所需的总时间时,必须在库存
中备有某些外购件与自制件。既然它们的需求不能由标准MRP程序来计算,这些
物料的获得与控制必须通过
1、经典的或分时段的订货点技法(见第5章)
2、在MRP中使用由属MPS驱动的(见第7章)模块式计划用物料清单。
在发放物料清单信息,管理设计更改,处理事务,报告收货与发货,维护准确
的库存与未了结订单状态以及特别是调整能力以处理会变动的负荷等活动中,严格
的纪律是不可缺少的。一个具有重新制订计划能力的一体化的MRP程序对于订货
生产产品不仅是可以应用的,而且是需要的。
重复性制造业中的MRP
难于应用MRP程序的谱中的另一端是重复生产型公司,它们往往在一个流程
中生产大量很不相同的离散产品。典型产品是汽车、家用电器、电视机、无线电设
备、药品、化妆用品以及精细化工产品。这里的基本困难在于传统的MRP对制造
物品需要有离散的订单,而这些公司是用每班或每日的生产速率与到某一具体日期
的累计总量来考虑问题的。
对外购物料没有困难,它们可按通常的方法来计划。计划问题也可通过采用浅
的物料清单与在原料与成品之间不存或少存作为半成品、中间体、子装配件等产品
的存货而大大简化。图6-18表示通过使用作业天数、需求、收货与已计划订货
(要补与开始)等的累计总量可以使MRP如何适应于重复性制造。注意"将收"
与"累计将收"表示已发放订单的数据;"要补"与"开始"在这时只是已计划而
已。在此期间,有两个节假日,分别落在第16周与第22周。在第18周与22

┏━┳━━━━━━━━━━━━━━━━━━━━━━━━━━┓
自制马达┃过┃ 本 周 *假日 ┃
┃ ┣━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┫
#13245 ┃期┃ 14 ┃ 15 ┃ 16 ┃ 17 ┃ 18 ┃ 19 ┃ 20 ┃ 21 ┃ 22*┃
┏━━━━╋━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━┫
┃累计天数┃ ┃ 69 ┃ 74 ┃ 78 ┃ 83 ┃ 88 ┃ 93 ┃ 98 ┃103 ┃107 ┃
┣━━━━╋━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━┫
┃ 需求 ┃ ┃ 12 ┃ 12 ┃ 12 ┃ 12 ┃ 17 ┃ 17 ┃ 17 ┃ 17 ┃ 22 ┃
┣━━━━╋━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━┫
┃累计需求┃ ┃140 ┃152 ┃164 ┃176 ┃193 ┃210 ┃227 ┃244 ┃266 ┃
┣━━━━╋━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━┫
┃ 将收 ┃ ┃ 12 ┃ 12 ┃ 10 ┃ 12 ┃ ┃ ┃ ┃ ┃ ┃
┣━━━━╋━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━┫
┃累计将收┃ ┃132 ┃144 ┃154 ┃166 ┃ ┃ ┃ ┃ ┃ ┃
┣━━━━╋━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━┫
┃ 将有 ┃ 7┃ 7 ┃ 7 ┃ 5 ┃ 5 ┃ 8 ┃ 11 ┃ 14 ┃ 17 ┃ 11 ┃
┣━━━━╋━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━┫
┃ 要补 ┃ ┃ ┃ ┃ ┃ ┃ 20 ┃ 20 ┃ 20 ┃ 20 ┃ 16 ┃
┣━━━━╋━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━┫
┃累计要补┃ ┃132 ┃144 ┃154 ┃166 ┃186 ┃206 ┃226 ┃246 ┃262 ┃
┣━━━━╋━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━┫
┃ 开始 ┃ ┃ ┃ ┃ ┃ 20 ┃ 20 ┃ 20 ┃ 20 ┃ 16 ┃ 20 ┃
┣━━━━╋━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━┫
┃累计开始┃ ┃144 ┃154 ┃166 ┃186 ┃206 ┃226 ┃246 ┃262 ┃282 ┃
┗━━━━┻━┻━━┻━━┻━━┻━━┻━━┻━━┻━━┻━━┻━━┛
图6-18 用于重复性制造业的累计式MRP

周,需求将两次增加,每次每周增加5件,但生产只在第18周增加1次,从每周
12件增到20件。这将使库存从7件增长到17件直到需求再次改变,但在这一
库存用完之前生产无需更改。生产与需求可以紧密配合是MRP应用的典型情况。
注意提前期短,这也是重复性制造的典型情况。图中所制造的物品是家用电器中使
用的一种电动机。
当最低生产速率比需求大得多时,该物品将间歇地生产,开工时建立起库存而
停工时库存下降。日产量、日需求与容许的高低库存水平控制着生产运行的时机与
期间数。为显示各种累计总量并按给定的每期间的生产量安排生产日程,计算机程
序只需作很小的修改。
过程工业中的MRP
有各种各样的过程工业,从石油精炼业,它连续地运行专用、设备以生产狭窄
的一大类产品,到食品加工业,它间歇地运行通用设备以生产宽广的多类产品。许
多生产化工品、药品与化妆品的工厂则把几种类型结合起来。间歇地成批生产这类
产品时,可不加修改地应用传统的分时段MRP。使用不常中断的流水线设备来生
产多类产品时(纸、香烟、软饮料),可使用前面为重复性制造讨论过的修改过的
MRP程序。
触媒的裂解单元,管道蒸馏室与精炼作业中的石油化工工厂与粘土、水泥与钢
铁厂的连续作业只要求间歇地进行相当简单的计算以平衡销售、生产与库存,为输
入原料设定流量并提出对包装物料与发货容器还有非常少量的触媒、填料、添加剂
或合金元素的需要量。这种少量的计算要求很小的能力,虽然一种正式的系统方法
总是比零碎的手工技法产生的结果要好些。这些作业中真正的问题在于过程的控制
(从而控制住产品的质量),及时地对原料组成中的变化作出反应,对付无弹性的
能力并在能力太小与太大之间求取一种平衡。
原理28.MRP的逻辑是普遍适用的;它的应用方法要看具体的环境而定。
MRP技法有三件很有价值的工作可做:
1、建议(不是独断)发放订单的恰当时机。
2、指明需要补货的恰当日期并保持这些日期在订单处理期间是有效的。
3、提供信息去帮助能力需求计划与机器和加工中心的加载工作。
MRP不是一个系统。它只是系统中的一种技法(虽然是重要的一种)。其成
功使用取决于本书与第二册中详细讨论的许多因素。MRP的使用中缺乏成功的理
由有:
1、它是一个不完全系统的一部份(见第1章)
2、它被一无效的或管理不善的MPS所驱动(见第7章)
3、数据不准确
4、物料清单没组织好(见本章与第7章)
5、用户不合格

MRP知�を勉�2

MRP的前提条件
分时段净物料需求计划(Net Time-phased MRP)要求非常具体的数据。 它们
是:
1、一份分时段的主生产计划,其中每一物品由一物料清单描述。
2、每一物料清单中的每一组件及其父件要有唯一的识别号。
3、结构恰当而准确的物料清单与工程更改的严格控制。
4、关于存货物品准确的现行库存余额。
5、关于未了结的采购与制造订单的准确数量与可靠的交货日期。
6、关于采购物品与制造物品的可靠的提前时间。
这些数据对任何MRP程序都是不可缺少的。此外,还有对实际应用该技法的
要求:
1、用来处理实际上每家公司中所要求的大量数据的计算机软硬件。
2、物料收发、库存调整以及订单发放与了结的及时报告。
3、处理计划中识别的不同批的纪律。
4、有能力制订出有效的计划并然后执行它们的人员。
MPS 子系统
最低限度的MPS子系统必须包括每一将应用MRP的产品的数量与日期数据。
为了MRP逻辑能使用于所有组件,MPS的视界必须至少要伸展到等于构成从采
购某些原料开始、通过生产MPS中所描述物品所要求的各道加工作业的一个最长
顺序的所有提前期之和;这叫做累计提前时间、关键路径提前时间或堆积提前时间。
MPS的视界还要被延伸并在较低层次使用视界填充者以提供一合理数量的(3到
6个月)关于原料未来需求的数据。更完整的MPS子系统见第7章。
零件代号化
在现代系统中使用时,每一物品必须具有一个而且只有一个零件号。在本章的
例(灯)中,所使用的零件号系统是一种非常简单的、用在小公司中的典型零件号
系统,它把数字与字母无显著意义或理由地结合在一起。随着公司的成长与其产品
大类的扩展,该编号系统开始变得令人难以置信地复杂化以致即使简单的系统也开
始陷于困境。于是,一项开发一更加合理的零件编号系统的计划开始了──通常用
多位数字,每位数字具有某种意义(描述产品的原料、它的基本制作方法、是自制
还是外购等等)──并引进这一零件编号系统。对某些组件,保持每位数字具有某
种意义很快变得极为不便,于是最后便采用无显著意义的零件编号。在一个不良的
生产与库存控制环境里发现三种不同的零件编号系统同时并用并非少见的事。看来
只有少数管理人员认识到了缺乏一个良好的零件编号系统与生产与库存控制活动缺
乏成果这两件事之间的联系。
理想的零件编号系统具有尽可能少的数字并且只使用数码数据。只用4位数字
就可以唯一地识别出多达1万种不同物品。虽然很少公司有100,000种物品
要处理,但大多数公司用6位数字,许多公司有字母字符、短划、空格参杂在零件
号之中。他们受到的惩罚包括:
1、处理数据的人员出错更多
2、需扩充文档空间
3、程序的处理时间更慢
现在就是开始逐步采用一种简单、可工作的零件编号系统再好不过的时机。对
一切新产品、新材料与其它被计划与控制的物品,都应采用短的、纯数码。用短数
码去一下子替代现存的长而复杂的代号的庞大计划是难以论证的;时间、设计与其
它变化将最终地排除它们。零件编号这一主题详见第二册。
原理23.理想的零件号是短的、数码的与唯一的。
物料清单的构成
本章前面的例中所举的灯其物料清单非常简单,零件很少,没有子装配件。在
更复杂的装配件中,有必要同计划件的与最终装配件的制造那样去计划子装配件的
制造。如果灯制造商决定要自制Y2L插头,则物料清单将必须显示装配这一子装
配件所需的组件以及其它进入总装的组件。
图6-6出示这一较为复杂的物料清单,但它并未指出#1314开关乃是

制造代码
314
┏━━━━━━━━━━━━━┳━━━━┳━━━━┓
┃ 组 件 ┃ 所 需 ┃ ┃
┣━━━━━━┳━━━━━━┫ ┃ 来 源 ┃
┃ 编 号 ┃ 描 述 ┃ 数 量 ┃ ┃
┣━━━━━━╋━━━━━━╋━━━━╋━━━━┫
┃ X18 ┃ 开 关 ┃ 1 ┃ 购 ┃
┣━━━━━━╋━━━━━━╋━━━━╋━━━━┫
┃ Y2L ┃插头装配件 ┃ 1 ┃ 制 ┃
┣━━━━━━╋━━━━━━╋━━━━╋━━━━┫
┃ 1314 ┃ 开 关 ┃ 1 ┃ 购 ┃
┣━━━━━━╋━━━━━━╋━━━━╋━━━━┫
┃ 219 ┃ 外 壳 ┃ 1 ┃ 制 ┃
┣━━━━━━╋━━━━━━╋━━━━╋━━━━┫
┃ 326 ┃ 底 座 ┃ 1 ┃ 制 ┃
┣━━━━━━╋━━━━━━╋━━━━╋━━━━┫
┃ 220 ┃ 外壳绝缘 ┃ 1 ┃ 购 ┃
┣━━━━━━╋━━━━━━╋━━━━╋━━━━┫
┃ 222 ┃ 底座绝缘 ┃ 1 ┃ 购 ┃
┣━━━━━━╋━━━━━━╋━━━━╋━━━━┫
┃ 405 ┃ 螺 杆 ┃ 1 ┃ 制 ┃
┣━━━━━━╋━━━━━━╋━━━━╋━━━━┫
┃ 9P ┃ 灯 罩 ┃ 1 ┃ 制 ┃
┣━━━━━━╋━━━━━━╋━━━━╋━━━━┫
┃ 414 ┃ 挂 勾 ┃ 2 ┃ 制 ┃
┣━━━━━━╋━━━━━━╋━━━━╋━━━━┫
┃ 4107 ┃ 电 缆 ┃ 1 ┃ 购 ┃
┗━━━━━━┻━━━━━━┻━━━━┻━━━━┛
图6-6 多层物料清单──#9P灯

Y2L插头这一子装配件的零件。可在物料清单上作些标志以指明这一关系,例如
使用星号去表示子装配件中所用的所有物品;但若这些子装配件还有其子装配件,
这种星号标志法将显得非常不便。更为普通的方法是用缩排形式来表示物料清单,
如图6-7所示。这里所有进入Y2L插头的组件,即第二层组件,向右缩排以表

制造代码
314
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
第1层 第2层 描 述 所需数量 来源
组件号 组件号
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
X18 开 关 1 购
Y2L 插头装配件 1 制
1314 开 关 1 购
219 外 壳 1 制
326 底 座 1 制
220 外壳绝缘 1 购
222 底座绝缘 1 购
405 螺 杆 1 制
9P 灯 罩 1 制
414 挂 勾 2 制
4107 电 缆 1 购
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
图6-7 部份缩排的物料清单──#9P灯

示它们是用在紧靠前面的那个子装配件的组件。在图6-6与6-7中,#9P灯
都用制造代码314来表示。
由于Y2L插头要用在每种灯中,图6-7表明这种插头或其组件的任何改变
都将影响到每份物料清单。一种稍有不同的物料清单形式,它有助于更好的维护与
更新,可以简化这种工作。例如,如果使用图6-2中的物料清单但Y2L插头用
代码表示为一个自制的子装配件,另外专用一份物料清单(如图6-8所示)来表
示该子装配件。这叫做单层物料清单。这样一来该子装配件中任何变化只要不影响
它在最终物品中的使用就只需更改一份物料清单──只要Y2L插头继续用于最终
装配,各个较高层清单将不受影响。单层物料清单的使用也大大减少了所需的总文
档空间,因为通用件的物料清单只需在产品结构文件中存储一次。计算机以高速存
取与检索记录的能力使得这种分裂的文件可以实用;用人工搜索这种相关的物料清
单是不切实际的。

制造代码 (用在#7W、#7D、#9W、#9D、
418 #9P、#11D、#11P灯中)
━━━━━━━━━━━━━━━━━━━━━━
组 件
编 号 描 述 所需数量 来源
━━━━━━━━━━━━━━━━━━━━━━
1314 开 关 1 购
219 外 壳 1 制
326 底 座 1 制
220 外壳绝缘 1 购
222 底座绝缘 1 购
405 螺 杆 1 制
━━━━━━━━━━━━━━━━━━━━━━━
6-8 物料清单──Y2L插头装配件

计算机也具有在产品结构文件中保留信息使计算机能检索与提供反查(何处使
用了)物料清单。有如图6-8顶部的信息(显示使用Y2L插头的所有灯型),
这种清单指出某一物品在其较高层清单中所有的应用;这些信息对设计工程师非常
有用,他可以发现一个组件的设计更改将可能影响到哪些父物品。单层与多层的反
查清单都是常用的。
一种有用的物料清单的图示法是系列树或圣诞树,如图6-9所示。此图表示
从成品到原料的各个层次并包括所有外购与自制的组件。这格式虽然对研究此产品


314 层次
灯 0
┏━━━━━━━┳━━━━━━┳━━━━━━━┳━━━━━┓
9P X18 418 4107 414
灯罩 开关 插头 电缆 挂勾 1
┃ ┃ ┃
┃(1.4尺2) ┃ ┃(1.2寸)
┏━━┻━━┓ ┏━━━┳━━━━┳━━━┳━━━━┳━━━┓ ┃
110 105 220 219 1314 326 222 405 126 2
铁丝 纸 外壳 外壳 开关 底座 底座 螺杆 带
框架 绝缘 ┃ ┃ 绝缘 ┃
┃ ┃(0.75尺) ┃(4.5寸) ┃(4寸)
┃(7.3尺) 186 126 174
108 管子 带 条 3
铁丝
图6-9 系列树物料清单──#9P

结构的人非常明白与有用,却只可能用在很少数公司的正式计划系统之中。在结构
问题、制造作业与产品的简化与标准化问题的研究之中它有更广一些的用途;在这
些研究中常常使用典型产品的手工图。在这种研究中矩阵展开表(6-3)更加有
用虽然它会变得冗长。传统做法是从上到下去给层次编号;因此图6-9中314
号灯的层次为0,大多数原料的层次为3。
#9P灯的完全缩排物料清单如图6-10所示。此图表示设置清单的一种常
用方法,将零件号缩排以显示父件──组件关系。注意这是一份四层清单(从314
号灯到四种原料),它有一个子装配件(418号插头)与最终装配物料清单再加
上五份用外购原料单独制成的组件的清单。还请注意126号带在不同层次上出现
了两次。要真正地完全,此物料清单还应包括包装物料。
在一完全缩排物料清单中(如图6-10所示),若干物品通用的组件与原料
将出现多次。为了简化使用这种物料清单的许多活动,可用计算机程序去开发汇总
的清单。在这种清单中,每种物品只出现一次,每件产品所需要每种物品的数量是
每种物品在所有应用中所需的总计数。


零 件 号 ┃ 描 述 ┃ 所需数量 ┃ 来 源
━━┯━┯━┯━┯━╋━━━━━╋━━━━━━╋━━━━━
X│1│8│ │ ┃ 开 关 ┃ 1 ┃ 购
Y│2│L│ │ ┃ 插 头 ┃ 1 ┃ 制
│1│3│1│4┃ 开 关 ┃ 1 ┃ 购
│2│1│9│ ┃ 外 壳 ┃ 1 ┃ 制
│ │1│8│6┃ 管 子 ┃ 0.75尺 ┃ 购
│3│2│6│ ┃ 底 座 ┃ 1 ┃ 制
│ │1│2│6┃ 带 ┃ 4.5寸 ┃ 购
│2│2│0│ ┃外壳绝缘 ┃ 1 ┃ 购
│2│2│2│ ┃底座绝缘 ┃ 1 ┃ 购
│4│0│5│ ┃ 螺 杆 ┃ 1 ┃ 制
│ │1│7│4┃ 条 ┃ 4 寸 ┃ 购
9│P│ │ │ ┃ 灯 罩 ┃ 1 ┃ 制
│1│0│5│ ┃ 纸 ┃ 1.4尺2 ┃ 购
│1│1│0│ ┃ 框 架 ┃ 1 ┃ 制
│ │1│0│8┃ 铁 丝 ┃ 7.3尺 ┃ 购
4│1│4│ │ ┃ 挂 勾 ┃ 2 ┃ 制
│1│2│6│ ┃ 带 ┃ 1.2寸 ┃ 购
4│1│0│7│ ┃ 电 缆 ┃ 1 ┃ 购
━━┷━┷━┷━┷━┻━━━━━┻━━━━━━┻━━━━━
图6-10 完全缩排物料清单──#9P灯

所有用来处理物料清单的好的计算机程序都能够自动地分派低层代码;它们表
明一物品在它被使用的任一物料清单中的最低层次。这些低层代码的主要用途是确
定何时一MRP程序已经累计了对一组件的全部需求并可接着进展到针对这些需求
去应用现有库存与已订货量以计算出净需求。例如,在图6-9中,126号带出
现在第2层与第3层;在制造326号底座的需求未确定之前不会提出126号带
的总需求量。低层代码确实地告诉计算机何时去为每一物品计算其净需求。若在其
它应用中使用层次代码则要加上小心。当物料清单文件中加进新的物品时,计算机
程序将总是确定正当的最低层代码,但它们当物品被取消时可能并不减少层次代码。
在MRP的净计算中这不成问题,但对层次代码的其它用途可能有显著影响。
用人工处理物料清单时,一种常用形式是增─删清单(add-and-delete bill),
别名叫"除了相同之外"(same-as-except)与比较性(comparative)清单。 可
以通过简单地增删一份现存清单来为一种新物品开发这种清单。它的实际优点是在
相似物品之间突出具体的差别,此外也使书面工作更加简单。然而,物料清单的这
种形式并不有助于其在MRP程序与其它现代计划编制应用中的使用而且对于计算
机清单处理程序这也是不必要的。
所造产品的一般配置相似而且一次只造一件的公司(诸如造船、重型机器或建
筑用设备)发现"属物料清单"(generic BOM)是有用的。 这种物料清单具有任
意派定的零件号与组件的一般描述,它有两个目的:
1、作为核对表,以确保在设计与采购中没有忽视任何组件。
2、为生产前活动提出日程计划,包括成本估计、设计、机床安装、能力计划、
加工等等。
为了在设计工作完成之前就可以提前发放某些细节,可以发放部份物料清单
(partial BOM),使得生产前、物料采购与其它必要活动得以开始。 这最好同属
清单一道办理,同时显示已发放的与未发放的物品。部分清单在使用正式系统而非
依赖于子系统来提出与跟踪实际成本与生产信息方面也是有用的。
并非直接进入产品的其它物料也被包括在物料清单之中以改善对这些物料的计
划与控制。这些物料包括医药、化工与食品加工中的清洁剂、检测用试剂、机床安
装、砂轮与加工中消耗的类似物品。物料清单的其它应用详见第二册。在超量计划
技法中特种结构物料清单的使用见第7章。第二册的第4章介绍许多情况下物料清
单的应用。
原理24.物料清单构成现代系统的框架;它们必须高度准确并恰当地构成。
工程更改的控制
由于物料清单的关键角色,处理物料清单的程序的一个必要属性就是一套处理
工程设计更改的程序。这些程序的基本目的是去选择未来的物料计划中物料清单的
正确格式。发生工程更改有种种原因──主要原因是产品改进,制造问题,降低成
本,提高质量,产品寿命与政府的规章。
引进更改的时机可根据下列中的任何一个:
1、克服某种暂时困难的临时需要。
2、由于职能、安全、健康或法律上的理由的迫切需要(也许还包括取消或翻
新正在使用中的产品)。
3、为了在尽可能早的时机利用更改得到新的物品。
4、最小限度的成本,包括过时的库存,机床安装、制订规章的机关的批准,
设备更换等等。
5、具体时间或产品的序号以便同若干其它更改配合或为客户提供特定的配置。
上述的第2种更改往往叫做强制性更改,而其它几种叫选择性更改。影响更改
时机和数据收集与决策的处理方法的诸因素更加完整的讨论见第二册。时机方面重
要的考虑有:
1、现存的组件与产品库存的耗尽
2、服务(备件)零件的需要
3、新品的可得性──原料、机床安装、设备、等等。
4、对工厂或供应商能力的影响
5、竞争状况
6、利润贡献
7、主管机关的批准
8、产品说明的手工更改
有若干技法可用来恰当地引进工程更改。最普通的技法利用一生效日期,它是
经过仔细地考虑了上述有关因素之后才确定的。然后把这一日期登入新组件与被替
代组件的产品结构文件,如图6-11(a)所示。因此,计算机被指示#1314


(a) 418
插 头
---┏━━━━┳━━━━╋━━━━┳━━━━┓---
其 它 ┃ 组 件
1314
开 关
#927工程更改通知指导一旦有供应时即用
#1369开关替代所有#1314开关
生效性
零件号 描述 工程更改通知 状态 日期
1314 开关 927 删除 09/15
1369 开关 927 增添 09/16
-------------------------------------------
(b) 1314 (设订货量=批对批)
开关 (设提前期=0)
(设安全存货=0或
所需余额)
1369
开关
图6-11 物料清单更改生效日期

开关要一直使用到9月15日,而从9月16日开始使用#1369开关。这一日
期的确定要配合来自供应商的新开关的可得性。
在某些情况下,可使用一种非常简单的(虽然是手工的)物料清单去联系现存
组件与新组件,如图6-11(b)所示。它要求在物料清单的每一种应用(当然
备件除外)用新品取代老品。当所有老品要被用完(或下降到某一特定量)时该更
改才生效。MRP用完现存物品并在需要时调用新品。如图6-11(b)所示,
在现存物品的物品主文件中有若干数据需作修改:
1、确定批量大小的规则应设置为批对批(每一时间期间所需数量各异)。
2、提前期应设置为零,表示新品的需要时间与老品相同。
3、如果希望把现存物品用完,安全存货也应设置为零。如果要保留某些数量
作服务件或其它用途,应将数量登入安全存货记录。
当这种物料清单用于成本核算时,新老两物品中必须有一个的成本在其文件中
要设置为零。倘要用现存物品的成本,则新品的成本要设为零,反之亦然。可以生
成提料单调用新品作为现存物品的替代物。也可用这种技法去触发采购物品的信号,
采购物品应该是没有物料清单的。显然,需作大量工作去调整文件,而且要有效地
使用这种简单技法,使用者必须充分理解这种方法。当由于需求变化,收率问题等
原因而难于确定一有效的生效日期时,这种简单方法可能是有益的。它取代了为不
断监视生效日期而更换文件的工作。注意在所有情况下应定期地清除掉产品结构文
件中过时的清单。
序号生效性是一更为复杂的问题。用来控制更改时机的序号通常指派给最高层
的产品。在计划物料时企图把序号从上层弄到底层是一种错误。这种做法要求非常
大量的数据存储与长得多的运行时间;只有当涉及少数昂贵产品时才能证实这种方
法。最好的办法是使用图6-11中所示的技法之一去争取把大多数现存物品用掉
并在接近正确时间时得到新品。除非涉及非常昂贵的物料,否则不妨安排一些现存
物品作缓冲。当执行该计划的时刻到来时,可为每一用序号编号的产品选择恰当的
物料清单。
当涉及昂贵物料或当要求用序号很严格地控制更改时,主计划必须包括两种产
品识别号(型号与序号)并且MRP程序的净改变更新是必要的。在该截止序号以
下各批产品在MPS中将用现存清单来运行而其它的在截止序号与此序号以上的产
品将使用更改后的清单。当更改发生在物料清单的中层或较低层次时,需要在制造
作业中有严格的纪律以确保在成品中使用恰当的组件的组合。因为这种纪律难以得
到而且可能是昂贵的,所以最好在装配开始以前避免分派序号,或更好些,到生产
完成之后再分派序号。
工程更改把向使用该产品的客户提供正确的服务件的问题大大复杂化了。对于
大型、复杂的机器诸如机床、发电设备与船舶,应为每一件产品准备一宗包括图纸、
说明书与一份完整地反映该件产品实际构成情况的物料清单在内的档案材料。此档
案的拷贝给予客户,而制造商要保留一份或多份以备做服务工作或需要备件时使用。
对于较大量的产品诸如汽车、家用电器与电动工具,即使合理的工程更改次数
也会使备件问题难以管理。最好的办法是成块更改,即许多作业更改同时实施。除
了备件更好的控制以外,此法还有一些优点:
1、更准确的物料清单。
2、更稳定、更简单的物料计划。
3、更准确的成本信息。
4、较少的作业干扰。
5、更明白、更准确的文档建设。
工程更改的历史记录
在国防、航天、医药、原子能与食品加工行业的公司中,良好的配置控制是强
制性的;在其它行业中,它是健全的制造计划与控制的一种要求。除已经讨论过的
零件编号、清单构成与更改控制之外,还需有一内容广泛的历史文档。这有许多用
途,包括确定恰当的备件,识别问题的根源与原因,找出潜在的或实际有缺陷的产
品以及在法律行动中提供数据。
工程设计更改的典型历史记录包括下列:
1、组件或产品的零件号。
2、替代它的新零件号,生效日期与工程更改号(ECN)。
3、老零件号被替代,生效日期与ECN。
4、指示每一更改的主要理由的工程更改代码。
5、在此同一更改中包括的其它产品或组件。
维护这一历史数据的责任通常赋予设计工程。大的国防、航天与电子设备制造
商设置单独的组织群体叫做制造规格或类似的名称;他们的责任包括此历史文件及
其它基本文件的记录。
工程更改的历史数据可用多种方法存储:
1、纸文件现已过时。
2、由于数据量大,计算机文档仍是昂贵的,虽然其费用正在下降。清单处理
程序提供方便的连接以便追踪历史。存储整个清单是不必要的,太昂贵而且检索起
来太慢。用磁带比用磁盘要好。
3、缩微胶卷与缩微胶片价格低廉,使用灵活并便于检索。
这种文档除了主要用来记录工程更改之外还有许多应用。它们对客户、市场营
销、销售、专利、法律、质量、计划、会计与生产人员同对工程人员一样有用。如
同对制造计划与控制有必要的所有文件一样,只有准确的文件才有保存的价值。
原理25.物料清单中工程更改的控制对一家公司的成败犹如新设计一样重要。