/// <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(); }