目錄
CHAPTER?? 1 COBOL 概述
CHAPTER?? 2 過程部初步
CHAPTER?? 3 標識部和環境部
CHAPTER?? 4 數據部之一
CHAPTER?? 5 過程部之二
CHAPTER?? 6 過程部之三
CHAPTER?? 7 各部之間的關系及程序舉例
CHAPTER?? 8 聯機及批量程序的一些差異
CHAPTER?? 9 COBOL 編程規范
CHAPTER 1 COBOL 概述
COBOL 是Common Business Oriented Language 的縮寫。它不僅是商業數據處理的理想語言,
而且廣泛用于數據管理領域,因此COBOL 語言也被稱為“用于管理的語言”。
一。COBOL 語言的特點
??????? 最適于數據處理領域:算數計算量少而邏輯處理量多,輸入輸出量大,數據間存在著一定的邏輯? 關系,大量的分類排序;COBOL比較接近英語,容易懂;通用性強,易移植,COBOL結構嚴謹,層次分明。
?
二。COBOL的組成部分:
1。標識部(IDENTIFICATION DIVISION):用于標識程序名。
2。環境部(ENVIRONMENT DIVISION):用于說明程序運行的環境。
3。數據部(DATA? DIVISION):用于說明程序中涉及的所有數據。
4。過程部(PROCEDURE DIVISION):是程序的核心部分,它決定計算機應進行什么操作。
?
三。最簡單的COBOL 程序舉例:
COL 1 ---6??? 7???????? 8?????? 12---72 73---80
???????????????????????????????? IDENTIFICATION DIVISION。
???????????????????????????????? PROGRAM-ID。 PSAMPLE1。
???????????????????????????????? ENVIRONMENT DIVISION。
???????????????????????????????? DATA DIVISION。
???????????????????????????????? PROCEURE DIVISION。
??????? DISPLAY ‘THIS IS A COBOL PROGRAM.’
??????????????????????????????????????????? STOP RUN。
四。COBOL 源程序的書寫格式:
?????? 第1 至 6 列為 “標號區”。??????? 第7列為“續行標志區”
?????? 第8至此11列,稱為“A區”。程序中有些內容如部頭,節頭,段頭,層號 01,層號 77 及文件
描述符FD等應從A區開始寫。
?????? 第12至此72列,稱為“B區”。寫程序中的正文部分。如過程部中的句子只能從B區開始寫。
?????? 第73至80列,稱為“注釋區”。
?
五。COBOL字符集包括:
?
?????? 數字0 --- 9 ,字母 A--- Z ,a --- z , 專用字符:+? -? * / = , . ; ‘ ( ) < > $ 及空格。屬于系統字符集而不屬于COBOL字符集的字符只能出現??? 在COBOL 程序中的字符串里。
?
六。常量:
?
??????? COBOL 常量分為數值常量(如 100,-29),非數值常量(如 ‘ABC’ )和表意常量(如 ZERO,SPACE,HIGH-VALUE,LOW-VALUE ,QUOTE ,ALL 常量)。
?
七。COBOL 所處理的數據的特點
?????? 層次的概念:數據間存在的從屬關系。
?????? 文件的概念:多個記錄可以組成一個文件。
?
?????? 記錄的概念:具有一定層次關系的一組數據項的最大集合,它是內存中具有獨立邏輯含義的最大存取項,具有最高層次。
CHAPTER 2 過程部初步-----最基本的過程部語句
一。輸入輸出語句。
1。ACCEPT語句:直接從終端鍵盤或系統指定的輸入設備上輸入數據。
???? ACCEPT?? 標識符 [FROM 助憶名]
注:A。標識符(identifier)指的是能唯一地標識一個數據項的數據名,不能唯一地標識一個
????????????? 數據項的數據名不是標識符。標識符可以是組合項。
??????? B。在ACCEPT語句中如不寫FROM部分,如ACCEPT?? A? ,則表示從系統隱含指定的
?????????????? 設備上讀入一個數據給A。 如果不想從指定的設 備上輸入,則要用FROM 選項,
?????????????? 這時“助憶名”需要在環境部中事先說明和那種外部設備相聯系。如:
ENVIRONMENT??? DIVISION。(環境部)
CONFIGRATION? SECTION。(配置節)
SPECIAL-NAMES。(專用名段)
CONSOLE?? IS? ABC
如在過程部中有 ACCEPT? T? FROM ABC。 則表示要從控制臺接收數據
2。DISPLAY語句:從計算機內存中輸出到某一指定的輸出設備上。
???? DISPLAY? { 標識符1,常量1}[標識符2,常量2]。。。[UPON 助憶名]
?????????????????????? ( 標識符和助憶名的說明同上)
???? ACCEPT語句和DISPLAY語句不必定義文件適用于少量的數據輸入輸出。
3。 READ語句:COBOL語言中數據的輸入輸出主要是通過對外部文件的讀寫進行的。READ 語句就是從外部文件上讀入數據輸出到程序中的數據項中。在程序中用到的所有文件都需要在環境部中指定程序中用到的文件名與實際外部文件的聯系。數據部也要對文件加以描述。指定數據結構各數據項所占的內存單元長度以及數據形式。
???? COBOL 的存取是以文件為對象以記錄為單位的。
READ語句的最簡單的格式為:?READ?文件名?
??ENVIRONMENT?DIVISION。
??INPUT-OUTPUT?SECTION。
??FILE-CONTROL。
????????? SELECT????? IN-FILLE??? ASSIGN? TO????? 外部文件名。
為了存儲讀入的記錄,必須在內存開辟一個與文件記錄長度相等的存儲區,即‘輸入文件紀錄區’。每一個輸入文件都有相應的‘輸入文件紀錄區’,與之一一對應。亦即在數據部中描述文件的數據結構。
3。READ語句:
???? 假設?? IN-FILE? 文件每一記錄中包含的內容為:產品代碼,產品數量,產品單價,生產日期。設某一記錄的具體數據
???? 如下:0? 0? 1? 0? 0? 1? 0? 0? 0? 0? 0? 1? 0? 0? 0? 1? 9? 9? 9? 0? 3? 2? 2
???????????????? prodcode??? quantity??????? price?????????????? year????? mon? day
???? 如果我們希望讀入該記錄并對各數據項進行處理,則需要在? ‘輸入紀錄區’中劃分出各數據項,以便存放相應的數據。定義輸入紀錄區以及劃分記錄區中各數據項的工作是由數據部來完成的。下面我們簡單介紹數據部定義記錄區方法,針對上面輸入數據的特點,我們可以在數據部中對記錄區作如下描述:
?DATA?DIVISION。
?FD???? IN-FILE?? LABLE??? RECORD? IS?? STANDARD。
?01????? IN-RECORD。?? (定義記錄區名為IN-RECORD)
?????????? 02???? PROD-CODE?PIC?? 9(4)。
?????????? 02???? PROD-QUANTITY?PIC?? 9(5)。
?????????? 02???? PROD-PRICE?PIC?? 9(6)。
?????????? 02???? MANU-DATE。(生產日期為一組合項)
??????????????????? 05?? DATE-CCYY?PIC?? 9(4)。
??????????????????? 05?? DATE-MM?PIC?? 9(2)。
??????????????????? 05?? DATE-DD?PIC?? 9(2)。
其中,FD 即 FILE DESCRIPTION,表示從該行起是‘文件描述體’。
LABLE RECORD IS STANDARD :所有的磁盤文件和磁帶文件都必須寫明此句。
01 層定義‘輸入紀錄區’ 的名字為IN-RECORD,由于 01層屬于FD描述體,因此也就指定了 IN-RECORD 和 IN-FILE 的關系。亦即從IN-FILE 讀入的數據存放在 IN-RECORD記錄區中。
這樣,在執行一次READ語句后,文件中一個記錄的數據便輸入到內存記錄區,按排列順序分別送到記錄區中各數據項中。注意文件的各記錄中的數據是不分數據項的,只是按一定的順序把數據存放在各字節中。所以數據部對記錄區中各數據項的描述應該與文件的記錄中各數據排列次序和長度相一致。
READ 語句的一般形式:READ???? 文件名?? RECORD [INTO? 標識符]? [AT?? END? 執行語句] , 例如:
????? READ? IN-FILE?? INTO TEMP-RECORD?? AT? END?? STOP? RUN? 該語句除了將讀到的數據傳送到IN-RECORD之外,還傳送到TEMP-RECORD中。在遇到文件尾時,程序結束運行。
4。WRITE語句:將內存中的數據輸出到外部設備,主要是由WRITE 語句來完成的。WRITE語句的最簡單的格式為:
????? WRITE??????? 記錄名 (注意WRITE語句的操作對象是記錄,所以是‘記錄名’而不是‘文件名’)?
???? 與輸入文件相似輸出文件也要在環境部中指定所對應的實際存在的外部文件:
??ENVIRONMENT?DIVISION。
??INPUT-OUTPUT?SECTION。
??FILE-CONTROL。
????????? SELECT????? OUT-FILLE??? ASSIGN? TO????? 打印機名。
也要在數據部中定義輸出記錄區:
?DATA?DIVISION。
?FD???? OUT-FILE?? LABLE??? RECORD? IS?? OMITTED。
?01????? OUT-RECORD。??
?????????? 02???? PROD-CODE?PIC?? 9(4)。
?????????? 02???? PROD-QUANTITY?PIC?? 9(5)。
?????????? 02???? PROD-PRICE?PIC?? 9(6)。
?????????? 02???? MANU-DATE
??????????????????? 05?? DATE-CCYY?PIC?? 9(4)。
??????????????????? 05?? DATE-MM?PIC?? 9(2)。
??????????????????? 05?? DATE-DD?PIC?? 9(2)。
LABLE RECORD IS OMITTED :凡輸出設備是打印機的都必須寫明此句。如輸出設備是磁盤,則仍用LABLE RECORD IS STANDARD。
01 層定義‘輸出紀錄區’ 的名字為OUT-RECORD,由于 01層屬于FD描述體,因此也就指定了
OUT-RECORD 和OUT-FILE 的關系。
在用WRITE 語句輸出一個記錄之前,應向輸出記錄區傳送數據。如已將數據傳送到上述各數據項中,則在執行 W RITE?? OUT-RECORD 語句后,則記錄區中的數據通過打印機打印出來。
WRITE 語句的一般形式:???????????????????? 標識符 2?LINE
????????????????????? BEFORE?????????????????? 整數??LINES
?????? WRITE???? 記錄名? [FROM? 標識符 1 ]?????? AFTER???????? ADVANCING????????? 助憶名??
????????????????????? PAGE
5。OPEN語句:程序中如果需要讀寫文件,則該文件必須先用OPEN語句打開,系統在執行READ,WRITE以前先檢查該文件是否已在規定的外部設備上準備就緒。
????? OPEN語句的一般格式為:
??INPUT?文件名1 [,文件名2]。。。
? OPEN? ?OUTPUT?文件名3 [,文件名4]。。。???? 。。。
6。CLOSE語句:當對一個文件的讀或寫的操作已完成,就應關閉該文件。
????? CLOSE語句的一般格式為:?
?CLOSE?文件名? 1?? [,文件名2]。。。
COBOL通過2位長度的文件狀態字(FILE-STATUS)來表示文件的操作結果是否成功,常見的文件狀態值及意義:

二。算數運算語句
1。ADD語句:
?格式1:ADD??? ?標識符1?,標識符2。。。? TO 標識符m [,標識符n]。。。
???常量1?,常量2
?格式2:ADD??? ?標識符1???? ,標識符2????? ,標識符3
???常量1???????? ,常量2????????? ,常量3
??? 。。。GIVING 標識符m [,標識符n]。。。
2。SUBTRACT語句:
???? 格式1:SUBTRACT?????? 標識符1?,標識符2 。。。 FROM 標識符m [,標識符n]。。。
???????????????????????????? 常量1?,常量2
???? 格式2:SUBTRACT?????? 標識符1????? ,標識符2?? 。。。? FROM????? 標識符?
?????????????? ??????? ??????????? 常量1????????? ,常量2?????????????????????????????????????? 常量
?????GIVING 標識符n [,標識符p]。。。
3。MULTIPLY語句:
???? 格式1:MULTIPLY??????? 標識符1???????? BY?標識符2 [,標識符3]。。。
????????????????????????????? 常量1,?
???? 格式2:MULTIPLY??????? 標識符1???????? BY?標識符2? GIVING 標識符3 [,標識符4]。。。
????????????????????????????? 常量1?,?常量2
4。DIVIDE語句:
???? 格式1:DIVIDE????????????? 標識符1???????? INTO?標識符2 [,標識符3]。。。
????????????????????????????? 常量1 ?
???? 格式2:DIVIDE???????????? 標識符1???????? INTO?標識符2? GIVING 標識符3 [,標識符4]。。。
??????????????????????????? 常量1? BY?常量2
???? 注意:?DIVIDE?? ?A? INTO ?B? ??是指?? ?B/A?B??????????
?DIVIDE? ?A? INTO? ?B?? GIVING? C??? ?是指?B/A?C
???????????????? ?DIVIDE?? ?A? BY???? ?B?? GIVING? C??? ?是指?? ?A/B?C?
5。COMPUTE 語句:
???????????????? COMPUTE?????????? 標識符1? [,標識符2 ]。。。= 算術表達式
???????????????? 運算的優先級由高到低順序為:(),正負號? ,** ,* 或? /?? ,+ 或 -
???????????????? 如:C = 3 ,D = 5 ,E = 2 , F = 1 則:
???????????????? COMPUT?? A,B = -(C + D)* 2 /? E ** 3 -? F = -3
三。傳送語句 (MOVE)
??????? MOVE 語句用來實現內存中數據的傳送(而不是內存和外設之間的傳送)。
??????? MOVE語句的一般格式為:
?MOVE????????? 標識符1??????? TO????????? 標識符2 [,標識符3]。。。
????????????????????? 常量1??
MOVE語句的傳送規則:
?1,如果接收項和發送項在數據部中描述的類型和長度相同,則按字節一一對應傳送。
?2,如果接收項和發送項長度不相同,而二者都是數值數據項,則按小數點對齊處理。
?3,對字母或字符數據(非數值型數據)的傳送,按左對齊處理。
?4,初等項和組合項之間可以相互傳送。
??????? 關于各類數據之間的傳送規則將在第五章中介紹。
四。轉移語句(GO? TO)
??????? 當需要使程序改變正常執行的順序時,可以使用無條件轉移語句 GO? TO 。其一般格式為:
??????? 格式1:?GO???????? TO???? 過程名
??????? 格式2:????? GO????????? TO??? 過程名1? [,過程名2]。。過程名n?? DEPENDING??? ON????? 標識符
???????
??????? 注意:只能轉移到段或節的開頭,不能轉移到段或節的當中某一語句。段名或節名為過程名。
五。條件語句(IF)
??????? 當需要根據給出的某些條件是否滿足來決定應執行哪一部分語句時,可以使用條件語句IF。
??????? 其一般格式為:
???????? ?IF???????? 條件???? 語句組1?????????????? ELSE?????? 語句組1?????????????????? [END-IF]
????? ????????????????????????? NEXT? SENTENCE??????? ????????????? NEXT? SENTENCE
??????????????????????
???????? COBOL關系運算符: ?IS???????? GREATER???? THAN??? (>)
???IS???????? LESS????????????? THAN??? (<)???????????????????????????????????????????
???IS???????? EQUAL????????? TO????????? (=)
???NOT??? GREATER???? THAN??? (NOT >) (<=)
???NOT??? LESS????????????? THAN??? (NOT <) (>=)
???NOT??? EQUAL????????? TO???????? (NOT =)
注意:句點在IF 語句中的特殊作用。
?如:IF??? A >? 0?
???????????????????????????????????????????? DISPLAY??????? A。??
???????? ADD????????? A????????? TO??? TOTAL。???????????????? ?
???????? DISPLAY???????? TOTAL。?????????????? ?
?與?? IF??? A? >? 0
?????????????? DISPLAY? A
??????????????? ADD???????? A???? TO??? TOTAL。
??????? DISPLAY??????? TOTAL。就不同。
為避免出現問題應該使用顯式終止符(END-IF,END-PERFORM等)代替隱式終止符(句點“。”)
六。停止語句(STOP)
??????? 其一般格式為:?????????? STOP????????? RUN
?????????? 常量
??????? STOP?? RUN? 執行后,程序停止運行,停止后不能再接著運行,如需要,可重新運行一次。
??????? STOP? 常量,表示程序暫時掛起不往下執行,顯示出此常量。
七。返回語句(GOBACK)
??????? 停止運行,將控制權返回給上一級。可用本語句代替STOP語句。子程序必須用GOBACK而
不能用STOP:因為STOP停止的是一個RUN UNIT(運行單元)。
CHAPTER 2 過程部初步-----最基本的過程部語句
一。標識部(IDENTIFICATION? DIVISION)
??????? IDENTIFICATION?????? DIVISION.
??????? PROGRAM-ID.???????????? 程序名。
??????? [AUTHOR。???????????????? 作者名。 ]
??????? [INSTALLATION。???? 計算機設置場所。 ]
??????? [DATE-WRITTEN。??? 源程序編寫日期。 ]
??????? [DATE-COMPILED。 源程序編譯日期。 ]
??????? [SECURITY。????????????? 保密程度。]
二。環境部(ENVIRONMENT? DIVISION)
??????? ENVIRONMENT????????? DIVISION.
??????? CONFIGRATION???????? SECTION。
??????? SOURCE-COMPUTER。???? 源計算機名。
??????? OBJECT-COMPUTER。????? 目標計算機名。
??????? [SPECIAL-NAMES。?????????? 專用名描述項。 ]
??????? [INPUT-OUTPUT???????? SECTION。
??????? FILE-CONTROL。????? {文件控制描述體}。。。
??????? [I-O-CONTROL。?????? 輸入輸出控制描述體]]
1。CONFIGRATION? SECTION。
????????????? 專有名段的一般格式:
?SPECIAL-NAMES。
??????? [DICIMAL-POINT????? IS?? COMMA。]
??????????????????????????????????? [CURRENCY?? SIGN IS?? 非數值常量。]????
??????? [專用名?????????????????????? IS??? 助憶名。]?????
2。INPUT-OUTPUT?? SECTION。
????? INPUT-OUTPUT? SECTION 包括兩個段,即:FILE-CONTROL?? 和 I-O-CONTROL。FILE-CONTROL段是為文件分配外部文件。I-O-CONTROL段的作用是可以指定目標程序運行時,幾個文件共用一個內存區,以省內存。在此暫不作介紹。
FILE-CONTROL段的主要功能是給程序中使用的文件命名。指出存放該文件的外部設備及其它有關文件控制的信息。對文件的描述是由SELECT子句實現的。FILE-CONTROL段的一般格式:
?INPUT-OUTPUT?????? SECTION。
?FILE-CONTROL。
?SELECT?????? 文件名??? ASSIGN??? TO?? 外部文件名
?[ORGANIZAION????????? IS?…?? ]?????? (SEQUENCIAL , INDEXED , RELATIVE)
?[ACCESS???? MODE????? IS?…?? ]?????? (SEQUENCIAL, RANDOM , DYNAMIC)
?[RECORD?? KEY?????????? IS ?…?? ]
?[FILE? STATUS??? IS?????????? …?? ]
CHAPTER 4 數據部之一
一。數據部概述。
? 1。 數據部的作用是定義數據項屬性,描述數據結構。所有在過程部中出現的數據項都必須在數據部中對它們的屬性進行說明。包括數據項的類型,數據項間的關系,記錄與文件的關系,文件的屬性。
2。 數據的層次和層號:COBOL中把有從屬關系的數據用層次(level)關系來描述。數據的層次結構是:記錄--》組合項--》初等項。如,在前面READ語句中定義的 IN-FILE 文件具有如下結構:
?01????? IN-RECORD。???
?????????? 02???? PROD-CODE?PIC?? 9(4)。
?????????? 02???? PROD-QUANTITY?PIC?? 9(5)。
?????????? 02???? PROD-PRICE?PIC?? 9(6)。
?????????? 02???? MANU-DATE。???
??????????????????? 05?? DATE-CCYY?PIC?? 9(4)。
??????????????????? 05?? DATE-MM?PIC?? 9(2)。
??????????????????? 05?? DATE-DD?PIC?? 9(2)。
層次規定如下:
?(1)用來描述數據的層次結構的層號從01到49。記錄的層次最高,定為01層號。
?(2)從屬項的層號比其下屬項的層號高。層號不必要求連續。
?(3)從屬于同一組合項但不互相從屬的數據項具有相同的層號。
3。數據部的結構:? 數據部中通常用到的有以下幾個節:
?(1)FILE SECTION:描述程序中用到的輸入輸出文件及其記錄中各數據項的屬性。
?(2)WORKING-STORAGE SECTION:描述程序中用到的中間數據項。
?(3)LINKAGE SECTION:描述與調用程序間發生數據傳遞的數據項。
?(4)REPORT SECTION:為了完成報表編制功能,此節用來規定欲輸出的報表的
????????? ‘體裁’,設計各報表欄的打印形式和方法等。
二。文件節。
?1。文件節的作用:? 程序中每一個輸入或輸出文件都要在文件節中加以描述。內容包括:文件名和文件屬性;文件中包括的記錄名字;每個記錄中數據的層次關系;記錄中各數據項的數據形式和占內存的大小。
2。文件描述:????????? 最簡單的文件描述體的一般格式為:
??FD?文件名
??????????? ?LABLE????? RECORD??????? IS?????????? STANDARD
????????????????????? RECORDS????? ARE ?OMITTED
???DATA??????? RECORD??????? IS ?數據名
????????????????????? RECORDS????? ARE????????
3。記錄描述:記錄描述體由01層號開始,后跟記錄名。如果記錄本身就是一個初等項,則在記錄名后描述記錄長度;否則,數據名后跟句點,下面定義記錄的數據結構。如:
?DATA?DIVISION。
?FILE?SECTION。
?FD??? IN-FILE
????????? LABLE??? RECORD IS STANDARD。
????????? DATA????? RECORD IS IN-FILE-RECORD。
?01???? IN-FILE-RECORD???????? ?PIC???????? X(80)。
??DATA?DIVISION。
?FILE?SECTION。
?FD??? IN-FILE
????????? LABLE??? RECORD IS STANDARD。
????????? DATA????? RECORD IS IN-FILE-RECORD。
?01???? IN-FILE-RECORD???????? ?PIC???????? X(80)。
或??? (?01???? IN-FILE-RECORD。
????????? 05???? DATE??PIC?? 9(8)。
????????? 05???? PROD-CODE?PIC?? 9(4)。
????????? 05???? PROD-PRICE?PIC?? 9(6)。???????????? )
4。數據項描述: 在每一個初等項的名字后跟一個PIC子句。用它來描述數據的類型和長度。PIC子句在下面詳細說明。
5。文件節的書寫格式:?? FD從A區開始書寫,01層號也從A區開始,其它層號可以從A區也可以從B區開始。為了看起來層次分明,最好從B區開始。
三。PIC 子句。PIC即PICTURE的縮寫。PIC子句用來描述每一個初等項。它說明:(1)數據項是什么類型。(2)數據項占多大內存域。(3)是否需要按打印的要求準備有關字符。PIC子句的主要作用在于描述一個初等項的一般特征和編輯要求。
1。數值型數據的描述:
?????? ‘9’描述符:? 表示該位置上可以放入一個0 ~ 9 之間的數字。因此:
?01????????? A??????? PIC 999。?????????? 或
?01????????? A??????? PIC 9(3)。
?表示A可以存放000 ~ 999 之間的一個三位數。有幾個9表示有幾位數。
?注意:(1)在數值型數據項中只能放數字不能放空格。
???????????? (2)用‘9’描述符只能表示整數,如輸入小數部分,則小數部分被舍棄。
???????????? (3)如送入一個負數,則負號被舍棄。
‘V’描述符:? 指出在數值數據結構中隱含的小數點的位置。小數點不占內存單元。如:
?03???????? M???????? PIC?? 9(3)V9(2)。
?注意:(1)V在描述符的最后,則等于無小數點。
???????????? (2)一個數據的描述符中只能出現一個V。
???????????? (3)進行數據傳送或運算時,按隱含的小數點位置對準進行傳送或運算。
???????????? (4)V表示的小數點只在傳送或運算時起作用,不能被顯示或打印出來。???
‘S’描述符:? 如果想在數據項中放入一個帶符號的數,可以用‘S’描述符。如:
?03???????? M???????? PIC?? S9(3)V9(2)。
?注意:(1)S描述符必須是最左邊的一個描述符。
???????????? (2)在內存中,S不占位數,在傳送或運算時起作用。
2。字母型數據的描述:字母型數據項用A描述符,在這種類型的數據項中只允許存放字母或空格。
3。字符型數據的描述:由任意的COBOL字符組成的數據,稱為字符型數據,它是非數值型的,不能用于計算。用X描述符來表示字符型數據。如:
?03???????? M??????? PIC?? X(5)。
?注意:(1)字符型數據可以用X描述符,也可以用9和A描述符來描述。如描述數據
????? ‘COB-74’可以用PIC? X(6),也可以用??? PIC?? A(3)X9(2)。
???????????? (2)字母型數據既可以用A描述,也可以用X。
???????????? (3)字符型數據中可以放數字。
4。編輯型描述符:編輯型數據項只是作為輸出數據時增加或改變某些所需的符號,起編輯作用,它不是作計算用的。下面分別介紹編輯數據項中用到的編輯描述符。
?(1)。插入小數點‘。’,用‘。’描述符。如:
?????????????? 77???????? T??????? PIC?? 99。99。
?? (2)。插入逗號‘,’作分位號,用‘,’描述符。如:
?????????????? 02???????? A??????? PIC? 999,999。99。 (或PIC? 9(3),9(3)。9(2))
?(3)。插入空格,用‘B’描述符。如:
?????????????? 02???????? A??????? PIC?? B9(3)B。
?(4)。插入正負號,用‘+’或‘-’描述符。如:
?????????????? 02???????? A1????? PIC?? +9(3)。(或 PIC?? 9(3)+)
?????????????? 02???????? A2????? PIC?? -9(3)。(或PIC? 9(3)-)
?????????????? 注意:描述符‘+’,一侓加符號。描述符‘-’只對負值加負號。
?(5)。插入‘$’ 。如:
?????????????? 02???????? A1?????? PIC?? $999。99。
?????????????? 02???????? A2?????? PIC? +$99999。
?????????????? 02???????? A3?????? PIC? -$999。9。
?(6)。浮動插入正負號和‘$’
?????????????? 02???????? A1?????? PIC? $$$99.99.
?????????????? 02???????? A2?????? PIC? $$$$$.$$.??
?????????????? 02???????? A3?????? PIC? ++9.99.
?
?(7)。取消高位零,用‘Z’和‘*’描述符。在高位零的位置上代以空格或‘*’。如:
?????????????? 02???????? A1?????? PIC? Z(5)。99。
?????????????? 02???????? A2?????? PIC? *(5)。*(2)。??
?????????????? 02???????? A3?????? PIC? +ZZZ,ZZZ,ZZ。ZZ。
?????????????? 02???????? A4?????? PIC? -*,***,***。99。
?(8)。插入‘DB’和‘CR’字符。DB和CR只能用作固定插入,當數值為負時,在編輯型數?????????????? 據項中最后兩個字節中置DB或CR,數值為正時,此兩字節留空格。如:
?????????????? 02???????? A1?????? PIC? $9(3)。99DB???????
?????????????????????????????????????????? 02???????? A2?????? PIC? $9(3)。99CR。
5.常用數值型數據

四。工作單元節(WORKING-STORAGE SECTION)
?1。工作單元節的作用:程序中用的數據項分為兩部分,一部分是屬于輸入或輸出文件的,另一部分是非輸入或輸出的數據。如一些中間變量或用作累計的數據項等。非輸入輸出的數據就應在工作單元節中描述,還可以用工作單元節來賦初值。
2。VALUE子句:用于給變量賦初值。如:
?02????? A??????? PIC?????? 9(3)???? VALUE?? 123。
注意:?(1)只有對工作單元節中的數據項才能賦初值,不能對文件節中輸入輸出文件中的?????????? 數據項賦初值。
?(2)如果在組合項的描述體中使用VALUE,初值只能是表意常量或非數值型常量。?????????? 對組合項整體而言,一律按字符型數據項處理。
?(3)當用一個帶符號的數值作初值時,相應的PIC子句中應有‘S’描述符。
?(4)賦初值時應該注意類型的一致性。
?(5)VALUE子句給出的值應適合PIC子句的描述范圍,否則會出現截斷或產生錯誤。
CHAPTER 5 過程部之二
一。MOVE 語句的較高技巧
?1。各種類型數據之間的傳送規則見下表:(Y:表示合法傳送。N:表示非法傳送。空白:表示某些時候是合法的。)
?
接收項
|
數值型
|
數值型
|
數值編輯型
|
字母型
|
字符型
|
字符編輯型
|
組合項
|
發送項
|
整數
|
非整數
|
|
|
|
|
|
數值型整數
|
Y
|
Y
|
Y
|
N
|
Y
|
Y
|
Y
|
數值型非整數
|
Y
|
Y
|
Y
|
N
|
N
|
N
|
Y
|
數值編輯型
|
Y
|
Y
|
Y
|
N
|
Y
|
Y
|
Y
|
字母型
|
N
|
N
|
N
|
Y
|
Y
|
Y
|
Y
|
字符型
|
|
|
|
|
Y
|
Y
|
Y
|
字符編輯型
|
N
|
N
|
N
|
N
|
Y
|
Y
|
Y
|
數值常量
|
Y
|
Y
|
Y
|
N
|
N
|
N
|
Y
|
非數值常量
|
N
|
N
|
N
|
Y
|
Y
|
Y
|
Y
|
ZERO
|
Y
|
Y
|
Y
|
N
|
Y
|
Y
|
Y
|
SPACE
|
N
|
N
|
N
|
Y
|
Y
|
Y
|
Y
|
組合項
|
|
|
|
|
Y
|
Y
|
Y
|
2。用CORRESPONDING子句的傳送 —— 對應傳送(同名傳送)
?????? 對應傳送的一般格式:
?MOVE???????? CORRESPONDING???????????? 標識符1?????? TO??????? 標識符2
????????????????????? CORR
?????? 說明:(1)如果兩個組合項中包括的項不同,則只傳送同名的項。
?????????????????? (2)傳送的兩者間必須有成對的同名數據項,而且這一對中必須至少有一個項是
??????????? 初等項。否則不能作為對應項傳送。
?????????????????? (3)所謂同名,指的是它們有相同的全程受限,即全程同名。????????
?假如T1和T2的描述分別為:
?01???????? T1。??01???????? T2。
??????? 02? X。??????? 02??? X。
????????????? 03? X1。。。????????????? ??03???? X2。。。
????????????? 03? X3。。。??????????????????????????????????? 03???? X1。。。
??????? 02? Y1。??????? 02??? Y。??????
????????????? 03? A1。。。?????????????? ??03????? A1。。。
?則T1中的A1與T2中的A1就不是全程同名。
4。除法語句中的余數語句(REMAINDER 子句):DIVIDE 語句只能求商不能求余數。如想求余數,可用?????? REMAINDER 子句。
?如:? DIVIDE??????? A??????? INTO????? B??????????? GIVING?????? C???????? REMAINDER???????????? D
????? 注意:(1)商和余數的值不僅取決于除數和被除數,還取決于數據部中對商和余數的描述。
????????????????? (2)如用ROUNDED子句,它只對商起作用,余數不作四舍五入處理,在計算余
?????????? 數時,仍按四舍五入前的值為準。
?? (3) 長度溢出也只檢查商的值是否溢出,而不檢查余數。
三。IF語句的較高技巧
?1。符號條件:
?數據名?????? IS? [NOT]????????? POSITIVE
?算術表達式?????????????? NEGATIVE
???????????????? ZERO
2。類型條件:
?標識符?IS??????? [NOT]??? NUMERIC
?????????? ALPHABETIC
3。條件名條件:用來表示條件變量當前值的名字叫條件名。條件名本身是一個條件,它有一個值(‘真’或‘假’),用它來檢查條件變量的值是否落在條件名所代表的值的范圍中,當條件變量的值落在條件名所代表的值的范圍中,則此條件名所表示的條件為‘真’,否則為‘假’。
?條件名條件的一般格式:
?88?????????? 條件名??????? {? VALUE????? IS}??????? 常量1??????? [{THRU}????? 常量2]
???????????????? [常量3?????? [ [{THRU}????? 常量4]] 。。。]
?????????????? ?如:?02????? WS-FILE-STATUS?????? PIC????? 9(2)。
??????????? 88???????? WS-FILE-NORMAL????????? VALUE? 0,93。??????
??????????? 88???????? WS-FILE-EOF?????????? VALUE? 10。
CHAPTER 6 過程部之三——執行語句(PERFORM)
一。執行語句的作用:在一個COBOL程序中,過程部中往往有一部分語句需要執行多次。為了讓重復的部分在程序中只出現一次,可以把重復的部分單獨寫成一段或一節(有一個段名或節名),每次執行這部分語句時轉去該段,執行完轉回來。這時候就需要用到執行語句(PERFORM )。
二。執行語句的一般形式:
??????????? PERFORM?????????? 過程名1??????? [THRU]??????????????? 過程名2
三。使用PERFORM語句實現循環:
? 1。?PERFORM?????????? 過程名1??????? [{THRU}??????????????? 過程名2?? ]??????? 整數???????? TIMES
???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 標識符
???????
?2。?PERFORM?????????? 過程名1??????? [{THRU}??????????????? 過程名2?? ]??????? UNTIL???? 條件
?3。?PERFORM?????????? 過程名1??????? [{THRU}??????????????? 過程名2?? ]???????
??VARYING??? 標識符1??????? FROM?? 常數1??????? BY?????? 常數2???????????? UNTIL?? 條件
??????????????????????????????????????????????????????????????????? ? 標識符2??????????????????????????? 標識符3
四。執行語句的多重循環形式:COBOL 允許三重循環,其一般格式可寫為:
?PERFORM????????? 過程名1??????? [{THRU}??????????????? 過程名2?? ]???????
??[VARYING?? 參數1??????? FROM?? 初值1??????? BY?????? 步長1???????????? UNTIL?? 條件1 ]
??[AFTER???????? 參數2??????? FROM?? 初值2??????? BY?????? 步長2???????????? UNTIL?? 條件2 ]
??[AFTER???????? 參數3??????? FROM?? 初值3??????? BY?????? 步長3???????????? UNTIL?? 條件3 ]
五。出口語句(EXIT):EXIT語句提供了一組過程的公共出口,即指出了被調用過程的邏輯終點。
CHAPTER 7 各部之間的關系及程序舉例
一.各部之間的關系:
IDENTIFICATION?? DIVISION. PROGRAM-ID.??????? PROGRAM1.
|
|
ENVIRONMENT? DIVISION. CONFIGRATION?? SECTION. INPUT-OUTPUT??? SECTION. FILE-CONTROL. ??????? SELECT??? PRODFILE? ASSIGN? TO FILE1.
|
描述程序中用到的文件與外部文件的關系及控制信息
|
DATA? DIVISION. FILE?? SECTION. FD??? PRODFILE??? LABEL? RECORD? IS? STANDARD. 01???? PROD-REC????? PIC????? X(200).?? WORKING-STORAGE?? SECTION. 01???? WS-VARIBALES. ???????? 05?? WS-I????????? PIC????? 9(2).
|
描述程序中用到的所有文件及其記錄中各數據項的屬性及程序中用到的所有中間數據項的描述.
|
PROCEDURE? DIVISION.
|
程序的核心部分,他決定計算機進行什么操作.如,文件的讀寫及其他處理
|
二.程序舉例:
例1:
讀入一組產品銷售記錄,每讀入一個記錄,計算出銷售總額(數量X單價).然后打印出該產品的全部數據.數據形式如下:
1? 9? 9? 2? 1? 2? 3? 1? 0? 0? 0? 0? 0? 1? A? A? A ?A? 0? 1? 0? 0? 5? 0? 0? 0
1? 9? 9? 3? 1? 2? 3? 1? 1? 0? 0? 0? 0? 1? B? B? B B? 0? 2? 0? 0? 6? 0? 0? 0
-------------------------? -----------------?? ------------? ------------? -----------
???????? DATE??????????????? PRODCODE???? CUST??????? AMT??? ??? PRICE
程序如下:
IDENTIFICATION?????? DIVISION.
PROGRAM-ID.???????????? PEXAM1
ENVIRONMENT????????? DIVISION.
CONFIGRATION???????? SECTION.
INPUT-OUTPUT????????? SECTION.
FILE-CONTROL.
??????? SELECT???? INPUT-FILE???????? ASSIGN??? TO???? FILE1
?????????????????????????? ORGANIZATION??????????????????? IS????? SEQUENCIAL
?????????????????????????? ACCESS??? MODE??????????????????? IS????? SEQUENCIAL
?????????????????????????? FILE-STATUS????????????????????????? IS???? WS-INPUT-FILE-STATUS.
??????? SELECT??? OUTPUT-FILE??????? ASSIGN? TO???? P-FILE
?????????????????????????? ORGANIZATION??????????????????? IS????? SEQUENCIAL
?????????????????????????? ACCESS??? MODE??????????????????? IS????? SEQUENCIAL
?????????????????????????? FILE-STATUS????????????????????????? IS???? WS-OUTPUT-FILE-STATUS.
DATA?????????????????????????? DIVISION.
FILLE?????????????????????????? SECTION.
FD????? INPUT-FILE?????? LABEL???? RECORD??? IS???? STANDARD.
01?????? IN-REC.
?????????? 05????? DATE????????? ??PIC??? 9(8).?
?????????? 05????? PROD-CODE??PIC??? 9(6).
?????????? 05????? CUSTOMER-CODE??PIC??? X(4).
?????????? 05????? QUANTITY??PIC??? 9(4).
?????????? 05????? UNIT-PRICE?? ??PIC??? 9(4).
FD????? OUTPUT-FILE?????? LABEL???? RECORD??? IS???? STANDARD.
01?????? OUT-REC.
?????????? 05????? DATE????????? ??PIC??? 9999B99B99.?
?????????? 05????? FILLER???PIC??? X(5).
?????????? 05????? PROD-CODE??PIC??? 9(6).
?????????? 05????? FILLER???PIC??? X(5).?
?????????? 05????? CUSTOMER-CODE?PIC??? X(4).
?????????? 05????? FILLER???PIC??? X(5).
?????????? 05????? QUANTITY??PIC??? ZZZ9.
?????????? 05????? FILLER???PIC??? X(5).??????????
???????? ? 05????? UNIT-PRICE?????????? PIC??? $(5).
????????? ?05????? FILLER????????? PIC??? X(5).
????????? ?05????? SALES-VALUE????? PIC??? $(8).
WORKING-STORAGE??????????????? SECTION.
01?????? WS-VARIBLES.
?????????? 05????? WS-INPUT-FILE-STATUS ?PIC??? 9(2).
???????????????????? 88?????? WS-INPUT-FILE-SUCCESSFUL???????? VALUE???? 0.
???????????????????? 88?????? WS-INPUT-FILE-EOF????????????????????????? VALUE??? 23.
?????????? 05????? WS-OUTPUT-FILE-STATUS?PIC??? 9(2).
???????????????????? 88?????? WS-OUTPUT-FILE-SUCCESSFUL???? VALUE???? 0.???
PROCEDURE??????????????????????????????? DIVISION.
A000-MAIN.
????????? PERFORM???????? A100-OPEN-FILES?????????
????????? PERFORM???????? R000-READ-FILE????????????
????????? PERFORM???????? A200-PROCESS-RECORD UNTIL WS-INPUT-FILE-EOF
????????? PERFORM???????? A300-CLOSE-FILES???????????
????????? STOP RUN
????????? .
A000-EXIT.
????????? EXIT
????????? .
A100-OPEN-FILES.
?????????? OPEN?INPUT??????? INPUT-FILE
???????????????????????? ?OUTPUT??? OUTPUT-FILE
?????????? IF??? ?NOT?????????? WS-INPUT-FILE-SUCCESSFUL?????
?DISPLAY?? ‘INPUT-FILE????????????? OPEN???? NOT?? SUCCESSFUL’??? UPON??? CONSOLE
?PERFORM? Z000-ABEND
????????? END-IF?
?????????? IF??? ?NOT??????????? WS-OUTPUT-FILE-SUCCESSFUL?????
?DISPLAY?? ‘OUTPUT-FILE???????? OPEN????? NOT?? SUCCESSFUL’??? UPON??? CONSOLE
?PERFORM? Z000-ABEND??????
?????????? END-IF?
????????? .
A200-PROCESS-RECORD.
?????????? INITIALIZE? OUT-REC
?????????? MOVE?????????? CORR???????? IN-REC??? ?TO?????????? OUT-REC
?????????? COMPUTE?? SALES-VALUE?? =? QUANTITY? OF? IN-REC?? *?? UNIT-PRICE?? OF?? OUT-REC
?????????? PERFORM?? W000-WRITE-FILE?
?????????? PERFORM??? R000-READ-FILE????
?????????? .
A300-CLOSE-FILE.
?????????? CLOSE???????? INPUT-FILE??????????
???????????????????????????????? OUTPUT-FILE
?????????? .
R000-READ-FILE.
?????????? READ ?INPUT-FILE
?????????? IF??? ?NOT?? WS-INPUT-FILE-SUCCESSFUL?? AND? NOT??? WS-INPUT-FILE-EOF??
?DISPLAY?? ‘INPUT-FILE? READ NOT?? SUCCESSFUL’??? UPON??? CONSOLE
?PERFORM? Z000-ABEND??????????? THRU????? Z000-EXIT
?????????? END-IF
????????? .
W000-WRITE-FILE.
?????????? WRITE ?OUT-REC???????? AFTER???? 1
?????????? IF??? ?NOT?? WS-OUTPUT-FILE-SUCCESSFUL????
?DISPLAY?? ‘OUTPUT-FILE? WRITE? NOT?? SUCCESSFUL’??? UPON??? CONSOLE
?PERFORM? Z000-ABEND?
?????????? END-IF
?????????? .
Z000-ABEND.
????????? DISPLAY?? ‘PROGRAM?? ABEND !’??? UPON??? CONSOLE
????????? PERFORM? A300-CLOSE-FILES????????? THRU??? A300-EXIT
????????? MOVE???????? 16???????????????????????????????????????? TO???????? RETURN-CODE
????????? GOBACK
????????? .
輸出的數據形式如下:
1992 12 31???? 000001???? AAAA????? 100????? $5000????? $500000
1993 12 31???? 100001???? BBBB?????? 200????? $6000????? $1200000
例2:
Program : INVI300??? Update? inventory?? file (random)
??????????????????????????
File? |
?Description? |
Use? |
VALTRAN? |
Valid inventory transaction? file |
Input |
INVMAST |
Inventory? master? file |
Update |
ERRTRAN |
Unmatched inventory transaction file |
Output |
?
Process specifications
??????? This program updates an inventory master file (INVMAST) based on the data in a sequential
file of valid inventory transaction records (VALTRAN). The inventory master file is indexed? by item number and updated randomly.
??????? If the program finds a master record with the same item number as a transaction, it uses the
transaction data to update the master record .It does this by increasing the on hand quantity
in the master record by the receipt quantity in the transaction record.
??????? If the program cannot find a master record for a transaction, it writes the transaction record on
the file of error transactions (ERRTRAN). The record format format for ERRTRAN is same as
for VALTRAN.
The basic processing requirements are:
1. Read a transaction record.
2. Read the master record with the same item number as in the transaction record.
3. If the master? record is found , update and rewrite the matching master record.
4. If the transaction is not found , write the transaction record on the file of error? transactions.
程序如下:
IDENTIFICATION?DIVISION.
PROGRAM-ID.?INV1300.
ENVIRONENT ?DIVISON.
INPUT-OUTPUT ?SECTION.
FILE-CONTROL.
??????? SELECT? VALTRAN??? ASSIGN? TO?? SYS020-AS-VALTRAN.
??????? SELECT? INVMAST???? ASSIGN? TO?? SYS021-INVMAT
????????????? ORGANIZATION IS? INDEXED
????????????? ACCESS???????????????? IS??? RANDOM
????????????? RECORD KEY?????? IS?? MR-ITEM-NO
????????????? FILE STATUS??????? IS?? INVMAST-ERROR-CODE.
???????? SELECT? ERRTRAN??? ASSIGN? TO?? SYS022-AS-ERRTRAN.
DATA??DIVISION.
FILE??SECTION.
FD??? VALTRAN
???????? LABEL? RECORDS? ARE? STANDARD.
01???? VALID-TRANSACTION-AREA??PIC? X(21).
FD??? INVMAST
???????? LABEL RECORDS? ARE? STANDARD.
01???? MASTER-RECORD-AREA.
???????? 05?? MR-ITEM-NO??PIC? X(5).
???????? 05?? FILLER???PIC? X(45).
FD??? ERRTRAN
???????? LABEL? RECORDS ARE STANDARD.
01???? ERROR-TRANSACTION??PIC? X(21).
WORKING-STORAGE?SECTION.
01??? SWITCHES.
??????? 05??? VALTRAN-EOF-SWITCH?PIC? X?? VALUE? ‘N’.
??????????????? 88??? VALTRAN-EOF????????????????????????????????? VALUE? ‘Y’.
??????? 05??? MASTER-FOUND-SWITCH?PIC? X.
??????????????? 88??? MASTER-FOUND?????????????????????????????? VALUE? ‘Y’.
01??? FILE-STATUS-FIELD.
??????? 05??? INVMAST-ERROR-CODE?PIC? X(2).
01??? INVENTROY-TRANSACTION-RECORD.
??????? 05??? IT-ITEM-NO??PIC? X(5).
??????? 05??? IT-VENOR-NO??PIC? X(5).
??????? 05??? IT-RECEIPT-DATE??PIC? X(6).
??????? 05??? IT-RECEIPT-QUANTITY???????????? PIC? S9(5).
01??? INVENTORY-MASTER-RECORD.
??????? 05??? IM-DESCRIPTIVE-DATA.
??????????????? 10??? IM-ITEM-NO??PIC? X(5).
??????????????? 10??? IM-ITEM-DESC??PIC? X(20).
??????????????? 10??? IM-UNIT-COST??PIC? S9(3)V9(2).
??????????????? 10??? IM-UNIT-PRICE??????? ?PIC? S9(3)V9(2).
??????? 05??? IM-INVENTORY-DATA.
??????????????? 10??? IM-REORDER-POINT?PIC? S9(5).
??????????????? 10??? IM-ON-HAND??PIC? S9(5).
??????????????? 10??? IM-ON-ORDER??PIC? S9(5).??
PROCEDURE?DIVISION.
A000-UPDATE-INVENTORY-FILE.
???????? OPEN???????????? INPUT??????? VALTRAN
??????????????????????????????? I-O?????????????? INVMAST
??????????????????????????????? OUTPUT???? ERRTRAN
???????? PERFORM??? B000-PROCESS-INVENTORY-TRAN????? THRU???? B000-EXIT
??????????????????????????????? UNTIL???????? VALTRAN-EOF
???????? CLOSE????????????????? VALTRAN
?????????????????? INVMAST
?????????????????? ERRTRAN
???????? DISPLAY????? ‘PROGRAM?? INV1300? NORMAL? END’
???????? GOBACK.
B000-PROCESS-INVENTORY-TRAN.
??????? PERFORM????????????????????? B100-READ-INVENTORY-TRAN??????????????
??????? IF????? NOT?????????????????????? VALTRAN-EOF
????????????????? PERFORM??????????? B200-READ-INVENTORY-MASTER?????????
????????????????? IF???? MASTER-FOUND
?????????????????????????? PERFORM?? B300-UPDATE-INVENTORY-MASTER????
????????????????? ELSE
?????????????????????????? PERFORM?? B400-WRITE-ERROR-TRAN???????????????????????
????????????????? END-IF
??????? END-IF.
B000-EXIT.
??????? EXIT.
??????????????????
B100-READ-INVENTRORY-TRAN.
??????? READ?? VALTRAN??????? INTO??? INVENTORY-TRANSACTION-RECORD
???????????????????? AT?? END?????????? MOVE? ‘Y’???????? TO??????? VALTRAN-EOF-SWITCH.
B100-EXIT.
??????? EXIT.
B200-READ-INVENTORY-MASTER.
??????? MOVE?? IT-ITEM-NO??????????????????????????????????? TO???????? MR-ITEM-NO
??????? READ??? INVMASST????????????????????????????????????? INTO??? INVENTORY-MASTER-RECORD
??????? IF?????????? INVMAST-ERROR-CODE????????????? = ‘00’
????????????????????? MOVE? ‘Y’??????????????????????????????????????? TO???????? MASTER-FOUND-SWITCH
??????? ELSE???
????????????????????? MOVE? ‘N’??????????????????????????????????????? TO???????? MASTER-FOUND-SWITCH
??????? END-IF.
B300-UPDATE-INVENTORY-MASTER.
??????? ADD???? IT-RECEIPT-QUANTITY??????????????? TO????????? IM-ON-HAND
??????? REWRITE? MASTER-RECORD-AREA?????? FROM??? INVENTORY-MASTER-RECORD
??????? IF????????? INVMAST-ERROR-CODE????????????? NOT?????? =?? ‘00’
???????????????????? DISPLAY?? ‘ INV1300? REWRITE?? INVMAST ERROR . ITEM? NUMBER = ’ IM-ITEM-NO
???????????????????? DISPLAY?? ‘ FILE? STATUS??? = ’??? INVMAST-ERROR-CODE
???????????????????? MOVE? ‘Y’???????????????????????????????????????? TO???????? VALTRAN-EOF-SWITH
??????? END-IF.
B300-EXIT.
??????? EXIT.
B400-WRITE-ERROR-TRAN.
??????? WRITE?? ERROR-TRANSACTION??????????????? FROM?? INVENTORY-TRANSACTION-RECORD.
B400-EXIT.
??????? EXIT.?????
?????? IDENTIFICATION DIVISION.
?????? PROGRAM-ID.??? PROGRAM3.
??????
?????? ENVIRONMENT DIVISION.
?????
?????? DATA DIVISION.
?????? WORKING-STORAGE SECTION.
?????? 01? WS-RESP??? PIC S9(8)? COMP.? ?
?????????? 88? WS-RESP-NORMAL?? VALUE? 0.
?????? 01? PGM3COM.
??? 05? CUST-NO??PIC? 9(8).
??? 05? PGM3-OUT.
?????????????? ???????? 10? PGM3-RETURN-CODE?PIC? X(2).
?????????????? 88? PGM3-SUCCESSFUL??????????????????? VALUE '? '.
??????????????????????????????? 88? PGM3-CUST-NBR-ERR??????????????? VALUE '01'.
??????????????? 88? PGM3-CUST-NOT-FND?????????????? VALUE '02'.?
???????? 10? PGM3-AC?? PIC? 9(5).
???????? 10? PGM3-BAL?? PIC? 9(11).??
?01? MASTER-RECORD.
?????? 05? MASTER-KEY?? ?? PIC? 9(8).
?????? 05? CUST-NAME ?? PIC? X(20).
?????? 05? CHECK-AC??? PIC? 9(5).
?????? 05? BAL??? PIC? 9(11).??????????
LINKAGE SECTION.
?????
01? DFHCOMMAREA?????????????????? ?PIC? X(26).
????
PROCEDURE DIVISION.
?????
A000-MAIN-PROCESS.
?
???????? MOVE? DFHCOMMAREA????? ?TO????? PGM3COM
??????????
???????? INITIALIZE PGM3-OUT
???????? PERFORM B000-VALIDATION????? THRU B000-EXIT
???????? IF????? PGM3-SUCCESSFUL
????????????????? PERFORM C000-PROCESS??? THRU C000-EXIT
??????? END-IF
??????? .
??????
?A999-RETURN.
?????????? MOVE PGM3COM????????????? ?? TO?? DFHCOMMAREA.
?????????? EXEC CICS??????? RETURN???? END-EXEC.
?????????? GOBACK.
????? *
?B000-VALIDATION.
?????????? IF?? CUST-NO?????? NOT? NUMERIC
??????????????? SET PGM3-CUST-NBR-ERR ?? TO?? TRUE
?????????? END-IF
?????????? .
? B000-EXIT.
?????????? EXIT.
????? *
??????
C000-PROCESS.
?????????? MOVE CUST-NO????????????? ??? TO?? MASTER-KEY
?????????? EXEC CICS READ FILE? ('VMASTER')
????????????????????? RIDFLD(MASTER-KEY)
????????????????????? INTO? (MASTER-RECORD)
????????????????????? LENGTH(LENGTH OF MASTER-RECORD)
???? RESP? (WS-RESP)
????????????????????? END-EXEC
?????????? IF? WS-RESP??? NOT??????? ??? =??? DFHRESP(NORMAL)???
??????? IF? WS-RESP?????????? ?? =??? DFHRESP(NOTFND)????
?????????????? SET? PGM3-CUST-NOT-FND? TO?? TRUE
??????? ELSE
?????????????? EXEC?? CICS? ABEND? ABCODE('ABCD')?? END-EXEC
??????? END-IF?
?????????? ELSE
??????? MOVE CHECK-AC????????? ? TO?? PGM3-AC
??????? MOVE BAL?? TO?? PGM3-BAL ? ?
?????????? END-IF
?????????? .
?C000-EXIT.
?????????? EXIT.
CHAPTER 8 聯機及批量程序的一些差異
批量 | 聯機 |
對大量數據的集中處理 | 對特定的少量數據操作 |
一般在非營業時間運行 | 一般在營業時間運行 |
對效率要求較高 | 對實時性要求較高 |
在操作系統中通過后臺作業流來調度運行 | 在CICS平臺上通過CICS激活運行 |
資源由作業流和程序管理 | 資源由CICS集中管理,程序對資源使用通過調用CICS提供的語句 |
一般會使用INPUT-OUTPUT SECTION. FILE-CONTROL. FILE SECTION. | 不會使用INPUT-OUTPUT SECTION. FILE-CONTROL. FILE SECTION. |
出錯處理通過檢測文件狀態字 | 出錯處理通過檢測CICS返回狀態字 |
CHAPTER 9 COBOL-II 編程規范
1. 使用結構化的編程方法 ,開發一致的、可理解的和易于維護的COBOL程序 .結構化編程應遵循“KISS”法則,即:“Keep It Simple & Stupid” for EASY TO READ ,EASY TO DEBUG ,EASY TO MAINTAIN.
2.只用順序,循環,選擇3種程序結構及組合去表示程序邏輯
3.每個控制結構只有一個入口和一個出口(結構可以是一個模塊,段,節,子程序)。
4.不要爲了時空效率而犧牲清晰性。
5.程序的清晰性首先在於邏輯的清晰,然後才是格式的清晰。
6.清晰的格式有助於清晰的思維。
7.確信所有變量在被使用時都被正確地置初值。
8.避免濫用語言特色,應使程序簡潔易讀。
9.使用有意義的、簡化的變量名及詞語標號。
10.盡量使用標準的公用子程序執行既定的程序功能。
11.避免不必要的複雜的算術和邏輯表達式。
12.避免重復的控制序列以及不必要的轉移。
13.不要用注釋去精確地重復程序代碼,要使得注釋有價值。
14.嚴格控制非限制性轉移語句“GOTO”的使用,除非下面兩種情況:當不使用時將會模糊而不是澄清功能;
?? 在同一程序單元內正向轉移。
出處...