diff --git a/Doc/GridView改用ObjectDataSource計畫.md b/Doc/GridView改用ObjectDataSource計畫.md index d469908..2d85170 100644 --- a/Doc/GridView改用ObjectDataSource計畫.md +++ b/Doc/GridView改用ObjectDataSource計畫.md @@ -17,7 +17,7 @@ | # | 檔案 | GridView ID | SqlDataSource ID | 來源表 | 既有 DAC | 狀態 | |---|---|---|---|---|---|---| | 1 | forms/customer/fmBcus.ascx | gvBCUS | dsBCUSGrid | BCUS | 無→BcusDAC | **完成** | -| 2 | forms/customer/fmBpaa.ascx | gvBPAA | dsBPAAGrid | BPAA | BpaaDAC(無 Select) | 待辦 | +| 2 | forms/customer/fmBpaa.ascx | gvBPAA | dsBPAAGrid | BPAA | BpaaDAC(+Select) | **完成** | | 3 | forms/customer/fmBpab.ascx | gvBPAB | dsBPABGrid | BPAB | 無 | 待辦 | | 4 | forms/customer/fmBpabBig.ascx | gvBPAB | dsBPABGrid | BPAB | 無 | 待辦 | | 5 | forms/customer/fmBpabSmall.ascx | gvBPAB | dsBPABGrid | BPAB | 無 | 待辦 | @@ -143,3 +143,4 @@ | 2026-09-10 | 以 LocalDB 合成資料(2 萬/10 萬筆)基準測試舊 SqlDataSource 與新 ObjectDataSource;結果:首頁列數 ~10,000×、記憶體趨近 0、DB 時間約 6×;深頁跳轉 reads 反而增加 | | 2026-09-10 | 分頁 SQL 形式比較:`BETWEEN` 與 `TOP` 相同(無改善);改採 KEYSET(窄集合算 ROWID 再 join 明細)並將 SelectCount/SelectBPENOIndex 改為窄集合。深頁 2,166ms/262萬 reads → 48ms/6,549 reads;count 714ms/608,176 reads → 110ms/6,253 reads;aspnet_compiler 編譯通過 | | 2026-09-10 | 轉換 fmBcus(BCUS):新增 BcusDAC;dsBCUSGrid 改 ObjectDataSource;跳回選取列改用 SelectBCNUMIndex;aspnet_compiler 編譯通過 | +| 2026-09-10 | 轉換 fmBpaa(BPAA):BpaaDAC 新增 SelectPage/SelectCount/SelectBPAAIndex;dsBPAAGrid 改 ObjectDataSource;編譯通過 | diff --git a/Web/App_Code/DAC/BpaaDAC.cs b/Web/App_Code/DAC/BpaaDAC.cs index 6f472fb..e5b73c0 100644 --- a/Web/App_Code/DAC/BpaaDAC.cs +++ b/Web/App_Code/DAC/BpaaDAC.cs @@ -3,12 +3,15 @@ using System.Data; using System.Configuration; using System.Data.Common; using System.Collections; +using System.ComponentModel; +using System.Text; using Wellan.Common; using Wellan.Data; /// /// 取得專案年度接單資料 /// +[DataObject(true)] public class BpaaDAC : Wellan.Data.WDAC { public BpaaDAC() @@ -325,4 +328,96 @@ public class BpaaDAC : Wellan.Data.WDAC cmd.Parameters.Add(Query.NewParameter("BPPNM", bppnm)); return WDAC.GetStringValue(Query.ExecuteScalar(cmd)); } + + /// + /// 年度接單 Grid 分頁查詢 + /// + [DataObjectMethod(DataObjectMethodType.Select)] + public DataTable SelectPage(int startRowIndex, int maximumRows, string BPPNM, string BPYER, string BPPYN, string BPPYM) + { + DbCommand cmd = Query.NewCommand(); + + StringBuilder filter = new StringBuilder(); + BuildFilter(filter, cmd, BPPNM, BPYER, BPPYN, BPPYM); + + cmd.CommandText = String.Format( + @"SELECT * FROM + ( + SELECT *, ROW_NUMBER() OVER (ORDER BY BPPNM, BPYER) AS ROWID + FROM BPAA WHERE 1=1 {0} + ) AS TMP + WHERE ROWID BETWEEN @STARTROWINDEX + 1 AND @STARTROWINDEX + @MAXIMUMROWS + ORDER BY ROWID", + 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 BPPNM, string BPYER, string BPPYN, string BPPYM) + { + DbCommand cmd = Query.NewCommand(); + + StringBuilder filter = new StringBuilder(); + BuildFilter(filter, cmd, BPPNM, BPYER, BPPYN, BPPYM); + + cmd.CommandText = String.Format("SELECT COUNT(*) FROM BPAA WHERE 1=1 {0}", filter.ToString()); + return WDAC.GetInt32Value(Query.ExecuteScalar(cmd)); + } + + /// + /// 取得指定年度接單在查詢結果中的序號 (0 起算) + /// + public int SelectBPAAIndex(string targetBPPNM, string targetBPYER, string BPPNM, string BPYER, string BPPYN, string BPPYM) + { + DbCommand cmd = Query.NewCommand(); + + StringBuilder filter = new StringBuilder(); + BuildFilter(filter, cmd, BPPNM, BPYER, BPPYN, BPPYM); + + cmd.CommandText = String.Format( + @"SELECT ROWID - 1 FROM + ( + SELECT BPPNM, BPYER, ROW_NUMBER() OVER (ORDER BY BPPNM, BPYER) AS ROWID + FROM BPAA WHERE 1=1 {0} + ) AS TMP WHERE BPPNM = @TARGET_BPPNM AND BPYER = @TARGET_BPYER", + filter.ToString()); + cmd.Parameters.Add(Query.NewParameter("TARGET_BPPNM", targetBPPNM)); + cmd.Parameters.Add(Query.NewParameter("TARGET_BPYER", targetBPYER)); + + 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 BPPNM, string BPYER, string BPPYN, string BPPYM) + { + if (!string.IsNullOrEmpty(BPPNM)) + { + sb.Append(" AND BPPNM LIKE @BPPNM1 "); + cmd.Parameters.Add(Query.NewParameter("BPPNM1", BPPNM + "%")); + } + if (!string.IsNullOrEmpty(BPYER)) + { + sb.Append(" AND BPYER LIKE @BPYER1 "); + cmd.Parameters.Add(Query.NewParameter("BPYER1", BPYER + "%")); + } + if (!string.IsNullOrEmpty(BPPYN)) + { + sb.Append(" AND BPPYN LIKE @BPPYN1 "); + cmd.Parameters.Add(Query.NewParameter("BPPYN1", BPPYN + "%")); + } + if (!string.IsNullOrEmpty(BPPYM)) + { + sb.Append(" AND BPPYM LIKE @BPPYM1 "); + cmd.Parameters.Add(Query.NewParameter("BPPYM1", BPPYM + "%")); + } + } } \ No newline at end of file diff --git a/Web/forms/customer/fmBpaa.ascx b/Web/forms/customer/fmBpaa.ascx index de7c270..82e7823 100644 --- a/Web/forms/customer/fmBpaa.ascx +++ b/Web/forms/customer/fmBpaa.ascx @@ -66,10 +66,16 @@ TextMessageId="" Visible="False"> - + + + + + + + + = 0) + { + gvBPAA.PageIndex = rowIndex / gvBPAA.PageSize; + gvBPAA.SelectedIndex = rowIndex - gvBPAA.PageIndex * gvBPAA.PageSize; + } + + ParamList.Remove("BPYER"); + } } private void CalcFields(System.Collections.Specialized.IOrderedDictionary values) @@ -155,22 +160,6 @@ public partial class forms_customer_fmBpaa : Wellan.Web.UI.WUserControlBase if (gvBPAA.SelectedIndex == -1) gvBPAA.SelectedIndex = 0; - // 返回時,回到之前選擇的那一筆 - if (ParamList.ContainsKey("BPPNM") && ParamList.ContainsKey("BPYER")) - { - DataView dv = dsBPAAGrid.Select(new DataSourceSelectArguments()) as DataView; - dv.RowFilter = String.Format("BPPNM='{0}' and BPYER={1}", ParamList["BPPNM"], ParamList["BPYER"]); - if (dv.Count > 0) - { - int rowIndex = dv.Table.Rows.IndexOf(dv[0].Row); - gvBPAA.PageIndex = (rowIndex / gvBPAA.PageSize); - gvBPAA.SelectedIndex = rowIndex - gvBPAA.PageIndex * gvBPAA.PageSize; - } - - // ParamList.Remove("BPPNM"); - ParamList.Remove("BPYER"); - } - fvBPAA.DataBind(); } } @@ -182,9 +171,9 @@ public partial class forms_customer_fmBpaa : Wellan.Web.UI.WUserControlBase gvBPAA.DataBind(); } - protected void dsBPAAGrid_Selected(object sender, SqlDataSourceStatusEventArgs e) + protected void dsBPAAGrid_Selected(object sender, ObjectDataSourceStatusEventArgs e) { - if (e.AffectedRows == 0) + if (e.ReturnValue is Int32 && WDAC.GetInt32Value(e.ReturnValue) == 0) { fvBPAA.ChangeMode(FormViewMode.Insert); fvBPAA_ModeChanged(sender, e);