メニューボタン
サポートチーム便り2020.12.23

RPGプログラムで日付が前日になってしまうことがあります

Question

夜間に稼働するジョブで、月末等の処理量が多い日にRPGプログラムが時折前日の日付で処理をしてしまうことがあります。

これまで都度確認をして手動でデータを直して来ましたが、処理件数が多くとても大変です。

不具合の原因を特定して対処したいのですが、どの様な原因が考えられるのでしょうか。

RPGプログラムでは以下のステップで日付をセットしています。

フォルダ

Answer

処理量が多い日に起きてしまうとのことですので、不具合が出るのは日付を跨いで夜間ジョブが稼働している日では無いでしょうか。

以前、以下の記事でプログラムが使用する日付に「ジョブ日付」と「システム日付」が有ることをご紹介いたしました。

◆ジョブ日付とシステム日付について
https://www.e-bellnet.com/category/technology/1712/1712-147.html

今回の場合は予約語の*DATEをご利用されている為、ジョブ日付に初期値でセットされている"ジョブが稼働を始めた日付(=前日の日付)"で処理されてしまっていると想定出来ます。

※UDATEをご利用の場合PSDS(プログラム状況データ構造)内に定義されているプログラムが呼び出しされた日付を利用しますが、このプログラムが呼び出しされた日付もジョブ日付が基となっている為同様となります。

これに対する修正を行う場合、いくつかの方法がありますのでご紹介いたします。(RPGはILE(RPG Ⅳ)でのコーディングです)

  1. RPGプログラムを呼び出しているCLプログラムがある場合は、事前にジョブ日付をシステム日付に変更しておく。

    但し、これはRPGプログラムを呼び出す直前の日付がセットされます。

    ジョブ日付をシステム日付に変更した後に日付を跨ぐ様な場合には結果的に前日の日付のまま処理されてしまうので注意が必要です。

    フォルダ
  2. 日付タイプのフィールドを用意し、初期値としてシステム日付をセットしておく。

    但し、これはRPGプログラムが呼び出しされた時点のシステム日付がセットされます。

    このプログラムが実行されている間に日付を跨ぐ様な場合には結果的に前日の日付のまま処理されてしまうので注意が必要です。

    フォルダ
  3. TIME命令を使用する

    但し、戻り値の形式にいくつかの制約が有ります。

    結果を入れるフィールドの種類に依ってコーディングが変わりますので、日付、数値、文字毎に例をご案内いたします。

    結果を入れるフィールドが日付タイプの場合)

    この場合は単純にTIME命令の結果フィールドに指定するだけです。

    フォルダ

    結果を入れるフィールドが数字タイプの場合)

    TIME命令で"14桁:hhmmssDDDDDDDD"形式の値を一度取り出した後に、Z-ADD命令で目的のフィールドに加算します。

    右詰めで加算されますので、YYYYMMDDの場合は8桁、YYMMDDの場合は6桁、MMDDの場合は4桁等、目的の形式に合わせたフィールドをご指定ください。

    フォルダ

    結果を入れるフィールドが文字の場合)

    こちらも数字タイプと同様にTIME命令で"14桁:hhmmssDDDDDDDD"形式の値を一度取り出しますが、Z-ADD命令でゼロにして加算が出来ませんのでCLEAR命令でクリアした後にMOVE命令で転送します。

    右詰めで転送されますので、YYYYMMDDの場合は8桁、YYMMDDの場合は6桁、MMDDの場合は4桁等、目的の形式に合わせたフィールドをご指定ください。

    フォルダ

    以下の様にTIME命令の結果の目的の位置(YYYYMMDD)を指定して、MOVE命令の代わりにEVAL命令で代入することも可能です。

    フォルダ

この他、RPGプログラム内からCHGJOBのCLプログラムを呼び出したり、QCMDEXCを利用してCHGJOBを発行するのでは駄目なのかと思う方もいらっしゃると思いますが、ジョブ自体のジョブ日付を変更してもRPGプログラムが参照するのは"プログラムが呼び出しされた時点のジョブ日付"となりますので対応することが出来ません。

お客様の処理内容に依って、"ジョブが稼働した日"、"プログラムを実行した日"、"レコードを処理した日"等、扱う日付の要件も変わってくると思います。

適切な処理がされる様、どの段階での日付が必要なのかを十分にご検討のうえご参考にしていただければと思います。

【IBM Knowledge Center の参考URL】

◆ユーザー日付に関する規則
https://www.ibm.com/support/knowledgecenter/ja/ssw_ibm_i_73/rzasd/rudate.htm#rudate

◆TIME(時刻と日付の検索)
https://www.ibm.com/support/knowledgecenter/ja/ssw_ibm_i_73/rzasd/zztime.htm#zztime

◆プログラム状況データ構造
https://www.ibm.com/support/knowledgecenter/ja/ssw_ibm_i_73/rzasd/psdsdt9.htm

by なんちゃってエンジニア

あわせて読みたい記事

PAGE TOP