-
プログラム中、ブロックAの変数Z15に、カレンダーを作りたい年の西暦を書き込んで、実行してください。例えば、2005年のカレンダーを作る場合は、次のように設定します。
LET Z15=2005; - 最終結果は、「WK3」バインダーの1〜12ページに登録されます。
- 三個のバインダー「WK1」・「WK2」・「WK3」を使います。同名のバインダーが存在していても、いなくてもかまいませんが、上書きしてしまうので、大切なデータであれば、退避してから実行してください。
<夜警班番号> STEP OFF; CLOSE; /*前歴の影響を消しておく*/ /****** A.条件設定 **************************************************/ /*====== A-1. カレンダーを作りたい年============================*/ LET Z15=2004; /*西暦で指定すること*/ LET Z16=Z15*10000+101; /*元日の日付*/ /*====== A-2.スタートの条件 ====================================*/ LET Z11=2004; /*夜警スタート年*/ LET Z12=5; /*夜警スタート月*/ LET Z13=30; /*夜警スタート日*/ /*====== A-3.条件の正当性検査 ==================================*/ $検査1: LET Z14=DATE(Z11*10000+Z12*100+Z13,1,0); /*スタート日の日付*/ IF ERR(0)=0 THEN GOTO $検査2; DISP OPEN,[10,10],"スタート日は存在しません。"; INPUT [10,12],"了解したらリターンキーを押して下さい。",V1; GOTO $終; /*出口へ*/ $検査2: IF Z15>=Z11 THEN GOTO $B; DISP OPEN,[10,10],"スタート日以降の年を指定して下さい。"; INPUT [10,12],"了解したらリターンキーを押して下さい。",V1; GOTO $終; /*出口へ*/ /******* B.班番号決定 ***********************************************/ /*====== B-1.年間データ書き込み用空表を作成 ====================*/ $B: SET;S;M;1;36;;Y; /*横桁数36桁に設定*/ O;夜警班番号;6;No.;16;年月日;2;曜;8;班番号;;ESC; ATR;N;D;@年月日 ; /*年月日列に日付属性を設定*/ IR;S;H;394; /*空行を394行作成*/ /*====== B-2.各列を完成 ========================================*/ NUM;M;C;@年月日 ;H;%Z16;1; /*年月日列に日付連番を記入*/ CAL;@年月日 MOD 7=@曜 ; /*曜列に曜日連番を記入*/ LET Z1=DATE(Z14,Z16); /*スタート日から元日までの経過日数*/ NUM;M;C;@No. ;H;%Z1;1; /*No.列に番号を記入*/ CS;M;@No. >=0;;A;; /*スタート日以前の行を削除*/ CAL;DF0;@No. /7=@班番号 ; /*班番号算出の前半計算式*/ CAL;(@班番号 +@No. ) MOD 7+1=@班番号 ; /*算出の後半計算式*/ /*====== B-3.「WK1」バインダーに保存 ===========================*/ CS;M;C1=C1;;A;WK1/D; /*WK1バインダーの有無に関係なく保存可能*/ /******* C.月別処理 *************************************************/ /*===== C-1.最終結果保存用バインダー12頁分を確保 ===============*/ IF NAME(3,"WK3")=0 THEN GOTO $頁確保; BIND;D;WK3;Y; $頁確保:CLM;ダミー;Y; MB;WK3;; MP;WK3;11;; /*===== C-2.月毎の処理12ヵ月分を繰り返す =======================*/ FOR X1=1 TO 12; IF Z15=Z11 AND DCML(X1)<Z12 THEN CONTINUE; /*スタート月以前はスキップ*/ /*--- C-2-a.当月の条件を計算 --------------------------------*/ LET Z22=Z15*10000+DCML(X1)*100+1; /*当該月1日の日付*/ LET Z23=DATENUM(Z22); /*当該月1日の日付連番*/ LET Z24=Z23 MOD 7; /*当該月1日の曜日*/ LET Z25=MDATE(Z22,0,99); /*当該月末日の日付*/ /*--- C-2-b.当該月用の表を準備 ------------------------------*/ SET;S;M;1;36;;Y; /*横桁数36桁に設定*/ O;%Z15年%X1月;4;日 ;16;年月日;2;曜;4;曜日;;ESC; ATR;N;D;@年月日 ; /*年月日列に日付属性を設定*/ LET Z1=DATE(Z22,Z25)+1; IR;S;H;%Z1;/*当該月の日数分の空行*/ NUM;M;C;@年月日 ;H;%Z22;1;/*年月日列に当該月の日付連番記入*/ /*--- C-2-c.「wk1」バインダーから班番号列を読み取る ---------*/ CAM;M;WK1/1;@年月日 ;;@年月日 ; @日 ;@年月日 ;S@班番号 ;@曜 ;@曜日 ;;; /*--- C-2-d.表の行数を42行にする --------------------------*/ NUM;M;C;@日 ;H;1;1; /*日列に連番(=暦の日付)を記入*/ $始空行: IF Z24=0 THEN GOTO $終空行; IR;S;H;%Z24; /*始めの行が日曜日に相当するように*/ $終空行: IR;S;T+1;%(41-T+H); /*終わりの行が土曜日に相当するように*/ /*--- C-2-e.表を「wk2」に保存 -------------------------------*/ $登録: CS;M;C1=C1;;A;WK2/D; /*====== C-3.カレンダー作成 ====================================*/ G;WK2/1; S; /*当該月データをサブバッファへ*/ /*--- C-3-a.空の七曜表(横書き用)空表を作成 ----------------*/ SET;S;M;1;256;;; /*横桁数256桁に指定*/ O;%Z15年%X1月カレンダー;4;;ESC; IR;S;H;7; /*7行の空行挿入*/ /*--- C-3-b.当該月データを七曜表(横書き用)へ転記 ----------*/ FOR X2=1 TO 6; IC;S;N;2;;ESC; /*暦の日付を記入する列を作る*/ CPB;SH,@日 ;SH+6,@日 ;H,T;; /*サブバッファの日付を転記*/ IC;S;N;4;;ESC; /*班番号を記入する列を作る*/ CPB;SH,@班番号 ;SH+6,@班番号 ;H,T;; /*サブの班番号を転記*/ S; DR;H,H+6;Y; S; /*サブバッファの1週間分を削除*/ NEXT; /*--- C-3-c.整形_その1 -------------------------------------*/ FOR X2=1 TO 7; IR;S;%(H+X2*2-1);1; /*一行毎に空行を挿入*/ NEXT; ROLL;3/5/7/9/11/13;A;-1; /*班番号を1行下にずらす*/ SRC; /*行と列を入れ替え*/ ATR;P;L;A; /*全列を左詰めにする*/ /*--- C-3-d."班"の文字を書き込む ----------------------------*/ FOR X3=3 TO T STEP 2; FOR X2=H+1 TO T STEP 2; IF [X2,X3]<>"" THEN LET [X2,X3]=[X2,X3]+"班"; NEXT; NEXT; /*--- C-3-e."日月火水木金土"を書き込み、整形_その2 ---------*/ WR;H-2;2;日;;月;;火;;水;;木;;金;;土;ESC; /*曜記入*/ DC;1;Y; /*不要になった第1列を削除*/ SIZE;M;150;; /*ページ幅150桁確保*/ DRL;R;6/8/10/12/14; /*横罫線を引く*/ DRL;C;1/3/5/7/9/11/13; /*縦罫線を引く*/ DRL;C;N; /*縦罫線を引く*/ /*--- C-3-f.結果を当該ページに保存 --------------------------*/ P;WK3/%X1;ESC; NEXT; /******* Z.終 *******************************************************/ $終: STEP OFF; CLOSE; STOP; /*前歴の影響を消して、終了*/
回答箱のプログラムがプログラム集に収録されています。 |
□