public bool CheckPurItemIsOnWay(string sPurNo, string sItemNo, string sPeriod)
        {
            try
            {
                DBO.PUR_PurchaseOrderDBO dbo = new PUR_PurchaseOrderDBO(ref USEDB);
                int iCount = dbo.CheckPurItemIsOnWay(sPurNo, sItemNo, sPeriod);

                if (iCount == 0)
                { return false; }
                else
                { return true; }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public bool CheckPurchaseIsACCEPT(string sPurNo)
        {
            try
            {
                DBO.PUR_PurchaseOrderDBO dbo = new PUR_PurchaseOrderDBO(ref USEDB);
                int iCount = dbo.CheckPurchaseIsACCEPT(sPurNo);

                if (iCount == 0)
                { return false; }
                else
                { return true; }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
 public string GetDetail_Data(ArrayList ParameterList)
 {
     try
     {
         DBO.PUR_PurchaseOrderDBO dbo = new PUR_PurchaseOrderDBO(ref USEDB);
         return dbo.doGetDetailData(ParameterList);
     }
     catch (Exception ex)
     {
         throw ex;
     }
 }
 public DataTable GetVendorDataByVendorNo(ArrayList ParameterList)
 {
     try
     {
         DBO.PUR_PurchaseOrderDBO dbo = new PUR_PurchaseOrderDBO(ref USEDB);
         return dbo.GetVendorData(ParameterList);
     }
     catch (Exception ex)
     {
         throw ex;
     }
 }
 public int Check_DC_Date(ArrayList ParameterList)
 {
     try
     {
         DBO.PUR_PurchaseOrderDBO dbo = new PUR_PurchaseOrderDBO(ref USEDB);
         return dbo.doCheck_DC_Date(ParameterList);
     }
     catch (Exception ex)
     {
         throw ex;
     }
 }
        /// <summary>
        /// 刪除該使用者存在於 VDS_PUR_PURCHASEORDER_TMP 的舊資料,並將 EXCEL 中新資料匯入 VDS_PUR_PURCHASEORDER_TMP
        /// </summary>
        /// <param name="ParameterList">刪除變數</param>
        /// <param name="RootDBT">是否有主交易,無主交易輸入null</param>
        /// <returns>回傳影響筆數</returns>
        public void DELETE_AND_INSERT_TEMP_TABLE(ArrayList ParameterList, DbTransaction RootDBT, DataTable dt_ALO_IMPORT_TMP)
        {
            bool IsRootTranscation = false;

            try
            {
                PUR_PurchaseOrderDBO dbo = new PUR_PurchaseOrderDBO(ref USEDB);
                //判斷是否有傳入Root Transcation 
                IsRootTranscation = (RootDBT == null) ? true : false;

                #region 啟動交易或指定RootTranscation
                if (IsRootTranscation)
                {
                    //獨立呼叫啟動Transcation
                    Conn = USEDB.CreateConnection();
                    Conn.Open();
                    DBT = Conn.BeginTransaction();
                }
                else
                {
                    DBT = RootDBT;
                }
                #endregion

                dbo.doDelete_PURCHASEORDER_TMP(ParameterList, DBT);

                foreach (DataRow dRow in dt_ALO_IMPORT_TMP.Rows)
                {
                    dbo.doAdd_PURCHASEORDER_TMP(dRow, DBT);
                }

                #region 交易成功
                if (IsRootTranscation)
                {
                    //獨立呼叫Transcation成立
                    DBT.Commit();
                }
                #endregion

                //當資料寫入TMP檔後,做最後檢查
                //1.檢查匯入的贈品有無父層品項
                //2.檢查有無重複的品項/期別/虛擬品號
                //3.檢查主品項與贈品的交貨日期必需一樣,才能匯入
                dbo.doCheckOtherTmp(ParameterList, null);
            }
            catch (Exception ex)
            {
                #region 交易失敗
                if (IsRootTranscation)
                {
                    //獨立呼叫Transcation失敗
                    DBT.Rollback();
                }
                #endregion

                throw ex;
            }
            finally
            {
                #region 判斷是否關閉交易連線
                if (IsRootTranscation)
                {
                    //獨立呼叫Transcation,關閉連線
                    if (Conn.State == ConnectionState.Connecting)
                    {
                        Conn.Close();
                    }
                }
                #endregion
            }
        }
 public DataTable GetTempErrorDataByfind(ArrayList ParameterList)
 {
     try
     {
         DBO.PUR_PurchaseOrderDBO dbo = new PUR_PurchaseOrderDBO(ref USEDB);
         return dbo.GetTempErrorDataByFind1(ParameterList);
     }
     catch (Exception ex)
     {
         throw ex;
     }
 }
        /// <summary>
        /// 基本表單新增BCO
        /// </summary>
        /// <param name="ParameterList">輸入變數</param>
        /// <param name="RootDBT">是否有主交易,無主交易輸入null</param>
        /// <returns>回傳新增之ID</returns>
        public string CreateMasterAndDetail_Gift(ArrayList ParameterList,
                                                 DataTable DetailData,
                                                 DataTable GiftData,
                                                 DbTransaction RootDBT)
        {
            #region
            bool IsRootTranscation = false;
            Int32 PID = 0;
            string[] sID_NO;
            string sTemp = "";
            string sPurchaseNo = "";
            try
            {
                //判斷是否有傳入Root Transcation 
                IsRootTranscation = (RootDBT == null) ? true : false;

                #region 啟動交易或指定RootTranscation

                if (IsRootTranscation)
                {
                    //獨立呼叫啟動Transcation
                    Conn = USEDB.CreateConnection();
                    Conn.Open();
                    DBT = Conn.BeginTransaction();
                }
                else
                {
                    DBT = RootDBT;
                }

                #endregion

                //寫入 Master Table
                sTemp = CreatePurchaseOrder(ParameterList, DBT);
                sID_NO = sTemp.Split(new Char[] { ';' });
                PID = int.Parse(sID_NO[0].ToString());
                sPurchaseNo = sID_NO[1].ToString();

                //將ParameterList內存放主檔ID與PURCHASRE_NO欄位值,換成PID與sPurchaseNo
                ParameterList[5] = sPurchaseNo;
                ParameterList[6] = PID;

                if (PID != 0)
                {
                    #region 新增明細資料與更新 VDS_MKT_PURCARD_MAIN.PUR_NO(雜誌採購卡) 或 VDS_MKT_BPURCARD_MAIN.PUR_NO(圖書採購卡)
                    foreach (DataRow dRow in DetailData.Rows)
                    {
                        CreatePurchaseOrderDetail(PID, ParameterList, dRow, DBT);

                        //更新期別屬性檔(VDS_ITM_PERIOD_PROFILE)中,該品號期別的交貨日期、採購日、採購量與採購單號
                        UpdatePeriodProfile(dRow["ITEM"].ToString().Trim(), dRow["PERIOD"].ToString().Trim(), dRow["PLAN_ACCEPT_DATE"].ToString().Trim(), ParameterList[0].ToString().Trim(),
                                            dRow["PURCHASE_QTY"].ToString().Trim(), sPurchaseNo, ParameterList[4].ToString().Trim(), DBT);

                        //更新圖書採購卡或雜誌採購卡採購單號
                        if (dRow["PERIOD"].ToString().Trim() == "000000") //在圖書裡其period值絕對是000000
                        {
                            Update_B_PURCARD(sPurchaseNo, dRow["ITEM"].ToString().Trim(), ParameterList[4].ToString().Trim(), DBT);
                        }
                        else
                        {
                            Update_PURCARD(sPurchaseNo, dRow["ITEM"].ToString().Trim(), dRow["PERIOD"].ToString().Trim(), ParameterList[4].ToString().Trim(), DBT);
                        }
                    }
                    #endregion

                    #region 新增明細贈品資料
                    if (GiftData != null)
                    {
                        foreach (DataRow gRow in GiftData.Rows)
                        {
                            CreatePurchaseOrderDetail(PID, ParameterList, gRow, DBT);

                            //更新贈品屬性檔(VDS_MKT_GIFT_PROFILE)資料中,該品號期別的交貨日期、採購日、採購量與採購單號
                            UpdateGiftProfile(gRow["ITEM"].ToString().Trim(), gRow["PERIOD"].ToString().Trim(), gRow["VIRTUAL_CODE"].ToString().Trim(),
                                              gRow["PLAN_ACCEPT_DATE"].ToString().Trim(), ParameterList[0].ToString().Trim(),
                                              gRow["PURCHASE_QTY"].ToString().Trim(), sPurchaseNo, ParameterList[4].ToString().Trim(), DBT);
                        }
                    }
                    #endregion


                    #region 交易成功
                    if (IsRootTranscation)
                    {
                        //獨立呼叫Transcation成立
                        DBT.Commit();
                    }
                    #endregion
                    DBO.PUR_PurchaseOrderDBO dbo = new PUR_PurchaseOrderDBO(ref USEDB);
                    sPurchaseNo = dbo.doQueryPurchase_NotByID(PID.ToString());
                }
                else
                {
                    throw new Exception("新增0筆資料!");
                }

                return sPurchaseNo;
            }
            catch (Exception ex)
            {
                #region 交易失敗
                if (IsRootTranscation)
                {
                    //獨立呼叫Transcation失敗
                    DBT.Rollback();
                }
                #endregion

                throw ex;
            }
            finally
            {
                #region 判斷是否關閉交易連線

                if (IsRootTranscation)
                {
                    //獨立呼叫Transcation,關閉連線
                    if (Conn.State == ConnectionState.Connecting)
                    {
                        Conn.Close();
                    }
                }
                #endregion
            }
            #endregion
        }
        /// <summary>
        /// 將資料由 TEMP TABLE 新增至正式 TABLE
        /// </summary>
        /// <param name="ParameterList">變數</param>
        /// <param name="RootDBT">是否有主交易,無主交易輸入null</param>
        /// <returns>回傳結果</returns>
        public int TMP_To_Purchase_Order(ArrayList ParameterList, out string strPURCHASE_NO, DbTransaction RootDBT)
        {
            bool IsRootTranscation = false;
            int iResult = 0;
            try
            {
                PUR_PurchaseOrderDBO dbo = new PUR_PurchaseOrderDBO(ref USEDB);
                //判斷是否有傳入Root Transcation 
                IsRootTranscation = (RootDBT == null) ? true : false;

                #region 啟動交易或指定RootTranscation
                if (IsRootTranscation)
                {
                    //獨立呼叫啟動Transcation
                    Conn = USEDB.CreateConnection();
                    Conn.Open();
                    DBT = Conn.BeginTransaction();
                }
                else
                {
                    DBT = RootDBT;
                }
                #endregion

                //將Temple data 寫入 Master 與 Deail Table                
                iResult = dbo.doTempToPUR_Order(ParameterList, out strPURCHASE_NO, DBT);

                #region 交易成功

                if (IsRootTranscation)
                {
                    //獨立呼叫Transcation成立
                    DBT.Commit();
                }

                #endregion

                return iResult;

            }
            catch (Exception ex)
            {
                #region 交易失敗
                if (IsRootTranscation)
                {
                    //獨立呼叫Transcation失敗
                    DBT.Rollback();
                }
                #endregion
                throw ex;
            }
            finally
            {
                #region 判斷是否關閉交易連線
                if (IsRootTranscation)
                {
                    //獨立呼叫Transcation,關閉連線
                    if (Conn.State == ConnectionState.Connecting)
                    {
                        Conn.Close();
                    }
                }
                #endregion
            }
        }
        /// <summary>
        /// 刪除基本表單時,並同時對Detail資料做刪除動作
        /// </summary>
        /// <param name="sPurNo">採購單號</param>
        /// <param name="UpdateID">刪除人員ID</param>
        /// <returns>回傳影響筆數</returns>
        public void DeteleMain_DetailData(string sPurNo, string UpdateID, DbTransaction RootDBT)
        {
            bool IsRootTranscation = false;

            try
            {
                //判斷是否有傳入Root Transcation 
                IsRootTranscation = (RootDBT == null) ? true : false;

                #region 啟動交易或指定RootTranscation
                if (IsRootTranscation)
                {
                    //獨立呼叫啟動Transcation
                    Conn = USEDB.CreateConnection();
                    Conn.Open();
                    DBT = Conn.BeginTransaction();
                }
                else
                {
                    DBT = RootDBT;
                }
                #endregion

                DBO.PUR_PurchaseOrderDBO dbo = new PUR_PurchaseOrderDBO(ref USEDB);
                dbo.doDeteleMain_DetailData(sPurNo, UpdateID, DBT);

                #region 交易成功
                if (IsRootTranscation)
                {
                    //獨立呼叫Transcation成立
                    DBT.Commit();
                }
                #endregion
            }
            catch (Exception ex)
            {
                #region 交易失敗
                if (IsRootTranscation)
                {
                    //獨立呼叫Transcation失敗
                    DBT.Rollback();
                }
                #endregion

                throw ex;
            }
            finally
            {
                #region 判斷是否關閉交易連線

                if (IsRootTranscation)
                {
                    //獨立呼叫Transcation,關閉連線
                    if (Conn.State == ConnectionState.Connecting)
                    {
                        Conn.Close();
                    }
                }

                #endregion

            }
        }
 public string GetOrderDocumentIDAndCode()
 {
     try
     {
         DBO.PUR_PurchaseOrderDBO dbo = new PUR_PurchaseOrderDBO(ref USEDB);
         return dbo.GetOrderDocumentIDAndCode();
     }
     catch (Exception ex)
     {
         throw ex;
     }
 }
        /// <summary>
        /// 更新贈品屬性檔(VDS_MKT_GIFT_PROFILE)資料中,該品號期別的交貨日期、採購日、採購量與採購單號
        /// </summary>
        /// <param name="sItem">品號</param>
        /// <param name="sPeriod">期別</param>
        /// <param name="sVCode">虛擬品號</param>
        /// <param name="sPA_Date">交貨日期</param>
        /// <param name="sPurDate">採購日期</param>
        /// <param name="sQty">採購數量</param>
        /// <param name="sPurchaseNo">採購單號</param> 
        /// <param name="sUpdater">更新人員帳號</param>      
        /// <param name="RootDBT">是否有主交易,無主交易輸入null</param>
        /// <returns>回傳成功與否</returns>
        public bool UpdateGiftProfile(string sItem, string sPeriod, string sVCode, string sPA_Date, string sPurDate, string sQty, string sPurchaseNo, string sUpdater, DbTransaction RootDBT)
        {
            bool IsRootTranscation = false;
            bool bResult = false;
            try
            {
                //判斷是否有傳入Root Transcation 
                IsRootTranscation = (RootDBT == null) ? true : false;

                #region 啟動交易或指定RootTranscation

                if (IsRootTranscation)
                {
                    //獨立呼叫啟動Transcation
                    Conn = USEDB.CreateConnection();
                    Conn.Open();
                    DBT = Conn.BeginTransaction();
                }
                else
                {
                    DBT = RootDBT;
                }

                #endregion

                DBO.PUR_PurchaseOrderDBO dbo = new PUR_PurchaseOrderDBO(ref USEDB);
                dbo.doUpdateGiftProfile(sItem, sPeriod, sVCode, sPA_Date, sPurDate, sQty, sPurchaseNo, sUpdater, DBT);

                #region 交易成功

                if (IsRootTranscation)
                {
                    //獨立呼叫Transcation成立
                    DBT.Commit();
                }

                #endregion

                bResult = true;
                return bResult;
            }
            catch (Exception ex)
            {
                #region 交易失敗

                if (IsRootTranscation)
                {
                    //獨立呼叫Transcation失敗
                    DBT.Rollback();
                }

                #endregion

                throw ex;
            }
            finally
            {
                #region 判斷是否關閉交易連線

                if (IsRootTranscation)
                {
                    //獨立呼叫Transcation,關閉連線
                    if (Conn.State == ConnectionState.Connecting)
                    {
                        Conn.Close();
                    }
                }

                #endregion

            }
        }
 public DataTable QueryGiftSchema()
 {
     try
     {
         DBO.PUR_PurchaseOrderDBO dbo = new PUR_PurchaseOrderDBO(ref USEDB);
         return dbo.doQueryGiftSchema();
     }
     catch (Exception ex)
     {
         throw ex;
     }
 }
        /// <summary>
        /// 對Detail table 做結案動作
        /// </summary>
        /// <param name="ParMasterList">更新變數</param>
        /// <param name="RootDBT">是否有主交易,無主交易輸入null</param>
        /// <returns>回傳影響筆數</returns>
        public void ClosePurchaseOrderDetail(ArrayList ParDetailList,
                                             DataRow OldDetailRow,
                                             DbTransaction RootDBT
                                            )
        {
            bool IsRootTranscation = false;

            try
            {
                //判斷是否有傳入Root Transcation 
                IsRootTranscation = (RootDBT == null) ? true : false;

                #region 啟動交易或指定RootTranscation
                if (IsRootTranscation)
                {
                    //獨立呼叫啟動Transcation
                    Conn = USEDB.CreateConnection();
                    Conn.Open();
                    DBT = Conn.BeginTransaction();
                }
                else
                {
                    DBT = RootDBT;
                }
                #endregion

                DBO.PUR_PurchaseOrderDBO dbo = new PUR_PurchaseOrderDBO(ref USEDB);
                dbo.doClosePurchaseOrderDetail(ParDetailList, OldDetailRow, DBT);

                //如果明細都結案了則把主檔結案
                dbo.doClosePurchaseOrderDetailM(ParDetailList, OldDetailRow, DBT);

                #region 交易成功
                if (IsRootTranscation)
                {
                    //獨立呼叫Transcation成立
                    DBT.Commit();
                }
                #endregion
            }
            catch (Exception ex)
            {
                #region 交易失敗
                if (IsRootTranscation)
                {
                    //獨立呼叫Transcation失敗
                    DBT.Rollback();
                }
                #endregion

                throw ex;
            }
            finally
            {
                #region 判斷是否關閉交易連線

                if (IsRootTranscation)
                {
                    //獨立呼叫Transcation,關閉連線
                    if (Conn.State == ConnectionState.Connecting)
                    {
                        Conn.Close();
                    }
                }
                #endregion
            }
        }
        /// <summary>
        /// 對Master table 做結案動作
        /// </summary>
        /// <param name="ParMasterList">更新變數</param>
        /// <param name="RootDBT">是否有主交易,無主交易輸入null</param>
        /// <returns>回傳影響筆數</returns>
        public void ClosePurchaseOrder(ArrayList ParMasterList,
                                       DataRow OldMasterRow,
                                       DbTransaction RootDBT
                                       )
        {
            bool IsRootTranscation = false;

            try
            {
                //判斷是否有傳入Root Transcation 
                IsRootTranscation = (RootDBT == null) ? true : false;

                #region 啟動交易或指定RootTranscation
                if (IsRootTranscation)
                {
                    //獨立呼叫啟動Transcation
                    Conn = USEDB.CreateConnection();
                    Conn.Open();
                    DBT = Conn.BeginTransaction();
                }
                else
                {
                    DBT = RootDBT;
                }
                #endregion

                DBO.PUR_PurchaseOrderDBO dbo = new PUR_PurchaseOrderDBO(ref USEDB);
                dbo.doClosePurchaseOrder(ParMasterList, OldMasterRow, DBT);

                ArrayList Para = new ArrayList();
                Para.Clear();
                Para.Add(OldMasterRow["PURCHASE_NO"].ToString().Trim());
                Para.Add("M");
                Para.Add(ParMasterList[0].ToString());
                dbo.doCloseCaseDetailByPurNo(Para, DBT);

                #region 交易成功
                if (IsRootTranscation)
                {
                    //獨立呼叫Transcation成立
                    DBT.Commit();
                }
                #endregion
            }
            catch (Exception ex)
            {
                #region 交易失敗
                if (IsRootTranscation)
                {
                    //獨立呼叫Transcation失敗
                    DBT.Rollback();
                }
                #endregion

                throw ex;
            }
            finally
            {
                #region 判斷是否關閉交易連線

                if (IsRootTranscation)
                {
                    //獨立呼叫Transcation,關閉連線
                    if (Conn.State == ConnectionState.Connecting)
                    {
                        Conn.Close();
                    }
                }

                #endregion

            }
        }
        /// <summary>
        /// 取Temp table schema
        /// </summary>
        /// <returns>回傳table schema</returns>
        public DataTable GetTempTableSchema()
        {
            DBO.PUR_PurchaseOrderDBO dbo = new PUR_PurchaseOrderDBO(ref USEDB);

            DataTable Dt;

            try
            {
                Dt = dbo.doQueryTempTableSchema();
                return Dt;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
 public DataTable QueryPurchaseOrderByFind_1(ArrayList ParameterList)
 {
     try
     {
         DBO.PUR_PurchaseOrderDBO dbo = new PUR_PurchaseOrderDBO(ref USEDB);
         return dbo.doQueryByFind_1(ParameterList);
     }
     catch (Exception ex)
     {
         throw ex;
     }
 }
        /// <summary>
        /// 新增明細檔BCO
        /// </summary>
        /// <param name="DetailData">輸入變數</param>
        /// <param name="RootDBT">是否有主交易,無主交易輸入null</param>
        /// <returns>回傳異動筆數</returns>
        public int CreatePurchaseOrderDetail(Int32 PID, ArrayList ParameterList, DataRow dRow, DbTransaction RootDBT)
        {
            bool IsRootTranscation = false;
            Int32 iResult = 0;
            try
            {
                //判斷是否有傳入Root Transcation 
                IsRootTranscation = (RootDBT == null) ? true : false;

                #region 啟動交易或指定RootTranscation
                if (IsRootTranscation)
                {
                    //獨立呼叫啟動Transcation
                    Conn = USEDB.CreateConnection();
                    Conn.Open();
                    DBT = Conn.BeginTransaction();
                }
                else
                { DBT = RootDBT; }
                #endregion

                DBO.PUR_PurchaseOrderDBO dbo = new PUR_PurchaseOrderDBO(ref USEDB);
                iResult = dbo.doCreateDetail(PID, DBT, dRow, ParameterList);

                #region 交易成功

                if (IsRootTranscation)
                {
                    //獨立呼叫Transcation成立
                    DBT.Commit();
                }

                #endregion

                return iResult;
            }
            catch (Exception ex)
            {
                #region 交易失敗

                if (IsRootTranscation)
                {
                    //獨立呼叫Transcation失敗
                    DBT.Rollback();
                }

                #endregion

                throw ex;
            }
            finally
            {
                #region 判斷是否關閉交易連線

                if (IsRootTranscation)
                {
                    //獨立呼叫Transcation,關閉連線
                    if (Conn.State == ConnectionState.Connecting)
                    {
                        Conn.Close();
                    }
                }

                #endregion

            }
        }
 public DataTable QueryPrintPurchaseOrderDetail(ArrayList ParameterList)
 {
     try
     {
         DBO.PUR_PurchaseOrderDBO dbo = new PUR_PurchaseOrderDBO(ref USEDB);
         return dbo.PrintPurchaseOrderDetail(ParameterList);
     }
     catch (Exception ex)
     {
         throw ex;
     }
 }
        public DataTable QuerySwitch(QueryType QT,
                                     ArrayList ParameterList
                                     )
        {
            DBO.PUR_PurchaseOrderDBO dbo = new PUR_PurchaseOrderDBO(ref USEDB);
            DataTable Dt;

            try
            {
                switch (QT)
                {
                    //case QueryType.ALL:
                    //    Dt = dbo.doQueryAll();
                    //    break;
                    //case QueryType.CODE:
                    //    Dt = dbo.doQueryByCode(ParameterList);
                    //    break;
                    case QueryType.PK:
                        Dt = dbo.GetMasterByPK(ParameterList);
                        break;
                    case QueryType.Where1:
                        Dt = dbo.GetMainByWhere1(ParameterList);
                        break;
                    default:
                        Dt = new DataTable();
                        break;
                }

                return Dt;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        /// <summary>
        /// 測試SP交易失敗
        /// </summary>
        /// <param name="ParameterList">變數</param>
        /// <param name="RootDBT">是否有主交易,無主交易輸入null</param>
        public void TestTranscation(ArrayList ParameterList1,
                                    ArrayList ParameterList2,
                                    ArrayList ParameterList3,
                                    DbTransaction RootDBT
                                    )
        {
            bool IsRootTranscation = false;

            try
            {
                DBO.PUR_PurchaseOrderDBO dbo = new PUR_PurchaseOrderDBO(ref USEDB);

                //判斷是否有傳入Root Transcation 
                IsRootTranscation = (RootDBT == null) ? true : false;

                #region 啟動交易或指定RootTranscation

                if (IsRootTranscation)
                {
                    //獨立呼叫啟動Transcation
                    Conn = USEDB.CreateConnection();
                    Conn.Open();
                    DBT = Conn.BeginTransaction();
                }
                else
                {
                    DBT = RootDBT;
                }

                #endregion

                dbo.doCreateMaster(ParameterList1, DBT);

                //dbo.doUpdate(ParameterList2, DBT);

                dbo.doDelete(ParameterList3, DBT);

                throw new Exception("交易失敗");

                #region 交易成功

                if (IsRootTranscation)
                {
                    //獨立呼叫Transcation成立
                    DBT.Commit();
                }

                #endregion

            }
            catch (Exception ex)
            {
                #region 交易失敗

                if (IsRootTranscation)
                {
                    //獨立呼叫Transcation失敗
                    DBT.Rollback();
                }

                #endregion

                throw ex;
            }
            finally
            {
                #region 判斷是否關閉交易連線

                if (IsRootTranscation)
                {
                    //獨立呼叫Transcation,關閉連線
                    if (Conn.State == ConnectionState.Connecting)
                    {
                        Conn.Close();
                    }
                }

                #endregion
            }

        }
        /// <summary>
        ///1.目的:將暫存檔中的待處理資料,匯入正式表單

        ///2.傳入參數:@處理檔名、@使用者
        ///  回傳參數:@處理筆數、@正確筆數、@錯誤筆數、@錯誤訊息

        ///3.處理表格:VDS_PUR_PURCHASEORDER_TMP(T)、VDS_PUR_PURCHASE_MAIN(M)、VDS_PUR_PURCHASE_ITEM(D)

        ///4.將暫存檔中的[狀態]欄位調整為2:TMP TO DB

        ///5.匯入處理完成後,回傳匯入處理結果:處理總筆數、成功筆數、失敗筆數、@錯誤訊息(成功時=null)
        /// </summary>
        public ArrayList TmpToDB(string s_LoginUser,string MAIL_ADDR, string ConnectionDB)
        {
            #region
            ArrayList arl_Return = new ArrayList();

            try
            {
                string strPURCHASE_NO = string.Empty;
                ParameterList.Clear();
                ParameterList.Add(s_LoginUser);
                ParameterList.Add(MAIL_ADDR);
                int iResult = TMP_To_Purchase_Order(ParameterList, out strPURCHASE_NO, null);

                PUR_PurchaseOrderDBO dbo = new PUR_PurchaseOrderDBO(ref USEDB);
                ParameterList.Clear();
                ParameterList.Add(strPURCHASE_NO);
                DataTable dtPur = dbo.doQueryPurData(ParameterList); ;

                MaintainPurchaseOrder po = new MaintainPurchaseOrder(ConnectionDB);
                #region 更新期別屬性檔&圖書採購卡或雜誌採購卡採購單號
                DataRow[] DetailRows = dtPur.Select("ITEM=VIRTUAL_CODE");
                foreach (DataRow dRow in DetailRows)
                {
                    //更新期別屬性檔(VDS_ITM_PERIOD_PROFILE)中,該品號期別的交貨日期、採購日、採購量與採購單號
                    po.UpdatePeriodProfile(dRow["ITEM"].ToString().Trim(),
                                           dRow["PERIOD"].ToString().Trim(),
                                           dRow["PLAN_ACCEPT_DATE"].ToString().Trim(),
                                           dRow["PURCHSE_DATE"].ToString().Trim(),
                                           dRow["PURCHASE_QTY"].ToString().Trim(),
                                           dRow["PURCHASE_NO"].ToString().Trim(),
                                           s_LoginUser,
                                           null);

                    //更新圖書採購卡或雜誌採購卡採購單號
                    if (dRow["PERIOD"].ToString().Trim() == "000000") //在圖書裡其period值絕對是000000
                    {
                        po.Update_B_PURCARD(dRow["PURCHASE_NO"].ToString().Trim(),
                                            dRow["ITEM"].ToString().Trim(),
                                            s_LoginUser,
                                            null);
                    }
                    else
                    {
                        po.Update_PURCARD(dRow["PURCHASE_NO"].ToString().Trim(),
                                          dRow["ITEM"].ToString().Trim(),
                                          dRow["PERIOD"].ToString().Trim(),
                                          s_LoginUser,
                                          null);
                    }
                }
                #endregion

                #region 更新贈品屬性檔
                DataRow[] GiftRows = dtPur.Select("ITEM<>VIRTUAL_CODE");
                foreach (DataRow gRow in GiftRows)
                {
                    //更新贈品屬性檔(VDS_MKT_GIFT_PROFILE)資料中,該品號期別的交貨日期、採購日、採購量與採購單號
                    po.UpdateGiftProfile(gRow["ITEM"].ToString().Trim(),
                                         gRow["PERIOD"].ToString().Trim(),
                                         gRow["VIRTUAL_CODE"].ToString().Trim(),
                                         gRow["PLAN_ACCEPT_DATE"].ToString().Trim(),
                                         gRow["PURCHSE_DATE"].ToString().Trim(),
                                         gRow["PURCHASE_QTY"].ToString().Trim(),
                                         gRow["PURCHASE_NO"].ToString().Trim(),
                                         s_LoginUser,
                                         null);
                }
                #endregion


                if (iResult > 0)
                {
                    arl_Return.Add("TEMPTODB 正確");
                    arl_Return.Add(iResult);
                    arl_Return.Add(iResult);
                    arl_Return.Add(0);
                }
            }
            catch (Exception ex)
            {
                arl_Return.Add("程式錯誤");
                arl_Return.Add(ex.Message);
            }
            finally
            { }

            return arl_Return;
            #endregion
        }
 public DataTable GetItemGiftByPurchase_No(ArrayList ParameterList)
 {
     try
     {
         DBO.PUR_PurchaseOrderDBO dbo = new PUR_PurchaseOrderDBO(ref USEDB);
         return dbo.GetItemGiftByPUR_No(ParameterList);
     }
     catch (Exception ex)
     {
         throw ex;
     }
 }
 public int Get_AcceptQty(ArrayList ParameterList)
 {
     try
     {
         DBO.PUR_PurchaseOrderDBO dbo = new PUR_PurchaseOrderDBO(ref USEDB);
         return dbo.doGet_AcceptQty(ParameterList);
     }
     catch (Exception ex)
     {
         throw ex;
     }
 }
        //修改採購主檔狀態為結案
        public bool UpdatePUR_MasterClose(ArrayList ParameterList, DbTransaction RootDBT)
        {
            bool IsRootTranscation = false;
            bool bResult = false;
            try
            {
                //判斷是否有傳入Root Transcation 
                IsRootTranscation = (RootDBT == null) ? true : false;

                #region 啟動交易或指定RootTranscation

                if (IsRootTranscation)
                {
                    //獨立呼叫啟動Transcation
                    Conn = USEDB.CreateConnection();
                    Conn.Open();
                    DBT = Conn.BeginTransaction();
                }
                else
                {
                    DBT = RootDBT;
                }

                #endregion

                DBO.PUR_PurchaseOrderDBO dbo = new PUR_PurchaseOrderDBO(ref USEDB);
                dbo.doUpdateMasterClose(ParameterList, DBT);

                #region 交易成功

                if (IsRootTranscation)
                {
                    //獨立呼叫Transcation成立
                    DBT.Commit();
                }

                #endregion

                bResult = true;
                return bResult;
            }
            catch (Exception ex)
            {
                #region 交易失敗

                if (IsRootTranscation)
                {
                    //獨立呼叫Transcation失敗
                    DBT.Rollback();
                }

                #endregion

                throw ex;
            }
            finally
            {
                #region 判斷是否關閉交易連線

                if (IsRootTranscation)
                {
                    //獨立呼叫Transcation,關閉連線
                    if (Conn.State == ConnectionState.Connecting)
                    {
                        Conn.Close();
                    }
                }

                #endregion

            }
        }
        /// <summary>
        ///1.目的:將上傳檔案內容,存入暫存檔

        ///2.傳入參數:@處理檔名、@使用者
        ///  回傳參數:@處理筆數、@正確筆數、@錯誤筆數、@錯誤訊息

        ///3.處理表格:VDS_ALO_STORESPEC_TMP(T)

        ///4.處理邏輯:

        ///  4.1) 先清除前一次,同一使用者執行的匯入暫存資訊與錯誤資訊。
        ///       相關Table:VDS_ALO_STORESPEC_TM
        ///  4.2) 讀取匯入檔案到暫存資料集。
        ///  4.3) 檢查匯入檔案格式內容是否正確,如有任何錯誤,則停止上傳流程,並回傳錯誤訊息。
        ///       『XX檔案,檔案內容錯誤:@錯誤說明』 (格式請參考資料庫Table Shcema)
        ///         * 日期:檢查日期格式。
        ///         * 數字:檢查內容是否為數字。
        ///         * 文字:檢查長度是否溢位。
        ///         * 檔案欄位數是否不足。
        ///         * 檢查必填欄位是否有值:通路、店號、品號、數量、原因代碼、設定類別
        ///         * 工作表匯入內容有任一筆錯,皆視為錯誤,整批放棄。
        ///         * 匯入表格細節說明請參考:Excel文件
        ///  4.4) 格式檢查正確無誤後
        ///       a) 暫存檔中的[狀態]欄位調整為1:FILE TO TMP
        ///       b) 呼叫 [CheckData] ,檢查資料內容邏輯正確性 
        ///  4.5) 無論CheckData()檢查結果是否為True,
        ///       皆將上傳檔案內容新增到資料庫Tmp Table:,
        ///       並記錄錯誤原因、匯入者、匯入日期、處理檔案名稱=上傳檔名。

        ///5. 回傳處理結果(@處理筆數、@正確筆數、@錯誤筆數、@錯誤訊息(無錯誤時=null) )   
        /// </summary>
        public ArrayList FileToTmp(DataSet ds_Excel, DateTime d_CreateDate, string s_LoginUser, string s_VendorID, string s_DBConnString, string s_AP_FileName)
        //public ArrayList FileToTmp(DataSet ds_Excel, DateTime d_CreateDate)
        {
            #region
            int i_newTable_Count = 0;
            ArrayList arl_Return = new ArrayList();
            int i_FileToTemp_Total_count = 0;
            int ChkCount = 0;
            string strErrMsg = "";
            Int32 iErrCount = 0;
            Double doubleVal;
            ArrayList pList = new ArrayList();

            try
            {
                ParameterList.Clear();
                DataTable dt_PUR_IMPORT_TMP = GetTempTableSchema();
                PUR_PurchaseOrderDBO PUR_POSOURCE_NO_TMP = new PUR_PurchaseOrderDBO(ref USEDB);
                DBO.PUR_PurchaseOrderDBO dbo = new PUR_PurchaseOrderDBO(ref USEDB);

                foreach (System.Data.DataRow dRow in ds_Excel.Tables[0].Rows)
                {
                    iErrCount = 0;
                    strErrMsg = "";
                    //檢查資料邏輯正確性

                    //將資料寫入 TEMP TABLE
                    DataRow dRow_Temp = dt_PUR_IMPORT_TMP.NewRow();
                    dRow_Temp["CREATEDATE"] = DateTime.Parse(d_CreateDate.ToString("yyyy/MM/dd"));
                    dRow_Temp["CREATEUID"] = s_LoginUser;
                    dRow_Temp["ID"] = Convert.ToInt64(d_CreateDate.ToString("yyyyMMddHHmmss") + (i_newTable_Count + 1).ToString());
                    dRow_Temp["UPDATEDATE"] = DateTime.Parse(d_CreateDate.ToString("yyyy/MM/dd"));
                    dRow_Temp["UPDATEUID"] = s_LoginUser;
                    dRow_Temp["VENDOR"] = s_VendorID;
                    dRow_Temp["DATASOURCE"] = s_AP_FileName;
                    dRow_Temp["STATUS"] = 1;//File To TMP                    

                    string sItem = dRow[1].ToString().Trim();     //高見品號
                    string sGift = dRow[2].ToString().Trim();    //贈品品號
                    string sPeriod = dRow[3].ToString().Trim();   //期別
                    string sItemName = dRow[4].ToString().Trim(); //品名
                    string sQty = dRow[5].ToString().Trim();      //採購數量
                    string sDate = dRow[6].ToString().Trim();     //交貨日期
                    string strMsg = dRow[7].ToString().Trim();    //商品訊息

                    if ((sItem != "") || (sPeriod != "") || (sItemName != "") || (sQty != "") || (sDate != "") || (strMsg != ""))
                    {
                        // 驗證新增資料欄位是否為必填。
                        //品號                    
                        if (sItem == string.Empty)
                        {
                            strErrMsg += "品號欄位為必填,";
                        }
                        else if (CheckLength(sItem, 6, "品號", strErrMsg, iErrCount, out  strErrMsg, out  iErrCount) == false)
                        {
                            //過長
                            sItem = SubStr(sItem, 0, 6);
                        }
                        else
                        {
                            pList.Clear();
                            pList.Add(sItem);
                            DataTable dt = dbo.doQueryItem(pList);

                            if (dt.Rows.Count > 0)
                            {
                                if (s_VendorID.Trim() != dt.Rows[0]["MANUFACTURE"].ToString().Trim())
                                {
                                    strErrMsg += "該品號不屬於此供應商,";
                                }
                                else
                                {
                                    string strNowDate = DateTime.Now.ToString("yyyy/MM/dd");
                                    if (string.Compare(dt.Rows[0]["mdc_end_date"].ToString(), strNowDate) < 0)
                                    {
                                        strErrMsg += "該品號已過期,";
                                    }
                                }

                            }
                            else
                            {
                                strErrMsg += "該品號不存在商品主檔內,";
                            }
                        }
                        dRow_Temp["ITEM"] = sItem;

                        //贈品
                        if (sGift == string.Empty)
                        {
                            strErrMsg += "贈品品號為必填,";
                        }
                        else if (CheckLength(sGift, 10, "贈品品號", strErrMsg, iErrCount, out  strErrMsg, out  iErrCount) == false)
                        {
                            //過長
                            sGift = SubStr(sGift, 0, 10);
                        }
                        else if (sGift.Length < sItem.Length)
                        {
                            strErrMsg += "贈品品號前六碼需與高見品號一樣,";
                        }
                        else
                        {
                            if (sGift.Length == sItem.Length)
                            {
                                if (sGift != sItem)
                                {
                                    strErrMsg += "贈品品號前六碼需與高見品號一樣,";
                                }
                            }
                            else
                            {
                                if (sGift.Substring(0, 6) != sItem)
                                {
                                    strErrMsg += "贈品品號前六碼需與高見品號一樣,";
                                }
                                else
                                {
                                    PIC.VDS2G.BSM.MKT.MKT_GiftDBO dboGift = new PIC.VDS2G.BSM.MKT.MKT_GiftDBO(ref USEDB);
                                    pList.Clear();
                                    pList.Add(sItem);
                                    pList.Add(sPeriod);
                                    pList.Add(-1);
                                    DataTable dtGift = dboGift.doQueryGift(pList);
                                    if (dtGift.Select("ITEM='" + sItem + "' And PERIOD='" + sPeriod + "' And VIRTUAL_CODE='" + sGift + "'").Length == 0)
                                    {
                                        strErrMsg += "找不到對應的贈品品號,";
                                    }
                                }
                            }
                        }
                        dRow_Temp["VIRTUAL_CODE"] = sGift;

                        //期別
                        ChkCount = 0;
                        if (sPeriod == string.Empty)
                        {
                            strErrMsg += "期別欄位為必填,";
                        }
                        else if (CheckLength(sPeriod, 6, "期別", strErrMsg, iErrCount, out  strErrMsg, out  iErrCount) == false)
                        {
                            //過長
                            sPeriod = SubStr(sPeriod, 0, 6);
                        }
                        else
                        {
                            pList.Clear();
                            pList.Add(sItem);
                            pList.Add(sPeriod);
                            ChkCount = dbo.doCheck_Exist_Period(pList);
                            pList.Clear();

                            if (ChkCount == 0)
                            {
                                strErrMsg += "期別不存在期別主檔內,";
                            }
                        }
                        dRow_Temp["PERIOD"] = sPeriod;

                        //檢查品名                    
                        if (CheckLength(sItemName, 50, "品名", strErrMsg, iErrCount, out  strErrMsg, out  iErrCount) == false)
                        {
                            //過長
                            sItemName = SubStr(sItemName, 0, 50);
                        }
                        dRow_Temp["ITEM_NAME"] = sItemName;

                        //採購數                             
                        if (sQty == string.Empty)
                        {
                            strErrMsg += "採購數欄位為必填,";
                            dRow_Temp["PURCHASE_QTY"] = DBNull.Value;
                        }
                        else if (double.TryParse(sQty, out doubleVal) == false)
                        {
                            strErrMsg += "採購數欄位必須為數值型態,";
                            dRow_Temp["PURCHASE_QTY"] = DBNull.Value;
                        }
                        else if (CheckLength(sQty, 6, "採購數", strErrMsg, iErrCount, out  strErrMsg, out  iErrCount) == false)
                        {
                            //過長
                            sQty = SubStr(sQty, 0, 6);
                            dRow_Temp["PURCHASE_QTY"] = sQty;
                        }
                        else if (int.Parse(sQty) <= 0)
                        {
                            if (sGift != sItem && (int.Parse(sQty) == 0))
                            {
                                //贈品可以輸入零
                            }
                            else
                            {
                                strErrMsg += "採購數欄位必須大於0,";
                            }
                            dRow_Temp["PURCHASE_QTY"] = sQty;
                        }
                        else
                        {
                            dRow_Temp["PURCHASE_QTY"] = sQty;
                        }

                        //交貨日                    
                        if (sDate == string.Empty || sDate == "")
                        {
                            strErrMsg += "交貨日欄位為必填,";
                            dRow_Temp["PLAN_ACCEPT_DATE"] = DBNull.Value;
                        }
                        else if (double.TryParse(sDate, out doubleVal) == false)//(DateTime.TryParse(dRow[5].ToString().Trim(), out dateVal) == false)
                        {   //因日期格式設定為yyyyMMdd,故由此可知皆是數值,若輸入格式為yyyy-MM-dd or YYYY/MM/DD等,則代表格式輸入錯誤;
                            //或者輸入非日期值時,則代表型輸入錯。
                            //在這裡不使用 DateTime.TryParse 原因是,user的格式設定為yyyyMMdd,而TryParse對此格式會斷讀成False
                            strErrMsg += "交貨日欄位必須為日期型態或日期格式錯誤,";
                            dRow_Temp["PLAN_ACCEPT_DATE"] = DBNull.Value;
                        }
                        else
                        {
                            string sDateTmp = sDate.Insert(6, "/");
                            sDateTmp = sDateTmp.Insert(4, "/");

                            //驗證日期格式 YYYYMMDD, 範圍00010101~99991231
                            Match m = Regex.Match(sDate, "(^0000|0001|9999|[0-9]{4})+(0[1-9]|1[0-2])+(0[1-9]|[12][0-9]|3[01])$");
                            if (sDate.Substring(4, 2) == "00" || sDate.Substring(6, 2) == "00")
                            {
                                strErrMsg += "交貨日欄位資料有誤,";
                                dRow_Temp["PLAN_ACCEPT_DATE"] = DBNull.Value;
                            }
                            else if (m.Success == false)
                            {
                                strErrMsg += "交貨日欄位格式不符,";
                                dRow_Temp["PLAN_ACCEPT_DATE"] = DBNull.Value;
                            }
                            else if (DateTime.Parse(sDateTmp) < DateTime.Today)
                            {
                                strErrMsg += "交貨日欄位必須大於等於系統日期,";
                                dRow_Temp["PLAN_ACCEPT_DATE"] = sDate;
                            }
                            else
                            {
                                dRow_Temp["PLAN_ACCEPT_DATE"] = sDate;
                            }
                        }


                        //商品訊息                    
                        if (CheckLength(strMsg, 60, "商品訊息", strErrMsg, iErrCount, out  strErrMsg, out  iErrCount) == false)
                        {
                            //過長
                            strMsg = SubStr(strMsg, 0, 60);
                        }
                        dRow_Temp["MSG"] = strMsg;


                        if (strErrMsg.Trim() == string.Empty)
                        {
                            dRow_Temp["ERROR_MEMO"] = System.DBNull.Value;
                        }
                        else
                        {
                            dRow_Temp["ERROR_MEMO"] = strErrMsg;
                            iErrCount++;
                        }

                        if (iErrCount != 0)
                        {
                            dRow_Temp["DATATYPE"] = "2"; //錯誤資料                        
                        }
                        else
                        {
                            dRow_Temp["DATATYPE"] = "1"; //正常資料
                        }

                        dt_PUR_IMPORT_TMP.Rows.Add(dRow_Temp);
                        i_newTable_Count += 1;

                        i_FileToTemp_Total_count += 1;
                    }
                }

                #region 先清除前一次,同一使用者執行的匯入暫存資訊與錯誤資訊,並將 Excel 資料匯入 TEMP TABLE

                ParameterList.Clear();
                ParameterList.Add(s_LoginUser);

                DELETE_AND_INSERT_TEMP_TABLE(ParameterList, null, dt_PUR_IMPORT_TMP);
                #endregion

                int i_FileToTemp_Right_count = 0;
                int i_FileToTemp_Wrong_count = 0;

                DataTable dtCount = dbo.doQueryTmpCount(ParameterList);

                for (int i = 0; i < dtCount.Rows.Count; i++)
                {
                    if (dtCount.Rows[i]["DATATYPE"].ToString() == "1")
                        i_FileToTemp_Right_count = int.Parse(dtCount.Rows[i]["COUNTS"].ToString());

                    if (dtCount.Rows[i]["DATATYPE"].ToString() == "2")
                        i_FileToTemp_Wrong_count = int.Parse(dtCount.Rows[i]["COUNTS"].ToString());
                }

                if (i_FileToTemp_Wrong_count > 0)
                {
                    arl_Return.Add("FALSE");
                }
                else
                {
                    arl_Return.Add("TRUE");
                }

                arl_Return.Add(i_FileToTemp_Total_count);
                arl_Return.Add(i_FileToTemp_Right_count);
                arl_Return.Add(i_FileToTemp_Wrong_count);
            }
            catch (Exception ex)
            {
                arl_Return.Add("FALSE");
                arl_Return.Add(ex.Message);
            }

            return arl_Return;
            #endregion
        }