RPG

275. RPG で曜日を算出するには ?

意外となかった「 RPG で曜日を算出する方法」について紹介する。
C言語でも曜日の算出はひとつの関数だけでは算出できないので
RPG で C言語の関数を組み込んで使うことはできない。
もちろん RPG で %WEEK なる組込み関数も用意されていないので
ここは自作ということになる。

RPG では %DATE という組込み関数はタイム・スタンプ形式の日付を
日付形式に変換し、%DIFF という組込み関数は日付形式どうしの
日数の差分を算出する、というふたつの組込み関数を使うことになる。

日本国内では日付というと 6桁 または 8桁 の数字を日付として
定義することが圧倒的に多いのだが実は IBM i の仕様では
日付形式というタイプ D の形式が用意されている。

( 詳細は RPG解説書の

を参照のこと)

【 サンプル・ソース: TESTWEEK 】
 
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 は、この原稿が書かれた日であり土曜日である。