using System; using System.Data; using System.Configuration; using System.Collections; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.Data.Common; using Wellan.Data; using Wellan.Common; using System.Text; using System.IO; using System.Drawing; /// /// 年度科目設定(小類) /// public partial class forms_customer_fmBpabSmall : Wellan.Web.UI.WUserControlBase { protected string _BPNUM = ""; protected string _BPPYN = ""; private string _OLD_BPACC = ""; protected void Page_Load(object sender, EventArgs e) { //if (IsPostBack) // gvBPAB.DataBind(); } protected override void OnInit(EventArgs e) { base.OnInit(e); dsBPABForm.ConnectionString = ConnectionString; dsBPABBig.ConnectionString = ConnectionString; _BPNUM = GetStringParam("BPNUM"); _BPPYN = GetStringParam("BPPYN"); dsBPABBig.SelectParameters["BPPYN"].DefaultValue = _BPPYN; GetGridViewRowColor(gvBPAB); Search(); } // 查詢動作 private new void Search() { dsBPABGrid.SelectParameters["BPPYN"].DefaultValue = _BPPYN; } private new void CalcFields(SqlDataSourceCommandEventArgs e) { Decimal bpbgt; if (Decimal.TryParse(e.Command.Parameters["@BPBGT"].Value.ToString(), out bpbgt)) e.Command.Parameters["@BPBGT"].Value = bpbgt; else e.Command.Parameters["@BPBGT"].Value = 0; } // 取得大類的排序號 private string GetBigBPCLS(string bpacc, DbConnection conn, DbTransaction tran) { DbCommand cmd1 = Query.NewCommand("SELECT BPCLS FROM BPAB WHERE BPACC=@BPACC"); cmd1.Connection = conn; cmd1.Transaction = tran; cmd1.Parameters.Add(Query.NewParameter("BPACC", bpacc.Substring(0, 2) + "0000")); return cmd1.ExecuteScalar().ToString(); } protected void dsBPABForm_Inserting(object sender, SqlDataSourceCommandEventArgs e) { CalcFields(e); string newBpacc = e.Command.Parameters["@BPACC"].Value.ToString(); int newBpord = Convert.ToInt32(e.Command.Parameters["@BPORD"].Value); e.Command.Connection.Open(); e.Command.Parameters["@BPCLS"].Value = String.Format("{0}{1:00}00", GetBigBPCLS(newBpacc, e.Command.Connection, e.Command.Transaction).Substring(0, 2), newBpord); } protected void dsBPABForm_Updating(object sender, SqlDataSourceCommandEventArgs e) { CalcFields(e); e.Command.Connection.Open(); e.Command.Transaction = e.Command.Connection.BeginTransaction(); // 修改自己的排序號碼 int newBpord = Convert.ToInt32(e.Command.Parameters["@BPORD"].Value); string oldBpcls = ViewState["OLD_BPCLS"] != null ? ViewState["OLD_BPCLS"].ToString() : ""; string newBpacc = e.Command.Parameters["@BPACC"].Value.ToString(); e.Command.Parameters["@BPCLS"].Value = String.Format("{0}{1:00}00", GetBigBPCLS(newBpacc, e.Command.Connection, e.Command.Transaction).Substring(0, 2), newBpord); } protected void dsBPABForm_Updated(object sender, SqlDataSourceStatusEventArgs e) { int newBpord = Convert.ToInt32(e.Command.Parameters["@BPORD"].Value); int oldBpord = ViewState["OLD_BPORD"] != null && ViewState["OLD_BPORD"].ToString() != "" ? Convert.ToInt32(ViewState["OLD_BPORD"]) : 0; string oldBpcls = ViewState["OLD_BPCLS"] != null ? ViewState["OLD_BPCLS"].ToString() : ""; string newBpacc = e.Command.Parameters["@BPACC"].Value.ToString(); string oldBpacc = e.Command.Parameters["@OLD_BPACC"].Value.ToString(); try { if (oldBpacc.Substring(0, 2) != newBpacc.Substring(0, 2) || newBpord != oldBpord) { StringBuilder sb = new StringBuilder(); sb.Append("UPDATE BPAB SET TRDAT=GETDATE(), TRMOD='UPDATE', TRUSR=@TRUSR, APPNO = APPNO + 1 "); DbCommand cmd = Query.NewCommand(); cmd.Connection = e.Command.Connection; cmd.Transaction = e.Command.Transaction; cmd.Parameters.Add(Query.NewParameter("TRUSR", UserId)); // 取得新大類的排序號 string newBigBpcls = GetBigBPCLS(newBpacc, e.Command.Connection, e.Command.Transaction); // 如果修改了大類,這個小類底下的科目都要移動過去 if (oldBpacc.Substring(0, 2) != newBpacc.Substring(0, 2)) { sb.Append(" , BPACC = @NEW_BPACC + SUBSTRING(BPACC, 5, 2) "); cmd.Parameters.Add(Query.NewParameter("NEW_BPACC", newBpacc.Substring(0, 4))); sb.Append(" , BPCLS = @NEW_BPORD + SUBSTRING(BPCLS, 5, 2) "); cmd.Parameters.Add(Query.NewParameter("NEW_BPORD", newBigBpcls.Substring(0, 2) + newBpord.ToString("00"))); } // 如果修改了排序號,那麼小類底下的排序號也要移動過去 else if (newBpord != oldBpord) { sb.Append(" , BPCLS = @NEW_BPORD + SUBSTRING(BPCLS, 5, 2) "); cmd.Parameters.Add(Query.NewParameter("NEW_BPORD", newBigBpcls.Substring(0, 2) + newBpord.ToString("00"))); } sb.Append(" WHERE SUBSTRING(BPACC, 1, 4)=@OLD_BPACC"); cmd.CommandText = sb.ToString(); cmd.Parameters.Add(Query.NewParameter("OLD_BPACC", oldBpacc.Substring(0, 4))); cmd.ExecuteNonQuery(); cmd.Dispose(); } // 連鎖更新科目對應 ChainUpdateBPAA(oldBpacc, newBpacc, e.Command.Transaction); e.Command.Transaction.Commit(); e.Command.Connection.Close(); } catch { e.Command.Transaction.Rollback(); e.Command.Connection.Close(); } } protected void gvBPAB_DataBound(object sender, EventArgs e) { GridView_DataBound(sender, e); if (gvBPAB.Rows.Count > 0) { if (gvBPAB.SelectedIndex == -1) gvBPAB.SelectedIndex = 0; fvBPAB.DataBind(); if (fvBPAB.DataItem != null) { ViewState["OLD_BPACC"] = (fvBPAB.DataItem as DataRowView)["BPACC"]; ViewState["OLD_BPCLS"] = (fvBPAB.DataItem as DataRowView)["BPCLS"]; ViewState["OLD_BPORD"] = (fvBPAB.DataItem as DataRowView)["BPORD"]; } } } protected void gvBPAB_PageIndexChanged(object sender, EventArgs e) { Search(); gvBPAB.SelectedIndex = 0; gvBPAB.DataBind(); } protected void dsBPABGrid_Selected(object sender, ObjectDataSourceStatusEventArgs e) { if (e.ReturnValue is Int32 && WDAC.GetInt32Value(e.ReturnValue) == 0) { gvBPAB.Visible = false; fvBPAB.ChangeMode(FormViewMode.Insert); fvBPAB_ModeChanged(sender, e); } } protected void fvBPAB_ItemCommand(object sender, FormViewCommandEventArgs e) { switch (e.CommandName) { case "Insert": break; case "Edit": break; case "Delete": break; case "Cancel": Search(); fvBPAB.ChangeMode(FormViewMode.ReadOnly); fvBPAB_ModeChanged(sender, e); if (gvBPAB.Rows.Count == 0) DoAfterCommand("BIG"); break; case "Big": DoAfterCommand("BIG"); break; case "Small": DoAfterCommand("SMALL"); break; case "Detail": DoAfterCommand("DETAIL"); break; case "Return": //ParamList.Clear(); DoAfterCommand("BPAA"); break; } } protected void fvBPAB_ItemDeleted(object sender, FormViewDeletedEventArgs e) { Search(); gvBPAB.DataBind(); if (gvBPAB.SelectedIndex > gvBPAB.Rows.Count - 1) { gvBPAB.SelectedIndex = gvBPAB.Rows.Count - 1; gvBPAB.DataBind(); } fvBPAB.DataBind(); } protected void fvBPAB_ItemInserted(object sender, FormViewInsertedEventArgs e) { Search(); } protected void fvBPAB_ItemUpdated(object sender, FormViewUpdatedEventArgs e) { Search(); } protected void fvBPAB_ModeChanged(object sender, EventArgs e) { switch (fvBPAB.CurrentMode) { case FormViewMode.ReadOnly: gvBPAB.Visible = true; gvBPAB.DataBind(); if (gvBPAB.Rows.Count > 0) { if (gvBPAB.SelectedIndex == -1) { gvBPAB.SelectedIndex = 0; } if (OldMode == FormViewMode.Insert) { gvBPAB.PageIndex = gvBPAB.PageCount - 1; gvBPAB.DataBind(); gvBPAB.SelectedIndex = gvBPAB.Rows.Count - 1; } fvBPAB.DataBind(); } break; case FormViewMode.Edit: gvBPAB.Visible = false; break; case FormViewMode.Insert: gvBPAB.Visible = false; break; } } protected void fvBPAB_ModeChanging(object sender, FormViewModeEventArgs e) { OldMode = (sender as FormView).CurrentMode; } protected void fvBPAB_DataBound(object sender, EventArgs e) { switch (fvBPAB.CurrentMode) { case FormViewMode.Edit: SetClientFocus(fvBPAB, "txtBPAB_BPAME"); break; case FormViewMode.Insert: SetClientFocus(fvBPAB, "txtBPAB_BPAME"); break; case FormViewMode.ReadOnly: if (fvBPAB.DataItem != null) { ViewState["OLD_BPACC"] = (fvBPAB.DataItem as DataRowView)["BPACC"]; ViewState["OLD_BPCLS"] = (fvBPAB.DataItem as DataRowView)["BPCLS"]; ViewState["OLD_BPORD"] = (fvBPAB.DataItem as DataRowView)["BPORD"]; } break; } } protected void fvBPAB_ItemCreated(object sender, EventArgs e) { switch (fvBPAB.CurrentMode) { case FormViewMode.Insert: (fvBPAB.FindControl("lbBPAB_BPNUM") as ITextControl).Text = _BPNUM; (fvBPAB.FindControl("lbBPAB_BPPYN") as ITextControl).Text = _BPPYN; break; } } protected void gvBPAB_RowDataBound(object sender, GridViewRowEventArgs e) { SetGridViewMouseBehavier(sender as GridView, e.Row); //GridView_RowDataBound_Shrink_ViewState(sender, e); } protected void gvBPAB_SelectedIndexChanged(object sender, EventArgs e) { foreach (GridViewRow row in gvBPAB.Rows) SetGridViewMouseBehavier(gvBPAB, row); } // 取得大類名稱 protected string GetBPACCBig(string bpacc) { DbCommand cmd = Query.NewCommand("SELECT BPAME FROM BPAB WHERE BPPYN=@BPPYN AND BPACC=@BPACC"); cmd.Parameters.Add(Query.NewParameter("BPPYN", _BPPYN)); cmd.Parameters.Add(Query.NewParameter("BPACC", bpacc.Substring(0, 2) + "0000")); object o = Query.ExecuteScalar(cmd); if (o == null || o == DBNull.Value) return ""; else return o.ToString(); } // 取得自動編號的科目編號 private string GetNewBPACC(string bpaccBig) { return WGuard1.WNextRen(DateTime.UtcNow.AddHours(8), "BPAB", "BPACC", String.Format("\"{0}\"<99>\"00\"", bpaccBig.Substring(0, 2)), string.Format(" BPPYN='{0}'", _BPPYN)); } protected void fvBPAB_ItemInserting(object sender, FormViewInsertEventArgs e) { string bpaccBig = (fvBPAB.FindControl("dlBPAB_BPACCBig") as DropDownList).SelectedValue; e.Values["BPACC"] = GetNewBPACC(bpaccBig); } protected void fvBPAB_ItemUpdating(object sender, FormViewUpdateEventArgs e) { _OLD_BPACC = ViewState["OLD_BPACC"] != null ? ViewState["OLD_BPACC"].ToString() : ""; string bpaccBig = (fvBPAB.FindControl("dlBPAB_BPACCBig") as DropDownList).SelectedValue; if (_OLD_BPACC.Substring(0, 2) != bpaccBig.Substring(0, 2)) e.NewValues["BPACC"] = GetNewBPACC(bpaccBig); } protected void cvBPORD_ServerValidate(object source, ServerValidateEventArgs args) { int i; args.IsValid = int.TryParse(args.Value, out i) && i > 0 && i < 100; } protected void fvBPAB_ItemDeleting(object sender, FormViewDeleteEventArgs e) { // 刪除前檢查 // 1. 是否已有科目設定 DbCommand cmd1 = Query.NewCommand("SELECT COUNT(1) FROM BPAB WHERE BPPYN=@BPPYN AND BPACC >= @BPACC + '01' AND BPACC <= @BPACC + '99'"); cmd1.Parameters.Add(Query.NewParameter("BPPYN", e.Values["BPPYN"])); cmd1.Parameters.Add(Query.NewParameter("BPACC", e.Values["BPACC"].ToString().Substring(0, 4))); int i = Convert.ToInt32(Query.ExecuteScalar(cmd1)); if (i > 0) { cvMessage.ErrorMessage = "本小類之下有科目。不可刪除!"; cvMessage.IsValid = false; e.Cancel = true; } } protected void dsBPABForm_Deleting(object sender, SqlDataSourceCommandEventArgs e) { e.Command.Connection.Open(); e.Command.Transaction = e.Command.Connection.BeginTransaction(); } protected void ChainUpdateBPAA(string old_bpacc, string new_bpacc, DbTransaction tran) { // 取得專案科目對應資料 GetData gd = new GetData(); gd.Query = Query; DataTable bpaa = gd.GetBPAA_BPPYN(_BPPYN); DataRow bpaaRow = bpaa.Rows[0]; DbCommand cmdUpdateBPAA = Query.NewCommand(); cmdUpdateBPAA.Connection = tran.Connection; cmdUpdateBPAA.Transaction = tran; cmdUpdateBPAA.Parameters.Add(Query.NewParameter("TRUSR", UserId)); cmdUpdateBPAA.Parameters.Add(Query.NewParameter("BPPYN", _BPPYN)); cmdUpdateBPAA.Parameters.Add(Query.NewParameter("BPSXX", new_bpacc)); // 核對科目對應資料,如果已有科目對應,則清除科目對應 string[] fieldNames = {"BPS01", "BPS02", "BPS03", "BPS04", "BPS05", "BPS06", "BPS07", "BPS08", "BPS09", "BPS10", "BPS11", "BPS12", "BPS13", "BPS14", "BPS15", "BPS16", "BPS17", "BPS18", "BPS19", "BPS20", "BPS21", "BPS22", "BPS23", "BPS24", "BPS25", "BPS26", "BPS27", "BPS28", "BPS29", "BPS30"}; for (int i = 0; i < fieldNames.Length; i++) { if (bpaaRow[fieldNames[i]] != DBNull.Value && bpaaRow[fieldNames[i]].ToString() == old_bpacc) { cvMessage.ErrorMessage += String.Format("\"{0}\" 的科目對應因科目刪除而清除
", GetString("BPAA." + fieldNames[i])); cmdUpdateBPAA.CommandText = String.Format("UPDATE BPAA SET {0}=@BPSXX, TRDAT=GETDATE(), TRMOD='UPDATE', TRUSR=@TRUSR WHERE BPPYN=@BPPYN", fieldNames[i]); cmdUpdateBPAA.ExecuteNonQuery(); } } } protected void dsBPABForm_Deleted(object sender, SqlDataSourceStatusEventArgs e) { cvMessage.IsValid = true; cvMessage.ErrorMessage = ""; ChainUpdateBPAA(e.Command.Parameters["@OLD_BPACC"].Value.ToString(), "", e.Command.Transaction); e.Command.Transaction.Commit(); e.Command.Connection.Close(); cvMessage.IsValid = cvMessage.ErrorMessage == ""; } }