<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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 優華 閱讀(22516) | 評論 (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 優華 閱讀(1799) | 評論 (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 優華 閱讀(479) | 評論 (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 優華 閱讀(410) | 評論 (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 優華 閱讀(471) | 評論 (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 優華 閱讀(325) | 評論 (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 優華 閱讀(420) | 評論 (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 優華 閱讀(341) | 評論 (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 優華 閱讀(387) | 評論 (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 優華 閱讀(362) | 評論 (0)編輯 收藏

    僅列出標題
    共21頁: First 上一頁 9 10 11 12 13 14 15 16 17 下一頁 Last 
    主站蜘蛛池模板: 亚洲国产激情在线一区| 亚洲AV无码一区二区一二区| 九九精品免费视频| 猫咪www免费人成网站| 亚洲AV无码专区电影在线观看| 18禁成年无码免费网站无遮挡 | 亚洲最新黄色网址| 国产成人青青热久免费精品| 日本三级在线观看免费| 亚洲一卡2卡3卡4卡乱码 在线| 亚洲人AV永久一区二区三区久久| 美女内射毛片在线看免费人动物| 阿v视频免费在线观看| 亚洲第一香蕉视频| 亚洲无线一二三四区手机| 九九精品免费视频| 在线播放免费人成毛片乱码| 久久人午夜亚洲精品无码区| 中文字幕亚洲综合精品一区| 无码专区一va亚洲v专区在线| 最近中文字幕无免费| 一区在线免费观看| 亚洲精品动漫免费二区| 777亚洲精品乱码久久久久久| 亚洲美女在线国产| 最近免费中文字幕视频高清在线看 | 夜夜爽免费888视频| 久久aⅴ免费观看| caoporm碰最新免费公开视频| 亚洲www在线观看| 久久精品国产亚洲AV无码偷窥| 亚洲毛片不卡av在线播放一区| 好吊妞788免费视频播放| 久久精品视频免费播放| 一级毛片一级毛片免费毛片| 亚洲人成人无码.www石榴| 亚洲午夜电影在线观看高清 | 亚洲精品人成无码中文毛片| 蜜臀91精品国产免费观看| 亚洲人成免费电影| 免费无码VA一区二区三区|