Example #1
0
        /// <summary>
        /// 連勤情報を確認して各種プロパティを変更する
        /// </summary>
        /// <returns></returns>
        public void ChangeContinueWork()
        {
            int       iContinueStartDay;
            int       iContinueEndDay;
            int       iTargetWorkKind = 0;
            int       iBeforeMonthTargetDayCount; // Add WataruT 2020.08.14 連勤チェックで前月末データも対象とする
            string    strTargetBeforeMonth;       // Add WataruT 2020.08.14 連勤チェックで前月末データも対象とする
            DataTable dtScheduleDetail;           // Add WataruT 2020.08.14 連勤チェックで前月末データも対象とする

            // Add Start WataruT 2020.08.14 連勤チェックで前月末データも対象とする
            // 前月を取得
            strTargetBeforeMonth = DateTime.ParseExact(frmMainSchedule.pstrTargetMonth + "01", "yyyyMMdd", null).AddMonths(-1).ToString("yyyyMM");
            // Add End   WataruT 2020.08.14 連勤チェックで前月末データも対象とする

            // 連勤チェック
            for (int iScheduleStaff = 0; iScheduleStaff < frmMainSchedule.astrScheduleStaff.GetLength(0); iScheduleStaff++)
            {
                // 開始日を初期化
                iContinueStartDay = 0;

                // Add Start WataruT 2020.08.14 連勤チェックで前月末データも対象とする
                // 対象日数を初期化
                iBeforeMonthTargetDayCount = 0;

                // 前月のデータを取得
                dtScheduleDetail = clsDatabaseControl.GetScheduleDetail_Ward_Staff_StaffKind_TargetMonth(frmMainSchedule.cmbWard.SelectedValue.ToString(),
                                                                                                         frmMainSchedule.astrScheduleStaff[iScheduleStaff, 0], frmMainSchedule.pstrStaffKind, strTargetBeforeMonth);
                // 前月末のデータがあればカウント
                if (dtScheduleDetail.Rows.Count >= 5)
                {
                    for (int iDay = dtScheduleDetail.Rows.Count - 5; iDay < dtScheduleDetail.Rows.Count; iDay++)
                    {
                        // 連勤対象となる勤務種類か判定
                        switch ((int.Parse(dtScheduleDetail.Rows[iDay]["work_kind"].ToString()) - 1).ToString())
                        {
                        // 以下の勤務種類は連勤対象とする
                        case "0":       // 日勤
                        case "1":       // 夜勤
                        case "2":       // 夜明
                        case "4":       // 公休(午前)
                        case "5":       // 公休(午後)
                        case "7":       // 有休(午前)
                        case "8":       // 有休(午後)
                        case "10":      // 遅出
                        case "17":      // 5.25
                        case "18":      // 2
                        case "19":      // 6
                        case "20":      // 6.25
                        case "21":      // 7
                        case "22":      // 遅刻
                        case "23":      // 早退
                            iBeforeMonthTargetDayCount += 1;
                            break;

                        default:
                            iBeforeMonthTargetDayCount = 0;
                            break;
                        }
                    }
                }
                // Add End   WataruT 2020.08.14 連勤チェックで前月末データも対象とする

                for (int iDay = 0; iDay < frmMainSchedule.piDayCount; iDay++)
                {
                    for (int iWorkKind = 0; iWorkKind < frmMainSchedule.astrWorkKind.GetLength(0); iWorkKind++)
                    {
                        // 対象日の勤務種類を取得
                        if (frmMainSchedule.aiData[iScheduleStaff, iDay, iWorkKind] == 1)
                        {
                            iTargetWorkKind = iWorkKind;
                            break;
                        }
                    }

                    // 連勤対象となる勤務種類か判定
                    switch (iTargetWorkKind.ToString())
                    {
                    // 以下の勤務種類は連勤対象とする
                    case "0":       // 日勤
                    case "1":       // 夜勤
                    case "2":       // 夜明
                    case "4":       // 公休(午前)
                    case "5":       // 公休(午後)
                    case "7":       // 有休(午前)
                    case "8":       // 有休(午後)
                    // Add Start WataruT 2020.07.30 遅出の表示対応
                    case "10":      // 遅出
                    // Add End WataruT 2020.07.30 遅出の表示対応
                    // Add Start WataruT 2020.07.22 特定の時短勤務用の項目追加
                    case "17":      // 5.25
                    // Add End   WataruT 2020.07.22 特定の時短勤務用の項目追加
                    // Add Start WataruT 2020.07.27 特定の時短勤務用の項目追加
                    case "18":      // 2
                    case "19":      // 6
                    case "20":      // 6.25
                    case "21":      // 7
                    // Add End   WataruT 2020.07.27 特定の時短勤務用の項目追加
                    // Add Start WataruT 2020.08.06 遅刻・早退入力対応
                    case "22":      // 遅刻
                    case "23":      // 早退
                    // Add End   WataruT 2020.08.06 遅刻・早退入力対応
                    // Add Start WataruT 2020.09.02 時間数の項目を作成
                    case "24":
                    case "25":
                    case "26":
                    case "27":
                    case "28":
                    case "29":
                    case "30":
                    case "31":
                    case "32":
                    case "33":
                    case "34":
                    case "35":
                    case "36":
                    case "37":
                    case "38":
                    case "39":
                    case "40":
                    case "41":
                    case "42":
                    case "43":
                    case "44":
                    case "45":
                    case "46":
                    case "47":
                    case "48":
                    case "49":
                    case "50":
                    case "51":
                    case "52":
                    case "53":
                    case "54":
                        // Add End   WataruT 2020.09.02 時間数の項目を作成
                        break;

                    default:
                        // 終了日をセット
                        iContinueEndDay = iDay - 1;

                        // 6連勤以上であれば背景色を変更する
                        // Mod Start WataruT 2020.08.14 連勤チェックで前月末データも対象とする
                        //if (iContinueEndDay - iContinueStartDay >= 5)
                        if (iContinueEndDay - iContinueStartDay + iBeforeMonthTargetDayCount >= 5)
                        // Mod End   WataruT 2020.08.14 連勤チェックで前月末データも対象とする
                        {
                            for (int iChangeDay = iContinueStartDay; iChangeDay <= iContinueEndDay; iChangeDay++)
                            {
                                frmMainSchedule.grdMain[iChangeDay + 1, iScheduleStaff].Style.BackColor = Color.Red;
                            }
                        }

                        // Add Start WataruT 2020.08.14 連勤チェックで前月末データも対象とする
                        // 前月のカウントは初期化
                        iBeforeMonthTargetDayCount = 0;
                        // Add End   WataruT 2020.08.14 連勤チェックで前月末データも対象とする

                        // 開始日を初期化
                        iContinueStartDay = iDay + 1;

                        break;
                    }
                }
            }

            frmMainSchedule.grdMain.Refresh();

            System.Threading.Thread.Sleep(2000);

            // デザイン設定(列:日付)
            for (int i = 1; i <= frmMainSchedule.piDayCount; i++)
            {
                // 文字色、背景色
                for (int i2 = 0; i2 < frmMainSchedule.piScheduleStaffCount; i2++)
                {
                    frmMainSchedule.grdMain[i, i2].Style.ForeColor = clsCommonControl.GetWorkKindForeColor(frmMainSchedule.grdMain[i, i2].Value.ToString());
                    frmMainSchedule.grdMain[i, i2].Style.BackColor = clsCommonControl.GetWeekNameBackgroundColor(
                        clsCommonControl.GetWeekName(frmMainSchedule.pstrTargetMonth + String.Format("{0:D2}", i), frmMainSchedule.astrHoliday));
                }
            }

            // 希望シフトのセルのみ太文字にして背景色も変更する
            for (int iDay = 0; iDay < frmMainSchedule.grdMain.ColumnCount - 1; iDay++)
            {
                for (int iScheduleStaff = 0; iScheduleStaff < frmMainSchedule.grdMain.RowCount; iScheduleStaff++)
                {
                    if (frmMainSchedule.aiDataRequestFlag[iScheduleStaff, iDay] == 1)
                    {
                        frmMainSchedule.grdMain[iDay + 1, iScheduleStaff].Style.Font      = new Font(frmMainSchedule.grdMain.Font, FontStyle.Bold);
                        frmMainSchedule.grdMain[iDay + 1, iScheduleStaff].Style.BackColor = Color.Gold;
                    }
                }
            }
        }
        /// <summary>
        /// データグリッドに希望シフトをセット
        /// </summary>
        public void SetMainData_Request()
        {
            int       iScheduleStaffCount, iDayCount, iWorkKindCount; // データ数(職員、日付、勤務種類)
            string    strTargetMonth;                                 // 対象年月
            DataTable dt;
            DataRow   dr;

            // データ数を変数にセット
            iScheduleStaffCount = frmMainSchedule.dtScheduleStaff.Rows.Count;
            iDayCount           = clsCommonControl.GetTargetMonthDays(frmMainSchedule.lblTargetMonth.Text);
            iWorkKindCount      = frmMainSchedule.dtWorkKind.Rows.Count;

            // 対象年月をセット
            strTargetMonth = frmMainSchedule.lblTargetMonth.Text.Substring(0, 4) + frmMainSchedule.lblTargetMonth.Text.Substring(5, 2);

            //グリッドの描画処理停止
            frmMainSchedule.grdMain.SuspendLayout();
            frmMainSchedule.grdMain.DataSource = null;

            // 初期データをセット
            for (int iScheduleStaff = 0; iScheduleStaff < iScheduleStaffCount; iScheduleStaff++)
            {
                for (int iDay = 0; iDay < iDayCount; iDay++)
                {
                    for (int iWorkKind = 0; iWorkKind < iWorkKindCount; iWorkKind++)
                    {
                        frmMainSchedule.aiData[iScheduleStaff, iDay, iWorkKind] = 0;
                    }
                }
                for (int iWorkKind = 0; iWorkKind < 3; iWorkKind++)
                {
                    frmMainSchedule.adRowTotalData[iScheduleStaff, iWorkKind] = 0;
                }
            }

            for (int iDay = 0; iDay < iDayCount; iDay++)
            {
                for (int iWorkKind = 0; iWorkKind < 3; iWorkKind++)
                {
                    frmMainSchedule.adColumnTotalData[iDay, iWorkKind] = 0;
                }
            }

            // 希望シフトデータをセット
            SetRequestData();

            //
            // --- メイングリッドヘッダ ---
            //

            // DataTableを初期化
            dt = new DataTable();

            // DataTableにカラムヘッダを作成
            dt.Columns.Add("NAME", Type.GetType("System.String"));
            for (int iDay = 1; iDay <= frmMainSchedule.piDayCount; iDay++)
            {
                dt.Columns.Add(iDay.ToString(), Type.GetType("System.String"));
            }

            // DataTableにデータをセット
            for (int iRow = 0; iRow < 2; iRow++)
            {
                dr = dt.NewRow();

                // 1行目:日にちをセット
                if (iRow == 0)
                {
                    for (int iDay = 1; iDay <= frmMainSchedule.piDayCount; iDay++)
                    {
                        dr[iDay.ToString()] = iDay.ToString();
                    }
                }
                // 2行目:"氏名"と曜日をセット
                else
                {
                    dr["NAME"] = "氏名";
                    for (int iDay = 1; iDay <= frmMainSchedule.piDayCount; iDay++)
                    {
                        dr[iDay.ToString()] = clsCommonControl.GetWeekName(frmMainSchedule.pstrTargetMonth + String.Format("{0:D2}", iDay), frmMainSchedule.astrHoliday);
                    }
                }
                dt.Rows.Add(dr);
            }

            // グリッドにデータをセット
            frmMainSchedule.grdMainHeader.DataSource = dt;

            // デザイン設定
            for (int iRow = 0; iRow < 2; iRow++)
            {
                // 列幅・色(職員)
                frmMainSchedule.grdMainHeader[0, iRow].Style.ForeColor = Color.Black;
                frmMainSchedule.grdMainHeader[0, iRow].Style.BackColor = SystemColors.Control;
                frmMainSchedule.grdMainHeader.Columns[0].Width         = GRID_WIDTH_COLUMN_STAFF;

                for (int iColumn = 1; iColumn <= frmMainSchedule.piDayCount; iColumn++)
                {
                    // 列幅
                    frmMainSchedule.grdMainHeader.Columns[iColumn].Width = GRID_WIDTH_COLUMN_DATA;

                    // 色(日付、曜日)
                    frmMainSchedule.grdMainHeader[iColumn, iRow].Style.ForeColor = clsCommonControl.GetWeekNameForeColor(frmMainSchedule.grdMainHeader[iColumn, iRow].Value.ToString());
                    frmMainSchedule.grdMainHeader[iColumn, iRow].Style.BackColor = clsCommonControl.GetWeekNameBackgroundColor(
                        clsCommonControl.GetWeekName(frmMainSchedule.pstrTargetMonth + String.Format("{0:D2}", iColumn), frmMainSchedule.astrHoliday));
                }
            }

            //
            // --- メイングリッドデータ ---
            //

            // データテーブル作成
            dt = new DataTable();

            dt.Columns.Add("NAME", Type.GetType("System.String"));

            for (int iDay = 1; iDay <= iDayCount; iDay++)
            {
                dt.Columns.Add(iDay.ToString(), Type.GetType("System.String"));
            }

            for (int iScheduleStaff = 0; iScheduleStaff < iScheduleStaffCount; iScheduleStaff++)
            {
                DataRow nr = dt.NewRow();

                nr["NAME"] = frmMainSchedule.astrScheduleStaff[iScheduleStaff, 1];
                for (int iDay = 1; iDay <= iDayCount; iDay++)
                {
                    for (int iWorkKind = 0; iWorkKind < iWorkKindCount; iWorkKind++)
                    {
                        if (frmMainSchedule.aiData[iScheduleStaff, iDay - 1, iWorkKind] == 1)
                        {
                            nr[iDay.ToString()] = frmMainSchedule.astrWorkKind[iWorkKind, 1];
                            break;
                        }
                    }
                }
                dt.Rows.Add(nr);
            }

            // メイングリッドにデータをセット
            frmMainSchedule.grdMain.DataSource = dt;

            // 職員氏名欄のデザイン設定
            for (int iScheduleStaff = 0; iScheduleStaff < frmMainSchedule.piScheduleStaffCount; iScheduleStaff++)
            {
                frmMainSchedule.grdMain[0, iScheduleStaff].Style.ForeColor = Color.Black;
                frmMainSchedule.grdMain[0, iScheduleStaff].Style.BackColor = SystemColors.Control;
            }

            // 列幅(職員)
            frmMainSchedule.grdMain.Columns[0].Width = GRID_WIDTH_COLUMN_STAFF;

            // 勤務種類データのデザイン設定
            for (int iDay = 1; iDay <= frmMainSchedule.piDayCount; iDay++)
            {
                //列幅
                frmMainSchedule.grdMain.Columns[iDay].Width = GRID_WIDTH_COLUMN_DATA;

                // 文字の色
                for (int iScheduleStaff = 0; iScheduleStaff < frmMainSchedule.piScheduleStaffCount; iScheduleStaff++)
                {
                    frmMainSchedule.grdMain[iDay, iScheduleStaff].Style.ForeColor = clsCommonControl.GetWorkKindForeColor(
                        frmMainSchedule.grdMain[iDay, iScheduleStaff].Value.ToString());
                    frmMainSchedule.grdMain[iDay, iScheduleStaff].Style.BackColor = clsCommonControl.GetWeekNameBackgroundColor(
                        clsCommonControl.GetWeekName(frmMainSchedule.pstrTargetMonth + String.Format("{0:D2}", iDay), frmMainSchedule.astrHoliday));
                }
            }

            // 先頭列のみ固定とする
            frmMainSchedule.grdMain.Columns[0].Frozen = true;

            // 行の合計グリッドをセット
            SetRowTotal();

            // 列の合計グリッドをセット
            SetColumnTotal();

            // グリッドの選択状態を解除
            frmMainSchedule.grdMain.CurrentCell       = null;
            frmMainSchedule.grdMainHeader.CurrentCell = null;

            //グリッドの描画再開
            frmMainSchedule.grdMain.ResumeLayout();
            frmMainSchedule.grdMainHeader.ResumeLayout();
        }