2011-02-07 9 views
3

私のシーケンシャルファイルにnレコードがあり、COBOLプログラムを使用してシーケンシャルファイルの最後の3レコードを削除する必要があります。これどうやってするの?シーケンシャルファイルの最後の3レコードを削除する方法

+0

http://codeblog.jonskeet.uk/2010/08/29/writing-the-perfect-question/ – Oded

+0

SELECT ... ORGANIZATION ISはxxxxですか?相対的な? –

+0

しかし、いくつかのトリックがコンパイラとOSに依存します。両方を指定してください。 –

答えて

1

はい、トリックはありますが、異なるCobolコンパイラと異なるOSバージョンを移植するものはありません。

完全に移植可能なCobolスタイルで実行する場合は、一度に3つのレコードをバッファリングするファイル全体を読み取り、バッファから落ちるごとに各レコードを書き込みます。ファイルの終わりに達すると、バッファリングされたレコードの書き込みを停止し、最後の3つを削除します。

いくつかの擬似COBOLは、次のようになります。

Perform Fill-Buffer 
    Perform until End-Of-File 
     Perform Write-Buffer 
     Perform Fill-Buffer 
    End-Perform 
    . 

Write-Buffer. 
    Write OUTPUT-FILE 
    from The-Buffer (TOP-OF-BUFFER) 
    End-Write 
    . 

Fill-Buffer. 
* Do reads to fill a 3 position ring buffer 
* and adjust TOP-OF-BUFFER to the current record... 
    . 

これは実際にはより良いSORTのように、ユーティリティを使用して行われるものです。しかし、あなたはCobolでそれを行うことができます。

+1

+1これは、プログラムを書く価値があるものではないことを示唆しています - ユーティリティを使用してください! – NealB

0

あなたが読んでいるファイルの数を知っていますか、またはプログラムを実行するたびに変更されますか?

カウントを知らなくても簡単な方法はありません。それ以外の場合は、ファイルを2回、1回はカウントに、2回目には新しい更新レコードを保存する必要があります。

スペースとメモリが大きな問題でない場合は、作業記憶域にファイル全体を表にしてから、最後の3レコードを差し引いたファイルをテーブルから書き戻します。その結果、1回だけファイルが読み込まれ、余分な読み書きは行われません。

0

以下に示すように、dfssortユーティリティを使用すると、非常に効率的かつ高速にこの作業を行うことができます。これは単なる例です。レコードの長さなどのパラメータを適宜変更してください。また、ここで手動でレコード数を数える必要があります。

//SORTT001 EXEC PGM=SORT            00100003 
//SYSOUT DD SYSOUT=*             00110003 
//SORTIN DD DSN=INPUT.FILE,DISP=SHR         00160003 
//SORTOUT DD DSN=OUTPUT.FILE,           00170003 
//    SPACE=(2790,(5376,1075),RLSE),       00180003 
//    UNIT=SYSSF,            00190003 
//    DCB=(RECFM=FB,LRECL=0080,BLKSIZE=0),      00200003 
//    DISP=(NEW,CATLG,DELETE)         00210003 
//SYSIN DD *              00220003 
SORT FIELDS=COPY,STOPAFT=100           00230003 
/*  

レコードの数を数えて、それに応じて「STOPAFT = 100」を更新してください。一般化されたソリューションをご希望の場合はお知らせください。

+0

なぜ汎用ソリューションが必要なのでしょうか?私がファイルから3つのレコードを削除しなければならないたびに、私はそのファイルに103レコードを正確に持っていたので、他のすべてのレコードと同じになると確信しています。 LRECLとRECFMは指定しないでください。ソートはそれを行います。 JCLで指定した場合は、2つの注意すべき点があります。効率的で速く、どこからカウントを取得していますか?ファイルをもう一度読みますか? –

+0

一般的な解決策から、私はファイルレコードが変化し続けるかどうかを意味しました。または、一度だけ必要な場合。したがって、レコード数は手動で数えることができ、最後の3つはstopafterを使用することで無視できます。私は例を挙げました。はい、あなたは正しいです、私はそれをあまりにも具体的にしました。 – deepaklearner

+0

手でカウントするか目でカウントするかはあまり効果的ではありません。ブラウズ/表示やm-PF8の操作もありません。とにかく、それはかなり愚かな要求です。しかし、ICETOOLを見ると、十分なものがあるはずです。 SUBSETはヒントです。 –

関連する問題