diff --git a/Doc/GridView改用ObjectDataSource計畫.md b/Doc/GridView改用ObjectDataSource計畫.md
index 7c5317c..82f492d 100644
--- a/Doc/GridView改用ObjectDataSource計畫.md
+++ b/Doc/GridView改用ObjectDataSource計畫.md
@@ -35,8 +35,8 @@
| 17 | forms/worker/fmBpsn.ascx | GridView1 | dsBPSNGrid | BPSNView | BpsnDAC | **進行中** |
| 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 | 待辦 |
+| 20 | forms/worker/fmRparWorker.ascx | RPABGrid | dsRPAB | RPAB | RpabDAC(+Select) | **完成** |
+| 21 | forms/worker/fmRparWorker.ascx | RPARGrid | dsRPARGrid | RPAR | RparDAC(+Select) | **完成** |
| 22 | forms/worker/fmRsaj.ascx | RSAJGrid | dsRSAJGrid | RSAJ | RsajDAC | 待辦 |
| 23 | forms/worker/fmSendSalaryStrip.ascx | gvSSMS | dsSSMS | SSMS | SsmsDAC | 待辦 |
| 24 | forms/worker/fmSendSalaryStrip.ascx | gvSSMSSum | dsSSMSSum | SSMS | SsmsDAC | 待辦 |
@@ -154,4 +154,5 @@
| 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 | 轉換 fmRparWorker(RPAR/RPAB):RparDAC 新增 SelectWorkerPage/SelectWorkerCount;RpabDAC 新增 SelectRPABByRPREN;dsRPARGrid/dsRPAB 改 ObjectDataSource;編譯通過 |
| 2026-09-10 | fmRowk(ROWK)保留未轉換:其 Grid 綁定使用 WUserControlBase 的 Grid_View/GridView_DataSource(SqlDataSource)框架與 override Search,無法直接改用 ObjectDataSource,需另案重構 |
diff --git a/Web/App_Code/DAC/RpabDAC.cs b/Web/App_Code/DAC/RpabDAC.cs
index c24ba6c..bbba682 100644
--- a/Web/App_Code/DAC/RpabDAC.cs
+++ b/Web/App_Code/DAC/RpabDAC.cs
@@ -304,4 +304,18 @@ public class RpabDAC : Wellan.Data.WDAC
cmd.Parameters.Add(Query.NewParameter("RPREN", RPREN));
return Query.Select(cmd);
}
+
+ ///
+ /// 取得簽核關卡明細 (全部)
+ ///
+ [DataObjectMethod(DataObjectMethodType.Select)]
+ public DataTable SelectRPABByRPREN(string RPREN)
+ {
+ DbCommand cmd = Query.NewCommand(
+ @"SELECT RPANO, RPAPN, RPENO, RPDAT, RPAPP, RPDOC
+ FROM RPAB
+ WHERE RPREN = @RPREN");
+ cmd.Parameters.Add(Query.NewParameter("RPREN", RPREN));
+ return Query.Select(cmd);
+ }
}
\ No newline at end of file
diff --git a/Web/App_Code/DAC/RparDAC.cs b/Web/App_Code/DAC/RparDAC.cs
index 46995e7..f4b6a49 100644
--- a/Web/App_Code/DAC/RparDAC.cs
+++ b/Web/App_Code/DAC/RparDAC.cs
@@ -1975,6 +1975,68 @@ public class RparDAC : Wellan.Data.WDAC
}
}
}
+
+ ///
+ /// 差勤紀錄 Grid 分頁查詢 (員工本人)
+ ///
+ [DataObjectMethod(DataObjectMethodType.Select)]
+ public DataTable SelectWorkerPage(int startRowIndex, int maximumRows, string RPNUM_FIXED, string RPRDT1, string RPRDT2, string rparType)
+ {
+ DbCommand cmd = Query.NewCommand();
+
+ StringBuilder filter = new StringBuilder();
+ BuildWorkerGridFilter(filter, cmd, RPNUM_FIXED, RPRDT1, RPRDT2, rparType);
+
+ cmd.CommandText = String.Format(
+ @"SELECT * FROM
+ (
+ SELECT {0}, ROW_NUMBER() OVER (ORDER BY RPREN) AS ROWID
+ FROM RPAR {1}
+ ) AS TMP
+ WHERE ROWID BETWEEN @STARTROWINDEX + 1 AND @STARTROWINDEX + @MAXIMUMROWS
+ ORDER BY ROWID",
+ RparGridColumns, 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 SelectWorkerCount(string RPNUM_FIXED, string RPRDT1, string RPRDT2, string rparType)
+ {
+ DbCommand cmd = Query.NewCommand();
+
+ StringBuilder filter = new StringBuilder();
+ BuildWorkerGridFilter(filter, cmd, RPNUM_FIXED, RPRDT1, RPRDT2, rparType);
+
+ cmd.CommandText = String.Format("SELECT COUNT(*) FROM RPAR {0}", filter.ToString());
+ return WDAC.GetInt32Value(Query.ExecuteScalar(cmd));
+ }
+
+ private void BuildWorkerGridFilter(StringBuilder sb, DbCommand cmd, string RPNUM_FIXED, string RPRDT1, string RPRDT2, string rparType)
+ {
+ sb.Append(" WHERE RPNUM = @RPNUM_FIXED ");
+ cmd.Parameters.Add(Query.NewParameter("RPNUM_FIXED", RPNUM_FIXED));
+
+ switch (rparType)
+ {
+ case "0":
+ sb.Append(" AND RPTYP LIKE '0%' AND RPADT IS NOT NULL ");
+ break;
+ case "1":
+ sb.Append(" AND RPTYP LIKE '1%' AND RPADT IS NOT NULL ");
+ break;
+ case "3":
+ sb.Append(" AND RPTYP LIKE '3%' AND RPADT IS NOT NULL ");
+ break;
+ }
+
+ AppendRparRange(sb, cmd, "RPRDT", RPRDT1, RPRDT2, false);
+ }
}
diff --git a/Web/forms/worker/fmRparWorker.ascx b/Web/forms/worker/fmRparWorker.ascx
index aedf98e..81b6c9b 100644
--- a/Web/forms/worker/fmRparWorker.ascx
+++ b/Web/forms/worker/fmRparWorker.ascx
@@ -5,9 +5,16 @@
TagPrefix="uc1" %>
-
+
+
+
+
+
+
+
+
+
-
+
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 ";
@@ -959,9 +951,9 @@ public partial class forms_customer_fmRpar : Wellan.Web.UI.WUserControlBase
gvRPAD.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)
{