回答箱 No.147-1: 町内会夜警カレンダーを作りたい
        ◆ 質問箱 No.147 質問者: 西村 重幸  2004年05月 268号 P.14
            ◆ 質問箱 目次へ
No.147-1   町内会夜警カレンダーを作りたい 回答者
  高橋 周助
2004年06月
269号 P.14
  1. プログラム中、ブロックAの変数Z15に、カレンダーを作りたい年の西暦を書き込んで、実行してください。例えば、2005年のカレンダーを作る場合は、次のように設定します。
            LET Z15=2005;
  2. 最終結果は、「WK3」バインダーの1〜12ページに登録されます。
  3. 三個のバインダー「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;          /*前歴の影響を消して、終了*/
回答箱のプログラムがプログラム集に収録されています。


このページのTOPへ戻る