意外となかった「 RPG で曜日を算出する方法」について紹介する。
C言語でも曜日の算出はひとつの関数だけでは算出できないので
RPG で C言語の関数を組み込んで使うことはできない。
もちろん RPG で %WEEK
なる組込み関数も用意されていないので
ここは自作ということになる。
RPG では %DATE
という組込み関数はタイム・スタンプ形式の日付を
日付形式に変換し、%DIFF
という組込み関数は日付形式どうしの
日数の差分を算出する、というふたつの組込み関数を使うことになる。
日本国内では日付というと 6桁
または 8桁
の数字を日付として
定義することが圧倒的に多いのだが実は IBM i の仕様では
日付形式というタイプ D
の形式が用意されている。
( 詳細は RPG解説書の
0001.00 H DFTNAME(CRTEXDSPF) DATEDIT(*YMD/) BNDDIR('QC2LE') 0002.00 F********** 曜日を算出する ******************************************** 0003.00 F* 0004.00 F********************************************************************** 0005.00 0006.00 D WKR S 4A DIM(7) CTDATA PERRCD(7) 0007.00 D WEK S 5I 0 0008.00 D DATEIN S D 0009.00 D NBRDAYS S 10I 0 0010.00 D MONDAY C CONST(D'2001-01-07') 0011.00 D DAY S 4A 0012.00 0013.00 /FREE 0014.00 DATEIN = %DATE('2017-04-01'); 0015.00 NBRDAYS = %DIFF(DATEIN:MONDAY:*DAYS); 0016.00 WEK = %REM(NBRDAYS:7) + 1; 0017.00 DAY = WKR(WEK); 0018.00 /END-FREE 0019.00 C 'DAY=' CAT(P) DAY:0 DSP40 40 0020.00 C DSP40 DSPLY ANS 1 0021.00 C SETON LR 0022.00 C RETURN 0023.00 ** WKR -- 以下は配列 -- 0024.00 日 月 火 水 木 金 土
このサンプル・プログラムでは 2017/04/01
の曜日を求めている。
原理は 2001/01/07
との差を計算して 7
で剰余した余りを曜日配列の指標に
応用している。
原理的には、いかにも RPG による方法であり理解しやすいと思う。
ちなみに 2017/04/01
は、この原稿が書かれた日であり土曜日
である。