/// <summary>
 /// 目的:查詢上傳後的成功筆數
 /// Table:VDS_VGR_08_TMP
 /// 條件:V_CREATEUID
 /// </summary>
 public void QueryImportStat(string V_IOTYPE, string V_CREATEUID, out int N_TMP_CNT, out int N_TAB_CNT)
 {
     try
     {
         DBO.VDS_VGR08_DBO dbo = new VDS_VGR08_DBO(ref USEDB);
         dbo.doQueryImportStat(V_IOTYPE, V_CREATEUID, out N_TMP_CNT, out N_TAB_CNT);
     }
     catch (Exception ex)
     {
         throw ex;
     }
 }
 /// <summary>
 /// 目的:查詢錯誤訊息資料
 /// Table:VDS_VGR_08_LOG
 /// 條件:[資料型態]=2:錯誤資料、[建立人員]=
 /// </summary>
 public DataTable QueryOKByFind(string V_IOTYPE, string V_CREATEUID, DateTime D_CREATEDATE_S, DateTime D_CREATEDATE_E, Int32 N_ROWNUM)
 {
     try
     {
         DBO.VDS_VGR08_DBO dbo = new VDS_VGR08_DBO(ref USEDB);
         return dbo.doQueryOK(V_IOTYPE, V_CREATEUID, D_CREATEDATE_S, D_CREATEDATE_E, N_ROWNUM);
     }
     catch (Exception ex)
     {
         throw ex;
     }
 }
		/// <summary>
		/// 目的:將上傳檔案內容,存入暫存檔
		/// 
		/// 1.先清除前一次,同一使用者執行的匯入暫存資訊與錯誤資訊。
		///    相關Table:VDS_VGR_08_TMP(匯入暫存檔)
		/// 2.讀取匯入檔案到暫存DataSet。
		/// 3.檢查匯入檔案格式內容是否正確,如有任何錯誤,則停止上傳流程,並回傳錯誤訊息。
		///   『XX檔案,檔案內容錯誤:@錯誤說明』 (格式請參考資料庫Table Shcema)
		///       * 日期:檢查日期格式。
		///       * 數字:檢查內容是否為數字。
		///       * 文字:檢查長度是否溢位。
		///       * 檔案欄位數是否不足。
		///       * 兩個工作表匯入內容有任一筆錯,皆視為錯誤,整批放棄。
		///       * 匯入表格細節說明請參考:WEB UI SPEC 文件
		/// 4. 格式檢查正確無誤後
		///    a) 暫存檔中的[狀態]欄位調整為1:FILE TO TMP
		///    b) 呼叫 [CheckData] ,檢查資料內容邏輯正確性
		/// 5. 無論CheckData()檢查結果是否為True,
		///    皆將上傳檔案內容新增到資料庫Tmp Table:,
		///    並記錄錯誤原因、匯入者、匯入日期、處理檔案名稱=上傳檔名。
		///    c)上述匯入需一併Commit,處理期間有任何錯誤,皆視為異常,整批Rollback,並回傳錯誤訊息。
		/// 6. 上傳流程完成,回傳處理筆數訊息:上傳總筆數、成功筆數、失敗筆數。
		/// </summary>
        public string FileToTmp(string V_IOTYPE, DataTable dt, DbTransaction RootDBT, string V_DATA_SOURCE, string V_CREATEUID)
        {
            bool IsRootTranscation = false;

            try
            {
                DBO.VDS_VGR08_DBO dbo = new VDS_VGR08_DBO(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

                #region 清空VDS_VGR_08_TMP

                dbo.doDeleteTmp(V_CREATEUID, DBT);

                #endregion

                #region FileToTmp
                ArrayList ParameterList = new ArrayList();
                string V_RESULT = "1";
                string V_MSG = "";
                string V_TMPTODB = "1";

                if (dt != null)
                {
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {

                        DateTime D_BUS_DATE;
                        DateTime D_SIGN_DATE;
                        string   V_PO_SOURCE_NO="";
                        string   V_STORE="";
                        string   V_ITEM;
                        string   V_PERIOD;
                        int      N_QTY;
                        int      N;
                        string   V_ERR_MEMO = "";

                        if (V_IOTYPE == "1")//廠退單
                        {
                            if (!(DateTime.TryParse(dt.Rows[i]["廠退日期"].ToString().Trim(), out D_BUS_DATE)))
                            {
                                V_ERR_MEMO = "日期格式錯誤;";
                            }

                            DateTime.TryParse(dt.Rows[i]["廠退日期"].ToString().Trim(), out D_SIGN_DATE);

                            if (dt.Rows[i]["品號"].ToString().Trim().Length != 6)
                            {
                                V_ERR_MEMO += "品號長度不正確;";
                                V_ITEM = "";
                            }
                            else if (!(int.TryParse(dt.Rows[i]["品號"].ToString().Trim(), out N)))
                            {
                                V_ERR_MEMO += "品號格式不正確;";
                                V_ITEM = "";
                            }
                            else
                            {
                                V_ITEM = dt.Rows[i]["品號"].ToString().Trim();
                            }


                            if (dt.Rows[i]["期別"].ToString().Trim().Length != 6)
                            {
                                V_ERR_MEMO += "期別長度不正確;";
                                V_PERIOD = "";
                            }
                            else if (!(int.TryParse(dt.Rows[i]["期別"].ToString().Trim(), out N)))
                            {
                                V_ERR_MEMO += "期別格式不正確;";
                                V_PERIOD = "";
                            }
                            else
                            {
                                V_PERIOD = dt.Rows[i]["期別"].ToString().Trim();
                            }

                            if (!(int.TryParse(dt.Rows[i]["數量"].ToString().Trim(), out N_QTY)))
                            {
                                V_ERR_MEMO += "數量格式不正確;";
                                N_QTY = 0;
                            }


                            if (V_ERR_MEMO == "")
                            {
                                DataRow[] drDetlArrs = dt.Select(string.Format("廠退日期 ='{0}' and 品號='{1}' and 期別 = '{2}'",
                                                                            dt.Rows[i]["廠退日期"],
                                                                            dt.Rows[i]["品號"],
                                                                            dt.Rows[i]["期別"]));
                                if (drDetlArrs.Length > 1)
                                {
                                    V_ERR_MEMO += "有重複資料;";
                                }
                            }

                        }
                        else //門退單 門進單
                        {
                            if (!(DateTime.TryParse(dt.Rows[i]["入帳日"].ToString().Trim(), out D_BUS_DATE)))
                            {
                                V_ERR_MEMO = "入帳日期格式錯誤;";
                            }

                            if (!(DateTime.TryParse(dt.Rows[i]["簽收日"].ToString().Trim(), out D_SIGN_DATE)))
                            {
                                V_ERR_MEMO = "簽收日期格式錯誤;";
                            }


                            if (dt.Rows[i]["品號"].ToString().Trim().Length != 6)
                            {
                                V_ERR_MEMO += "品號長度不正確;";
                                V_ITEM = "";
                            }
                            else if (!(int.TryParse(dt.Rows[i]["品號"].ToString().Trim(), out N)))
                            {
                                V_ERR_MEMO += "品號格式不正確;";
                                V_ITEM = "";
                            }
                            else
                            {
                                V_ITEM = dt.Rows[i]["品號"].ToString().Trim();
                            }


                            if (dt.Rows[i]["期別"].ToString().Trim().Length != 6)
                            {
                                V_ERR_MEMO += "期別長度不正確;";
                                V_PERIOD = "";
                            }
                            else if (!(int.TryParse(dt.Rows[i]["期別"].ToString().Trim(), out N)))
                            {
                                V_ERR_MEMO += "期別格式不正確;";
                                V_PERIOD = "";
                            }
                            else
                            {
                                V_PERIOD = dt.Rows[i]["期別"].ToString().Trim();
                            }

                            Regex regIsWord = new Regex("^[A-Za-z0-9]+$");


                            if (dt.Rows[i]["店號"].ToString().Trim().Length > 6)
                            {
                                V_ERR_MEMO += "店號長度不正確;";
                                V_STORE = "";
                            }
                            else if (!regIsWord.IsMatch(dt.Rows[i]["店號"].ToString().Trim()))
                            {
                                V_ERR_MEMO += "店號格式不正確;";
                                V_STORE = "";
                            }
                            else
                            {
                                V_STORE = dt.Rows[i]["店號"].ToString().Trim();
                            }

                            if (!(int.TryParse(dt.Rows[i]["數量"].ToString().Trim(), out N_QTY)))
                            {
                                V_ERR_MEMO += "數量格式不正確;";
                                N_QTY = 0;
                            }

                            if (dt.Rows[i]["通路單號"].ToString().Trim() != "")
                            {

                                if (dt.Rows[i]["通路單號"].ToString().Trim().Length >= 20)
                                {
                                    V_ERR_MEMO += "通路單號長度過長;";
                                    V_PO_SOURCE_NO = "";
                                }
                                else if (!regIsWord.IsMatch(dt.Rows[i]["通路單號"].ToString().Trim()))
                                {
                                    V_ERR_MEMO += "通路單號格式錯誤;";
                                    V_PO_SOURCE_NO = "";
                                }
                                else
                                {
                                    V_PO_SOURCE_NO = dt.Rows[i]["通路單號"].ToString().Trim();
                                }
                            }


                            if (V_ERR_MEMO == "")
                            {
                                DataRow[] drDetlArrs = dt.Select(string.Format("入帳日 ='{0}' and 簽收日='{1}' and 品號 = '{2}' and 期別='{3}' and 店號='{4}' and 通路單號='{5}'",
                                                                            dt.Rows[i]["入帳日"],
                                                                            dt.Rows[i]["簽收日"],
                                                                            dt.Rows[i]["品號"],
                                                                            dt.Rows[i]["期別"],
                                                                            dt.Rows[i]["店號"],
                                                                            dt.Rows[i]["通路單號"]));
                                
                                if (drDetlArrs.Length > 1)
                                {
                                    V_ERR_MEMO += "有重複資料;";
                                }
                            }
                        }


                        if (V_ERR_MEMO != "")
                        {
                            V_TMPTODB = "0";
                        }

                        ParameterList.Clear();
                        ParameterList.Add(i+1);//rownm  0
                        ParameterList.Add(D_BUS_DATE);//1
                        ParameterList.Add(D_SIGN_DATE);//2
                        ParameterList.Add(V_PO_SOURCE_NO);//3
                        ParameterList.Add(V_STORE);//4
                        ParameterList.Add(V_ITEM);//5
                        ParameterList.Add(V_PERIOD);//6
                        ParameterList.Add(N_QTY);//7
                        ParameterList.Add(V_IOTYPE);//8
                        ParameterList.Add(V_ERR_MEMO);//9
                        ParameterList.Add(V_CREATEUID);//10
                        ParameterList.Add(System.DateTime.Now);//11
                        
                        
                        dbo.FileToTmp(ParameterList, DBT, out V_RESULT, out V_MSG);
                        V_MSG += "(" + dt.Rows[i][0].ToString() + ")";
                    }
                }
                #endregion

                

                if (V_RESULT == "1")
                {
                    if (V_TMPTODB == "1")
                    {
                        #region TmpToDB

                        dbo.TmpToDB(V_IOTYPE, V_CREATEUID, DBT);

                        #endregion                    
                    }

                    if (IsRootTranscation)
                    {
                        //獨立呼叫Transcation成立
                        DBT.Commit();
                        V_MSG = "";
                    }
                    else
                        DBT.Rollback();
                }
                else
                {
                    DBT.Rollback();
                }

                return V_MSG;



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

                DBT.Rollback();
                #endregion

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

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

                #endregion

            }
        }