2013-11-14 149 views
2

此練習的目標是讀取輸入文件並將其存儲到表中,然後驗證輸入內的某些字段並輸出任何錯誤記錄。我需要讀取和存儲每個策略組,以便一次只能存儲5個記錄,而不是整個文件。COBOL讀取/存儲在表

所以我需要在這5條策略組閱讀,做加工,然後閱讀接下來的5個記錄,等等,直到文件的末尾..

This is the input file. 
10A 011111   2005062520060625          
20A 011111000861038              
32A 011111       79372        
60A 0111112020            6   4 
94A 011111  080 1              
10A 02222   2005082520060825          
20A 022221000187062              
32A 022221       05038        
60A 0222212003            6   4 
94A 022221  090 1              
.... 

我能夠加載前5個記錄到表中,通過我的表OCCUR 5次,但我不知道我會如何繼續。我的代碼如下。 (我只是爲了看看它是否正常工作而編寫的,但是它打印了標題行中的前4條記錄,而不是前5條)。

05 T1-RECORD-TABLE.         
    10 T1-ENTRY    OCCURS 5 TIMES  
           INDEXED BY T1-INDEX. 

     15 RECORD-TYPE-10  PIC X(80).   
     15 RECORD-TYPE-20  PIC X(80).   
     15 RECORD-TYPE-32  PIC X(80).   
     15 RECORD-TYPE-60  PIC X(80).   
     15 RECORD-TYPE-94  PIC X(80).   

copy trnrec10. 
COPY TRNREC20. 
COPY TRNREC32. 
COPY TRNREC60. 
COPY TRNREC94. 
..... 

Z200-READ-FILES.        
    READ DISK-IN INTO T1-ENTRY(T1-INDEX)  
     AT END MOVE 'YES' TO END-OF-FILE-SW. 

    WRITE PRINT-RECORD FROM T1-ENTRY(T1-INDEX). 

我不想一步這一步(雖然這會是不錯的:P)BC我知道我需要做的只是我不知道該怎麼做BC我的課本和課程筆記對我來說毫無用處。我一直堅持這一段時間,沒有任何我嘗試工作。

回答

2

你有課本,課程筆記,手冊,編輯器,JCL和計算機。

所有這些都會對你有用,但你也必須讓自己像你的應該程序一樣思考。

你的任務是讀取一個文件,將五條記錄加載到一個表中,對它們做些什麼,然後寫出來。

在閱讀文件,執行某些操作並寫入文件時,您將擁有許多任務。

那麼如何首先獲取文件處理?

使用文件狀態

PERFORM OPEN-INPUT-POLICY-MASTER 
PERFORM OPEN-OUTPUT-NEW-POLICY-MASTER 

在這些段落(或部分,這取決於你的網站的標準)打開文件定義文件,檢查文件的狀態,異常結束如果不是「00」。

您將需要一個READ段落。在那裏讀取,檢查文件狀態,知道「10」是有效的,它表示文件結束(因此你不需要AT END和END-READ)。統計所有讀取的記錄(文件狀態「00」)。

您將需要一個WRITE段落。檢查文件狀態。只有「00」有效。統計寫入的記錄。

PERFORM PRIMING-READ-OF-POLICY-MASTER 

該段落需要做的就是執行READ段落。把它放在一個自己的段落中是記錄它的功能的一種方式。告訴下一個人。

它是做什麼的?讀取或嘗試讀取第一條記錄。如果該文件爲空,您將獲得文件狀態「10」。如果文件不能爲空,請結束。你現在已經處理了一個空文件而不影響你的處理邏輯。

PERFORM PROCESS-POLICY-MASTER UNTIL END-OF-POLICY-MASTER 

PERFORM UNTIL END-OF-POLICY-MASTER 
    .... 
END-PERFORM 

我更喜歡第一個,以避免主邏輯「蔓延」,但它的罰款,以開始與第二,如果你喜歡/它適合你的課程。

段落中或END-PERFORM之前的最後一件事是執行READ操作。

然後,您可以執行CLOSE-INPUT-POLICY-MASTER和類似的輸出文件。

然後檢查計數是否相等。如果不是,請結束。在這個例子中這是微不足道的,但隨着你的邏輯變得更復雜,事情可能會出錯。

始終提供計數來協調您的輸入和輸出,計數添加,刪除。單獨計算更新信息。讓你的程序檢查它可以做什麼。如果你有更多的更新比輸入記錄,確定和異常。讓您的程序儘可能多地進行驗證。

現在您將擁有一個簡單的程序,它可以讀取文件,寫入文件,儘可能檢查文件,並且只是缺少處理邏輯。

您可以使用該程序作爲讀取一個文件並寫入另一個文件的所有任務的基礎。

所有這些東西都可以在你的新程序中運行,而無需任何操作。

您現在需要的邏輯是將數據存儲在表中。

好的,正如Gilbert正確地表明的那樣,存儲在表格中對於您的實際情況沒有任何意義。但是,這是要求。你也需要善於觀察桌子。

您的表格未正確定義。試試這個:

01 T1-RECORD-TABLE.         
    05 T1-ENTRY    OCCURS 5 TIMES  
           INDEXED BY T1-INDEX. 

     10 POLICY-RECORD. 
      15 POLICY-RECORD-TYPE PIC XX. 
      15 POLICY-RECORD-DATA PIC X(78). 

爲每個記錄類型放置一個88在POLICY-RECORD-TYPE之下。使88描述業務功能,不要只說「RECORD-IS-TYPE-10」。

您正在使用索引來引用表中的項目。在將第一個條目放入表格之前,您必須將索引設置爲1.要訪問下一個條目,您必須將索引設置爲1。

一旦將項目存儲在表格中,您需要再次遇到他們。再次將索引設置爲1,您可以引用第一個條目。連續設置索引UP BY 1以訪問其他條目。

在開始處理之前,將索引設置爲1。將零移動到表項的數量。進入你的文件處理循環。

在那裏,計算您存儲的內容,每當您的表條目數達到五時,執行一個段落以輸出您的記錄並將您的索引設置爲1.如果計數不是五,請將索引設置爲1。

在您的段落中輸出記錄,使用PERFORM VARYING改變您的索引FROM 1 BY 1直到大於5.在PERFORM中,執行WRITE段落,將當前表格條目作爲記錄的來源。

您現在將有兩個程序,它們都讀取輸入文件並生成相同的輸出文件。

然後你可以做你的驗證邏輯。

如果你打破所有問題,保持事物分離,保持簡單,命名它們,你將開始編寫除特定業務邏輯外相同的COBOL程序。所有標準的東西,所有無聊的東西,如果你喜歡,所有的基本結構都保持不變。您編寫的新代碼只是下一個任務的細節。

是的,你會閱讀更多的文件,無論是作爲參考文件,或作爲多個輸入。你將有多個輸出。但是你可以用完全相同的方式構建所有這些基礎知識。然後你會有更多的例子來建立你的未來計劃。

一旦你得到了基本的東西,你永遠不需要再次編碼。你只需複製並申請。

有了好名字,你的程序會告訴他們在做什麼。

你實際編寫的代碼將是「有趣」的東西,而不是你每次「做的東西」。

我剛剛爲你設計了這個。這不是唯一可行的設計。這是我的做法,並已經完成了一段時間。您還應該設計處理的每個部分。在編寫代碼之前,你應該知道它在做什麼。

作爲一個例子,採取一個簡單的循環。想象一下你將如何測試它。在表中有零條目的情況下會發生什麼?有一個?中間數字?一個小於最大值?最大值?比最大值多一個?最多10個?然後編寫代碼知道你需要知道如何處理這些情況。

不久之後,您會在編碼時考慮底層設計。在更長一段時間內,您也將以這種方式進行高級設計。在足夠的時間內,你只會設計你以前不需要處理的事情,其餘的你已經知道了。

你有課本,課程筆記,手冊,編輯器,JCL和電腦。我給了你一些想法。看看如果把它們放在一起,它們對你有用,怎麼樣?我想你現在有些沮喪。寫一些基本的程序,然後將它們應用到你的任務。

+0

哇!感謝您花時間爲所有內容提供真棒解釋。我的主要問題是如何定義表格,並且已經爲我澄清了這一點。 – Meg

5

我假設每個策略組都有5個記錄類型的5個記錄。

您可以像這樣設置您的工作存儲。

05 T1-RECORD. 
    10 T1-RECORD-TYPE    PIC XX. 
    10 FILLER      PIC X(78).  

COPY TRNREC10. 
COPY TRNREC20. 
COPY TRNREC32. 
COPY TRNREC60. 
COPY TRNREC94. 

然後您的閱讀段落將如下所示。我認爲TRNREC10-RECORD是TRNREC10副本的01級別。如果不是,請用以下代碼替換實際的01級別。

2200-READ-FILE.        
    READ DISK-IN INTO T1-RECORD  
     AT END MOVE 'YES' TO END-OF-FILE-SW. 

    IF END-OF-FILE-SW = 'NO' 
     IF T1-RECORD-TYPE = '10' 
      MOVE T1-RECORD TO TRNREC10-RECORD 
     END-IF 
     IF T1-RECORD-TYPE = '20' 
      MOVE T1-RECORD TO TRNREC20-RECORD 
     END-IF 
     ... 
    END-IF. 

你寫的段落是這樣

2400-WRITE-FILE. 
    WRITE PRINT-RECORD FROM TRNREC10-RECORD 
    WRITE PRINT-RECORD FROM TRNREC20-RECORD 
    ... 

你處理的段落將訪問在字帖記錄的數據。