From 5c4e04788b54bf18c86605d15dacc8bc3093c5f3 Mon Sep 17 00:00:00 2001 From: Neo Yang Date: Thu, 10 Sep 2026 10:34:13 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20fmBcus=20GridView=20=E6=94=B9=E7=94=A8?= =?UTF-8?q?=20ObjectDataSource?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 BcusDAC(SelectPage/SelectCount/SelectBCNUMIndex) - dsBCUSGrid 改 ObjectDataSource(EnablePaging) - Search/Selected/DataBound 調整;跳回選取列改用 SelectBCNUMIndex - 計畫文檔更新盤點與待辦 --- Doc/GridView改用ObjectDataSource計畫.md | 6 +- Web/App_Code/DAC/BcusDAC.cs | 110 ++++++++++++++++++++++++ Web/forms/customer/fmBcus.ascx | 13 +-- Web/forms/customer/fmBcus.ascx.cs | 52 ++++------- 4 files changed, 141 insertions(+), 40 deletions(-) create mode 100644 Web/App_Code/DAC/BcusDAC.cs diff --git a/Doc/GridView改用ObjectDataSource計畫.md b/Doc/GridView改用ObjectDataSource計畫.md index 4630d7b..d469908 100644 --- a/Doc/GridView改用ObjectDataSource計畫.md +++ b/Doc/GridView改用ObjectDataSource計畫.md @@ -16,7 +16,7 @@ | # | 檔案 | GridView ID | SqlDataSource ID | 來源表 | 既有 DAC | 狀態 | |---|---|---|---|---|---|---| -| 1 | forms/customer/fmBcus.ascx | gvBCUS | dsBCUSGrid | BCUS | 無 | 待辦 | +| 1 | forms/customer/fmBcus.ascx | gvBCUS | dsBCUSGrid | BCUS | 無→BcusDAC | **完成** | | 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 | 無 | 待辦 | @@ -130,7 +130,8 @@ - [x] fmBPSN:fmBpsn.ascx.cs 調整 Search / Selected / OnInit - [x] fmBPSN:編譯驗證(aspnet_compiler 通過,產出 App_Code.dll) - [ ] fmBPSN:手動功能驗證(各篩選、分頁、跳頁、NODATA) -- [ ] 其餘 23 個 Grid 依樣板陸續轉換(逐檔 commit) +- [x] fmBcus:新增 BcusDAC(SelectPage/SelectCount/SelectBCNUMIndex);dsBCUSGrid 改 ObjectDataSource;Search/Selected/DataBound 調整;編譯通過 +- [ ] 其餘 22 個 Grid 依樣板陸續轉換(逐檔 commit) ## 變更紀錄 @@ -141,3 +142,4 @@ | 2026-09-10 | 修復 BpsnDAC.cs 亂碼註解(原檔為 Big5,編輯後毀損),自 git HEAD 還原中文註解,並將檔案統一改存為 UTF-8 with BOM;重新編譯通過 | | 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 編譯通過 | diff --git a/Web/App_Code/DAC/BcusDAC.cs b/Web/App_Code/DAC/BcusDAC.cs new file mode 100644 index 0000000..2b1aa45 --- /dev/null +++ b/Web/App_Code/DAC/BcusDAC.cs @@ -0,0 +1,110 @@ +using System; +using System.Data; +using System.Data.Common; +using System.Text; +using System.ComponentModel; +using Wellan.Data; + +/// +/// 客戶資料的資料處理類別 +/// +[DataObject(true)] +public class BcusDAC : Wellan.Data.WDAC +{ + public BcusDAC() + { + } + + public BcusDAC(string connectionConfig, string connectionConfigName) + : this() + { + this._connectionConfig = connectionConfig; + this._connectionConfigName = connectionConfigName; + } + + public BcusDAC(WQuery query) + { + this._query = query; + } + + /// + /// 客戶資料 Grid 分頁查詢 + /// + [DataObjectMethod(DataObjectMethodType.Select)] + public DataTable SelectPage(int startRowIndex, int maximumRows, string BCNUM, string BCNAM) + { + DbCommand cmd = Query.NewCommand(); + + StringBuilder filter = new StringBuilder(); + BuildFilter(filter, cmd, BCNUM, BCNAM); + + cmd.CommandText = String.Format( + @"SELECT * FROM + ( + SELECT *, ROW_NUMBER() OVER (ORDER BY BCNUM) AS ROWID + FROM BCUS 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 BCNUM, string BCNAM) + { + DbCommand cmd = Query.NewCommand(); + + StringBuilder filter = new StringBuilder(); + BuildFilter(filter, cmd, BCNUM, BCNAM); + + cmd.CommandText = String.Format("SELECT COUNT(*) FROM BCUS WHERE 1=1 {0}", filter.ToString()); + return WDAC.GetInt32Value(Query.ExecuteScalar(cmd)); + } + + /// + /// 取得指定客戶編號在查詢結果中的序號 (0 起算) + /// + public int SelectBCNUMIndex(string targetBCNUM, string BCNUM, string BCNAM) + { + DbCommand cmd = Query.NewCommand(); + + StringBuilder filter = new StringBuilder(); + BuildFilter(filter, cmd, BCNUM, BCNAM); + + cmd.CommandText = String.Format( + @"SELECT ROWID - 1 FROM + ( + SELECT BCNUM, ROW_NUMBER() OVER (ORDER BY BCNUM) AS ROWID + FROM BCUS WHERE 1=1 {0} + ) AS TMP WHERE BCNUM = @TARGET", + filter.ToString()); + cmd.Parameters.Add(Query.NewParameter("TARGET", targetBCNUM)); + + 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 BCNUM, string BCNAM) + { + if (!string.IsNullOrEmpty(BCNUM)) + { + sb.Append(" AND BCNUM LIKE @BCNUM1 "); + cmd.Parameters.Add(Query.NewParameter("BCNUM1", BCNUM + "%")); + } + if (!string.IsNullOrEmpty(BCNAM)) + { + sb.Append(" AND BCNAM LIKE @BCNAM1 "); + cmd.Parameters.Add(Query.NewParameter("BCNAM1", BCNAM + "%")); + } + } +} diff --git a/Web/forms/customer/fmBcus.ascx b/Web/forms/customer/fmBcus.ascx index 2265f41..3d4c21f 100644 --- a/Web/forms/customer/fmBcus.ascx +++ b/Web/forms/customer/fmBcus.ascx @@ -43,11 +43,14 @@ - - + + + + + + = 0) + { + gvBCUS.PageIndex = rowIndex / gvBCUS.PageSize; + gvBCUS.SelectedIndex = rowIndex - gvBCUS.PageIndex * gvBCUS.PageSize; + } + + ParamList.Remove("BCNUM"); + } } private new void CalcFields(SqlDataSourceCommandEventArgs e) @@ -130,23 +133,6 @@ public partial class forms_customer_fmBcus : Wellan.Web.UI.WUserControlBase if (gvBCUS.SelectedIndex == -1) gvBCUS.SelectedIndex = 0; - // 返回時,回到之前選擇的那一筆 - if (ParamList.ContainsKey("BCNUM")) - { - string bcnum = WDAC.GetStringValue(ParamList["BCNUM"]); - - DataView dv = dsBCUSGrid.Select(new DataSourceSelectArguments()) as DataView; - dv.RowFilter = String.Format("BCNUM='{0}'", bcnum); - if (dv.Count > 0) - { - int rowIndex = dv.Table.Rows.IndexOf(dv[0].Row); - gvBCUS.PageIndex = (rowIndex / gvBCUS.PageSize); - gvBCUS.SelectedIndex = rowIndex - gvBCUS.PageIndex * gvBCUS.PageSize; - } - - ParamList.Remove("BCNUM"); - } - fvBCUS.DataBind(); } @@ -157,9 +143,9 @@ public partial class forms_customer_fmBcus : Wellan.Web.UI.WUserControlBase gvBCUS.DataBind(); } - protected void dsBCUSGrid_Selected(object sender, SqlDataSourceStatusEventArgs e) + protected void dsBCUSGrid_Selected(object sender, ObjectDataSourceStatusEventArgs e) { - if (e.AffectedRows == 0) + if (e.ReturnValue is Int32 && WDAC.GetInt32Value(e.ReturnValue) == 0) { if (MultiView1.ActiveViewIndex == 0) {