回答箱 No.148-1: 夜警カレンダー その2
        ◆ 質問箱 No.148 質問者: 西村 重幸  2004年05月 268号 P.14
            ◆ 質問箱 目次へ
No.148-1   夜警カレンダー その2 回答者
  高橋 周助
2004年09月
272号 P.21
□■□ 使い方
  1.  8月号の回答箱のプログラム(19ページ) <夜警班番号_3> を実行してください。「WK4」バインダーに、班番号が書き込まれた七曜表が出来ているはずです。1年間の班番号等データも、「WK3」バインダーに出来ていることを確認しておいてください。
  2.  8月号4ページのプログラム <祝日_長期一覧&#&"; を実行してください。「WK5」バインダーの1ページに「祝日_長期一覧」データが出来ているはずです。
  3.  8月号7ページのプログラム <年間休日決定> を実行してください。当然のことですが、この時の対象年は、(1)で指定した西暦年と一致していなければなりません。
     「WK7」バインダーの1ページに、対象年の休日データが出来ているはずです。
  4.  もし、上記休日データが、派遣要員の出勤日となるべき休日と違っていたら、8月号7ページの説明に沿って、年間休日の「追加」「取消」欄を修正してください。
  5.  下記のプログラム <派遣要員リスト> を実行してください。「WK7」バインダーの1ページに、仮の「派遣要員リスト」が出来ているはずです。要員名を実名に直してください。「要員No」は、0から始めてください。要員数が違っていたら、もちろん修正してください。
  6.  最後に、下記のプログラム <派遣要員書込> を実行してください。その結果、「WK4」バインダーの各ページに、派遣要員名が書き込まれます。「WK8」バインダーに、当該年一年間の派遣要員順の表も出来ているはずです。
     実行する前に、A-2ブロックのスタートの条件(派遣要員スタート年・月・日・派遣要員数・当該年初日の派遣要員番号)を確認して置いてください。当該年初日の派遣要員番号については、前年の最後に当たった要員の次の番号を指定します。
  7.  いったんスタートした要員スケジュールも、途中で変更したくなる時がいくらでも起きるでしょう。スケジュール再スタート時以前の名前は変更せずに、スタート時以降だけ変更したくなるでしょう。
     色々な条件で再書き込みするためのプログラムは、 <派遣要員書込> を適宜組み替えることによって可能なはずです。その時に、A〜Zの各ブロックごとに区切りをつけたプログラム構造が役立つはずです。
     各ブロックは出来るだけ他ブロックへの関連性を薄めて、独立性を強くしておくように心掛けました。
□■□ プログラム_その1
<派遣要員リスト>
SET;S;M;1;256;;Y;                                /*横桁数256桁に設定*/
O;派遣要員リスト;8;要員No.;8;派遣要員;;
  0;安芸田;1;山潟;2;福島;3;千葉;4;石川;5;永野;6;志賀;
  7;大坂;8;丘山;9;山口;10;隈元;11;宮崎;12;可児島;ESC;
CS;M;C1=C1;;A;WK7/D;                       /*「WK7」バインダーに保存*/
STOP;
□■□ プログラム_その2
<派遣要員書込>
        STEP OFF;  CLOSE;                   /*前歴の影響を消しておく*/
/****** A.条件設定 **************************************************/
    /*====== A-1. カレンダーを作りたい年============================*/
        SELECT [10,10],"対象年",X5,"2004","2005","2006","2007","2008";
          LET Z15=DCML(X5)+2003;                    /*対象年(西暦)*/
          LET Z16=Z15*10000+101;                        /*元日の日付*/
    /*====== A-2.スタートの条件 ====================================*/
        LET Z11=2004;                           /*派遣要員スタート年*/
        LET Z12=7;                              /*派遣要員スタート月*/
        LET Z13=24;                             /*派遣要員スタート日*/
        LET Z21=13;                                     /*派遣要員数*/
        LET Z22=0;                        /*当該年初日の派遣要員番号*/
    /*====== A-3.条件の正当性検査 ==================================*/
$検査:  LET Z14=DATE(Z11*10000+Z12*100+Z13,1,0);  /*スタート日の日付*/
          IF ERR(0)=0 THEN GOTO $B;
        DISP OPEN,[10,10],"スタート日は存在しません。";
        INPUT [10,12],"了解したらリターンキーを押して下さい。",V1;
        GOTO $終;                                           /*出口へ*/
/******* B.年間休日再決定 *******************************************/
$B:     G;WK6/1;
        FILL;;A;@決定 ;Y;                   /*休日決定フラグをクリア*/
        MPU;M;;@土日 =1 OR @祝日 =1 OR @追加 =1;1=@決定 ;E;Y;
                                                    /*休日決定フラグ*/
        MPU;M;;@取消 =1;" "=@決定 ;E;Y;       /*休日決定フラグ取消し*/
        P;WK6/1;ESC;
/******* C.休日のみ取り出し、派遣要員名を決定 ***********************/
        LET V14='"'+NUM$(Z14)+'"';         /*スタート日の日付 文字列*/
        CS;WK6/1;@決定 =1 AND @年月日 >=%V14;;A;; /*休日のみ取り出し*/
        INFO;S;40;  CF;@No.;8;  W;2;@No.;要員No.;ESC;
        NUM;M;C;@要員No. ;H;%Z22;1;               /*派遣要員番号決定*/
        CAL;@要員No. MOD %Z21=@要員No. ;          /*同上            */
        CS;M;C1=C1;;A;WK8/D;               /*「WK8」バインダーに登録*/
/******* D.月毎の処理12ヵ月分を繰り返す *****************************/
        FOR X1=1 TO 12;
          IF Z15=Z11 AND DCML(X1)<Z12 THEN CONTINUE;
                                  /*派遣要員スタート月以前はスキップ*/
    /*===== D-1.当月の条件を計算 ===================================*/
          LET Z22=Z15*10000+DCML(X1)*100+1;       /*当該月1日の日付*/
          LET Z23=DATENUM(Z22);               /*当該月1日の日付連番*/
          LET Z24=Z23 MOD 7;                      /*当該月1日の曜日*/
    /*===== D-2.当該月のデータのみ抽出して加工 =====================*/
          CS;WK3;@年 =%Z15;@月 =%X1;;A;;    /*当該月のデータのみ抽出*/
          INFO;S;256;                            /*横桁数256桁に変更*/
          CAM;M;WK8;@年月日 ;;@年月日 ;A;S@要員No. ;;;
                                              /*年間書込みデータ作成*/
          CAM;M;WK7/1;@要員No. ;;@要員No. ;A;S@派遣要員 ;;;   /*同上*/
          IF Z24=0 THEN GOTO $第何週;  /*当該月1日が日曜ならスキップ*/
          IR;S;H;%Z24;/*始めの行が日曜日に相当するようにダミー行挿入*/
$第何週:  NUM;M;C;@No. ;H;0;1;                   /*No.列に連番を記入*/
          CAL;DF0;@No. /7+1=@No. ;                  /*第何週かを記入*/
          IF Z24=0 THEN GOTO $D-3;  /*行挿入していなかったらスキップ*/
          DR;H,H+%Z24-1;Y;                  /*挿入したダミー行を削除*/
    /*===== D-3.七曜表へ書き込み ===================================*/
$D-3:     S;                          /*当該月データをサブバッファへ*/
          G;WK4/%X1;                      /*当該月のページを読み込む*/
          FOR X2={H} TO {T};
            IF {X2,@年月日 }<NUM$(Z14) THEN CONTINUE;
            LET X5=IVAL({X2,@No. })*4+2;    /*日付の書き込み先行番号*/
            LET X6=IVAL({X2,@曜 })*3+3;     /*日付の書き込み先列番号*/
            LET V1=" ";  LET V1={X2,@派遣要員 };  LET [X5,X6]=V1;
                                                  /*派遣要員名を記入*/
          NEXT;
    /*===== D-4.当該ページへ登録 ===================================*/
          P;WK4/%X1;ESC;                 /*「WK4」の当該ページに登録*/
        NEXT;
/******* Z.終 *******************************************************/
$終:    STEP OFF;  CLOSE;  STOP;          /*前歴の影響を消して、終了*/
回答箱のプログラムがプログラム集に収録されています。


このページのTOPへ戻る