# Nuntio維護清單 [TOC] ### **Problem:** 在無更動版本下可以不斷update更版 **Soultion:** 先在`LoadReportButtonClick(object objectParameter)`加入`ReportModified.ModifiedFlag = false;`把頁面更動紀錄在點show report的click後就初始化為無更動(false) ```c# private void LoadReportButtonClick(object objectParameter) { try { Mouse.OverrideCursor = System.Windows.Input.Cursors.Wait; var reportRecord = objectParameter as ReportRecord; if (reportRecord == null) return; LoadReportTemplate(reportRecord); XlsInquiryConditionVM.CurrentReportRecord = reportRecord; XlsViewerVM.SetEventVM(reportRecord.ReportID, reportRecord.ReportInstance.ReportInstanceId); ReportModified.ModifiedFlag = false; } catch (Exception exception) { MessageBox.Show(exception.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } finally { Mouse.OverrideCursor = System.Windows.Input.Cursors.Arrow; } } ``` 在`UpdateReport(object commandParameter)`加入`if (ReportModified.CheckModified()){}`判斷畫面有沒有被更動,如果沒有更動就要update會跳出messagebox顯示You make no modify. ```c# private void UpdateReport(object commandParameter) { try { Mouse.OverrideCursor = System.Windows.Input.Cursors.Wait; if (ReportModified.CheckModified()) { var valid = Validate(); if (valid) { BeforeUpdateClick(); XlsViewerVM.UpdateReport(commandParameter); AfterUpdateClick(); } else { MessageBox.Show("Update not yet.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information); } } else { System.Windows.Forms.MessageBox.Show("You make no modify.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Warning); } } catch (Exception exception) { MessageBox.Show(exception.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } finally { Mouse.OverrideCursor = System.Windows.Input.Cursors.Arrow; } } ``` --- ### **Problem:** 在無更動版本下可以check (增加messagebox做double check) **Soultion:** 在private void CheckReport(bool isUpdateCheck)的else中加入`var dr = MessageBox.Show("Are you sure you want to CHECK report?", "Information", MessageBoxButtons.YesNo, MessageBoxIcon.Information);`並寫上 if 做 yes 時的動作(將原動作加入yes並把`_doNothing`mark為`false`) , no 的話 `_doNothing = true;` and` return;`。 ```c# private void CheckReport(bool isUpdateCheck) { try { if (isUpdateCheck) { XlsServiceProxy.ConfirmReports(new List<ArReportInst> { XlsServiceProxy.GetReportAndVersionList ( false, ReportQueryMode, User.Info.Branch, XlsViewerVM.HandleDate, XlsInquiryConditionVM.CurrentReportRecord.ReportID )[0] }); } else { var dr = MessageBox.Show("Are you sure you want to CHECK report?", "Information", MessageBoxButtons.YesNo, MessageBoxIcon.Information); if (dr == DialogResult.Yes) { XlsServiceProxy.ConfirmReports(new List<ArReportInst> { XlsInquiryConditionVM.CurrentReportRecord.ReportInstance }); _doNothing = false; } else { _doNothing = true; return; } } MessageBox.Show("CHECK SUCCESSFUL!", "SUCCESSFUL", MessageBoxButtons.OK, MessageBoxIcon.Information); } catch (Exception ex) { System.Windows.Forms.MessageBox.Show(ex.ToString()); } } ``` --- ### ?**Problem:** XLS欄位中只能輸入float or int,遇到日期時無法更改日期類型資料 **Soultion:** --- ### **Problem:** Update, Check toolbar功能需要有messagebox讓user知道有完成執行 **Soultion:** (Update) 在`ReportModifyViewModel.cs`的`protected override void AfterUpdateClick()`中加入`MessageBox.Show("UPDATE SUCCESSFUL!", "SUCCESSFUL", MessageBoxButtons.OK, MessageBoxIcon.Information);` ```c# protected override void AfterUpdateClick() { base.AfterUpdateClick(); //20160621 Daniel:after update set modified flag false. MessageBox.Show("UPDATE SUCCESSFUL!", "SUCCESSFUL", MessageBoxButtons.OK, MessageBoxIcon.Information); ReportModified.ModifiedFlag = false; CellInfoSetReadOnly(); } ``` (Check) 在`ReportModifyViewModel.cs`的`private void CheckReport(bool isUpdateCheck)`中 `try{}` 加入`MessageBox.Show("CHECK SUCCESSFUL!", "SUCCESSFUL", MessageBoxButtons.OK, MessageBoxIcon.Information);` ```c# private void CheckReport(bool isUpdateCheck) { try { if (isUpdateCheck) { XlsServiceProxy.ConfirmReports(new List<ArReportInst> { XlsServiceProxy.GetReportAndVersionList ( false, ReportQueryMode, User.Info.Branch, XlsViewerVM.HandleDate, XlsInquiryConditionVM.CurrentReportRecord.ReportID )[0] }); } else { XlsServiceProxy.ConfirmReports(new List<ArReportInst> { XlsInquiryConditionVM.CurrentReportRecord.ReportInstance }); } MessageBox.Show("CHECK SUCCESSFUL!", "SUCCESSFUL", MessageBoxButtons.OK, MessageBoxIcon.Information); } catch (Exception ex) { System.Windows.Forms.MessageBox.Show(ex.ToString()); } } ``` - Execute, Reject 因為在欄位中會顯示success所以不做 --- ### **Problem:** Reject or Execute沒有select也可以執行 **Soultion:** 目前方法: 加入`using System.Windows.Forms;` and `using MessageBox = System.Windows.Forms.MessageBox;` 用`XlsInquiryConditionVM.ReportRecordCollection .Where(record => record.IsSelected) .Select(record => record.ReportInstance) .ToList();`回傳的結果做長度判斷 count == 0 表示沒有選定項目。 ```c# protected override void ExecuteSelectedReport() { try { var ExecutedSelected = XlsInquiryConditionVM.ReportRecordCollection .Where(record => record.IsSelected) .Select(record => record.ReportInstance) .ToList(); IList<ReportStatusResult> result = XlsServiceProxy.VerifyReports(ExecutedSelected, Sm.CommentList); if (ExecutedSelected.Count() == 0) { MessageBox.Show("You have selected nothing.", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } if (result == null) { MessageBox.Show("Error occured when refresh result"); return; } foreach (ReportStatusResult reportStatus in result) { RefreshReportStatus(reportStatus); } } catch (Exception exception) { MessageBox.Show(exception.Message); } } ``` --- 其他可能方法: 將`ExecuteSelectedReport()`從 void 改作其他可以回傳資料的型態 ReportNotOKayViewmodel.cs 更改`ExecuteSelectedReport()`為回傳 string 如下: ```c# protected override string ExecuteSelectedReport() { try { var ExecutedSelected = XlsInquiryConditionVM.ReportRecordCollection .Where(record => record.IsSelected) .Select(record => record.ReportInstance) .ToList(); IList <ReportStatusResult> result = XlsServiceProxy.NotOkReports(ExecutedSelected, Sm.CommentList); if (ExecutedSelected.Count() == 0) { //MessageBox.Show("You have selected nothing.", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Information); return "You have selected nothing."; } if (result == null) { //MessageBox.Show("Error occured when refresh result"); return "Error occured when refresh result"; } foreach (ReportStatusResult reportStatus in result) { RefreshReportStatus(reportStatus); } return "Successful"; } catch (Exception exception) { //MessageBox.Show(exception.Message); return "Exception: " + exception.Message; } } ``` ReportVerifyViewmodel.cs 更改`ExecuteSelectedReport()` `RejectSelectedReport()`為回傳 string 如下: ```c# protected override string ExecuteSelectedReport() { try { var ExecutedSelected = XlsInquiryConditionVM.ReportRecordCollection .Where(record => record.IsSelected) .Select(record => record.ReportInstance) .ToList(); IList<ReportStatusResult> result = XlsServiceProxy.VerifyReports(ExecutedSelected, Sm.CommentList); if (ExecutedSelected.Count() == 0) { //MessageBox.Show("You have selected nothing.", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Information); return "You have selected nothing."; } if (result == null) { //MessageBox.Show("Error occured when refresh result"); return "Error occured when refresh result"; } foreach (ReportStatusResult reportStatus in result) { RefreshReportStatus(reportStatus); } return "Verify complete"; } catch (Exception exception) { //MessageBox.Show(exception.Message); return "Exception: " + exception.Message; } } #endregion #region Reject protected override string RejectSelectedReport() { try { var RejectSelected = XlsInquiryConditionVM.ReportRecordCollection .Where(record => record.IsSelected) .Select(record => record.ReportInstance) .ToList(); IList<ReportStatusResult> result = XlsServiceProxy.RejectReports(RejectSelected, Sm.CommentList); if (RejectSelected.Count() == 0) { //MessageBox.Show("You have selected nothing.", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Information); return "You have selected nothing."; } if (result == null) { //MessageBox.Show("Error occured when refresh result"); return "Error occured when refresh result"; } foreach (ReportStatusResult reportStatus in result) { RefreshReportStatus(reportStatus); } return "Reject complete"; } catch (Exception exception) { //MessageBox.Show(exception.Message); return "Exception: " + exception.Message; } } ``` ReportManagerViewModel.cs 更改為使用字串判斷回傳後發出messagebox更改如下: ```c# #region Execute:覆核單張或多張報表: Verify/ 解控報表單張或多張報表: Not Okay public ICommand ExecuteClickCommand { get { return _executeClickCommand ?? (_executeClickCommand = CommandFactory.CreateCommand<object>(ExecuteReport)); } } private void ExecuteReport(object commandParameter) { try { if (ExecuteSelectedReport().Equals("Verify complete")) { MessageBox.Show("Verify complete", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information); AfterExecuteClick(); } else if (ExecuteSelectedReport().Equals("Successful")) { MessageBox.Show("Successful", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information); AfterExecuteClick(); } else if (ExecuteSelectedReport().Equals("You have selected nothing.")) { MessageBox.Show(ExecuteSelectedReport(), "Information", MessageBoxButtons.OK, MessageBoxIcon.Information); } else if (ExecuteSelectedReport().Equals("Error occured when refresh result")) { MessageBox.Show("Error occured when refresh result"); } else if (ExecuteSelectedReport().Equals("Exception: ")) { MessageBox.Show(ExecuteSelectedReport()); } //ExecuteSelectedReport(); //AfterExecuteClick(); } catch (Exception exception) { MessageBox.Show(exception.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } finally { Mouse.OverrideCursor = System.Windows.Input.Cursors.Arrow; } } protected virtual string ExecuteSelectedReport() { return ""; // intentionaly empty // override: VerifyViewModel // override: NotOkayViewModel } #endregion #region Reject:解控畫面上的報表為該申報日待覆核報表 // ViewModelBase public ICommand RejectClickCommand { get { return _rejectClickCommand ?? (_rejectClickCommand = CommandFactory.CreateCommand<object>(RejectReport)); } } private void RejectReport(object commandParameter) { try { try { if (RejectSelectedReport().Equals("Reject complete")) { MessageBox.Show("Reject complete", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information); AfterRejectClick(); } else if (RejectSelectedReport().Equals("You have selected nothing.")) { MessageBox.Show(ExecuteSelectedReport(), "Information", MessageBoxButtons.OK, MessageBoxIcon.Information); } else if (RejectSelectedReport().Equals("Error occured when refresh result")) { MessageBox.Show("Error occured when refresh result"); } else if (RejectSelectedReport().Equals("Exception: ")) { MessageBox.Show(ExecuteSelectedReport()); } //RejectSelectedReport(); //AfterRejectClick(); } catch (Exception exception) { MessageBox.Show(exception.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } finally { Mouse.OverrideCursor = System.Windows.Input.Cursors.Arrow; } } catch (Exception exception) { MessageBox.Show(exception.Message); throw; } } protected virtual string RejectSelectedReport() { return ""; // intentionaly empty // override: Verify } #endregion ``` --- ### ~~**Problem:** Action Detail 沒有作用~~ ~~**Soultion:**~~ 顯示ErrorMessage ShowActionErrorMessageCommand --- ### **Problem:** Reject 後按鈕仍亮著 **Soultion:** <mark>找不到原因</mark> 嘗試過將`ExecuteIsEnable = false;`及` RejectIsEnable = false;`直接寫在原來`AfterRejectClick();`的位置皆沒有作用。 下方Code改為`protected virtual void AfterRejectClick()` ```c# private void AfterRejectClick() { ToolbarManipulation(Switch.Off); // VerifyViewModel } ``` 並在 ReportVerifyViewModel.cs 中放入: ``` protected override void AfterRejectClick() { base.AfterRejectClick(); ToolbarManipulation(Switch.Off); } ``` 一樣沒有作用。 檢查過testview.Toolbar .xaml and .cs 沒有binding錯誤 * <mark>2021/11/24 找到原因,但對解法沒有想法</mark> 主因是 Toolbar.xaml 中 對 image 還有 textblock 設定 `IsMouseDirectlyOverChanged` 所造成。移除後即正常但就沒有mouseon變亮的功能了。 --- ### **Problem:** Modify Report 執行cancel後 xls視窗檔名沒有一併清除復原 **Soultion:** 在 XlsViewerModel.cs 的`public void Clear()` 中加入 `ReportName = "";` 將 ReportName 設定在 clear() 時是空的。 ```c# public void Clear() { File = ""; // ExtendedWorkbook當File=""時會產生空白報表 ReportName = ""; XlsDetailVM.SetDefault(); CellInfoHasBeenModified = false;//20160617 Daniel add. } ``` --- ### **Problem:** calander對比 **Soultion:** `sqlExpression = "SELECT DISTINCT(BSN_DATE) FROM NU_CBBSND ORDER BY BSN_DATE;";` BSN DATE? DB中只有5筆資料 --- ### **Problem:** cell information 中 Confrim 改comment也可confirm **Soultion:** `XlsCellInfoViewModel.cs` 中的 `public bool EditCellInstance(bool _cellInfoHasBeenModified)` `if (!CellInfoColumn.OriginalValue.ToString().Equals(newValue))` else 迴圈中將 `System.Windows.Forms.MessageBox.Show("Invalid request.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);` 改為下面的 if ```c# if (!CellInfoColumn.OriginalComment.ToString().Equals(comment)) { CellInfoColumn.Value = newValue; CellInfoColumn.Comment = comment; //cellInfoProperty.CellInfoColumn.OriginalComment = comment; //20151217 Glacier: set in RowProvider cellInfoHasBeenModified = true; } else { System.Windows.Forms.MessageBox.Show("Invalid request.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning); } ``` --- ### **Problem:** 當一個使用者modify報表時,另一不能進入報表 **Soultion:** XlsxService.cs 加入 `GetReprotAccessLog()`, `InsertReportAccessLog()`, `UpdateReportAccessLog()` ```c# public virtual DataTable GetReportAccessLog(string[] parameter) //string array [0]userid [1]RPT_INST_ID { DataTable dt = new DataTable(); dt.Columns.Add("ROW_IDX"); dt.Columns.Add("USERID"); dt.Columns.Add("BRANCH"); dt.Columns.Add("RPT_INST_ID"); dt.Columns.Add("REQUEST_TIME_BEGIN"); dt.Columns.Add("REQUEST_TIME_END"); dt.TableName = "DataTableName"; using (var session = DatabaseFactory.CreateDatabaseSession()) { var accesslog = session.GetRepository<ArReportAccessLog>(); if (string.IsNullOrEmpty(parameter[0].Trim())) { Expression<Func<ArReportAccessLog, bool>> expr = item => item.RptInstId.ToString() == parameter[1]; var basicquery = accesslog.FilterBy(expr); foreach (var reportCtrl in basicquery) { DataRow row = dt.NewRow(); row["ROW_IDX"] = reportCtrl.RowIdx; row["USERID"] = reportCtrl.Userid; row["BRANCH"] = reportCtrl.Branch; row["RPT_INST_ID"] = reportCtrl.RptInstId; row["REQUEST_TIME_BEGIN"] = reportCtrl.RequestTimeBegin; row["REQUEST_TIME_END"] = reportCtrl.RequestTimeEnd; dt.Rows.Add(row); //break; } } else if (!string.IsNullOrEmpty(parameter[0])) { if (string.IsNullOrEmpty(parameter[1].Trim())) { Expression<Func<ArReportAccessLog, bool>> expr = item => item.Userid == parameter[0]; var basicquery = accesslog.FilterBy(expr); foreach (var reportCtrl in basicquery) { DataRow row = dt.NewRow(); row["ROW_IDX"] = reportCtrl.RowIdx; row["USERID"] = reportCtrl.Userid; row["BRANCH"] = reportCtrl.Branch; row["RPT_INST_ID"] = reportCtrl.RptInstId; row["REQUEST_TIME_BEGIN"] = reportCtrl.RequestTimeBegin; row["REQUEST_TIME_END"] = reportCtrl.RequestTimeEnd; dt.Rows.Add(row); //break; } } else { Expression<Func<ArReportAccessLog, bool>> expr = item => item.RptInstId.ToString() == parameter[1].Trim() && item.Userid.ToString() == parameter[0].Trim(); var basicquery = accesslog.FilterBy(expr); foreach (var reportCtrl in basicquery) { DataRow row = dt.NewRow(); row["ROW_IDX"] = reportCtrl.RowIdx; row["USERID"] = reportCtrl.Userid; row["BRANCH"] = reportCtrl.Branch; row["RPT_INST_ID"] = reportCtrl.RptInstId; row["REQUEST_TIME_BEGIN"] = reportCtrl.RequestTimeBegin; row["REQUEST_TIME_END"] = reportCtrl.RequestTimeEnd; dt.Rows.Add(row); //break; } } } session.Dispose(); } return dt; } public virtual void InsertReportAccessLog(string branch, int rptinstid) { using (var session = DatabaseFactory.CreateDatabaseSession()) { var accesslog = session.GetRepository<ArReportAccessLog>(); session.BeginTransaction(); try { var accesslog1 = new ArReportAccessLog() { Userid = User.AccountId, Branch = branch, RptInstId = rptinstid, RequestTimeBegin = DateTime.Now, RequestTimeEnd = null }; accesslog.Insert(accesslog1); session.Commit(); } catch (Exception ex) { Log.Error("InsertArReportLog ERROR"); Log.Error(ex); throw; } finally { Log.Info("InsertArReportLog OK"); session.Dispose(); } } } public virtual void UpdateReportAccessLog(string userid, int rowidx) { using (var session = DatabaseFactory.CreateDatabaseSession()) { try { var accesslog = session.GetRepository<ArReportAccessLog>(); session.BeginTransaction(); Expression<Func<ArReportAccessLog, bool>> expr = item => item.Userid == userid && item.RowIdx == rowidx; var basicquary = accesslog.FilterBy(expr); foreach (var accesslog1 in basicquary) { accesslog1.RequestTimeEnd = DateTime.Now; accesslog.Update(accesslog1); break; } session.Commit(); } catch (Exception ex) { Log.Error("UpdateArReportAccessLog ERROR"); Log.Error(ex); } finally { Log.Info("UpdateArReportAccessLog OK"); session.Dispose(); } } } ``` --- XlsxServiceProxy.cs 加入 ```c# public DataTable GetReportAccessLog(string[] parameter) { return _xlsxReportClient.GetReportAccessLog(parameter); } public void InsertReportAccessLog(string branch, int rptinstid) { _xlsxReportClient.InsertReportAccessLog(branch, rptinstid); } public void UpdateReportAccessLog(string userid, int rowidx) { _xlsxReportClient.UpdateReportAccessLog(userid, rowidx); } ``` --- XlsxReportClient.cs 加入 ```c# public DataTable GetReportAccessLog(string[] parameter) { return Channel.GetReportAccessLog(parameter); } public void InsertReportAccessLog(string branch, int rptinstid) { Channel.InsertReportAccessLog(branch, rptinstid); } public void UpdateReportAccessLog(string userid, int rowidx) { Channel.UpdateReportAccessLog(userid, rowidx); } ``` --- IXlsxService.cs 加入 ```c# [OperationContract] [FaultContract(typeof(ServiceFault))] DataTable GetReportAccessLog(string[] parameter); [OperationContract] [FaultContract(typeof(ServiceFault))] void InsertReportAccessLog(string branch, int rptinstid); [OperationContract] [FaultContract(typeof(ServiceFault))] void UpdateReportAccessLog(string userid, int rowidx); ``` --- ReportManagerViewModel.cs 加入`GetandUpdateReportAccessLog()` 需要先Get DB 中該帳號的所有ReportAccessLog,並判斷回傳資料>0 (為了保有原command有的作動),UpdateReportAccessLog最後一筆資料(使用Get時拿到的ROW_IDX最大值)。 //update要給accountid是多寫的,因為真正update時是呼叫`GetandUpdateReportAccessLog()` 在這邊get時已經先做過accountid的判斷拿到該帳號的最大值的ROW_IDX了。 ```c# public void GetandUpdateReportAccessLog() { string[] accesslog_para = {User.Info.AccountId, ""}; var accesslog = XlsServiceProxy.GetReportAccessLog(accesslog_para); var accesslogLength = accesslog.Rows.Count; if (accesslogLength > 0) { XlsServiceProxy.UpdateReportAccessLog(User.Info.AccountId, Convert.ToInt32(accesslog.Compute("max([ROW_IDX])", string.Empty))); } } ``` --- ReportManagerViewModel.cs `UpdateReport()` 加入 `GetandUpdateReportAccessLog();` ```c# private void UpdateReport(object commandParameter) { try { Mouse.OverrideCursor = System.Windows.Input.Cursors.Wait; if (ReportModified.CheckModified()) { var valid = Validate(); if (valid) { BeforeUpdateClick(); XlsViewerVM.UpdateReport(commandParameter); GetandUpdateReportAccessLog(); AfterUpdateClick(); } else { MessageBox.Show("Update not yet.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information); } } else { System.Windows.Forms.MessageBox.Show("You make no modify.", "Information", MessageBoxButtons.OK, MessageBoxIcon.Warning); } } catch (Exception exception) { MessageBox.Show(exception.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } finally { Mouse.OverrideCursor = System.Windows.Input.Cursors.Arrow; } } ``` --- ReportManagerViewModel.cs CheckReport() 加入 GetandUpdateReportAccessLog(); ```c# private void CheckReport(object commandParameter) { try { ModifyCheckReport(); GetandUpdateReportAccessLog(); AfterCheckClick(); } catch (Exception exception) { MessageBox.Show(exception.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } finally { Mouse.OverrideCursor = System.Windows.Input.Cursors.Arrow; } } ``` --- ReportManagerViewModel.cs ExportReport() 加入 GetandUpdateReportAccessLog(); ```c# private void ExportReport(object commandParameter) { try { SetExportReport(commandParameter); GetandUpdateReportAccessLog(); } catch (Exception exception) { MessageBox.Show(exception.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } finally { Mouse.OverrideCursor = System.Windows.Input.Cursors.Arrow; } } ``` --- ReportManagerViewModel.cs ClearInquiryParameter() 加入 GetandUpdateReportAccessLog(); ```c# private void ClearInquiryParameter(object objectParameter) { try { XlsInquiryConditionVM.Clear(_dataDate, _rptIdList); XlsViewerVM.Clear(); GetandUpdateReportAccessLog(); ToolbarManipulation(Switch.Off); } catch (Exception exception) { MessageBox.Show(exception.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } finally { Mouse.OverrideCursor = System.Windows.Input.Cursors.Arrow; } } ``` --- ReportManagerViewModel.cs LoadReportButtonClick() 更改為: 先Get資料庫中的資料(僅回傳該click表單的所有access紀錄) ```C# string[] accesslog_para = {"", reportRecord.ReportInstance.ReportInstanceId.ToString()}; var accesslog = XlsServiceProxy.GetReportAccessLog(accesslog_para); var accesslogLength = accesslog.Rows.Count; ``` 加入判斷,如果沒有回傳資料就insert一筆新的,如果有回傳資料則要判斷"最後一筆資料"有沒有end時間,如果"有"endtime則做原本click應做的事,並insert一筆新的begintime。如果"沒有"endtime(`accesslog.Rows[accesslogLength-1]["REQUEST_TIME_END"] == DBNull.Value` 用是否為null判斷)則raise error messagebox。 full code: ```c# private void LoadReportButtonClick(object objectParameter) { try { Mouse.OverrideCursor = System.Windows.Input.Cursors.Wait; GetandUpdateReportAccessLog(); var reportRecord = objectParameter as ReportRecord; if (reportRecord == null) return; string[] accesslog_para = {"", reportRecord.ReportInstance.ReportInstanceId.ToString()}; var accesslog = XlsServiceProxy.GetReportAccessLog(accesslog_para); var accesslogLength = accesslog.Rows.Count; if (accesslogLength > 0 && accesslog.Rows[accesslogLength-1]["REQUEST_TIME_END"] == DBNull.Value) { MessageBox.Show("This report is locked by other user. Please wait.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } XlsServiceProxy.InsertReportAccessLog(User.Info.Branch, reportRecord.ReportInstance.ReportInstanceId); LoadReportTemplate(reportRecord); XlsInquiryConditionVM.CurrentReportRecord = reportRecord; XlsViewerVM.SetEventVM(reportRecord.ReportID, reportRecord.ReportInstance.ReportInstanceId); ReportModified.ModifiedFlag = false; } catch (Exception exception) { MessageBox.Show(exception.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } finally { Mouse.OverrideCursor = System.Windows.Input.Cursors.Arrow; } } ``` --- ReportVerifyViewModel.cs 與 ReportNotOkayViewModel.cs `DisplayReportOnPopUp()` 加入 if 判斷 `xlsTemplate.ShowDialog() == false` 並呼叫 `GetandUpdateReportAccessLog()` fullcode: ```c# protected override void DisplayReportOnPopUp() { var xlsTemplate = new Window { Content = new XlsViewer(XlsViewerVM), Title = XlsViewerVM.Report.Name, }; //xlsTemplate.ShowDialog(); if (xlsTemplate.ShowDialog() == false) { GetandUpdateReportAccessLog(); } } ``` --- ReportModifyViewModel.cs 中將入解構子 `protected override void DisposeUnmanagedResources()` 用於離開ReportModifyViewModel時執行`GetandUpdateAccessReport()` ```c# protected override void DisposeUnmanagedResources() { GetandUpdateReportAccessLog(); base.DisposeUnmanagedResources(); } ``` --- 增加proxy 使用 SecurityServic SecurityServic.cs 加入 `GetReportAccessLog()` `GetandUpdateReportAccessLog()` `UpdateReportAccessLog()` ``` public virtual DataTable GetReportAccessLog(string[] parameter) //string array [0]userid [1]RPT_INST_ID { DataTable dt = new DataTable(); dt.Columns.Add("ROW_IDX"); dt.Columns.Add("USERID"); dt.Columns.Add("BRANCH"); dt.Columns.Add("RPT_INST_ID"); dt.Columns.Add("REQUEST_TIME_BEGIN"); dt.Columns.Add("REQUEST_TIME_END"); dt.TableName = "DataTableName"; using (var session = _databaseFactory.CreateDatabaseSession()) { var accesslog = session.GetRepository<ArReportAccessLog>(); if (string.IsNullOrEmpty(parameter[0].Trim())) { Expression<Func<ArReportAccessLog, bool>> expr = item => item.RptInstId.ToString() == parameter[1]; var basicquery = accesslog.FilterBy(expr); foreach (var reportCtrl in basicquery) { DataRow row = dt.NewRow(); row["ROW_IDX"] = reportCtrl.RowIdx; row["USERID"] = reportCtrl.Userid; row["BRANCH"] = reportCtrl.Branch; row["RPT_INST_ID"] = reportCtrl.RptInstId; row["REQUEST_TIME_BEGIN"] = reportCtrl.RequestTimeBegin; row["REQUEST_TIME_END"] = reportCtrl.RequestTimeEnd; dt.Rows.Add(row); //break; } } else if (!string.IsNullOrEmpty(parameter[0])) { if (string.IsNullOrEmpty(parameter[1].Trim())) { Expression<Func<ArReportAccessLog, bool>> expr = item => item.Userid == parameter[0]; var basicquery = accesslog.FilterBy(expr); foreach (var reportCtrl in basicquery) { DataRow row = dt.NewRow(); row["ROW_IDX"] = reportCtrl.RowIdx; row["USERID"] = reportCtrl.Userid; row["BRANCH"] = reportCtrl.Branch; row["RPT_INST_ID"] = reportCtrl.RptInstId; row["REQUEST_TIME_BEGIN"] = reportCtrl.RequestTimeBegin; row["REQUEST_TIME_END"] = reportCtrl.RequestTimeEnd; dt.Rows.Add(row); //break; } } else { Expression<Func<ArReportAccessLog, bool>> expr = item => item.RptInstId.ToString() == parameter[1].Trim() && item.Userid.ToString() == parameter[0].Trim(); var basicquery = accesslog.FilterBy(expr); foreach (var reportCtrl in basicquery) { DataRow row = dt.NewRow(); row["ROW_IDX"] = reportCtrl.RowIdx; row["USERID"] = reportCtrl.Userid; row["BRANCH"] = reportCtrl.Branch; row["RPT_INST_ID"] = reportCtrl.RptInstId; row["REQUEST_TIME_BEGIN"] = reportCtrl.RequestTimeBegin; row["REQUEST_TIME_END"] = reportCtrl.RequestTimeEnd; dt.Rows.Add(row); //break; } } } session.Dispose(); } return dt; } public virtual void UpdateReportAccessLog(string userid, int rowidx) { using (var session = _databaseFactory.CreateDatabaseSession()) { try { var accesslog = session.GetRepository<ArReportAccessLog>(); session.BeginTransaction(); Expression<Func<ArReportAccessLog, bool>> expr = item => item.Userid == userid && item.RowIdx == rowidx; var basicquary = accesslog.FilterBy(expr); foreach (var accesslog1 in basicquary) { accesslog1.RequestTimeEnd = DateTime.Now; accesslog.Update(accesslog1); break; } session.Commit(); } catch (Exception ex) { Log.Error("UpdateArReportAccessLog ERROR"); Log.Error(ex); } finally { Log.Info("UpdateArReportAccessLog OK"); session.Dispose(); } } } public void GetandUpdateReportAccessLog() { string[] accesslog_para = { _user.AccountId, "" }; var accesslog = GetReportAccessLog(accesslog_para); var accesslogLength = accesslog.Rows.Count; if (accesslogLength > 0) { UpdateReportAccessLog(_user.AccountId, Convert.ToInt32(accesslog.Compute("max([ROW_IDX])", string.Empty))); } } ``` ISecurityServic.cs 中加入 ``` [OperationContract] [FaultContract(typeof(ServiceFault))] void GetandUpdateReportAccessLog(); ``` SecurityClient.cs ``` public void GetandUpdateReportAccessLog() { Channel.GetandUpdateReportAccessLog(); } ``` shell.xaml.cs 中 private void Window_Closing() 加入判斷 ```c# if (dr == System.Windows.Forms.DialogResult.Yes) { SecurityService.GetandUpdateReportAccessLog(); } ``` --- ### **Problem:** 增加customlized pagesize的功能 **Soultion:** Viewmodel: ```c# using System.Collections.Generic; ``` `public class Inquiry_Attribute_Definition_VM : ViewModelBase` 中加入 ```c# public class Inquiry_Attribute_Definition_VM : ViewModelBase { public List<int> itemkind { get; set; } public int selecteditemkind { get; set; } public int selecteditemkindindex { get; set; } } ``` `public Inquiry_Attribute_Definition_VM()` 中加入 ```c# public Inquiry_Attribute_Definition_VM(IUser user, IApplicationFactory applicationFactory, ISampleService proxy) : base(user, applicationFactory) { itemkind = new List<int> {10, 20, 30, 40, 50}; selecteditemkindindex = -1; } ``` --- xaml: 加入combobox ```xaml <Custom:XamComboEditor x:Name="Pagersize" HorizontalAlignment="Left" Margin="472,69,0,0" VerticalAlignment="Top" Width="47" Height="26" Text="10" ItemsSource="{Binding itemkind}" Grid.Row="1"/> ``` 設定pagesize binding ```xaml <ig:PagerSettings AllowPaging="Top" PageSize="{Binding Source={x:Reference Pagersize}, Path=SelectedItem}"/> ``` --- #### 2021/11/23 將Grid(Pages)整個移出獨立 總共有三個頁面使用 (Inquiry Attribute Definition, Inquiry Report Cell Definition, Inquiry Manual Entry log) 移出Grid,建立新xaml(命名為GridPager.xaml): 整頁模式,於原地再用 `<Grid.RowDefinitions>` 綁位置 ```xaml <UserControl x:Class="ares.client.module.View.GridPager" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:ares.client.module.View" xmlns:ig="http://schemas.infragistics.com/xaml" xmlns:Custom="http://infragistics.com/Editors" mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800"> <Grid> <!--<Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="*"/> </Grid.RowDefinitions>--> <ig:XamGrid x:Name="TestDataGrid1" ItemsSource="{Binding DataGrid_IS, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" HeaderRowHeight="35" RowHeight="30" VerticalContentAlignment="Center" BorderBrush="Black" Margin="10,0,10,0" > <ig:XamGrid.PagerSettings > <ig:PagerSettings AllowPaging="Top" PageSize="{Binding Source={x:Reference Pagersize}, Path=SelectedItem}"/> </ig:XamGrid.PagerSettings> <ig:XamGrid.RowSelectorSettings> <ig:RowSelectorSettings Visibility="Visible" /> </ig:XamGrid.RowSelectorSettings> </ig:XamGrid> <Label Content="Page size:" HorizontalAlignment="Left" Margin="10,0,0,0" VerticalAlignment="Top" /> <Custom:XamComboEditor x:Name="Pagersize" HorizontalAlignment="Left" Margin="70,3,0,0" VerticalAlignment="Top" Width="45" Height="22" Text="10" ItemsSource="{Binding itemkind}" SelectedItem="{Binding selecteditemkind, UpdateSourceTrigger=PropertyChanged}" SelectedIndex="{Binding selecteditemkindindex}"/> </Grid> </UserControl> ``` 以 Inquiry Attribute Definition 為例 `Inquiry_Attribute_Definition.xaml` 在原本 `<Grid>` 位置改以下code 並加入 `xmlns:view="clr-namespace:ares.client.module.View"` ```xaml <Grid> <Grid.RowDefinitions> <RowDefinition Height="100"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <view:GridPager Grid.Row="1" x:Name="GridPagerViewControl" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/> </Grid> ``` `Inquiry_Attribute_Definition.xaml.cs` 建立column (客製化每個頁面的column) 需要import `using Infragistics.Controls.Grids;` ```c# private void generate_columns() { GridPagerViewControl.TestDataGrid1.Columns.Add(new TextColumn() { Key = "AttrId", HeaderText = "Attr ID" }); GridPagerViewControl.TestDataGrid1.Columns.Add(new TextColumn() { Key = "CateId", HeaderText = "Cate ID" }); GridPagerViewControl.TestDataGrid1.Columns.Add(new TextColumn() { Key = "AttrName", HeaderText = "Attr Name" }); GridPagerViewControl.TestDataGrid1.Columns.Add(new TextColumn() { Key = "TextData", HeaderText = "Text Data" }); GridPagerViewControl.TestDataGrid1.Columns.Add(new TextColumn() { Key = "Description", HeaderText = "Description" }); } ``` Initialize時記得加入 `generate_columns();` Viewmodel: ```c# using System.Collections.Generic; ``` `public class Inquiry_Attribute_Definition_VM : ViewModelBase` 中加入 ```c# public class Inquiry_Attribute_Definition_VM : ViewModelBase { public List<int> itemkind { get; set; } public int selecteditemkind { get; set; } public int selecteditemkindindex { get; set; } } ``` `public Inquiry_Attribute_Definition_VM()` 中加入 ```c# public Inquiry_Attribute_Definition_VM(IUser user, IApplicationFactory applicationFactory, ISampleService proxy) : base(user, applicationFactory) { itemkind = new List<int> {10, 20, 30, 40, 50}; selecteditemkindindex = -1; } ```