using System; using System.Data; using System.Configuration; using System.Data.Common; using System.Collections; using System.Text; using System.ComponentModel; using Wellan.Data; /// /// 薪資資料與薪資異動資料的資料處理類別 /// [DataObject(true)] public class BpslDAC : Wellan.Data.WDAC { private DbCommand cmdSelectBpslBpeno; private DbCommand cmdSelectRpsl; private DbCommand cmdSelectBpslOne; private DbCommand cmdSelectRpslOne; private DbCommand cmdSelectRpslAll; private DbCommand cmdSelectBpsl2; public BpslDAC() { // 取出最後一筆異動 cmdSelectRpsl = Query.NewCommand( @"SELECT TOP 1 RPENO BPENO, RPITM BPITM, RPBDT BPBDT, RPSRM BPSRM, RPSRD BPSRD, RPP01 BPP01, RPP02 BPP02, RPP03 BPP03, RPP04 BPP04, RPP05 BPP05, APPNO FROM RPSL WHERE RPENO=@BPENO ORDER BY BPITM DESC"); cmdSelectRpsl.Parameters.Add(Query.NewParameter("BPENO", DbType.String)); // 取出員工薪資資料 cmdSelectBpslOne = Query.NewCommand( @"SELECT *, 0 BPITM, NULL BPBDT FROM BPSL WHERE BPENO=@BPENO"); cmdSelectBpslOne.Parameters.Add(Query.NewParameter("BPENO", DbType.String)); // 取出某一筆薪資異動資料 cmdSelectRpslOne = Query.NewCommand( @"SELECT RPENO BPENO, RPITM BPITM, RPBDT BPBDT, RPSRM BPSRM, RPSRD BPSRD, RPP01 BPP01, RPP02 BPP02, RPP03 BPP03, RPP04 BPP04, RPP05 BPP05, APPNO FROM RPSL WHERE RPENO=@BPENO AND RPITM=@BPITM"); cmdSelectRpslOne.Parameters.Add(Query.NewParameter("BPENO", DbType.String)); cmdSelectRpslOne.Parameters.Add(Query.NewParameter("BPITM", DbType.Int32)); // 取出某員工編號全部的紀錄,以異動次數排序 cmdSelectRpslAll = Query.NewCommand( @"SELECT BPENO, 0 BPITM, NULL BPBDT, BPSRM, BPSRD, BPP01, BPP02, BPP03, BPP04, BPP05, APPNO FROM BPSL WHERE BPENO=@BPENO UNION SELECT RPENO BPENO, RPITM BPITM, RPBDT BPBDT, RPSRM BPSRM, RPSRD BPSRD, RPP01 BPP01, RPP02 BPP02, RPP03 BPP03, RPP04 BPP04, RPP05 BPP05, APPNO FROM RPSL WHERE RPENO=@BPENO ORDER BY BPITM"); cmdSelectRpslAll.Parameters.Add(Query.NewParameter("BPENO", DbType.String)); // 取出某員工編號全部的紀錄,以生效日期排序 cmdSelectBpsl2 = Query.NewCommand( @"SELECT BPENO, 0 BPITM, '1899/12/31' BPBDT, BPSRM, BPSRD, BPP01, BPP02, BPP03, BPP04, BPP05, APPNO FROM BPSL WHERE BPENO=@BPENO UNION SELECT RPENO BPENO, RPITM BPITM, RPBDT BPBDT, RPSRM BPSRM, RPSRD BPSRD, RPP01 BPP01, RPP02 BPP02, RPP03 BPP03, RPP04 BPP04, RPP05 BPP05, APPNO FROM RPSL WHERE RPENO=@BPENO ORDER BY BPBDT"); cmdSelectBpsl2.Parameters.Add(Query.NewParameter("BPENO", DbType.String)); } public BpslDAC(string connectionConfig, string connectionConfigName) : this() { base._connectionConfig = connectionConfig; base._connectionConfigName = connectionConfigName; } public BpslDAC(WQuery query) : this() { base._query = query; } private DataTable NewResult() { // 準備輸出資料架構 DataTable Result = new DataTable(); Result.Columns.Add("BPENO", typeof(String)); Result.Columns.Add("BPITM", typeof(Int32)); Result.Columns.Add("BPBDT", typeof(DateTime)); Result.Columns.Add("BPSRM", typeof(Int32)); Result.Columns.Add("BPSRD", typeof(Int32)); Result.Columns.Add("BPP01", typeof(Int32)); Result.Columns.Add("BPP02", typeof(Int32)); Result.Columns.Add("BPP03", typeof(Int32)); Result.Columns.Add("BPP04", typeof(Int32)); Result.Columns.Add("BPP05", typeof(Int32)); Result.Columns.Add("APPNO", typeof(Int32)); Result.Columns.Add("BPSRM_Changed", typeof(Char)); Result.Columns.Add("BPSRD_Changed", typeof(Char)); Result.Columns.Add("BPP01_Changed", typeof(Char)); Result.Columns.Add("BPP02_Changed", typeof(Char)); Result.Columns.Add("BPP03_Changed", typeof(Char)); Result.Columns.Add("BPP04_Changed", typeof(Char)); Result.Columns.Add("BPP05_Changed", typeof(Char)); return Result; } private void FillResult(DataTable Result, DataRow source) { DataRow newRow = Result.NewRow(); newRow["BPENO"] = source["BPENO"]; newRow["BPITM"] = source["BPITM"]; newRow["BPBDT"] = source["BPBDT"]; newRow["BPSRM"] = source["BPSRM"]; newRow["BPSRD"] = source["BPSRD"]; newRow["BPP01"] = source["BPP01"]; newRow["BPP02"] = source["BPP02"]; newRow["BPP03"] = source["BPP03"]; newRow["BPP04"] = source["BPP04"]; newRow["BPP05"] = source["BPP05"]; newRow["APPNO"] = source["APPNO"]; newRow["BPSRM_Changed"] = 'N'; newRow["BPSRD_Changed"] = 'N'; newRow["BPP01_Changed"] = 'N'; newRow["BPP02_Changed"] = 'N'; newRow["BPP03_Changed"] = 'N'; newRow["BPP04_Changed"] = 'N'; newRow["BPP05_Changed"] = 'N'; Result.Rows.Add(newRow); } private Char FieldDiff(object obj1, object obj2) { string s1 = obj1 != DBNull.Value ? obj1.ToString() : ""; string s2 = obj2 != DBNull.Value ? obj2.ToString() : ""; if (s1.CompareTo(s2) != 0) return 'Y'; else return 'N'; } private void FillResult(DataTable Result, DataRow current, DataRow prev) { DataRow newRow = Result.NewRow(); newRow["BPENO"] = current["BPENO"]; newRow["BPITM"] = current["BPITM"]; newRow["BPBDT"] = current["BPBDT"]; newRow["BPSRM"] = current["BPSRM"]; newRow["BPSRD"] = current["BPSRD"]; newRow["BPP01"] = current["BPP01"]; newRow["BPP02"] = current["BPP02"]; newRow["BPP03"] = current["BPP03"]; newRow["BPP04"] = current["BPP04"]; newRow["BPP05"] = current["BPP05"]; newRow["APPNO"] = current["APPNO"]; newRow["BPSRM_Changed"] = FieldDiff(current["BPSRM"], prev["BPSRM"]); newRow["BPSRD_Changed"] = FieldDiff(current["BPSRD"], prev["BPSRD"]); newRow["BPP01_Changed"] = FieldDiff(current["BPP01"], prev["BPP01"]); newRow["BPP02_Changed"] = FieldDiff(current["BPP02"], prev["BPP02"]); newRow["BPP03_Changed"] = FieldDiff(current["BPP03"], prev["BPP03"]); newRow["BPP04_Changed"] = FieldDiff(current["BPP04"], prev["BPP04"]); newRow["BPP05_Changed"] = FieldDiff(current["BPP05"], prev["BPP05"]); Result.Rows.Add(newRow); } /// /// 依條件取出資料,給 GridView 的 Select 用的 /// [DataObjectMethod(DataObjectMethodType.Select)] public DataTable Select(string BPENO, string BPNME) { if (cmdSelectBpslBpeno == null) cmdSelectBpslBpeno = Query.NewCommand(); cmdSelectBpslBpeno.Parameters.Clear(); // 清空輸出資料表 DataTable Result = NewResult(); // 依條件抓出員工編號 StringBuilder sb = new StringBuilder(); sb.Append("SELECT A.BPENO FROM BPSL A INNER JOIN BPSNView B ON A.BPENO=B.BPENO WHERE 1=1 "); if (BPENO != null && BPENO.Length > 0) { sb.Append(" AND A.BPENO LIKE @BPENO "); cmdSelectBpslBpeno.Parameters.Add(Query.NewParameter("BPENO", BPENO + "%")); } if (BPNME != null && BPNME.Length > 0) { sb.Append(" AND B.BPNME LIKE @BPNME "); cmdSelectBpslBpeno.Parameters.Add(Query.NewParameter("BPNME", BPNME + "%")); } cmdSelectBpslBpeno.CommandText = sb.ToString(); DataTable bpenoTmp = Query.Select(cmdSelectBpslBpeno); DataTable bpslTmp; // 一筆一筆的抓出應該顯示的資料 foreach (DataRow bpenoRow in bpenoTmp.Rows) { // 依照員工編號,抓出最後一筆異動 cmdSelectRpsl.Parameters[0].Value = bpenoRow[0]; bpslTmp = Query.Select(cmdSelectRpsl); // 有異動資料,填入異動資料 if (bpslTmp.Rows.Count != 0) { FillResult(Result, bpslTmp.Rows[0]); } // 沒有異動資料,填入原始資料 else { cmdSelectBpslOne.Parameters[0].Value = bpenoRow[0]; bpslTmp = Query.Select(cmdSelectBpslOne); FillResult(Result, bpslTmp.Rows[0]); } } return Result; } /// /// 取出最新資料,給 FormView 的 Select 用的 /// [DataObjectMethod(DataObjectMethodType.Select)] public DataTable SelectOne(string BPENO, int BPITM) { return SelectOne(BPENO, BPITM, null); } /// /// 取出某一筆薪資異動資料 /// public DataTable SelectOne(string BPENO, int BPITM, DbTransaction tran) { DataTable Result = NewResult(); if (BPENO != null && BPENO.Length > 0) { // 取原始資料 if (BPITM == 0) { cmdSelectBpslOne.Parameters[0].Value = BPENO; DataTable tmp; if (tran == null) tmp = Query.Select(cmdSelectBpslOne); else tmp = Query.Select(cmdSelectBpslOne, tran); if (tmp.Rows.Count > 0) FillResult(Result, tmp.Rows[0]); } else { cmdSelectRpslOne.Parameters[0].Value = BPENO; cmdSelectRpslOne.Parameters[1].Value = BPITM; DataTable tmp; if (tran == null) tmp = Query.Select(cmdSelectRpslOne); else tmp = Query.Select(cmdSelectRpslOne, tran); if (tmp.Rows.Count > 0) FillResult(Result, tmp.Rows[0]); } } return Result; } /// /// 取出所有薪資異動歷史資料,薪資異動查詢用 /// [DataObjectMethod(DataObjectMethodType.Select)] public DataTable SelectRPSL(string BPENO) { DataTable Result = NewResult(); if (BPENO != null && BPENO.Length > 0) { cmdSelectRpslAll.Parameters[0].Value = BPENO; DataTable tmp = Query.Select(cmdSelectRpslAll); for (int i = 0; i < tmp.Rows.Count; i++) { if (i > 0) FillResult(Result, tmp.Rows[i], tmp.Rows[i - 1]); else FillResult(Result, tmp.Rows[i]); } } return Result; } /// /// 取出日期區間內薪資基本資料以及薪資異動資料 /// public DataTable SelectBPSLDateRange(string bpeno, DateTime startDay, DateTime endDay, DbTransaction tran) { DataTable Result = NewResult(); if (bpeno != null && bpeno.Length > 0) { cmdSelectBpsl2.Parameters[0].Value = bpeno; DataTable tmp = Query.Select(cmdSelectBpsl2, tran); int startIndex = -1; int endIndex = -1; for (int i = 0; i < tmp.Rows.Count; i++) { DateTime bpbdt = Convert.ToDateTime(tmp.Rows[i]["BPBDT"]); if (startDay >= bpbdt) startIndex = i; if (endDay >= bpbdt) endIndex = i; } if (startIndex != -1 && endIndex != -1) { for (int i = startIndex; i <= endIndex; i++) { FillResult(Result, tmp.Rows[i]); } } } return Result; } /// /// 取出某一筆薪資異動紀錄 /// [DataObjectMethod(DataObjectMethodType.Select)] public DataTable SelectRPSLOne(string BPENO, int BPITM) { DataTable Result = NewResult(); if (BPENO != null && BPENO.Length > 0) { cmdSelectRpslAll.Parameters[0].Value = BPENO; DataTable tmp = Query.Select(cmdSelectRpslAll); for (int i = 0; i < tmp.Rows.Count; i++) { if (Convert.ToInt32(tmp.Rows[i]["BPITM"]) == BPITM) { if (i > 0) FillResult(Result, tmp.Rows[i], tmp.Rows[i - 1]); else FillResult(Result, tmp.Rows[i]); } } } return Result; } /// /// 取得下一個薪資異動項次 /// private int NextRPITM(string BPENO) { DbCommand cmd = Query.NewCommand("SELECT ISNULL(MAX(RPITM), 0) + 1 FROM RPSL WHERE RPENO=@RPENO"); cmd.Parameters.Add(Query.NewParameter("RPENO", BPENO)); int Result; ExecuteScalar(cmd, out Result); return Result; } /// /// 新增一筆員工薪資資料,或薪資異動紀錄 /// [DataObjectMethod(DataObjectMethodType.Insert)] public int Insert(string BPENO, int BPITM, DateTime BPBDT, int BPSRM, int BPSRD, int BPP01, int BPP02, int BPP03, int BPP04, int BPP05, string TRUSR) { DbCommand cmdInsert = Query.NewCommand(); if (BPITM == 0) { cmdInsert.CommandText = @"INSERT INTO BPSL (BPENO, BPSRM, BPSRD, BPP01, BPP02, BPP03, BPP04, BPP05, APPNO, TRDAT, TRMOD, TRUSR) VALUES (@BPENO, @BPSRM, @BPSRD, @BPP01, @BPP02, @BPP03, @BPP04, @BPP05, 1, GETDATE(), 'INSERT', @TRUSR)"; AddParam(cmdInsert, "BPENO", BPENO); AddParam(cmdInsert, "BPSRM", BPSRM); AddParam(cmdInsert, "BPSRD", BPSRD); AddParam(cmdInsert, "BPP01", BPP01); AddParam(cmdInsert, "BPP02", BPP02); AddParam(cmdInsert, "BPP03", BPP03); AddParam(cmdInsert, "BPP04", BPP04); AddParam(cmdInsert, "BPP05", BPP05); AddParam(cmdInsert, "TRUSR", TRUSR); } else { cmdInsert.CommandText = @"INSERT INTO RPSL (RPENO, RPITM, RPBDT, RPSRM, RPSRD, RPP01, RPP02, RPP03, RPP04, RPP05, APPNO, TRDAT, TRMOD, TRUSR) VALUES (@RPENO, @RPITM, @RPBDT, @RPSRM, @RPSRD, @RPP01, @RPP02, @RPP03, @RPP04, @RPP05, 1, GETDATE(), 'INSERT', @TRUSR)"; AddParam(cmdInsert, "RPENO", BPENO); AddParam(cmdInsert, "RPITM", NextRPITM(BPENO)); AddParam(cmdInsert, "RPBDT", BPBDT); AddParam(cmdInsert, "RPSRM", BPSRM); AddParam(cmdInsert, "RPSRD", BPSRD); AddParam(cmdInsert, "RPP01", BPP01); AddParam(cmdInsert, "RPP02", BPP02); AddParam(cmdInsert, "RPP03", BPP03); AddParam(cmdInsert, "RPP04", BPP04); AddParam(cmdInsert, "RPP05", BPP05); AddParam(cmdInsert, "TRUSR", TRUSR); } return Query.ExecuteNonQuery(cmdInsert); } /// /// 更正員工薪資資料或薪資異動紀錄 /// [DataObjectMethod(DataObjectMethodType.Update)] public int Update(string BPENO, int BPITM, DateTime BPBDT, int BPSRM, int BPSRD, int BPP01, int BPP02, int BPP03, int BPP04, int BPP05, string TRUSR, int APPNO, string OLD_BPENO, int OLD_BPITM, int OLD_APPNO) { DbCommand cmdUpdate = Query.NewCommand(); if (OLD_BPITM == 0) { cmdUpdate.CommandText = @"UPDATE BPSL SET BPENO = @BPENO, BPSRM = @BPSRM, BPSRD = @BPSRD, BPP01 = @BPP01, BPP02 = @BPP02, BPP03 = @BPP03, BPP04 = @BPP04, BPP05 = @BPP05, APPNO = APPNO + 1, TRDAT = GETDATE(), TRMOD = 'UPDATE', TRUSR = @TRUSR WHERE BPENO = @OLD_BPENO AND APPNO = @OLD_APPNO"; AddParam(cmdUpdate, "BPENO", BPENO); AddParam(cmdUpdate, "BPSRM", BPSRM); AddParam(cmdUpdate, "BPSRD", BPSRD); AddParam(cmdUpdate, "BPP01", BPP01); AddParam(cmdUpdate, "BPP02", BPP02); AddParam(cmdUpdate, "BPP03", BPP03); AddParam(cmdUpdate, "BPP04", BPP04); AddParam(cmdUpdate, "BPP05", BPP05); AddParam(cmdUpdate, "TRUSR", TRUSR); AddParam(cmdUpdate, "OLD_BPENO", OLD_BPENO); AddParam(cmdUpdate, "OLD_APPNO", OLD_APPNO); } else { cmdUpdate.CommandText = @"UPDATE RPSL SET RPENO = @RPENO, RPITM = @RPITM, RPBDT = @RPBDT, RPSRM = @RPSRM, RPSRD = @RPSRD, RPP01 = @RPP01, RPP02 = @RPP02, RPP03 = @RPP03, RPP04 = @RPP04, RPP05 = @RPP05, APPNO = APPNO + 1, TRDAT = GETDATE(), TRMOD = 'UPDATE', TRUSR = @TRUSR WHERE RPENO = @OLD_RPENO AND RPITM = @OLD_RPITM AND APPNO = @OLD_APPNO"; AddParam(cmdUpdate, "RPENO", BPENO); AddParam(cmdUpdate, "RPITM", BPITM); AddParam(cmdUpdate, "RPBDT", BPBDT); AddParam(cmdUpdate, "RPSRM", BPSRM); AddParam(cmdUpdate, "RPSRD", BPSRD); AddParam(cmdUpdate, "RPP01", BPP01); AddParam(cmdUpdate, "RPP02", BPP02); AddParam(cmdUpdate, "RPP03", BPP03); AddParam(cmdUpdate, "RPP04", BPP04); AddParam(cmdUpdate, "RPP05", BPP05); AddParam(cmdUpdate, "TRUSR", TRUSR); AddParam(cmdUpdate, "OLD_RPENO", OLD_BPENO); AddParam(cmdUpdate, "OLD_RPITM", OLD_BPITM); AddParam(cmdUpdate, "OLD_APPNO", OLD_APPNO); } return Query.ExecuteNonQuery(cmdUpdate); } /// /// 刪除員工薪資資料或薪資異動紀錄 /// [DataObjectMethod(DataObjectMethodType.Delete)] public int Delete(string OLD_BPENO, int OLD_BPITM, int OLD_APPNO) { OLD_BPENO = OLD_BPENO != null ? OLD_BPENO : ""; DbCommand cmdDelete = Query.NewCommand(); if (OLD_BPITM == 0) { cmdDelete.CommandText = @"DELETE FROM BPSL WHERE BPENO = @OLD_BPENO AND APPNO = @OLD_APPNO"; AddParam(cmdDelete, "OLD_BPENO", OLD_BPENO); AddParam(cmdDelete, "OLD_APPNO", OLD_APPNO); } else { cmdDelete.CommandText = @"DELETE FROM RPSL WHERE RPENO = @OLD_BPENO AND RPITM = @OLD_BPITM AND APPNO = @OLD_APPNO"; AddParam(cmdDelete, "OLD_BPENO", OLD_BPENO); AddParam(cmdDelete, "OLD_BPITM", OLD_BPITM); AddParam(cmdDelete, "OLD_APPNO", OLD_APPNO); } return Query.ExecuteNonQuery(cmdDelete); } }