/// <summary> /// 対象日が土日祝、土日祝前の平日かチェック(夜勤用) /// </summary> /// <returns></returns> public bool CheckHolidayAndBeforeAfterDayForNight(string strTargetDate, string[] astrHoliday) { string strTargetMonth = strTargetDate.Substring(0, 6); // 対象月 string strTargetDay; // 対象日用変数 string strDayOfWeek; // 曜日名称 // 対象日の曜日を取得 strDayOfWeek = clsCommonControl.GetWeekName(strTargetDate, astrHoliday); // 対象日の曜日が土・日・祝ならfalse switch (strDayOfWeek) { case "土": case "日": case "祝": return(true); } // 対象日の翌日を変数に代入 strTargetDay = DateTime.ParseExact(strTargetDate, "yyyyMMdd", null).AddDays(1).ToString("yyyyMMdd"); // 対象月であるかチェック if (strTargetDay.Substring(0, 6) == strTargetMonth) { // 曜日を取得 strDayOfWeek = clsCommonControl.GetWeekName(strTargetDay, astrHoliday); // 曜日が平日ならfalse switch (strDayOfWeek) { case "土": case "日": case "祝": return(true); } } return(false); }
/// <summary> /// 祝日数を考慮した公休数を共通変数にセット /// </summary> public void SetHolidayCount() { string strDayOfWeek; // Add Start WataruT 2020.07.14 土日祝の公休数設定変更 int iSaturdayCount; int iSundayCount; bool bSaturdayHolidayFlag; string strFormat = "yyyyMMdd"; DateTime dtTargetDate; // Add End WataruT 2020.07.14 土日祝の公休数設定変更 // 既定の公休数を初期化 // Mod Start WataruT 2020.07.14 土日祝の公休数設定変更 //frmMainSchedule.pdHolidayCount = 0; frmMainSchedule.pdHolidayCount = 8; iSaturdayCount = 0; iSundayCount = 0; bSaturdayHolidayFlag = true; // Mod End WataruT 2020.07.14 土日祝の公休数設定変更 // Mod Start WataruT 2020.07.14 土日祝の公休数設定変更 //// 日曜日の数をカウント //for (int iDay = 0; iDay < frmMainSchedule.piDayCount; iDay++) //{ // strDayOfWeek = clsCommonControl.GetWeekName(frmMainSchedule.pstrTargetMonth + String.Format("{0:D2}", iDay + 1), frmMainSchedule.astrHoliday); // switch(strDayOfWeek) // { // case "土": // case "日": // case "祝": // frmMainSchedule.pdHolidayCount++; // break; // } //} // 祝日マスタ関係なく土日の数をカウント for (int iDay = 0; iDay < frmMainSchedule.piDayCount; iDay++) { dtTargetDate = DateTime.ParseExact(frmMainSchedule.pstrTargetMonth + String.Format("{0:D2}", iDay + 1), strFormat, null); switch (dtTargetDate.ToString("ddd")) { case "土": iSaturdayCount++; // Mod Start 2021.02.15 土曜日の祝日判定処理不具合対応 //if (iSaturdayCount > 4) frmMainSchedule.pdHolidayCount = frmMainSchedule.pdHolidayCount + 0.5; //{ // bSaturdayHolidayFlag = false; // break; //} if (iSaturdayCount > 4) { frmMainSchedule.pdHolidayCount = frmMainSchedule.pdHolidayCount + 0.5; bSaturdayHolidayFlag = false; } break; // Mod Start 2021.02.15 土曜日の祝日判定処理不具合対応 case "日": iSundayCount++; if (iSundayCount > 4) { frmMainSchedule.pdHolidayCount++; } break; } } // 祝日判定 for (int iDay = 0; iDay < frmMainSchedule.piDayCount; iDay++) { strDayOfWeek = clsCommonControl.GetWeekName(frmMainSchedule.pstrTargetMonth + String.Format("{0:D2}", iDay + 1), frmMainSchedule.astrHoliday); // Add Start WataruT 2020.11.19 年末の特定日を半日とする dtTargetDate = DateTime.ParseExact(frmMainSchedule.pstrTargetMonth + String.Format("{0:D2}", iDay + 1), strFormat, null); if (frmMainSchedule.pstrTargetMonth.Substring(4, 2) + String.Format("{0:D2}", iDay + 1) == "1229") { switch (dtTargetDate.ToString("ddd")) { case "土": break; case "日": iSundayCount++; if (iSundayCount > 4) { frmMainSchedule.pdHolidayCount++; } break; default: frmMainSchedule.pdHolidayCount += 0.5; break; } continue; } // Add End WataruT 2020.11.19 年末の特定日を半日とする switch (strDayOfWeek) { case "祝": if (DateTime.ParseExact(frmMainSchedule.pstrTargetMonth + String.Format("{0:D2}", iDay + 1), strFormat, null).ToString("ddd") == "日") { break; } if (DateTime.ParseExact(frmMainSchedule.pstrTargetMonth + String.Format("{0:D2}", iDay + 1), strFormat, null).ToString("ddd") == "土") { if (bSaturdayHolidayFlag == false) { frmMainSchedule.pdHolidayCount = frmMainSchedule.pdHolidayCount + 0.5; bSaturdayHolidayFlag = true; } break; } else { frmMainSchedule.pdHolidayCount++; break; } } } // Mod End WataruT 2020.07.14 土日祝の公休数設定変更 }
/// <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(); }
/// <summary> /// 帳票ファイル作成処理 /// </summary> /// <param name="targetReport"></param> /// <param name="staffNo"></param> /// <param name="orderNo"></param> public void SaveFile() { DateTime dtTargetMonth = DateTime.ParseExact(pstrTargetYear + pstrTargetMonth + "01", "yyyyMMdd", null); DataTable dtScheduleDetail; SaveFileDialog sfd = new SaveFileDialog(); // 保存ダイアログのプロパティ設定 SetSaveFileDialogProperties(ref sfd); //ダイアログを表示する if (sfd.ShowDialog() != DialogResult.OK) { return; } // オブジェクト初期化 InitializeObject(); // Excelファイルの読み込み var xlReadFile = new FileInfo(strFilePath); // オブジェクトにセット using (var xlFile = new ExcelPackage(xlReadFile)) { // シートを選択 var xlSheet = xlFile.Workbook.Worksheets["シート"]; //// === Excelデータ入力 === // 作成年月 xlSheet.Cells[ROW_CREATE_YEAR1, COLUMN_CREATE_YEAR1].Value = pstrTargetYear; xlSheet.Cells[ROW_CREATE_YEAR2, COLUMN_CREATE_YEAR2].Value = pstrTargetYear; xlSheet.Cells[ROW_CREATE_MONTH1, COLUMN_CREATE_MONTH1].Value = pstrTargetMonth; xlSheet.Cells[ROW_CREATE_MONTH2, COLUMN_CREATE_MONTH2].Value = pstrTargetMonth; // == 日付・曜日 == for (int i = 0; i < DateTime.DaysInMonth(int.Parse(pstrTargetYear), int.Parse(pstrTargetMonth)); i++) { // 日にち xlSheet.Cells[ROW_DAY_START1, COLUMN_DAY_START1 + i].Value = i + 1; xlSheet.Cells[ROW_DAY_START2, COLUMN_DAY_START2 + i].Value = i + 1; // 曜日 xlSheet.Cells[ROW_DAY_OF_WEEK1, COLUMN_DAY_OF_WEEK1 + i].Value = dtTargetMonth.AddDays(double.Parse(i.ToString())).ToString("ddd") + "曜"; xlSheet.Cells[ROW_DAY_OF_WEEK2, COLUMN_DAY_OF_WEEK2 + i].Value = dtTargetMonth.AddDays(double.Parse(i.ToString())).ToString("ddd") + "曜"; if (clsCommonControl.GetWeekName(dtTargetMonth.AddDays(i).ToString("yyyyMMdd"), astrHoliday) == "祝" || clsCommonControl.GetWeekName(dtTargetMonth.AddDays(i).ToString("yyyyMMdd"), astrHoliday) == "日") { for (int iStaffCount = 0; iStaffCount <= ROW_TOTAL_ROW + 1; iStaffCount++) { xlSheet.Cells[ROW_DAY_START1 + iStaffCount, COLUMN_DAY_START1 + i].Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Gray125; xlSheet.Cells[ROW_DAY_START2 + iStaffCount, COLUMN_DAY_START2 + i].Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Gray125; } } } // == 男性職員 == // 複数ページ対応とするか判定 if (astrScheduleStaff.GetLength(0) > ROW_TOTAL_ROW) { // 1ページ目 // 職種、病棟名、職員氏名 for (int iStaff = 0; iStaff < ROW_TOTAL_ROW; iStaff++) { // 種別 xlSheet.Cells[ROW_STAFF_START1 + iStaff, COLUMN_STAFF_START1].Value = astrScheduleStaff[iStaff, 2]; // 病棟名 xlSheet.Cells[ROW_STAFF_START1 + iStaff, COLUMN_STAFF_START1 + 2].Value = astrScheduleStaff[iStaff, 3]; // 氏名 xlSheet.Cells[ROW_STAFF_START1 + iStaff, COLUMN_STAFF_START1 + 3].Value = astrScheduleStaff[iStaff, 1]; } // 予定データ for (int iStaff = 0; iStaff < ROW_TOTAL_ROW; iStaff++) { // 対象職員の計画データ取得 dtScheduleDetail = clsDatabaseControl.GetScheduleDetail_Ward_Staff_TargetMonth(astrScheduleStaff[iStaff, 4], astrScheduleStaff[iStaff, 0], dtTargetMonth.ToString("yyyyMM")); // 1日から順に処理 for (int iDay = 0; iDay < DateTime.DaysInMonth(dtTargetMonth.Year, dtTargetMonth.Month); iDay++) { // 予定データがあるか確認 if (dtScheduleDetail.Rows.Count != 0) { // 予定データを順に確認 foreach (DataRow row in dtScheduleDetail.Rows) { // 対象日と一致する if (DateTime.Parse(row["target_date"].ToString()).Day == iDay + 1) { // 予定データ xlSheet.Cells[ROW_STAFF_START1 + iStaff, COLUMN_DAY_START1 + iDay].Value = row["name_short"].ToString(); } } } else { // 空欄データとする xlSheet.Cells[ROW_STAFF_START1 + iStaff, COLUMN_DAY_START1 + iDay].Value = ""; } } } // 2ページ目 // 職種、病棟名、職員氏名 for (int iStaff = ROW_TOTAL_ROW; iStaff < astrScheduleStaff.GetLength(0); iStaff++) { // 種別 xlSheet.Cells[ROW_STAFF_START2 + (iStaff - ROW_TOTAL_ROW), COLUMN_STAFF_START2].Value = astrScheduleStaff[iStaff, 2]; // 病棟名 xlSheet.Cells[ROW_STAFF_START2 + (iStaff - ROW_TOTAL_ROW), COLUMN_STAFF_START2 + 2].Value = astrScheduleStaff[iStaff, 3]; // 氏名 xlSheet.Cells[ROW_STAFF_START2 + (iStaff - ROW_TOTAL_ROW), COLUMN_STAFF_START2 + 3].Value = astrScheduleStaff[iStaff, 1]; } // 予定データ for (int iStaff = ROW_TOTAL_ROW; iStaff < astrScheduleStaff.GetLength(0); iStaff++) { // 対象職員の計画データ取得 dtScheduleDetail = clsDatabaseControl.GetScheduleDetail_Ward_Staff_TargetMonth(astrScheduleStaff[iStaff, 4], astrScheduleStaff[iStaff, 0], dtTargetMonth.ToString("yyyyMM")); // 1日から順に処理 for (int iDay = 0; iDay < DateTime.DaysInMonth(dtTargetMonth.Year, dtTargetMonth.Month); iDay++) { // 予定データがあるか確認 if (dtScheduleDetail.Rows.Count != 0) { // 予定データを順に確認 foreach (DataRow row in dtScheduleDetail.Rows) { // 対象日と一致する if (DateTime.Parse(row["target_date"].ToString()).Day == iDay + 1) { // 予定データ xlSheet.Cells[ROW_STAFF_START2 + (iStaff - ROW_TOTAL_ROW), COLUMN_DAY_START2 + iDay].Value = row["name_short"].ToString(); } } } else { // 空欄データとする xlSheet.Cells[ROW_STAFF_START1 + (iStaff - ROW_TOTAL_ROW), COLUMN_DAY_START2 + iDay].Value = ""; } } } } else { // 1ページ目のみ // 職種、病棟名、職員氏名 for (int iStaff = 0; iStaff < astrScheduleStaff.GetLength(0); iStaff++) { // 種別 xlSheet.Cells[ROW_STAFF_START1 + (iStaff - 1), COLUMN_STAFF_START1].Value = astrScheduleStaff[iStaff, 2]; // 病棟名 xlSheet.Cells[ROW_STAFF_START1 + (iStaff - 1), COLUMN_STAFF_START1 + 2].Value = astrScheduleStaff[iStaff, 3]; // 氏名 xlSheet.Cells[ROW_STAFF_START1 + (iStaff - 1), COLUMN_STAFF_START1 + 3].Value = astrScheduleStaff[iStaff, 1]; } // 予定データ for (int iStaff = 0; iStaff < astrScheduleStaff.GetLength(0); iStaff++) { // 対象職員の計画データ取得 dtScheduleDetail = clsDatabaseControl.GetScheduleDetail_Ward_Staff_TargetMonth(astrScheduleStaff[iStaff, 4], astrScheduleStaff[iStaff, 0], dtTargetMonth.ToString("yyyyMM")); // 1日から順に処理 for (int iDay = 0; iDay < DateTime.DaysInMonth(dtTargetMonth.Year, dtTargetMonth.Month); iDay++) { // 予定データがあるか確認 if (dtScheduleDetail.Rows.Count != 0) { // 予定データを順に確認 foreach (DataRow row in dtScheduleDetail.Rows) { // 対象日と一致する if (DateTime.Parse(row["target_date"].ToString()).Day == iDay + 1) { // 予定データ xlSheet.Cells[ROW_STAFF_START1 + (iStaff - 1), COLUMN_DAY_START1 + iDay].Value = row["name_short"].ToString(); } } } else { // 空欄データとする xlSheet.Cells[ROW_STAFF_START1 + (iStaff - 1), COLUMN_DAY_START1 + iDay].Value = ""; } } } } // 印刷範囲の指定 xlSheet.PrinterSettings.PrintArea = xlSheet.Cells[1, 1, 91, 36]; // ファイルを保存 xlFile.SaveAs(new FileInfo(sfd.FileName)); } // 終了メッセージ MessageBox.Show("保存完了"); }