konhon

忘掉過去,展望未來。找回自我,超越自我。
逃避不一定躲的过, 面对不一定最难过, 孤单不一定不快乐, 得到不一定能长久, 失去不一定不再拥有, 可能因为某个理由而伤心难过, 但我却能找个理由让自己快乐.

Google

BlogJava 首页 新随笔 联系 聚合 管理
  203 Posts :: 0 Stories :: 61 Comments :: 0 Trackbacks

#

将一个字符串转为二进制,再从二进制转为原字符串。

   把字符串(可含中文字符)转为二进制数的函数:ConvertStrToBin();把二进制数转换为字符串的函数:ConvertBinToStr()。
   以下两个函数亦可以对包含有中文字符的字符串进行处理,逆转时亦可正常转为中文。
Function ConvertStrToBin(Value : string):string;//把字符串转化为二进制数
var tempHex : string[2];
    i : integer;
begin
  Result := '';
  if trim(Value) = '' then Exit;
  tempHex := '';
  for i := 1 to Length(Value) do
  begin
    tempHex := IntToHex(Ord(Value[i]),2);//每个字符转成两位十六进制数
    Result := Result + BinToHexEachOther(tempHex,False);//十六进制转成二进制
  end;
end;

Function ConvertBinToStr(Value : string):string; //把二进制数据转化为字符串
Var tempHex : string;
    i, tempInt : integer;
begin
  Result := '';
  if trim(Value) = '' then Exit;
  tempHex := BinToHexEachOther(Value,true);//二进制转成十六进制
  i := 0;
  Repeat
    begin
      i := i + 1;
      tempInt := HexCharToInt(tempHex[i]);
      i := i + 1;
      tempInt := tempInt * 16 + HexCharToInt(tempHex[i]);
       //以上将两位十六进制数转变为一个十进制数
      Result := Result + chr(TempInt); //转成ASCII码
    end;
  Until i >= length(tempHex)
end;

上两个互逆的函数中要调用到的函数HexCharToInt()和BinToHexEachOther()如下:

function BinToHexEachOther(ValueA : string; Action : Boolean) : string;
  //把二进制串转换成十六进制串或相反
  var
    ValueArray1 : Array [0..15] of string[4];
    ValueArray2 : Array [0..15] of char;
    i : shortint;
begin
    //数组初始化
    ValueArray1[0] := '0000';  ValueArray1[1] := '0001';  ValueArray1[2] := '0010';
    ValueArray1[3] := '0011';  ValueArray1[4] := '0100';  ValueArray1[5] := '0101';
    ValueArray1[6] := '0110';  ValueArray1[7] := '0111';  ValueArray1[8] := '1000';
    ValueArray1[9] := '1001';  ValueArray1[10] := '1010';  ValueArray1[11] := '1011';
    ValueArray1[12] := '1100';  ValueArray1[13] := '1101';  ValueArray1[14] := '1110';
    ValueArray1[15] := '1111';
    for i := 0 to 15 do
      if i >= 10 then ValueArray2[i] := chr(65 + (i - 10))
      else ValueArray2[i] := inttostr(i)[1];

    Result := '';
    if Action then
    begin //二进制串转换成十六进制串
      if (Length(ValueA) MOD 4 <> 0) then
        ValueA := stringofchar('0',Length(ValueA) MOD 4) + ValueA;
      while (Length(ValueA) >= 4) do
      begin
        for i := 0 to 15 do
          if Copy(ValueA,1,4) = ValueArray1[i] then
            Result := Result + ValueArray2[i];
        ValueA := Copy(ValueA,5,Length(ValueA) - 4);
      end;
    end
    else begin //十六进制串转换成二进制串
      while (Length(ValueA) >= 1) do
      begin
        for i := 0 to 15 do
          if Copy(ValueA,1,1) = ValueArray2[i] then
            Result := Result + ValueArray1[i];
        ValueA := Copy(ValueA,2,Length(ValueA) - 1);
      end;
    end;
end;

function HexCharToInt(HexToken : char):Integer;
begin
Result:=0;
if (HexToken>#47) and (HexToken<#58) then       { chars 0....9 }
   Result:=Ord(HexToken)-48
else if (HexToken>#64) and (HexToken<#71) then  { chars A....F }
   Result:=Ord(HexToken)-65 + 10;
end;


十六进制字串转十进制又一法:
procedure TForm1.BitBtn1Click(Sender: TObject);
var myint : integer;
begin
  myint := StrToInt('$' + '3A'); // myint = 58
  showmessage(inttostr(myint));
end;
posted @ 2005-11-02 05:37 konhon 优华 阅读(22466) | 评论 (3)编辑 收藏


 

     引言

    本文将就静态数据中物料清单(Bill of Material,BOM)的作用,结合CAD(Computer Aided Design,计算机辅助设计)、CAPP(Computer Aided Process Planning,计算机辅助工艺编制)、PDM(Products Data Management,产品数据管理)、MRPⅡ(Manufacturing ResourcePlanning,物造资源计划)、ERP(Enterprise Resource Planning,企业资源计划)等系统作详细的描述。

    什么是BOM?

    采用计算机辅助企业生产管理,首先要使计算机能够读出企业所制造的产品构成和所有要涉及的物料,为了便于计算机识别,必须把用图示表达的产品结构转化成某种数据格式,这种以数据格式来描述产品结构的文件就是物料清单,即是BOM。它是定义产品结构的技术文件,因此,它又称为产品结构表或产品结构树。在某些工业领域,可能称为“配方”、“要素表”或其它名称。
    在MRPⅡ和ERP系统中,物料一词有着广泛的含义,它是所有产品,半成品,在制品,原材料,配套件,协作件,易耗品等等与生产有关的物料的统称。
    在通常的MRPⅡ和ERP系统中BOM是指由双亲件及子件所组成的关系树。BOM可以是自顶向下分解的形式或是以自底向上跟踪的形式提供信息。
    在MRPⅡ和ERP系统中中BOM是一种数据之间的组织关系,利用这些数据之间层次关系可以作为很多功能模块设计的基础,这些数据的某些表现形式是我们大家感到熟悉的汇总报表。

    BOM有什么作用?

    BOM是PDM/MRPⅡ/ERP信息化系统中最重要的基础数据,其组织格式设计和合理与否直接影响到系统的处理性能,因此,根据实际的使用环境,灵活地设计合理且有效的BOM是十分重要的。
    BOM不仅是MRPⅡ系统中重要的输入数据,而且是财务部门核算成本,制造部门组织生产等的重要依据,因此,BOM的影响面最大,对它的准确性要求也最高。正确地使用与维护BOM是管理系统运行期间十分重要的工作。
    此外,BOM还是CIMS/MIS/MRPⅡ/ERP与CAD,CAPP等子系统的重要接口,是系统集成的关键之处,因此,用计算机实现BOM管理时,应充分考虑它于其他子系统的信息交换问题。
    BOM信息在MRPⅡ/ERP系统中被用于MRP计算,成本计算,库存管理。BOM有各种形式,这些形式取决于它的用途,BOM的具体用途有:
    1、 是计算机识别物料的基础依据。
    2、是编制计划的依据。
    3、 是配套和领料的依据。
    4、根据它进行加工过程的跟踪。
    5、 是采购和外协的依据。
    6、根据它进行成本的计算。
    7、 可以作为报价参考。
    8、进行物料追溯。
    9、 使设计系列化,标准化,通用化。

    BOM有哪些形式?

    按照用途划分
    产品要经过工程设计、工艺制造设计、生产制造3个阶段,相应的在这3个过程中分别产生了名称十分相似但却内容差异很大的物料清单EBOM、PBOM、CBOM。这是三个主要的BOM概念。
    工程BOM——EBOM(Engineering BOM):
    产品工程设计管理中使用的数据结构,它通常精确地描述了产品的设计指标和零件与零件之间的设计关系。对应文件形式主要有产品明细表、图样目录、材料定额明细表、产品各种分类明细表等等。
    计划BOM——PBOM(Plan BOM):
    是工艺工程师根据工厂的加工水平和能力,对EBOM再设计出来的。它用于工艺设计和生产制造管理,使用它可以明确地了解零件与零件之间的制造关系,跟踪零件是如何制造出来的,在哪里制造、由谁制造、用什么制造等信息。同时,PBOM也是 MRPⅡ/ERP生产管理的关键管理数据结构之一。
    实际上BOM是一个广泛的概念,根据不同的用途,BOM有许多种类;设计图纸上的BOM,计划BOM,计算最终产品装配的制造BOM,计算成本的成本BOM,保养维修BOM等。根据在不同阶段应用侧重点不同,我们常常见到不同的BOM提法,常见的有:
    设计BOM——DBOM(Design BOM):
    设计部门的DBOM是产品的总体信息,对应常见文本格式表现形式包括产品明细表、图样目录、材料定额明细表等等。
    设计BOM信息来源一般是设计部门提供的成套设计图纸中标题栏和明细栏信息。有时候也涉及工艺部门编制的工艺卡片上部分信息。
    设计BOM一般在设计结束时汇总产生,如果存在大量借用关系的设计情况可以在设计阶段开始就基本将设计BOM汇总出来,然后根据新产生的零部件安排设计任务。
    对应电子视图往往是产品结构树的形式,树上每个节点关联各类属性或图形信息。主要在PDM软件中作为产品管理和图档管理的基础数据出现。


     
    制造BOM——MBOM(Manufacturing BOM):
    生产部门的MBOM是在EBOM的基础上,根据制造装配要求完善的,包括加工零部件JBOM和按工艺要求的毛胚、模具、卡具等PBOM。也可以称其为工艺BOM。对应常见文本格式表现形式包括工艺路线表、关键工序汇总表、重要件关键件明细表、自制件明细表、通用件明细表、通用专用工装明细表、设备明细表等等。
    制造BOM信息来源一般工艺部门编制工艺卡片上内容,但是要以设计BOM作为基础数据内容。
    对应电子视图对产品部件往往装配工艺BOM形式,对零件往往是具体加工工艺BOM形式,比较多的是机加工工艺BOM,或生产加工流转路线工艺BOM等,树上每个节点关联工装、设备、工时、加工简图等等工艺信息。对企业利用价值比较大的是装配工艺BOM,主要在ERP软件中作为生产计划的基础数据出现。
     

    
    客户BOM——CBOM(Customer BOM):
    客户BOM实际上有两个含义,一个指从所有产品机构中筛选出客户订购的产品目录。一个指用户订购的具体规格产品的明细表。这个主要是对有些按照客户管理和组织产品图纸的企业非常实用的种表现形式。这种情况在PDM系统中比较常见,到ERP系统中由于还考虑到不同的客户订购产品对生产计划的影响,情况更加复杂一些,可能还扩展到计划BOM的范畴。
    销售BOM——SBOM(SALE BOM):
    销售BOM是按用户要求配置的产品结构部分。对应常见文本格式表现形式包括基本件明细表、通用件明细表、专用件明细表、选装件明细表、替换件明细表、特殊要求更改通知单等等。在某些制造行业,对销售BOM提出了更高的要求,要求每个BOM可以跟踪每批订单在全生命周期内的物料信息,而且每个客户订单都有一个唯一的或者是根据订单产品种类多少确定的几个销售BOM。这个时候往往将销售BOM称为客户BOM。
    销售BOM信息来源一般是一个系列产品各规格不同类型零部件明细信息的汇总。
    对应电子视图往往是产品配置树的形式,树上每个节点关联各类属性或图形信息。主要在PDM软件中作为产品配置管理的基础数据出现。


    维修BOM——WBOM:
    维修服务部门的是按维修要求产生的,对应文本格式包括消耗件清单、备用件清单、易损易耗件清单等等。
    维修BOM信息来源一般从设计BOM对应记录属性中筛选获得消耗件、备用件、易损易耗件明细。
    一般在PDM软件里完成汇总,同样可以在ERP软件里作为基础数据运用。
    采购BOM——CBOM:
    是根据生产要求外购的原材料、标准件和成套部件等产生的,对应文本格式主要包括外购件明细表、外协件明细表、自制件明细表和材料明细汇总表。
    采购BOM信息来源一般来源于设计图纸和工艺卡片上信息汇总。由采购部门或生产准备部门根据其安排采购计划和生产计划。
    PDM系统一般都可以根据图纸和工艺信息汇总出相应采购BOM信息,但是如果要针对产品批量获得动态的采购BOM信息就必须在ERP系统中完成。例如100台批量的采购BOM和10000台批量的采购BOM可能在外购和外协件上有很大变化。批量小时可能有的零件外购成本比较低,但批量大时就可以自制完成。
    成本BOM——CBOM(Costing Bill Of Material):
    是由MRPⅡ系统产生出来的。当企业定义了零件的标准成本、建议成本、现行成本的管理标准后,系统通过对PBOM和加工中心的累加自动地生成CBOM。它用于制造成本控制和成本差异分析。
    其中,销售SBOM=加工JBOM+采购CBOM,
     生产MBOM=加工JBOM+PBOM+采购CBOM,
    其中集成关系最密切的是由PDM 控制的EBOM和MRPⅡ中的MBOM

    按照设计软件划分
    CAD中的BOM
    设计部门既是BOM的设计者,又是BOM的使用者。单一零件诸如图号、物料名称(材料类型如45号钢)、重量、体积、设计修改审核号、物料生效日期等各种信息;组件或部件还包括外协件、外购件、通用件、标准件、借用件、各单一零件装配数量、部件图号等信息;总图(由零件、组件部件等装配而成)还包括包装、装件清单、技术文件、产品说明书、保修单等等信息,这些都是BOM信息的组成部分。在设计部门(CAD)中,通常所说的BOM实际上是零件明细表,是一种技术文件,偏重于产品信息汇总。 
    设计部门按某种类型产品的图号来组织BOM信息。设计部门在接到定单后按照定单的要求,一般情况下有三种设计思路——自顶向下形式设计、自底向上形式设计、由中间向两头形式设计。无论那一种设计方式,在图号的组织上都是一致的,都是按照图号来合并产品信息,形成该产品的总明细表、标准件汇总表、外购件汇总表、外协件汇总表等,在需要的时候还能生成产品图纸目录(满足没有运行ERP系统的客户或外协工厂)。有时一个相同的零件由于属于不同的产品,也就有了不同的图号,因此不一定考虑企业物料编码的唯一性。需要说明的是,在形成物料清单后,每一种物料都有唯一的编码,即物料号。不要将零件明细表(CAD通称为BOM表)与ERP中的BOM信息混淆。设计部门中的零件明细信息表转化为ERP系统中的BOM信息,需要设计部门、工艺部门和生产部门的共同协作,以及PDM(产品数据管理)设计产品关系特性的管理来解决零件明细清单与BOM表之间的异同信息,特别是图号与编码号不一致方面(PDM产品结构模块通过其规则库、变量和零件表等功能来完成)。 
    就使用而言,无论何时,当产品结构发生变化,或者客户更改技术文件、涉及质量问题或对某个零件进行重新改进设计时,为确保物料清单的准确性,都必须以设计变更通知为依据。在设计变更通知文件的指导下,设计部门通过BOM信息表中获取所有零件的信息及其相互间的结构信息。只有得到这些信息,才能对其进行定义、描述或修改,从而使生产能正常地运行下去(特别是客户的紧急更改通知)。根据设计变更通知编号,在PDM支持下,可以方便地检索变更信息,指导生产、装运和售后服务等生产活动。 
    在实际生产运行过程中,设计变更是导致数据不准确的重要因素,因此一定要有一套行之有效的设计变更通知管理方法来管理设计变更通知。由于要涉及销售、采购、生产、工程技术、财务等部门,因此一般由企业的高级主管直接管理设计变更通知。这一过程须经过设计变更通知确认、分析、审批、文件和监督五个步骤。
    设计部门(CAD)产生的部分数据经PDM处理后传输给ERP系统。
    关于设计BOM需要补充这么几个概念:
    产品结构树上零部件的构成元素可以分为标准零部件、结构零部件以及设计零部件三类。
    设计零部件的产生方式可以从不同的3D CAD或是2D CAD明细表中所产生,是通过本厂或协作厂设计产生的。
    结构零部件可以是照片或是一个简单的草图。对应产品结构树上节点名称常常是产品外形图、产品尺寸链图、产品装配关系示意图、包装零部件等等。在很多企业产品结构树上必须反映这些信息,但是从总装图上无法获得这些信息,例如产品外形图和产品装配图如果都挂在产品节点上也可以接受,但是用户习惯往往是认为产品外形图和产品装配图都是同级的;另外象包装子树就需要手工建立包装子节点后展开,无法通过BOM展开直接从明细表关联。
    通用零部件包括标准零部件库和行业、企业通用零部件。并且可以修改与删除和合并,加入通用零部件库要仔细的效验过程。通用零部件可以从借用件中演变而来。
    相同的产品其结构零部件,有时甚至设计零部件或是标准零部件可以有多种不同的选择。也因此在制造上与销售报价上同样的产品对于不同的客户也可以有不同的产品信息结构组合(例如价格、批量、交货期)。但这些情况一般在ERP系统中进行维护,PDM系统只要保证基础数据的完整和一致性。

    CAPP中的BOM 
    产品经过设计部门设计完毕后,部分电子数据转交工艺部门制订工艺路线(CAPP),成为说明零部件加工或装配过程的文件。它不是技术文件,而是计划文件或指导生产文件。CAPP一般由工艺过程卡、加工工序卡、锻铸热处理卡、检测卡、工装材料工时等汇总信息组成;在一张加工工序卡中由工序(加工步骤)、工时定额(占用工作中心的负荷时间)、加工设备、检测设备、加工工具、工装夹具、材料等组成。 
    在编制工艺计划时,除涉及设计的每一个细微之处外,同时还要涉及BOM中的主工作中心物料、材料物料、加工夹具物料、工装物料及辅料物料等。维护这些静态数据的准确性是保证生产按计划进行的前提。主工作中心的设备维护、备件管理、维修记录,材料采购与库存变化情况,加工夹具、工装设备、辅料等变化都要实时反映到工艺计划编制中去。在工艺计划编制过程中,要能随时(面向对象)地浏览BOM信息,输入BOM信息,报警BOM信息(工艺编制人员发现错误报警),实时反映更新的BOM信息等等。 
    在没有计算机系统支持的情况下,对工艺编制人员就要提出很高的要求:不仅要求其熟知零件加工过程和加工设备的现行状况,还要知道技术参数、库存情况、加工夹具、工装设备等情况。一般情况下,企业培养一个类似人员需要20年时间。现在,工艺人员在计算机系统的支持下,可以方便地查询按BOM结构设计的典型工艺数据库、获取设计信息、查询机床设备等技术参数等,也能很容易地编制CAPP,保证工艺文档的完整性、一致性、正确性和执行可行性。 
    工艺部门(CAPP)产生的数据经PDM处理后传输给ERP系统。

    PDM中的BOM
    PDM实际上是连接CAD/CAPP与ERP的核心模块,它管理与产品相关的“信息(ERP)”和“过程(CAD/CAPP)”技术,起着由“过程(CAD/CAPP)”技术向“信息(ERP)”转化,“信息(ERP)”向“过程(CAD/CAPP)”技术转化的重要中间过程,形成了双向的无缝传输数据,避免了大量重合数据的产生。下图是表明它们结构关系图。 
    由于不同部门有不同形式的BOM信息,企业经常要花费大量的人力和时间才能完成这些报表,而且还要不断维护BOM的一致性,避免产生严重的MRP运算错误。四川某电器股份有限公司原来采用的手工录入方式,录入从CAD部门中统计的BOM信息,一个熟练的录入人员录入一个产品的BOM数据需要一周左右的时间,还不包括录入错误导致的返工时间和造成了恶劣影响;现在通过PDM,为ERP系统自动传输BOM数据,只需要几分钟时间。

结构关系图

     
    在产品整个生命周期,PDM以数据仓库(所有系统可共用一个数据库)为底层支持,以材料清单(BOM)为其组织核心,把定义最终产品的所有工程数据和文档联系起来,实现产品数据的组织和管理,诸如产品配制管理、图文档管理、工作流程管理、设计变更管理、权限(角色)管理、版本管理、项目管理、维修记录以及日志管理等等。
    PDM系统根据各自的功能特点与可解决工程问题的不同,分为三大类,即:以文档、数据管理为重点的;以设计过程及产品结构管理为主面向CAD的;面向硬、软件异构系统集成平台的。其中第二类与BOM信息最为密切,经过转化处理,达到ERP所需要的BOM信息。今天,大多数流行的PDM系统都能与ERP系统集成,有的ERP还有自己的PDM产品,有效促进了ERP系统中生产、设计、采购和销售等各个部门的沟通与交流。

    ERP中的BOM
    除了前面所描述的系统与BOM有关外,生产部门、产品成本核算部门、物料需求计划(MRP)系统、销售部门也有很大关系,生产部门使用BOM来决定零件或最终产品的制造方法,决定领取的物料清单;产品成本核算部门利用BOM中每个自制件或外购件的当前成本来确定最终产品的成本和对产品成本维护,有利于公司业务的报价与成本分析;物料需求计划(MRP)系统中BOM是MRP的主要输入信息之一,它利用BOM决定主生产计划项目时,动态确定物料净需求量,知道需要哪些自制件和外购件,需要多少,何时需要,标准用料与实际用料的差异分析;销售部门通过Internet访问数据源,可以方便地报价,提供准确的零件设计信息与追踪制造流程等自助服务,客户还可以自己下定单购买产品备件。 
    通过BOM信息,还可以方便地考核各部门的业绩,可以方便地抽取信息进行统计与分析;如果有了新的BOM资料需求,还可以利用原来的BOM资料构造新的BOM资料,简化近似BOM资料的编制工作;如果对BOM信息深入研究,还可以通过不同的产品BOM资料来研究其它产品BOM资料的错误检查,以免计算机输入或认为修改带来的错误,将错误率降到最低。 
    BOM是任何管理系统中的基础,它几乎与企业中的所有职能部门都有关系,如果没有BOM,就无法制造出同样的产品,直接影响到系统的处理性能和使用效果。为此,要想提高生产管理系统的效率,BOM准正确与否是十分重要的。尽管数据已经非常准确,但也不要忽视人的重要性,对于特殊变化,利用手工在系统中对BOM信息的内容进行增加、删除和修改等编辑工作,可以顺利完成任务。
    通过建立企业“信息(ERP)”管理和“过程(CAD/CAPP)”技术两条主线,以BOM为信息纽带,以PDM为核心,再结合CAD/CAPP和ERP系统,辅以Internet和EDI系统,就可以真正达到企业信息化建设的目标


    产品结构树有哪些形式? 

    为了便于计算机管理和处理的方便,各种BOM清单必须具有某种合理的组织形式,这种BOM的图形化显示我们往往设计成产品结构树形式,而且为了便于在不同的场合下使用产品结构树,产品结构树还应有多种组织形式和格式。
    产品结构的数据输入计算机后,就可对其进行查询,并能根据各用户的不同的格式显示出来。各种信息系统系统的目标就是要使输入的数据可以生成各种不同格式的产品结构树,以满足企业中各种用户的需求。产品结构树一般以下常用的输出格式。
    图一为A的产品结构。0层为产品A;A是由B,10。C所组成,B,10,C组成了第一层;B又是由20,D 所组成,C 是由30,40,50所组成,20,D,30,40,50组成了第2层;D又是由10,30所组成,10,30组成了第三层。图中,字母表示装配,数字表示零件,括号中数字为装配所需数量。 


    
          图一 产品A结构


    对A这样的产品,其BOM的输出格式有以下各种。

    常见的BOM形式

    单级展开BOM 
    单级展开格式显示某一装配件所使用的下级零部件。采用多个单级展开就能完整地表示产品的多级结构。对应很多企业(特别是产品零部件数量繁多的企业)的分组明细表即是单级BOM的具体形式。下表为所给的四级产品结构就得到四个单级展开的清单。 
    


    多级展开BOM
     多级展开BOM显示某一装配件所使用的全部下级零部件。采用一个多级展开就能完整地表示产品的多级结构。对应很多企业(特别是产品零部件数量比较少的企业)的产品明细表即是多级BOM的具体形式。下表为所给的四级产品结构对应多级展开BOM表。
     



    缩行展开
    缩行展开格式是在每一上层物料下以缩行的形式列出它们的下属物料。同一层次的所有零件号都显示在同一列上。缩行展开的格式是以产品制造的方式来表示产品的。
 


    汇总展开
 
    汇总展开的格式列出了组成最终产品的所有物料的总数量。它反映的是一个最终产品所需的各种零件的总数。而不是每个上层物料所需的零件数。如某一零件用于多个装配件,汇总展开的清单就有助于确定合适的采购数量。这种格式并不表示产品生产的方式,但却有利于产品成本核算,采购和其他有关的活动。



    单层跟踪
    单层跟踪格式显示直接使用某物料的上层物料。这是一种物料被用在哪里的清单,它指出的是直接使用某物料的各上层物料。


    汇总跟踪
    汇总跟踪的格式显示所有含有各零件的高层次物料以及每一物料所用零件的数量。这是一张扩展了的”用在哪里”的清单,它列出了所有含有零件的高层次物料。”所需数量”表示装配成该层次的物料所需的零件总数。

    缩行跟踪
   
缩行跟踪的格式指出了某零件在所有高层物料中的使用情况。它可查找直接或间接地使用某零件的所有高层物料,采用这种格式很有价值。现以下表表示:



    矩阵式的BOM 
    矩阵式的BOM是对具有大量通用零件的产品系列进行数据合并后得到的一种BOM。这种形式的BOM可用来识别和组合一个产品系列中的通用零件。在下面的输出格式中,左面列出的是各种通用零部件,右面的上部列出了各个最终产品,下面的数字表示装配一个最终产品所需该零件的数量。”#”表示该产品不用此零件。对于有许多通用零件的产品,这种形式的BOM很有用处。但矩阵式BOM没有规定产品制造的方式,它没有指出零件之间的装配层次,因此,不能用于指导多层结构产品的制造过程。 
    



    加减BOM
    这种BOM有时又被为”比较式”或”异同式”BOM。它以标准产品为基准,并规定还可以增加哪些零件或去掉哪些零件。一个特定的产品就被描述为标准产品加上或减去某些零件。下表说明专用产品A/1是在标准产品A上增加零件F和G,同时增加部件C数量到2个,并去掉零件1-1-1制成。这种方法能有效地描述不同产品之间的差异,但不能用于市场预测,也不太适用于MRP。
 



    模块化BOM
    在实际应用中,由于产品规格是多变的,零件表按产品结构特点来划分的话,可以分为以下几种:
    产品单一,规格基本没有变化。
    产品规格多样,可以选择装配
    产品系列化,但同一系列中性能变化。
    不同产品系列,多种选择装配。
    模块化BOM用于由许多通用零件制成的并有多种组合的复杂产品。例如在汽车制造业,装配一辆汽车可选择不同的发动机,传动机构,车身,部件,装潢以及其它东西,不同的选择可组合成不同的最终产品。模块化方法既为顾客提供了较广的选择范围,又使零件的库存下降。在汽车及农业设备等工业上,这种方法得到了广泛的应用。当一条生产线上有许多可选特征时,就能得到许多种组合,这时就不可能在主生产计划中对它们分别预测。如果按照MRP的需要在计算机内为每一种最终产品存储一个独立的BOM。则文件记录的存储和维护费用就很大。解决这一问题的办法就是采用模块化BOM。模块化BOM按照装配最终产品的要求来组建模块。模块化的过程就是将产品分解成低层次的模块。按照这些模块进行预测就比直接对最终产品进行预测要准确。模块化可以得到两个不同目的:
    可以摆脱组合可选产品特征的麻烦;
    把通用零件与专用零件区分开来。

    BOM的一体化

    在许多企业中,重建传统的BOM能大大简化主生产计划。如果订单的交货期小于产品的生产提前期,在主生产计划中就要对需求作出预测。多数企业采用两种方式组织生产,一种是备货生产,它们根据预测安排计划;另一种企业在短期内根据用户订单组织生产,其余时间根据预测安排计划。因此产品必须定义成在生产计划中可以预测的形式。显而易见,在订货生产的环境中,最终产品不是最好的预测对象。需要用一些特殊的BOM把主生产计划与某些相关零件联系起来,这些零件是在收到顾客订单之前必须得到的。用于计划的BOM执行了这一功能,它减少了预测和主生产计划中的项目数。
    计划BOM是根据MRP的需要,把0层的产品与BOM脱离关系,而把1层或更低层的组件提高到最终项目的地位。这样就建立起一个新的模块化的用于计划的BOM,这种BOM能适应预测,主生产计划和物料需求计划的需要。
    制造的BOM列举出制造最终产品所必需的可选特征。它仅仅是为了满足客户选定的产品或仓库订单而把独立的模块汇总起来的BOM,这种BOM一般不直接隶属于MRP系统,而是通过总装配进度计划来定义所需要的物料,并与MRP系统结合,只要这些物料使用MRP系统计划与提供的零件。

    BOM的使用

    在任何制造环境中,不同的部门和系统都为不同的目的使用BOM(下文的BOM在含义上属于不同的种类,统一以BOM表达),每个部门和系统都从BOM中获取特定的数据。主要的BOM用户有:
    设计部门
    设计部门既是BOM的设计者,又是BOM的使用者。就使用而言,无论何时,当产品结构发生变化,或对某个零件进行重新设计,该部门都要从BOM中获取所有零件的信息及其相互间的结构信息,只有得到这些信息,才能对其进行定义,描述或修改。
    工艺部门
    工艺部门根据BOM信息建立各零件的制造工艺和装配件的装配工艺。并确定加工制造过程中应使用的工装,模具等。
    生产部门
    生产部门使用BOM来决定零件或最终产品的制造方法,决定领取的物料清单。
    产品成本核算部门
    该部门利用BOM中每个自制件或外购件的当前成本来确定最终产品的成本。
    物料需求计划(MRP)系统
    BOM是MRP的主要输入信息之一,它利用BOM决定主生产计划项目时,需要哪些自制件和外购件,需要多少,何时需要。

    ERP中BOM的构造问题

    前面已经提到,BOM是系统中最重要的基础数据库,它几乎与企业中的所有职能部门都有关系,ERP系统中BOM构造的好坏,直接影响到系统的处理性能和使用效果。因此,根据实际环境,,灵活地构造BOM是十分关键的。就一般情况而言,构造BOM应注意以下方面。
    1、在BOM中,每一个项目(零件)必须有一个唯一的编码。对于同一个项目,不管它出现在哪些产品中,都必须具有相同的编码。对于相似的项目,不管它们的差别有多么小,也必须使用不同的编码。
    2、为了管理上的方便,有时可以将同一零件的不同状态视为几个不同的项目,构造在产品的BOM中。
    3、BOM中的零件,部件的层次关系一定要反映实际装配过程,在实际装配中,有时不一定把某些零件装配成某个有名称的组件,或者由于工艺上的考虑需要将某些零件归在一起加工(例如箱子与箱盖)。形成临时组件,但这些组件在产品的零件明细表和装配图上并没有反映出来,但必须在计划管理中反映出来,这就需要在BOM中设置一种物理上并不存在的项目,通常称为”虚单”或”虚拟件”,其目的是简化MRP的编程过程和减少零件之间的影响。
    4、根据生产实际情况,有时为了强化某些工装,模具的准备工作,还可以将这些工具构造在BOM中。这样就可以将一些重要的生产准备工作纳入计划中。有时为了控制某个重要的零件在加工过程中的某些重要环节,比如,进行质量检测等,还可将同一个零件的不同加工状态视为不同的零件,构造在BOM中。
    5、为了满足不同部门获取零件的不同信息,可以灵活地设计BOM中每个项目的属性。例如,计划方面的,成本方面,库存方面,订单方面。

    设计BOM向制造BOM转换时常见的问题

    1、设计BOM中的零部件父子关系与制造BOM中的父子关系可能不同,例如汽车行业一个代号为5401000总成在设计BOM中归属于5010000,但在制造BOM结构中归于焊装领料模块,与5010000属同级。也就是说设计BOM中的父子关系可能变成制造BOM中的兄弟关系。
    2、设计BOM中的零部件图号在制造BOM中有一部分需分为多个代码(例如代号+车间码),用于不同车间的领料。也就是说设计BOM里的一个零部件随着生产路线变化可能在制造BOM中存在几个对应的代码,而且代码之间根据生产路线流转顺序存在父子关系,一般是最后完成车间对应代码是上级车间对应代码的父级节点。
    3、设计BOM上部分零部件可能代码不变,但是由于在实际装配或加工过程中需要分为几部分归属于不同部件(这些部件可能是第二种情况产生的)分别用于不同车间领料,对应需要分拆成几个子节点(每个节点关联不同的领料数量)对应到不同的父节点下。
    4、由于借用现象比较普遍,对于整体部件(局部不同类)的借用,出于制造BOM更改处理的需要,在制造BOM中是以增加件、减少件的型式建立结构的,零件数量存在负数情况。设计BOM中不存在负数的情况。
    5、设计BOM中的零部件图号在往制造BOM转化时部分零部件需增加车间代码(前缀),用于表示加工车间(出入库的需要)。
    6、设计BOM中的零部件往往只有产品代号,在制造BOM中往往需要转化为物料代号,存在着产品编码向物料编码转换的问题。而且很可能产品编码和物料编码或者其它行业编码多种并存。
    7、部分物料在设计BOM上多个不同的结构中存在,但在制造BOM中,可能来源于同一加工车间,所以有存在物料合并的情况。

    设计BOM向制造BOM转换方案

    物料编码的转换:
    把图号(在物料号中)作为两个BOM系统之间连接的桥梁。即当PDM的产品代号与MRP中的物料编码中图号相同时,认为它们是同一个物料。
    PDM从MRP中提取信息时,以图号作为PDM中的标识(即代号),如果该图号在PDM中已存在,则认为该产品在PDM中已存在。如果两者其它属性信息有差异,可以提交给用户来决定使用哪一个系统中的数据。
    在PDM中添加的产品,可以添加到物料信息中,即根据MRP中的编码规则来生成它的物料号。如果是在设计项目流程中出来的产品,在项目完成时添加到物料信息中。
    标志可以保存数据转换过程程中信息,同时也可以加快系统查询转换产品速度,可以在物料信息表和产品属性表中添加一个字段,用来标识该产品转换的状态、图号是否存在等信息。下次转换时可根据该字段判断是否需要处理。该标志可做如下功用:
    标志的含义:
    PDM中:该产品来自MRP
     该产品来自MRP,在PDM中其结构或属性信息发生了改变。
     产品已转入MRP,但在PDM中已发生改变。
     产品在PDM中生成,未转到MRP中。(默认)
     产品在PDM中生成,已转到MRP中。
    MRP中:该产品来自PDM
     产品在MRP中生成,已转到PDM中。
     产品在MRP中生成,未转到PDM中。(默认)
     产品已转到PDM中,但在MRP中发生了改变。
     从PDM数据转化到MRP物料数据:这时,在MRP中寻找与PDM中代号相同的图号,如果存在,即认为该产品在MRP中已存在,并分别在两个系统中做标志。否则,认为PDM中的产品在MRP中是新产品,这时按照MRP的命名规范在MRP中添加相应的物料号、名称、重量、图号、规格等信息,并标志其从PDM中而来。
    产品(物料)属性和结构信息发生改变时,需要改变相应标志位,以在转换时正确处理。
    从MRP物料数据转换PDM数据:这时与上述步骤相反,即MRP中的物料图号如果在PDM 中存在这样的代号,则认为其已经存在。否则,把图号作为PDM中的代号插入到PDM中去。如果该物料没有图号,可以把该物料号作为PDM中的代号插入,并置标志标识其从MRP中而来。
    
    MRP图号与PDM代号相同但其它属性不同的处理:有两个办法:
    指定其中一个系统的数据为正确的,转换时可以覆盖另外一个系统的数据。由于PDM中的数据很多都是从图纸里面提取的,因此我们认为应该以PDM的数据为标准。
    发现这种情况时,给出具体的提示信息,由用户选择是否覆盖,从而把决定权交给使用者。
    以上两种方法可以做成选项方式,以方便使用。
    
    产品结构的转换

    前已叙及,两个系统的产品结构是不一致的。产品结构的转换应该是在上述转换过程中同步进行的。当转换一个产品或物料时,必须首先递归提取其所有的子产品或物料信息,根据其标志判断其是否已经被转换过,如果没有转换过的话,按上面的方法进行处理。否则,可以略过。但必须按相应的结构信息转换结构。具体的算法这里不作考究。
    制造BOM上虚拟件或工艺合件以及加工辅料信息输入一般根据装配工艺卡片上可以汇总出在整个工艺过程中系统利用到虚拟件和辅料信息,PDM可以提供操作将这些虚拟件和辅料在产品结构树转换成MRP系统里的制造树之前先在PDM系统里建立完整的制造树。PDM可以提供建立两类和产品节点不同的节点,我们可以称其为虚节点和材料节点功能,这些节点信息可以按照汇总出的装配工艺关系按照一定的操作在PDM系统内先建立完整的制造BOM,然后将这些制造BOM树导出到MRP系统中,同时进行编码转换。但虚节点信息和辅料信息在PDM系统中汇总时不进入产品明细表和产品图纸明细栏中。

    工艺路线和工艺信息
    在MRP中,工艺路线信息和工艺信息与某一种物料是有对应关系的,它给出了一个物料在PDM中也可以得到CAPP或BOM中的工艺信息,该信息可以从PDM向MRP数据转换时一并进行。
    将在BOM系统里汇总出MRPⅡ系统需要的数据,通过BOM软件的操作菜单将数据以指定格式(EXCEL文件、DBF、SQLSERVER数据表、ORACLE数据表都可以支持)输出到指定位置。由MRPⅡ系统将数据读取到自己的数据库中

    BOM的维护

    BOM是任何管理系统中基础中的基础,如果没有BOM,就无法制造出同样的产品,为此要想提高生产管理系统的效率,BOM的正确与否是十分重要的。

    不正确BOM造成影响
    一些项目为BOM所遗漏,造成零件短缺。
    BOM中列入了一些不必要的项目,导致零件过多储备。
    由于缺件的数量过多,导致制造的低效率。
    订单不能按期交货。
    质量低下。
    计划缺乏可信性。
    不正确的产品成本。
    废弃的库存。

    BOM中发生错误的环节
    工程部门产生BOM时
    为BOM准备数据时
    BOM数据录入时

    正确维护BOM的方法
    指定专人负责维护BOM
    经常监测BOM,检查项目数量及其生效日期
    对BOM数据改变进行分类
    危机性改变——立即完成。如,产品不能实现其功能,或不利于安全时。
    紧急性改变——迅速完成。如,工程部门设置一个合理日期来完成改变。
    常规改变——从经济实用角度要求变化时再完成。
    临时改变――临时更改现场数据,不变动BOM数据。
    实施软件改变——制作好数据导入转换规划和编码重新组织规划,集中力量一次性批量导入。以完成主导系列主要产品数据维护。

posted @ 2005-10-23 22:14 konhon 优华 阅读(1769) | 评论 (0)编辑 收藏

 


BOM的意义与种类

  料表又称为BOM(BillOfMaterial),是制造业管理的重点之一(属于化工制药饮料等行业的配方表其实与这个主题有关系,但是在本文中我们将集中注意力于一般成型工业中的料表,以免主题发散而无法聚焦),简单的定义就是“记载产品组成所需使用材料的表格”。以一个新产品的诞生来看:首先是创意与可行性研究的初期过程,接下来的过程就是初步的工程技术分析与原型产品的设计,等到原型产品比较稳定后,经过自制或外购分析(MakeorBuyAnalysisandDecision)后就会产生第一版的工程料表(EBOM,EngineeringBOM)。到正式量产之前,第一版的生产料表(PBOM,ProductionBOM)必须要先完成,以便企业内的相关部门有所遵循。在此之后,就进入了正常的例行维护阶段。
现将一般制造型企业内存在的BOM说明如下:

中文名称 英文名称 记载内容 主要用途 主要使用部门
工程料表 Engineering BOM 新产品的用料结构 是研究开发单位与其他单位间针对新产品初始定义的沟通媒介及日后设变的处理平台 研究开发
生产技术
生产料表 Production BOM 量产产品的用料结构(企业内最多人使用) 用于进行生产计划,采购计划的拟定,也是搭载选配及替代料表、成本料表的平台 生管物管
采购外协
营销财务
计划料表 Planning BOM 产品族群比例关系(如某款式汽车手排档销量占30%,自排档销量占50%,手自排档销量占20%)

用于进行中长期的原料采购计划及生产产能负荷计划

生管物管采
购外协
营销
成本料表 Cost BOM 产品的标准成本组成结构 用于查询产品标准成本之构成状况,通常使用于以标准成本立帐的企业 财务
选配料表 Configuration BOM 产品的选配件结构 用于录入客户订单时让用户可以选择产品的选配件 营销
生管物管
替代料表 Substitute BOM 产品的替代用料结构 用于进行物料计划时或实际进行生产时,针对本身数量不足,但替代零件足够的状况,以替代件替换原零件,以降低库存或避免缺料
生管物管
采购外协
保税料表 Tax-Bound BOM 产品的保税料件结构

用于进行申请海关保税合同时能自动展开并计算应申请的保税料件种类及数量

生管物管
财务采购

常见的BOM信息化管理问题及系统应提供的功能

  BOM的管理是企业管理范畴中比较复杂的,其中又以设计变更为其首,为简化本篇的内容,有关设计变更的部份将另辟专文说明,在此说明设计变更以外的:

  1.这么多种BOM,到底该分还是该合?
  既然有这么多种BOM,就产生了这样一个问题:该合还是该分。如果全部分开,系统设计的复杂度较低,但是,却造成用户的负担,不但信息维护的工作量大增,因为数据四处散布,错误发生的机会也大增;另一方面,如果全部合一,虽然乍看之下信息维护较为单纯,但是,因为数据型态的差异性将造成系统设计过于复杂,用户在使用时也不见得觉得方便,因此,分合之间的拿捏要相当有技巧,以兼顾用户使用的方便和系统设计的复杂度等。
  一般常见的设计是将工程料表、保税料表及计划料表独立,而将生产料表、成本料表、选配料表及替代料表合一,其中,工程料表独立的原因是它是属于研究开发单位使用的功能。虽然BOM是所有BOM的源头,但是其他部门却很少真的使用它;另一方面,不是所有的企业都是保税型态的,因此,将保税料表独立也是合理的;最后,有关计划料表的部分,虽然它也是为了生物管的目的而存在,但一般行业为了计划的目的其实使用生产料表就已经足够,因此让它单独存在也未尝不可。
  另一方面,生产料表、选配料表及替代料表等三种料表的目的都是要解决生物管方面的问题,将他们合在一起方便集中管理而且一目了然。最后,成本料表是否单独存在是个见仁见智的问题,但是大多数的人选择将它与生产料表等合并以简化数据。

  2.BOM是否应与PDM、CAD等系统整合集成?
搞软件的人都知道只要用户能够将需求表达清楚,没有办不到的事情,BOM与PDM、CAD等系统整合集成也不例外,只要ERP及PDM(或CAD)双方针对用户的需求,考虑数据的格式(必要时再借力于一些数据撷取工具),两者间的整合集成是轻而易举的。
  但是,在绝大多数的案例里我们见到的是“各行其是”而非整合集成,最主要原因就是设计单位与企业内其他单位看事情的角度不同及需要的信息不同。以搞机械的行业为例,管设计的重视的是技术及功能问题,产品在他眼中被拆为不同的机构(Mechanism),有的负责传动,有的负责煞车,有的负责悬吊,有的负责产生动力;但是负责生物管及采购外包的,却是从管理的角度看事情,他们关心的是成品、半成品、自制件、外包件及采购件等。
  为了解决这种认知上的差距,许多企业都有“生产技术”方面的人员负责将设计人员眼中的产品料表“翻译”为生物管及采购外包人员看得懂的产品料表;另一方面,由于PDM、CAD的系统众多,版本也不断更新,要发展出放诸四海皆准的接口是有困难的,但为了某特定客户的明确需求进行客制化相对的是比较容易的。最后,越来越多的制造业用户希望在运行ERP的过程中能够方便地查询到产品的设计图以进行有关技术面的判断,这种需求相对的难度也较低。

  3.选配料表管理存在的问题
  对于选配件管理而言,最大的难题就是防错,因为所谓选配件必定是存在限制的,如:某款汽车有三种发动机及两种变速箱可供选择,但是其中有一种发动机只能与一种变速箱搭配;另外一个例子如:某款电脑共有3.5寸软盘、5.25寸软盘、CDR、DVD、CDR/W、100MBZIP、150MBZIP等七种选择配备,但是不管怎么选,最多只能选四种,因为电脑上只有四个扩充槽。选配防错的例子非常多,而且在不同产品上面的规则也完全不同,有一些软件号称可以解决这个问题,经过了解后发觉这些软件为了达到防错的目的不但设计太过复杂,而且最后证明也无法涵盖所有的状况。更令人啼笑皆非的是没有任何一个用户使用这种功能,因为实在是太复杂了。

  4.替代料表管理存在的问题
  替代用料在许多电子及机械行业是种普遍的现象,举个最简单的例子来说,1.5″的螺丝通常可以取代1.2″的螺丝,但是,这种替代关系却不一定适用于所有状况,有时候使用较长螺丝时反而造成短路或不当干涉等状况,因此,在料表中表达零件的装配或插件位置可以让使用者清楚了解替代料件的限制,以免犯错造成产品的质量问题。

结语

  制造型企业与买卖流通型企业间最大的差距就是制造行为,而制造管理本身具有高度的复杂性。BOM是所有制造管理的基础信息,与企业绝大多数的部门都息息相关,“BOM管理”这个牵涉面广泛的主题,长久以来是让许多企业头疼的问题。除了在技术方面有复杂的问题要处理外,在管理面更是个沉重的负担,过去以手工作业方式处理BOM管理时经常存在“料表更新不及时”,“各方数据不一致”的现象,甚至经常发生错误而导致生产秩序大乱,错失市场良机等情况,但是,现在已经有设计优良且经过大量用户验证的易飞ERP软件可以协助企业进行这方面的管理了。

posted @ 2005-10-23 22:12 konhon 优华 阅读(446) | 评论 (0)编辑 收藏

目前不管是国内的ERP软件,还是国外的ERP软件,发展得都比较成熟。它们对于企业业务流程的大致流程都能满足,要想使自身的ERP软件在市场上具有独特的市场份额,就看软件是否能解决客户的个性化的需求。但对于ERP软件部分重要的基础功能设计将会影响到客户操作能否方便、灵活、易懂。本文章将对ERP软件中物料(或料品)单位,从系统适用性和集成等方面做一全面的叙述。

    一、在ERP软件中单位的种类

    在ERP软件中,单位涉及的比较多,如:库存单位、销售单位、采购单位、重量单位、基本单位、辅助量单位等。目前许多软件中都有销售单位、库存单位以及采购单位,这也是软件本身最基本的需求,对于后面的几种单位强调的不是太多,但它却能满足客户的一些特殊的需求。

    二、在ERP软件中单位之间的关系

    在企业的实际运用中,一个物料在不同的阶段它的单位往往是不同的,如:螺母在生产使用过程中的单位是“个”,在采购时是“盒”,在库存中的单位是“KG”,他们之间的关系在软件中又是如何体现的呢?目前在国内许多软件中,物料的单位信息在不同的窗口中进行维护,他们之间的关系也是在相应的模块中得到体现。可能出现以下几种不理想的情况:
    单位的字段通过手工输入的方法实现,这样对于一个同样的单位如“KG”,在实际维护中不同的部门可能会产生多种情况,如“kg”、“千克”等;
    在物料清单(BOM)设计中,以“库存单位”作为参照,可如果客户的规模比较大情况下中,设计科(负责BOM的设计)往往无法知道“库存单位”,这样在操作方面,无疑有许多困难;
    如果在物料基本信息中将“库存单位”、“销售单位”、“采购单位”之间的换算关系维护成固定的比例关系,这也会引起许多问题。如,采购单位从“盒”变成了“箱”,则要将系统中所有物料的换算关系都要进行改变,如果不通过后台数据库的批量修改(在实际操作中,不推荐客户从后台修改,可能造成误操作。),则无疑增大了工作量,而且可能出项遗漏的现象;
    至于辅助量单位,在许多软件中都虚拟的存在,可在实际运用中存在许多问题。如,以“米”作为主单位,以“KG”作为辅助量单位,在粗略统计时,往往仅考虑一下以辅助量做单位的数量即可。如,线类产品,不同长度的线,往往可以用不同的“物料号”加以表达,可在粗略考虑它的库存数量时,仅用辅助量来考虑就行了。可如何实现一个物料用多种辅助量来控制呢?在许多软件中,在物料基本信息中,有“是否辅助量”控制的字段,如果需要,将必须输入“辅助量单位”,在以后的模块中,无法对此进行修改。

    三、解决单位引起的问题策略分析

    根据我参与设计ERP软件,以及客户的使用效果和经验,针对于上述的问题可以通过以下方法解决:
    给物料设计一个各部门共识的单位——“基本单位”,所有的单位都以此为参照;并通过“单位代码”和“单位名称”来实现单位长度的限制,在国内许多软件中,往往无法实现复合单位的维护,如,KG/米;
    设计“单位字典”,将所有的单位统一管理,并统一口径输入;在其他相应使用地方,通过“下拉框”形式实现单位的维护;
    设计“单位组”字典,实现单位之间的换算关系,在维护物料基本信息时,选择“单位组”和“单位”;在单位组中设计一个默认的基本单位,其他单位同它设置固定的换算关系,这样可以方便维护,在其他单位的维护中,仅显示此物料“单位组”下的各种单位。
    通过专门的窗口维护单位之间的换算关系,解决了如果换单位而引起的换算关系全部需要更新的情况,仅在单位组字段中,对换算比例更新即可。
    总之,物料单位是ERP软件的一个基本的重要信息,如果设计不要,将会给操作灵活性和系统集成方面带来许多问题。我对此提出一些看法,希望大家提出宝贵意见。
posted @ 2005-10-23 22:10 konhon 优华 阅读(372) | 评论 (0)编辑 收藏

---- ORACLE数据库作为大型数据库管理系统,近年来一直占有世界上高端数据库的最大份额,其强大而完善的数据库管理功能,以及ORACLE公司推陈出新的不断努力,一直成为IT业界瞩目的焦点。岭澳核电站的数据库平台采用了ORACLE7.3作为后端平台,前端选择了ORACLE公司的DEVELOPER 2000 及DESIGNER 2000作为开发工具,采用了目前流行的CLIENT/SERVER模式。本人在ORACLE系统的开发中,就ORACLE的整套开发工具提出一些自己的体会,供同行参考。

---- 一. ORACLE SQL PLUS 使用技巧:

---- ①查找重复记录:

SELECT DRAWING,DSNO FROM EM5_PIPE_PREFAB
WHERE ROWID!=(SELECT MAX(ROWID) FROM EM5
_PIPE_PREFAB D
WHERE EM5_PIPE_PREFAB.DRAWING=D.DRAWING AND
EM5_PIPE_PREFAB.DSNO=D.DSNO);
---- 执行上述SQL语句后就可以显示所有DRAWING和DSNO相同且重复的记录。
---- 删除重复记录:

DELETE FROM EM5_PIPE_PREFAB
WHERE ROWID!=(SELECT MAX(ROWID) FROM EM5
_PIPE_PREFAB D
WHERE EM5_PIPE_PREFAB.DRAWING=D.DRAWING AND
EM5_PIPE_PREFAB.DSNO=D.DSNO);
---- 执行上述SQL语句后就可以刪除所有DRAWING和DSNO相同且重复的记录。
---- ② 快速编译所有视图

---- 当在把数据库倒入到新的服务器上后(数据库重建),需要将视图重新编译一遍,因为该表空间视图到其它表空间的表的连接会出现问题,可以利用PL/SQL的语言特性,快速编译。

SQL >SPOOL ON.SQL
SQL >SELECT ‘ALTER VIEW ‘||TNAME||’
COMPILE;’ FROM TAB;
SQL >SPOOL OFF
然后执行ON.SQL即可。
SQL >@ON.SQL
当然,授权和创建同义词也可以快速进行,如:
SQL >SELECT ‘GRANT SELECT ON ’
||TNAME||’ TO USERNAME;’ FROM TAB;
SQL >SELECT ‘CREATE SYNONYM
‘||TNAME||’ FOR USERNAME.’||TNAME||’;’ FROM TAB;

③ 用外联接提高表连接的查询速度
在作表连接(常用于视图)时,常使用以下方法来查询数据:
SELECT PAY_NO, PROJECT_NAME
FROM A
WHERE A.PAY_NO NOT IN (SELECT PAY_
NO FROM B WHERE VALUE >=120000);
---- 但是若表A有10000条记录,表B有10000条记录,则要用掉30分钟才能查完,主要因为NOT IN要进行一条一条的比较,共需要10000*10000次比较后,才能得到结果。该用外联接后,可以缩短到1分左右的时间:
SELECT PAY_NO,PROJECT_NAME
FROM A,B
WHERE A.PAY_NO=B.PAY_NO(+)
AND B.PAY_NO IS NULL
AND B.VALUE >=12000;
---- ④ 怎样读写文本型操作系统文件
---- 在PL/SQL 3.3以上的版本中,UTL_FILE包允许用户通过PL/SQL读写操作系统文件。如下:

DECALRE
FILE_HANDLE UTL_FILE.FILE_TYPE;
BEGIN
FILE_HANDLE:=UTL_FILE.FOPEN(
‘C:\’,’TEST.TXT’,’A’);
UTL_FILE.PUT_LINE(FILE_HANDLE,’
HELLO,IT’S A TEST TXT FILE’);
UTL_FILE.FCLOSE(FILE_HANDLE);
END;
---- 相关UTL_FILE数据库包详细信息可以参见相关资料。

---- ⑤ 怎样在数据库触发器中使用列的新值与旧值

---- 在数据库触发器中几乎总是要使用触发器基表的列值,如果某条语句需要某列修改前的值,使用:OLD就可以了,使用某列修改后的新值,用:NEW就可以了。如:OLD.DEPT_NO,:NEW.DEPT_NO。

---- 二.ORACLE DEVELOPER 2000使用技巧:

---- ① 改变FORM(FMX模块)运行时的Runform4.5的题头:

---- DEVELOPER2000中FMX默认题头为:Developer/2000 Forms Runtime for Windows 95 / NT 你可以改为自己定义的标题,

---- 1. 在Form级触发器中添加触发WHEN-NEW-FORM-INSTANCE

---- 2. 在此触发器中写如下代码:

set_window_property(FORMS_MDI_WINDOW,TITLE,'POINT
SYSTEM 欢迎使用');
---- ② 如何隐藏菜单中的window选项:
---- 在创建自己的菜单时,最后选项总有window项,下面介绍如何去掉它,

---- 1. 创建一个Menu

---- 2. 在Menu中建立一个Item,命名为WINDOW。

---- 3. 设置该Item属性如下:

----

Menu Item Type:Magic
Command Type:Null
Magic Item:Window
Lable:为空

---- ③ 怎样创建动态下拉列表List
---- Developer 2000 中的列表是通过设置相关属性而完成数据项的列表设置的,但那只是静态的,有时你想让某项成为动态的列表,随输入数据的改变而改变,就需要动手去编个小程序。下面详细介绍怎样去做:

---- 有块EBOP_CABLE_ACCOUNT,下有SPECIFICATION数据项,当一进入该模块时,就将SPECIFICATION项在数据库中存储的值动态显示出来,先在Form4.5中建立一个PRCEDURE,命名为DYN_LIST:

PROCEDURE DYN_LIST IS
CURSOR C1 IS
SELECT DISTINCT(SPECIFICATION)
FROM EBOP_CABLE_ACCOUNT;
CNT NUMBER;
i NUMBER;
TNAME EBOP_CABLE_
ACCOUNT.SPECIFICATION%TYPE;
BEGIN
CLEAR_LIST('EBOP_CABLE_
ACCOUNT.SPECIFICATION');
SELECT COUNT(DISTINCT
(SPECIFICATION)) INTO CNT FROM EBOP
_CABLE_ACCOUNT;
open C1;
FOR i IN 1..CNT LOOP
FETCH C1 INTO TNAME;
EXIT WHEN C1%NOTFOUND
OR C1%NOTFOUND IS NULL;
ADD_LIST_ELEMENT
('EBOP_CABLE_ACCOUNT
.SPECIFICATION',i,TNAME,TNAME);
END LOOP;
DELETE_LIST_ELEMENT
('EBOP_CABLE_ACCOUNT.SPECIFICATION',CNT+1);
CLOSE C1;
END;
然后在FORM的WHEN-NEW
-FORM-INSTANCE触发子中加入一行:
DYN_LIST;
---- 这样一进入该FMX,就会动态刷新该列表。除此之外,SPECIFICATION数据项改为列表项。
---- ④ 当显示多条记录且数据项特别多时,如何组织录入及显示界面:

---- 如上图所示,PRN代码及设备代码在画布1(CONTENT型)上,其它数据项在画布2(STACK型)上,所有数据项为一个表的列或一个块的数据项。在拉动水平滚动条时或用TAB或敲回车键时,将看到全部数据项。这种排布方法适用于数据项特别多又想显示多条记录时用。主要制作顺序为:先建立两个画布,画布1(CONTENT型),画布2(STACK型),然后建立块,选画布时用画布1,这样所有项都显示在画布1上,然后选中除PRN代码及设备代码之外的所有数据项,选TOOLS菜单下的PROPERTIES选项,将这些数据项的CANVAS属性选为画布2(STACK型),然后调整整体位置就可以了。

---- ⑤ 如何在FORM的受限触发子中提交保存数据

---- 在FORM中很多触发子是不能用COMMIT WORK语句的,当你在该触发子中使用了UPDATE,DELETE等操作并想立即存盘时,就需要COMMIT WORK语句了。首先在服务器端建立DB_SQL_COMMIT这个过程(采用ORACLE7.3数据库),

PROCEDURE DB_SQL_COMMIT IS
source_cursor integer;
ignore integer;
V7 NUMBER :=2;
BEGIN
source_cursor:=dbms_sql.open_cursor;
dbms_sql.parse(source_cursor,'COMMIT WORK',V7);
ignore:=dbms_sql.execute(source_cursor);
DBMS_SQL.CLOSE_CURSOR(source_cursor);
END;
---- 然后在FORM中该触发子中调用过程DB_SQL_COMMIT;就可以了,当然你可以根据自己需要将该过程加入参数,这样通过参数可以得到执行DML语句的权限。

- ⑥ 如何在FORM中实现某数据项自动按记录序号加一操作

---- 设块名为VO,要操作的数据项为VO_ID,在该块中建立块级触发子WHEN-CREATE- RECORD,加入如下代码:

:VO_ID:=:System.Trigger_Record;
---- 这样每当生成新记录时VO_ID就会自动加一了。
---- ⑦ 如何在一个FORM中调用另一个FORM,或在一个块中调用另一个块时显示特定的记录有时用户会要求在调用另一个FORM时,只显示相关的记录,举例如下,在一个FORM的块中有一个按钮,在按钮触发子中加入如下代码:

DECLARE
PM
PARAMLIST;
BEGIN
PM:=GET_PARAMETER_LIST('PM');
IF NOT ID_NULL(PM) THEN
DESTROY_PARAMETER_LIST('PM');
END IF;
PM:=CREATE_PARAMETER_LIST('PM');
......................
ADD_PARAMETER(PM,'THE_WHERE',
TEXT_PARAMETER,'EM_NAME=''EM4''
AND EM_PROJECT_NAME=''支架预制''');
OPEN_FORM('PAYMENT',ACTIVATE,SESSION,PM);
END;
---- 其中EM_NAME,EM_PROJECT_NAME为本FORM某块的数据项,PAYMENT为要调用的FORM模块。这样通过传递参数列表就可以得到想要的结果。在FORM PAYMENT.FMB中,建立一参数THE_WHERE,CHAR型,长1000,然后在PAYMENT.FMB中建立FORM级触发子WHEN-NEW-FORM-INSTANCE,在该触发子中加入以下语句:
IF :PARAMETER.THE_WHERE IS NOT NULL THEN
SET_BLOCK_PROPERTY('PAYMENT',
DEFAULT_WHERE,:PARAMETER.THE_WHERE);
END IF;
---- 其中PAYMENT为要显示的块,这样通过参数传递就得到想要的某些特定条件的数据了。
---- ⑧ 在FORM中当有主从块时,连续输入记录如何避免被不断的提示保存:

---- 每输入一条主记录和若干条该主记录的从记录后,此时再导航到主块输下一条记录,FORM就会提示你是否要保存记录,而你并不希望FORM提示,让它自动保存,此时你可以到Program Units中找到过程PROCEDURE Clear_All_Master_Details,然后在这个过程中找到语句

Clear_Block(ASK_COMMIT);
---- 将其改为Clear_Block(DO_COMMIT);就可以了。
---- ⑨ 在Report开始时选择排序项:

---- 在报表开始的Parameter Form中选择报表按哪个数据项排序,

---- 1. 先在USER PARAMETER 中创建SORT参数,为字符型,长20。

---- 2. 初始值选’责任方’,然后将这四个值输入到DATA SELECTION中,形成列表。

---- 3. 然后处理QUERY中的SQL语句:

select CHARGER,FCO_NO,EM_NAME,FCO
_NO,DESCRIPTION, FCR_POINT
from FCR_MAIN
ORDER BY DECODE(:SORT,'责任方',CHARGER,'FCO号',
FCO_NO,'FCR号',FCR_NO,'FCR号',EM_NAME)

---- ⑩ 在Developer 2000中如何读写操作系统文件
---- 在用Developer 2000的开发工具开发应用程序时,经常碰到需要读写外部文件的问题,可以用ORACLE 带的包TEXT_IO来完成这项需求。例如:

DECLARE
IN_FILE TEXT_IO.FILE_TYPE;
OUT_FILE TEXT_IO.FILE_TYPE;
LINE_BUFER VARCHAR2(80);
/*若不用IN_FILE,可以将各字段联接在一起赋值给此变量*/
BEGIN
IN_FILE:=TEXT_IO.FOPEN
(‘C:\TEMP\TEST1.TXT’,’r’);
OUT_FILE:=TEXT_IO.FOPEN
(‘C:\TEMP\TEST2.TXT’,’w+’);
LOOP
TEXT_IO.GET_LINE(IN_FILE,LINE_BUFER);
TEXT_IO.PUT(LINE_BUFER);
TEXT_IO.NEW_LINE;
TEXT_IO.PUT_LINE(OUT_FILE,LINE_BUFER);
END LOOP;
EXCEPTION
WHEN no_data_found THEN
TEXT_IO.PUT_LINE(‘CLOSING THE FILE ,PLEASE WAITING....’);
TEXT_IO.FCLOSE(IN_FILE);
TEXT_IO.FCLOSE(OUT_FILE);
END;
---- 三.数据库管理

---- ① 在删除一个表中的全部数据时,须使用TRUNCATE TABLE 表名;因为用DROP TABLE,DELETE * FROM 表名时,TABLESPACE表空间该表的占用空间并未释放,反复几次DROP,DELETE操作后,该TABLESPACE上百兆的空间就被耗光了。

---- ② 数据库文件的移动方法

---- 当想将数据库文件移动到另外一个目录下时,可以用ALTER DATABASE命令来移动(比ALTER TABLESPACE适用性强):

---- 1. 使用SERVER MANAGER关闭实例.

SVRMGR > connect internal;
SVRMGR > shutdown;
SVRMGR >exit;
---- 2. 使用操作系统命令来移动数据库文件位置(假设这里操作系统为SOLARIS 2.6). 在UNIX中用 mv命令可以把文件移动到新的位置,

#mv /ora13/orarun/document.dbf /ora12/orarun
---- 3. 装载数据库并用alter database命令来改变数据库中的文件名.
SVRMGR > connect internal;
SVRMGR > startup mount RUN73;
SVRMGR > alter database rename file
> ‘/ ora13/orarun/document.dbf’
> ‘/ ora12/orarun/document.dbf’;
---- 4. 启动实例.

SVRMGR > alter database open;

posted @ 2005-10-17 05:58 konhon 优华 阅读(462) | 评论 (0)编辑 收藏

---- ORACLE数据库作为大型数据库管理系统,近年来一直占有世界上高端数据库的最大份额,其强大而完善的数据库管理功能,以及ORACLE公司推陈出新的不断努力,一直成为IT业界瞩目的焦点。岭澳核电站的数据库平台采用了ORACLE7.3作为后端平台,前端选择了ORACLE公司的DEVELOPER 2000 及DESIGNER 2000作为开发工具,采用了目前流行的CLIENT/SERVER模式。本人在ORACLE系统的开发中,就ORACLE的整套开发工具提出一些自己的体会,供同行参考。

---- 一. ORACLE SQL PLUS 使用技巧:

---- ①查找重复记录:

SELECT DRAWING,DSNO FROM EM5_PIPE_PREFAB
WHERE ROWID!=(SELECT MAX(ROWID) FROM EM5
_PIPE_PREFAB D
WHERE EM5_PIPE_PREFAB.DRAWING=D.DRAWING AND
EM5_PIPE_PREFAB.DSNO=D.DSNO);
---- 执行上述SQL语句后就可以显示所有DRAWING和DSNO相同且重复的记录。
---- 删除重复记录:

DELETE FROM EM5_PIPE_PREFAB
WHERE ROWID!=(SELECT MAX(ROWID) FROM EM5
_PIPE_PREFAB D
WHERE EM5_PIPE_PREFAB.DRAWING=D.DRAWING AND
EM5_PIPE_PREFAB.DSNO=D.DSNO);
---- 执行上述SQL语句后就可以刪除所有DRAWING和DSNO相同且重复的记录。
---- ② 快速编译所有视图

---- 当在把数据库倒入到新的服务器上后(数据库重建),需要将视图重新编译一遍,因为该表空间视图到其它表空间的表的连接会出现问题,可以利用PL/SQL的语言特性,快速编译。

SQL >SPOOL ON.SQL
SQL >SELECT ‘ALTER VIEW ‘||TNAME||’
COMPILE;’ FROM TAB;
SQL >SPOOL OFF
然后执行ON.SQL即可。
SQL >@ON.SQL
当然,授权和创建同义词也可以快速进行,如:
SQL >SELECT ‘GRANT SELECT ON ’
||TNAME||’ TO USERNAME;’ FROM TAB;
SQL >SELECT ‘CREATE SYNONYM
‘||TNAME||’ FOR USERNAME.’||TNAME||’;’ FROM TAB;

③ 用外联接提高表连接的查询速度
在作表连接(常用于视图)时,常使用以下方法来查询数据:
SELECT PAY_NO, PROJECT_NAME
FROM A
WHERE A.PAY_NO NOT IN (SELECT PAY_
NO FROM B WHERE VALUE >=120000);
---- 但是若表A有10000条记录,表B有10000条记录,则要用掉30分钟才能查完,主要因为NOT IN要进行一条一条的比较,共需要10000*10000次比较后,才能得到结果。该用外联接后,可以缩短到1分左右的时间:
SELECT PAY_NO,PROJECT_NAME
FROM A,B
WHERE A.PAY_NO=B.PAY_NO(+)
AND B.PAY_NO IS NULL
AND B.VALUE >=12000;
---- ④ 怎样读写文本型操作系统文件
---- 在PL/SQL 3.3以上的版本中,UTL_FILE包允许用户通过PL/SQL读写操作系统文件。如下:

DECALRE
FILE_HANDLE UTL_FILE.FILE_TYPE;
BEGIN
FILE_HANDLE:=UTL_FILE.FOPEN(
‘C:\’,’TEST.TXT’,’A’);
UTL_FILE.PUT_LINE(FILE_HANDLE,’
HELLO,IT’S A TEST TXT FILE’);
UTL_FILE.FCLOSE(FILE_HANDLE);
END;
---- 相关UTL_FILE数据库包详细信息可以参见相关资料。

---- ⑤ 怎样在数据库触发器中使用列的新值与旧值

---- 在数据库触发器中几乎总是要使用触发器基表的列值,如果某条语句需要某列修改前的值,使用:OLD就可以了,使用某列修改后的新值,用:NEW就可以了。如:OLD.DEPT_NO,:NEW.DEPT_NO。

---- 二.ORACLE DEVELOPER 2000使用技巧:

---- ① 改变FORM(FMX模块)运行时的Runform4.5的题头:

---- DEVELOPER2000中FMX默认题头为:Developer/2000 Forms Runtime for Windows 95 / NT 你可以改为自己定义的标题,

---- 1. 在Form级触发器中添加触发WHEN-NEW-FORM-INSTANCE

---- 2. 在此触发器中写如下代码:

set_window_property(FORMS_MDI_WINDOW,TITLE,'POINT
SYSTEM 欢迎使用');
---- ② 如何隐藏菜单中的window选项:
---- 在创建自己的菜单时,最后选项总有window项,下面介绍如何去掉它,

---- 1. 创建一个Menu

---- 2. 在Menu中建立一个Item,命名为WINDOW。

---- 3. 设置该Item属性如下:

----

Menu Item Type:Magic
Command Type:Null
Magic Item:Window
Lable:为空

---- ③ 怎样创建动态下拉列表List
---- Developer 2000 中的列表是通过设置相关属性而完成数据项的列表设置的,但那只是静态的,有时你想让某项成为动态的列表,随输入数据的改变而改变,就需要动手去编个小程序。下面详细介绍怎样去做:

---- 有块EBOP_CABLE_ACCOUNT,下有SPECIFICATION数据项,当一进入该模块时,就将SPECIFICATION项在数据库中存储的值动态显示出来,先在Form4.5中建立一个PRCEDURE,命名为DYN_LIST:

PROCEDURE DYN_LIST IS
CURSOR C1 IS
SELECT DISTINCT(SPECIFICATION)
FROM EBOP_CABLE_ACCOUNT;
CNT NUMBER;
i NUMBER;
TNAME EBOP_CABLE_
ACCOUNT.SPECIFICATION%TYPE;
BEGIN
CLEAR_LIST('EBOP_CABLE_
ACCOUNT.SPECIFICATION');
SELECT COUNT(DISTINCT
(SPECIFICATION)) INTO CNT FROM EBOP
_CABLE_ACCOUNT;
open C1;
FOR i IN 1..CNT LOOP
FETCH C1 INTO TNAME;
EXIT WHEN C1%NOTFOUND
OR C1%NOTFOUND IS NULL;
ADD_LIST_ELEMENT
('EBOP_CABLE_ACCOUNT
.SPECIFICATION',i,TNAME,TNAME);
END LOOP;
DELETE_LIST_ELEMENT
('EBOP_CABLE_ACCOUNT.SPECIFICATION',CNT+1);
CLOSE C1;
END;
然后在FORM的WHEN-NEW
-FORM-INSTANCE触发子中加入一行:
DYN_LIST;
---- 这样一进入该FMX,就会动态刷新该列表。除此之外,SPECIFICATION数据项改为列表项。
---- ④ 当显示多条记录且数据项特别多时,如何组织录入及显示界面:

---- 如上图所示,PRN代码及设备代码在画布1(CONTENT型)上,其它数据项在画布2(STACK型)上,所有数据项为一个表的列或一个块的数据项。在拉动水平滚动条时或用TAB或敲回车键时,将看到全部数据项。这种排布方法适用于数据项特别多又想显示多条记录时用。主要制作顺序为:先建立两个画布,画布1(CONTENT型),画布2(STACK型),然后建立块,选画布时用画布1,这样所有项都显示在画布1上,然后选中除PRN代码及设备代码之外的所有数据项,选TOOLS菜单下的PROPERTIES选项,将这些数据项的CANVAS属性选为画布2(STACK型),然后调整整体位置就可以了。

---- ⑤ 如何在FORM的受限触发子中提交保存数据

---- 在FORM中很多触发子是不能用COMMIT WORK语句的,当你在该触发子中使用了UPDATE,DELETE等操作并想立即存盘时,就需要COMMIT WORK语句了。首先在服务器端建立DB_SQL_COMMIT这个过程(采用ORACLE7.3数据库),

PROCEDURE DB_SQL_COMMIT IS
source_cursor integer;
ignore integer;
V7 NUMBER :=2;
BEGIN
source_cursor:=dbms_sql.open_cursor;
dbms_sql.parse(source_cursor,'COMMIT WORK',V7);
ignore:=dbms_sql.execute(source_cursor);
DBMS_SQL.CLOSE_CURSOR(source_cursor);
END;
---- 然后在FORM中该触发子中调用过程DB_SQL_COMMIT;就可以了,当然你可以根据自己需要将该过程加入参数,这样通过参数可以得到执行DML语句的权限。

- ⑥ 如何在FORM中实现某数据项自动按记录序号加一操作

---- 设块名为VO,要操作的数据项为VO_ID,在该块中建立块级触发子WHEN-CREATE- RECORD,加入如下代码:

:VO_ID:=:System.Trigger_Record;
---- 这样每当生成新记录时VO_ID就会自动加一了。
---- ⑦ 如何在一个FORM中调用另一个FORM,或在一个块中调用另一个块时显示特定的记录有时用户会要求在调用另一个FORM时,只显示相关的记录,举例如下,在一个FORM的块中有一个按钮,在按钮触发子中加入如下代码:

DECLARE
PM
PARAMLIST;
BEGIN
PM:=GET_PARAMETER_LIST('PM');
IF NOT ID_NULL(PM) THEN
DESTROY_PARAMETER_LIST('PM');
END IF;
PM:=CREATE_PARAMETER_LIST('PM');
......................
ADD_PARAMETER(PM,'THE_WHERE',
TEXT_PARAMETER,'EM_NAME=''EM4''
AND EM_PROJECT_NAME=''支架预制''');
OPEN_FORM('PAYMENT',ACTIVATE,SESSION,PM);
END;
---- 其中EM_NAME,EM_PROJECT_NAME为本FORM某块的数据项,PAYMENT为要调用的FORM模块。这样通过传递参数列表就可以得到想要的结果。在FORM PAYMENT.FMB中,建立一参数THE_WHERE,CHAR型,长1000,然后在PAYMENT.FMB中建立FORM级触发子WHEN-NEW-FORM-INSTANCE,在该触发子中加入以下语句:
IF :PARAMETER.THE_WHERE IS NOT NULL THEN
SET_BLOCK_PROPERTY('PAYMENT',
DEFAULT_WHERE,:PARAMETER.THE_WHERE);
END IF;
---- 其中PAYMENT为要显示的块,这样通过参数传递就得到想要的某些特定条件的数据了。
---- ⑧ 在FORM中当有主从块时,连续输入记录如何避免被不断的提示保存:

---- 每输入一条主记录和若干条该主记录的从记录后,此时再导航到主块输下一条记录,FORM就会提示你是否要保存记录,而你并不希望FORM提示,让它自动保存,此时你可以到Program Units中找到过程PROCEDURE Clear_All_Master_Details,然后在这个过程中找到语句

Clear_Block(ASK_COMMIT);
---- 将其改为Clear_Block(DO_COMMIT);就可以了。
---- ⑨ 在Report开始时选择排序项:

---- 在报表开始的Parameter Form中选择报表按哪个数据项排序,

---- 1. 先在USER PARAMETER 中创建SORT参数,为字符型,长20。

---- 2. 初始值选’责任方’,然后将这四个值输入到DATA SELECTION中,形成列表。

---- 3. 然后处理QUERY中的SQL语句:

select CHARGER,FCO_NO,EM_NAME,FCO
_NO,DESCRIPTION, FCR_POINT
from FCR_MAIN
ORDER BY DECODE(:SORT,'责任方',CHARGER,'FCO号',
FCO_NO,'FCR号',FCR_NO,'FCR号',EM_NAME)

---- ⑩ 在Developer 2000中如何读写操作系统文件
---- 在用Developer 2000的开发工具开发应用程序时,经常碰到需要读写外部文件的问题,可以用ORACLE 带的包TEXT_IO来完成这项需求。例如:

DECLARE
IN_FILE TEXT_IO.FILE_TYPE;
OUT_FILE TEXT_IO.FILE_TYPE;
LINE_BUFER VARCHAR2(80);
/*若不用IN_FILE,可以将各字段联接在一起赋值给此变量*/
BEGIN
IN_FILE:=TEXT_IO.FOPEN
(‘C:\TEMP\TEST1.TXT’,’r’);
OUT_FILE:=TEXT_IO.FOPEN
(‘C:\TEMP\TEST2.TXT’,’w+’);
LOOP
TEXT_IO.GET_LINE(IN_FILE,LINE_BUFER);
TEXT_IO.PUT(LINE_BUFER);
TEXT_IO.NEW_LINE;
TEXT_IO.PUT_LINE(OUT_FILE,LINE_BUFER);
END LOOP;
EXCEPTION
WHEN no_data_found THEN
TEXT_IO.PUT_LINE(‘CLOSING THE FILE ,PLEASE WAITING....’);
TEXT_IO.FCLOSE(IN_FILE);
TEXT_IO.FCLOSE(OUT_FILE);
END;
---- 三.数据库管理

---- ① 在删除一个表中的全部数据时,须使用TRUNCATE TABLE 表名;因为用DROP TABLE,DELETE * FROM 表名时,TABLESPACE表空间该表的占用空间并未释放,反复几次DROP,DELETE操作后,该TABLESPACE上百兆的空间就被耗光了。

---- ② 数据库文件的移动方法

---- 当想将数据库文件移动到另外一个目录下时,可以用ALTER DATABASE命令来移动(比ALTER TABLESPACE适用性强):

---- 1. 使用SERVER MANAGER关闭实例.

SVRMGR > connect internal;
SVRMGR > shutdown;
SVRMGR >exit;
---- 2. 使用操作系统命令来移动数据库文件位置(假设这里操作系统为SOLARIS 2.6). 在UNIX中用 mv命令可以把文件移动到新的位置,

#mv /ora13/orarun/document.dbf /ora12/orarun
---- 3. 装载数据库并用alter database命令来改变数据库中的文件名.
SVRMGR > connect internal;
SVRMGR > startup mount RUN73;
SVRMGR > alter database rename file
> ‘/ ora13/orarun/document.dbf’
> ‘/ ora12/orarun/document.dbf’;
---- 4. 启动实例.

SVRMGR > alter database open;

posted @ 2005-10-17 05:58 konhon 优华 阅读(317) | 评论 (0)编辑 收藏

也许你还不知道 - sqlplus的小秘密(4)

这个也许不算什么秘密, 很多人大概都知道, 不过用过的人也许不多.

在8.1.7版本(也许是816? 不太确定)以后, sql*plus中有一个set markup html的命令, 可以将sql*plus的输出以html格式展现.


scott@O9I.US.ORACLE.COM> set markup html on spool on
">scott@O9I.US.ORACLE.COM&gt; select empno, ename from emp where rownum<3;
<br>
<p>
<table border='1' width='90%' align='center' summary='Script output'>
<tr>
<th scope="col">
EMPNO
</th>
<th scope="col">
ENAME
</th>
</tr>
<tr>
<td align="right">
7369
</td>
<td>
SMITH
</td>
</tr>
<tr>
<td align="right">
7499
</td>
<td>
ALLEN
</td>
</tr>
</table>
<p>

注意其中的spool on, 当在屏幕上输出的时候, 我们看不出与不加spool on有什么区别, 但是当我们使用spool filename 输出到文件的时候, 会看到spool文件中出现了<html><body>等tag.

">scott@O9I.US.ORACLE.COM&gt; spool c:emp.htm
<br>
">scott@O9I.US.ORACLE.COM&gt; /
<br>
<p>
<table border='1' width='90%' align='center' summary='Script output'>
......此处省略

">scott@O9I.US.ORACLE.COM&gt; spool off
<br>

查看生成的emp.htm文件的内容:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=WINDOWS-936">
<meta name="generator" content="SQL*Plus 9.2.0">
<style type='text/css'> body {font:10pt Arial,Helvetica,sans-serif; color:black; background:White;} p {font:10pt Arial,Helvetica,sans-serif; color:black; background:White;} table,tr,td {font:10pt Arial,Helvetica,sans-serif; color:Black; background:#f7f7e7; padding:0px 0px 0px 0px; margin:0px 0px 0px 0px;} th {font:bold 10pt Arial,Helvetica,sans-serif; color:#336699; background:#cccc99; padding:0px 0px 0px 0px;} h1 {font:16pt Arial,Helvetica,Geneva,sans-serif; color:#336699; background-color:White; border-bottom:1px solid #cccc99; margin-top:0pt; margin-bottom:0pt; padding:0px 0px 0px 0px;} h2 {font:bold 10pt Arial,Helvetica,Geneva,sans-serif; color:#336699; background-color:White; margin-top:4pt; margin-bottom:0pt;} a {font:9pt Arial,Helvetica,sans-serif; color:#663300; background:#ffffff; margin-top:0pt; margin-bottom:0pt; vertical-align:top;}</style><title>SQL*Plus Report</title>
</head>
<body>
">scott@O9I.US.ORACLE.COM&gt; /
<br>
<p>
<table border='1' width='90%' align='center' summary='Script output'>
<tr>
<th scope="col">
EMPNO
</th>
<th scope="col">
ENAME
</th>
</tr>
<tr>
<td align="right">
7369
</td>
<td>
SMITH
</td>
</tr>
<tr>
<td align="right">
7499
</td>
<td>
ALLEN
</td>
</tr>
</table>
<p>

">scott@O9I.US.ORACLE.COM&gt; spool off
<br>
</body>
</html>

用ie打开emp.htm文件后的样式如下:

现在看看spool off的情况下:

">scott@O9I.US.ORACLE.COM&gt; set markup html on spool off
<br>
">scott@O9I.US.ORACLE.COM&gt; spool c:emp2.htm
<br>
">scott@O9I.US.ORACLE.COM&gt; /
<br>
<p>
<table border='1' width='90%' align='center' summary='Script outpu
......此处省略
">scott@O9I.US.ORACLE.COM&gt; spool off
<br>
">scott@O9I.US.ORACLE.COM&gt;

查看生成的emp2.htm文件的内容:

">scott@O9I.US.ORACLE.COM&gt; /
<br>
<p>
<table border='1' width='90%' align='center' summary='Script output'>
<tr>
<th scope="col">
EMPNO
</th>
<th scope="col">
ENAME
</th>
</tr>
<tr>
<td align="right">
7369
</td>
<td>
SMITH
</td>
</tr>
<tr>
<td align="right">
7499
</td>
<td>
ALLEN
</td>
</tr>
</table>
<p>

">scott@O9I.US.ORACLE.COM&gt; spool off

由于这段代码中没有html文件头, 所以我们可以直接作为内容插入到网页中, 现在我们就可以把这段代码放到下面作为示例:

EMPNO ENAME
7369 SMITH
7499 ALLEN

总结: 如果要生成一个完整的html文件, 就使用spool on选项, 如果只是要内容部分(用来添加到一个现有的网页中), 那么就使用spool off选项.

另外, set markup html还有很多选项可以用来定制生成的html的各个部分, 例如head, body, table等, 这里不再逐一说明, 详细信息可以参考SQL*Plus User's Guide and Reference.

适用场景: 当需要定时更新一个从数据库中获取内容的静态页面时, 这种方法绝对是快捷的并且容易实现的.

posted @ 2005-10-17 05:53 konhon 优华 阅读(406) | 评论 (0)编辑 收藏

有没有过这样的经历? 在sql*plus中敲了很长的命令后, 突然发现想不起某个列的名字了, 如果取消当前的命令,待查询后再重敲, 那太痛苦了. 当然你可以另开一个sql*plus窗口进行查询, 但这里提供的方法更简单.

比如说, 你想查工资大于4000的员工的信息, 输入了下面的语句:

scott@O9I.US.ORACLE.COM> select deptno,
  2  empno,
  3  ename
  4  from emp
  5  where

这时, 你发现你想不起来工资的列名是什么了.

这种情况下, 只要在下一行以#开头, 就可以执行一条sql*plus命令, 执行完后, 刚才的语句可以继续输入

scott@O9I.US.ORACLE.COM> select deptno,
  2  empno,
  3  ename
  4  from emp
  5  where
  6  #desc emp
Name Null? Type ----------------------------------------- -------- -------------- EMPNO NOT NULL NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(9) MGR NUMBER(4) HIREDATE DATE SAL NUMBER(7,2) COMM NUMBER(7,2) DEPTNO NUMBER(2) 6 sal > 4000; DEPTNO EMPNO ENAME ---------- ---------- ---------- 10 7839 KING
posted @ 2005-10-17 05:52 konhon 优华 阅读(331) | 评论 (0)编辑 收藏

Sql*plus中, 不允许sql语句中间有空行, 这在从其它地方拷贝脚本到sql*plus中执行时很麻烦. 比如下面的脚本:

select deptno, empno, ename
from emp

where empno = '7788';

如果拷贝到sql*plus中执行, 就会出现错误:


scott@O9I.US.ORACLE.COM> select deptno, empno, ename
  2  from emp
  3
where empno = '7788';
SP2-0734: unknown command beginning "where empn..." - rest of line ignored.

原因是sqlplus遇到空行就认为是语句结束了.
其实要改变这种现象, 只要使用SQLBLANKLINES参数就可以了.

scott@O9I.US.ORACLE.COM> SET SQLBLANKLINES ON
scott@O9I.US.ORACLE.COM>
scott@O9I.US.ORACLE.COM> select deptno, empno, ename
  2  from emp
  3
  4  where empno = '7788';

    DEPTNO      EMPNO ENAME
---------- ---------- ----------
        20       7788 SCOTT

posted @ 2005-10-17 05:48 konhon 优华 阅读(372) | 评论 (0)编辑 收藏

有没有为了dbms_output.put_line会"吃掉"最前面的空格而苦恼?

scott@O9I.US.ORACLE.COM> set serveroutput on
scott@O9I.US.ORACLE.COM> exec dbms_output.put_line('   abc');
abc

PL/SQL procedure successfully completed.


(俺以前曾经很苦恼为了保留空格, 尝试了加".", 加不可见字符等办法, 不过终究觉得不自然)
实际上, 只要在set serveroutput on后加上format wrapped参数, 就可以避免这个问题

scott@O9I.US.ORACLE.COM> set serveroutput on format wrapped
scott@O9I.US.ORACLE.COM> exec dbms_output.put_line('   abc');
   abc

PL/SQL procedure successfully completed.
posted @ 2005-10-17 05:47 konhon 优华 阅读(353) | 评论 (0)编辑 收藏

仅列出标题
共21页: First 上一页 9 10 11 12 13 14 15 16 17 下一页 Last