1:RDBのレコード削除のバッチ処理の方法 江須扇 08/24 16:33 こんにちは江須扇です。 一ヶ月前のデータを削除したいというバッチ処理を考えた時。 RDBQ2のカタログでは一ヶ月前という条件指定が難しいです。 (もしご存知の方がお見えでしたら教えてください。) SMART2は1ファイル更新でレコード削除は可能ですが 選択条件が働かず全件読込です。 COBOLはRDBのSELECTは条件と分類しかできなく SQL文としてUPDATEやDELETEができません。 そこで、下記のようなコーディングを考えたのですが GOTOレスではこんな感じでよいのでしょうか? 例1と例2ではどちらがよいのでしょうか? 例1
例2
2:Re:RDBのレコード削除のバッチ処理の方法 EXCHANGE 08/24 18:27 > 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とするのはマズイかも。。 3:Re:RDBのレコード削除のバッチ処理の方法 江須扇 08/24 20:39 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にしているので問題は無いと思いますが? 4:Re:RDBのレコード削除のバッチ処理の方法 EXCHANGE 08/26 23:23 ☆ 江須扇さん、こんばんわ。 すみません、書き方が舌足らずで。。 > ☆ もし、「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 という調子です。 ☆ これの方が面倒くさくなくて便利に思うのですが。。 ただし、また容量無駄遣いしてしまいますけどね!! 5:Re: x4: RDBのレコード削除のバッチ処理の方法 江須扇 08/27 22:21 今晩は、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バイト と考えた場合でもアンパックが良いのでは思いますが皆様は如何お考えでしょうか? |