COBOLのジョブスケジュール管理術!休日・祝日対応の考え方を初心者向けに解説
生徒
「COBOLのバッチ処理って毎日決まった時間に動くんですか?土曜日や日曜日、祝日はどうなるんでしょう?」
先生
「そこが運用の面白いところです。基本は毎日動かしますが、銀行や企業がお休みの日は、処理をスキップしたり、逆に休日専用の処理を動かしたりする設定が必要なんです。」
生徒
「カレンダーを見ながら手動で設定を変えるんですか?」
先生
「いいえ、ジョブスケジューラというツールを使って自動化します。今日はそのスケジュール管理と休日の考え方を学びましょう!」
1. ジョブスケジュールとは?カレンダー運用の基本
ジョブスケジュールとは、コンピュータが行う仕事(ジョブ)を「いつ」「何時に」実行するかを決めた計画表のことです。プログラミング未経験の方には、学校の時間割や、工場のシフト表をイメージしてもらうと分かりやすいでしょう。
COBOL(コボル)が使われる大規模なシステムでは、一日に数千個のプログラムが動きます。これらを人間が手で動かすのは不可能です。そこで、「月曜から金曜の夜21時にこのプログラムを動かす」といった予約をあらかじめ登録しておきます。これを自動で行うのがジョブ管理の基本です。
特に大切なのが、日付の感覚です。コンピュータにとって、今日が平日なのか、それともおめでたい祝日なのかは、教えてもらわないと分かりません。この「日付の判断」が、バッチ処理の運用管理において非常に重要なキーワードになります。
2. 休日・祝日対応が必要な理由
なぜ休日や祝日を特別に扱わなければならないのでしょうか。例えば、銀行のシステムを考えてみましょう。窓口が閉まっている日曜日には、窓口業務の集計処理をする必要がありません。逆に、一ヶ月の締め日である月末が日曜日の場合、その日の処理を金曜日に前倒しするか、月曜日に後ろ倒しするかを決めなければなりません。
このように、ビジネスのルール(業務要件)に合わせて、カレンダー上の日付とプログラムの動きを一致させることを休日対応と呼びます。これを間違えると、「給料日に給料が振り込まれない」といった社会的な大問題に発展してしまう可能性があるため、慎重な設計が求められます。
* プログラムの中で今日が営業日かどうかを判定する例
IF WS-HOLIDAY-FLG = "1" THEN
DISPLAY "本日は休日のため、主要なバッチ処理をスキップします。"
STOP RUN
ELSE
DISPLAY "営業日です。通常業務を開始します。"
END-IF.
3. 運用カレンダーと営業日の考え方
多くのシステムでは、独自に運用カレンダーというものを持っています。これは、一般的なカレンダーに「そのシステムにとっての仕事の日(営業日)」と「休みの日(非営業日)」を書き込んだものです。
例えば、土日祝日以外にも「創立記念日」や「年末年始」を休みに設定します。ジョブスケジューラはこのカレンダーを参照して、「今日は営業日だから動かそう」「今日は休みだから待機しよう」と判断します。未経験の方は、まず「コンピュータ専用の手帳がある」と考えてください。この手帳を最新の状態に保つことが、運用管理者の大切なお仕事の一つです。
4. 処理の「前倒し」と「後ろ倒し」
祝日があるときに必ず問題になるのが、本来その日にやるべきだった仕事をどうするかです。これには大きく分けて二つのパターンがあります。
- 前倒し(まえだおし): 休日の前の日に済ませておくこと。
- 後ろ倒し(うしろだおし): 休み明けの最初の営業日にまとめて行うこと。
例えば、25日が給料日で、もし25日が日曜日だったら、多くの会社では23日の金曜日に給料を振り込みますよね。これが「前倒し」です。逆に、電気代の引き落としなどは、休み明けの月曜日になる「後ろ倒し」が多いです。COBOLのプログラムでは、これらのパターンに対応できるように、複雑な日付計算が行われています。
* 給料日が休日の場合に前倒しの日付を計算するイメージ
IF PAY-DAY-TYPE = "HOLIDAY" THEN
SUBTRACT 1 FROM WS-TARGET-DATE
DISPLAY "前倒し実行日を計算しました:" WS-TARGET-DATE
END-IF.
5. 日次・週次・月次スケジュールの違い
バッチ処理には、動く頻度によっていくつかの種類があります。これらを組み合わせることで、効率的なスケジュールを組みます。
- 日次(にちじ): 毎日動く処理。売上の集計など。
- 週次(しゅうじ): 毎週特定の曜日に動く処理。在庫の棚卸しなど。
- 月次(げつじ): 毎月一度だけ動く重たい処理。一ヶ月の決算など。
月次処理はデータ量が非常に多いため、時間がかかります。もし月次処理の予定日が祝日と重なると、全体のスケジュールが狂ってしまうため、運用の担当者は数ヶ月前から「この祝日はどう乗り越えようか」と計画を立てるのです。これをスケジュール設計と呼びます。
6. 特殊なスケジュール!「第3火曜日」や「月末最終日」
ジョブスケジューラ(JP1やControl-Mなど)を使うと、非常に複雑な条件で予約を入れることができます。例えば、「毎月第3火曜日の夜だけ動かす」とか、「月末の最終営業日だけ動かす」といった設定です。
「月末」というのは、月によって30日だったり31日だったり、2月なら28日だったりするので、人間が設定するのは大変です。しかし、今のシステムは賢いので、「月の最後の日」を自動で見つけてくれます。こうした高度な機能を使いこなすことで、一年中ミスなくバッチ処理を動かし続けることが可能になります。
* 月末かどうかを判定して特別な処理を呼び出す例
IF WS-LAST-DAY-FLG = "Y" THEN
DISPLAY "月末最終営業日のため、月次締め処理を開始します。"
PERFORM MONTHLY-CLOSE-PROCESS
ELSE
DISPLAY "通常の日次処理を継続します。"
END-IF.
7. 祝日の急な変更への対応方法
数年に一度、法律の改正などで祝日が変わることがあります。そんなとき、運用の現場は大忙しになります。プログラムを書き換えるのではなく、先ほどお話しした「運用カレンダー」のデータを修正することで対応します。
もしカレンダーの修正を忘れてしまうと、本来動くべきではない祝日にプログラムが動いてしまい、誰もいないオフィスでエラーが起きて止まってしまうかもしれません。これを防ぐために、一年に一度、来年分のカレンダーを登録する作業が行われます。これをカレンダー保守と言います。地味な作業ですが、システムの安定稼働には欠かせない、守りの要です。
8. 日跨ぎ(ひまたぎ)処理の注意点
バッチ処理は夜の23時に始まって、終わるのが翌朝の2時になることがよくあります。これを日跨ぎ処理と呼びます。このとき、プログラムにとっての「今日」が23日のままなのか、それとも日付が変わって24日になるのかをはっきりさせておく必要があります。
多くのシステムでは、日付が変わっても処理が終わるまでは「業務上の日付(業務日付)」として、前日の日付を使い続けます。そうしないと、一つの集計の中で日付がバラバラになってしまうからです。初心者の皆さんは、パソコンの時計の日付と、システムが使っている日付は別物である場合がある、と覚えておくと良いでしょう。
* システム日付ではなく、管理用の業務日付を使用する例
ACCEPT WS-SYSTEM-DATE FROM DATE.
* 実際にはファイルから「現在の業務日付」を読み込んで使用することが多い
MOVE WS-BUSINESS-DATE TO DISPLAY-DATE.
DISPLAY "現在の業務日付で処理を実行中:" DISPLAY-DATE.
9. スケジュール管理が作るシステムの信頼性
ここまで見てきたように、COBOLのバッチ運用管理におけるスケジュール調整は、単なる時間指定以上の意味を持っています。それは、社会のルールや企業の活動リズムを、コンピュータの動きへと翻訳する作業です。休日や祝日の設定一つひとつに、利用者の生活を守るための工夫が詰まっています。
プログラミングが初めての方も、まずは「なぜこの日は休みなのか」「なぜこの日は前倒しなのか」という理由を考えることから始めてみてください。業務の流れを理解すれば、自然とスケジュール管理の重要性が見えてくるはずです。正確なカレンダーと正確なスケジュール。この二つが揃って初めて、COBOLシステムは真の力を発揮し、人々に信頼されるサービスとなるのです。