|
Re: x4: RDBのレコード削除のバッチ処理の方法 |
|
江須扇 2004-8-27 22:21:00
[返信] [編集]
今晩は、EXCHANGEさん
> >「2月28日の1ヶ月前は?」ときたら
> の答えが−−>(A)「1月28日」でなく、(B)「1月31日」でしたら と言う意味でした。
(B)と解釈した場合は
2月27日の一ヶ月前は1月30日
2月1日の一ヶ月前は1月4日
1月31日の一ヶ月前は1月3日
3月31日の一ヶ月前は2月28日
3月30日の一ヶ月前は2月27日
では3月1日の一ヶ月前は????
解からなくなってしまいました。混乱、混乱、
> (3)データ削除のPGでは初期条件の入力でユーザに「削除年月度を指定して下さい」とやります。
> あとは、 COBOLにて
> SELECT RDBFILE
> WHERE RDBーGETUDO <= IN−GETUDO
> という調子です。
> ☆ これの方が面倒くさくなくて便利に思うのですが。。
む?、私はアバウトSEなので、オペレーションが入ると忘れてしまいますので、
目指しているのはノンオペレーションの夜間バッチです。
バッチ完了メールが朝入っていれはOK、入ってなければ、障害発生としています。
> ただし、また容量無駄遣いしてしまいますけどね!!
所で話は長くなりますが、
旧100(赤100、1978年以前)のCOBOLはパックデータが使えませんでした。
その事を他社(多分F)に突かれて急遽サブルーチン提供がされました。
ファイルをREADしたあと
CALL ”UNPACK” USING FILE−A WORK−A SIZE−A
CALL ”UNPACK” USING FILE−B WORK−B SIZE−B
・
・
の様に一項目毎、アンパックに戻して処理をして、
終わったら
CALL ”PACK” USING WORK−A FILE−A SIZE−A
CALL ”PACK” USING WORK−B FILE−B SIZE−B
・
・
でファイルをREWRITEします。
(記憶ですのであくまでもこんな感じでしたと思ってください)
大変面倒くさかったです。
その後、新100が出てからCOMP−3でパックデータが使えるようになりました。
当時はディスク容量は小さくパックデータにするのが当たりまででした。
メモリは内部処理でアンパックに戻して処理をするのであまり効果はなかったようです。
またNECの場合はパックデータの符号無しにしても1桁は1バイト、2桁は2バイトで
処理フラグや区分で1桁2桁を使う場合はあまり効果はありませんでした。
しかし現在はディスク容量も増えたのでパックにする意味は少なくなったと思います。
特にNECの場合はFILLERの項目を後で使う場合など不正十進数エラーが
パックデータは符号無しでもスペースはLOW−VALUEでもおきてしまうので使い勝手が悪いです。
設計時はパックデータ、追加項目はアンパックとデータベースの各項目がゴチャゴチャになっているのが実体です。
時代の流れでパックデータを採用した時代もありましたが、今にして思えは、本来のシステム100の基本である
アンパックにしていればと思っております。
ここで本題に戻ります。
> (1)所詮、データベースは項目単位でしか取り扱い出来ないので、
> (2)初めからデータ上に「年月日」以外にもう一つ「年月度」という項目を取っておく。
> 例えば、年月日「20040826」でしたら年月度「200408」となりますし、 年月日「040826」でしたら年月度「0408」となります。
確かめてないので解かりませんが、アンパックであればCOBOL側フィールドを階層構造にしておけば、
上6桁や上4桁も可能ではとおもいます。
データベース定義も階層構造でしてすれば可能を思います。(これも確かめていません。)
8桁+6桁のパックの場合5+4=9バイト、アンパックの8桁階層構造8バイト
6桁+4桁のパックの場合4+3=7バイト、アンパックの6桁階層構造6バイト
と考えた場合でもアンパックが良いのでは思いますが皆様は如何お考えでしょうか? |
|
Re:ハードディスク |
|
BLUELION 2004-8-27 9:12:00
[返信] [編集]
うちの640ADには、安い120maのHDやメモリがついております。
実際同じEXPRESSでおなじ規格なのに値段が相当ちがいますよね
CPUも120MAのP2の450でDUALです
まーやり方によっては120MAな一般のPC(ノートを含む)でもA-VXはうごきますからね ノートで動くAVXは感動的でした(笑)
ただし テスト環境のみの構成で、本番環境で保守なしで運用する勇気はありません
ちなみ全体の構成としては
Windowsは最新のIDEをCドライブしてセットアップしAVX系はもともとのRAIDのドライブに入れています。
|
|
Re:RDBのレコード削除のバッチ処理の方法 |
|
EXCHANGE 2004-8-26 23:23:00
[返信] [編集]
☆ 江須扇さん、こんばんわ。
すみません、書き方が舌足らずで。。
> ☆ もし、「1月31日」でしたら単に−100とするのはマズイかも。。
の言わんとするところですが、直前の文章から(なんと指示語もなしに)続いておりまして、
>「2月28日の1ヶ月前は?」ときたら
の答えが−−>(A)「1月28日」でなく、(B)「1月31日」でしたら と言う意味でした。
(B)の解釈の場合、「2月28日の1ヶ月前」というのは「1月31日」になりますので、 040228 − 100 = 040128 としてしまうと、(A)タイプの解釈になってマズイ、 という意味です。
☆ ただし、いずれにせよ江須扇さんの目的は約1ヶ月前までのデータを削除することにあるとのことですので、そこまで心配することはなかったようです。
☆ ところでこのような場合(というよりこのようなケースを想定して)私が良くやる方法は、
(1)所詮、データベースは項目単位でしか取り扱い出来ないので、
(2)初めからデータ上に「年月日」以外にもう一つ「年月度」という項目を取っておく。
というふうにしています。
例えば、年月日「20040826」でしたら年月度「200408」となりますし、 年月日「040826」でしたら年月度「0408」となります。
そして、
(3)データ削除のPGでは初期条件の入力でユーザに「削除年月度を指定して下さい」とやります。
あとは、 COBOLにて
SELECT RDBFILE
WHERE RDBーGETUDO <= IN−GETUDO
という調子です。
☆ これの方が面倒くさくなくて便利に思うのですが。。
ただし、また容量無駄遣いしてしまいますけどね!!
|
|
Re:RDBのレコード削除のバッチ処理の方法 |
|
江須扇 2004-8-24 20:39:00
[返信] [編集]
EXCHANGEさん今晩は
いつも即行の対応ありがとう御座います。
> 「2月28日の1ヶ月前は?」ときたら
> 「1月28日」? 「1月31日」?
> これはソフトを運用する状況によって違ってきそうな気がします。
これはアバウトに作ってあるの約一ヶ月と考えてください。
「3月31日」の時は「2月31日」になってしまいますが、
それより小さいで比較しておりますのでこれは問題ありません。
また、「2月28日」の時は「1月28日」で「1月27日」以前しか消えませんが
「3月1日」の時は「2月1日」でそれより小さい1月分は消えるので
問題ないと思います。
>
> ☆ もし、「1月31日」でしたら単に−100とするのはマズイかも。。
> > 000240 IF WRK-DATE(3:2) = 01 > > 000250 SUBTRACT 8900 FROM
1月の時は−8900にしているので問題は無いと思いますが? |
|
Re:RDBのレコード削除のバッチ処理の方法 |
|
EXCHANGE 2004-8-24 18:27:00
[返信] [編集]
> 000240 IF WRK-DATE(3:2) = 01 > 000250 SUBTRACT 8900 FROM WRK-DATE > 000260 ELSE SUBTRACT 100 FROM WRK-DATE > 000270 END-IF.
☆ ここの部分で、ハタ、と 分からなくなってしまいました。
江須扇さんのロジックが間違っているということではなく、
☆ 「3月28日の1ヶ月前は?」と来たら問題なしに「2月28日」。
でも、
「2月28日の1ヶ月前は?」ときたら
「1月28日」? 「1月31日」?
これはソフトを運用する状況によって違ってきそうな気がします。
☆ もし、「1月31日」でしたら単に?100とするのはマズイかも。。
|
|
RDBのレコード削除のバッチ処理の方法 |
|
江須扇 2004-8-24 16:33:00
[返信] [編集]
こんにちは江須扇です。
一ヶ月前のデータを削除したいというバッチ処理を考えた時。
RDBQ2のカタログでは一ヶ月前という条件指定が難しいです。
(もしご存知の方がお見えでしたら教えてください。)
SMART2は1ファイル更新でレコード削除は可能ですが
選択条件が働かず全件読込です。
COBOLはRDBのSELECTは条件と分類しかできなく
SQL文としてUPDATEやDELETEができません。
そこで、下記のようなコーディングを考えたのですが
GOTOレスではこんな感じでよいのでしょうか?
例1と例2ではどちらがよいのでしょうか?
例1
---------------------------------------------------------------------------
000010 IDENTIFICATION DIVISION.
000020 PROGRAM-ID. RDBDEL.
000030 ENVIRONMENT DIVISION.
000040 CONFIGURATION SECTION.
000050 SOURCE-COMPUTER. EXPRESS5800.
000060 OBJECT-COMPUTER. EXPRESS5800.
000070 INPUT-OUTPUT SECTION.
000080 FILE-CONTROL.
000090 SELECT RDBFILE ASSIGN TO RDBFILET-RDB.
000100 DATA DIVISION.
000110 FILE SECTION.
000120 FD RDBFILE
000130 LABEL RECORD IS STANDARD
000140 VALUE OF IDENTIFICATION "RDBFILE-TBL".
000150 COPY RDBFILE-R OF DDF.
000160 WORKING-STORAGE SECTION.
000170 77 WRK-DATE PIC 9(06).
000180 01 READ-FLG PIC 9(01) VALUE 0.
000190 88 READ-END VALUE 9.
000200 PROCEDURE DIVISION.
000210 MAIN SECTION.
000220 MAIN-RTN.
000230 ACCEPT WRK-DATE FROM DATE.
000240 IF WRK-DATE(3:2) = 01
000250 SUBTRACT 8900 FROM WRK-DATE
000260 ELSE SUBTRACT 100 FROM WRK-DATE
000270 END-IF.
000280 OPEN I-O RDBFILE.
000029 SELECT RDBFILE WHERE RDB-DATE < WRK-DATE.
000300 PERFORM UNTIL READ-END
000310 READ RDBFILE AT END SET READ-END TO TRUE
000320 NOT END DELETE RDBFILE
000330 END-READ
000340 END-PERFORM.
000350 CLOSE RDBFILE.
000360 STOP RUN.
例2
---------------------------------------------------------------------------
000010 IDENTIFICATION DIVISION.
000020 PROGRAM-ID. RDBDL2.
000030 ENVIRONMENT DIVISION.
000040 CONFIGURATION SECTION.
000050 SOURCE-COMPUTER. EXPRESS5800.
000060 OBJECT-COMPUTER. EXPRESS5800.
000070 INPUT-OUTPUT SECTION.
000080 FILE-CONTROL.
000090 SELECT RDBFILE ASSIGN TO RDBFILET-RDB.
000100 DATA DIVISION.
000110 FILE SECTION.
000120 FD RDBFILE
000130 LABEL RECORD IS STANDARD
000140 VALUE OF IDENTIFICATION "RDBFILE-TBL".
000150 COPY RDBFILE-R OF DDF.
000160 WORKING-STORAGE SECTION.
000170 77 WRK-DATE PIC 9(06).
000180 01 READ-FLG PIC 9(01) VALUE 0.
000190 88 READ-END VALUE 9.
000200 PROCEDURE DIVISION.
000210 FLOW SECTION.
000220 FLOW-RTN.
000230 PERFORM INIT.
000240 PERFORM MAIN UNTIL READ-END.
000250 PERFORM FINE.
000260 INIT SECTION.
000270 INIT-RTN.
000280 ACCEPT WRK-DATE FROM DATE.
000290 IF WRK-DATE(3:2) = 01
000300 SUBTRACT 8900 FROM WRK-DATE
000310 ELSE SUBTRACT 100 FROM WRK-DATE
000320 END-IF.
000330 OPEN I-O RDBFILE.
000340 SELECT RDBFILE WHERE RDB-DATE <WRK-DATE.
000350 MAIN SECTION.
000360 MAIN-RTN.
000370 READ RDBFILE AT END SET READ-END TO TRUE
000380 NOT END DELETE RDBFILE
000390 END-READ.
000400 FINE SECTION.
000410 FINE-RTN.
000420 CLOSE RDBFILE.
000430 STOP RUN.
|
|
Re:もう少しだけ直しました(その2) |
|
江須扇 2004-8-24 15:34:00
[返信] [編集]
EXCHANGEさん、いろいろとありがとうございます。
流れの基本は私と同じと思いましたが大きく違うところが解りました。 私はどうしてもメモリの少ない時の癖でプログラムの解りやすさより、ステップ数重視で1ステップでも少なくなる事を考えてしまいます。 保守性を考えたらわかり易さ重視の方が良いようですね。 多分、私の元のコーディングは WHEN SWITCH−BTABで1項目の入力 WHEN SWITCH−HTABで2項目の入力 になっており意味不明という事ですね。 そうですステップ数削減で意味不明です。 3項目を作ったどうするか考えておりませんでした。 それにしてもCOBOL側でもっとステップ数のすくなくなる 命令がないのでしょうかね? |
|
Re:ハードディスク |
|
まさ 2004-8-24 9:38:00
[返信] [編集]
皆さん返信有難うございます。
そうですね、おっしゃる通り何か有った時のリスクを考えると純正品 が一番安心して使用していられますね。 現在、大容量のHDがかなり安価で手に入る時代ですので思ったまで です。 |
|
Re:ハードディスク |
|
EXCHANGE 2004-8-23 13:06:00
[返信] [編集]
> 前から思っていたのですがExpress5800/600シリーズ > の純正ハードディスクは高価ですが市販のものは付かないのでしょう > か? > ※ちなみにディスクアレイになってます。
☆ Linux、自己責任の時代ですので、そういったことを前提でいくつかの問題点を述べてみましょう。
(1) 現在のA−VXは、Windows上で動作する「ミドルウエア」ですので、原理的に言えばWindowsが稼働するかどうかが、まず問題になります。PCサーバといえども、一般に大型のサーバになるほどメーカの独自の機器(または独自仕様のOEM機器)を搭載したり、ハードの監視用ソフト、UPSとの連携、等の機能が搭載されています。従って購入時のWindowsのバージョンを変更することは(ドライバなどの関係で)難しい場合があります。
(2)ミドルウエアとしてのA−VXをインストールする場合、独自な(A−VX向け)ドライバを必要とするのは、フロッピー装置、CMT装置などですので、これらの装置は他の装置と交換は出来ないでしょう。
(3)DAT装置、ディスク装置、等はWindows上で動作する物であれば、A−VXでも利用できる可能性はあるでしょう。
(4)700シリーズの場合は、PCサーバではないし、またWindowsNT3.51(MIPS用)のドライバがあまり提供されていない、大容量のディスクには対応していない等の問題があるので、適用できる可能性のある機器はごく限られるでしょう。
☆ 製品の一部に純正品でないものがある場合、保守契約サービスは原則として受けられないでしょう。この場合、換装パーツをのぞいた部分の保守契約を引き受けてくれる保守会社を探すか、もしくは保守契約なしで運用するか、のどちらかになります。いずれにしてもかなりの部分を「自己責任」で引き受ける必要があります。
☆ 以上の観点から、「実務での運用」となるとamadeusさんのおっしゃるとおり「やめといたほうが。。」ということになります。
☆ なお、メモリーに関してはサードパーティ製の物で保守会社が認定している物もあるようです(ADTEC社など)。私は使ったことがないので詳しいことは分かりませんが、一度保守会社にお訊きになってはいかがでしょうか?
☆ あと、メーカさんにお願いしたいのですが、「まささん」と同様の気持ちをもたれているユーザさんはかなりおられると思います。100シリーズに比べてあまりに高価な増設パーツの価格設定は、オープン連携によるA−VXマシーンの高度利用を阻害し、長い目で見れば「さらばレガシー」に結びついていくような気がします。御一考をお願いしたいと思います。
|
|
Re:ハードディスク |
|
amadeus 2004-8-22 22:19:00
[返信] [編集]
一般的にメーカーや販売店や保守会社の立場からだと純正品以外は 「取り付けられない」との回答があるでしょう。 販売する製品については純正品にての動作検証のみをおこなって 保証の対象にしているのですから。 ましてやアレイ構成の場合は、単体のディスクの動作よりも複雑な 条件での環境ですので、より厳しい条件となります。 業務で使用されるのなら純正品の選択しかないでしょう。
でも実際は・・・・・ やめておきましょう。(笑)
> 前から思っていたのですがExpress5800/600シリーズ > の純正ハードディスクは高価ですが市販のものは付かないのでしょう > か? > ※ちなみにディスクアレイになってます。
|
|
Re:もう少しだけ直しました(その2) |
|
EXCHANGE 2004-8-22 13:50:00
[返信] [編集]
☆ 「雛形」ではカーソルの位置の制御を、FOCUS-POSITIONで
行っていますので、
例えば項目Bの入力後、項目Bの再入力へLOOPさせたい場合は、 FOCUS-POSITIONを変更せずに進めるとうまくいくのでは
ないかと思います。(間違ってたらごめんなさい)
項目入力時に(HTAB)(BSKIP)以外のキーを押下した場合も(F9)をのぞいて同じ項目の再入力に戻ります。
☆ なおA−VXの場合、SKIPキーの扱いが問題かとも思います。
経験された方はご存じと思うのですが、数字項目の表示位置が初期状態では「空白」(=文字)となるので「0」等を編集表示(例:ZZZZ−)しておかないと、いきなりSKIPを押下−−>「NON−NUMERIC」エラーになります。入力後、カンマ付編集をしている場合も(カンマが文字と見なされるので)要注意です。この辺をうまく織り込もうとすると「雛形」を使っても結構、面倒な気がします。
*
MOVE 1 TO FOCUS-POSITION.
MOVE 2 TO FOCUS-POSITION-MAX.
MOVE SPACE TO END-STATUS.
MOVE SPACE TO WINDOW-STATUS.
*
PERFORM UNTIL END-STATUS = "P9"
OR WINDOW-STATUS = "EXIT"
*
EVALUATE FOCUS-POSITION
WHEN 1
ACCEPT ACEP-A-ACP
EVALUATE END-STATUS
WHEN "09"
SUBTRACT 1 FROM FOCUS-POSITION
WHEN "01"
DISPLAY ACEP-A-DSP
PERFORM ACEP-A-CHECK-SUB
IF ERR-FLAG = 1
THEN
DISPLAY ERROR-MSG-A
ELSE
ADD 1 TO FOCUS-POSITON
END-IF
WHEN OTHER
CONTINUE
END-EVALUATE
WHEN 2
ACCEPT ACEP-B-ACP
EVALUATE END-STATUS
WHEN "09"
SUBTRACT 1 FROM FOCUS-POSITION
WHEN "01"
DISPLAY ACEP-B-DSP
PERFORM ACEP-B-CHECK-SUB
IF ERR-FLAG = 1
THEN
DISPLAY ERROR-MSG-B
ELSE
(処理結果表示)
(FOCUS-POSITONを1UPしない)
END-IF
WHEN OTHER
CONTINUE
END-EVALUATE
WHEN OTHER
CONTINUE
END-EVALUATE
*
IF FOCUS-POSITION = 0
THEN MOVE 1 TO FOCUS-POSITION
END-IF
*
IF FOCUS-POSITION > FOCUS-POSITION-MAX
THEN MOVE "EXIT" TO WINDOW-STATUS
END-IF
*
END-PERFORM.
|
|
Re:もう少しだけ直しました(その2) |
|
江須扇 2004-8-22 12:53:00
[返信] [編集]
EXCHAGEさん早速いろいろと回答を頂きありがとうございます。 いろいろと考えていただきありがとうございます。
結論としてはやはり自分で何らかのスイッチを定義する必要があると言う事ですか。 A−VXのCOBOLの機能で使えるものは無いということですね。
もう一度、やりたい事を説明しますと
項目A入力 ↓__↑(BTABを押すと項目Aに戻る) 項目B入力 ↓__↑(項目Bに戻る、入力すると結果表示に行く) 結果表示
という処理です。
EXCHAGEさんの例では結果表示はもう一ランク上で括れということですね。
*
MOVE 1 TO FOCUS-POSITION.
MOVE 2 TO FOCUS-POSITION-MAX.
MOVE SPACE TO END-STATUS.
MOVE SPACE TO WINDOW-STATUS.
*
PERFORM UNTIL END-STATUS = "P9" ←私か追加した部分
OR WINDOW-STATUS = "EXIT" ←私か追加した部分
PERFORM UNTIL END-STATUS = "P9"
OR WINDOW-STATUS = "EXIT"
*
〜中略〜
(EXCHANGEさんの内容)
*
END-PERFORM
結果表示処理 ←私か追加した部分
MOVE 2 TO FOCUS-POSITION. ←私か追加した部分
END-PERFORM. ←私か追加した部分
STOP RUN. ←私か追加した部分
|
|
Re:もう少しだけ直しました(その2) |
|
EXCHANGE 2004-8-21 12:20:00
[返信] [編集]
もう少しだけ直しました。(その2) いかがでしょうか??
*
MOVE 1 TO FOCUS-POSITION.
MOVE 2 TO FOCUS-POSITION-MAX.
MOVE SPACE TO END-STATUS.
MOVE SPACE TO WINDOW-STATUS.
*
PERFORM UNTIL END-STATUS = "P9"
OR WINDOW-STATUS = "EXIT"
*
EVALUATE FOCUS-POSITION
WHEN 1
ACCEPT ACEP-A-ACP
EVALUATE END-STATUS
WHEN "09"
SUBTRACT 1 FROM FOCUS-POSITION
WHEN "01"
DISPLAY ACEP-A-DSP
PERFORM ACEP-A-CHECK-SUB
IF ERR-FLAG = 1
THEN
DISPLAY ERROR-MSG-A
ELSE
ADD 1 TO FOCUS-POSITON
END-IF
WHEN OTHER
CONTINUE
END-EVALUATE
WHEN 2
ACCEPT ACEP-B-ACP
EVALUATE END-STATUS
WHEN "09"
SUBTRACT 1 FROM FOCUS-POSITION
WHEN "01"
DISPLAY ACEP-B-DSP
PERFORM ACEP-B-CHECK-SUB
IF ERR-FLAG = 1
THEN
DISPLAY ERROR-MSG-B
ELSE
ADD 1 TO FOCUS-POSITON
END-IF
WHEN OTHER
CONTINUE
END-EVALUATE
WHEN OTHER
CONTINUE
END-EVALUATE
*
IF FOCUS-POSITION = 0
THEN MOVE 1 TO FOCUS-POSITION
END-IF
*
IF FOCUS-POSITION > FOCUS-POSITION-MAX
THEN MOVE "EXIT" TO WINDOW-STATUS
END-IF
*
END-PERFORM.
|
|
もう少しだけ直しました。 |
|
EXCHANGE 2004-8-20 13:09:00
[返信] [編集]
もう少しだけ直しました。 いかがでしょうか?
MOVE 1 TO FOCUS-POSITION.
MOVE 2 TO FOCUS-POSITION-MAX.
MOVE SPACE TO END-STATUS.
MOVE SPACE TO WINDOW-STATUS.
*
PERFORM UNTIL END-STATUS = "P9"
OR WINDOW-STATUS = "EXIT"
*
EVALUATE FOCUS-POSITION
WHEN 1
ACCEPT ACEP-A-ACP
EVALUATE END-STATUS
WHEN "09"
SUBTRACT 1 FROM FOCUS-POSITION
WHEN OTHER
DISPLAY ACEP-A-DSP
PERFORM ACEP-A-CHECK-SUB
IF ERR-FLAG = 1
THEN
DISPLAY ERROR-MSG-A
ELSE
ADD 1 TO FOCUS-POSITON
END-IF
END-EVALUATE
WHEN 2
ACCEPT ACEP-B-ACP
EVALUATE END-STATUS
WHEN "09"
SUBTRACT 1 FROM FOCUS-POSITION
WHEN OTHER
DISPLAY ACEP-B-DSP
PERFORM ACEP-B-CHECK-SUB
IF ERR-FLAG = 1
THEN
DISPLAY ERROR-MSG-B
ELSE
ADD 1 TO FOCUS-POSITON
END-IF
END-EVALUATE
WHEN OTHER
CONTINUE
END-EVALUATE
*
IF FOCUS-POSITION = 0
THEN MOVE 1 TO FOCUS-POSITION
END-IF
*
IF FOCUS-POSITION > FOCUS-POSITION-MAX
THEN MOVE "EXIT" TO WINDOW-STATUS
END-IF
*
END-PERFORM.
|
|
ハードディスク |
|
まさ 2004-8-20 11:40:00
[返信] [編集]
前から思っていたのですがExpress5800/600シリーズ の純正ハードディスクは高価ですが市販のものは付かないのでしょう か? ※ちなみにディスクアレイになってます。
|
|
Re:(再投稿)構造化プログラミングの方法 |
|
EXCHANGE 2004-8-20 11:39:00
[返信] [編集]
WHEN 0 の時の取り扱いがまずいので、訂正です。 まだまだヘンかも。。。 適当に直して下さい。
*
PERFORM UNTIL END-STATUS = "P9"
OR FOCUS-POSITON > FOCUS-POSITION-MAX
*
EVALUATE FOCUS-POSITION
WHEN 1
ACCEPT ACEP-A-ACP
EVALUATE END-STATUS
WHEN "09"
SUBTRACT 1 FROM FOCUS-POSITION
WHEN OTHER
DISPLAY ACEP-A-DSP
ADD 1 TO FOCUS-POSITON
END-EVALUATE
WHEN 2
ACCEPT ACEP-B-ACP
EVALUATE END-STATUS
WHEN "09"
SUBTRACT 1 FROM FOCUS-POSITION
WHEN OTHER
DISPLAY ACEP-B-DSP
ADD 1 TO FOCUS-POSITON
END-EVALUATE
WHEN OTHER
CONTINUE
END-EVALUATE
*
IF FOCUS-POSITION = 0
THEN MOVE 1 TO FOCUS-POSITION
END-IF
*
END-PERFORM.
|
|
Re:(再投稿)構造化プログラミングの方法 |
|
EXCHANGE 2004-8-20 3:40:00
[返信] [編集]
☆ バッチ処理プログラムでは、専ら「構造化」で書くのですが、入力系(会話型)では、GOTOをつかっていますので、あまりいい考えは浮かばないのですが。。
例えば、次のような考え方はダメでしょうか。。
MOVE 1 TO CUR-POSITION
MOVE 2 TO CUR-POSITION-MAX
MOVE SPACE TO END-STATUS
*
PERFORM UNTIL END-STATUS = "P9"
OR CUR-POSITON > CUR-POSITION-MAX
EVALUATE CUR-POSITION
WHEN 0
WHEN 1
ACCEPT ACEP-A-ACP
EVALUATE END-STATUS
WHEN "09"
SUBTRACT 1 FROM CUR-POSITION
WHEN OTHER
DISPLAY ACEP-A-DSP
ADD 1 TO CUR-POSITON
END-EVALUATE
WHEN 2
ACCEPT ACEP-B-ACP
EVALUATE END-STATUS
WHEN "09"
SUBTRACT 1 FROM CUR-POSITION
WHEN OTHER
DISPLAY ACEP-B-DSP
ADD 1 TO CUR-POSITON
END-EVALUATE
WHEN OTHER
CONTINUE
END-EVALUATE
END-PERFORM.
|
|
(再投稿)構造化プログラミングの方法 |
|
江須扇 2004-8-19 14:18:00
[返信] [編集]
コーディング例
----------------------------------------------------------------------
000010 IDENTIFICATION DIVISION.
000020 PROGRAM-ID. ACPTST.
000030 ENVIRONMENT DIVISION.
000040 CONFIGURATION SECTION.
000050 SOURCE-COMPUTER. EXPRESS5800.
000060 OBJECT-COMPUTER. EXPRESS5800.
000070 DATA DIVISION.
000080 WORKING-STORAGE SECTION.
000090 77 A-CELL PIC X(05).
000100 77 B-CELL PIC X(05).
000110 01 SWITCH-FLAG PIC 9(01) VALUE 0.
000120 88 SWITCH-HTAB VALUE 1.
000130 88 SWITCH-BSKIP VALUE 9.
000140 SCREEN SECTION.
000150 SD GAMEN END STATUS IS END-STATUS.
000160 01 ACEP-A CLEAR SCREEN.
000170 02 LINE 05 COLUMN 10 PIC X(05) USING A-CELL.
000180 01 ACEP-B.
000190 02 LINE 10 COLUMN 10 PIC X(05) INTO B-CELL.
000200 01 DISP-C.
000210 02 LINE 15 COLUMN 10 PIC N(05) FROM A-CELL.
000220 02 LINE 20 COLUMN 10 PIC N(05) FROM B-CELL WAIT.
000230 PROCEDURE DIVISION.
000240 INIT-RTN.
000250 SET SWITCH-BSKIP TO TRUE.
000260 PERFORM UNTIL END-STATUS = "P9"
000270 EVALUATE TRUE
000280 WHEN SWITCH-BSKIP
000290 ACCEPT ACEP-A
000300 IF END-STATUS = "01"
000310 SET SWITCH-HTAB TO TRUE
000320 END-IF
000330 WHEN SWITCH-HTAB
000340 DISPLAY ACEP-A
000350 ACCEPT ACEP-B
000360 EVALUATE END-STATUS
000370 WHEN "01" PERFORM MAIN-RTN
000380 WHEN "09" SET SWITCH-BSKIP TO TRUE
000390 END-EVALUATE
000400 END-EVALUATE
000410 END-PERFORM.
000420 STOP RUN.
000430******************************************************************
000440 MAIN-RTN.
000450 DISPLAY DISP-C.
|
|
構造化プログラミングの方法 |
|
江須扇 2004-8-19 14:00:00
[返信] [編集]
こんにちは、ご無沙汰しております。江須扇です。
今日は初歩的な事をご教授していただきたく投稿しました。 過去のCOBOLのプログラムはGO TO だらけなのでメンテナンスは、 そのままGO TO だらけで修正しております。 構造化プログラミングはいままでしていないので、いまさらと思っておりまし たが、新規プログラムをGOTOレスで作ろうと思ったのですが中々巧くいき ません。サンプルを作ったのですが、おかしいところを添削していただけない でしょうか?
項目Aと項目Bを入力しその表示をして項目Bに戻るというものです。 また、項目BでBTABをすれば項目Aに戻る必要もあります。 項目A又は項目BでPF9を入力すると終了とします。 実際はMAIN−RTNはもっと複雑になります。
コーディング例
----------------------------------------------------------------------
000010 IDENTIFICATION DIVISION.
000020 PROGRAM-ID. ACPTST.
000030 ENVIRONMENT DIVISION.
000040 CONFIGURATION SECTION.
000050 SOURCE-COMPUTER. EXPRESS5800.
000060 OBJECT-COMPUTER. EXPRESS5800.
000070 DATA DIVISION.
000080 WORKING-STORAGE SECTION.
000090 77 A-CELL PIC X(05).
000100 77 B-CELL PIC X(05).
000110 01 SWITCH-FLAG PIC 9(01) VALUE 0.
000120 88 SWITCH-HTAB VALUE 1.
000130 88 SWITCH-BSKIP VALUE 9.
000140 SCREEN SECTION.
000150 SD GAMEN END STATUS IS END-STATUS.
000160 01 ACEP-A CLEAR SCREEN.
000170 02 LINE 05 COLUMN 10 PIC X(05) USING A-CELL.
000180 01 ACEP-B.
000190 02 LINE 10 COLUMN 10 PIC X(05) INTO B-CELL.
000200 01 DISP-C.
000210 02 LINE 15 COLUMN 10 PIC N(05) FROM A-CELL.
000220 02 LINE 20 COLUMN 10 PIC N(05) FROM B-CELL WAIT.
000230 PROCEDURE DIVISION.
000240 INIT-RTN.
000250 SET SWITCH-BSKIP TO TRUE.
000260 PERFORM UNTIL END-STATUS = "P9"
000270 EVALUATE TRUE
000280 WHEN SWITCH-BSKIP
000290 ACCEPT ACEP-A
000300 IF END-STATUS = "01"
000310 SET SWITCH-HTAB TO TRUE
000320 END-IF
000330 WHEN SWITCH-HTAB
000340 DISPLAY ACEP-A
000350 ACCEPT ACEP-B
000360 EVALUATE END-STATUS
000370 WHEN "01" PERFORM MAIN-RTN
000380 WHEN "09" SET SWITCH-BSKIP TO TRUE
000390 END-EVALUATE
000400 END-EVALUATE
000410 END-PERFORM.
000420 STOP RUN.
000430******************************************************************
000440 MAIN-RTN.
000450 DISPLAY DISP-C.
|
|
なるほど |
|
BLUELION 2004-8-9 9:46:00
[返信] [編集]
残念ながら私の640ADでは無理なんですね
まー家で趣味で使用しているのでシングルタスクでもいいくらいなんですけどね!
さらに夏場は暑いしうるさいし電源もはいってないし(笑)
|