From 3cb2c0d97c94feeecdceedab9db73817f2a74b83 Mon Sep 17 00:00:00 2001 From: Neo Yang Date: Thu, 10 Sep 2026 10:53:54 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20fmRpar=20GridView=20=E6=94=B9=E7=94=A8?= =?UTF-8?q?=20ObjectDataSource?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - RparDAC 新增 SelectPage/SelectCount - dsRPARGrid 改 ObjectDataSource;Search/Selected 調整 - fmRowk 保留(框架限制,文檔記錄) --- Doc/GridView改用ObjectDataSource計畫.md | 6 +- Web/App_Code/DAC/RparDAC.cs | 119 ++++++++++++++++++++++++ Web/forms/worker/fmRpar.ascx | 19 ++-- Web/forms/worker/fmRpar.ascx.cs | 23 ++--- 4 files changed, 144 insertions(+), 23 deletions(-) diff --git a/Doc/GridView改用ObjectDataSource計畫.md b/Doc/GridView改用ObjectDataSource計畫.md index e7ee7c7..7c5317c 100644 --- a/Doc/GridView改用ObjectDataSource計畫.md +++ b/Doc/GridView改用ObjectDataSource計畫.md @@ -33,8 +33,8 @@ | 15 | forms/flow/fmSign.ascx | gvRPAB | dsRPAB | RPAB | RpabDAC(+Select) | **完成** | | 16 | forms/summary/fmSalaryCalc.ascx | GridView1 | dsSACD | SACD | 無→SacdDAC | **完成** | | 17 | forms/worker/fmBpsn.ascx | GridView1 | dsBPSNGrid | BPSNView | BpsnDAC | **進行中** | -| 18 | forms/worker/fmRowk.ascx | gvROWK | dsROWKGrid | ROWK | 無 | 待辦 | -| 19 | forms/worker/fmRpar.ascx | RPARGrid | dsRPARGrid | RPAR | RparDAC | 待辦 | +| 18 | forms/worker/fmRowk.ascx | gvROWK | dsROWKGrid | ROWK | 無 | **保留**(使用 WUserControlBase 的 SqlDataSource 框架,需另案) | +| 19 | forms/worker/fmRpar.ascx | RPARGrid | dsRPARGrid | RPAR | RparDAC(+Select) | **完成** | | 20 | forms/worker/fmRparWorker.ascx | RPABGrid | dsRPAB | RPAB | RpabDAC | 待辦 | | 21 | forms/worker/fmRparWorker.ascx | RPARGrid | dsRPARGrid | RPAR | RparDAC | 待辦 | | 22 | forms/worker/fmRsaj.ascx | RSAJGrid | dsRSAJGrid | RSAJ | RsajDAC | 待辦 | @@ -153,3 +153,5 @@ | 2026-09-10 | 轉換 fmRpfe(RPFE):新增 RpfeDAC(SelectPage/SelectCount);dsRPFEGrid 改 ObjectDataSource;編譯通過 | | 2026-09-10 | 轉換 fmSign(RPAB):RpabDAC 新增 SelectRPAB;dsRPAB2/dsRPAB 改 ObjectDataSource;dsRPAB2_Selecting 改 ODS 事件;編譯通過 | | 2026-09-10 | 轉換 fmSalaryCalc(SACD):新增 SacdDAC(SelectByProject);dsSACD 改 ObjectDataSource;編譯通過 | +| 2026-09-10 | 轉換 fmRpar(RPAR):RparDAC 新增 SelectPage/SelectCount;dsRPARGrid 改 ObjectDataSource;Search/Selected 調整;編譯通過 | +| 2026-09-10 | fmRowk(ROWK)保留未轉換:其 Grid 綁定使用 WUserControlBase 的 Grid_View/GridView_DataSource(SqlDataSource)框架與 override Search,無法直接改用 ObjectDataSource,需另案重構 | diff --git a/Web/App_Code/DAC/RparDAC.cs b/Web/App_Code/DAC/RparDAC.cs index 65476e4..46995e7 100644 --- a/Web/App_Code/DAC/RparDAC.cs +++ b/Web/App_Code/DAC/RparDAC.cs @@ -8,6 +8,7 @@ using Wellan.Data; using Wellan.Common; using System.Transactions; using System.ComponentModel; +using System.Text; using System.IO; using System.Web; using System.Linq; @@ -1856,6 +1857,124 @@ public class RparDAC : Wellan.Data.WDAC return new 打卡檢查Item(); } + + private const string RparGridColumns = + @"TRDAT, TRMOD, TRUSR, RPREN, RPNUM, RAITM, RPCNM, RPPYN, RPRDT, RPEDT, RPTYP, FLOOR(RPTCT / 60) AS RPTCT, RPFTR, RPDOC, + APPNO, RPAPP, RPAPD, RPAPU, RPADT, RPAPN, RPANO, RPAGT, RPRTM, RPETM, RPUST, RPTC1, RPTC2, RPTC3, + RPRSN, RPAGM, ISNULL(RPTCT - FLOOR(RPTCT / 60) * 60, 0) AS RPTMT"; + + private const string RparGridWhere = " WHERE ((RPAPN IS NULL) OR ((RPAPN<>'D') AND (RPAPN=RPANO))) "; + + /// + /// 差勤紀錄 Grid 分頁查詢 + /// + [DataObjectMethod(DataObjectMethodType.Select)] + public DataTable SelectPage(int startRowIndex, int maximumRows, string RPPYN, string RPNUM1, string RPNUM2, string RPRDT1, string RPRDT2, string rparType) + { + DbCommand cmd = Query.NewCommand(); + + StringBuilder filter = new StringBuilder(); + BuildRparGridFilter(filter, cmd, RPPYN, RPNUM1, RPNUM2, RPRDT1, RPRDT2, rparType); + + cmd.CommandText = String.Format( + @"SELECT * FROM + ( + SELECT {0}, ROW_NUMBER() OVER (ORDER BY RPREN) AS ROWID + FROM RPAR {1} {2} + ) AS TMP + WHERE ROWID BETWEEN @STARTROWINDEX + 1 AND @STARTROWINDEX + @MAXIMUMROWS + ORDER BY ROWID", + RparGridColumns, RparGridWhere, filter.ToString()); + cmd.Parameters.Add(Query.NewParameter("STARTROWINDEX", startRowIndex)); + cmd.Parameters.Add(Query.NewParameter("MAXIMUMROWS", maximumRows)); + + return Query.Select(cmd); + } + + /// + /// 差勤紀錄 Grid 查詢筆數 + /// + [DataObjectMethod(DataObjectMethodType.Select)] + public int SelectCount(string RPPYN, string RPNUM1, string RPNUM2, string RPRDT1, string RPRDT2, string rparType) + { + DbCommand cmd = Query.NewCommand(); + + StringBuilder filter = new StringBuilder(); + BuildRparGridFilter(filter, cmd, RPPYN, RPNUM1, RPNUM2, RPRDT1, RPRDT2, rparType); + + cmd.CommandText = String.Format("SELECT COUNT(*) FROM RPAR {0} {1}", RparGridWhere, filter.ToString()); + return WDAC.GetInt32Value(Query.ExecuteScalar(cmd)); + } + + private void BuildRparGridFilter(StringBuilder sb, DbCommand cmd, string RPPYN, string RPNUM1, string RPNUM2, string RPRDT1, string RPRDT2, string rparType) + { + switch (rparType) + { + case "0": + sb.Append(" AND RPTYP LIKE '0%' "); + break; + case "1": + sb.Append(" AND RPTYP LIKE '1%' "); + break; + case "21": + sb.Append(" AND RPTYP = '21' "); + break; + case "22": + sb.Append(" AND RPTYP = '22' "); + break; + case "3": + sb.Append(" AND RPTYP LIKE '3%' "); + break; + } + + if (!string.IsNullOrEmpty(RPPYN)) + { + sb.Append(" AND RPPYN = @RPPYN1 "); + cmd.Parameters.Add(Query.NewParameter("RPPYN1", RPPYN)); + } + + AppendRparRange(sb, cmd, "RPNUM", RPNUM1, RPNUM2, true); + AppendRparRange(sb, cmd, "RPRDT", RPRDT1, RPRDT2, false); + } + + private void AppendRparRange(StringBuilder sb, DbCommand cmd, string field, string value1, string value2, bool like) + { + bool has1 = !string.IsNullOrEmpty(value1); + bool has2 = !string.IsNullOrEmpty(value2); + + if (has1 && has2) + { + sb.AppendFormat(" AND {0} >= @{0}1 AND {0} <= @{0}2 ", field); + cmd.Parameters.Add(Query.NewParameter(field + "1", value1)); + cmd.Parameters.Add(Query.NewParameter(field + "2", value2)); + } + else if (has1) + { + if (like) + { + sb.AppendFormat(" AND {0} LIKE @{0}1 ", field); + cmd.Parameters.Add(Query.NewParameter(field + "1", value1 + "%")); + } + else + { + sb.AppendFormat(" AND {0} >= @{0}1 ", field); + cmd.Parameters.Add(Query.NewParameter(field + "1", value1)); + } + } + else if (has2) + { + if (like) + { + sb.AppendFormat(" AND {0} LIKE @{0}2 ", field); + cmd.Parameters.Add(Query.NewParameter(field + "2", value2 + "%")); + } + else + { + sb.AppendFormat(" AND {0} <= @{0}2 ", field); + cmd.Parameters.Add(Query.NewParameter(field + "2", value2)); + } + } + } } diff --git a/Web/forms/worker/fmRpar.ascx b/Web/forms/worker/fmRpar.ascx index 31bf2f9..2c5305f 100644 --- a/Web/forms/worker/fmRpar.ascx +++ b/Web/forms/worker/fmRpar.ascx @@ -6,12 +6,19 @@ CssClass="pageTitle"> - + + + + + + + + + + 0 ? RPRDT1.ToString("yyyy-MM-dd") : ""; + dsRPARGrid.SelectParameters["RPRDT2"].DefaultValue = RPRDT2.Ticks > 0 ? RPRDT2.ToString("yyyy-MM-dd") : ""; + dsRPARGrid.SelectParameters["rparType"].DefaultValue = rparType; dsRPARForm.SelectCommand = select + from + " WHERE RPREN=@RPREN "; } @@ -625,9 +618,9 @@ public partial class forms_worker_fmRpar : Wellan.Web.UI.WUserControlBase RPARGrid.DataBind(); } - protected void dsRPARGrid_Selected(object sender, SqlDataSourceStatusEventArgs e) + protected void dsRPARGrid_Selected(object sender, ObjectDataSourceStatusEventArgs e) { - if (e.AffectedRows == 0) + if (e.ReturnValue is Int32 && WDAC.GetInt32Value(e.ReturnValue) == 0) { switch (MultiView1.ActiveViewIndex) {