diff --git a/Doc/GridView改用ObjectDataSource計畫.md b/Doc/GridView改用ObjectDataSource計畫.md
index 77e11e0..4fbb4f4 100644
--- a/Doc/GridView改用ObjectDataSource計畫.md
+++ b/Doc/GridView改用ObjectDataSource計畫.md
@@ -23,7 +23,7 @@
| 5 | forms/customer/fmBpabSmall.ascx | gvBPAB | dsBPABGrid | BPAB | 無→BpabDAC | **完成** |
| 6 | forms/customer/fmBpja.ascx | gvBPJA | dsBPJAGrid | BPJA | 無→BpjaDAC | **完成** |
| 7 | forms/customer/fmBpjb.ascx | gvBPJB | dsBPJBGrid | BPJB | 無→BpjbDAC | **完成** |
-| 8 | forms/customer/fmBprj.ascx | gvBPRJ | dsBPRJGrid | BPRJ | BprjDAC | 待辦 |
+| 8 | forms/customer/fmBprj.ascx | gvBPRJ | dsBPRJGrid | BPRJ | BprjDAC(+Select) | **完成** |
| 9 | forms/customer/fmBprm.ascx | gvBPRM | dsBPRMGrid | BPRM | BprmDAC | 待辦 |
| 10 | forms/customer/fmRasn.ascx | gvRASN_RAENO | dsRASN_RAENO1 | RASN+BPSNView | RasnDAC | 待辦 |
| 11 | forms/customer/fmRasn.ascx | gvRASN_RABRH | dsRASN_RABRH1 | RASN+BCLS | RasnDAC | 待辦 |
@@ -147,3 +147,4 @@
| 2026-09-10 | 轉換 fmBpab / fmBpabBig / fmBpabSmall(BPAB):新增 BpabDAC(SelectPage/SelectCount,mode 區分科目/大類/小類);三檔 dsBPABGrid 改 ObjectDataSource;編譯通過 |
| 2026-09-10 | 轉換 fmBpja(BPJA):新增 BpjaDAC(SelectPage/SelectCount/SelectBPJAIndex);dsBPJAGrid 改 ObjectDataSource;編譯通過 |
| 2026-09-10 | 轉換 fmBpjb(BPJB):新增 BpjbDAC(SelectPage/SelectCount);dsBPJBGrid 改 ObjectDataSource;編譯通過 |
+| 2026-09-10 | 轉換 fmBprj(BPRJ):BprjDAC 新增 SelectPage/SelectCount/SelectBPRJIndex(含 LAST_YEAR 排序);dsBPRJGrid 改 ObjectDataSource;編譯通過 |
diff --git a/Web/App_Code/DAC/BprjDAC.cs b/Web/App_Code/DAC/BprjDAC.cs
index f076854..0635acf 100644
--- a/Web/App_Code/DAC/BprjDAC.cs
+++ b/Web/App_Code/DAC/BprjDAC.cs
@@ -5,12 +5,15 @@ using System.Configuration;
using System.Data.Common;
using System.Collections;
using System.Collections.Generic;
+using System.ComponentModel;
+using System.Text;
using Wellan.Data;
using Wellan.Common;
///
/// BprjDAC 的摘要描述
///
+[DataObject(true)]
public class BprjDAC : Wellan.Data.WDAC
{
public BprjDAC()
@@ -28,4 +31,100 @@ public class BprjDAC : Wellan.Data.WDAC
{
this._query = query;
}
+
+ private const string LastYearExpr =
+ "(SELECT TOP 1 BPYER FROM BPAA WHERE BPAA.BPPNM = BPRJ.BPPNM ORDER BY BPYER DESC)";
+
+ ///
+ /// 客戶專案 Grid 分頁查詢
+ ///
+ [DataObjectMethod(DataObjectMethodType.Select)]
+ public DataTable SelectPage(int startRowIndex, int maximumRows, string BPNUM, string BPPNM, string BPPME)
+ {
+ DbCommand cmd = Query.NewCommand();
+
+ StringBuilder filter = new StringBuilder();
+ BuildFilter(filter, cmd, BPNUM, BPPNM, BPPME);
+
+ cmd.CommandText = String.Format(
+ @"SELECT * FROM
+ (
+ SELECT X.*, ROW_NUMBER() OVER (ORDER BY LAST_YEAR DESC, BPNUM, BPPNM) AS ROWID
+ FROM
+ (
+ SELECT *, {0} LAST_YEAR FROM BPRJ WHERE 1=1 {1}
+ ) X
+ ) AS TMP
+ WHERE ROWID BETWEEN @STARTROWINDEX + 1 AND @STARTROWINDEX + @MAXIMUMROWS
+ ORDER BY ROWID",
+ LastYearExpr, 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 BPNUM, string BPPNM, string BPPME)
+ {
+ DbCommand cmd = Query.NewCommand();
+
+ StringBuilder filter = new StringBuilder();
+ BuildFilter(filter, cmd, BPNUM, BPPNM, BPPME);
+
+ cmd.CommandText = String.Format("SELECT COUNT(*) FROM BPRJ WHERE 1=1 {0}", filter.ToString());
+ return WDAC.GetInt32Value(Query.ExecuteScalar(cmd));
+ }
+
+ ///
+ /// 取得指定專案在查詢結果中的序號 (0 起算)
+ ///
+ public int SelectBPRJIndex(string targetBPNUM, string targetBPPNM, string BPNUM, string BPPNM, string BPPME)
+ {
+ DbCommand cmd = Query.NewCommand();
+
+ StringBuilder filter = new StringBuilder();
+ BuildFilter(filter, cmd, BPNUM, BPPNM, BPPME);
+
+ cmd.CommandText = String.Format(
+ @"SELECT ROWID - 1 FROM
+ (
+ SELECT X.BPNUM, X.BPPNM, ROW_NUMBER() OVER (ORDER BY X.LAST_YEAR DESC, X.BPNUM, X.BPPNM) AS ROWID
+ FROM
+ (
+ SELECT BPNUM, BPPNM, {0} LAST_YEAR FROM BPRJ WHERE 1=1 {1}
+ ) X
+ ) AS TMP WHERE BPNUM = @TARGET_BPNUM AND BPPNM = @TARGET_BPPNM",
+ LastYearExpr, filter.ToString());
+ cmd.Parameters.Add(Query.NewParameter("TARGET_BPNUM", targetBPNUM));
+ cmd.Parameters.Add(Query.NewParameter("TARGET_BPPNM", targetBPPNM));
+
+ object o = Query.ExecuteScalar(cmd);
+ return (o is Int32 || o is Int64) ? WDAC.GetInt32Value(o) : -1;
+ }
+
+ ///
+ /// 組出客戶專案 Grid 的查詢條件 (與舊 AddSearch 行為一致)
+ ///
+ private void BuildFilter(StringBuilder sb, DbCommand cmd, string BPNUM, string BPPNM, string BPPME)
+ {
+ if (!string.IsNullOrEmpty(BPNUM))
+ {
+ sb.Append(" AND BPNUM LIKE @BPNUM1 ");
+ cmd.Parameters.Add(Query.NewParameter("BPNUM1", BPNUM + "%"));
+ }
+ if (!string.IsNullOrEmpty(BPPNM))
+ {
+ sb.Append(" AND BPPNM LIKE @BPPNM1 ");
+ cmd.Parameters.Add(Query.NewParameter("BPPNM1", BPPNM + "%"));
+ }
+ if (!string.IsNullOrEmpty(BPPME))
+ {
+ sb.Append(" AND BPPME LIKE @BPPME1 ");
+ cmd.Parameters.Add(Query.NewParameter("BPPME1", "%" + BPPME + "%"));
+ }
+ }
}
\ No newline at end of file
diff --git a/Web/forms/customer/fmBprj.ascx b/Web/forms/customer/fmBprj.ascx
index 4f42648..3aa3c62 100644
--- a/Web/forms/customer/fmBprj.ascx
+++ b/Web/forms/customer/fmBprj.ascx
@@ -57,10 +57,15 @@
-
+
+
+
+
+
+
+
= 0)
+ {
+ gvBPRJ.PageIndex = rowIndex / gvBPRJ.PageSize;
+ gvBPRJ.SelectedIndex = rowIndex - gvBPRJ.PageIndex * gvBPRJ.PageSize;
+ }
+
+ ParamList.Remove("BPNUM");
+ ParamList.Remove("BPPNM");
+ }
}
protected string GetBtmeName(object bptme)
@@ -155,25 +161,6 @@ public partial class forms_customer_fmBprj : Wellan.Web.UI.WUserControlBase
if (gvBPRJ.SelectedIndex == -1)
gvBPRJ.SelectedIndex = 0;
- // 返回時,回到之前選擇的那一筆
- if (ParamList.ContainsKey("BPNUM") && ParamList.ContainsKey("BPPNM"))
- {
- string bpnum = WDAC.GetStringValue(ParamList["BPNUM"]);
- string bppnm = WDAC.GetStringValue(ParamList["BPPNM"]);
-
- DataView dv = dsBPRJGrid.Select(new DataSourceSelectArguments()) as DataView;
- dv.RowFilter = String.Format("BPNUM='{0}' and BPPNM='{1}'", bpnum, bppnm);
- if (dv.Count > 0)
- {
- int rowIndex = dv.Table.Rows.IndexOf(dv[0].Row);
- gvBPRJ.PageIndex = (rowIndex / gvBPRJ.PageSize);
- gvBPRJ.SelectedIndex = rowIndex - gvBPRJ.PageIndex * gvBPRJ.PageSize;
- }
-
- ParamList.Remove("BPNUM");
- ParamList.Remove("BPPNM");
- }
-
fvBPRJ.DataBind();
}
@@ -185,10 +172,10 @@ public partial class forms_customer_fmBprj : Wellan.Web.UI.WUserControlBase
}
// 資料擷取完後的事件
- protected void dsBPRJGrid_Selected(object sender, SqlDataSourceStatusEventArgs e)
+ protected void dsBPRJGrid_Selected(object sender, ObjectDataSourceStatusEventArgs e)
{
// 沒有資料,回到查詢畫面
- if (e.AffectedRows == 0)
+ if (e.ReturnValue is Int32 && WDAC.GetInt32Value(e.ReturnValue) == 0)
{
if (MultiView1.ActiveViewIndex != 0)
MultiView1.ActiveViewIndex = 0;