対象期間の初日のデータ行が、必要であるにもかかわらず、存在しない場合は、作ってしまいます。対象期間前のデータが皆無の場合は、不必要と判断しました。
今回は、『級号』欄にデータが無い行は、目的の処理にとって意味がないと判断して、処理から除外しました。
このプログラムはプログラム集にテキストファイルがあります。
1 <RIREKI2> (第1案 できるだけPIPS的に)
2 LET X1=9; LET X2=12; LET X3=8; /* 適用日 */
3 LET X4=X1; LET X5= 4; LET X6=1; /* 対象期間初日 */
4 /********* B.『級号』欄にデータがある行のみを検索する。***************/
5 CS;DATA;@級号 ="=*?";;;WK/D; IF RESULT(1)=0 THEN GOTO $終わり;
6 /********* C. 対象期間の行のみを検索する。**************************/
7 CS;WK;@年 =%X4 & @月 >=%X5;;;WK2/D;
8 IF RESULT(1)=0 THEN GOTO $初日行;
9 G;WK2/1;
10 IF VAL([H,@月 ])=X5 & VAL([H,@日 ])=X6 THEN GOTO $新月額;
11 /********* D. 初日データの行がなければ、作る。************************/
12 $初日行:CS;WK;(@年 =%X4 & @月 <%X5) OR (@年 <%X4);;;WK3/D;
13 IF RESULT(1)=0 THEN GOTO $新月額;
14 G;WK3/E;
15 IF H=T THEN GOTO $単行; DR;H,T-1;Y;
16 $単行: LET [T,@年 ]=NUM$(X4);
17 LET [T,@月 ]=NUM$(X5);
18 LET [T,@日 ]=NUM$(X6);
19 P;WK2/N; LET X5=BINDER("WK2"); ARP;WK2;M;%X5;1;
20 /********* E. 新月額を書き込む。************************************/
21 $新月額:MPU;WK2;PAY9;@級号 ;;@級号 ;;S@月額 =@月額 ;E;Y;
22 /********* F. 事項・年・月・日 欄を書き替え。**************************/
23 FOR X11=1 TO BINDER("WK2");
24 G;WK2/%X11;
25 FOR X12=H TO T;
26 LET V21=[X12,@年 ]+"年"+[X12,@月 ]+"月"+[X12,@日 ]+"日";
27 LET [X12,@事項 ]="給与条例改定(平成"+V21+"から適用)";
28 LET [X12,@年 ]=NUM$(X1);
29 LET [X12,@月 ]=NUM$(X2);
30 LET [X12,@日 ]=NUM$(X3);
31 NEXT;
32 P;WK2/%X11;
33 NEXT;
34 /********* G. 元バインダへ アペンド *********************************/
35 APD;WK2;DATA;Y;
36 /********* Z. 終わり ***********************************************/
37 $終わり:STOP;
1 <RIREKI3> /* 第2案 シーケンシャルファイル処理風に */
2 /* 西村さんは、こちらの方がお好みかもしれません */
3
4 LET X1=9; LET X2=12; LET X3=8; /* 適用日 */
5 LET X4=X1; LET X5= 4; LET X6=1; /* 対象期間の初日 */
6 /***** B.『級号』欄にデータがある行のみを検索する。********************/
7 CS;DATA;@級号 ="=*?";;;WK/D; IF RESULT(1)=0 THEN GOTO $終;
8 /***** C. 対象期間かどうか判断 **************************************/
9 CLEAR V10,16;
10 FOR X11=BINDER("WK") TO 1 STEP -1;
11 G;WK/%X11;
12 FOR X12=T TO H STEP -1;
13 /****** C-A. 判断 *******************************************/
14 LET V13=[X12,@級号 ]; IF V13="" THEN CONTINUE;
15 LET V14=[X12,@年 ]; LET V15=[X12,@月 ]; LET V16=[X12,@日 ];
16 LET V10="期間前";
17 IF VAL(V14)=X4 & VAL(V15)=X5 & VAL(V16)=X6 THEN LET V10="初日";
18 IF VAL(V14)=X4 & VAL(V15)=X5 & VAL(V16)>X6 THEN LET V10="期間中";
19 IF VAL(V14)=X4 & VAL(V15)>X5 THEN LET V10="期間中";
20 IF VAL(V14)>X4 THEN LET V10="期間後";
21 LET [X12,@事項 ]=V10;
22 IF V10="初日" THEN BREAK;
23 IF V10<>"期間前" THEN CONTINUE;
24 /****** C-B. 初日データの行がないので、作る。******************/
25 LET [X12,@年 ]=NUM$(X4); LET [X12,@月 ]=NUM$(X5);
26 LET [X12,@日 ]=NUM$(X6); LET [X12,@事項 ]="初日"; BREAK;
27 NEXT;
28 P;WK/%X11;
29 IF V10="初日" OR V10="期間前" THEN BREAK;
30 NEXT;
31 /***** D. 新月額を書き込む。*****************************************/
32 CS;WK;@事項 ="初日" OR "期間中";;;WK2/D;
33 IF RESULT(1)=0 THEN GOTO $終;
34 MPU;WK2;PAY9;@級号 ;;@級号 ;;S@月額 =@月額 ;E;Y;
35 /***** E. 事項・年・月・日 欄を書き替え。*******************************/
36 FOR X11=1 TO BINDER("WK2");
37 G;WK2/%X11;
38 FOR X12=H TO T;
39 LET V21=[X12,@年 ]+"年"+[X12,@月 ]+"月"+[X12,@日 ]+"日";
40 LET [X12,@事項 ]="給与条例改定(平成"+V21+"から適用)";
41 LET [X12,@年 ]=NUM$(X1); LET [X12,@月 ]=NUM$(X2);
42 LET [X12,@日 ]=NUM$(X3);
43 NEXT;
44 P;WK2/%X11;
45 NEXT;
46 /***** F. 元バインダへ アペンド ***************************************/
47 APD;WK2;DATA;Y;
48 /***** Z. 終わり ****************************************************/
49 $終:STOP;
□