/// <summary>メンバーの連続稼動日数が※1の日数を超えていたら警告
        /// </summary>
        private void CheckContinuas()
        {
            CSchedule schedule = sdate[_member];

            if (schedule == null)
            {
                return;
            }
            CPattern pattern = schedule.Pattern;

            if (pattern == null || pattern.BuiltIn)
            {
                return;
            }

            // 休み設定
            int conu = _member.ContinuasInt;

            if (conu > 0)
            {
                int cont = sdate.GetMemberContinues(_member, conu * 2);
                int rest = conu - cont;
                if (rest <= 0)
                {
                    if (cont >= conu * 2)
                    {
                        AddItem(EEvaluationResult.ERROR, GenerateMessage(msg_cont_error, new string[] { _member.Name, (cont + 1).ToString() }));
                    }
                    else
                    {
                        AddItem(EEvaluationResult.WORNING, GenerateMessage(msg_cont_worning, new string[] { _member.Name, (cont + 1).ToString() }));
                    }
                }
            }
        }
Example #2
0
 /// <summary>値のセット
 /// </summary>
 /// <param name="sender">イベントの発生したオブジェクト</param>
 /// <param name="e">発生したイベント</param>
 private void BodyTable_CellValuePushed (object sender, DataGridViewCellValueEventArgs e) {
     CMember member = Members[e.RowIndex];
     switch (e.ColumnIndex) {
         case 0:
             break;
         case 1:
             if (this.TimeTable == null) return;
             CPattern pattern = e.Value as CPattern;
             if (pattern == CPattern.MULTI) return;
             foreach (DateTime date in Dates) {
                 if (date >= DateTime.Today) {
                     CScheduledDate sdate = this.TimeTable[date];
                     CSchedule sche = sdate[member];
                     sche.Pattern = pattern;
                 }
             }
             SetUpMember2Pattern(member);
             break;
         case 2:
             if (Dates.Count == 1 && StartDate >= DateTime.Today) {
                 string val = e.Value as string;
                 if (val == null) val = "";
                 if (this.TimeTable != null) {
                     DateTime date = StartDate;
                     CScheduledDate sdate = this.TimeTable[date];
                     CSchedule sche = sdate[member];
                     sche.Notes = val;
                     //sche.SetProperty("notes", val);
                     this.timeTable.NotifyScheduleEdited(sche);
                     SetUpMember2Pattern(member);
                 }
             }
             break;
     }
 }
Example #3
0
    private void loadData()
    {
        SqlDataSource sds = new SqlDataSource();

        sds.ConnectionString  = connectionString;
        sds.SelectCommand     = "dbo.getSchedules";
        sds.SelectCommandType = SqlDataSourceCommandType.StoredProcedure;
        DataView dv = sds.Select(DataSourceSelectArguments.Empty) as DataView;

        if (dv.Count > 0)
        {
            for (int i = 0; i < dv.Count; i++)
            {
                CSchedule schedule = new CSchedule();
                schedule.id         = (int)dv.Table.Rows[i]["ID_Schedule"];
                schedule.user_id    = dv.Table.Rows[i]["ID_User"].ToString();
                schedule.patient_id = dv.Table.Rows[i]["ID_Patient"].ToString();
                schedule.assess_id  = (int)dv.Table.Rows[i]["ID_Assess"];
                schedule.deadLine   = DateTime.Parse(dv.Table.Rows[i]["deadLine"].ToString());
                schedule.isFinished = (bool)dv.Table.Rows[i]["isFinished"];

                schedule.assess_name = assessFactoryLite.getById(schedule.assess_id).name;
                schedules.Add(schedule);
            }
        }
    }
        /// <summary>メンバーの作業時間の重複(エラー)または※2の時間を満たしていなければ警告
        /// </summary>
        private void CheckSpace()
        {
            CSchedule tsche = sdate[_member];
            CPattern  tpatt = tsche.Pattern;

            if (!(tpatt == null || tpatt.BuiltIn))
            {
                // 今日のシフトが存在する
                DateTime       today     = sdate.Date;
                DateTime       yesterday = today.AddDays(-1).Date;
                CScheduledDate ydate     = Root[yesterday];
                CSchedule      ysche     = ydate[_member];
                CPattern       ypatt     = ysche.Pattern;
                if (!(ypatt == null || ypatt.BuiltIn))
                {
                    // 昨日のシフトが存在する!
                    DateTime yend = yesterday + ypatt.End;
                    DateTime tend = yend + _member.Spacetime;
                    DateTime tstt = today + tpatt.Start;
                    if (yend >= tstt)
                    {
                        AddItem(EEvaluationResult.ERROR, GenerateMessage(msg_space_error, new string[] { _member.Name, tstt.ToString(), yend.ToString() }));
                    }
                    else if (tend > tstt)
                    {
                        AddItem(EEvaluationResult.WORNING, GenerateMessage(msg_space_worning, new string[] { _member.Name, tstt.ToString(), yend.ToString() }));
                    }
                }
            }
        }
        /// <summary>
        /// スケジュール日に設定されたパターンの一覧
        /// </summary>
        /// <returns>パターンのリスト</returns>
        private List <CPattern> GetDatePatterns()
        {
            List <CPattern> ret = new List <CPattern>();
            int             max = sdate.ValidMemberSize;

            for (int i = 0; i < max; i++)
            {
                CMember   member   = sdate.GetValidMember(i);
                CSchedule schedule = sdate[member];
                if (schedule != null)
                {
                    CPattern pattern = schedule.Pattern;
                    if (pattern == null || pattern.BuiltIn)
                    {
                    }
                    else
                    {
                        if (!ret.Contains(pattern))
                        {
                            ret.Add(pattern);
                        }
                    }
                }
            }
            ret.Sort(new PatternComparer1());
            return(ret);
        }
        /// <summary>
        /// メンバーの連続稼動日数が※1の日数を超えていたら警告
        /// </summary>
        private void CheckContinuas()
        {
            CSchedule schedule = sdate[_member];

            if (schedule == null)
            {
                return;
            }
            CPattern pattern = schedule.Pattern;

            if (pattern == null || pattern.BuiltIn)
            {
                return;
            }

            // 休み設定
            int conu = _member.ContinuasInt;

            if (conu > 0)
            {
                int cont = sdate.GetMemberContinues(_member, conu * 2);
                int rest = conu - cont;
                if (rest <= 0)
                {
                    if (cont >= conu * 2)
                    {
                        AddItem(EvaluationResult.ERROR, _member.Name + "の作業日が" + (cont + 1) + "日以上連続しています。");
                    }
                    else
                    {
                        AddItem(EvaluationResult.WARNING, _member.Name + "の作業日が" + (cont + 1) + "日連続しています。");
                    }
                }
            }
        }
Example #7
0
        /// <summary>勤務シフトの終了を返す
        /// </summary>
        /// <param name="date"></param>
        /// <param name="member"></param>
        /// <param name="head"></param>
        /// <returns></returns>
        private string ReturnPatternEnd(DateTime date, CMember member, bool head)
        {
            if (head)
            {
                return(member.Name + "のシフト終了");
            }
            CScheduledDate sdate   = TimeTable[date];
            CSchedule      schdule = sdate[member];

            if (schdule == null)
            {
                return("");
            }
            CPattern pattern = schdule.Pattern;

            if (pattern == null)
            {
                return("");
            }
            if (pattern.BuiltIn)
            {
                return("");
            }
            DateTime ret = date.Date + pattern.End;

            return(ret.ToLongDateString() + " " + ret.ToLongTimeString());
        }
Example #8
0
        /// <summary>勤務シフトの長さを返す
        /// </summary>
        /// <param name="date"></param>
        /// <param name="member"></param>
        /// <param name="head"></param>
        /// <returns></returns>
        private string ReturnPatternLength(DateTime date, CMember member, bool head)
        {
            if (head)
            {
                return(member.Name + "の勤務時間");
            }
            CScheduledDate sdate   = TimeTable[date];
            CSchedule      schdule = sdate[member];

            if (schdule == null)
            {
                return(TimeSpan.Zero.ToString());
            }
            CPattern pattern = schdule.Pattern;

            if (pattern == null)
            {
                return(TimeSpan.Zero.ToString());
            }
            if (pattern.BuiltIn)
            {
                return(TimeSpan.Zero.ToString());
            }
            return(pattern.Scope.ToString());
        }
        /// <summary>
        /// メンバーの作業時間の重複(エラー)または※2の時間を満たしていなければ警告
        /// </summary>
        private void CheckSpace()
        {
            CSchedule tsche = sdate[_member];
            CPattern  tpatt = tsche.Pattern;

            if (!(tpatt == null || tpatt.BuiltIn))
            {
                // 今日のパターンが存在する
                DateTime       today     = sdate.Date;
                DateTime       yesterday = today.AddDays(-1).Date;
                CScheduledDate ydate     = Root[yesterday];
                CSchedule      ysche     = ydate[_member];
                CPattern       ypatt     = ysche.Pattern;
                if (!(ypatt == null || ypatt.BuiltIn))
                {
                    // 昨日のパターンが存在する!
                    DateTime yend = yesterday + ypatt.End;
                    DateTime tend = yend + _member.Spacetime;
                    DateTime tstt = today + tpatt.Start;
                    if (yend >= tstt)
                    {
                        AddItem(EvaluationResult.ERROR, _member.Name + "の作業時間が重複しています。(" + tstt + "~" + yend + ")");
                    }
                    else if (tend > tstt)
                    {
                        AddItem(EvaluationResult.WARNING, _member.Name + "の作業間隔が不足しています。(" + yend + "~" + tstt + ")");
                    }
                }
            }
        }
Example #10
0
 /// <summary>メンバーの就業状態の作成
 /// </summary>
 /// <param name="member"></param>
 private void SetUpMember2Pattern (CMember member) {
     PatternWrapper wrapper = new PatternWrapper();
     wrapper.Pattern = CPattern.NULL;
     wrapper.StartTime = TimeSpan.MaxValue;
     wrapper.EndTime = TimeSpan.MinValue;
     if ((member == null) || (Dates.Count <= 0) || (TimeTable == null)) {
         // 存在しない
         if (member != null && Member2PatternWrapper.ContainsKey(member)) {
             Member2PatternWrapper.Remove(member);
         }
         return;
     } else {
         // 繰り返し
         int i = 0;
         foreach (DateTime date in Dates) {
             CScheduledDate sdate = TimeTable[date];
             CSchedule schedule = sdate[member];
             CPattern work = schedule.Pattern;
             if (i == 0) {
                 // 最初のシフト
                 wrapper.Pattern = work;
                 if (work != null && !work.BuiltIn) {
                     wrapper.StartTime = work.Start;
                     wrapper.EndTime = work.End;
                     i++;
                 }
                 wrapper.Notes = schedule.Notes;
                 //wrapper.Notes = schedule["notes"];
             } else if (wrapper.Pattern != work) {
                 if (schedule.Notes != "") {
                     // メモの追加
                     wrapper.Notes += "," + schedule.Notes;
                 }
                 // 複数選択されている
                 wrapper.Pattern = CPattern.MULTI;
                 if (work != null && !work.BuiltIn) {
                     if (wrapper.StartTime > work.Start) {
                         wrapper.StartTime = work.Start;
                     }
                     if (wrapper.EndTime < work.End) {
                         wrapper.EndTime = work.End;
                     }
                 }
                 i++;
             }
             
         }
         // 追加する
         if (Member2PatternWrapper.ContainsKey(member)) {
             Member2PatternWrapper[member] = wrapper;
         } else {
             Member2PatternWrapper.Add(member, wrapper);
         }
     }
 }
Example #11
0
 protected void ddlScheduleID_SelectedIndexChanged(object sender, EventArgs e)
 {
     if (ddlScheduleID.SelectedIndex != 0)
     {
         CSchedule schedule = scheduleFactory.getById(Convert.ToInt32(ddlScheduleID.SelectedItem.Text));
         ddlUserName.Text    = userFactory.getById(schedule.user_id).name;
         ddlPatientName.Text = patientFactory.getById(schedule.patient_id).name;
         ddlAssessName.Text  = schedule.assess_name;
         tbDeadLine.Text     = schedule.deadLine.ToShortDateString();
     }
 }
Example #12
0
        /// <summary>日付のロード
        /// </summary>
        public void LoadScheduledDate(XmlElement element, CTimeTable all)
        {
            DateTime       date          = DateTime.Parse(element.GetAttribute("date"));
            CScheduledDate scheduleddate = all.Dates.CreateScheduledDate(date);

            if (date.Year == 2007 && date.Month == 4 && date.Day == 28)
            {
                System.Console.WriteLine("ここだ!");
            }
            LoadTmElement(element, scheduleddate);
            XmlAttribute req = element.Attributes["require"];

            // 人員配置
            if (req != null)
            {
                int wid = int.Parse(req.Value);
                CRequirePatterns reqobj = all.Requires.GetByID(wid);
                scheduleddate.Require = reqobj;
            }
            else
            {
                scheduleddate.Require = CRequirePatterns.NULL;
            }
            XmlElement pNode = element.FirstChild as XmlElement;

            while (pNode != null)
            {
                if (pNode.Name == "schedule")
                {
                    // スケジュール
                    CSchedule schedule = scheduleddate.CreateSchedule();
                    LoadTmElement(pNode, schedule);
                    string membertxt = pNode.GetAttribute("member");
                    if (membertxt.Trim().Length > 0)
                    {
                        int memberid = int.Parse(membertxt);
                        if (memberid > 0)
                        {
                            schedule.Member = all.Members.GetByID(memberid);
                        }
                    }
                    string patterntxt = pNode.GetAttribute("pattern");
                    if (patterntxt.Trim().Length > 0)
                    {
                        int patternid = int.Parse(patterntxt);
                        schedule.Pattern = all.Patterns.GetByID(patternid);
                    }
                    scheduleddate.SetSchedule(schedule);
                }
                //
                pNode = pNode.NextSibling as XmlElement;
            }
            all.Dates.AddScheduleDate(scheduleddate);
        }
Example #13
0
    protected void btnDeleteSchedule_Click(object sender, EventArgs e)
    {
        if (ddlScheduleID.SelectedIndex != 0)
        {
            CSchedule schedule = new CSchedule();
            schedule.id = Convert.ToInt32(ddlScheduleID.SelectedItem.Text);

            scheduleFactory.deleteSchedule(schedule);
            Response.Redirect("schedule.aspx");
        }
    }
Example #14
0
        void workerLoad_DoWork(object sender, DoWorkEventArgs e)
        {
            UseWaitCursor = true;
            string _templatePath = AppDomain.CurrentDomain.BaseDirectory + "Template";

            string sFile = _templatePath + "\\" + System.Configuration.ConfigurationManager.AppSettings.Get("C1Template").ToString();

            using (CSchedule objSheet = new CSchedule(sFile, _Month, _RegionIdentifier))
            {
                sReturnFile = objSheet.RunPopulation();
            }
        }
        /// <summary>メンバーがこのパターンを含むかどうかチェックする
        /// </summary>
        private void CheckPattern()
        {
            CSchedule tsche = sdate[_member];
            CPattern  tpatt = tsche.Pattern;

            if (!(tpatt == null || tpatt.BuiltIn))
            {
                if (!_member.Contains(tpatt))
                {
                    AddItem(EEvaluationResult.NOTICE, GenerateMessage(msg_pattern_nomatch, new string[] { tpatt.Name, _member.Name }));
                }
            }
        }
Example #16
0
    protected void btnAddSchedule_Click(object sender, EventArgs e)
    {
        if (ddlUserName.SelectedIndex != 0 && ddlPatientName.SelectedIndex != 0 && ddlAssessName.SelectedIndex != 0)
        {
            CSchedule schedule = new CSchedule();
            schedule.user_id    = userFactory.getByName(ddlUserName.SelectedItem.Text).id;
            schedule.patient_id = patientFactory.getByName(ddlPatientName.SelectedItem.Text).id;
            schedule.assess_id  = assessFactory.getByName(ddlAssessName.SelectedItem.Text).id;
            schedule.deadLine   = Convert.ToDateTime(tbDeadLine.Text);

            scheduleFactory.addSchedule(schedule);
            Response.Redirect("schedule.aspx");
        }
    }
        /// <summary>メンバーの削除
        /// </summary>
        /// <param name="member">削除するメンバー</param>
        /// <param name="date">削除する日</param>
        public void ClearMember(CMember member, DateTime date)
        {
            CScheduledDate work = CreateScheduledDate(date);
            int            i    = schedules.BinarySearch(work);

            if (i < 0)
            {
                return;
            }
            for (int j = i; j < schedules.Count; j++)
            {
                CScheduledDate sdate    = schedules[j];
                CSchedule      schedule = sdate[member];
                schedule.Pattern = null;
            }
        }
Example #18
0
        /// <summary>
        /// パターンのメンバー数
        /// </summary>
        /// <param name="pattern">パターン</param>
        /// <returns>パターンに該当するメンバー数</returns>
        private int GetPatternMemberCount(CPattern pattern)
        {
            int ret = 0;
            int max = sdate.ValidMemberSize;

            for (int i = 0; i < max; i++)
            {
                CMember   member   = sdate.GetValidMember(i);
                CSchedule schedule = sdate[member];
                if (schedule.Pattern == pattern)
                {
                    ret++;
                }
            }
            return(ret);
        }
Example #19
0
    public void deleteSchedule(CSchedule schedule)
    {
        try
        {
            SqlDataSource sds = new SqlDataSource();
            sds.ConnectionString  = connectionString;
            sds.DeleteCommand     = "dbo.deleteSchedule";
            sds.DeleteCommandType = SqlDataSourceCommandType.StoredProcedure;
            sds.DeleteParameters.Add(new Parameter("ID_Schedule", DbType.Int32, schedule.id.ToString()));
            sds.Delete();

            message = "delete success";
        }
        catch (Exception ex)
        {
            message = ex.Message;
        }
    }
Example #20
0
        /// <summary>勤務シフト名を返す
        /// </summary>
        /// <param name="date"></param>
        /// <param name="member"></param>
        /// <param name="head"></param>
        /// <returns></returns>
        private string ReturnPatternName(DateTime date, CMember member, bool head)
        {
            if (head)
            {
                return(member.Name + "の勤務シフト");
            }
            CScheduledDate sdate   = TimeTable[date];
            CSchedule      schdule = sdate[member];

            if (schdule == null)
            {
                return("");
            }
            CPattern pattern = schdule.Pattern;

            if (pattern == null)
            {
                return("");
            }
            return(ConvertColumn(pattern.Name));
        }
Example #21
0
    public void addSchedule(CSchedule schedule)
    {
        try
        {
            SqlDataSource sds = new SqlDataSource();
            sds.ConnectionString  = connectionString;
            sds.InsertCommand     = "dbo.addSchedule";
            sds.InsertCommandType = SqlDataSourceCommandType.StoredProcedure;
            sds.InsertParameters.Add(new Parameter("ID_User", DbType.String, schedule.user_id));
            sds.InsertParameters.Add(new Parameter("ID_Patient", DbType.String, schedule.patient_id));
            sds.InsertParameters.Add(new Parameter("ID_Assess", DbType.Int32, schedule.assess_id.ToString()));
            sds.InsertParameters.Add(new Parameter("deadLine", DbType.Date, schedule.deadLine.ToShortDateString()));
            sds.Insert();

            message = "add success";
        }
        catch (Exception ex)
        {
            message = ex.Message;
        }
    }
Example #22
0
        /// <summary>
        /// メンバーごとのチェック
        /// </summary>
        private void CheckMembers()
        {
            int j = sdate.ValidMemberSize;

            for (int i = 0; i < j; i++)
            {
                CSchedule schedule = sdate[i];
                CMember   member   = schedule.Member;
                if (_memItems.ContainsKey(member))
                {
                    Evaluation1Day1Member work = _memItems[member];
                    work.Check();
                }
                else
                {
                    Evaluation1Day1Member work = new Evaluation1Day1Member(this, member);
                    _memItems.Add(member, work);
                    work.Check();
                }
            }
        }
Example #23
0
 /// <summary>日付のセーブ
 /// </summary>
 public void SaveScheduledDate(XmlDocument doc, XmlElement rNode, CTimeTable all)
 {
     for (int i = 0; i < all.Size(); i++)
     {
         bool           edited = false;
         CScheduledDate sdate  = all[i];
         XmlElement     pNode  = doc.CreateElement("scheduleddate");
         SaveTmElement(doc, pNode, sdate);
         // 日付がもっとも大事?
         pNode.SetAttribute("date", sdate.Date.ToString(CSaver.DATEFORMAT));
         // 人員配置
         if (sdate.Require != null && sdate.Require != CRequirePatterns.NULL)
         {
             pNode.SetAttribute("require", sdate.Require.ObjectID.ToString());
             if (sdate.Require != all.GetDefaultRequire(sdate.Date.DayOfWeek))
             {
                 edited = true;
             }
         }
         // メンバーごとのスケジュール(シフトとメモ)
         for (int j = 0; j < sdate.ValidMemberSize; j++)
         {
             CSchedule  schedule = sdate[j];
             XmlElement nNode    = doc.CreateElement("schedule");
             SaveTmElement(doc, nNode, schedule);
             if ((schedule.Member != null && schedule.Member != CMember.NULL && schedule.Pattern != null && schedule.Pattern != CPattern.NULL) || (schedule.Notes.Trim() != ""))
             {
                 nNode.SetAttribute("member", schedule.Member.ObjectID.ToString());
                 nNode.SetAttribute("pattern", schedule.Pattern.ObjectID.ToString());
                 edited = true;
                 pNode.AppendChild(nNode);
             }
         }
         if (edited)
         {
             // 変更されている場合のみ
             rNode.AppendChild(pNode);
         }
     }
 }
Example #24
0
 /// <summary>勤務シフトの完全削除
 /// </summary>
 /// <param name="pattern">削除するシフト</param>
 /// <param name="complete">完全に削除するかどうか</param>
 public virtual void  DelPattern(CPattern pattern, bool complete)
 {
     if (!complete)
     {
         DelPattern(pattern);
     }
     else
     {
         // 完全に削除する
         if (pattern.Removed != null)
         {
             patterns.Remove(pattern);
             // スケジュールから削除
             int sz = parent.Size();
             for (int i = 0; i < sz; i++)
             {
                 CScheduledDate wkDate = parent[i];
                 int            sz2    = wkDate.ValidMemberSize;
                 for (int j = 0; j < sz2; j++)
                 {
                     CSchedule scd = wkDate[j];
                     if (scd != null)
                     {
                         CPattern pat = scd.Pattern;
                         if (pat != null && pat.Equals(pattern))
                         {
                             scd.Pattern = CPattern.NULL;
                         }
                     }
                 }
             }
             if (TimeTable != null)
             {
                 TimeTable.NotifyPatternsEdited(EnumTimeTableElementEventTypes.ElementRemovedForce, pattern);
             }
         }
     }
 }
        /// <summary>値設定
        /// </summary>
        /// <param name="sender">イベントの発生したオブジェクト</param>
        /// <param name="e">発生したイベント</param>
        private void CalenderView_CellValuePushed(object sender, DataGridViewCellValueEventArgs e)
        {
            if (TimeTable == null)
            {
                return;
            }
            DateTime date = GetDateFromRowIndex(e.RowIndex);

            if (e.ColumnIndex == 0)
            {
                // 日付
                //e.Value = date;
            }
            else
            {
                CScheduledDate sdate = TimeTable[date];
                if (e.ColumnIndex == 1)
                {
                    // 人員配置
                    sdate.Require = e.Value as CRequirePatterns;
                }
                else
                {
                    // メンバー||シフト
                    int index = e.ColumnIndex - 2;
                    if (index < columns1.Count)
                    {
                        ShiftComboBoxColumn col    = columns1[index];
                        CMember             member = col.Member;
                        if (member != null)
                        {
                            CSchedule schedule = sdate[member];
                            schedule.Pattern = e.Value as CPattern;
                        }
                    }
                }
            }
        }
 /// <summary>
 /// コンストラクタ
 /// </summary>
 /// <param name="param"></param>
 public EScheduleEditedEventArgs(CSchedule param)
 {
     this.schedule = param;
 }
Example #27
0
        /// <summary>印刷・ボディ部分
        /// </summary>
        /// <param name="g">グラフィックスオブジェクト</param>
        /// <param name="e">イベント</param>
        protected virtual void PaintBody(Graphics g, System.Drawing.Printing.PrintPageEventArgs e)
        {
            //Graphics g = e.Graphics;
            Rectangle  mar = e.MarginBounds;
            RectangleF rect;

            #region 内部の箱
            {
                float itop    = mar.Top + Header.GetHeight(g);
                float ibottom = mar.Bottom - Footer.GetHeight(g) - 2;
                float iheight = ibottom - itop;
                float ileft   = mar.Left;
                float iwidth  = mar.Width;
                float iright  = ileft + iwidth;
                rect = new RectangleF(ileft, itop, iwidth, iheight);
            }
            #endregion
            //
            g.DrawRectangle(this.Pen, rect.Left, rect.Top, rect.Width, rect.Height);
            //
            CPageIndex page = pages[index];
            // 決め打ちできる罫線を引く
            float DateRight = rect.Left + RequireColumnWidth;
            g.DrawLine(this.Pen, DateRight, rect.Top, DateRight, rect.Bottom);
            DrawString(g, "日付", HeaderFont, HeaderBrush, rect.Left, DateRight, rect.Top, tableHeaderHight, EPrintMargin.MARGIN_CENTER, EPrintMargin.MARGIN_CENTER);
            float RequireRight = DateRight;
            if (IsDisplayRequire)
            {
                RequireRight += RequireColumnWidth;
                g.DrawLine(this.Pen, RequireRight, rect.Top, RequireRight, rect.Bottom);
                DrawString(g, "人員配置", HeaderFont, HeaderBrush, DateRight, RequireRight, rect.Top, tableHeaderHight, EPrintMargin.MARGIN_CENTER, EPrintMargin.MARGIN_CENTER);
            }
            // テーブルのヘッダ
            float TableHeadBottom = rect.Top + TableHeaderHight;
            g.DrawLine(this.Pen, rect.Left, TableHeadBottom, rect.Right, TableHeadBottom);
            // メンバー数に応じた罫線を引く
            float MemberColumnBase  = (IsDisplayRequire ? RequireRight : DateRight);
            float MemberColumnSpace = rect.Right - MemberColumnBase;
            float MemberColumnWidth = MemberColumnSpace / page.MemberCount;
            for (int i = 1; i < page.MemberCount; i++)
            {
                float WorkLeft  = MemberColumnBase + MemberColumnWidth * (i - 1);
                float WorkRight = MemberColumnBase + MemberColumnWidth * i;
                g.DrawLine(this.Pen, WorkRight, rect.Top, WorkRight, rect.Bottom);
            }
            // メンバー名
            for (int i = 0; i < page.MemberCount; i++)
            {
                float WorkLeft  = MemberColumnBase + MemberColumnWidth * i;
                float WorkRight = MemberColumnBase + MemberColumnWidth * (i + 1);
                //
                CMember member = this.TimeTable.Members[page.MemberStartIndex + i];
                DrawString(g, member.Name, HeaderFont, HeaderBrush, WorkLeft, WorkRight, rect.Top, tableHeaderHight, EPrintMargin.MARGIN_CENTER, EPrintMargin.MARGIN_CENTER);
            }
            // 日数に応じた罫線を引く
            float DateRowSpace  = rect.Bottom - TableHeadBottom;
            float DateRowHeight = DateRowSpace / page.DateCount;
            for (int i = 1; i < page.DateCount; i++)
            {
                float WorkTop    = TableHeadBottom + DateRowHeight * (i - 1);
                float WorkBottom = TableHeadBottom + DateRowHeight * i;
                g.DrawLine(this.Pen, rect.Left, WorkBottom, rect.Right, WorkBottom);
            }
            // これこそ本体
            DateTime WorkDate = page.Start;
            for (int i = 0; i < page.DateCount; i++)
            {
                float WorkTop    = TableHeadBottom + DateRowHeight * i;
                float WorkBottom = TableHeadBottom + DateRowHeight * (i + 1);
                // 日付
                DrawString(g, WorkDate.ToString(DateFormat), System.Windows.Forms.Control.DefaultFont, Brushes.Black, rect.Left, DateRight, WorkTop, DateRowHeight, EPrintMargin.MARGIN_CENTER, EPrintMargin.MARGIN_CENTER);
                // スケジュール日
                CScheduledDate sdate = this.TimeTable[WorkDate];
                if (IsDisplayRequire)
                {
                    if (sdate.Require != null)
                    {
                        DrawString(g, sdate.Require.Name, BodyFont, BodyBrush, DateRight, RequireRight, WorkTop, DateRowHeight, EPrintMargin.MARGIN_CENTER, EPrintMargin.MARGIN_CENTER);
                    }
                }
                // シフト
                for (int j = 0; j < page.MemberCount; j++)
                {
                    float WorkLeft  = MemberColumnBase + MemberColumnWidth * j;
                    float WorkRight = MemberColumnBase + MemberColumnWidth * (j + 1);
                    //
                    CMember   member   = this.TimeTable.Members[page.MemberStartIndex + j];
                    CSchedule schedule = sdate[member];
                    CPattern  pattern  = (schedule != null ? schedule.Pattern : null);
                    if (pattern != null)
                    {
                        DrawString(g, pattern.Name, BodyFont, BodyBrush, WorkLeft, WorkRight, WorkTop, DateRowHeight, EPrintMargin.MARGIN_CENTER, EPrintMargin.MARGIN_CENTER);
                    }
                }
                //
                WorkDate = WorkDate.AddDays(1);
            }
            //
            e.HasMorePages = page.HasMorePage;
            //
            index++;
        }