diff --git a/Doc/GridView改用ObjectDataSource計畫.md b/Doc/GridView改用ObjectDataSource計畫.md
index 7bc257e..f4a1c1c 100644
--- a/Doc/GridView改用ObjectDataSource計畫.md
+++ b/Doc/GridView改用ObjectDataSource計畫.md
@@ -25,9 +25,9 @@
| 7 | forms/customer/fmBpjb.ascx | gvBPJB | dsBPJBGrid | BPJB | 無→BpjbDAC | **完成** |
| 8 | forms/customer/fmBprj.ascx | gvBPRJ | dsBPRJGrid | BPRJ | BprjDAC(+Select) | **完成** |
| 9 | forms/customer/fmBprm.ascx | gvBPRM | dsBPRMGrid | BPRM | BprmDAC(+Select) | **完成** |
-| 10 | forms/customer/fmRasn.ascx | gvRASN_RAENO | dsRASN_RAENO1 | RASN+BPSNView | RasnDAC | 待辦 |
-| 11 | forms/customer/fmRasn.ascx | gvRASN_RABRH | dsRASN_RABRH1 | RASN+BCLS | RasnDAC | 待辦 |
-| 12 | forms/customer/fmRasn.ascx | RASNGrid | dsRASNGrid | RASN/BPJB/BPSNView | RasnDAC | 待辦 |
+| 10 | forms/customer/fmRasn.ascx | gvRASN_RAENO | dsRASN_RAENO1 | RASN+BPSNView | RasnDAC(+Select) | **完成** |
+| 11 | forms/customer/fmRasn.ascx | gvRASN_RABRH | dsRASN_RABRH1 | RASN+BCLS | RasnDAC(+Select) | **完成** |
+| 12 | forms/customer/fmRasn.ascx | RASNGrid | dsRASNGrid | RASN/BPJB/BPSNView | RasnDAC(+Select) | **完成** |
| 13 | forms/customer/fmRpfe.ascx | RPFEGrid | dsRPFEGrid | RPFE | 無 | 待辦 |
| 14 | forms/flow/fmSign.ascx | gvRPAB2 | dsRPAB2 | RPAB | RpabDAC | 待辦 |
| 15 | forms/flow/fmSign.ascx | gvRPAB | dsRPAB | RPAB | RpabDAC | 待辦 |
@@ -149,3 +149,4 @@
| 2026-09-10 | 轉換 fmBpjb(BPJB):新增 BpjbDAC(SelectPage/SelectCount);dsBPJBGrid 改 ObjectDataSource;編譯通過 |
| 2026-09-10 | 轉換 fmBprj(BPRJ):BprjDAC 新增 SelectPage/SelectCount/SelectBPRJIndex(含 LAST_YEAR 排序);dsBPRJGrid 改 ObjectDataSource;編譯通過 |
| 2026-09-10 | 轉換 fmBprm(BPRM):BprmDAC 新增 SelectPage/SelectCount;dsBPRMGrid 改 ObjectDataSource;dsBPRM_Selected 拆分為 grid/form 兩個事件;編譯通過 |
+| 2026-09-10 | 轉換 fmRasn(RASN,3 個 Grid):RasnDAC 新增 SelectPage/SelectCount 及 SelectRAENO/SelectRABRH;三個 datasource 改 ObjectDataSource;Search/Selected 調整;編譯通過 |
diff --git a/Web/App_Code/DAC/RasnDAC.cs b/Web/App_Code/DAC/RasnDAC.cs
index 82d512a..bf49014 100644
--- a/Web/App_Code/DAC/RasnDAC.cs
+++ b/Web/App_Code/DAC/RasnDAC.cs
@@ -12,6 +12,7 @@ using Wellan.Data;
///
/// 人員派遣資料的資料處理類別
///
+[DataObject(true)]
public class RasnDAC : Wellan.Data.WDAC
{
private DbCommand cmdSelectRasnRapyn = null;
@@ -582,6 +583,124 @@ public class RasnDAC : Wellan.Data.WDAC
}
*/
+ ///
+ /// 派遣人員清單 (未結束,供挑選人員用)
+ ///
+ [DataObjectMethod(DataObjectMethodType.Select)]
+ public DataTable SelectRAENO(string RAPYN)
+ {
+ DbCommand cmd = Query.NewCommand(
+ @"SELECT A.RANUM, B.BPNME
+ FROM RASN AS A
+ INNER JOIN BPSNView AS B ON A.RANUM = B.BPENO
+ WHERE (A.RAPYN = @RAPYN) AND A.RAEDT IS NULL");
+ cmd.Parameters.Add(Query.NewParameter("RAPYN", RAPYN));
+ return Query.Select(cmd);
+ }
+
+ ///
+ /// 站別統計 (未結束,供挑選站別用)
+ ///
+ [DataObjectMethod(DataObjectMethodType.Select)]
+ public DataTable SelectRABRH(string RAPYN)
+ {
+ DbCommand cmd = Query.NewCommand(
+ @"SELECT A.RABRH, B.BSSCR, COUNT(1) AS RABRH_COUNT
+ FROM RASN AS A
+ INNER JOIN BCLS AS B ON A.RABRH = B.BSCLS AND B.BSPAR = 'BPSNBRH'
+ WHERE (A.RAPYN = @RAPYN) AND A.RAEDT IS NULL
+ GROUP BY A.RABRH, B.BSSCR");
+ cmd.Parameters.Add(Query.NewParameter("RAPYN", RAPYN));
+ return Query.Select(cmd);
+ }
+
+ private static readonly List HQ_RAPYNS = new List() { "103TYB00001", "103JYB00001" };
+
+ private string BuildRasnGridSql(string RAPYN, string BPENO, string BPNME, int year, StringBuilder filter, DbCommand cmd)
+ {
+ string order1, order2;
+ if (HQ_RAPYNS.IndexOf(RAPYN) < 0)
+ {
+ order1 = "RANUM";
+ order2 = "RAEDT, RANUM";
+ }
+ else
+ {
+ order1 = "RAEDT, RANUM";
+ order2 = "RAEDT, RANUM";
+ }
+
+ if (year > 0 && HQ_RAPYNS.IndexOf(RAPYN) < 0)
+ {
+ filter.AppendFormat(
+ " AND ((RASDT >= '{0}/01/01' AND RASDT <= '{0}/12/31') OR (RAEDT >= '{0}/01/01' AND RAEDT <= '{0}/12/31') OR (RASDT <= '{0}/01/01' AND RAEDT >= '{0}/12/31') ) ",
+ year);
+ }
+ if (!string.IsNullOrEmpty(BPENO))
+ {
+ filter.Append(" AND C.BPENO LIKE @BPENO1 ");
+ cmd.Parameters.Add(Query.NewParameter("BPENO1", BPENO + "%"));
+ }
+ if (!string.IsNullOrEmpty(BPNME))
+ {
+ filter.Append(" AND C.BPNME LIKE @BPNME1 ");
+ cmd.Parameters.Add(Query.NewParameter("BPNME1", BPNME + "%"));
+ }
+
+ return String.Format(@"
+SELECT A.*, B.BPSRM, B.BPSRD, B.BPP01, B.BPP02, B.BPP03, B.BPP04, B.BPP05
+FROM
+ (
+ SELECT * FROM (SELECT *, ROW_NUMBER() OVER (ORDER BY {0}) ROWNUM FROM RASN WHERE RAPYN=@RAPYN AND RAEDT IS NULL) T1
+ UNION ALL
+ SELECT * FROM (SELECT *, ROW_NUMBER() OVER (ORDER BY {1}) ROWNUM FROM RASN WHERE RAPYN=@RAPYN AND RAEDT IS NOT NULL) T2
+ ) A
+ LEFT OUTER JOIN BPJB B ON A.RAPYN=B.BPPYN AND A.RAJNO=B.BPJNO AND A.RACNO=B.BPCNO
+ LEFT OUTER JOIN BPSNView C ON A.RANUM=C.BPENO
+WHERE 1=1 {2}", order1, order2, filter.ToString());
+ }
+
+ ///
+ /// 派遣紀錄 Grid 分頁查詢
+ ///
+ [DataObjectMethod(DataObjectMethodType.Select)]
+ public DataTable SelectPage(int startRowIndex, int maximumRows, string RAPYN, string BPENO, string BPNME, int year)
+ {
+ DbCommand cmd = Query.NewCommand();
+
+ StringBuilder filter = new StringBuilder();
+ string inner = BuildRasnGridSql(RAPYN, BPENO, BPNME, year, filter, cmd);
+
+ cmd.CommandText = String.Format(
+ @"SELECT * FROM
+ (
+ SELECT Q.*, ROW_NUMBER() OVER (ORDER BY CASE WHEN Q.RAEDT IS NULL THEN 0 ELSE 1 END, Q.ROWNUM) AS ROWID
+ FROM ( {0} ) Q
+ ) AS TMP
+ WHERE ROWID BETWEEN @STARTROWINDEX + 1 AND @STARTROWINDEX + @MAXIMUMROWS
+ ORDER BY ROWID", inner);
+ cmd.Parameters.Add(Query.NewParameter("RAPYN", RAPYN));
+ 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 RAPYN, string BPENO, string BPNME, int year)
+ {
+ DbCommand cmd = Query.NewCommand();
+
+ StringBuilder filter = new StringBuilder();
+ string inner = BuildRasnGridSql(RAPYN, BPENO, BPNME, year, filter, cmd);
+
+ cmd.CommandText = String.Format("SELECT COUNT(*) FROM ( {0} ) Q", inner);
+ cmd.Parameters.Add(Query.NewParameter("RAPYN", RAPYN));
+ return WDAC.GetInt32Value(Query.ExecuteScalar(cmd));
+ }
}
diff --git a/Web/forms/customer/fmRasn.ascx b/Web/forms/customer/fmRasn.ascx
index 379c857..e0a6e3c 100644
--- a/Web/forms/customer/fmRasn.ascx
+++ b/Web/forms/customer/fmRasn.ascx
@@ -53,28 +53,19 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
-
+
+
+
+
+
+
+
+
HQ_RAPYNS = new List() { "103TYB00001", "103JYB00001" };
- String searchOrder1 = String.Empty, searchOrder2 = String.Empty;
- if (HQ_RAPYNS.IndexOf(_RAPYN) < 0)
- {
- searchOrder1 = "RANUM";
- searchOrder2 = "RAEDT, RANUM";
- }
- else
- {
- searchOrder1 = "RAEDT, RANUM";
- searchOrder2 = "RAEDT, RANUM";
- }
- sql.Append(string.Format(@"
-SELECT A.*, B.BPSRM, B.BPSRD, B.BPP01, B.BPP02, B.BPP03, B.BPP04, B.BPP05
-FROM
- (
- SELECT * FROM (SELECT *, ROW_NUMBER() OVER (ORDER BY {0}) ROWNUM FROM RASN WHERE RAPYN=@RAPYN AND RAEDT IS NULL) T1
- UNION ALL
- SELECT * FROM (SELECT *, ROW_NUMBER() OVER (ORDER BY {1}) ROWNUM FROM RASN WHERE RAPYN=@RAPYN AND RAEDT IS NOT NULL) T2
- ) A
- LEFT OUTER JOIN BPJB B ON A.RAPYN=B.BPPYN AND A.RAJNO=B.BPJNO AND A.RACNO=B.BPCNO
- LEFT OUTER JOIN BPSNView C ON A.RANUM=C.BPENO
-WHERE 1=1
-", searchOrder1, searchOrder2));
+ int year = 0;
if (!string.IsNullOrEmpty(txtYY.Text) && HQ_RAPYNS.IndexOf(_RAPYN) < 0)
- {
- sql.Append(string.Format(" AND ((RASDT >= '{0}/01/01' AND RASDT <= '{0}/12/31') OR (RAEDT >= '{0}/01/01' AND RAEDT <= '{0}/12/31') OR (RASDT <= '{0}/01/01' AND RAEDT >= '{0}/12/31') ) ", WQuery.GetInt32Value(txtYY.Text) + WGuard1.CY11));
- }
+ year = WQuery.GetInt32Value(txtYY.Text) + WGuard1.CY11;
- dsRASNGrid.SelectParameters.Clear();
- dsRASNGrid.SelectParameters.Add(new Parameter("RAPYN", DbType.String, _RAPYN));
- // AddSearch(sql, dsRASNGrid, "RAPYN", _RAPYN, "", true);
- AddSearch(sql, dsRASNGrid, "C.BPENO", _BPENO, "", true);
- AddSearch(sql, dsRASNGrid, "C.BPNME", _BPNME, "", true);
-
- dsRASNGrid.SelectCommand = sql.ToString();
+ dsRASNGrid.SelectParameters["RAPYN"].DefaultValue = _RAPYN;
+ dsRASNGrid.SelectParameters["BPENO"].DefaultValue = _BPENO;
+ dsRASNGrid.SelectParameters["BPNME"].DefaultValue = _BPNME;
+ dsRASNGrid.SelectParameters["year"].DefaultValue = year.ToString();
}
// 存檔前的計算動作
@@ -302,9 +271,9 @@ WHERE 1=1
RASNGrid.DataBind();
}
- protected void dsRASNGrid_Selected(object sender, SqlDataSourceStatusEventArgs e)
+ protected void dsRASNGrid_Selected(object sender, ObjectDataSourceStatusEventArgs e)
{
- if (e.AffectedRows == 0)
+ if (e.ReturnValue is Int32 && WDAC.GetInt32Value(e.ReturnValue) == 0)
{
if (ForwardSource != "")
RASNForm.ChangeMode(FormViewMode.Insert);