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)
{