diff --git a/Doc/GridView改用ObjectDataSource計畫.md b/Doc/GridView改用ObjectDataSource計畫.md new file mode 100644 index 0000000..35c9afd --- /dev/null +++ b/Doc/GridView改用ObjectDataSource計畫.md @@ -0,0 +1,160 @@ +# GridView 銜接的 SqlDataSource 改用 ObjectDataSource + +分支:`feature/gridview-to-objectdatasource` + +## 目標與原則 + +- 只改**以 `DataSourceID` 綁定 SqlDataSource 的 GridView**;檔內的 FormView / DataList / DropDownList 之 SqlDataSource 不動。 +- 缺的 DAC 建立**專屬** DAC;查詢方法只要 `SelectPage` 與 `SelectCount`,**不**需要 Insert / Update / Delete。 +- 沿用既有 ObjectDataSource 工法(參考 `fmRpir` / `RpirDAC`): + - ObjectDataSource 設定 `TypeName`、`SelectMethod`、`SelectCountMethod`、`EnablePaging="true"`。 + - `SelectPage` 前兩個參數為 `int startRowIndex, int maximumRows`(由 ObjectDataSource 自動帶入)。 + - 動態篩選邏輯由 code-behind 的 `SelectCommand` 字串組裝,改為 DAC 內參數化查詢,code-behind 只設 `SelectParameters[...].DefaultValue`。 + - 事件簽章由 `SqlDataSourceStatusEventArgs` 改為 `ObjectDataSourceStatusEventArgs`。 + +## 盤點:GridView ↔ SqlDataSource(共 24 個 / 19 檔,皆在 Web 專案) + +| # | 檔案 | GridView ID | SqlDataSource ID | 來源表 | 既有 DAC | 狀態 | +|---|---|---|---|---|---|---| +| 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 | 無→BpabDAC | **完成** | +| 4 | forms/customer/fmBpabBig.ascx | gvBPAB | dsBPABGrid | BPAB | 無→BpabDAC | **完成** | +| 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(+Select) | **完成** | +| 9 | forms/customer/fmBprm.ascx | gvBPRM | dsBPRMGrid | BPRM | BprmDAC(+Select) | **完成** | +| 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 | 無→RpfeDAC | **完成** | +| 14 | forms/flow/fmSign.ascx | gvRPAB2 | dsRPAB2 | RPAB | RpabDAC(+Select) | **完成** | +| 15 | forms/flow/fmSign.ascx | gvRPAB | dsRPAB | RPAB | RpabDAC(+Select) | **完成** | +| 16 | forms/summary/fmSalaryCalc.ascx | GridView1 | dsSACD | SACD | 無→SacdDAC | **完成** | +| 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(+Select) | **完成** | +| 21 | forms/worker/fmRparWorker.ascx | RPARGrid | dsRPARGrid | RPAR | RparDAC(+Select) | **完成** | +| 22 | forms/worker/fmRsaj.ascx | RSAJGrid | dsRSAJGrid | RSAJ | RsajDAC(+Select) | **完成** | +| 23 | forms/worker/fmSendSalaryStrip.ascx | gvSSMS | dsSSMS | SSMS | SsmsDAC(+Select) | **完成** | +| 24 | forms/worker/fmSendSalaryStrip.ascx | gvSSMSSum(已註解) | dsSSMSSum | SSMS | SsmsDAC | **完成**(移除 dsSSMSSum,footer 改用 SsmsDAC) | + +> 已為 ObjectDataSource(不列入):`fmBPAP`(dsBPAP)、`fmRparManager`(dsRpad)、`fmSign` 內 dsRPAR未簽/已簽/我的/我的督導、`fmBpsl`、`fmBPSE`、`fmRpir`。 + +## 驗證樣板:fmBPSN + +### 現況 +- `fmBpsn.ascx` GridView1:`DataSourceID="dsBPSNGrid"`、`DataKeyNames="BPENO"`、`AllowPaging="True"`,事件 `OnDataBound / OnPageIndexChanged / OnRowDataBound / OnSelectedIndexChanged`。 +- `dsBPSNGrid`:`SelectCommand="SELECT * FROM BPSNView WHERE 1=0"`、`OnSelected="dsBPSNGrid_Selected"`。 +- `fmBpsn.ascx.cs` 的 `Search()` 以 `select`/`from`/`where` 欄位 + `AddSearch(...)` 動態組 SQL 後塞入 `dsBPSNGrid.SelectCommand`。 +- 篩選條件:BPENO/BPNME/BPENM/BPIDN(LIKE)、BPEDY_TYPE(在職/離職)、BPDPT_TYPE(部門/專案,`PublicVariable.InnerDepartment`)、BPSDY/BPEDY 區間、非管理者排除 `00001/00002/00003`、`!canSearch` 時只查自己。 +- 另有「依 BPENO 跳到該員工所在頁」邏輯(用 `ROWID - 1` 反查)。 + +### 變更內容 +1. `Web/App_Code/DAC/BpsnDAC.cs`:新增 + - `SelectPage(int startRowIndex, int maximumRows, string BPENO, string BPNME, string BPENM, string BPIDN, string BPEDY_TYPE, string BPDPT_TYPE, string BPSDY1, string BPSDY2, string BPEDY1, string BPEDY2, bool canSearch, string userId)` + - `SelectCount(同上,去掉 startRowIndex/maximumRows)` + - `SelectBPENOIndex(string targetBPENO, 同 SelectCount 參數)`(保留自動跳頁) +2. `Web/forms/worker/fmBpsn.ascx`:`dsBPSNGrid` 由 SqlDataSource 改為 ObjectDataSource(`TypeName="BpsnDAC"`、`SelectMethod="SelectPage"`、`SelectCountMethod="SelectCount"`、`EnablePaging="true"`)。 +3. `Web/forms/worker/fmBpsn.ascx.cs`:`Search()` 改設 SelectParameters;`dsBPSNGrid_Selected` 改 `ObjectDataSourceStatusEventArgs`;`OnInit` 移除 ConnectionString 設定;移除不再使用的 `select`/`from`/`where` 欄位。 + +### 驗證步驟 +- `aspnet_compiler -v / -p "D:\VS.NET\Thinkyu\Web"`(或 VS 開站台)確認 App_Code 編譯無誤。 +- 手動測試:各篩選條件、在職/離職、部門/專案、分頁、SelectedIndex、無資料 NODATA、由 RPIR 帶 BPENO 進入時自動跳頁。 +- 核對 Grid 回傳欄位與舊 SQL 一致(RAPYN/RAPYNX/RABRH/RABRHX/RAJNO/RAJNOX/RACNO/RACNOX/RPCPY)。 + +## 效能比較(fmBPSN:舊 SqlDataSource vs 新 ObjectDataSource) + +### 方法 +正式資料庫(192.168.1.50:23450)不可達,改用本機 SQL Server LocalDB 建立代表性 schema(`BPSNView` + `RASN/BPAA/BCLS/BPJA/BPJB/RPIR/RPIB` 與相關索引)模擬。基準程式為 C# + `System.Data.SqlClient`,比較: +- **舊作法**:SqlDataSource 動態 SQL 全量查詢(GridView 端分頁)。 +- **新作法**:ObjectDataSource `SelectPage`(`TOP 10`)+ `SelectCount`(`PageSize=10`)。 + +取 7 次平均,`SET STATISTICS IO` 統計 logical reads。此為合成環境、**無網路傳輸**,絕對值與正式環境不同,比例可作參考。 + +### 結果(Filter=全部) + +| 指標 | N=20,000 舊 | N=20,000 新(首頁) | N=100,000 舊 | N=100,000 新(首頁) | +|---|---|---|---|---| +| 回傳/繫結列數 | 20,000 | 10 | 100,000 | 10 | +| DB 查詢時間 | 758.0 ms | 123.1 ms(count 122.0 + page 1.1) | 4,289.6 ms | 715.3 ms(count 714.0 + page 1.3) | +| logical reads | 81,662 | 81,863 | 608,191 | 608,443 | +| App 記憶體(DataTable) | ~54.6 MB | ~0 | ~252 MB | ~0 | + +- 首頁 `SelectPage` 極快(1.1~1.3 ms、216~267 reads):可用 `BPENO` 索引提早結束。 +- DB 成本幾乎全落在 `SelectCount`(與舊全量查詢相同 reads),因為 COUNT 仍需掃描同樣資料。 +- 真正的效能來源是 **DB→App 的資料量由 N 列降為 10 列**,省下網路傳輸與 DataTable/GridView 繫結;網路越慢、欄位越多,實務改善越大。 +- **深頁跳轉較差**:`ROWID > @START` 且 START 很大時,無法提早結束,N=100,000 時 page 需 2,351 ms / 2,621,036 reads(約舊作法的 4.3 倍 reads)。此即 fmBPSN「依 BPENO 自動跳頁」可能踩到的情境。 + +### 結論 +- 一般瀏覽(首頁、逐頁):大幅改善(列數 ~10,000×、記憶體趨近 0、DB 時間約 6×)。 +- 深頁跳轉:DB reads 反而增加;後續可評估限制跳頁深度、或改用 keyset 分頁優化。 + +### 分頁 SQL 形式比較(N=100,000、PageSize=10、7 次平均) + +| 形式 | page@0 ms | page@0 reads | page@deep ms | page@deep reads | +|---|---|---|---|---| +| OLD(全量) | 4,098.0 | 608,191 | 4,053.0 | 608,191 | +| `TOP`(現行 SelectPage) | 7.4 | 273 | 2,166.3 | 2,621,045 | +| `BETWEEN @START+1 AND @START+@MAX`(兩層查詢) | 3.1 | 268 | 2,192.3 | 2,621,037 | +| `KEYSET`:先在窄集合算 ROWID 再 join 明細 | 3.4 | 300 | **48.0** | **6,549** | + +- **`BETWEEN` 與 `TOP` 幾乎相同**:兩者都必須對「過濾後、已 join 的完整集合」計算 `ROW_NUMBER()`;當 offset 很大時仍要處理前面所有資料列,故深頁成本相同。`BETWEEN` 不會改善。 +- **`KEYSET` 形式**:把 `ROW_NUMBER()` 只算在 `BPSNView`(篩選欄位全部屬於 BPSNView),外層再用 `ROWID BETWEEN` 取出該頁的 10 個 `BPENO`,之後才 join 明細表。深頁由 2,166 ms / 262 萬 reads 降為 **48 ms / 6,549 reads(約 45× 快、400× reads)**。 +- **限制**:`KEYSET` 假設各明細 join 為 1:1(特別是 `RASN` 的現職派遣),否則原本「以 join 後結果計數」的語意會不同(同一員工可能多列)。已於 1:1 合成資料驗證 `TOP` 與 `KEYSET` 取出的頁面完全相同(差異 0 筆);正式環境需先確認 `RASN` 現職是否唯一。 + +### 最終實作(已套用於 BpsnDAC) +- `SelectPage` 改為 KEYSET:先在 `BPSNView`(套用篩選)算 `ROW_NUMBER()` 取出該頁 `BPENO`,再 join 明細;`WHERE R.ROWID BETWEEN @STARTROWINDEX+1 AND @STARTROWINDEX+@MAXIMUMROWS`。 +- `SelectCount` 改為窄集合 `SELECT COUNT(*) FROM BPSNView A WHERE 1=1 {filter}`(與 KEYSET 分頁一致,且不需 join)。 +- `SelectBPENOIndex` 同步改為窄集合。 + +| 指標(N=100,000、PageSize=10) | 舊 SqlDataSource | 新 KEYSET | +|---|---|---| +| SelectPage 首頁 | 4,098 ms / 608,191 reads(全量) | 3.4 ms / 300 reads | +| SelectPage 深頁 | 4,053 ms / 608,191 reads | 48 ms / 6,549 reads | +| SelectCount(新增) | — | 110 ms / 6,253 reads | +| 首頁總計(count + page) | 4,098 ms / 608,191 reads | ~113 ms / ~6,553 reads | +| 回傳/繫結列數 | 100,000 | 10 | +| App 記憶體 | ~252 MB | ~0 | + +改善:首頁總計約 **38× 快、93× 少 reads**;深頁約 **45× 快**。原本 count 需 608,176 reads,窄集合後降為 6,253 reads。 + +## 待辦清單(Todo) + +- [x] 建立分支 `feature/gridview-to-objectdatasource` +- [x] 撰寫本計畫文檔 +- [x] fmBPSN:BpsnDAC 新增 SelectPage / SelectCount / SelectBPENOIndex +- [x] fmBPSN:fmBpsn.ascx 改 dsBPSNGrid 為 ObjectDataSource +- [x] fmBPSN:fmBpsn.ascx.cs 調整 Search / Selected / OnInit +- [x] fmBPSN:編譯驗證(aspnet_compiler 通過,產出 App_Code.dll) +- [ ] fmBPSN:手動功能驗證(各篩選、分頁、跳頁、NODATA) +- [x] fmBcus:新增 BcusDAC(SelectPage/SelectCount/SelectBCNUMIndex);dsBCUSGrid 改 ObjectDataSource;Search/Selected/DataBound 調整;編譯通過 +- [ ] 其餘 22 個 Grid 依樣板陸續轉換(逐檔 commit) + +## 變更紀錄 + +| 日期 | 內容 | +|---|---| +| 2026-09-10 | 建立計畫文檔、盤點清單;開始 fmBPSN 驗證 | +| 2026-09-10 | fmBPSN 轉換完成:BpsnDAC 新增 SelectPage/SelectCount/SelectBPENOIndex;fmBpsn.ascx 改 ObjectDataSource;fmBpsn.ascx.cs 調整 Search/Selected/OnInit;aspnet_compiler 編譯通過 | +| 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 編譯通過 | +| 2026-09-10 | 轉換 fmBpaa(BPAA):BpaaDAC 新增 SelectPage/SelectCount/SelectBPAAIndex;dsBPAAGrid 改 ObjectDataSource;編譯通過 | +| 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;編譯通過 | +| 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 調整;編譯通過 | +| 2026-09-10 | 轉換 fmRpfe(RPFE):新增 RpfeDAC(SelectPage/SelectCount);dsRPFEGrid 改 ObjectDataSource;編譯通過 | +| 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 | 轉換 fmRsaj(RSAJ):RsajDAC 新增 SelectPage/SelectCount;dsRSAJGrid 改 ObjectDataSource;編譯通過 | +| 2026-09-10 | 轉換 fmSendSalaryStrip(SSMS):SsmsDAC 新增 SelectSalaryStrip/SelectSalaryStripSum;dsSSMS 改 ObjectDataSource;移除 dsSSMSSum(footer 改用 SsmsDAC);編譯通過 | +| 2026-09-10 | fmRowk(ROWK)保留未轉換:其 Grid 綁定使用 WUserControlBase 的 Grid_View/GridView_DataSource(SqlDataSource)框架與 override Search,無法直接改用 ObjectDataSource,需另案重構 | 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/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/App_Code/DAC/BpabDAC.cs b/Web/App_Code/DAC/BpabDAC.cs new file mode 100644 index 0000000..4828d56 --- /dev/null +++ b/Web/App_Code/DAC/BpabDAC.cs @@ -0,0 +1,103 @@ +using System; +using System.Data; +using System.Data.Common; +using System.Text; +using System.ComponentModel; +using Wellan.Data; + +/// +/// 年度科目設定的資料處理類別 +/// +[DataObject(true)] +public class BpabDAC : Wellan.Data.WDAC +{ + public BpabDAC() + { + } + + public BpabDAC(string connectionConfig, string connectionConfigName) + : this() + { + this._connectionConfig = connectionConfig; + this._connectionConfigName = connectionConfigName; + } + + public BpabDAC(WQuery query) + { + this._query = query; + } + + /// + /// 年度科目設定 Grid 分頁查詢 + /// mode: BIG=大類, SMALL=小類, 其他=科目 + /// + [DataObjectMethod(DataObjectMethodType.Select)] + public DataTable SelectPage(int startRowIndex, int maximumRows, string BPPYN, string mode) + { + DbCommand cmd = Query.NewCommand(); + + StringBuilder filter = new StringBuilder(); + BuildFilter(filter, cmd, BPPYN, mode); + + cmd.CommandText = String.Format( + @"SELECT * FROM + ( + SELECT *, ROW_NUMBER() OVER (ORDER BY {0}) AS ROWID + FROM BPAB WHERE 1=1 {1} + ) AS TMP + WHERE ROWID BETWEEN @STARTROWINDEX + 1 AND @STARTROWINDEX + @MAXIMUMROWS + ORDER BY ROWID", + OrderBy(mode), 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 BPPYN, string mode) + { + DbCommand cmd = Query.NewCommand(); + + StringBuilder filter = new StringBuilder(); + BuildFilter(filter, cmd, BPPYN, mode); + + cmd.CommandText = String.Format("SELECT COUNT(*) FROM BPAB WHERE 1=1 {0}", filter.ToString()); + return WDAC.GetInt32Value(Query.ExecuteScalar(cmd)); + } + + private static string OrderBy(string mode) + { + if (mode == "BIG" || mode == "SMALL") + return "BPPYN, BPCLS, BPORD"; + return "BPPYN, BPCLS"; + } + + /// + /// 組出年度科目設定 Grid 的查詢條件 (與舊 Search 行為一致) + /// + private void BuildFilter(StringBuilder sb, DbCommand cmd, string BPPYN, string mode) + { + if (!string.IsNullOrEmpty(BPPYN)) + { + sb.Append(" AND BPPYN LIKE @BPPYN1 "); + cmd.Parameters.Add(Query.NewParameter("BPPYN1", BPPYN + "%")); + } + + switch (mode) + { + case "BIG": + sb.Append(" AND SUBSTRING(BPACC,3,4) = '0000' "); + break; + case "SMALL": + sb.Append(" AND SUBSTRING(BPACC,3,2) <> '00' AND SUBSTRING(BPACC,5,2) = '00' "); + break; + default: + sb.Append(" AND SUBSTRING(BPACC,3,2) <> '00' AND SUBSTRING(BPACC,5,2) <> '00' "); + break; + } + } +} diff --git a/Web/App_Code/DAC/BpjaDAC.cs b/Web/App_Code/DAC/BpjaDAC.cs new file mode 100644 index 0000000..5350718 --- /dev/null +++ b/Web/App_Code/DAC/BpjaDAC.cs @@ -0,0 +1,106 @@ +using System; +using System.Data; +using System.Data.Common; +using System.Text; +using System.ComponentModel; +using Wellan.Data; + +/// +/// 年度職稱設定的資料處理類別 +/// +[DataObject(true)] +public class BpjaDAC : Wellan.Data.WDAC +{ + public BpjaDAC() + { + } + + public BpjaDAC(string connectionConfig, string connectionConfigName) + : this() + { + this._connectionConfig = connectionConfig; + this._connectionConfigName = connectionConfigName; + } + + public BpjaDAC(WQuery query) + { + this._query = query; + } + + /// + /// 年度職稱設定 Grid 分頁查詢 + /// + [DataObjectMethod(DataObjectMethodType.Select)] + public DataTable SelectPage(int startRowIndex, int maximumRows, string BPPYN) + { + DbCommand cmd = Query.NewCommand(); + + StringBuilder filter = new StringBuilder(); + BuildFilter(filter, cmd, BPPYN); + + cmd.CommandText = String.Format( + @"SELECT * FROM + ( + SELECT *, ROW_NUMBER() OVER (ORDER BY BPPYN, BPJNO) AS ROWID + FROM BPJA 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 BPPYN) + { + DbCommand cmd = Query.NewCommand(); + + StringBuilder filter = new StringBuilder(); + BuildFilter(filter, cmd, BPPYN); + + cmd.CommandText = String.Format("SELECT COUNT(*) FROM BPJA WHERE 1=1 {0}", filter.ToString()); + return WDAC.GetInt32Value(Query.ExecuteScalar(cmd)); + } + + /// + /// 取得指定職稱在查詢結果中的序號 (0 起算) + /// + public int SelectBPJAIndex(string targetBPPYN, string targetBPJNO, string BPPYN) + { + DbCommand cmd = Query.NewCommand(); + + StringBuilder filter = new StringBuilder(); + BuildFilter(filter, cmd, BPPYN); + + cmd.CommandText = String.Format( + @"SELECT ROWID - 1 FROM + ( + SELECT BPPYN, BPJNO, ROW_NUMBER() OVER (ORDER BY BPPYN, BPJNO) AS ROWID + FROM BPJA WHERE 1=1 {0} + ) AS TMP WHERE BPPYN = @TARGET_BPPYN AND BPJNO = @TARGET_BPJNO", + filter.ToString()); + cmd.Parameters.Add(Query.NewParameter("TARGET_BPPYN", targetBPPYN)); + cmd.Parameters.Add(Query.NewParameter("TARGET_BPJNO", targetBPJNO)); + + 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 BPPYN) + { + if (!string.IsNullOrEmpty(BPPYN)) + { + sb.Append(" AND BPPYN LIKE @BPPYN1 "); + cmd.Parameters.Add(Query.NewParameter("BPPYN1", BPPYN + "%")); + } + } +} diff --git a/Web/App_Code/DAC/BpjbDAC.cs b/Web/App_Code/DAC/BpjbDAC.cs new file mode 100644 index 0000000..2f10d2a --- /dev/null +++ b/Web/App_Code/DAC/BpjbDAC.cs @@ -0,0 +1,87 @@ +using System; +using System.Data; +using System.Data.Common; +using System.Text; +using System.ComponentModel; +using Wellan.Data; + +/// +/// 職稱等級設定的資料處理類別 +/// +[DataObject(true)] +public class BpjbDAC : Wellan.Data.WDAC +{ + public BpjbDAC() + { + } + + public BpjbDAC(string connectionConfig, string connectionConfigName) + : this() + { + this._connectionConfig = connectionConfig; + this._connectionConfigName = connectionConfigName; + } + + public BpjbDAC(WQuery query) + { + this._query = query; + } + + /// + /// 職稱等級設定 Grid 分頁查詢 + /// + [DataObjectMethod(DataObjectMethodType.Select)] + public DataTable SelectPage(int startRowIndex, int maximumRows, string BPPYN, string BPJNO) + { + DbCommand cmd = Query.NewCommand(); + + StringBuilder filter = new StringBuilder(); + BuildFilter(filter, cmd, BPPYN, BPJNO); + + cmd.CommandText = String.Format( + @"SELECT * FROM + ( + SELECT *, ROW_NUMBER() OVER (ORDER BY BPPYN, BPJNO, BPCNO) AS ROWID + FROM BPJB 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 BPPYN, string BPJNO) + { + DbCommand cmd = Query.NewCommand(); + + StringBuilder filter = new StringBuilder(); + BuildFilter(filter, cmd, BPPYN, BPJNO); + + cmd.CommandText = String.Format("SELECT COUNT(*) FROM BPJB WHERE 1=1 {0}", filter.ToString()); + return WDAC.GetInt32Value(Query.ExecuteScalar(cmd)); + } + + /// + /// 組出職稱等級設定 Grid 的查詢條件 (與舊 AddSearch 行為一致) + /// + private void BuildFilter(StringBuilder sb, DbCommand cmd, string BPPYN, string BPJNO) + { + if (!string.IsNullOrEmpty(BPPYN)) + { + sb.Append(" AND BPPYN LIKE @BPPYN1 "); + cmd.Parameters.Add(Query.NewParameter("BPPYN1", BPPYN + "%")); + } + if (!string.IsNullOrEmpty(BPJNO)) + { + sb.Append(" AND BPJNO LIKE @BPJNO1 "); + cmd.Parameters.Add(Query.NewParameter("BPJNO1", BPJNO + "%")); + } + } +} 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/App_Code/DAC/BprmDAC.cs b/Web/App_Code/DAC/BprmDAC.cs index 9b38681..5cc3188 100644 --- a/Web/App_Code/DAC/BprmDAC.cs +++ b/Web/App_Code/DAC/BprmDAC.cs @@ -8,11 +8,14 @@ using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.Data.Common; +using System.ComponentModel; +using System.Text; using Wellan.Data; /// /// 用來取得專案處理人員資料的類別 /// +[DataObject(true)] public class BprmDAC : Wellan.Data.WDAC { public BprmDAC() @@ -63,4 +66,57 @@ public class BprmDAC : Wellan.Data.WDAC cmd.Parameters.Add(Query.NewParameter("BPPYN", BPPYN)); return Query.Select(cmd); } + + /// + /// 專案處理人員 Grid 分頁查詢 + /// + [DataObjectMethod(DataObjectMethodType.Select)] + public DataTable SelectPage(int startRowIndex, int maximumRows, string BPPNM) + { + DbCommand cmd = Query.NewCommand(); + + StringBuilder filter = new StringBuilder(); + BuildFilter(filter, cmd, BPPNM); + + cmd.CommandText = String.Format( + @"SELECT * FROM + ( + SELECT *, ROW_NUMBER() OVER (ORDER BY BPENO) AS ROWID + FROM BPRM 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) + { + DbCommand cmd = Query.NewCommand(); + + StringBuilder filter = new StringBuilder(); + BuildFilter(filter, cmd, BPPNM); + + cmd.CommandText = String.Format("SELECT COUNT(*) FROM BPRM WHERE 1=1 {0}", filter.ToString()); + return WDAC.GetInt32Value(Query.ExecuteScalar(cmd)); + } + + /// + /// 組出專案處理人員 Grid 的查詢條件 (與舊 AddSearch 行為一致) + /// + private void BuildFilter(StringBuilder sb, DbCommand cmd, string BPPNM) + { + if (!string.IsNullOrEmpty(BPPNM)) + { + sb.Append(" AND BPPNM LIKE @BPPNM1 "); + cmd.Parameters.Add(Query.NewParameter("BPPNM1", BPPNM + "%")); + } + } } diff --git a/Web/App_Code/DAC/BpsnDAC.cs b/Web/App_Code/DAC/BpsnDAC.cs index 16932a5..62de008 100644 --- a/Web/App_Code/DAC/BpsnDAC.cs +++ b/Web/App_Code/DAC/BpsnDAC.cs @@ -1,14 +1,16 @@ -using System; +using System; using System.Data; using System.Data.Common; using System.Configuration; using System.Text; using System.Collections.Generic; +using System.ComponentModel; using Wellan.Data; /// -/// uƪƳBzO +/// 員工資料的資料處理類別 /// +[DataObject(true)] public class BpsnDAC : Wellan.Data.BPSN_DAC { private DbCommand cmdSelect; @@ -115,7 +117,7 @@ public class BpsnDAC : Wellan.Data.BPSN_DAC } /// - /// oHثenM + /// 取得人員目前派駐專案 /// /// /// @@ -125,7 +127,7 @@ public class BpsnDAC : Wellan.Data.BPSN_DAC } /// - /// oHثenM + /// 取得人員目前派駐專案 /// /// /// @@ -154,7 +156,7 @@ public class BpsnDAC : Wellan.Data.BPSN_DAC } /// - /// oHثenaI + /// 取得人員目前派駐地點 /// /// /// @@ -164,7 +166,7 @@ public class BpsnDAC : Wellan.Data.BPSN_DAC } /// - /// oHثenaI + /// 取得人員目前派駐地點 /// /// /// @@ -182,7 +184,7 @@ public class BpsnDAC : Wellan.Data.BPSN_DAC } /// - /// oHqll + /// 取得人員電子郵件 /// /// /// @@ -197,7 +199,7 @@ public class BpsnDAC : Wellan.Data.BPSN_DAC } /// - /// oHqll2 + /// 取得人員電子郵件2 /// /// /// @@ -212,10 +214,10 @@ public class BpsnDAC : Wellan.Data.BPSN_DAC } /// - /// oYHݤqW + /// 取得某日期人員所屬公司名稱 /// - /// us - /// + /// 員工編號 + /// 日期 /// public List GetCompanyByDate(string bpeno, DateTime date) { @@ -243,7 +245,7 @@ public class BpsnDAC : Wellan.Data.BPSN_DAC } /// - /// oH¾ + /// 取得人員到職日期 /// /// /// @@ -258,7 +260,7 @@ public class BpsnDAC : Wellan.Data.BPSN_DAC } /// - /// oH¾ + /// 取得人員離職日期 /// /// /// @@ -287,12 +289,238 @@ public class BpsnDAC : Wellan.Data.BPSN_DAC } /// - /// XYb¾u + /// 取出某日期在職的員工 /// - /// + /// 日期 /// public DataTable GetOnBoardEmployee(DateTime date) { return Query.Select(Query.NewCommand("SELECT * FROM BPSNView WHERE dbo.EmployeeOnboard(BPENO, @DATE) = 1")); } + private const string GridSelectColumns = + @" A2.* + , B.RAPYN, C.BPPYM RAPYNX, B.RABRH, D.BSSCR RABRHX, B.RAJNO, E.BPJME RAJNOX, B.RACNO + , F.BPCME RACNOX, ISNULL(H.RPCPY, G.RPCPY) AS RPCPY "; + + // 只 join 該頁明細用 (明細主表為 A2) + private const string GridDetailJoins = + @" LEFT OUTER JOIN RASN B ON A2.BPENO=B.RANUM AND (B.RAEDT IS NULL OR (B.RASDT <= @TODAY AND B.RAEDT >= @TODAY)) + LEFT OUTER JOIN BPAA C ON B.RAPYN=C.BPPYN + LEFT OUTER JOIN BCLS D ON D.BSCLS=B.RABRH AND D.BSPAR='BPSNBRH' + LEFT OUTER JOIN BPJA E ON E.BPPYN=B.RAPYN AND E.BPJNO=B.RAJNO + LEFT OUTER JOIN BPJB F ON F.BPPYN=B.RAPYN AND F.BPJNO=B.RAJNO AND F.BPCNO=B.RACNO + LEFT OUTER JOIN RPIR G ON A2.BPENO=G.RPENO AND G.RPREN=(SELECT MAX(RPREN) FROM RPIR WHERE RPENO=A2.BPENO) + LEFT OUTER JOIN RPIB H ON G.RPREN=H.RPREN AND H.RPITM=(SELECT MAX(RPITM) FROM RPIB WHERE RPREN=H.RPREN) "; + + /// + /// 人員資料 Grid 分頁查詢 + /// + [DataObjectMethod(DataObjectMethodType.Select)] + public DataTable SelectPage( + int startRowIndex, + int maximumRows, + string BPENO, + string BPNME, + string BPENM, + string BPIDN, + string BPEDY_TYPE, + string BPDPT_TYPE, + string BPSDY1, + string BPSDY2, + string BPEDY1, + string BPEDY2, + bool canSearch, + string userId) + { + DbCommand cmd = Query.NewCommand(); + + StringBuilder filter = new StringBuilder(); + BuildGridFilter(filter, cmd, BPENO, BPNME, BPENM, BPIDN, BPEDY_TYPE, BPDPT_TYPE, BPSDY1, BPSDY2, BPEDY1, BPEDY2, canSearch, userId); + + // 先在窄集合 (BPSNView) 依 BPENO 排序計算 ROWID,取出該頁的 BPENO 後, + // 才 join 明細表,避免深頁時對整個 join 結果計算 ROW_NUMBER()。 + cmd.CommandText = String.Format( + @"SELECT {0} + FROM + ( + SELECT A.BPENO, ROW_NUMBER() OVER (ORDER BY A.BPENO) AS ROWID + FROM BPSNView A WHERE 1=1 {1} + ) R + JOIN BPSNView A2 ON A2.BPENO = R.BPENO + {2} + WHERE R.ROWID BETWEEN @STARTROWINDEX + 1 AND @STARTROWINDEX + @MAXIMUMROWS + ORDER BY R.ROWID", + GridSelectColumns, filter.ToString(), GridDetailJoins); + 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 BPENO, + string BPNME, + string BPENM, + string BPIDN, + string BPEDY_TYPE, + string BPDPT_TYPE, + string BPSDY1, + string BPSDY2, + string BPEDY1, + string BPEDY2, + bool canSearch, + string userId) + { + DbCommand cmd = Query.NewCommand(); + + StringBuilder filter = new StringBuilder(); + BuildGridFilter(filter, cmd, BPENO, BPNME, BPENM, BPIDN, BPEDY_TYPE, BPDPT_TYPE, BPSDY1, BPSDY2, BPEDY1, BPEDY2, canSearch, userId); + + cmd.CommandText = String.Format("SELECT COUNT(*) FROM BPSNView A WHERE 1=1 {0}", filter.ToString()); + return WDAC.GetInt32Value(Query.ExecuteScalar(cmd)); + } + + /// + /// 取得指定人員編號在查詢結果中的序號 (0 起算) + /// + public int SelectBPENOIndex( + string targetBPENO, + string BPENO, + string BPNME, + string BPENM, + string BPIDN, + string BPEDY_TYPE, + string BPDPT_TYPE, + string BPSDY1, + string BPSDY2, + string BPEDY1, + string BPEDY2, + bool canSearch, + string userId) + { + DbCommand cmd = Query.NewCommand(); + + StringBuilder filter = new StringBuilder(); + BuildGridFilter(filter, cmd, BPENO, BPNME, BPENM, BPIDN, BPEDY_TYPE, BPDPT_TYPE, BPSDY1, BPSDY2, BPEDY1, BPEDY2, canSearch, userId); + + cmd.CommandText = String.Format( + @"SELECT ROWID - 1 FROM + ( + SELECT A.BPENO, ROW_NUMBER() OVER (ORDER BY A.BPENO) AS ROWID + FROM BPSNView A WHERE 1=1 {0} + ) AS TMP WHERE BPENO = @TARGET", + filter.ToString()); + cmd.Parameters.Add(Query.NewParameter("TARGET", targetBPENO)); + + object o = Query.ExecuteScalar(cmd); + return (o is Int32 || o is Int64) ? WDAC.GetInt32Value(o) : -1; + } + + /// + /// 組出人員資料 Grid 的查詢條件 (與舊 AddSearch 行為一致) + /// + private void BuildGridFilter( + StringBuilder sb, + DbCommand cmd, + string BPENO, + string BPNME, + string BPENM, + string BPIDN, + string BPEDY_TYPE, + string BPDPT_TYPE, + string BPSDY1, + string BPSDY2, + string BPEDY1, + string BPEDY2, + bool canSearch, + string userId) + { + cmd.Parameters.Add(Query.NewParameter("TODAY", DateTime.UtcNow.AddHours(8).Date)); + + if (!canSearch) + { + if (!string.IsNullOrEmpty(userId)) + { + sb.Append(" AND BPENO LIKE @BPENO1 "); + cmd.Parameters.Add(Query.NewParameter("BPENO1", userId + "%")); + } + return; + } + + if (!string.IsNullOrEmpty(BPENO)) + { + sb.Append(" AND BPENO LIKE @BPENO1 "); + cmd.Parameters.Add(Query.NewParameter("BPENO1", BPENO + "%")); + } + if (!string.IsNullOrEmpty(BPNME)) + { + sb.Append(" AND BPNME LIKE @BPNME1 "); + cmd.Parameters.Add(Query.NewParameter("BPNME1", BPNME + "%")); + } + if (!string.IsNullOrEmpty(BPENM)) + { + sb.Append(" AND BPENM LIKE @BPENM1 "); + cmd.Parameters.Add(Query.NewParameter("BPENM1", BPENM + "%")); + } + if (!string.IsNullOrEmpty(BPIDN)) + { + sb.Append(" AND BPIDN LIKE @BPIDN1 "); + cmd.Parameters.Add(Query.NewParameter("BPIDN1", BPIDN + "%")); + } + + switch (BPEDY_TYPE) + { + case "1": + sb.Append(" AND (BPEDY IS NULL OR BPEDY >= @TODAY) "); + break; + case "2": + sb.Append(" AND (BPEDY < @TODAY) "); + break; + } + + switch (BPDPT_TYPE) + { + case "1": + sb.AppendFormat(" AND BPDPT IN {0} ", PublicVariable.InnerDepartment); + break; + case "2": + sb.AppendFormat(" AND BPDPT NOT IN {0} ", PublicVariable.InnerDepartment); + break; + } + + AppendRange(sb, cmd, "BPSDY", BPSDY1, BPSDY2); + AppendRange(sb, cmd, "BPEDY", BPEDY1, BPEDY2); + + if (!IsManager(userId)) + { + sb.Append(" AND BPENO NOT IN ('00001','00002','00003') "); + } + } + + private void AppendRange(StringBuilder sb, DbCommand cmd, string field, string value1, string value2) + { + bool has1 = !string.IsNullOrEmpty(value1); + bool has2 = !string.IsNullOrEmpty(value2); + + if (has1 && has2) + { + sb.AppendFormat(" AND {0} >= @{0}1 AND {0} <= @{0}2 ", field); + cmd.Parameters.Add(Query.NewParameter(field + "1", value1)); + cmd.Parameters.Add(Query.NewParameter(field + "2", value2)); + } + else if (has1) + { + sb.AppendFormat(" AND {0} LIKE @{0}1 ", field); + cmd.Parameters.Add(Query.NewParameter(field + "1", value1 + "%")); + } + else if (has2) + { + sb.AppendFormat(" AND {0} LIKE @{0}2 ", field); + cmd.Parameters.Add(Query.NewParameter(field + "2", value2 + "%")); + } + } } 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/App_Code/DAC/RpabDAC.cs b/Web/App_Code/DAC/RpabDAC.cs index e67f3c5..bbba682 100644 --- a/Web/App_Code/DAC/RpabDAC.cs +++ b/Web/App_Code/DAC/RpabDAC.cs @@ -12,6 +12,7 @@ using System.ComponentModel; /// /// 人員差勤簽核檔 /// +[DataObject(true)] public class RpabDAC : Wellan.Data.WDAC { private string _select = @@ -289,4 +290,32 @@ public class RpabDAC : Wellan.Data.WDAC AddParam(cmd, "OLD_RPREN", RPREN); Query.ExecuteNonQuery(tran.Connection, tran, cmd); } + + /// + /// 取得簽核關卡明細 (已簽核) + /// + [DataObjectMethod(DataObjectMethodType.Select)] + public DataTable SelectRPAB(string RPREN) + { + DbCommand cmd = Query.NewCommand( + @"SELECT RPANO, RPAPN, RPENO, RPDAT, RPAPP, RPDOC + FROM RPAB + WHERE RPREN = @RPREN AND RPDAT IS NOT NULL"); + 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 65476e4..f4b6a49 100644 --- a/Web/App_Code/DAC/RparDAC.cs +++ b/Web/App_Code/DAC/RparDAC.cs @@ -8,6 +8,7 @@ using Wellan.Data; using Wellan.Common; using System.Transactions; using System.ComponentModel; +using System.Text; using System.IO; using System.Web; using System.Linq; @@ -1856,6 +1857,186 @@ public class RparDAC : Wellan.Data.WDAC return new 打卡檢查Item(); } + + private const string RparGridColumns = + @"TRDAT, TRMOD, TRUSR, RPREN, RPNUM, RAITM, RPCNM, RPPYN, RPRDT, RPEDT, RPTYP, FLOOR(RPTCT / 60) AS RPTCT, RPFTR, RPDOC, + APPNO, RPAPP, RPAPD, RPAPU, RPADT, RPAPN, RPANO, RPAGT, RPRTM, RPETM, RPUST, RPTC1, RPTC2, RPTC3, + RPRSN, RPAGM, ISNULL(RPTCT - FLOOR(RPTCT / 60) * 60, 0) AS RPTMT"; + + private const string RparGridWhere = " WHERE ((RPAPN IS NULL) OR ((RPAPN<>'D') AND (RPAPN=RPANO))) "; + + /// + /// 差勤紀錄 Grid 分頁查詢 + /// + [DataObjectMethod(DataObjectMethodType.Select)] + public DataTable SelectPage(int startRowIndex, int maximumRows, string RPPYN, string RPNUM1, string RPNUM2, string RPRDT1, string RPRDT2, string rparType) + { + DbCommand cmd = Query.NewCommand(); + + StringBuilder filter = new StringBuilder(); + BuildRparGridFilter(filter, cmd, RPPYN, RPNUM1, RPNUM2, RPRDT1, RPRDT2, rparType); + + cmd.CommandText = String.Format( + @"SELECT * FROM + ( + SELECT {0}, ROW_NUMBER() OVER (ORDER BY RPREN) AS ROWID + FROM RPAR {1} {2} + ) AS TMP + WHERE ROWID BETWEEN @STARTROWINDEX + 1 AND @STARTROWINDEX + @MAXIMUMROWS + ORDER BY ROWID", + RparGridColumns, RparGridWhere, 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 RPPYN, string RPNUM1, string RPNUM2, string RPRDT1, string RPRDT2, string rparType) + { + DbCommand cmd = Query.NewCommand(); + + StringBuilder filter = new StringBuilder(); + BuildRparGridFilter(filter, cmd, RPPYN, RPNUM1, RPNUM2, RPRDT1, RPRDT2, rparType); + + cmd.CommandText = String.Format("SELECT COUNT(*) FROM RPAR {0} {1}", RparGridWhere, filter.ToString()); + return WDAC.GetInt32Value(Query.ExecuteScalar(cmd)); + } + + private void BuildRparGridFilter(StringBuilder sb, DbCommand cmd, string RPPYN, string RPNUM1, string RPNUM2, string RPRDT1, string RPRDT2, string rparType) + { + switch (rparType) + { + case "0": + sb.Append(" AND RPTYP LIKE '0%' "); + break; + case "1": + sb.Append(" AND RPTYP LIKE '1%' "); + break; + case "21": + sb.Append(" AND RPTYP = '21' "); + break; + case "22": + sb.Append(" AND RPTYP = '22' "); + break; + case "3": + sb.Append(" AND RPTYP LIKE '3%' "); + break; + } + + if (!string.IsNullOrEmpty(RPPYN)) + { + sb.Append(" AND RPPYN = @RPPYN1 "); + cmd.Parameters.Add(Query.NewParameter("RPPYN1", RPPYN)); + } + + AppendRparRange(sb, cmd, "RPNUM", RPNUM1, RPNUM2, true); + AppendRparRange(sb, cmd, "RPRDT", RPRDT1, RPRDT2, false); + } + + private void AppendRparRange(StringBuilder sb, DbCommand cmd, string field, string value1, string value2, bool like) + { + bool has1 = !string.IsNullOrEmpty(value1); + bool has2 = !string.IsNullOrEmpty(value2); + + if (has1 && has2) + { + sb.AppendFormat(" AND {0} >= @{0}1 AND {0} <= @{0}2 ", field); + cmd.Parameters.Add(Query.NewParameter(field + "1", value1)); + cmd.Parameters.Add(Query.NewParameter(field + "2", value2)); + } + else if (has1) + { + if (like) + { + sb.AppendFormat(" AND {0} LIKE @{0}1 ", field); + cmd.Parameters.Add(Query.NewParameter(field + "1", value1 + "%")); + } + else + { + sb.AppendFormat(" AND {0} >= @{0}1 ", field); + cmd.Parameters.Add(Query.NewParameter(field + "1", value1)); + } + } + else if (has2) + { + if (like) + { + sb.AppendFormat(" AND {0} LIKE @{0}2 ", field); + cmd.Parameters.Add(Query.NewParameter(field + "2", value2 + "%")); + } + else + { + sb.AppendFormat(" AND {0} <= @{0}2 ", field); + cmd.Parameters.Add(Query.NewParameter(field + "2", value2)); + } + } + } + + /// + /// 差勤紀錄 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/App_Code/DAC/RpfeDAC.cs b/Web/App_Code/DAC/RpfeDAC.cs new file mode 100644 index 0000000..af02379 --- /dev/null +++ b/Web/App_Code/DAC/RpfeDAC.cs @@ -0,0 +1,82 @@ +using System; +using System.Data; +using System.Data.Common; +using System.Text; +using System.ComponentModel; +using Wellan.Data; + +/// +/// 專案憑證的資料處理類別 +/// +[DataObject(true)] +public class RpfeDAC : Wellan.Data.WDAC +{ + public RpfeDAC() + { + } + + public RpfeDAC(string connectionConfig, string connectionConfigName) + : this() + { + this._connectionConfig = connectionConfig; + this._connectionConfigName = connectionConfigName; + } + + public RpfeDAC(WQuery query) + { + this._query = query; + } + + /// + /// 專案憑證 Grid 分頁查詢 + /// + [DataObjectMethod(DataObjectMethodType.Select)] + public DataTable SelectPage(int startRowIndex, int maximumRows, string RPPYN) + { + DbCommand cmd = Query.NewCommand(); + + StringBuilder filter = new StringBuilder(); + BuildFilter(filter, cmd, RPPYN); + + cmd.CommandText = String.Format( + @"SELECT * FROM + ( + SELECT *, ROW_NUMBER() OVER (ORDER BY RPPYN, RPREN) AS ROWID + FROM RPFE 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 RPPYN) + { + DbCommand cmd = Query.NewCommand(); + + StringBuilder filter = new StringBuilder(); + BuildFilter(filter, cmd, RPPYN); + + cmd.CommandText = String.Format("SELECT COUNT(*) FROM RPFE WHERE 1=1 {0}", filter.ToString()); + return WDAC.GetInt32Value(Query.ExecuteScalar(cmd)); + } + + /// + /// 組出專案憑證 Grid 的查詢條件 (與舊 AddSearch 行為一致) + /// + private void BuildFilter(StringBuilder sb, DbCommand cmd, string RPPYN) + { + if (!string.IsNullOrEmpty(RPPYN)) + { + sb.Append(" AND RPPYN LIKE @RPPYN1 "); + cmd.Parameters.Add(Query.NewParameter("RPPYN1", RPPYN + "%")); + } + } +} diff --git a/Web/App_Code/DAC/RsajDAC.cs b/Web/App_Code/DAC/RsajDAC.cs index adfe749..37175f3 100644 --- a/Web/App_Code/DAC/RsajDAC.cs +++ b/Web/App_Code/DAC/RsajDAC.cs @@ -1,12 +1,15 @@ using System; using System.Data; using System.Data.Common; +using System.ComponentModel; +using System.Text; using Wellan.Data; using Wellan.Common; /// /// 薪資加減項資料處理類別 /// +[DataObject(true)] public class RsajDAC : Wellan.Data.WDAC { public RsajDAC() @@ -127,4 +130,62 @@ public class RsajDAC : Wellan.Data.WDAC cmd.Parameters.Add(Query.NewParameter("RSYMM", yymm)); return GetStringValue(Query.ExecuteScalar(cmd)); } + + /// + /// 薪資加減項 Grid 分頁查詢 + /// + [DataObjectMethod(DataObjectMethodType.Select)] + public DataTable SelectPage(int startRowIndex, int maximumRows, string RSENO, string RSPYN) + { + DbCommand cmd = Query.NewCommand(); + + StringBuilder filter = new StringBuilder(); + BuildFilter(filter, cmd, RSENO, RSPYN); + + cmd.CommandText = String.Format( + @"SELECT * FROM + ( + SELECT *, ROW_NUMBER() OVER (ORDER BY RSYMM DESC, RSREN DESC) AS ROWID + FROM RSAJ 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 RSENO, string RSPYN) + { + DbCommand cmd = Query.NewCommand(); + + StringBuilder filter = new StringBuilder(); + BuildFilter(filter, cmd, RSENO, RSPYN); + + cmd.CommandText = String.Format("SELECT COUNT(*) FROM RSAJ WHERE 1=1 {0}", filter.ToString()); + return WDAC.GetInt32Value(Query.ExecuteScalar(cmd)); + } + + /// + /// 組出薪資加減項 Grid 的查詢條件 (與舊 AddSearch 行為一致) + /// + private void BuildFilter(StringBuilder sb, DbCommand cmd, string RSENO, string RSPYN) + { + if (!string.IsNullOrEmpty(RSENO)) + { + sb.Append(" AND RSENO LIKE @RSENO1 "); + cmd.Parameters.Add(Query.NewParameter("RSENO1", RSENO + "%")); + } + if (!string.IsNullOrEmpty(RSPYN)) + { + sb.Append(" AND RSPYN LIKE @RSPYN1 "); + cmd.Parameters.Add(Query.NewParameter("RSPYN1", RSPYN + "%")); + } + } } \ No newline at end of file diff --git a/Web/App_Code/DAC/SacdDAC.cs b/Web/App_Code/DAC/SacdDAC.cs new file mode 100644 index 0000000..5a45594 --- /dev/null +++ b/Web/App_Code/DAC/SacdDAC.cs @@ -0,0 +1,45 @@ +using System; +using System.Data; +using System.Data.Common; +using System.ComponentModel; +using Wellan.Data; + +/// +/// 薪資科目匯總的資料處理類別 +/// +[DataObject(true)] +public class SacdDAC : Wellan.Data.WDAC +{ + public SacdDAC() + { + } + + public SacdDAC(string connectionConfig, string connectionConfigName) + : this() + { + this._connectionConfig = connectionConfig; + this._connectionConfigName = connectionConfigName; + } + + public SacdDAC(WQuery query) + { + this._query = query; + } + + /// + /// 取得某專案年月的科目預算與本月金額 + /// + [DataObjectMethod(DataObjectMethodType.Select)] + public DataTable SelectByProject(string BPPYN, DateTime SAYMM) + { + DbCommand cmd = Query.NewCommand( + @"SELECT BPAB.BPPYN, BPAB.BPACC, ISNULL(BPAB.BPBGT, 0) AS BPBGT, BPAB.BPCLS, BPAB.BPAME, ISNULL(SACD.SAAMT, 0) AS SAAMT, SACD.SADOC + FROM BPAB + LEFT OUTER JOIN SACD ON BPAB.BPPYN = SACD.SAPYN AND BPAB.BPACC = SACD.SAACC AND SACD.SAYMM = @SAYMM + WHERE (BPAB.BPPYN = @BPPYN) AND (SUBSTRING(BPAB.BPACC, 5, 2) <> '00') + ORDER BY BPAB.BPCLS"); + cmd.Parameters.Add(Query.NewParameter("BPPYN", BPPYN)); + cmd.Parameters.Add(Query.NewParameter("SAYMM", SAYMM)); + return Query.Select(cmd); + } +} diff --git a/Web/App_Code/DAC/SsmsDAC.cs b/Web/App_Code/DAC/SsmsDAC.cs index 6628c7c..69bdbd3 100644 --- a/Web/App_Code/DAC/SsmsDAC.cs +++ b/Web/App_Code/DAC/SsmsDAC.cs @@ -1,10 +1,13 @@ using System; using System.Data; using System.Data.Common; +using System.ComponentModel; +using System.Text; using Wellan.Data; using Wellan.Common; using System.Data.SqlClient; +[DataObject(true)] public class SsmsDAC : Wellan.Data.WDAC { private DbCommand cmdSelectSSMS; @@ -629,6 +632,95 @@ public class SsmsDAC : Wellan.Data.WDAC return result; } + + private const string SelectSalaryStripSql = + @"SELECT A.*, + SSP06 + SSP07 + SSP08 + SSP13 + SSP14 OVERWORK, + SSP09 + SSP10 + SSP12 OUTGOING, + SSP00 + SSP01 + SSP02 + SSP03 + SSP04 + SSP05 + SSP06 + SSP07 + SSP08 + SSP09 + SSP10 + SSP11 + SSP12 + SSP13 + SSP14 + SSP15 + SSP99 SSPLUS, + SSS01 + SSS02 + SSS09 LEAVING, + SST01 + SST02 + SST03 + SST21 + SST22 OVERWORKTIME, + (SSP00 + SSP01 + SSP02 + SSP03 + SSP04 + SSP05 + SSP06 + SSP07 + SSP08 + SSP09 + SSP10 + SSP11 + SSP12 + SSP13 + SSP14 + SSP15 + SSP99) + - (SSS01 + SSS02 + SSS03 + SSS04 + SSS05 + SSS06 + SSS07 + SSS08 + SSS09 + SSS10 + SSS11 + SSS12 + SSS13 + SSS14 + SSS15 + SSS99) SSTOTAL, + SSS01 + SSS02 + SSS04 + SSS05 + SSS06 + SSS07 + SSS08 + SSS09 + SSS10 + SSS11 + SSS12 + SSS13 + SSS14 + SSS15 + SSS99 SSMINUS, + SSP01 + SSP02 + SSP03 + SSP04 + SSP05 + SSP06 + SSP07 + SSP08 + SSP09 + SSP10 + SSP11 + SSP12 + SSP13 + SSP14 + SSP15 + SSP99 TOTALPLUS, + SSH01 + SSH02 + SSH03 EMPLOYER, + ISNULL(B.BPNME, '') BPNME, + ISNULL(C.BPPYM, '') BPPYM, + ISNULL(B.BPSWY, '') BPSWY, + ISNULL(D.BCNAM, '') BCNAM, + ISNULL(B.BPACC, '') BPACC, + ISNULL(B.BPEML, '') BPEML, + ISNULL(B.BPEM2, '') BPEM2, + (SELECT SUM(SSS06) FROM {0} E WHERE A.SSENO=E.SSENO AND E.SSYMM <= @SSYMM) SSS06SUM, + (SELECT SUM(SSH06) FROM {0} F WHERE A.SSENO=F.SSENO AND F.SSYMM <= @SSYMM) SSH06SUM, + SSC01, SSC03, SSC03, SSC04, SSC05, SSC06, SSC07, SSC08, SSC09, SSC10 + FROM {0} A + LEFT OUTER JOIN BPSNView B ON A.SSENO=B.BPENO + LEFT OUTER JOIN BPAA C ON A.SSPYN=C.BPPYN + LEFT OUTER JOIN BRML D ON B.BPBNK=D.BCNUM"; + + private const string SelectSalaryStripSumSql = + @"SELECT ISNULL(SUM(SSD01), 0) SSD01, ISNULL(SUM(SSD02), 0) SSD02, ISNULL(SUM(SSSRD), 0) SSSRD, ISNULL(SUM(SSP00), 0) SSP00, + ISNULL(SUM(SSP01), 0) SSP01, ISNULL(SUM(SSP02), 0) SSP02, ISNULL(SUM(SSP03), 0) SSP03, ISNULL(SUM(SSP04), 0) SSP04, + ISNULL(SUM(SSP05), 0) SSP05, ISNULL(SUM(SSP06), 0) SSP06, ISNULL(SUM(SSP07), 0) SSP07, ISNULL(SUM(SSP08), 0) SSP08, + ISNULL(SUM(SSP09), 0) SSP09, ISNULL(SUM(SSP10), 0) SSP10, ISNULL(SUM(SSP11), 0) SSP11, ISNULL(SUM(SSP12), 0) SSP12, + ISNULL(SUM(SSP13), 0) SSP13, ISNULL(SUM(SSP14), 0) SSP14, ISNULL(SUM(SSP15), 0) SSP15, ISNULL(SUM(SSP99), 0) SSP99, + ISNULL(SUM(SSS01), 0) SSS01, ISNULL(SUM(SSS02), 0) SSS02, ISNULL(SUM(SSS03), 0) SSS03, ISNULL(SUM(SSS04), 0) SSS04, + ISNULL(SUM(SSS05), 0) SSS05, ISNULL(SUM(SSS06), 0) SSS06, ISNULL(SUM(SSS07), 0) SSS07, ISNULL(SUM(SSS08), 0) SSS08, + ISNULL(SUM(SSS09), 0) SSS09, ISNULL(SUM(SSS10), 0) SSS10, ISNULL(SUM(SSS11), 0) SSS11, ISNULL(SUM(SSS12), 0) SSS12, + ISNULL(SUM(SSS13), 0) SSS13, ISNULL(SUM(SSS14), 0) SSS14, ISNULL(SUM(SSS15), 0) SSS15, ISNULL(SUM(SSS99), 0) SSS99, + ISNULL(SUM(SSH01), 0) SSH01, ISNULL(SUM(SSH02), 0) SSH02, ISNULL(SUM(SSH03), 0) SSH03, ISNULL(SUM(SSH04), 0) SSH04, + ISNULL(SUM(SSH05), 0) SSH05, ISNULL(SUM(SSH06), 0) SSH06, ISNULL(SUM(SSH07), 0) SSH07, ISNULL(SUM(SSH08), 0) SSH08, + ISNULL(SUM(SSH09), 0) SSH09, ISNULL(SUM(SSH10), 0) SSH10, ISNULL(SUM(SST01), 0) SST01, ISNULL(SUM(SST02), 0) SST02, + ISNULL(SUM(SST03), 0) SST03, ISNULL(SUM(SST04), 0) SST04, ISNULL(SUM(SST05), 0) SST05, ISNULL(SUM(SST06), 0) SST06, + ISNULL(SUM(SST07), 0) SST07, ISNULL(SUM(SST08), 0) SST08, ISNULL(SUM(SST09), 0) SST09, ISNULL(SUM(SST10), 0) SST10, + ISNULL(SUM(SST11), 0) SST11, ISNULL(SUM(SST12), 0) SST12, ISNULL(SUM(SST13), 0) SST13, ISNULL(SUM(SST14), 0) SST14, + ISNULL(SUM(SST15), 0) SST15, ISNULL(SUM(SST16), 0) SST16, ISNULL(SUM(SST17), 0) SST17, ISNULL(SUM(SST18), 0) SST18, + ISNULL(SUM(SST19), 0) SST19, ISNULL(SUM(SST20), 0) SST20, ISNULL(SUM(SST21), 0) SST21, ISNULL(SUM(SST22), 0) SST22, + ISNULL(SUM(SST23), 0) SST23, ISNULL(SUM(SST24), 0) SST24, ISNULL(SUM(SST25), 0) SST25, ISNULL(SUM(SSL01), 0) SSL01, + ISNULL(SUM(SSL02), 0) SSL02, ISNULL(SUM(SSL03), 0) SSL03, ISNULL(SUM(SSL04), 0) SSL04, ISNULL(SUM(SSL05), 0) SSL05, + ISNULL(SUM(SSP06 + SSP07 + SSP08 + SSP13 + SSP14), 0) OVERWORK, + ISNULL(SUM(SSP09 + SSP10 + SSP12), 0) OUTGOING, + ISNULL(SUM(SSP00 + SSP01 + SSP02 + SSP03 + SSP04 + SSP05 + SSP06 + SSP07 + SSP08 + SSP09 + SSP10 + SSP11 + SSP12 + + SSP13 + SSP14 + SSP15 + SSP99), 0) SSPLUS, + ISNULL(SUM(SSS01 + SSS02 + SSS09), 0) LEAVING, + ISNULL(SUM(SST01 + SST02 + SST03 + SST21 + SST22), 0) OVERWORKTIME, + ISNULL(SUM((SSP00 + SSP01 + SSP02 + SSP03 + SSP04 + SSP05 + SSP06 + SSP07 + SSP08 + SSP09 + SSP10 + SSP11 + SSP12 + + SSP13 + SSP14 + SSP15 + SSP99) + - (SSS01 + SSS02 + SSS03 + SSS04 + SSS05 + SSS06 + SSS07 + SSS08 + SSS09 + SSS10 + SSS11 + SSS12 + SSS13 + + SSS14 + SSS15 + SSS99)), 0) SSTOTAL, + ISNULL(SUM(SSS01 + SSS02 + SSS04 + SSS05 + SSS06 + SSS07 + SSS08 + SSS09 + SSS10 + SSS11 + SSS12 + SSS13 + SSS14 + + SSS15 + SSS99), 0) SSMINUS, + ISNULL(SUM(SSP01 + SSP02 + SSP03 + SSP04 + SSP05 + SSP06 + SSP07 + SSP08 + SSP09 + SSP10 + SSP11 + SSP12 + SSP13 + + SSP14 + SSP15 + SSP99), 0) TOTALPLUS, + ISNULL(SUM(SSH01 + SSH02 + SSH03), 0) EMPLOYER + FROM {0} A WHERE SSYMM=@SSYMM AND SSPYN=@SSPYN"; + + /// + /// 薪資條發放 Grid 查詢 + /// + [DataObjectMethod(DataObjectMethodType.Select)] + public DataTable SelectSalaryStrip(string tableName, DateTime SSYMM, string SSPYN) + { + DbCommand cmd = Query.NewCommand( + String.Format(SelectSalaryStripSql, tableName) + " WHERE SSYMM=@SSYMM AND SSPYN=@SSPYN ORDER BY SSENO "); + cmd.Parameters.Add(Query.NewParameter("SSYMM", SSYMM)); + cmd.Parameters.Add(Query.NewParameter("SSPYN", SSPYN)); + return Query.Select(cmd); + } + + /// + /// 薪資條發放 Grid 合計查詢 + /// + [DataObjectMethod(DataObjectMethodType.Select)] + public DataTable SelectSalaryStripSum(string tableName, DateTime SSYMM, string SSPYN) + { + DbCommand cmd = Query.NewCommand(String.Format(SelectSalaryStripSumSql, tableName)); + cmd.Parameters.Add(Query.NewParameter("SSYMM", SSYMM)); + cmd.Parameters.Add(Query.NewParameter("SSPYN", SSPYN)); + return Query.Select(cmd); + } } public class SsmsRecord 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) { 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); diff --git a/Web/forms/customer/fmBpab.ascx b/Web/forms/customer/fmBpab.ascx index 7e4fbdf..c2d56e2 100644 --- a/Web/forms/customer/fmBpab.ascx +++ b/Web/forms/customer/fmBpab.ascx @@ -72,10 +72,14 @@ - - + + + + + + '00' AND SUBSTRING(BPACC,5,2) <> '00' "); - sql.Append(order); - dsBPABGrid.SelectCommand = sql.ToString(); + dsBPABGrid.SelectParameters["BPPYN"].DefaultValue = _BPPYN; } private new void CalcFields(SqlDataSourceCommandEventArgs e) @@ -129,9 +115,9 @@ public partial class forms_customer_fmBpab : Wellan.Web.UI.WUserControlBase gv.DataBind(); } - protected void dsBPABGrid_Selected(object sender, SqlDataSourceStatusEventArgs e) + protected void dsBPABGrid_Selected(object sender, ObjectDataSourceStatusEventArgs e) { - if (e.AffectedRows == 0) + if (e.ReturnValue is Int32 && WDAC.GetInt32Value(e.ReturnValue) == 0) { gvBPAB.Visible = false; fvBPAB.ChangeMode(FormViewMode.Insert); diff --git a/Web/forms/customer/fmBpabBig.ascx b/Web/forms/customer/fmBpabBig.ascx index 4a9359a..efe440e 100644 --- a/Web/forms/customer/fmBpabBig.ascx +++ b/Web/forms/customer/fmBpabBig.ascx @@ -10,13 +10,14 @@ - - + + + + + + - - + + + + + + '00' AND SUBSTRING(BPACC,5,2) = '00' "); - sql.Append(order); - dsBPABGrid.SelectCommand = sql.ToString(); + dsBPABGrid.SelectParameters["BPPYN"].DefaultValue = _BPPYN; } private new void CalcFields(SqlDataSourceCommandEventArgs e) @@ -194,9 +180,9 @@ public partial class forms_customer_fmBpabSmall : Wellan.Web.UI.WUserControlBase gvBPAB.DataBind(); } - protected void dsBPABGrid_Selected(object sender, SqlDataSourceStatusEventArgs e) + protected void dsBPABGrid_Selected(object sender, ObjectDataSourceStatusEventArgs e) { - if (e.AffectedRows == 0) + if (e.ReturnValue is Int32 && WDAC.GetInt32Value(e.ReturnValue) == 0) { gvBPAB.Visible = false; fvBPAB.ChangeMode(FormViewMode.Insert); diff --git a/Web/forms/customer/fmBpja.ascx b/Web/forms/customer/fmBpja.ascx index bcf11ec..d7e4624 100644 --- a/Web/forms/customer/fmBpja.ascx +++ b/Web/forms/customer/fmBpja.ascx @@ -9,10 +9,14 @@ - + + + + + = 0) + { + gvBPJA.PageIndex = rowIndex / gvBPJA.PageSize; + gvBPJA.SelectedIndex = rowIndex - gvBPJA.PageIndex * gvBPJA.PageSize; + } + + ParamList.Remove("BPJNO"); + } } private new void CalcFields(SqlDataSourceCommandEventArgs e) @@ -84,23 +89,6 @@ public partial class forms_customer_fmBpja : Wellan.Web.UI.WUserControlBase if (gvBPJA.SelectedIndex == -1) gvBPJA.SelectedIndex = 0; - // 返回時,回到之前選擇的那一筆 - // BPPYN,BPJNO - if (ParamList.ContainsKey("BPPYN") && ParamList.ContainsKey("BPJNO")) - { - DataView dv = dsBPJAGrid.Select(new DataSourceSelectArguments()) as DataView; - dv.RowFilter = String.Format("BPPYN='{0}' and BPJNO='{1}'", ParamList["BPPYN"], ParamList["BPJNO"]); - if (dv.Count > 0) - { - int rowIndex = dv.Table.Rows.IndexOf(dv[0].Row); - gvBPJA.PageIndex = (rowIndex / gvBPJA.PageSize); - gvBPJA.SelectedIndex = rowIndex - gvBPJA.PageIndex * gvBPJA.PageSize; - } - - // ParamList.Remove("BPPYN"); - ParamList.Remove("BPJNO"); - } - fvBPJA.DataBind(); } } @@ -112,9 +100,9 @@ public partial class forms_customer_fmBpja : Wellan.Web.UI.WUserControlBase gvBPJA.DataBind(); } - protected void dsBPJAGrid_Selected(object sender, SqlDataSourceStatusEventArgs e) + protected void dsBPJAGrid_Selected(object sender, ObjectDataSourceStatusEventArgs e) { - if (e.AffectedRows == 0) + if (e.ReturnValue is Int32 && WDAC.GetInt32Value(e.ReturnValue) == 0) { fvBPJA.ChangeMode(FormViewMode.Insert); fvBPJA_ModeChanged(sender, e); diff --git a/Web/forms/customer/fmBpjb.ascx b/Web/forms/customer/fmBpjb.ascx index 66fc407..df5a336 100644 --- a/Web/forms/customer/fmBpjb.ascx +++ b/Web/forms/customer/fmBpjb.ascx @@ -9,13 +9,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; diff --git a/Web/forms/customer/fmBprm.ascx b/Web/forms/customer/fmBprm.ascx index 201644e..98b81a1 100644 --- a/Web/forms/customer/fmBprm.ascx +++ b/Web/forms/customer/fmBprm.ascx @@ -80,12 +80,13 @@ - + + + + + - + - + - + - + - + - + - - + + + + + + + + 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); diff --git a/Web/forms/customer/fmRpfe.ascx b/Web/forms/customer/fmRpfe.ascx index 3da22b6..c332f26 100644 --- a/Web/forms/customer/fmRpfe.ascx +++ b/Web/forms/customer/fmRpfe.ascx @@ -6,11 +6,13 @@ TextMessageId="FMRPFE.NAME"> - - + + + + + - - + @@ -2589,13 +2589,13 @@ - + - + diff --git a/Web/forms/flow/fmSign.ascx.cs b/Web/forms/flow/fmSign.ascx.cs index 9e86332..224fe1c 100644 --- a/Web/forms/flow/fmSign.ascx.cs +++ b/Web/forms/flow/fmSign.ascx.cs @@ -86,10 +86,8 @@ public partial class forms_flow_fmSign : Wellan.Web.UI.WUserControlBase protected override void OnInit(EventArgs e) { base.OnInit(e); - dsRPAB.ConnectionString = ConnectionString; dsRPARForm.ConnectionString = ConnectionString; dsRPAR_RPTYP.ConnectionString = ConnectionString; - dsRPAB2.ConnectionString = ConnectionString; rparDao = new RparDAC(Query); rpabDao = new RpabDAC(Query); bsgpDao = new BsgpDAC(Query); @@ -1746,11 +1744,10 @@ public partial class forms_flow_fmSign : Wellan.Web.UI.WUserControlBase RPARGrid2.DataBind(); } - protected void dsRPAB2_Selecting(object sender, SqlDataSourceSelectingEventArgs e) + protected void dsRPAB2_Selecting(object sender, ObjectDataSourceSelectingEventArgs e) { if (RPARGrid2.SelectedValue != null) - e.Command.Parameters["@RPREN"].Value = RPARGrid2.SelectedValue; - //(sender as SqlDataSource).SelectParameters["RPREN"].DefaultValue = WDAC.GetStringValue(RPARGrid2.SelectedValue); + e.InputParameters["RPREN"] = RPARGrid2.SelectedValue; } protected string GetAttachLink(string RPREN) diff --git a/Web/forms/summary/fmSalaryCalc.ascx b/Web/forms/summary/fmSalaryCalc.ascx index d69cc9b..d59b285 100644 --- a/Web/forms/summary/fmSalaryCalc.ascx +++ b/Web/forms/summary/fmSalaryCalc.ascx @@ -139,15 +139,13 @@ - + - - + + - +
diff --git a/Web/forms/summary/fmSalaryCalc.ascx.cs b/Web/forms/summary/fmSalaryCalc.ascx.cs index 881bd52..eb15641 100644 --- a/Web/forms/summary/fmSalaryCalc.ascx.cs +++ b/Web/forms/summary/fmSalaryCalc.ascx.cs @@ -1560,7 +1560,6 @@ public partial class forms_summary_fmSalaryCalc : Wellan.Web.UI.WUserControlBase bool result = true; aYYMM = CheckDate(lbYYMM.Text + "01", "", ref result, cvMessage); - dsSACD.ConnectionString = ConnectionString; dsSACD.SelectParameters["BPPYN"].DefaultValue = ddlRSPYN.SelectedValue; dsSACD.SelectParameters["SAYMM"].DefaultValue = aYYMM.ToString(System.Globalization.CultureInfo.InvariantCulture); GridView1.DataBind(); diff --git a/Web/forms/worker/fmBpsn.ascx b/Web/forms/worker/fmBpsn.ascx index 9663456..9c507d4 100644 --- a/Web/forms/worker/fmBpsn.ascx +++ b/Web/forms/worker/fmBpsn.ascx @@ -215,12 +215,25 @@ TextMessageId="" Visible="False"> - + + + + + + + + + + + + + + + + = @TODAY)) - LEFT OUTER JOIN BPAA C ON B.RAPYN=C.BPPYN - LEFT OUTER JOIN BCLS D ON D.BSCLS=B.RABRH AND D.BSPAR='BPSNBRH' - LEFT OUTER JOIN BPJA E ON E.BPPYN=B.RAPYN AND E.BPJNO=B.RAJNO - LEFT OUTER JOIN BPJB F ON F.BPPYN=B.RAPYN AND F.BPJNO=B.RAJNO AND F.BPCNO=B.RACNO - LEFT OUTER JOIN RPIR G ON A.BPENO=G.RPENO AND G.RPREN=(SELECT MAX(RPREN) FROM RPIR WHERE RPENO=A.BPENO) - LEFT OUTER JOIN RPIB H ON G.RPREN=H.RPREN AND H.RPITM=(SELECT MAX(RPITM) FROM RPIB WHERE RPREN=H.RPREN) "; - private string where = " WHERE 1=1 "; - // private string order = " ORDER BY BPENO "; private bool fileOK = false; internal BprmDAC bprmDAC; @@ -163,7 +146,6 @@ public partial class forms_worker_fmBpsn : Wellan.Web.UI.WUserControlBase dsBPSNForm.DeleteCommand = @"DELETE BPSN WHERE BPENO = @OLD_BPENO AND APPNO = @OLD_APPNO"; dsBPSNForm.ConnectionString = ConnectionString; - dsBPSNGrid.ConnectionString = ConnectionString; dsBPSN_BPTYP.ConnectionString = ConnectionString; dsBPSN_BPGNR.ConnectionString = ConnectionString; dsBPSN_BPSGR.ConnectionString = ConnectionString; @@ -298,70 +280,27 @@ public partial class forms_worker_fmBpsn : Wellan.Web.UI.WUserControlBase _BPEDY_TYPE = ddlBPEDY.SelectedValue; _BPDPT_TYPE = ddlBPDPT.SelectedValue; - StringBuilder sql = new StringBuilder(); - sql.Append(select); - sql.Append(from); - sql.Append(where); - dsBPSNGrid.SelectParameters.Clear(); - dsBPSNGrid.SelectParameters.Add("TODAY", String.Format(WGuard1.InvariantCulture, "{0:yyyy-MM-dd}", DateTime.UtcNow.AddHours(8).Date)); - if (canSearch) - { - AddSearch(sql, dsBPSNGrid, "BPENO", _BPENO, "", true); - AddSearch(sql, dsBPSNGrid, "BPNME", _BPNME, "", true); - AddSearch(sql, dsBPSNGrid, "BPENM", _BPENM, "", true); - AddSearch(sql, dsBPSNGrid, "BPIDN", _BPIDN, "", true); - switch (_BPEDY_TYPE) - { - case "1": - sql.Append(" AND (BPEDY IS NULL OR BPEDY >= @TODAY) "); - break; - case "2": - sql.Append(" AND (BPEDY < @TODAY)"); - break; - } - switch (_BPDPT_TYPE) - { - case "1": - sql.Append(String.Format(" AND BPDPT IN {0} ", PublicVariable.InnerDepartment)); - break; - case "2": - sql.Append(String.Format(" AND BPDPT NOT IN {0} ", PublicVariable.InnerDepartment)); - break; - } - AddSearch(sql, dsBPSNGrid, "BPSDY", _BPSDY1, _BPSDY2, true); - AddSearch(sql, dsBPSNGrid, "BPEDY", _BPEDY1, _BPEDY2, true); - - if (!BpsnDAC.IsManager(UserId)) - { - sql.Append(" AND BPENO NOT IN ('00001','00002','00003') "); - } - } - else - { - AddSearch(sql, dsBPSNGrid, "BPENO", UserId, "", true); - } - // sql.Append(order); - dsBPSNGrid.SelectCommand = sql.ToString(); + dsBPSNGrid.SelectParameters["BPENO"].DefaultValue = _BPENO; + dsBPSNGrid.SelectParameters["BPNME"].DefaultValue = _BPNME; + dsBPSNGrid.SelectParameters["BPENM"].DefaultValue = _BPENM; + dsBPSNGrid.SelectParameters["BPIDN"].DefaultValue = _BPIDN; + dsBPSNGrid.SelectParameters["BPEDY_TYPE"].DefaultValue = _BPEDY_TYPE; + dsBPSNGrid.SelectParameters["BPDPT_TYPE"].DefaultValue = _BPDPT_TYPE; + dsBPSNGrid.SelectParameters["BPSDY1"].DefaultValue = _BPSDY1; + dsBPSNGrid.SelectParameters["BPSDY2"].DefaultValue = _BPSDY2; + dsBPSNGrid.SelectParameters["BPEDY1"].DefaultValue = _BPEDY1; + dsBPSNGrid.SelectParameters["BPEDY2"].DefaultValue = _BPEDY2; + dsBPSNGrid.SelectParameters["canSearch"].DefaultValue = canSearch.ToString(); + dsBPSNGrid.SelectParameters["userId"].DefaultValue = UserId; if (!string.IsNullOrEmpty(GetStringParam("BPENO")) || !string.IsNullOrEmpty(WDAC.GetStringValue(ViewState["RPENO"]))) { string bpeno = ""; if (!string.IsNullOrEmpty(GetStringParam("BPENO"))) bpeno = GetStringParam("BPENO"); if (!string.IsNullOrEmpty(WDAC.GetStringValue(ViewState["RPENO"]))) bpeno = WDAC.GetStringValue(ViewState["RPENO"]); - var cmdIndex = Query.NewCommand(); - cmdIndex.CommandText = string.Format("SELECT ROWID - 1 FROM ( {0} ) T WHERE BPENO = @TARGET", dsBPSNGrid.SelectCommand); - Query.AddParam(cmdIndex, "TODAY", DateTime.UtcNow.AddHours(8).Date); - Query.AddParam(cmdIndex, "BPENO1", _BPENO); - Query.AddParam(cmdIndex, "BPNME1", _BPNME); - Query.AddParam(cmdIndex, "BPENM1", _BPENM); - Query.AddParam(cmdIndex, "BPIDN1", _BPIDN); - Query.AddParam(cmdIndex, "BPSDY1", _BPSDY1); - Query.AddParam(cmdIndex, "BPSDY2", _BPSDY2); - Query.AddParam(cmdIndex, "BPEDY1", _BPEDY1); - Query.AddParam(cmdIndex, "BPEDY2", _BPEDY2); - Query.AddParam(cmdIndex, "TARGET", bpeno); - var o = Query.ExecuteScalar(cmdIndex); - int idx = (o is Int32 || o is Int64) ? WDAC.GetInt32Value(o) : -1; + + int idx = new BpsnDAC(Query).SelectBPENOIndex( + bpeno, _BPENO, _BPNME, _BPENM, _BPIDN, _BPEDY_TYPE, _BPDPT_TYPE, _BPSDY1, _BPSDY2, _BPEDY1, _BPEDY2, canSearch, UserId); if (idx >= 0) { @@ -455,9 +394,9 @@ public partial class forms_worker_fmBpsn : Wellan.Web.UI.WUserControlBase GridView1.DataBind(); } - protected void dsBPSNGrid_Selected(object sender, SqlDataSourceStatusEventArgs e) + protected void dsBPSNGrid_Selected(object sender, ObjectDataSourceStatusEventArgs e) { - if (e.AffectedRows == 0) + if (e.ReturnValue is Int32 && WDAC.GetInt32Value(e.ReturnValue) == 0) { if (MultiView1.ActiveViewIndex == 0) { diff --git a/Web/forms/worker/fmRpar.ascx b/Web/forms/worker/fmRpar.ascx index 31bf2f9..2c5305f 100644 --- a/Web/forms/worker/fmRpar.ascx +++ b/Web/forms/worker/fmRpar.ascx @@ -6,12 +6,19 @@ CssClass="pageTitle"> - + + + + + + + + + + 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 "; } @@ -625,9 +618,9 @@ public partial class forms_worker_fmRpar : Wellan.Web.UI.WUserControlBase RPARGrid.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) { 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) { diff --git a/Web/forms/worker/fmRsaj.ascx b/Web/forms/worker/fmRsaj.ascx index 5d428a9..0d0e95c 100644 --- a/Web/forms/worker/fmRsaj.ascx +++ b/Web/forms/worker/fmRsaj.ascx @@ -6,10 +6,14 @@ TextMessageId="FMRSAJ.NAME"> - + + + + + +
- - + + + + + + + diff --git a/Web/forms/worker/fmSendSalaryStrip.ascx.cs b/Web/forms/worker/fmSendSalaryStrip.ascx.cs index 5ab792c..dad73c5 100644 --- a/Web/forms/worker/fmSendSalaryStrip.ascx.cs +++ b/Web/forms/worker/fmSendSalaryStrip.ascx.cs @@ -50,42 +50,6 @@ public partial class forms_worker_fmSendSalaryStrip : Wellan.Web.UI.WUserControl LEFT OUTER JOIN BPSNView B ON A.SSENO=B.BPENO LEFT OUTER JOIN BPAA C ON A.SSPYN=C.BPPYN LEFT OUTER JOIN BRML D ON B.BPBNK=D.BCNUM"; - private string selectSum = - @"SELECT ISNULL(SUM(SSD01), 0) SSD01, ISNULL(SUM(SSD02), 0) SSD02, ISNULL(SUM(SSSRD), 0) SSSRD, ISNULL(SUM(SSP00), 0) SSP00, - ISNULL(SUM(SSP01), 0) SSP01, ISNULL(SUM(SSP02), 0) SSP02, ISNULL(SUM(SSP03), 0) SSP03, ISNULL(SUM(SSP04), 0) SSP04, - ISNULL(SUM(SSP05), 0) SSP05, ISNULL(SUM(SSP06), 0) SSP06, ISNULL(SUM(SSP07), 0) SSP07, ISNULL(SUM(SSP08), 0) SSP08, - ISNULL(SUM(SSP09), 0) SSP09, ISNULL(SUM(SSP10), 0) SSP10, ISNULL(SUM(SSP11), 0) SSP11, ISNULL(SUM(SSP12), 0) SSP12, - ISNULL(SUM(SSP13), 0) SSP13, ISNULL(SUM(SSP14), 0) SSP14, ISNULL(SUM(SSP15), 0) SSP15, ISNULL(SUM(SSP99), 0) SSP99, - ISNULL(SUM(SSS01), 0) SSS01, ISNULL(SUM(SSS02), 0) SSS02, ISNULL(SUM(SSS03), 0) SSS03, ISNULL(SUM(SSS04), 0) SSS04, - ISNULL(SUM(SSS05), 0) SSS05, ISNULL(SUM(SSS06), 0) SSS06, ISNULL(SUM(SSS07), 0) SSS07, ISNULL(SUM(SSS08), 0) SSS08, - ISNULL(SUM(SSS09), 0) SSS09, ISNULL(SUM(SSS10), 0) SSS10, ISNULL(SUM(SSS11), 0) SSS11, ISNULL(SUM(SSS12), 0) SSS12, - ISNULL(SUM(SSS13), 0) SSS13, ISNULL(SUM(SSS14), 0) SSS14, ISNULL(SUM(SSS15), 0) SSS15, ISNULL(SUM(SSS99), 0) SSS99, - ISNULL(SUM(SSH01), 0) SSH01, ISNULL(SUM(SSH02), 0) SSH02, ISNULL(SUM(SSH03), 0) SSH03, ISNULL(SUM(SSH04), 0) SSH04, - ISNULL(SUM(SSH05), 0) SSH05, ISNULL(SUM(SSH06), 0) SSH06, ISNULL(SUM(SSH07), 0) SSH07, ISNULL(SUM(SSH08), 0) SSH08, - ISNULL(SUM(SSH09), 0) SSH09, ISNULL(SUM(SSH10), 0) SSH10, ISNULL(SUM(SST01), 0) SST01, ISNULL(SUM(SST02), 0) SST02, - ISNULL(SUM(SST03), 0) SST03, ISNULL(SUM(SST04), 0) SST04, ISNULL(SUM(SST05), 0) SST05, ISNULL(SUM(SST06), 0) SST06, - ISNULL(SUM(SST07), 0) SST07, ISNULL(SUM(SST08), 0) SST08, ISNULL(SUM(SST09), 0) SST09, ISNULL(SUM(SST10), 0) SST10, - ISNULL(SUM(SST11), 0) SST11, ISNULL(SUM(SST12), 0) SST12, ISNULL(SUM(SST13), 0) SST13, ISNULL(SUM(SST14), 0) SST14, - ISNULL(SUM(SST15), 0) SST15, ISNULL(SUM(SST16), 0) SST16, ISNULL(SUM(SST17), 0) SST17, ISNULL(SUM(SST18), 0) SST18, - ISNULL(SUM(SST19), 0) SST19, ISNULL(SUM(SST20), 0) SST20, ISNULL(SUM(SST21), 0) SST21, ISNULL(SUM(SST22), 0) SST22, - ISNULL(SUM(SST23), 0) SST23, ISNULL(SUM(SST24), 0) SST24, ISNULL(SUM(SST25), 0) SST25, ISNULL(SUM(SSL01), 0) SSL01, - ISNULL(SUM(SSL02), 0) SSL02, ISNULL(SUM(SSL03), 0) SSL03, ISNULL(SUM(SSL04), 0) SSL04, ISNULL(SUM(SSL05), 0) SSL05, - ISNULL(SUM(SSP06 + SSP07 + SSP08 + SSP13 + SSP14), 0) OVERWORK, - ISNULL(SUM(SSP09 + SSP10 + SSP12), 0) OUTGOING, - ISNULL(SUM(SSP00 + SSP01 + SSP02 + SSP03 + SSP04 + SSP05 + SSP06 + SSP07 + SSP08 + SSP09 + SSP10 + SSP11 + SSP12 + - SSP13 + SSP14 + SSP15 + SSP99), 0) SSPLUS, - ISNULL(SUM(SSS01 + SSS02 + SSS09), 0) LEAVING, - ISNULL(SUM(SST01 + SST02 + SST03 + SST21 + SST22), 0) OVERWORKTIME, - ISNULL(SUM((SSP00 + SSP01 + SSP02 + SSP03 + SSP04 + SSP05 + SSP06 + SSP07 + SSP08 + SSP09 + SSP10 + SSP11 + SSP12 + - SSP13 + SSP14 + SSP15 + SSP99) - - (SSS01 + SSS02 + SSS03 + SSS04 + SSS05 + SSS06 + SSS07 + SSS08 + SSS09 + SSS10 + SSS11 + SSS12 + SSS13 + - SSS14 + SSS15 + SSS99)), 0) SSTOTAL, - ISNULL(SUM(SSS01 + SSS02 + SSS04 + SSS05 + SSS06 + SSS07 + SSS08 + SSS09 + SSS10 + SSS11 + SSS12 + SSS13 + SSS14 + - SSS15 + SSS99), 0) SSMINUS, - ISNULL(SUM(SSP01 + SSP02 + SSP03 + SSP04 + SSP05 + SSP06 + SSP07 + SSP08 + SSP09 + SSP10 + SSP11 + SSP12 + SSP13 + - SSP14 + SSP15 + SSP99), 0) TOTALPLUS, - ISNULL(SUM(SSH01 + SSH02 + SSH03), 0) EMPLOYER - FROM {0} A WHERE SSYMM=@SSYMM AND SSPYN=@SSPYN"; protected void Page_Load(object sender, EventArgs e) { @@ -102,11 +66,6 @@ public partial class forms_worker_fmSendSalaryStrip : Wellan.Web.UI.WUserControl if (_BonusTimes == "") _BonusTimes = "0"; - dsSSMS.ConnectionString = ConnectionString; - dsSSMSSum.ConnectionString = ConnectionString; - dsSSMS.SelectCommand = String.Format(select, _tableName) + " WHERE SSYMM=@SSYMM AND SSPYN=@SSPYN ORDER BY SSENO "; - dsSSMSSum.SelectCommand = String.Format(selectSum, _tableName); - if (ForwardSource != "") { MultiView1.ActiveViewIndex = 1; @@ -140,10 +99,9 @@ public partial class forms_worker_fmSendSalaryStrip : Wellan.Web.UI.WUserControl _SSYMM = _SSYMM.AddDays(i); s = _SSYMM.ToString(WGuard1.InvariantCulture); - dsSSMS.SelectParameters.Add("SSYMM", s); - dsSSMS.SelectParameters.Add("SSPYN", ddlSSPYN.SelectedValue); - dsSSMSSum.SelectParameters.Add("SSYMM", s); - dsSSMSSum.SelectParameters.Add("SSPYN", ddlSSPYN.SelectedValue); + dsSSMS.SelectParameters["tableName"].DefaultValue = _tableName; + dsSSMS.SelectParameters["SSYMM"].DefaultValue = s; + dsSSMS.SelectParameters["SSPYN"].DefaultValue = ddlSSPYN.SelectedValue; if (_BonusTimes == "0") { @@ -582,42 +540,42 @@ public partial class forms_worker_fmSendSalaryStrip : Wellan.Web.UI.WUserControl if (e.Row.RowType == DataControlRowType.Footer) { - var param = new DataSourceSelectArguments(); - var a = dsSSMSSum.Select(param) as DataView; + DataTable a = new SsmsDAC(Query).SelectSalaryStripSum(_tableName, _SSYMM, ddlSSPYN.SelectedValue); + DataRow ar = a.Rows[0]; e.Row.Cells[1].Text = "合計"; e.Row.Cells[1].HorizontalAlign = HorizontalAlign.Center; - e.Row.Cells[2].Text = string.Format("{0:###,###,##0}", a[0]["SSP00"]); // 本薪 + e.Row.Cells[2].Text = string.Format("{0:###,###,##0}", ar["SSP00"]); // 本薪 e.Row.Cells[2].HorizontalAlign = HorizontalAlign.Center; - e.Row.Cells[3].Text = string.Format("{0:###,###,##0}", a[0]["SSP01"]); // 全勤獎金 + e.Row.Cells[3].Text = string.Format("{0:###,###,##0}", ar["SSP01"]); // 全勤獎金 e.Row.Cells[3].HorizontalAlign = HorizontalAlign.Center; - e.Row.Cells[4].Text = string.Format("{0:###,###,##0}", a[0]["OVERWORK"]); + e.Row.Cells[4].Text = string.Format("{0:###,###,##0}", ar["OVERWORK"]); e.Row.Cells[4].HorizontalAlign = HorizontalAlign.Center; - e.Row.Cells[5].Text = string.Format("{0:###,###,##0}", a[0]["OUTGOING"]); + e.Row.Cells[5].Text = string.Format("{0:###,###,##0}", ar["OUTGOING"]); e.Row.Cells[5].HorizontalAlign = HorizontalAlign.Center; - e.Row.Cells[6].Text = string.Format("{0:###,###,##0}", a[0]["SSP11"]); + e.Row.Cells[6].Text = string.Format("{0:###,###,##0}", ar["SSP11"]); e.Row.Cells[6].HorizontalAlign = HorizontalAlign.Center; - e.Row.Cells[7].Text = string.Format("{0:###,###,##0}", a[0]["SSP02"]); + e.Row.Cells[7].Text = string.Format("{0:###,###,##0}", ar["SSP02"]); e.Row.Cells[7].HorizontalAlign = HorizontalAlign.Center; - e.Row.Cells[8].Text = string.Format("{0:###,###,##0}", a[0]["SSP99"]); + e.Row.Cells[8].Text = string.Format("{0:###,###,##0}", ar["SSP99"]); e.Row.Cells[8].HorizontalAlign = HorizontalAlign.Center; - e.Row.Cells[9].Text = string.Format("{0:###,###,##0}", a[0]["SSP03"]); + e.Row.Cells[9].Text = string.Format("{0:###,###,##0}", ar["SSP03"]); e.Row.Cells[9].HorizontalAlign = HorizontalAlign.Center; - e.Row.Cells[10].Text = string.Format("{0:###,###,##0}", a[0]["SSP05"]); + e.Row.Cells[10].Text = string.Format("{0:###,###,##0}", ar["SSP05"]); e.Row.Cells[10].HorizontalAlign = HorizontalAlign.Center; - e.Row.Cells[12].Text = string.Format("{0:###,###,##0}", a[0]["SSPLUS"]); + e.Row.Cells[12].Text = string.Format("{0:###,###,##0}", ar["SSPLUS"]); e.Row.Cells[12].HorizontalAlign = HorizontalAlign.Center; - e.Row.Cells[13].Text = string.Format("{0:###,###,##0}", a[0]["LEAVING"]); + e.Row.Cells[13].Text = string.Format("{0:###,###,##0}", ar["LEAVING"]); e.Row.Cells[13].HorizontalAlign = HorizontalAlign.Center; - e.Row.Cells[14].Text = string.Format("{0:###,###,##0}", a[0]["SSS05"]); + e.Row.Cells[14].Text = string.Format("{0:###,###,##0}", ar["SSS05"]); e.Row.Cells[14].HorizontalAlign = HorizontalAlign.Center; - e.Row.Cells[15].Text = string.Format("{0:###,###,##0}", a[0]["SSS04"]); + e.Row.Cells[15].Text = string.Format("{0:###,###,##0}", ar["SSS04"]); e.Row.Cells[15].HorizontalAlign = HorizontalAlign.Center; - e.Row.Cells[16].Text = string.Format("{0:###,###,##0}", a[0]["SSS07"]); + e.Row.Cells[16].Text = string.Format("{0:###,###,##0}", ar["SSS07"]); e.Row.Cells[16].HorizontalAlign = HorizontalAlign.Center; - e.Row.Cells[17].Text = string.Format("{0:###,###,##0}", a[0]["SSS06"]); + e.Row.Cells[17].Text = string.Format("{0:###,###,##0}", ar["SSS06"]); e.Row.Cells[17].HorizontalAlign = HorizontalAlign.Center; - e.Row.Cells[18].Text = string.Format("{0:###,###,##0}", a[0]["SSS99"]); + e.Row.Cells[18].Text = string.Format("{0:###,###,##0}", ar["SSS99"]); e.Row.Cells[18].HorizontalAlign = HorizontalAlign.Center; } }