diff --git a/SRC/MESAgent/MESAutoLoader/AutoLoaderLib/AssemblyInfo.cs b/SRC/MESAgent/MESAutoLoader/AutoLoaderLib/AssemblyInfo.cs new file mode 100644 index 0000000..5b77f12 --- /dev/null +++ b/SRC/MESAgent/MESAutoLoader/AutoLoaderLib/AssemblyInfo.cs @@ -0,0 +1,31 @@ +using System; +using System.Reflection; +using System.Runtime.InteropServices; + +// 一般的組件資訊是由下列這組屬性所控制。 +// 變更這些屬性的值即可修改組件的相關資訊。 +// 檢閱組件屬性的值 + +[assembly: AssemblyTitle("AutoLoaderLib")] +[assembly: AssemblyDescription("AutoLoaderLib for MESSeries")] +[assembly: AssemblyCompany("iMES Technology Inc.")] +[assembly: AssemblyProduct("MESSeries 4")] +[assembly: AssemblyCopyright("Copyright © iMES Technology Inc.")] +[assembly: AssemblyTrademark("")] +[assembly: ComVisible(false)] + +// 下列 GUID 為專案公開 (Expose) 至 COM 時所要使用的 typelib ID +[assembly: Guid("7BE710A6-63DB-4425-9C60-EC4387F6A585")] + +// 組件的版本資訊由下列四個值所組成: +// +// 主要版本 +// 次要版本 +// 組建編號 +// 修訂 +// +// 您可以自行指定所有的值,也可以依照以下的方式,使用 '*' 將修訂和組建編號 +// 指定為預設值: + +[assembly: AssemblyVersion("4.20.0.0")] +[assembly: AssemblyFileVersion("4.20.0.0")] diff --git a/SRC/MESAgent/MESAutoLoader/AutoLoaderLib/AutoLoaderLib_Base.csproj b/SRC/MESAgent/MESAutoLoader/AutoLoaderLib/AutoLoaderLib_Base.csproj new file mode 100644 index 0000000..5574104 --- /dev/null +++ b/SRC/MESAgent/MESAutoLoader/AutoLoaderLib/AutoLoaderLib_Base.csproj @@ -0,0 +1,273 @@ + + + + Local + 8.0.50727 + 2.0 + {7C0468A8-E807-0FF4-0C04-C1AD9B3D7D2A} + SAK + SAK + SAK + SAK + Debug + AnyCPU + + + + + AutoLoaderLib_Base + + + None + JScript + Grid + IE50 + false + Library + Binary + On + Off + AutoLoaderLib_Base + + + true + false + true + + + Windows + + + false + v4.6.2 + 2.0 + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + false + true + + $(DefaultItemExcludes);$(ProjectDir)**\*.vb + + + ..\..\..\MES_S_DLL\ + ..\..\..\MES_S_DLL\AutoLoaderLib_Base.xml + 285212672 + + + + + true + true + true + false + false + false + false + 0 + 42016,42017,42018,42019,42032,42353,42354,42355 + full + AnyCPU + false + + + ..\..\..\MES_S_DLL\ + ..\..\..\MES_S_DLL\ + + 285212672 + + + + + false + true + false + true + false + false + false + 0 + 42016,42017,42018,42019,42032,42353,42354,42355 + none + false + + + + False + ..\..\..\MES_S_DLL\data_access_service.dll + False + + + False + ..\..\..\MES_S_DLL\iMESAppSetting.dll + False + + + False + ..\..\..\MES_S_DLL\iMESComSubroutine.dll + False + + + False + ..\..\..\MES_S_DLL\iMESComXML.dll + False + + + False + ..\..\..\MES_S_DLL\iMESConst.dll + False + + + False + ..\..\..\MES_S_DLL\iMESLog.dll + + + + False + ..\..\..\MES_C_DLL\ICSharpCode.SharpZipLib.dll + False + + + False + ..\..\..\MES_C_DLL\NPOI.dll + False + + + False + ..\..\..\MES_C_DLL\NPOI.OOXML.dll + False + + + False + ..\..\..\MES_C_DLL\NPOI.OpenXml4Net.dll + False + + + False + ..\..\..\MES_C_DLL\NPOI.OpenXmlFormats.dll + False + + + False + ..\..\..\MES_S_DLL\Oracle.ManagedDataAccess.dll + + + System + + + System.Data + + + + System.Web.Services + + + System.XML + + + + + + + + + + + + True + True + Reference.map + + + + AutoLoaderLib_Base.My + SettingsSingleFileGenerator + Settings.Designer.cs + + + Code + + + Code + + + + Code + + + Code + + + True + True + Settings.settings + + + + + + + + MSDiscoCodeGenerator + Reference.cs + + + + + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 3.5 SP1 + true + + + False + Windows Installer 3.1 + true + + + + + + + + Dynamic + Web References\wsInvoke\ + http://localhost/MESws_Industry/wsInvoke.asmx + + + + + MySettings + AutoLoaderLib_wsInvoke_wsInvoke + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/SRC/MESAgent/MESAutoLoader/AutoLoaderLib/AutoLoaderLib_Base.csproj.vspscc b/SRC/MESAgent/MESAutoLoader/AutoLoaderLib/AutoLoaderLib_Base.csproj.vspscc new file mode 100644 index 0000000..b6d3289 --- /dev/null +++ b/SRC/MESAgent/MESAutoLoader/AutoLoaderLib/AutoLoaderLib_Base.csproj.vspscc @@ -0,0 +1,10 @@ +"" +{ +"FILE_VERSION" = "9237" +"ENLISTMENT_CHOICE" = "NEVER" +"PROJECT_FILE_RELATIVE_PATH" = "" +"NUMBER_OF_EXCLUDED_FILES" = "0" +"ORIGINAL_PROJECT_FILE_PATH" = "" +"NUMBER_OF_NESTED_PROJECTS" = "0" +"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER" +} diff --git a/SRC/MESAgent/MESAutoLoader/AutoLoaderLib/EPIParseTemplate.cs b/SRC/MESAgent/MESAutoLoader/AutoLoaderLib/EPIParseTemplate.cs new file mode 100644 index 0000000..c828051 --- /dev/null +++ b/SRC/MESAgent/MESAutoLoader/AutoLoaderLib/EPIParseTemplate.cs @@ -0,0 +1,236 @@ +using System; +using System.Data; +using System.IO; +using iMESCore.Settings; +using Microsoft.VisualBasic; +using static iMESCore.DataBase.iMESSql; + +namespace AutoLoaderLib_Base +{ + //調整行業包基底AutoLoaderLib_Base將原有EPIParseTemplate, ParseNEL, ParsePL, ParsePR, ParseQEL等類別進行下架處理 + //public abstract class EPIParseTemplate + //{ + + // // 設定暫存資料表的欄位 + // internal abstract bool AddColumns(DataTable dt); + + // // 解析資料, 並寫入暫存資料表 + // internal abstract bool ParsingFile(DataTable dt, string file); + + // // 將暫存資料表寫入資料庫 + // internal abstract bool InsertTable(DataTable dt); + + // internal IDbConnection objConnection; + + // public enum FileTypeEnum + // { + // csv = 0, + // xls = 1, + // dat = 2 + // } + + // private string[] wildcards = new string[] { "*.csv", "*.xls", "*.dat" }; + // private string strDataBaseType; // DataBase Type:oracle, mysql, access + // private string strConnectionString; // Connection string + // private AppSettings objSetting = new AppSettings(); + // private DataTable objDataTable; + // private string SourcePath; + // private string DestinationPath; + // private string QueuePath; + // private string FailPath; + + // /// + ///// 建構子 + ///// + ///// + ///// + ///// + ///// + ///// + // public EPIParseTemplate(string paramSourcePath, string paramDestinationPath, string paramQueuePath, string paramFailPath) + // { + + // objSetting = new AppSettings(); + + // // //Get database type + // strDataBaseType = objSetting.GetDataBaseType(); + + // // //Get connection string + // strConnectionString = objSetting.GetConnectionString(strDataBaseType); + + // objConnection = CreateConnection(strConnectionString); + + // if (Strings.Right(paramSourcePath, 1) != @"\") + // { + // paramSourcePath += @"\"; + // } + + // SourcePath = paramSourcePath; + + // if (Strings.Right(paramDestinationPath, 1) != @"\") + // { + // paramDestinationPath += @"\"; + // } + + // DestinationPath = paramDestinationPath; + + // if (Strings.Right(paramQueuePath, 1) != @"\") + // { + // paramQueuePath += @"\"; + // } + + // QueuePath = paramQueuePath; + + // if (Strings.Right(paramFailPath, 1) != @"\") + // { + // paramFailPath += @"\"; + // } + + // FailPath = paramFailPath; + + // } + + // ~EPIParseTemplate() + // { + + // if (objConnection != null) + // { + // objConnection = null; + // } + + // if (objSetting != null) + // { + // objSetting = null; + // } + + // if (objDataTable != null) + // { + // objDataTable = null; + // } + + // } + + // /// + ///// 解析資料 + ///// + ///// + ///// + ///// + // public string ParsingData(FileTypeEnum paramFileType) + // { + + // string strResult = string.Empty; + // string QueueFile = ""; + // string DestinationFile = ""; + // string FailFile = ""; + + // try + // { + + // objDataTable = new DataTable("RawData"); + + // // 設定暫存資料表的欄位 + // if (AddColumns(objDataTable)) + // { + + // foreach (var SourceFile in Directory.GetFiles(SourcePath, wildcards[(int)paramFileType], SearchOption.TopDirectoryOnly)) + // { + + // if (File.Exists(SourceFile)) + // { + + // QueueFile = QueuePath + Path.GetFileName(SourceFile); + // DestinationFile = DestinationPath + Path.GetFileName(SourceFile); + // FailFile = FailPath + Path.GetFileName(SourceFile); + + // try + // { + + // // 將檔案從 Source 移至 Queue + // MoveFile(SourceFile, QueueFile); + + // objDataTable.Rows.Clear(); + + // // 解析資料, 並寫入暫存資料表 + // if (ParsingFile(objDataTable, QueueFile)) + // { + + // // 將暫存資料表寫入資料庫 + // if (InsertTable(objDataTable)) + // { + + // // 將檔案從 Queue 移至 Destination + // MoveFile(QueueFile, DestinationFile); + + // } + + // } + // } + + // catch (Exception ex) + // { + + // // 將檔案從 Queue 移至 Fail + // MoveFile(QueueFile, FailFile); + + // throw; + + // } + + // } + + // } + + // strResult = "success"; + + // } + // } + + // catch (Exception ex) + // { + + // strResult = "Message:" + ex.Message + ",StackTrace:" + ex.StackTrace; + // } + + // finally + // { + + // } + + // return strResult; + + // } + + // /// + ///// 搬移檔案 + ///// + ///// 來源檔案 + ///// 目的檔案 + ///// + // private void MoveFile(string paramSourceFile, string paramTargetFile) + // { + + // try + // { + + // // 判斷目的檔案是否已存在, 若存在必須先刪除 + // if (File.Exists(paramTargetFile)) + // { + // File.Delete(paramTargetFile); + // } + + // // 移動檔案至目的 + // Directory.Move(paramSourceFile, paramTargetFile); + // } + + // catch (Exception ex) + // { + + // throw; + + // } + + // } + + //} +} \ No newline at end of file diff --git a/SRC/MESAgent/MESAutoLoader/AutoLoaderLib/My Project/Settings.Designer.cs b/SRC/MESAgent/MESAutoLoader/AutoLoaderLib/My Project/Settings.Designer.cs new file mode 100644 index 0000000..ad1aee7 --- /dev/null +++ b/SRC/MESAgent/MESAutoLoader/AutoLoaderLib/My Project/Settings.Designer.cs @@ -0,0 +1,101 @@ +// ------------------------------------------------------------------------------ +// +// 這段程式碼是由工具產生的。 +// 執行階段版本:4.0.30319.42000 +// +// 對這個檔案所做的變更可能會造成錯誤的行為,而且如果重新產生程式碼, +// 變更將會遺失。 +// +// ------------------------------------------------------------------------------ + +using System.Diagnostics; +using Microsoft.VisualBasic; +using Microsoft.VisualBasic.CompilerServices; + + +namespace AutoLoaderLib_Base.My +{ + + [System.Runtime.CompilerServices.CompilerGenerated()] + [System.CodeDom.Compiler.GeneratedCode("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0")] + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Advanced)] + internal sealed partial class MySettings : System.Configuration.ApplicationSettingsBase + { + + private static MySettings defaultInstance = (MySettings)Synchronized(new MySettings()); + + #region My.Settings 自動儲存功能 + /* TODO ERROR: Skipped IfDirectiveTrivia + #If _MyType = "WindowsForms" Then + *//* TODO ERROR: Skipped DisabledTextTrivia + Private Shared addedHandler As Boolean + + Private Shared addedHandlerLockObject As New Object + + _ + Private Shared Sub AutoSaveSettings(ByVal sender As Global.System.Object, ByVal e As Global.System.EventArgs) + If My.Application.SaveMySettingsOnExit Then + My.Settings.Save() + End If + End Sub + *//* TODO ERROR: Skipped EndIfDirectiveTrivia + #End If + */ + #endregion + + public static MySettings Default + { + get + { + + /* TODO ERROR: Skipped IfDirectiveTrivia + #If _MyType = "WindowsForms" Then + *//* TODO ERROR: Skipped DisabledTextTrivia + If Not addedHandler Then + SyncLock addedHandlerLockObject + If Not addedHandler Then + AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings + addedHandler = True + End If + End SyncLock + End If + *//* TODO ERROR: Skipped EndIfDirectiveTrivia + #End If + */ + return defaultInstance; + } + } + + [System.Configuration.ApplicationScopedSetting()] + [DebuggerNonUserCode()] + [System.Configuration.SpecialSetting(System.Configuration.SpecialSetting.WebServiceUrl)] + [System.Configuration.DefaultSettingValue("http://localhost/MESws_Industry/wsInvoke.asmx")] + public string AutoLoaderLib_wsInvoke_wsInvoke + { + get + { + return Conversions.ToString(this["AutoLoaderLib_wsInvoke_wsInvoke"]); + } + } + } +} + +namespace AutoLoaderLib_Base.My +{ + + [HideModuleName()] + [DebuggerNonUserCode()] + [System.Runtime.CompilerServices.CompilerGenerated()] + internal static class MySettingsProperty + { + + [System.ComponentModel.Design.HelpKeyword("My.Settings")] + internal static MySettings Settings + { + get + { + return MySettings.Default; + } + } + } +} \ No newline at end of file diff --git a/SRC/MESAgent/MESAutoLoader/AutoLoaderLib/My Project/Settings.settings b/SRC/MESAgent/MESAutoLoader/AutoLoaderLib/My Project/Settings.settings new file mode 100644 index 0000000..ca70055 --- /dev/null +++ b/SRC/MESAgent/MESAutoLoader/AutoLoaderLib/My Project/Settings.settings @@ -0,0 +1,9 @@ + + + + + + http://localhost/MESws_Industry/wsInvoke.asmx + + + \ No newline at end of file diff --git a/SRC/MESAgent/MESAutoLoader/AutoLoaderLib/NLog.config b/SRC/MESAgent/MESAutoLoader/AutoLoaderLib/NLog.config new file mode 100644 index 0000000..17bd2a1 --- /dev/null +++ b/SRC/MESAgent/MESAutoLoader/AutoLoaderLib/NLog.config @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SRC/MESAgent/MESAutoLoader/AutoLoaderLib/ParseNEL.cs b/SRC/MESAgent/MESAutoLoader/AutoLoaderLib/ParseNEL.cs new file mode 100644 index 0000000..29affce --- /dev/null +++ b/SRC/MESAgent/MESAutoLoader/AutoLoaderLib/ParseNEL.cs @@ -0,0 +1,248 @@ +using System; +using System.Data; +using System.Diagnostics; +using System.IO; +using Microsoft.VisualBasic.CompilerServices; +using static iMESCore.DataBase.iMESSql; + +namespace AutoLoaderLib_Base +{ + //調整行業包基底AutoLoaderLib_Base將原有EPIParseTemplate, ParseNEL, ParsePL, ParsePR, ParseQEL等類別進行下架處理 '//^_^ADD BY H-14278 2023-11-29 FOR + + //public class ParseNEL : EPIParseTemplate + //{ + + + // // 呼叫父類別的建構子 + // public ParseNEL(string paramSourcePath, string paramDestinationPath, string paramQueuePath, string paramFailPath) : base(paramSourcePath, paramDestinationPath, paramQueuePath, paramFailPath) + // { + + // } + + // /// + // /// 設定暫存資料表的欄位 + // /// + // /// + // /// + // /// + // internal override bool AddColumns(DataTable dt) + // { + + // bool blnResult = false; + + // try + // { + + // dt.Columns.Add("WaferID", Type.GetType("System.String")); + // dt.Columns.Add("POS", Type.GetType("System.Decimal")); + // dt.Columns.Add("LOP1", Type.GetType("System.Decimal")); + // dt.Columns.Add("WLD1", Type.GetType("System.Decimal")); + // dt.Columns.Add("VF1", Type.GetType("System.Decimal")); + + // blnResult = true; + // } + + // catch (Exception ex) + // { + + // throw; + + // } + + // return blnResult; + + // } + + // /// + // /// 將暫存資料表寫入資料庫 + // /// + // /// + // /// + // /// + // internal override bool InsertTable(DataTable dt) + // { + + // bool blnResult = false; + // string strSQL_Raw; + // string strSQL_Avg; + // string WaferID = ""; + // decimal LOP1 = 0m; + // decimal WLD1 = 0m; + // decimal VF1 = 0m; + + // strSQL_Raw = " INSERT INTO TBL_LEDLD_EL_N_RAW " + " (WaferID, CreateDate, POS, LOP1, WLD1, VF1) " + " VALUES ('{0}', SYSDATE, {1}, {2}, {3}, {4}) "; + + + // strSQL_Avg = " INSERT INTO TBL_LEDLD_EL_N " + " (WaferID, CreateDate, LOP1, WLD1, VF1) " + " VALUES ('{0}', SYSDATE, {1}, {2}, {3}) "; + + + // try + // { + + // using (var oTran = objConnection.BeginTransaction()) + // { + + // try + // { + + // using (var cmd = CreateCommand()) + // { + + // cmd.Connection = objConnection; + // cmd.Transaction = oTran; + + // if (dt.Rows.Count > 0) + // { + + // for (int i = 0, loopTo = dt.Rows.Count - 1; i <= loopTo; i++) + // { + + // cmd.CommandText = string.Format(strSQL_Raw, dt.Rows[i]["WaferID"], dt.Rows[i]["POS"], dt.Rows[i]["LOP1"], dt.Rows[i]["WLD1"], dt.Rows[i]["VF1"]); + + + + + + // cmd.ExecuteNonQuery(); + + // WaferID = Conversions.ToString(dt.Rows[i]["WaferID"]); + // LOP1 = LOP1 + Convert.ToDecimal(dt.Rows[i]["LOP1"]); + // WLD1 = WLD1 + Convert.ToDecimal(dt.Rows[i]["WLD1"]); + // VF1 = VF1 + Convert.ToDecimal(dt.Rows[i]["VF1"]); + + // } + + // cmd.CommandText = string.Format(strSQL_Avg, WaferID, LOP1 / dt.Rows.Count, WLD1 / dt.Rows.Count, VF1 / dt.Rows.Count); + + + + + // cmd.ExecuteNonQuery(); + + // } + + // } + + // oTran.Commit(); + + // blnResult = true; + // } + + // catch (Exception ex) + // { + + // oTran.Rollback(); + // throw; + + // } + + // } + // } + + // catch (Exception ex) + // { + + // throw; + + // } + + // return blnResult; + + // } + + // /// + // /// 解析資料, 並寫入暫存資料表 + // /// + // /// + // /// + // /// + // /// + // internal override bool ParsingFile(DataTable dt, string file) + // { + + // bool blnResult = false; + // DataRow dr = null; + // string line; + // string[] tmpData; + // bool startParsing = false; + // string WaferID; + + // try + // { + + // // 檔名即為 WaferID + // var fi = new FileInfo(file); + // WaferID = fi.Name.Replace(fi.Extension, ""); + // fi = null; + + // using (var sr = new StreamReader(file)) + // { + + // do + // { + + // line = sr.ReadLine(); + + // if (!string.IsNullOrEmpty(line)) + // { + + // if (startParsing) + // { + + // tmpData = line.Split(','); + + // dr = dt.NewRow(); + + // dr["WaferID"] = WaferID; + // dr["POS"] = Convert.ToDecimal(tmpData[0].Trim()); + // dr["LOP1"] = Convert.ToDecimal(tmpData[4].Trim()); + // dr["WLD1"] = Convert.ToDecimal(tmpData[5].Trim()); + // dr["VF1"] = Convert.ToDecimal(tmpData[3].Trim()); + + // dt.Rows.Add(dr); + // } + + // else + // { + + // Debug.Print(line); + + // if (line.IndexOf("PosX") >= 0 && line.IndexOf("PosY") >= 0) + // { + // startParsing = true; + // } + + // } + + // } + // } + + // while (!(line == null)); + + // blnResult = true; + + // } + // } + + // catch (Exception ex) + // { + + // throw; + // } + + // finally + // { + + // if (dr != null) + // { + // dr = null; + // } + + // } + + // return blnResult; + + // } + + //} +} \ No newline at end of file diff --git a/SRC/MESAgent/MESAutoLoader/AutoLoaderLib/ParsePL.cs b/SRC/MESAgent/MESAutoLoader/AutoLoaderLib/ParsePL.cs new file mode 100644 index 0000000..d6d831d --- /dev/null +++ b/SRC/MESAgent/MESAutoLoader/AutoLoaderLib/ParsePL.cs @@ -0,0 +1,245 @@ +using System; +using System.Data; +using System.IO; +using static iMESCore.DataBase.iMESSql; + +namespace AutoLoaderLib_Base +{ + // 調整行業包基底AutoLoaderLib_Base將原有EPIParseTemplate, ParseNEL, ParsePL, ParsePR, ParseQEL等類別進行下架處理 + //public class ParsePL : EPIParseTemplate + //{ + + + // // 呼叫父類別的建構子 + // public ParsePL(string paramSourcePath, string paramDestinationPath, string paramQueuePath, string paramFailPath) : base(paramSourcePath, paramDestinationPath, paramQueuePath, paramFailPath) + // { + + // } + + // /// + ///// 設定暫存資料表的欄位 + ///// + ///// + ///// + ///// + // internal override bool AddColumns(DataTable dt) + // { + + // bool blnResult = false; + + // try + // { + + // dt.Columns.Add("WaferID", Type.GetType("System.String")); + // dt.Columns.Add("MeasurementTime", Type.GetType("System.String")); + // dt.Columns.Add("NG", Type.GetType("System.Decimal")); + // dt.Columns.Add("OK", Type.GetType("System.Decimal")); + // dt.Columns.Add("Yield", Type.GetType("System.String")); + // dt.Columns.Add("Setup", Type.GetType("System.String")); + // dt.Columns.Add("LaserOutput", Type.GetType("System.String")); + // dt.Columns.Add("WPMIN", Type.GetType("System.Decimal")); + // dt.Columns.Add("WPMAX", Type.GetType("System.Decimal")); + // dt.Columns.Add("WPAVG", Type.GetType("System.Decimal")); + // dt.Columns.Add("WPDEV", Type.GetType("System.Decimal")); + // dt.Columns.Add("FWHMMIN", Type.GetType("System.Decimal")); + // dt.Columns.Add("FWHMMAX", Type.GetType("System.Decimal")); + // dt.Columns.Add("FWHMAVG", Type.GetType("System.Decimal")); + // dt.Columns.Add("FWHMDEV", Type.GetType("System.Decimal")); + // dt.Columns.Add("WDMIN", Type.GetType("System.Decimal")); + // dt.Columns.Add("WDMAX", Type.GetType("System.Decimal")); + // dt.Columns.Add("WDAVG", Type.GetType("System.Decimal")); + // dt.Columns.Add("WDDEV", Type.GetType("System.Decimal")); + + // blnResult = true; + // } + + // catch (Exception ex) + // { + + // throw; + + // } + + // return blnResult; + + // } + + // /// + ///// 將暫存資料表寫入資料庫 + ///// + ///// + ///// + ///// + // internal override bool InsertTable(DataTable dt) + // { + + // bool blnResult = false; + // string strSQL; + + // strSQL = " INSERT INTO TBL_LEDLD_PL " + " (WaferID, CreateDate, MeasurementTime, NG, OK, Yield, Setup, LaserOutput, " + " WPMIN, WPMAX, WPAVG, WPDEV, " + " FWHMMIN, FWHMMAX, FWHMAVG, FWHMDEV, " + " WDMIN, WDMAX, WDAVG, WDDEV) " + " VALUES ('{0}', SYSDATE, '{1}', {2}, {3}, '{4}', '{5}', '{6}', " + " {7}, {8}, {9}, {10}, " + " {11}, {12}, {13}, {14}, " + " {15}, {16}, {17}, {18}) "; + + + + + + + + + // try + // { + + // using (var oTran = objConnection.BeginTransaction()) + // { + + // try + // { + + // using (var cmd = CreateCommand()) + // { + + // cmd.Connection = objConnection; + // cmd.Transaction = oTran; + + // for (int i = 0, loopTo = dt.Rows.Count - 1; i <= loopTo; i++) + // { + + // cmd.CommandText = string.Format(strSQL, dt.Rows[i]["WaferID"], dt.Rows[i]["MeasurementTime"], dt.Rows[i]["NG"], dt.Rows[i]["OK"], dt.Rows[i]["Yield"], dt.Rows[i]["Setup"], dt.Rows[i]["LaserOutput"], dt.Rows[i]["WPMIN"], dt.Rows[i]["WPMAX"], dt.Rows[i]["WPAVG"], dt.Rows[i]["WPDEV"], dt.Rows[i]["FWHMMIN"], dt.Rows[i]["FWHMMAX"], dt.Rows[i]["FWHMAVG"], dt.Rows[i]["FWHMDEV"], dt.Rows[i]["WDMIN"], dt.Rows[i]["WDMAX"], dt.Rows[i]["WDAVG"], dt.Rows[i]["WDDEV"]); + + + + + + + + + + + // cmd.ExecuteNonQuery(); + + // } + + // } + + // oTran.Commit(); + + // blnResult = true; + // } + + // catch (Exception ex) + // { + + // oTran.Rollback(); + // throw; + + // } + + // } + // } + + // catch (Exception ex) + // { + + // throw; + + // } + + // return blnResult; + + // } + + // /// + ///// 解析資料, 並寫入暫存資料表 + ///// + ///// + ///// + ///// + ///// + // internal override bool ParsingFile(DataTable dt, string file) + // { + + // bool blnResult = false; + // DataRow dr = null; + // string line; + // string[] tmpData; + // string LotNo; + + // try + // { + + // // 檔名即為 LotNo + // var fi = new FileInfo(file); + // LotNo = fi.Name.Replace(fi.Extension, ""); + // fi = null; + + // using (var sr = new StreamReader(file)) + // { + + // // 第一行是欄位抬頭 + // line = sr.ReadLine(); + + // do + // { + + // line = sr.ReadLine(); + + // if (!string.IsNullOrEmpty(line)) + // { + + // tmpData = line.Split(','); + + // dr = dt.NewRow(); + + // dr["WaferID"] = tmpData[4].Trim() + tmpData[5].Trim().Substring(tmpData[5].Trim().Length - 2); + // dr["MeasurementTime"] = tmpData[3].Trim(); + // dr["NG"] = Convert.ToDecimal(tmpData[11].Trim()); + // dr["OK"] = Convert.ToDecimal(tmpData[12].Trim()); + // dr["Yield"] = tmpData[13].Trim(); + // dr["Setup"] = tmpData[14].Trim(); + // dr["LaserOutput"] = tmpData[15].Trim(); + // dr["WPMIN"] = Convert.ToDecimal(tmpData[16].Trim()); + // dr["WPMAX"] = Convert.ToDecimal(tmpData[17].Trim()); + // dr["WPAVG"] = Convert.ToDecimal(tmpData[18].Trim()); + // dr["WPDEV"] = Convert.ToDecimal(tmpData[20].Trim()); + // dr["FWHMMIN"] = Convert.ToDecimal(tmpData[28].Trim()); + // dr["FWHMMAX"] = Convert.ToDecimal(tmpData[29].Trim()); + // dr["FWHMAVG"] = Convert.ToDecimal(tmpData[30].Trim()); + // dr["FWHMDEV"] = Convert.ToDecimal(tmpData[32].Trim()); + // dr["WDMIN"] = Convert.ToDecimal(tmpData[40].Trim()); + // dr["WDMAX"] = Convert.ToDecimal(tmpData[41].Trim()); + // dr["WDAVG"] = Convert.ToDecimal(tmpData[42].Trim()); + // dr["WDDEV"] = Convert.ToDecimal(tmpData[44].Trim()); + + // dt.Rows.Add(dr); + + // } + // } + + // while (!string.IsNullOrEmpty(line)); + + // blnResult = true; + + // } + // } + + // catch (Exception ex) + // { + + // throw; + // } + + // finally + // { + + // if (dr != null) + // { + // dr = null; + // } + + // } + + // return blnResult; + + // } + + //} +} \ No newline at end of file diff --git a/SRC/MESAgent/MESAutoLoader/AutoLoaderLib/ParsePR.cs b/SRC/MESAgent/MESAutoLoader/AutoLoaderLib/ParsePR.cs new file mode 100644 index 0000000..b498458 --- /dev/null +++ b/SRC/MESAgent/MESAutoLoader/AutoLoaderLib/ParsePR.cs @@ -0,0 +1,385 @@ +using System; +using System.Data; +using System.IO; +using Microsoft.VisualBasic; +using Microsoft.VisualBasic.CompilerServices; +using static iMESCore.DataBase.iMESSql; + +namespace AutoLoaderLib_Base +{ + //調整行業包基底AutoLoaderLib_Base將原有EPIParseTemplate, ParseNEL, ParsePL, ParsePR, ParseQEL等類別進行下架處理 + + //public class ParsePR : EPIParseTemplate + //{ + + + // // 呼叫父類別的建構子 + // public ParsePR(string paramSourcePath, string paramDestinationPath, string paramQueuePath, string paramFailPath) : base(paramSourcePath, paramDestinationPath, paramQueuePath, paramFailPath) + // { + + // } + + // /// + ///// 設定暫存資料表的欄位 + ///// + ///// + ///// + ///// + // internal override bool AddColumns(DataTable dt) + // { + + // bool blnResult = false; + + // try + // { + + // dt.Columns.Add("WaferID", Type.GetType("System.String")); + // dt.Columns.Add("RawData", Type.GetType("System.String")); + // dt.Columns.Add("Average", Type.GetType("System.Decimal")); + // dt.Columns.Add("Diff1", Type.GetType("System.Decimal")); + // dt.Columns.Add("Diff2", Type.GetType("System.Decimal")); + // dt.Columns.Add("PR_GRADE", Type.GetType("System.String")); + // dt.Columns.Add("PR_RESULT", Type.GetType("System.String")); + + // blnResult = true; + // } + + // catch (Exception ex) + // { + + // throw; + + // } + + // return blnResult; + + // } + + // /// + ///// 將暫存資料表寫入資料庫 + ///// + ///// + ///// + ///// + // internal override bool InsertTable(DataTable dt) + // { + + // bool blnResult = false; + // string strSQL; + // string strSQL2; + // string strSQL3; + + // const string PR_GRADE = "PR Grade"; + + // // 新增 PR 資料 + // strSQL = " INSERT INTO TBL_LEDLD_PR " + " (WaferID, CreateDate, RawData, Average, Diff1, Diff2, PR_GRADE, PR_RESULT) " + " VALUES ('{0}', SYSDATE, '{1}', {2}, {3}, {4}, '{5}', '{6}') "; + + + // // 刪除 ComponentProperty PR_GRADE 的資料 + // strSQL2 = " DELETE TBLWIPCOMPONENTPROPERTY " + " WHERE LOTNO = '{0}' " + " AND COMPONENTNO = '{1}' " + " AND PROPERTYNO = '{2}' "; + + + + // // 新增 ComponentProperty PR_GRADE 的資料 + // strSQL3 = " INSERT INTO TBLWIPCOMPONENTPROPERTY " + " (LOTNO, COMPONENTNO, PROPERTYNO, PROPERTYVALUE) " + " VALUES ('{0}', '{1}', '{2}', '{3}') "; + + + // try + // { + + // using (var oTran = objConnection.BeginTransaction()) + // { + + // try + // { + + // using (var cmd = CreateCommand()) + // { + + // cmd.Connection = objConnection; + // cmd.Transaction = oTran; + + // for (int i = 0, loopTo = dt.Rows.Count - 1; i <= loopTo; i++) + // { + + // cmd.CommandText = string.Format(strSQL, dt.Rows[i]["WaferID"] + + // "", dt.Rows[i]["RawData"] + "", dt.Rows[i]["Average"], dt.Rows[i]["Diff1"], dt.Rows[i]["Diff2"], dt.Rows[i]["PR_GRADE"] + "", dt.Rows[i]["PR_RESULT"] + + // ""); + + + + + + + + // cmd.ExecuteNonQuery(); + + // cmd.CommandText = string.Format(strSQL2, Strings.Mid(Conversions.ToString(dt.Rows[i]["WaferID"] + + // ""), 1, 10), dt.Rows[i]["WaferID"] + "", PR_GRADE); + + + + // cmd.ExecuteNonQuery(); + + // cmd.CommandText = string.Format(strSQL3, Strings.Mid(Conversions.ToString(dt.Rows[i]["WaferID"] + + // ""), 1, 10), dt.Rows[i]["WaferID"] + "", PR_GRADE, dt.Rows[i]["PR_GRADE"] + ""); + + + + + // cmd.ExecuteNonQuery(); + + // } + + // } + + // oTran.Commit(); + + // blnResult = true; + // } + + // catch (Exception ex) + // { + + // oTran.Rollback(); + // throw; + + // } + + // } + // } + + // catch (Exception ex) + // { + + // throw; + + // } + + // return blnResult; + + // } + + // /// + ///// 解析資料, 並寫入暫存資料表 + ///// + ///// + ///// + ///// + ///// + // internal override bool ParsingFile(DataTable dt, string file) + // { + + // bool blnResult = false; + // DataRow dr = null; + // string line; + // string[] tmpData; + // string WaferID; + // string RawData = ""; + // decimal Average = 0m; + // decimal Diff1 = 0m; + // decimal Diff2 = 0m; + // string PR_Grade; + // string PR_Result; + + // try + // { + + // // 檔名即為 WaferID + // var fi = new FileInfo(file); + // WaferID = fi.Name.Replace(fi.Extension, ""); + // fi = null; + + // using (var sr = new StreamReader(file)) + // { + + // do + // { + + // line = sr.ReadLine(); + + // if (!string.IsNullOrEmpty(line)) + // { + + // tmpData = line.Split('\t'); + + // if (tmpData != null && tmpData.Length == 2) + // { + + // if (!Information.IsNumeric(tmpData[1])) + // { + // tmpData[1] = "0"; + // } + + // switch (tmpData[0].ToUpper() ?? "") + // { + + // case "AVERAGE": + // { + // Average = Convert.ToDecimal(tmpData[1]); + // break; + // } + + // case "DIFF1": + // { + // Diff1 = Convert.ToDecimal(tmpData[1]); + // break; + // } + + // case "DIFF2": + // { + // Diff2 = Convert.ToDecimal(tmpData[1]); + // break; + // } + + // default: + // { + // RawData += tmpData[0] + "=" + tmpData[1] + ","; + // break; + // } + + // } + + // } + + // } + // } + + // while (!string.IsNullOrEmpty(line)); + + // if (RawData.Length > 0) + // { + + // RawData = RawData.Substring(0, RawData.Length - 1); + + // // 依 Average 取出 Grade + // PR_Grade = PRGrade(Average); + + // if (string.IsNullOrEmpty(PR_Grade)) + // { + // throw new Exception("PR_Grade fail。"); + // } + + // // 依 Diff 取出 Grade + // switch (PRGrade(Diff1) ?? "") + // { + // case "": + // { + // throw new Exception("PR_Result fail。"); + // } + // case "N/A": + // { + // PR_Result = "NG"; + // break; + // } + + // default: + // { + // PR_Result = "OK"; + // break; + // } + // } + + // dr = dt.NewRow(); + // dr["WaferID"] = WaferID; + // dr["RawData"] = RawData; + // dr["Average"] = Average; + // dr["Diff1"] = Diff1; + // dr["Diff2"] = Diff2; + // dr["PR_GRADE"] = PR_Grade; + // dr["PR_RESULT"] = PR_Result; + // dt.Rows.Add(dr); + + // blnResult = true; + + // } + + // } + // } + + // catch (Exception ex) + // { + + // throw; + // } + + // finally + // { + + // if (dr != null) + // { + // dr = null; + // } + + // } + + // return blnResult; + + // } + + // /// + ///// PR 等級編碼原則 + ///// + ///// + ///// + ///// + // private string PRGrade(decimal value) + // { + + // string strGrade = "N/A"; + // string[] tmpData; + // var CollectionGrade = new Collection(); + + // CollectionGrade.Add("0~1.5~A1"); + // CollectionGrade.Add("1.5~2~A2"); + // CollectionGrade.Add("2~3~A3"); + // CollectionGrade.Add("3~6~A4"); + // CollectionGrade.Add("6~9~A5"); + // CollectionGrade.Add("9~12~A6"); + // CollectionGrade.Add("12~15~A7"); + // CollectionGrade.Add("15~18~A8"); + // CollectionGrade.Add("18~24~A9"); + // CollectionGrade.Add("24~30~AA"); + // CollectionGrade.Add("30~36~AB"); + // CollectionGrade.Add("36~9999~AC"); + + // try + // { + + // foreach (string str in CollectionGrade) + // { + + // tmpData = Strings.Split(str, "~"); + + // if (tmpData.Length != 3) + // { + // break; + // } + + // if (!Information.IsNumeric(tmpData[0]) || !Information.IsNumeric(tmpData[1])) + // { + // break; + // } + + // if ((double)value >= Conversions.ToDouble(tmpData[0]) && (double)value < Conversions.ToDouble(tmpData[1])) + // { + // strGrade = tmpData[2]; + // break; + // } + + // } + // } + + // catch (Exception ex) + // { + + // strGrade = ""; + + // } + + // return strGrade; + + // } + + //} +} diff --git a/SRC/MESAgent/MESAutoLoader/AutoLoaderLib/ParseQEL.cs b/SRC/MESAgent/MESAutoLoader/AutoLoaderLib/ParseQEL.cs new file mode 100644 index 0000000..ddfc19f --- /dev/null +++ b/SRC/MESAgent/MESAutoLoader/AutoLoaderLib/ParseQEL.cs @@ -0,0 +1,259 @@ +using System; +using System.Data; +using System.IO; +using Microsoft.VisualBasic.CompilerServices; +using static iMESCore.DataBase.iMESSql; + +namespace AutoLoaderLib_Base +{ + // 調整行業包基底AutoLoaderLib_Base將原有EPIParseTemplate, ParseNEL, ParsePL, ParsePR, ParseQEL等類別進行下架處理 + //public class ParseQEL : EPIParseTemplate + //{ + + + // // 呼叫父類別的建構子 + // public ParseQEL(string paramSourcePath, string paramDestinationPath, string paramQueuePath, string paramFailPath) : base(paramSourcePath, paramDestinationPath, paramQueuePath, paramFailPath) + // { + + // } + + // /// + // /// 設定暫存資料表的欄位 + // /// + // /// + // /// + // /// + // internal override bool AddColumns(DataTable dt) + // { + + // bool blnResult = false; + + // try + // { + + // dt.Columns.Add("WaferID", Type.GetType("System.String")); + // dt.Columns.Add("POS", Type.GetType("System.Decimal")); + // dt.Columns.Add("LOP1", Type.GetType("System.Decimal")); + // dt.Columns.Add("LOP2", Type.GetType("System.Decimal")); + // dt.Columns.Add("WLP1", Type.GetType("System.Decimal")); + // dt.Columns.Add("WLD1", Type.GetType("System.Decimal")); + // dt.Columns.Add("VF1", Type.GetType("System.Decimal")); + // dt.Columns.Add("VF2", Type.GetType("System.Decimal")); + + // blnResult = true; + // } + + // catch (Exception ex) + // { + + // throw; + + // } + + // return blnResult; + + // } + + // /// + // /// 將暫存資料表寫入資料庫 + // /// + // /// + // /// + // /// + // internal override bool InsertTable(DataTable dt) + // { + + // bool blnResult = false; + // string strSQL_Raw; + // string strSQL_Avg; + // string WaferID = ""; + // decimal LOP1 = 0m; + // decimal LOP2 = 0m; + // decimal WLP1 = 0m; + // decimal WLD1 = 0m; + // decimal VF1 = 0m; + // decimal VF2 = 0m; + + // strSQL_Raw = " INSERT INTO TBL_LEDLD_EL_Q_RAW " + " (WaferID, CreateDate, POS, LOP1, LOP2, WLP1, WLD1, VF1, VF2) " + " VALUES ('{0}', SYSDATE, {1}, {2}, {3}, {4}, {5}, {6}, {7}) "; + + + // strSQL_Avg = " INSERT INTO TBL_LEDLD_EL_Q " + " (WaferID, CreateDate, LOP1, LOP2, WLP1, WLD1, VF1, VF2) " + " VALUES ('{0}', SYSDATE, {1}, {2}, {3}, {4}, {5}, {6}) "; + + + // try + // { + + // using (var oTran = objConnection.BeginTransaction()) + // { + + // try + // { + + // using (var cmd = CreateCommand()) + // { + + // cmd.Connection = objConnection; + // cmd.Transaction = oTran; + + // if (dt.Rows.Count > 0) + // { + + // for (int i = 0, loopTo = dt.Rows.Count - 1; i <= loopTo; i++) + // { + + // cmd.CommandText = string.Format(strSQL_Raw, dt.Rows[i]["WaferID"], dt.Rows[i]["POS"], dt.Rows[i]["LOP1"], dt.Rows[i]["LOP2"], dt.Rows[i]["WLP1"], dt.Rows[i]["WLD1"], dt.Rows[i]["VF1"], dt.Rows[i]["VF2"]); + + + + + + + + + // cmd.ExecuteNonQuery(); + + // WaferID = Conversions.ToString(dt.Rows[i]["WaferID"]); + // LOP1 = LOP1 + Convert.ToDecimal(dt.Rows[i]["LOP1"]); + // LOP2 = LOP2 + Convert.ToDecimal(dt.Rows[i]["LOP2"]); + // WLP1 = WLP1 + Convert.ToDecimal(dt.Rows[i]["WLP1"]); + // WLD1 = WLD1 + Convert.ToDecimal(dt.Rows[i]["WLD1"]); + // VF1 = VF1 + Convert.ToDecimal(dt.Rows[i]["VF1"]); + // VF2 = VF2 + Convert.ToDecimal(dt.Rows[i]["VF2"]); + + // } + + // cmd.CommandText = string.Format(strSQL_Avg, WaferID, LOP1 / dt.Rows.Count, LOP2 / dt.Rows.Count, WLP1 / dt.Rows.Count, WLD1 / dt.Rows.Count, VF1 / dt.Rows.Count, VF2 / dt.Rows.Count); + + + + + + + + // cmd.ExecuteNonQuery(); + + // } + + // } + + // oTran.Commit(); + + // blnResult = true; + // } + + // catch (Exception ex) + // { + + // oTran.Rollback(); + // throw; + + // } + + // } + // } + + // catch (Exception ex) + // { + + // throw; + + // } + + // return blnResult; + + // } + + // /// + // /// 解析資料, 並寫入暫存資料表 + // /// + // /// + // /// + // /// + // /// + // internal override bool ParsingFile(DataTable dt, string file) + // { + + // bool blnResult = false; + // DataRow dr = null; + // string line; + // string[] tmpData; + // bool startParsing = false; + // string WaferID; + + // try + // { + + // // 檔名即為 WaferID + // var fi = new FileInfo(file); + // WaferID = fi.Name.Replace(fi.Extension, ""); + // fi = null; + + // using (var sr = new StreamReader(file)) + // { + + // do + // { + + // line = sr.ReadLine(); + + // if (!string.IsNullOrEmpty(line)) + // { + + // if (startParsing) + // { + + // tmpData = line.Split(','); + + // dr = dt.NewRow(); + + // dr["WaferID"] = WaferID; + // dr["POS"] = Convert.ToDecimal(tmpData[0].Trim()); + // dr["LOP1"] = Convert.ToDecimal(tmpData[4].Trim()); + // dr["LOP2"] = Convert.ToDecimal(tmpData[14].Trim()); + // dr["WLP1"] = Convert.ToDecimal(tmpData[6].Trim()); + // dr["WLD1"] = Convert.ToDecimal(tmpData[5].Trim()); + // dr["VF1"] = Convert.ToDecimal(tmpData[3].Trim()); + // dr["VF2"] = Convert.ToDecimal(tmpData[13].Trim()); + + // dt.Rows.Add(dr); + // } + + + // else if (line.IndexOf("PosX") >= 0 && line.IndexOf("PosY") >= 0) + // { + // startParsing = true; + + // } + + // } + // } + + // while (!(line == null)); + + // blnResult = true; + + // } + // } + + // catch (Exception ex) + // { + + // throw; + // } + + // finally + // { + + // if (dr != null) + // { + // dr = null; + // } + + // } + + // return blnResult; + + // } + + //} +} \ No newline at end of file diff --git a/SRC/MESAgent/MESAutoLoader/AutoLoaderLib/Web References/wsInvoke/Reference.cs b/SRC/MESAgent/MESAutoLoader/AutoLoaderLib/Web References/wsInvoke/Reference.cs new file mode 100644 index 0000000..0b185fb --- /dev/null +++ b/SRC/MESAgent/MESAutoLoader/AutoLoaderLib/Web References/wsInvoke/Reference.cs @@ -0,0 +1,779 @@ +// ------------------------------------------------------------------------------ +// +// 這段程式碼是由工具產生的。 +// 執行階段版本:4.0.30319.42000 +// +// 對這個檔案所做的變更可能會造成錯誤的行為,而且如果重新產生程式碼, +// 變更將會遺失。 +// +// ------------------------------------------------------------------------------ + + +using System; +using System.ComponentModel; +using System.Data; +using System.Diagnostics; +using System.Web.Services; +using System.Web.Services.Protocols; +using System.Xml.Serialization; +using Microsoft.VisualBasic.CompilerServices; + +// +// 原始程式碼已由 Microsoft.VSDesigner 自動產生,版本 4.0.30319.42000。 +// +namespace AutoLoaderLib_Base.wsInvoke +{ + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.3761.0")] + [DebuggerStepThrough()] + [DesignerCategory("code")] + [WebServiceBinding(Name = "wsInvokeSoap", Namespace = "http://www.imestech.com/wsInvoke")] + [XmlInclude(typeof(object[]))] + public partial class wsInvoke : SoapHttpClientProtocol + { + + private System.Threading.SendOrPostCallback invokeSrvOperationCompleted; + + private System.Threading.SendOrPostCallback invokeSrv_XmlOperationCompleted; + + private System.Threading.SendOrPostCallback invokeSrv_Xml_SessionOperationCompleted; + + private System.Threading.SendOrPostCallback invokeSrv_DataTableParameterOperationCompleted; + + private System.Threading.SendOrPostCallback invokeSrv_DataTableOperationCompleted; + + private System.Threading.SendOrPostCallback invokeSrv_DataSetOperationCompleted; + + private System.Threading.SendOrPostCallback invokeSrv_SessionOperationCompleted; + + private System.Threading.SendOrPostCallback TestOperationCompleted; + + private bool useDefaultCredentialsSetExplicitly; + + /// + public wsInvoke() : base() + { + Url = My.MySettings.Default.AutoLoaderLib_wsInvoke_wsInvoke; + if (IsLocalFileSystemWebService(Url) == true) + { + UseDefaultCredentials = true; + useDefaultCredentialsSetExplicitly = false; + } + else + { + useDefaultCredentialsSetExplicitly = true; + } + } + + public new string Url + { + get + { + return base.Url; + } + set + { + if (IsLocalFileSystemWebService(base.Url) == true && useDefaultCredentialsSetExplicitly == false && IsLocalFileSystemWebService(value) == false) + + { + base.UseDefaultCredentials = false; + } + base.Url = value; + } + } + + public new bool UseDefaultCredentials + { + get + { + return base.UseDefaultCredentials; + } + set + { + base.UseDefaultCredentials = value; + useDefaultCredentialsSetExplicitly = true; + } + } + + /// + public event invokeSrvCompletedEventHandler invokeSrvCompleted; + + /// + public event invokeSrv_XmlCompletedEventHandler invokeSrv_XmlCompleted; + + /// + public event invokeSrv_Xml_SessionCompletedEventHandler invokeSrv_Xml_SessionCompleted; + + /// + public event invokeSrv_DataTableParameterCompletedEventHandler invokeSrv_DataTableParameterCompleted; + + /// + public event invokeSrv_DataTableCompletedEventHandler invokeSrv_DataTableCompleted; + + /// + public event invokeSrv_DataSetCompletedEventHandler invokeSrv_DataSetCompleted; + + /// + public event invokeSrv_SessionCompletedEventHandler invokeSrv_SessionCompleted; + + /// + public event TestCompletedEventHandler TestCompleted; + + /// + [SoapDocumentMethod("http://www.imestech.com/wsInvoke/invokeSrv", RequestNamespace = "http://www.imestech.com/wsInvoke", ResponseNamespace = "http://www.imestech.com/wsInvoke", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = SoapParameterStyle.Wrapped)] + public object invokeSrv(string method, object[] parameters) + { + object[] results = Invoke("invokeSrv", new object[] { method, parameters }); + return results[0]; + } + + /// + public IAsyncResult BegininvokeSrv(string method, object[] parameters, AsyncCallback callback, object asyncState) + { + return BeginInvoke("invokeSrv", new object[] { method, parameters }, callback, asyncState); + } + + /// + public object EndinvokeSrv(IAsyncResult asyncResult) + { + object[] results = EndInvoke(asyncResult); + return results[0]; + } + + /// + public void invokeSrvAsync(string method, object[] parameters) + { + invokeSrvAsync(method, parameters, null); + } + + /// + public void invokeSrvAsync(string method, object[] parameters, object userState) + { + if (invokeSrvOperationCompleted == null) + { + invokeSrvOperationCompleted = OninvokeSrvOperationCompleted; + } + InvokeAsync("invokeSrv", new object[] { method, parameters }, invokeSrvOperationCompleted, userState); + } + + private void OninvokeSrvOperationCompleted(object arg) + { + if (invokeSrvCompleted != null) + { + InvokeCompletedEventArgs invokeArgs = (InvokeCompletedEventArgs)arg; + invokeSrvCompleted?.Invoke(this, new invokeSrvCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [SoapDocumentMethod("http://www.imestech.com/wsInvoke/invokeSrv_Xml", RequestNamespace = "http://www.imestech.com/wsInvoke", ResponseNamespace = "http://www.imestech.com/wsInvoke", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = SoapParameterStyle.Wrapped)] + public object invokeSrv_Xml(string method, string inXMl) + { + object[] results = Invoke("invokeSrv_Xml", new object[] { method, inXMl }); + return results[0]; + } + + /// + public IAsyncResult BegininvokeSrv_Xml(string method, string inXMl, AsyncCallback callback, object asyncState) + { + return BeginInvoke("invokeSrv_Xml", new object[] { method, inXMl }, callback, asyncState); + } + + /// + public object EndinvokeSrv_Xml(IAsyncResult asyncResult) + { + object[] results = EndInvoke(asyncResult); + return results[0]; + } + + /// + public void invokeSrv_XmlAsync(string method, string inXMl) + { + invokeSrv_XmlAsync(method, inXMl, null); + } + + /// + public void invokeSrv_XmlAsync(string method, string inXMl, object userState) + { + if (invokeSrv_XmlOperationCompleted == null) + { + invokeSrv_XmlOperationCompleted = OninvokeSrv_XmlOperationCompleted; + } + InvokeAsync("invokeSrv_Xml", new object[] { method, inXMl }, invokeSrv_XmlOperationCompleted, userState); + } + + private void OninvokeSrv_XmlOperationCompleted(object arg) + { + if (invokeSrv_XmlCompleted != null) + { + InvokeCompletedEventArgs invokeArgs = (InvokeCompletedEventArgs)arg; + invokeSrv_XmlCompleted?.Invoke(this, new invokeSrv_XmlCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [SoapDocumentMethod("http://www.imestech.com/wsInvoke/invokeSrv_Xml_Session", RequestNamespace = "http://www.imestech.com/wsInvoke", ResponseNamespace = "http://www.imestech.com/wsInvoke", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = SoapParameterStyle.Wrapped)] + public object invokeSrv_Xml_Session(string method, string inXMl) + { + object[] results = Invoke("invokeSrv_Xml_Session", new object[] { method, inXMl }); + return results[0]; + } + + /// + public IAsyncResult BegininvokeSrv_Xml_Session(string method, string inXMl, AsyncCallback callback, object asyncState) + { + return BeginInvoke("invokeSrv_Xml_Session", new object[] { method, inXMl }, callback, asyncState); + } + + /// + public object EndinvokeSrv_Xml_Session(IAsyncResult asyncResult) + { + object[] results = EndInvoke(asyncResult); + return results[0]; + } + + /// + public void invokeSrv_Xml_SessionAsync(string method, string inXMl) + { + invokeSrv_Xml_SessionAsync(method, inXMl, null); + } + + /// + public void invokeSrv_Xml_SessionAsync(string method, string inXMl, object userState) + { + if (invokeSrv_Xml_SessionOperationCompleted == null) + { + invokeSrv_Xml_SessionOperationCompleted = OninvokeSrv_Xml_SessionOperationCompleted; + } + InvokeAsync("invokeSrv_Xml_Session", new object[] { method, inXMl }, invokeSrv_Xml_SessionOperationCompleted, userState); + } + + private void OninvokeSrv_Xml_SessionOperationCompleted(object arg) + { + if (invokeSrv_Xml_SessionCompleted != null) + { + InvokeCompletedEventArgs invokeArgs = (InvokeCompletedEventArgs)arg; + invokeSrv_Xml_SessionCompleted?.Invoke(this, new invokeSrv_Xml_SessionCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [SoapDocumentMethod("http://www.imestech.com/wsInvoke/invokeSrv_DataTableParameter", RequestNamespace = "http://www.imestech.com/wsInvoke", ResponseNamespace = "http://www.imestech.com/wsInvoke", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = SoapParameterStyle.Wrapped)] + public object invokeSrv_DataTableParameter(string method, object[] parameters, ref DataTable pDataTable) + { + object[] results = Invoke("invokeSrv_DataTableParameter", new object[] { method, parameters, pDataTable }); + pDataTable = (DataTable)results[1]; + return results[0]; + } + + /// + public IAsyncResult BegininvokeSrv_DataTableParameter(string method, object[] parameters, DataTable pDataTable, AsyncCallback callback, object asyncState) + { + return BeginInvoke("invokeSrv_DataTableParameter", new object[] { method, parameters, pDataTable }, callback, asyncState); + } + + /// + public object EndinvokeSrv_DataTableParameter(IAsyncResult asyncResult, ref DataTable pDataTable) + { + object[] results = EndInvoke(asyncResult); + pDataTable = (DataTable)results[1]; + return results[0]; + } + + /// + public void invokeSrv_DataTableParameterAsync(string method, object[] parameters, DataTable pDataTable) + { + invokeSrv_DataTableParameterAsync(method, parameters, pDataTable, null); + } + + /// + public void invokeSrv_DataTableParameterAsync(string method, object[] parameters, DataTable pDataTable, object userState) + { + if (invokeSrv_DataTableParameterOperationCompleted == null) + { + invokeSrv_DataTableParameterOperationCompleted = OninvokeSrv_DataTableParameterOperationCompleted; + } + InvokeAsync("invokeSrv_DataTableParameter", new object[] { method, parameters, pDataTable }, invokeSrv_DataTableParameterOperationCompleted, userState); + } + + private void OninvokeSrv_DataTableParameterOperationCompleted(object arg) + { + if (invokeSrv_DataTableParameterCompleted != null) + { + InvokeCompletedEventArgs invokeArgs = (InvokeCompletedEventArgs)arg; + invokeSrv_DataTableParameterCompleted?.Invoke(this, new invokeSrv_DataTableParameterCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [SoapDocumentMethod("http://www.imestech.com/wsInvoke/invokeSrv_DataTable", RequestNamespace = "http://www.imestech.com/wsInvoke", ResponseNamespace = "http://www.imestech.com/wsInvoke", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = SoapParameterStyle.Wrapped)] + public object invokeSrv_DataTable(string method, string InXml, ref DataTable pDataTable) + { + object[] results = Invoke("invokeSrv_DataTable", new object[] { method, InXml, pDataTable }); + pDataTable = (DataTable)results[1]; + return results[0]; + } + + /// + public IAsyncResult BegininvokeSrv_DataTable(string method, string InXml, DataTable pDataTable, AsyncCallback callback, object asyncState) + { + return BeginInvoke("invokeSrv_DataTable", new object[] { method, InXml, pDataTable }, callback, asyncState); + } + + /// + public object EndinvokeSrv_DataTable(IAsyncResult asyncResult, ref DataTable pDataTable) + { + object[] results = EndInvoke(asyncResult); + pDataTable = (DataTable)results[1]; + return results[0]; + } + + /// + public void invokeSrv_DataTableAsync(string method, string InXml, DataTable pDataTable) + { + invokeSrv_DataTableAsync(method, InXml, pDataTable, null); + } + + /// + public void invokeSrv_DataTableAsync(string method, string InXml, DataTable pDataTable, object userState) + { + if (invokeSrv_DataTableOperationCompleted == null) + { + invokeSrv_DataTableOperationCompleted = OninvokeSrv_DataTableOperationCompleted; + } + InvokeAsync("invokeSrv_DataTable", new object[] { method, InXml, pDataTable }, invokeSrv_DataTableOperationCompleted, userState); + } + + private void OninvokeSrv_DataTableOperationCompleted(object arg) + { + if (invokeSrv_DataTableCompleted != null) + { + InvokeCompletedEventArgs invokeArgs = (InvokeCompletedEventArgs)arg; + invokeSrv_DataTableCompleted?.Invoke(this, new invokeSrv_DataTableCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [SoapDocumentMethod("http://www.imestech.com/wsInvoke/invokeSrv_DataSet", RequestNamespace = "http://www.imestech.com/wsInvoke", ResponseNamespace = "http://www.imestech.com/wsInvoke", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = SoapParameterStyle.Wrapped)] + public object invokeSrv_DataSet(string method, string InXml, ref DataSet pDataSet) + { + object[] results = Invoke("invokeSrv_DataSet", new object[] { method, InXml, pDataSet }); + pDataSet = (DataSet)results[1]; + return results[0]; + } + + /// + public IAsyncResult BegininvokeSrv_DataSet(string method, string InXml, DataSet pDataSet, AsyncCallback callback, object asyncState) + { + return BeginInvoke("invokeSrv_DataSet", new object[] { method, InXml, pDataSet }, callback, asyncState); + } + + /// + public object EndinvokeSrv_DataSet(IAsyncResult asyncResult, ref DataSet pDataSet) + { + object[] results = EndInvoke(asyncResult); + pDataSet = (DataSet)results[1]; + return results[0]; + } + + /// + public void invokeSrv_DataSetAsync(string method, string InXml, DataSet pDataSet) + { + invokeSrv_DataSetAsync(method, InXml, pDataSet, null); + } + + /// + public void invokeSrv_DataSetAsync(string method, string InXml, DataSet pDataSet, object userState) + { + if (invokeSrv_DataSetOperationCompleted == null) + { + invokeSrv_DataSetOperationCompleted = OninvokeSrv_DataSetOperationCompleted; + } + InvokeAsync("invokeSrv_DataSet", new object[] { method, InXml, pDataSet }, invokeSrv_DataSetOperationCompleted, userState); + } + + private void OninvokeSrv_DataSetOperationCompleted(object arg) + { + if (invokeSrv_DataSetCompleted != null) + { + InvokeCompletedEventArgs invokeArgs = (InvokeCompletedEventArgs)arg; + invokeSrv_DataSetCompleted?.Invoke(this, new invokeSrv_DataSetCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [SoapDocumentMethod("http://www.imestech.com/wsInvoke/invokeSrv_Session", RequestNamespace = "http://www.imestech.com/wsInvoke", ResponseNamespace = "http://www.imestech.com/wsInvoke", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = SoapParameterStyle.Wrapped)] + public object invokeSrv_Session(string method, object[] parameters) + { + object[] results = Invoke("invokeSrv_Session", new object[] { method, parameters }); + return results[0]; + } + + /// + public IAsyncResult BegininvokeSrv_Session(string method, object[] parameters, AsyncCallback callback, object asyncState) + { + return BeginInvoke("invokeSrv_Session", new object[] { method, parameters }, callback, asyncState); + } + + /// + public object EndinvokeSrv_Session(IAsyncResult asyncResult) + { + object[] results = EndInvoke(asyncResult); + return results[0]; + } + + /// + public void invokeSrv_SessionAsync(string method, object[] parameters) + { + invokeSrv_SessionAsync(method, parameters, null); + } + + /// + public void invokeSrv_SessionAsync(string method, object[] parameters, object userState) + { + if (invokeSrv_SessionOperationCompleted == null) + { + invokeSrv_SessionOperationCompleted = OninvokeSrv_SessionOperationCompleted; + } + InvokeAsync("invokeSrv_Session", new object[] { method, parameters }, invokeSrv_SessionOperationCompleted, userState); + } + + private void OninvokeSrv_SessionOperationCompleted(object arg) + { + if (invokeSrv_SessionCompleted != null) + { + InvokeCompletedEventArgs invokeArgs = (InvokeCompletedEventArgs)arg; + invokeSrv_SessionCompleted?.Invoke(this, new invokeSrv_SessionCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [SoapDocumentMethod("http://www.imestech.com/wsInvoke/Test", RequestNamespace = "http://www.imestech.com/wsInvoke", ResponseNamespace = "http://www.imestech.com/wsInvoke", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = SoapParameterStyle.Wrapped)] + public string Test(string UserNo) + { + object[] results = Invoke("Test", new object[] { UserNo }); + return Conversions.ToString(results[0]); + } + + /// + public IAsyncResult BeginTest(string UserNo, AsyncCallback callback, object asyncState) + { + return BeginInvoke("Test", new object[] { UserNo }, callback, asyncState); + } + + /// + public string EndTest(IAsyncResult asyncResult) + { + object[] results = EndInvoke(asyncResult); + return Conversions.ToString(results[0]); + } + + /// + public void TestAsync(string UserNo) + { + TestAsync(UserNo, null); + } + + /// + public void TestAsync(string UserNo, object userState) + { + if (TestOperationCompleted == null) + { + TestOperationCompleted = OnTestOperationCompleted; + } + InvokeAsync("Test", new object[] { UserNo }, TestOperationCompleted, userState); + } + + private void OnTestOperationCompleted(object arg) + { + if (TestCompleted != null) + { + InvokeCompletedEventArgs invokeArgs = (InvokeCompletedEventArgs)arg; + TestCompleted?.Invoke(this, new TestCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + public new void CancelAsync(object userState) + { + base.CancelAsync(userState); + } + + private bool IsLocalFileSystemWebService(string url) + { + if (url == null || ReferenceEquals(url, string.Empty)) + { + return false; + } + var wsUri = new Uri(url); + if (wsUri.Port >= 1024 && string.Compare(wsUri.Host, "localHost", StringComparison.OrdinalIgnoreCase) == 0) + { + return true; + } + return false; + } + } + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.3761.0")] + public delegate void invokeSrvCompletedEventHandler(object sender, invokeSrvCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.3761.0")] + [DebuggerStepThrough()] + [DesignerCategory("code")] + public partial class invokeSrvCompletedEventArgs : AsyncCompletedEventArgs + { + + private object[] results; + + internal invokeSrvCompletedEventArgs(object[] results, Exception exception, bool cancelled, object userState) : base(exception, cancelled, userState) + { + this.results = results; + } + + /// + public object Result + { + get + { + RaiseExceptionIfNecessary(); + return results[0]; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.3761.0")] + public delegate void invokeSrv_XmlCompletedEventHandler(object sender, invokeSrv_XmlCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.3761.0")] + [DebuggerStepThrough()] + [DesignerCategory("code")] + public partial class invokeSrv_XmlCompletedEventArgs : AsyncCompletedEventArgs + { + + private object[] results; + + internal invokeSrv_XmlCompletedEventArgs(object[] results, Exception exception, bool cancelled, object userState) : base(exception, cancelled, userState) + { + this.results = results; + } + + /// + public object Result + { + get + { + RaiseExceptionIfNecessary(); + return results[0]; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.3761.0")] + public delegate void invokeSrv_Xml_SessionCompletedEventHandler(object sender, invokeSrv_Xml_SessionCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.3761.0")] + [DebuggerStepThrough()] + [DesignerCategory("code")] + public partial class invokeSrv_Xml_SessionCompletedEventArgs : AsyncCompletedEventArgs + { + + private object[] results; + + internal invokeSrv_Xml_SessionCompletedEventArgs(object[] results, Exception exception, bool cancelled, object userState) : base(exception, cancelled, userState) + { + this.results = results; + } + + /// + public object Result + { + get + { + RaiseExceptionIfNecessary(); + return results[0]; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.3761.0")] + public delegate void invokeSrv_DataTableParameterCompletedEventHandler(object sender, invokeSrv_DataTableParameterCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.3761.0")] + [DebuggerStepThrough()] + [DesignerCategory("code")] + public partial class invokeSrv_DataTableParameterCompletedEventArgs : AsyncCompletedEventArgs + { + + private object[] results; + + internal invokeSrv_DataTableParameterCompletedEventArgs(object[] results, Exception exception, bool cancelled, object userState) : base(exception, cancelled, userState) + { + this.results = results; + } + + /// + public object Result + { + get + { + RaiseExceptionIfNecessary(); + return results[0]; + } + } + + /// + public DataTable pDataTable + { + get + { + RaiseExceptionIfNecessary(); + return (DataTable)results[1]; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.3761.0")] + public delegate void invokeSrv_DataTableCompletedEventHandler(object sender, invokeSrv_DataTableCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.3761.0")] + [DebuggerStepThrough()] + [DesignerCategory("code")] + public partial class invokeSrv_DataTableCompletedEventArgs : AsyncCompletedEventArgs + { + + private object[] results; + + internal invokeSrv_DataTableCompletedEventArgs(object[] results, Exception exception, bool cancelled, object userState) : base(exception, cancelled, userState) + { + this.results = results; + } + + /// + public object Result + { + get + { + RaiseExceptionIfNecessary(); + return results[0]; + } + } + + /// + public DataTable pDataTable + { + get + { + RaiseExceptionIfNecessary(); + return (DataTable)results[1]; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.3761.0")] + public delegate void invokeSrv_DataSetCompletedEventHandler(object sender, invokeSrv_DataSetCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.3761.0")] + [DebuggerStepThrough()] + [DesignerCategory("code")] + public partial class invokeSrv_DataSetCompletedEventArgs : AsyncCompletedEventArgs + { + + private object[] results; + + internal invokeSrv_DataSetCompletedEventArgs(object[] results, Exception exception, bool cancelled, object userState) : base(exception, cancelled, userState) + { + this.results = results; + } + + /// + public object Result + { + get + { + RaiseExceptionIfNecessary(); + return results[0]; + } + } + + /// + public DataSet pDataSet + { + get + { + RaiseExceptionIfNecessary(); + return (DataSet)results[1]; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.3761.0")] + public delegate void invokeSrv_SessionCompletedEventHandler(object sender, invokeSrv_SessionCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.3761.0")] + [DebuggerStepThrough()] + [DesignerCategory("code")] + public partial class invokeSrv_SessionCompletedEventArgs : AsyncCompletedEventArgs + { + + private object[] results; + + internal invokeSrv_SessionCompletedEventArgs(object[] results, Exception exception, bool cancelled, object userState) : base(exception, cancelled, userState) + { + this.results = results; + } + + /// + public object Result + { + get + { + RaiseExceptionIfNecessary(); + return results[0]; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.3761.0")] + public delegate void TestCompletedEventHandler(object sender, TestCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.3761.0")] + [DebuggerStepThrough()] + [DesignerCategory("code")] + public partial class TestCompletedEventArgs : AsyncCompletedEventArgs + { + + private object[] results; + + internal TestCompletedEventArgs(object[] results, Exception exception, bool cancelled, object userState) : base(exception, cancelled, userState) + { + this.results = results; + } + + /// + public string Result + { + get + { + RaiseExceptionIfNecessary(); + return Conversions.ToString(results[0]); + } + } + } +} \ No newline at end of file diff --git a/SRC/MESAgent/MESAutoLoader/AutoLoaderLib/Web References/wsInvoke/Reference.map b/SRC/MESAgent/MESAutoLoader/AutoLoaderLib/Web References/wsInvoke/Reference.map new file mode 100644 index 0000000..4940833 --- /dev/null +++ b/SRC/MESAgent/MESAutoLoader/AutoLoaderLib/Web References/wsInvoke/Reference.map @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/SRC/MESAgent/MESAutoLoader/AutoLoaderLib/Web References/wsInvoke/wsInvoke.disco b/SRC/MESAgent/MESAutoLoader/AutoLoaderLib/Web References/wsInvoke/wsInvoke.disco new file mode 100644 index 0000000..50d9cfb --- /dev/null +++ b/SRC/MESAgent/MESAutoLoader/AutoLoaderLib/Web References/wsInvoke/wsInvoke.disco @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/SRC/MESAgent/MESAutoLoader/AutoLoaderLib/Web References/wsInvoke/wsInvoke.wsdl b/SRC/MESAgent/MESAutoLoader/AutoLoaderLib/Web References/wsInvoke/wsInvoke.wsdl new file mode 100644 index 0000000..b943600 --- /dev/null +++ b/SRC/MESAgent/MESAutoLoader/AutoLoaderLib/Web References/wsInvoke/wsInvoke.wsdl @@ -0,0 +1,427 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Invoke with objects and Return XML + + + + + Invoke with Xml String and Return XML + + + + + EnableSession, Invoke with Xml String and Return XML + + + + + Invoke with DataTable and Object Return XML + + + + + Invoke with DataTable and Return XML + + + + + Invoke with DataSet and Return XML + + + + + EnableSession, Invoke and Return XML + + + + + Web service and database connection test + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/SRC/MESAgent/MESAutoLoader/AutoLoaderLib/app.config b/SRC/MESAgent/MESAutoLoader/AutoLoaderLib/app.config new file mode 100644 index 0000000..cc2db03 --- /dev/null +++ b/SRC/MESAgent/MESAutoLoader/AutoLoaderLib/app.config @@ -0,0 +1,35 @@ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + http://localhost/MESws_Industry/wsInvoke.asmx + + + + diff --git a/SRC/MESAgent/MESAutoLoader/AutoLoaderLib/clsAutoLoaderLibrary.cs b/SRC/MESAgent/MESAutoLoader/AutoLoaderLib/clsAutoLoaderLibrary.cs new file mode 100644 index 0000000..e0c861b --- /dev/null +++ b/SRC/MESAgent/MESAutoLoader/AutoLoaderLib/clsAutoLoaderLibrary.cs @@ -0,0 +1,23914 @@ +using System; +using System.Collections; +using System.Data; +using System.IO; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Text; +using Microsoft.VisualBasic; +using Microsoft.VisualBasic.CompilerServices; +using Microsoft.VisualBasic.FileIO; +using NPOI.HSSF.UserModel; +using NPOI.SS.UserModel; +using NPOI.XSSF.UserModel; +using iMESCore.Settings; +using static iMESCore.DataBase.iMESSql; +using static iMESCore.Base.iMESConst; +using System.Data.Common; + +using System.Collections.Generic; +using System.Linq; +using iMESCore.DataBase; +using Oracle.ManagedDataAccess.Client; +using System.Text.RegularExpressions; + +namespace AutoLoaderLib_Base +{ + + public class clsAutoLoaderLibrary + { + + //private System.Data.OleDb.OleDbCommand cmmTemp; + private string strConnectionString; // Connection string + private string strReportConnectionString; // Report DB Connection string + private string strDataBaseType; // DataBase Type:oracle, mysql, access + private string strMQType; // MessageQueue Type:TIBCO, MQSeries, MSMQ + private string strDataBaseMesOwner; // DataBase Owner MES + private string strDataBaseTestOwner; // DataBase Owner Test + + private AppSettings objSetting = new AppSettings(); + + private string InXml, OutXml, strIdentity, strParameter, XmlData, XmlSchema; + + Collection colTableName = new Collection(); // 儲存Temp Table + // //Initial Object-------------------------------------------------------------------------------------------------------------------------------- + public clsAutoLoaderLibrary() + { + // //Get database type + strDataBaseType = objSetting.GetDataBaseType(); + // //Get connection string + strConnectionString = objSetting.GetConnectionString(strDataBaseType); + // //Get Message Queue Type + strMQType = objSetting.GetMQType(); + // //Get connection string + strReportConnectionString = objSetting.GetReportConnectionString(strDataBaseType); + // //Get database owner MES + strDataBaseMesOwner = objSetting.GetDataBaseOwner(); + // //Get database owner TEST + strDataBaseTestOwner = objSetting.GetDataBaseOwner_DY("TestDataDatabaseOwner"); + // //GetMESWebSer + modWIN.gMESWebServiceHost = System.Configuration.ConfigurationSettings.AppSettings.Get("MESWebServiceHost"); + } + + // //Property-------------------------------------------------------------------------------------------------------------------------------- + public object ConnectionString + { + get + { + return strConnectionString; + } + } + + public object DataBaseType + { + get + { + return strDataBaseType; + } + } + + public object MQType + { + get + { + return strMQType; + } + } + + //Public function---------------------------------------------------------------------------------------------------- + public string ExecuteFunction(string FunctionName, Collection colParameters = null) + { + string ExecuteFunctionRet = default(string); + // 此 Function 將執行傳入之FunctionName + // 傳入值: FunctionName,colParameters + // 傳回值: DataSet(成功), nothing(失敗) + + // colParameters的資料範例如下 + // colParameters.Add("C1", "CustomerNo") + // colParameters.Add("P1", "ProductNo") + + int i; + + try + { + + // 1.處理 FunctionName 大小寫問題 + System.Reflection.MethodInfo[] MyMethodInfos = GetType().GetMethods(System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); // 取出Private的Function + var loopTo = MyMethodInfos.Length - 1; + for (i = 0; i <= loopTo; i++) + { + if ((MyMethodInfos[i].Name.ToUpper() ?? "") == (FunctionName.ToUpper() ?? "")) + { + FunctionName = MyMethodInfos[i].Name; + break; + } + } + + // 2.執行Private Function,傳出DataSet + object objArgs = new object[] { colParameters }; + ExecuteFunctionRet = Conversions.ToString(GetType().InvokeMember(FunctionName, System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.InvokeMethod, null, this, (object[])objArgs)); + } + + catch (Exception e1) + { + ExecuteFunctionRet = "fail"; + throw new Exception("clsAutoLoaderLibrary.ExecuteFunction:" + "{" + FunctionName + "}" + e1.Message); + } + + finally + { + + } + + return ExecuteFunctionRet; + + } + + #region 20230601 注释旧版 + + //#region ---AutoLoader function--- + + //// 廠內設備電性值匯入 + ////private string funImpEQPTestData(Collection colParameters = null) + ////{ + //// string funImpEQPTestDataRet = default(string); + + //// var cnnTemp = default(IDbConnection); + //// var drTemp = default(DbDataReader); + + //// string strJobNo = string.Empty; // JobNo + //// string strSourcePath = string.Empty; // 來源檔案路徑 + //// string strDestinationPath = string.Empty; // 目前檔案路徑 + //// string strQueuePath = string.Empty; // 處理中檔案路徑 + //// string strFailPath = string.Empty; // 失敗檔案路徑 + //// string FileName = string.Empty; // 處理中檔案 + //// string DirName = DateTime.Now.ToString("yyyyMM"); // 分類目錄名稱 + //// bool blnMoveFile = true; + //// string strSQL = string.Empty; + + //// // 固定欄位資料起始位置(第幾列) + //// // 2019/5/28,Ning, WaferID可能不是數值, 為分隔符號, 第幾個Part, 第幾碼-第幾碼 + //// string strWaferIDPos = defString; + //// int intEquipmentNo = defInteger; + //// int intTestDate = defInteger; + //// int intThickNess = defInteger; + //// int intProgramNo = defInteger; + //// int intWaferSize = defInteger; + //// int intColumnStart = defInteger; + //// // 2019/5/30,Ning, 多片格式需定義D_ComponentNo + //// string intD_ComponentNo = defInteger.ToString(); + //// // 2019/5/28,Ning, DataStart可能不是數值, 是固定字串, 該字串出現後的下一列為DataStart + //// string strDataStartPos = defString; + //// // 2019/5/29, 若為MultiWafer則是Excel的讀檔 + //// var blnMultiWafer = default(bool); + + //// string strEquipmentNo; + //// string strTestRecipeType = defString; + //// string strTemp; + + //// var strReadLine = new string[2]; + //// string[] aryWaferInfo = new string[] { defString, defString, defString, defString, defString, defString }; // 存放解析後的Wafer資訊 + //// var fs = default(FileStream); + //// var r = default(StreamReader); + + //// string strFormatFile; // 格式檔路徑+名稱 + //// string strFormatScript; // 格式檔內容 + //// string strFFName = "FormatFile.txt"; + //// StreamWriter sw; + + //// var datEvnetTime = DateTime.Now; + + //// var colSQL_TempTable = new Collection(); + + //// DataTable dtFormatFile; + //// DataView dvFormatFile; + //// DataRow drAdd; + //// int idx; + //// bool blnFound; + //// var intItemNo = default(int); + //// string strExtName, strMSplitSign = default(string), strDSplitSign = default(string); + + //// string strFailLog = ""; + + //// try + //// { + //// // //取出colParameter傳入參數 + //// strJobNo = colParameters["JobNo"].ToString().Trim(); + //// strSourcePath = colParameters["SourcePath"].ToString().Trim(); + //// strDestinationPath = colParameters["DestinationPath"].ToString().Trim(); + //// strQueuePath = colParameters["QueuePath"].ToString().Trim(); + //// strFailPath = colParameters["FailPath"].ToString().Trim(); + + //// // Parameter1為傳入參數,作為機台編號,若無此值則不進行下面的程式 + //// if (colParameters["Parameter1"] == null || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter1"])))) + //// { + //// funImpEQPTestDataRet = "機台編號 not found!!!(Parameter1)"; + //// throw new Exception(funImpEQPTestDataRet); + //// } + //// else + //// { + //// strEquipmentNo = Strings.Trim(Conversions.ToString(colParameters["Parameter1"])); + //// } + //// // Parameter2為傳入參數,作為測試類型(TestRecipeType),若無此值則程式依TestRecipeNo+PSNo找TestRecipeType + //// if (colParameters["Parameter2"] == null || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter2"])))) + //// { + //// } + //// else + //// { + //// strTestRecipeType = Strings.Trim(Conversions.ToString(colParameters["Parameter2"])); + //// } + + //// cnnTemp = CreateConnection(strConnectionString); + + //// dtFormatFile = new DataTable("FormatFile"); + //// dtFormatFile.Columns.Add("ItemNo", Type.GetType("System.Int16")); // 第幾個格式檔, 會與aryFormula(itemno)對應 + //// dtFormatFile.Columns.Add("FFName", Type.GetType("System.String")); // 存完整的FormatFileName.txt + //// dtFormatFile.Columns.Add("ExtName", Type.GetType("System.String")); // 格式檔副檔名, Ex ".csv" + //// dtFormatFile.Columns.Add("FName", Type.GetType("System.String")); // 格式檔去除副檔名 + //// dtFormatFile.Columns.Add("FFLength", Type.GetType("System.Int16")); // 存%前或%後字串的長度 + //// dtFormatFile.Columns.Add("FormatScript", Type.GetType("System.String")); + //// dtFormatFile.Columns.Add("MSplitSign", Type.GetType("System.String")); // 表格分隔符號 + //// dtFormatFile.Columns.Add("DSplitSign", Type.GetType("System.String")); // 明細分隔符號 + //// dtFormatFile.Columns.Add("MultiWafer", Type.GetType("System.Int16")); // 是否為有多筆WaferID的 + //// // 固定參數位置 + //// dtFormatFile.Columns.Add("strWaferIDPos", Type.GetType("System.String")); // WaferID可能不是設數值 + //// dtFormatFile.Columns.Add("intTestDate", Type.GetType("System.Int16")); + //// dtFormatFile.Columns.Add("intEquipmentNo", Type.GetType("System.Int16")); + //// dtFormatFile.Columns.Add("intProgramNo", Type.GetType("System.Int16")); + //// dtFormatFile.Columns.Add("intColumnStart", Type.GetType("System.Int16")); + //// dtFormatFile.Columns.Add("strDataStartPos", Type.GetType("System.String")); + //// dtFormatFile.Columns.Add("intD_ComponentNo", Type.GetType("System.Int16")); + //// // 動態位置 + //// dtFormatFile.Columns.Add("intWaferSize", Type.GetType("System.Int16")); + //// dtFormatFile.Columns.Add("intThickNess", Type.GetType("System.Int16")); + + //// // 取得格式檔 + //// // 2019/2/20, Ning, 同一機台格式檔可能會有多筆 + //// // 2019/5/28, Ning, FileNameFormat支援%在最前面 + //// strSQL = "Select * From tblEQPALScript Where EquipmentNo = '" + strEquipmentNo + "'"; + //// //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + //// drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + //// if (drTemp.HasRows) + //// { + //// idx = 0; + //// while (drTemp.Read()) + //// { + //// idx = idx + 1; + //// // 格式檔名稱直接用FileNameFormat存, FileNameFormat可能為A_AOI%.csv或AQL%.csv等 + //// strFFName = drTemp["FileNameFormat"].ToString(); + //// strExtName = Strings.Right(strFFName, strFFName.Length - strFFName.LastIndexOf(".")); + //// // 格式檔名將副檔名取式為.txt + //// strFFName = Strings.Replace(strFFName, strExtName, ".txt"); + //// // CLOB類型以.ToString轉換之 + //// strFormatScript = drTemp["FormatScript"].ToString(); + + //// // //格式檔已存在必須先刪除 + //// if (File.Exists(strSourcePath + strFFName) == true) + //// { + //// File.Delete(strSourcePath + strFFName); + //// } + + //// // 將strFormatScript寫入strFFName中 + //// fs = new FileStream(strSourcePath + strFFName, FileMode.Create, FileAccess.Write); + //// sw = new StreamWriter(fs, Encoding.Default); + //// sw.WriteLine(strFormatScript); + //// sw.Close(); + //// sw = null; + //// fs.Close(); + //// fs = null; + + //// drAdd = dtFormatFile.NewRow(); + //// drAdd["ItemNo"] = idx; + //// drAdd["FFName"] = strFFName; + //// drAdd["ExtName"] = strExtName; + //// drAdd["FName"] = Strings.Mid(strFFName, 1, strFFName.Length - 4); // 因格式檔固定存為.txt, 故直接取第1碼至長度減4碼 + //// // 去除%與副檔名的長度 + //// drAdd["FFLength"] = drTemp["FileNameFormat"].ToString().Length - 1 - strExtName.Length; + //// drAdd["FormatScript"] = strFormatScript; + //// drAdd["MSplitSign"] = drTemp["MasterSeparateSign"]; + //// drAdd["DSplitSign"] = drTemp["DetailCloumnSeparateSign"]; + //// drAdd["MultiWafer"] = drTemp["MultiWafer"]; // 0:單筆Wafer, 有含公式檔 1:多筆Wafer, 為Excel File + //// dtFormatFile.Rows.Add(drAdd); + //// } + //// } + //// else + //// { + //// funImpEQPTestDataRet = "機台編號: " + strEquipmentNo + " 未設定格式檔!"; + //// throw new Exception(funImpEQPTestDataRet); + //// } + //// drTemp.Close(); + //// //cmmTemp.Dispose(); + + //// var aryFormula = new ArrayList[dtFormatFile.Rows.Count + 1]; + + //// // 解析格式檔將strWaferIDPos, intColumnStart等值存入dtFormatFile中, 公式檔存入aryFormula(ItemNo)中 + //// foreach (DataRow dr in dtFormatFile.Rows) + //// { + + //// // 格式檔路徑: SourcePath & 格式檔名稱 + //// strFormatFile = Conversions.ToString(Operators.ConcatenateObject(strSourcePath, dr["FFName"])); + //// // 參數Reset + //// strWaferIDPos = defString; + //// intTestDate = defInteger; + //// intEquipmentNo = defInteger; + //// intProgramNo = defInteger; + //// intColumnStart = defInteger; + //// strDataStartPos = defString; + //// intWaferSize = defInteger; + //// intThickNess = defInteger; + //// intD_ComponentNo = defInteger.ToString(); + + //// try + //// { + //// var scrFile = new FileInfo(strFormatFile); + //// fs = new FileStream(strFormatFile, FileMode.Open); + //// r = new StreamReader(fs, Encoding.Default); + + //// // 1.先讀取格式檔 + //// if (scrFile.Exists == false) + //// { + //// funImpEQPTestDataRet = "請確認機台格式檔案是否存在!!"; + //// throw new Exception(funImpEQPTestDataRet); + //// } + //// else + //// { + + //// aryFormula[Convert.ToInt32(dr["ItemNo"])] = new ArrayList(); + + //// // 解析格式檔固定資料位置 + //// // 固定參數: WaferID, TestDate, EquipmentNo, ProgramNo, ColumnsStart, DataStart + //// // 動態參數: WaferSize, Thickness + //// while (r.Peek() > -1) + //// { + //// strTemp = r.ReadLine(); + //// strReadLine = Strings.Split(Strings.Trim(strTemp), "=>>"); + //// switch (strReadLine[0].ToUpper() ?? "") + //// { + //// // 固定參數 + //// case "WAFERID": + //// { + //// strWaferIDPos = strReadLine[1]; + //// dr["strWaferIDPos"] = strWaferIDPos; + //// break; + //// } + //// case "TESTDATE": + //// { + //// intTestDate = (int)Math.Round(Conversion.Val(strReadLine[1])); + //// dr["intTestDate"] = intTestDate; + //// break; + //// } + //// case "EQUIPMENTNO": + //// { + //// intEquipmentNo = (int)Math.Round(Conversion.Val(strReadLine[1])); + //// dr["intEquipmentNo"] = intEquipmentNo; + //// break; + //// } + //// case "PROGRAMNO": + //// { + //// intProgramNo = (int)Math.Round(Conversion.Val(strReadLine[1])); + //// dr["intProgramNo"] = intProgramNo; + //// break; + //// } + //// case "COLUMNSSTART": + //// { + //// intColumnStart = (int)Math.Round(Conversion.Val(strReadLine[1])); + //// dr["intColumnStart"] = intColumnStart; + //// break; + //// } + //// case "DATASTART": + //// { + //// strDataStartPos = strReadLine[1]; + //// dr["strDataStartPos"] = strDataStartPos; + //// break; + //// } + //// case "D_COMPONENTNO": + //// { + //// intD_ComponentNo = Conversion.Val(strReadLine[1]).ToString(); + //// dr["intD_ComponentNo"] = intD_ComponentNo; + //// break; + //// } + //// // 動態參數 + //// case "WAFERSIZE": + //// { + //// intWaferSize = (int)Math.Round(Conversion.Val(strReadLine[1])); + //// dr["intWaferSize"] = intWaferSize; + //// break; + //// } + //// case "THICKNESS": + //// { + //// intThickNess = (int)Math.Round(Conversion.Val(strReadLine[1])); + //// dr["intThickNess"] = intThickNess; + //// break; + //// } + + //// default: + //// { + //// if (strReadLine[0].ToUpper().IndexOf("公式") == 0) + //// { + //// aryFormula[Convert.ToInt32(dr["ItemNo"])].Add(strReadLine[1]); + //// } + + //// break; + //// } + //// } + //// } + //// } + //// } + //// catch (Exception ex) + //// { + //// funImpEQPTestDataRet = "格式檔解析失敗! " + strFormatFile + " Error Message :" + ex.Message.ToString(); + //// throw new Exception(funImpEQPTestDataRet); + //// } + + //// if ((strWaferIDPos ?? "") == defString || intColumnStart == defInteger || (strDataStartPos ?? "") == defString) + //// { + //// funImpEQPTestDataRet = "請確認機台格式檔案設定是否正確(WaferID、ColumnsStart、DataStart)!!"; + //// throw new Exception(funImpEQPTestDataRet); + //// } + + //// if (!Information.IsNumeric(strWaferIDPos)) + //// { + //// // ex: -,2,3-9 表示以"-"分隔, 取第2個Part的第3到第9個字元 + //// string[] aryWaferID, aryChar; + //// aryWaferID = Strings.Split(strWaferIDPos, ","); + //// if (aryWaferID.Length != 3) + //// { + //// funImpEQPTestDataRet = "請確認機台格式檔案設定是否正確(WaferID)"; + //// throw new Exception(funImpEQPTestDataRet); + //// } + //// aryChar = aryWaferID[2].Split('-'); + //// if (aryChar.Length != 2) + //// { + //// funImpEQPTestDataRet = "請確認機台格式檔案設定是否正確(WaferID)"; + //// throw new Exception(funImpEQPTestDataRet); + //// } + //// if (!Information.IsNumeric(aryChar[0]) || !Information.IsNumeric(aryChar[0])) + //// { + //// funImpEQPTestDataRet = "請確認機台格式檔案設定是否正確(WaferID)"; + //// throw new Exception(funImpEQPTestDataRet); + //// } + //// if (Operators.CompareString(aryChar[0], aryChar[1], false) > 0) + //// { + //// funImpEQPTestDataRet = "請確認機台格式檔案設定是否正確(WaferID)"; + //// throw new Exception(funImpEQPTestDataRet); + //// } + //// } + //// } // Next of For Each dr As DataRow In dtFormatFile.Rows + + //// // //目錄不存在時必須要先建立 + //// if (Directory.Exists(strQueuePath) == false) + //// { + //// Directory.CreateDirectory(strQueuePath); + //// } + + //// object aryFile = Directory.GetFiles(strSourcePath); + //// DataTable dtFName; + //// string strTmpFName; + + //// dtFName = new DataTable("FName"); + //// dtFName.Columns.Add("FName", Type.GetType("System.String")); // FileName去除副檔名 + + //// dvFormatFile = dtFormatFile.DefaultView; + + //// Array.Sort((Array)aryFile); + + //// // 2.迴圈Raw Data資料讀取 + //// foreach (string fn in (IEnumerable)aryFile) // fn為FileName + //// { + //// try + //// { + //// var fi = new FileInfo(fn); + //// if (File.Exists(fn) == true && dtFormatFile.Select("FFName = '" + fi.Name + "'").Length == 0) // 此檔案存在且不為格式檔(格式檔名會存在dtFormatFile.FFName中) + //// { + + //// FileName = fn; + + //// // 依檔名找到符合的格式檔 + //// // 符合以長度大的優先 + //// blnFound = false; + //// strExtName = Strings.Right(fi.Name, fi.Name.Length - fi.Name.LastIndexOf(".")); // 副檔名 + //// strTmpFName = Strings.Mid(fi.Name, 1, fi.Name.Length - strExtName.Length); // 去除副檔名的檔名 + + //// dtFName.Clear(); + //// drAdd = dtFName.NewRow(); + //// drAdd["FName"] = strTmpFName; + //// dtFName.Rows.Add(drAdd); + + //// // 副檔名需與格式檔副檔名相符 + //// dvFormatFile.RowFilter = "ExtName = '" + strExtName + "'"; + //// dvFormatFile.Sort = "FFLength Desc"; + //// for (int i = 0, loopTo = dvFormatFile.Count - 1; i <= loopTo; i++) + //// { + //// if (dtFName.Select(Conversions.ToString(Operators.ConcatenateObject(Operators.ConcatenateObject("FName Like '", dvFormatFile[i]["FName"]), "'"))).Length > 0) + //// { + //// blnFound = true; + //// } + + //// if (blnFound == true) + //// { + //// intItemNo = Conversions.ToInteger(dvFormatFile[i]["ItemNo"]); + //// strWaferIDPos = Conversions.ToString(Interaction.IIf(dvFormatFile[i]["strWaferIDPos"] is DBNull, defString, dvFormatFile[i]["strWaferIDPos"])); + //// intTestDate = Conversions.ToInteger(Interaction.IIf(dvFormatFile[i]["intTestDate"] is DBNull, defInteger, dvFormatFile[i]["intTestDate"])); + //// intEquipmentNo = Conversions.ToInteger(Interaction.IIf(dvFormatFile[i]["intEquipmentNo"] is DBNull, defInteger, dvFormatFile[i]["intEquipmentNo"])); + //// intWaferSize = Conversions.ToInteger(Interaction.IIf(dvFormatFile[i]["intWaferSize"] is DBNull, defInteger, dvFormatFile[i]["intWaferSize"])); + //// intThickNess = Conversions.ToInteger(Interaction.IIf(dvFormatFile[i]["intThickNess"] is DBNull, defInteger, dvFormatFile[i]["intThickNess"])); + //// intProgramNo = Conversions.ToInteger(Interaction.IIf(dvFormatFile[i]["intProgramNo"] is DBNull, defInteger, dvFormatFile[i]["intProgramNo"])); + //// intColumnStart = Conversions.ToInteger(Interaction.IIf(dvFormatFile[i]["intColumnStart"] is DBNull, defInteger, dvFormatFile[i]["intColumnStart"])); + //// strDataStartPos = Conversions.ToString(Interaction.IIf(dvFormatFile[i]["strDataStartPos"] is DBNull, defInteger, dvFormatFile[i]["strDataStartPos"])); + //// intD_ComponentNo = Conversions.ToString(Interaction.IIf(dvFormatFile[i]["intD_ComponentNo"] is DBNull, defInteger, dvFormatFile[i]["intD_ComponentNo"])); + + //// // 表頭分隔字元, 沒設定預設為":" + //// if (dvFormatFile[i]["MSplitSign"] is DBNull) + //// { + //// strMSplitSign = ":"; + //// } + //// else + //// { + //// strMSplitSign = dvFormatFile[i]["MSplitSign"].ToString(); + //// if (strMSplitSign.ToUpper() == "TAB") + //// { + //// strMSplitSign = Constants.vbTab; + //// } + //// } + + //// // 明細分隔字元, 沒設定預設為"," + //// if (dvFormatFile[i]["DSplitSign"] is DBNull) + //// { + //// strDSplitSign = ","; + //// } + //// else + //// { + //// strDSplitSign = dvFormatFile[i]["DSplitSign"].ToString(); + //// if (strDSplitSign.ToUpper() == "TAB") + //// { + //// strDSplitSign = Constants.vbTab; + //// } + //// } + + //// if (dvFormatFile[i]["MultiWafer"].ToString() == "1") + //// { + //// blnMultiWafer = true; + //// } + //// else + //// { + //// blnMultiWafer = false; + //// } + + //// break; + //// } + //// } + + //// if (blnFound == false) + //// { + //// funImpEQPTestDataRet = "檔案: " + fi.Name + " 找不到符合檔名的格式檔!"; + //// throw new Exception(funImpEQPTestDataRet); + //// } + + //// // //移動檔案Source至Queue + //// try + //// { + //// blnMoveFile = true; + //// File.Move(fn, strQueuePath + Path.GetFileName(fn)); + //// } + //// catch (Exception ex) + //// { + //// blnMoveFile = false; + //// funImpEQPTestDataRet = ex.Message; + //// throw new Exception(funImpEQPTestDataRet); + //// // Throw New System.Exception("此執行程序已中止,由另一執行程序處理中!!") + //// } + + //// if (blnMultiWafer) // Excel格式的讀檔 + //// { + //// try + //// { + //// // //將檔案來源改為Queue + //// FileName = strQueuePath + Path.GetFileName(fn); + + //// // 解析Excel檔案, 將資料存入MES TestSummary + //// // 目前僅支援只有單身的, 故不需傳入DataStart與ColumnStart + //// if (fuExcelDataToTestSum_EQP(FileName, strTestRecipeType, aryFormula[intItemNo], strEquipmentNo, Conversions.ToInteger(intD_ComponentNo), fi.Name.ToString()) == false) + //// { + //// throw new Exception(); + //// } + //// } + + //// catch (Exception ex) + //// { + //// funImpEQPTestDataRet = "格式檔案解析Excel存入MES TestSummary 資料表失敗: " + ex.Message; + //// throw new Exception(funImpEQPTestDataRet); + //// } + //// } + //// else + //// { + //// try + //// { + //// // //將檔案來源改為Queue + //// FileName = strQueuePath + Path.GetFileName(fn); + + //// colSQL_TempTable.Clear(); + + //// // 2.1解析Raw Data 存入TempTable做資料備查 + //// if (fuRawDataToTempTable_EQP(FileName, strMSplitSign, strDSplitSign, + //// strWaferIDPos, intTestDate, intEquipmentNo, intWaferSize, intThickNess, + //// intProgramNo, intColumnStart, strDataStartPos, ref aryWaferInfo, strEquipmentNo, + //// fi.Name.ToString(), colSQL_TempTable) == false) + //// { + //// throw new System.Exception(); + //// } + + //// } + + //// catch (Exception ex) + //// { + //// funImpEQPTestDataRet = "解析Raw Data 存入TempTable做資料備查失敗: " + ex.Message; + //// throw new Exception(funImpEQPTestDataRet); + //// } + + //// try + //// { + //// // 2.2依照格式檔案定義計算存入MES TestSummary 資料表 + //// if (fuLEDDataSummary_EQP(strTestRecipeType, aryFormula[intItemNo], aryWaferInfo, strEquipmentNo, fi.Name.ToString(), ref colSQL_TempTable) == false) + //// { + //// throw new Exception(); + //// } + //// } + //// catch (Exception ex) + //// { + //// funImpEQPTestDataRet = "格式檔案定義計算存入MES TestSummary 資料表失敗: " + ex.Message; + //// throw new Exception(funImpEQPTestDataRet); + //// } + + //// } // End If of If blnMultiWafer + + //// // //目錄不存在時必須要先建立 + //// if (Directory.Exists(strDestinationPath + DirName) == false) + //// { + //// Directory.CreateDirectory(strDestinationPath + DirName); + //// } + //// // //檔案已存在Destination必須先刪除 + //// if (File.Exists(strDestinationPath + DirName + @"\" + Path.GetFileName(FileName)) == true) + //// { + //// File.Delete(strDestinationPath + DirName + @"\" + Path.GetFileName(FileName)); + //// } + //// // //移動檔案Queue至Destination + //// File.Move(FileName, strDestinationPath + DirName + @"\" + Path.GetFileName(FileName)); + + //// FileName = ""; + //// } + //// } + + //// catch (Exception ex) + //// { + //// // //檔案處理失敗時移動檔案至Fail + //// if (!string.IsNullOrEmpty(FileName)) + //// { + //// // //目錄不存在時必須要先建立 + //// if (Directory.Exists(strFailPath + DirName) == false) + //// { + //// Directory.CreateDirectory(strFailPath + DirName); + //// } + //// // //檔案已存在File必須先刪除 + //// if (File.Exists(strFailPath + DirName + @"\" + Path.GetFileName(FileName)) == true) + //// { + //// File.Delete(strFailPath + DirName + @"\" + Path.GetFileName(FileName)); + //// } + //// // //移動檔案至Fail + //// try + //// { + //// File.Move(FileName, strFailPath + DirName + @"\" + Path.GetFileName(FileName)); + //// } + //// catch (Exception ex1) + //// { + //// } + + //// // 記錄錯誤的FileName + //// strFailLog = strFailLog + "[" + Path.GetFileName(FileName) + "][" + ex.Message + "]" + Constants.vbCrLf; + + //// FileName = ""; + //// } + + //// // 一個檔案失敗繼續讀取下個檔案 + //// continue; + + //// } + + //// } // Next of For Each fn As String In aryFile + + //// funImpEQPTestDataRet = "success"; + //// } + + //// catch (Exception e1) + //// { + + //// strFailLog = strFailLog + "[" + e1.Message + "]" + Constants.vbCrLf; + //// } + + //// // 2019/8/12,Ning, 已改在上面的Loop中處理檔案移動至Fail目錄 + //// // //檔案處理失敗時移動檔案Queue至Fail + //// // If FileName <> String.Empty AndAlso blnMoveFile = True Then + //// // '//目錄不存在時必須要先建立 + //// // If My.Computer.FileSystem.DirectoryExists(strFailPath & DirName) = False Then + //// // My.Computer.FileSystem.CreateDirectory(strFailPath & DirName) + //// // End If + //// // '//檔案已存在File必須先刪除 + //// // If File.Exists(strFailPath & DirName & "\" & Path.GetFileName(FileName)) = True Then + //// // File.Delete(strFailPath & DirName & "\" & Path.GetFileName(FileName)) + //// // End If + //// // '//移動檔案Queue至Fail + //// // Try + //// // File.Move(FileName, strFailPath & DirName & "\" & Path.GetFileName(FileName)) + //// // Catch ex1 As Exception + //// // End Try + //// // End If + //// // //回傳錯誤原因 + //// // funImpEQPTestData = "[JobNo:" & strJobNo & "][FunctionNo:funImpEQPTestData][FileName:" & Path.GetFileName(FileName) & "][" & e1.Message & ",StackTrace:" & e1.StackTrace & "]" + + //// finally + //// { + + //// CloseConnection(cnnTemp); + //// if (!(drTemp == null)) + //// drTemp.Close(); + //// //if (!(cmmTemp == null)) + //// // cmmTemp.Dispose(); + //// if (r != null) + //// r.Close(); + //// if (fs != null) + //// fs.Close(); + + //// if (!string.IsNullOrEmpty(strFailLog)) + //// { + //// funImpEQPTestDataRet = CombineFailMsg("0000-999999", "[JobNo:" + strJobNo + "][FunctionNo:funImpEQPTestData]" + strFailLog); + //// } + + //// } + + //// return funImpEQPTestDataRet; + + ////} + + //private bool fuRawDataToTempTable_EQP(string pFilePath, string strMSplitSign, string strDSplitSign, + // string strWaferIDPos, int intTestDate, + // int intEquipmentNo, int intWaferSize, + // int intThickness, int intProgramNo, + // int intColumnStart, string strDataStartPos, + // ref string[] aryWaferInfo, string EquipmentNo, + // string FileName, Collection colSQL = null) + //{ + + // bool blnResult; + // var objReader = default(StreamReader); + // // 2019/3/26, Ning, 加入Encode, 排除中文亂碼問題 + // // 2019/3/28, Ning, TestDate預設為目前時間, ProgramNo預設為N/A + // // Dim encode As System.Text.Encoding = System.Text.Encoding.GetEncoding("UTF-8") + // var encode = Encoding.Default; + // string strLine; + // var strWaferID = default(string); + // var strTestDate = default(string); + // string strFileEquipmentNo; + // string strWaferSize; + // string strThickness; + // string strProgramNo; + // string[] aryTemp; + // var dtData = default(DataTable); + // short i; + // bool blnDataAdd = false; + // string strOrgColName, strColumnName; + // DataRow drAdd; + // string strSQL, strSQLColumn, strTableName, strSQLAddField, strSQLAddValue; + // var CollectionSQL = new Collection(); + + // IDbConnection cnnTemp = null; + // DbDataReader drTemp; + + // int intWaferID = defInteger; + // int intDataStart = defInteger; + // int x = 0; + + // try + // { + + // // //Create connection + // cnnTemp = CreateConnection(strConnectionString); + + // blnResult = false; + + // objReader = new StreamReader(pFilePath, encode); + // // 先讀取第一列, 再以第一列的編碼方式讀檔 + // strLine = objReader.ReadLine().Trim(); + // encode = objReader.CurrentEncoding; + // objReader.Close(); + // objReader = null; + // objReader = new StreamReader(pFilePath, encode); + + // // 當WaferID位置為數值時, 同原本處理方式取得檔案內的WaferID + // if (Information.IsNumeric(strWaferIDPos)) + // { + // intWaferID = Conversions.ToInteger(strWaferIDPos); + // } + // // 當DataStart位置為數值時, 同原本處理方式 + // if (Information.IsNumeric(strDataStartPos)) + // { + // intDataStart = Conversions.ToInteger(strDataStartPos); + // } + // else // 非數值, 先掃一次檔案, 找到固定字串的列數+1為intDataStart + // { + // x = 0; + // while (!objReader.EndOfStream) + // { + // x = x + 1; + // strLine = objReader.ReadLine(); + // if ((strLine.ToUpper() ?? "") == (strDataStartPos.ToUpper() ?? "")) + // { + // intDataStart = x + 1; + // break; + // } + // } + // objReader.Close(); + // objReader = null; + // objReader = new StreamReader(pFilePath, encode); + // } + + // x = 0; + // while (!objReader.EndOfStream) + // { + // x = x + 1; + + // strLine = objReader.ReadLine(); + + // if (strLine != null && !string.IsNullOrEmpty(strLine.Trim())) + // { + + // if (x == intWaferID) // 1.取得WaferID + // { + // // 2019/2/20, Ning, 以傳入的表頭分隔字元拆解 + // aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + // if (aryTemp.Length > 1) + // { + // strWaferID = aryTemp[1].ToString().Trim(); + // // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + // if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + // { + // if (Strings.Left(strWaferID, 1) == Conversions.ToString('"') && Strings.Right(strWaferID, 1) == Conversions.ToString('"')) + // { + // strWaferID = Strings.Mid(strWaferID, 2, Strings.Len(strWaferID) - 2); + // } + // } + // if (string.IsNullOrEmpty(strWaferID)) + // { + // throw new Exception("無法取得WaferID!!"); + // } + // else + // { + // aryWaferInfo[0] = strWaferID; + // } + // } + // else + // { + // throw new Exception("不支援此檔案格式,Raw Data格式內容資料解析需為" + strMSplitSign); + // } + // } + + // if (x == intTestDate) // 2.取得測試時間 + // { + // // 2019/2/20, Ning, 以傳入的表頭分隔字元拆解 + // aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + // if (aryTemp.Length > 1) + // { + // // 因日期格式中可能有/或:會作為分隔符號, 需特別處理 + // if (strMSplitSign == ":" || strMSplitSign == "/") + // { + // for (int k = 1, loopTo = aryTemp.Length - 1; k <= loopTo; k++) + // strTestDate = strTestDate + aryTemp[k].ToString().Trim() + strMSplitSign; + // // 刪除最後的分隔符號":"或"/" + // // 2019/6/26, Ning, 若分隔符號太多, 有多餘的分隔符號, 會不只一個 :或/ + // while ((Strings.Right(strTestDate, 1) ?? "") == (strMSplitSign ?? "")) + // strTestDate = Strings.Mid(strTestDate, 1, Strings.Len(strTestDate) - 1); + // // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + // if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + // { + // if (Strings.Left(strTestDate, 1) == Conversions.ToString('"') && Strings.Right(strTestDate, 1) == Conversions.ToString('"')) + // { + // strTestDate = Strings.Mid(strTestDate, 2, Strings.Len(strTestDate) - 2); + // } + // } + // aryWaferInfo[1] = strTestDate; + // } + // else + // { + // strTestDate = aryTemp[1].ToString().Trim(); + // // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + // if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + // { + // if (Strings.Left(strTestDate, 1) == Conversions.ToString('"') && Strings.Right(strTestDate, 1) == Conversions.ToString('"')) + // { + // strTestDate = Strings.Mid(strTestDate, 2, Strings.Len(strTestDate) - 2); + // } + // } + // aryWaferInfo[1] = strTestDate; + // } + // } + // else + // { + // throw new Exception("不支援此檔案格式,Raw Data格式內容資料解析需為" + strMSplitSign); + // } + // } + + // if (x == intEquipmentNo) // 3.取得設備編號 + // { + // // 2019/2/20, Ning, 以傳入的表頭分隔字元拆解 + // aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + // if (aryTemp.Length > 1) + // { + // strFileEquipmentNo = aryTemp[1].ToString().Trim(); + // // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + // if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + // { + // if (Strings.Left(strFileEquipmentNo, 1) == Conversions.ToString('"') && Strings.Right(strFileEquipmentNo, 1) == Conversions.ToString('"')) + // { + // strFileEquipmentNo = Strings.Mid(strFileEquipmentNo, 2, Strings.Len(strFileEquipmentNo) - 2); + // } + // } + // aryWaferInfo[2] = strFileEquipmentNo; + // } + // else + // { + // throw new Exception("不支援此檔案格式,Raw Data格式內容資料解析需為" + strMSplitSign); + // } + // } + + // if (x == intWaferSize) // 4.取得Wafer尺寸 + // { + // // 2019/2/20, Ning, 以傳入的表頭分隔字元拆解 + // aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + // if (aryTemp.Length > 1) + // { + // strWaferSize = aryTemp[1].ToString().Trim(); + // // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + // if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + // { + // if (Strings.Left(strWaferSize, 1) == Conversions.ToString('"') && Strings.Right(strWaferSize, 1) == Conversions.ToString('"')) + // { + // strWaferSize = Strings.Mid(strWaferSize, 2, Strings.Len(strWaferSize) - 2); + // } + // } + // aryWaferInfo[3] = strWaferSize; + // } + // else + // { + // throw new Exception("不支援此檔案格式,Raw Data格式內容資料解析需為" + strMSplitSign); + // } + // } + + // if (x == intThickness) // 5.取得厚度 + // { + // // 2019/2/20, Ning, 以傳入的表頭分隔字元拆解 + // aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + // if (aryTemp.Length > 1) + // { + // strThickness = aryTemp[1].ToString().Trim(); + // // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + // if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + // { + // if (Strings.Left(strThickness, 1) == Conversions.ToString('"') && Strings.Right(strThickness, 1) == Conversions.ToString('"')) + // { + // strThickness = Strings.Mid(strThickness, 2, Strings.Len(strThickness) - 2); + // } + // } + // aryWaferInfo[4] = strThickness; + // } + // else + // { + // throw new Exception("不支援此檔案格式,Raw Data格式內容資料解析需為" + strMSplitSign); + // } + // } + + // if (x == intProgramNo) // 6.取得測試程式編號 + // { + // // 2019/2/20, Ning, 以傳入的表頭分隔字元拆解 + // aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + // if (aryTemp.Length > 1) + // { + // strProgramNo = aryTemp[1].ToString().Trim(); + // // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + // if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + // { + // if (Strings.Left(strProgramNo, 1) == Conversions.ToString('"') && Strings.Right(strProgramNo, 1) == Conversions.ToString('"')) + // { + // strProgramNo = Strings.Mid(strProgramNo, 2, Strings.Len(strProgramNo) - 2); + // } + // } + // aryWaferInfo[5] = strProgramNo; + // } + // else + // { + // throw new Exception("不支援此檔案格式,Raw Data格式內容資料解析需為" + strMSplitSign); + // } + // } + + // if (x == intColumnStart) // 取得欄位名稱 + // { + // try + // { + // dtData = new DataTable("CSVData"); + + // // 2019/2/20,Ning明細以strDSplitSign分隔 + // // 若結尾為strDSplitSign則去掉 + // if (strLine.EndsWith(strDSplitSign)) + // { + // strLine = strLine.TrimEnd(Conversions.ToChar(strDSplitSign)); + // } + + // aryTemp = strLine.Split(Conversions.ToChar(strDSplitSign)); + + // drAdd = dtData.NewRow(); + // var loopTo1 = (short)(aryTemp.Length - 1); + // for (i = 0; i <= loopTo1; i++) + // { + // // 新增 Column + // if (dtData.Columns.Count <= i) + // { + + // strOrgColName = aryTemp[i].ToString().ToUpper().Trim(); + // // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + // if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + // { + // if (Strings.Left(strOrgColName, 1) == Conversions.ToString('"') && Strings.Right(strOrgColName, 1) == Conversions.ToString('"')) + // { + // strOrgColName = Strings.Mid(strOrgColName, 2, Strings.Len(strOrgColName) - 2); + // } + // } + + // strColumnName = strOrgColName; + + // // 欄位名稱只能是數字或英文字母, 這兩者除外的皆以_取代 + // for (int jj = 0, loopTo2 = strColumnName.Length - 1; jj <= loopTo2; jj++) + // { + // if (!char.IsNumber(Conversions.ToChar(strColumnName.Substring(jj, 1))) && !char.IsLetter(Conversions.ToChar(strColumnName.Substring(jj, 1)))) + // { + // strColumnName = Strings.Replace(strColumnName, strColumnName.Substring(jj, 1), "_"); + // } + // } + + // if (string.IsNullOrEmpty(strColumnName)) + // { + // strColumnName = "COL" + i; + // } + + // // 判斷取代後的欄位是否已存在,若已存在則於欄位後方加COL+欄位顯示順序 + // if (dtData.Columns.Contains(strColumnName)) + // { + // strColumnName = strColumnName + "COL" + i; + // } + + // // Memory Table欄位開String + // dtData.Columns.Add(strColumnName.ToUpper(), Type.GetType("System.String")); + + // } + // } + // } + + // catch + // { + // throw; + // } + // } + + // if (x == intDataStart || blnDataAdd == true) // 取得Raw Data資料 + // { + // blnDataAdd = true; + + // try + // { + // aryTemp = strLine.Split(Conversions.ToChar(strDSplitSign)); + + // drAdd = dtData.NewRow(); + // // 填入資料 + // var loopTo3 = (short)(dtData.Columns.Count - 1); + // for (i = 0; i <= loopTo3; i++) + // { + // // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + // if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + // { + // if (Strings.Left(aryTemp[i], 1) == Conversions.ToString('"') && Strings.Right(aryTemp[i], 1) == Conversions.ToString('"')) + // { + // aryTemp[i] = Strings.Mid(aryTemp[i], 2, Strings.Len(aryTemp[i]) - 2); + // } + // } + // drAdd[i] = Strings.Trim(aryTemp[i]); + // } + // dtData.Rows.Add(drAdd); + // } + // catch (Exception ex) + // { + // throw; + // } + // } + + // } + // } + + // // 若intWaferID=0, 則WaferID為檔名(去除副檔名) + // if (intWaferID == 0) + // { + // strWaferID = FileName.Substring(0, FileName.LastIndexOf(".")); + // aryWaferInfo[0] = strWaferID; + // } + // // 2019/5/28,Ning, WaferID不為數值, Ex. -,2,3-9 + // if (!Information.IsNumeric(strWaferIDPos)) + // { + // string[] aryWaferID, aryChar; + // string strSplitChar; + // int intPart, intLength; + // strWaferID = FileName.Substring(0, FileName.LastIndexOf(".")); + // aryWaferID = strWaferIDPos.Split(','); + // strSplitChar = aryWaferID[0]; + // intPart = Conversions.ToInteger(aryWaferID[1]); + // aryChar = aryWaferID[2].Split('-'); + // intLength = (int)Math.Round(Conversions.ToDouble(aryChar[1]) - Conversions.ToDouble(aryChar[0]) + 1d); + // aryWaferID = strWaferID.Split(Conversions.ToChar(strSplitChar)); + // strWaferID = Strings.Mid(aryWaferID[intPart - 1], Conversions.ToInteger(aryChar[0]), intLength); + // aryWaferInfo[0] = strWaferID; + // } + // // 若TestDate為空則以目前時間為TestDate + // if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(aryWaferInfo[1], defString, false))) + // { + // aryWaferInfo[1] = Strings.Format(DateTime.Now, "yyyy/MM/dd hh:mm:ss"); + // } + // // 若ProgramNo為空, 則以N/A代入 + // if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(aryWaferInfo[5], defString, false))) + // { + // aryWaferInfo[5] = "N/A"; + // } + // // 若未傳入EquipmentNo, 則用Parameter1的值填入 + // // 2019/7/9,Ning, aryWaferInfo[2]存的是檔案內的EquipmentNo, 檔案內沒有就維持預設值, 不存入XML中的EquipmentNo + // // If IsNothing(aryWaferInfo[2]) OrElse aryWaferInfo[2].ToString.Trim = "" Then + // // aryWaferInfo[2] = EquipmentNo + // // End If + + // strSQLColumn = ""; + // foreach (DataColumn column in dtData.Columns) + // // strSQLColumn = strSQLColumn + column.ColumnName & " VARCHAR2(50)," + // // 欄位皆以Number(16,4)儲存運算 + // strSQLColumn = strSQLColumn + "\"" + column.ColumnName + "\"" + " NUMBER(16,4),"; + + // if (Strings.InStr(1, strSQLColumn, ",") != 0) // 刪除最後一個"," + // { + // if (Strings.Right(strSQLColumn, 1) == ",") + // { + // strSQLColumn = Strings.Mid(strSQLColumn, 1, Strings.Len(strSQLColumn) - 1); + // } + // } + + // // 指定暫存資料 Temp_機台編號 + // strTableName = "Temp" + "_" + EquipmentNo; + + // // 先刪除Table,若出錯用try...catch避開 + // try + // { + // strSQL = "Select Table_Name From User_Tables Where Table_Name = '" + strTableName.ToUpper() + "'"; + // //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + // drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + // if (drTemp.HasRows) + // { + // strSQL = " Drop Table " + strTableName; + // string argstrDatabaseType = Conversions.ToString(DataBaseType); + // ExecuteSQLNoneQuery(argstrDatabaseType, strConnectionString, ref strSQL); + // // CollectionSQL.Add(strSQL) + // } + // drTemp.Close(); + // //cmmTemp.Dispose(); + // // Create 暫存Table + // // 2018/05/14 Josh 增加WaferID欄位 + // // strSQL = " Create Table " & strTableName & "(SequenceNo NUMBER(20),WaferID VARCHAR2(20), " & strSQLColumn & ")" + // // 2018/11/6, Ning 使用 Oracle Temporary Table + // strSQL = " Create Global Temporary Table " + strTableName + "(SequenceNo NUMBER(20),WaferID VARCHAR2(30), " + strSQLColumn + ")"; + // string argstrDatabaseType1 = Conversions.ToString(DataBaseType); + // ExecuteSQLNoneQuery(argstrDatabaseType1, strConnectionString, ref strSQL); + // } + // // CollectionSQL.Add(strSQL) + // catch (Exception ex) + // { + // throw ex; + // } + + // // 寫入Raw Data + // strSQLAddField = "Insert into " + strTableName + " ("; + // strSQLAddValue = " Values ("; + + // for (int j = 0, loopTo4 = dtData.Rows.Count - 1; j <= loopTo4; j++) + // { + + // // 增加流水號 + // strSQLAddField = strSQLAddField + "SequenceNo,"; + // strSQLAddValue = strSQLAddValue + (j + 1) + ","; + + // // 增加WaferID + // strSQLAddField = strSQLAddField + "WaferID,"; + // strSQLAddValue = strSQLAddValue + "'" + strWaferID + "',"; + + // // 2019/6/5,Ning,以下程式取自錸創, 但實測後都會跑到"System.String"中, 以String的方式加入, 程式先保留不做調整 + // var loopTo5 = (short)(dtData.Columns.Count - 1); + // for (i = 0; i <= loopTo5; i++) + // { + // // 2019/6/12,Ning,非數值的欄位皆填definteger,因非數值的欄位不做運算, 只是方便填入TempTable中 + // if (!Information.IsNumeric(dtData.Rows[j][i].ToString())) + // { + // strSQLAddField = strSQLAddField + "\"" + dtData.Columns[i].ColumnName.ToString() + "\","; + // strSQLAddValue = strSQLAddValue + "'" + defInteger + "',"; + // } + // else + // { + // strSQLAddField = strSQLAddField + "\"" + dtData.Columns[i].ColumnName.ToString() + "\","; + // strSQLAddValue = strSQLAddValue + "'" + dtData.Rows[j][i].ToString() + "',"; + // } + // // Select Case dtData.Rows(j).Item(i).GetType.ToString + // // Case "System.String" + // // strSQLAddField = strSQLAddField & """" & dtData.Columns(i).ColumnName.ToString & """," + // // strSQLAddValue = strSQLAddValue & "'" & dtData.Rows(j).Item(i).ToString & "'," + // // Case "System.Decimal" + // // strSQLAddField = strSQLAddField & dtData.Columns(i).ColumnName.ToString & "," + // // strSQLAddValue = strSQLAddValue & dtData.Rows(j).Item(i).ToString & "," + // // Case "System.DateTime" + // // strSQLAddField = strSQLAddField & dtData.Columns(i).ColumnName.ToString & "," + // // strSQLAddValue = strSQLAddValue & "To_Date('" & Format(dtData.Rows(j).Item(i), "yyyy/MM/dd H:mm:ss") & "','YYYY/MM/DD HH24:MI:SS')," + // // Case "System.DBNull" + // // '未處理 + // // End Select + + // } + + // if (Strings.InStr(1, strSQLAddField, ",") != 0) // 刪除最後一個"," + // { + // if (Strings.Right(strSQLAddField, 1) == ",") + // { + // strSQLAddField = Strings.Mid(strSQLAddField, 1, Strings.Len(strSQLAddField) - 1); + // } + // } + + // if (Strings.InStr(1, strSQLAddValue, ",") != 0) // 刪除最後一個"," + // { + // if (Strings.Right(strSQLAddValue, 1) == ",") + // { + // strSQLAddValue = Strings.Mid(strSQLAddValue, 1, Strings.Len(strSQLAddValue) - 1); + // } + // } + + // // 直接給定strSQL + // strSQL = strSQLAddField + ")" + strSQLAddValue + ")"; + + // // //新增一筆Data指令加入集合內 + // CollectionSQL.Add(strSQL); + + // strSQLAddField = "Insert into " + strTableName + " ("; + // strSQLAddValue = " Values ("; + // } + + // // //執行SQL指令 + // if (colSQL == null) + // { + // string argstrDatabaseType2 = Conversions.ToString(DataBaseType); + // ExecuteSQLNoneQuery_UPD(argstrDatabaseType2, strConnectionString, CollectionSQL); + // } + // else + // { + // // 不執行指令,將指令傳出 + // var loopTo6 = (short)CollectionSQL.Count; + // for (i = 1; i <= loopTo6; i++) + // colSQL.Add(CollectionSQL[i]); + // } + + // objReader.Close(); + + // blnResult = true; + // } + + // catch (Exception ex) + // { + // throw; + // } + + // finally + // { + // CloseConnection(cnnTemp); + + // objReader.Close(); + // objReader = null; + // aryTemp = null; + // } + + // return blnResult; + + //} + + //private bool fuLEDDataSummary_EQP(string strTestRecipeType, ArrayList aryFormula, String[] aryWaferInfo, string EquipmentNo, string FileName, ref Collection colSQL_TempTable) + //{ + + // bool blnResult = false; + // string[] aryTemp; + // string strWaferID; + // DataTable dtData; + // bool blnDataAdd = false; + // string strColumnName = defString; + // string strFormulaSQL = defString; + // string strCalResult; // 儲存SQL公式計算完的結果 + // DataRow drAdd; + // string strSQL, strSQLColumn, strTableName, strSQLAddField, strSQLAddValue; + // var CollectionSQL = new Collection(); + // DateTime datEventTime; + // string strTempTable; + // var strReadFormula = new string[2]; + + // IDbConnection cnnTemp = null; + // DbDataReader drTemp; + // DbDataReader drTemp_RPT; + + // string LotNo, LogGroupSerial, PSNo, TestRecipeType = default(string); + // DataSet dsTemp; + // //System.Data.OleDb.OleDbDataAdapter daTemp; + // DataTable dtTestRecipe; + // string strLogTableName, strSQLHead, strSQLLogHead; + + // //IDbTransaction oTrans; + // DataRow[] drSel; + + // try + // { + // datEventTime = DateTime.Now; + + // // //Create connection + // cnnTemp = CreateConnection(strConnectionString); + + // strWaferID = aryWaferInfo[0].ToString(); + + // // 取得LotNo, LogGroupSerial + // strSQL = "Select A.LotNo From tblWIPComponentState A, tblWIPLotState B Where A.LotNo = B.LotNo And A.ComponentNo = '" + strWaferID + "'" + " And B.Status In (0,1,2,3,4,5)"; + // //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + // drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + // if (drTemp.Read()) + // { + // LotNo = Conversions.ToString(drTemp["LotNo"]); + // } + // else + // { + // throw new Exception("解析檔案失敗,ComponentNo: " + strWaferID + " 無法找到對應的 LotNo,請檢查檔案:" + FileName); + // } + // drTemp.Close(); + // //cmmTemp.Dispose(); + + // strSQL = "Select LogGroupSerial, PSNo From tblWIPLotState Where LotNo = '" + LotNo + "'"; + // //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + // drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + // if (drTemp.Read()) + // { + // if (string.IsNullOrEmpty(drTemp["LogGroupSerial"].ToString())) + // { + // throw new Exception("解析檔案失敗,LotNo: " + LotNo + " 之LogGroupSerial為空!"); + // } + // LogGroupSerial = Conversions.ToString(drTemp["LogGroupSerial"]); + // PSNo = Conversions.ToString(drTemp["PSNo"]); + // } + // else + // { + // throw new Exception("解析檔案失敗,LotNo: " + LotNo + " 無法找到生產批現況!"); + // } + // drTemp.Close(); + // //cmmTemp.Dispose(); + + // // 2019/5/30, Ning, 若AutoLoaderJob.xml的Parameter2有定義TestRecipeType, 則以該值為優先, 若沒有定再以下述方式找TestRecipeType + // if ((strTestRecipeType ?? "") != defString) + // { + // TestRecipeType = strTestRecipeType; + // } + // // 依格式檔內的參數編號及生產批所在區域取得TestRecipeType + // else if (aryFormula.Count > 0) + // { + // strReadFormula = Strings.Split(Strings.Trim(aryFormula[0].ToString()), ":"); + // strColumnName = strReadFormula[0].ToUpper(); + + // strSQL = "Select TestRecipeType From tblSYSTestRecipeBasis Where TestRecipeNo = '" + strColumnName + "' And PSNo = '" + PSNo + "'"; + // //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + // drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + // if (drTemp.Read()) + // { + // TestRecipeType = Conversions.ToString(drTemp["TestRecipeType"]); + // } + // else + // { + // throw new Exception("解析檔案失敗, 找不到區段: " + PSNo + ", 參數編號: " + strColumnName + " 之測試類別!"); + // } + // drTemp.Close(); + // //cmmTemp.Dispose(); + // } + + // // 電性值資料表名稱: tblWIPTestSum_測試類別 + // strTableName = "TBLWIPTESTSUM_" + TestRecipeType; + // strLogTableName = "TBLWIPTESTSUMLOG_" + TestRecipeType; + + // // 檢查檔案是否已匯入過(資料已存在Log中) + // strSQL = "Select ComponentNo From " + strLogTableName + " Where ComponentNo = '" + strWaferID + "' And FileName = '" + FileName + "'" + " And TestDate = To_Date('" + Strings.Format(Conversions.ToDate(aryWaferInfo[1].ToString()), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')"; + // //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + // drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + // if (drTemp.Read()) + // { + // throw new Exception("檔案: " + FileName + ", 測試日期: " + aryWaferInfo[1].ToString() + " 已匯入, 不允許重新匯入!!"); + // } + // drTemp.Close(); + // //cmmTemp.Dispose(); + + // // 依測試類別找出其TestRecipeNo(參數編號), ConversionField(欄位名稱) + // strSQL = "Select TestRecipeNo, ConversionField From tblSYSTestRecipeBasis Where TestRecipeType = '" + TestRecipeType + "'"; + // //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + // //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp); + // dsTemp = new DataSet(); + // //daTemp.Fill(dsTemp, "TestRecipe"); + // ExecuteSQLQuery_Adapter(strSQL, dsTemp, "TestRecipe", cnnTemp); + // dtTestRecipe = dsTemp.Tables["TestRecipe"]; + + // // 取得暫存資料表名稱 + // strTempTable = "Temp" + "_" + EquipmentNo; + + // // tblWIPTestSum刪除已存在資料, 只保留最新一次資料 + // strSQL = "Delete From " + strTableName + " Where ComponentNo = '" + strWaferID + "'"; + // CollectionSQL.Add(strSQL); + + // // //新增TestSummary, TestSummaryLog + // // strSQLAddField = "Insert into " & strTableName & " (" + // strSQLHead = "Insert into " + strTableName + " ("; + // strSQLLogHead = "Insert into " + strLogTableName + " ("; + // strSQLAddValue = " Values ("; + + // // 固定欄位 + // strSQLAddField = "LogGroupSerial, ComponentNo, LotNo, FileName, EquipmentNo, ImportUserNo, ImportDate,"; + // strSQLAddValue = strSQLAddValue + "'" + LogGroupSerial + "','" + strWaferID + "','" + LotNo + "','" + FileName + "','" + EquipmentNo + "','AutoRun'," + " To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),"; + + // // 動態欄位 + // // 拆解公式檔:欄位名稱、計算SQL + // bool blnF_WaferSize, blnF_Thickness, blnF_TestDate, blnF_ProgramNo; + // blnF_WaferSize = false; // 預設公式檔沒有WaferSize + // blnF_Thickness = false; // 預設公式檔沒有Thickness + // blnF_TestDate = false; // 預設公式檔沒有TestDate + // blnF_ProgramNo = false; // 預設公式檔沒有ProgramNo + + // if (aryFormula.Count > 0) + // { + + // // 2018/11/8, Ning, TempTable 資料處理 + // //oTrans = cnnTemp.BeginTransaction(); + // //foreach (string strCommand in colSQL_TempTable) + // //{ + // // //using (var cmdTempTable = new System.Data.OleDb.OleDbCommand(strCommand, cnnTemp)) + // // //{ + // // // cmdTempTable.Transaction = oTrans; + // // // cmdTempTable.ExecuteNonQuery(); + // // //} + // // ExecuteSQLNoneQuery(strDataBaseType, cnnTemp.ToString(), ref strFormulaSQL); + // //} + // ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, colSQL_TempTable); + + // for (int w = 0, loopTo = aryFormula.Count - 1; w <= loopTo; w++) + // { + // strCalResult = ""; + + // strReadFormula = Strings.Split(Strings.Trim(aryFormula[w].ToString()), ":"); + // strColumnName = strReadFormula[0]; + // strFormulaSQL = strReadFormula[1]; + + // // TestRecipeBasis有定義此欄位才需要計算並存入 + // // 2019/3/7, Ning, 存入的欄位名稱為dtTestRecipe.ConversionField + // drSel = dtTestRecipe.Select("TestRecipeNo = '" + strColumnName + "'"); + // if (drSel.Length > 0) + // { + // // 將SQL計算工式的temp_Table改為 + // strFormulaSQL = Strings.Replace(strFormulaSQL, "[TEMP_TABLE]", strTempTable); + + // // 取得計算結果 + // // 欄位皆以Number(16,4)儲存運算 + // //cmmTemp = new System.Data.OleDb.OleDbCommand(strFormulaSQL, cnnTemp); + // //cmmTemp.Transaction = oTrans; // 使用TempTable的Transaction + // drTemp = ExecuteSQLQuery_Reader(strFormulaSQL, cnnTemp); + // if (drTemp.Read()) + // { + // strCalResult = drTemp[0].ToString(); + // } + // else + // { + // throw new Exception("公式計算失敗,請檢查參數名稱:" + strColumnName); + // } + + // if (!string.IsNullOrEmpty(strCalResult)) + // { + // // 2019/3/7, Ning, 存入的欄位名稱為dtTestRecipe.ConversionField + // // strSQLAddField = strSQLAddField & strColumnName & "," + // strSQLAddField = strSQLAddField + drSel[0]["ConversionField"].ToString() + ","; + // strSQLAddValue = strSQLAddValue + "'" + strCalResult.ToString() + "',"; + + // if (drSel[0]["ConversionField"].ToString().ToUpper() == "WAFERSIZE") + // { + // blnF_WaferSize = true; + // } + // if (drSel[0]["ConversionField"].ToString().ToUpper() == "THICKNESS") + // { + // blnF_Thickness = true; + // } + // if (drSel[0]["ConversionField"].ToString().ToUpper() == "TESTDATE") + // { + // blnF_TestDate = true; + // } + // if (drSel[0]["ConversionField"].ToString().ToUpper() == "PROGRAMNO") + // { + // blnF_ProgramNo = true; + // } + // } + // } + // } + // drTemp.Close(); + // //cmmTemp.Dispose(); + + // //oTrans.Commit(); // TempTable 之Transaction + // } + + // // 固定欄位(TestDate, ProgramNo) + // if (!blnF_TestDate) + // { + // strSQLAddField = strSQLAddField + "TestDate,"; + // strSQLAddValue = strSQLAddValue + "To_Date('" + Strings.Format(Conversions.ToDate(aryWaferInfo[1].ToString()), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')" + ","; + // } + // if (!blnF_ProgramNo) + // { + // strSQLAddField = strSQLAddField + "ProgramNo,"; + // strSQLAddValue = strSQLAddValue + "'" + aryWaferInfo[5].ToString() + "',"; + // } + + // // 動態欄位 + // // 2019/5/22, Ning, 公式檔沒有WaferSize才將表頭的填入 + // if (!blnF_WaferSize && dtTestRecipe.Select("TestRecipeNo = 'WaferSize'").Length > 0 && (aryWaferInfo[3].ToString() ?? "") != defString) + // { + // strSQLAddField = strSQLAddField + "WaferSize,"; + // strSQLAddValue = strSQLAddValue + "'" + aryWaferInfo[3].ToString() + "',"; + // } + // // 2019/5/22, Ning, 公式檔沒有Thickness才將表頭的填入 + // if (!blnF_Thickness && dtTestRecipe.Select("TestRecipeNo = 'Thickness'").Length > 0 && (aryWaferInfo[4].ToString() ?? "") != defString) + // { + // strSQLAddField = strSQLAddField + "Thickness,"; + // strSQLAddValue = strSQLAddValue + "'" + aryWaferInfo[4].ToString() + "',"; + // } + + // // 2019/7/9,Ning, FileEquipmentNo(aryWaferInfo[2]),有值則需存入 + // if (!string.IsNullOrEmpty(aryWaferInfo[2].ToString()) && (aryWaferInfo[2].ToString() ?? "") != defString) + // { + // strSQLAddField = strSQLAddField + "FileEquipmentNo,"; + // strSQLAddValue = strSQLAddValue + "'" + aryWaferInfo[2].ToString() + "',"; + // } + + // if (Strings.InStr(1, strSQLAddField, ",") != 0) // 刪除最後一個"," + // { + // if (Strings.Right(strSQLAddField, 1) == ",") + // { + // strSQLAddField = Strings.Mid(strSQLAddField, 1, Strings.Len(strSQLAddField) - 1); + // } + // } + + // if (Strings.InStr(1, strSQLAddValue, ",") != 0) // 刪除最後一個"," + // { + // if (Strings.Right(strSQLAddValue, 1) == ",") + // { + // strSQLAddValue = Strings.Mid(strSQLAddValue, 1, Strings.Len(strSQLAddValue) - 1); + // } + // } + + // // 直接給定strSQL + // strSQL = strSQLHead + strSQLAddField + ")" + strSQLAddValue + ")"; + // CollectionSQL.Add(strSQL); + + // // Log SQL + // strSQL = strSQLLogHead + strSQLAddField + ")" + strSQLAddValue + ")"; + // CollectionSQL.Add(strSQL); + + // // Drop TempTable + // strSQL = "Drop Table " + strTempTable; + // CollectionSQL.Add(strSQL); + + // // 呼叫執行SQL指令 + // string argstrDatabaseType = Conversions.ToString(DataBaseType); + // ExecuteSQLNoneQuery_UPD(argstrDatabaseType, strConnectionString, CollectionSQL); + + // blnResult = true; + // } + + // catch (Exception ex) + // { + // throw; + // } + + // finally + // { + // CloseConnection(cnnTemp); + // aryTemp = null; + // } + + // return blnResult; + + //} + + //private bool fuExcelDataToTestSum_EQP(string pFilePath, string strTestRecipeType, ArrayList aryFormula, string EquipmentNo, int intD_CompNo, string FileName) + //{ + + // bool blnResult; + // // 2019/3/26, Ning, 加入Encode, 排除中文亂碼問題 + // // Dim encode As System.Text.Encoding = System.Text.Encoding.GetEncoding("UTF-8") + // var encode = Encoding.Default; + // string strLine; + + // short i; + // string strTestRecipeNo; + // DataRow drAdd; + // DataRow drAddFix; + // string strSQL, strTableName, strSQLAddField, strSQLAddValue; + // var CollectionSQL = new Collection(); + + // IDbConnection cnnTemp = null; + // var drTemp = default(DbDataReader); + + // var TestRecipeType = default(string); + // string strLogTableName, strSQLHead, strSQLLogHead; + // //System.Data.OleDb.OleDbDataAdapter daTemp; + // DataTable dtTestRecipe; + // DataSet dsTemp; + // DateTime datEventTime, datTestDate; + + // DataTable dtFixData; + // DataView dvFixData; + // DataRow[] drSel; + // DataTable dtResult = null; + // string strWaferID; + // string LotNo = default(string), LogGroupSerial = default(string), PSNo; + // var strReadFormula = new string[2]; + + // try + // { + // // //Create connection + // cnnTemp = CreateConnection(strConnectionString); + + // blnResult = false; + + // // 將Excel資料匯入到dtResult中, 只有單身, 沒有單頭, 第一列即是欄位名稱 + // fuReadExcel(pFilePath, ref dtResult); + + // if (dtResult.Columns.Count < intD_CompNo) + // { + // throw new Exception("無法取得ComponentNo!!"); + // } + + // dtFixData = new DataTable("WaferID"); + // dtFixData.Columns.Add("WaferID", Type.GetType("System.String")); + + // foreach (DataRow drResult in dtResult.Rows) + // { + // drAdd = dtFixData.NewRow(); + // drAdd["WaferID"] = drResult[intD_CompNo - 1].ToString(); + // dtFixData.Rows.Add(drAdd); + // } + + // // 以第一筆ComponentNo取得LotNo及PSNo + // if (dtResult.Rows.Count > 0) + // { + // strWaferID = dtFixData.Rows[0]["WaferID"].ToString(); + // // 取得LotNo, LogGroupSerial + // // 因ComponentState中同一ComponentNo可能會對到多筆Lot, 但只會有一筆還在WIP中的, 故限制Status in (0,1,2,3,4,5) + // strSQL = "Select A.LotNo, B.PSNo, B.LogGroupSerial From tblWIPComponentState A, tblWIPLotState B Where A.LotNo = B.LotNo And A.ComponentNo = '" + strWaferID + "'" + " And B.Status In (0,1,2,3,4,5)"; + // //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + // drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + // if (drTemp.Read()) + // { + // if (string.IsNullOrEmpty(drTemp["LogGroupSerial"].ToString())) + // { + // throw new Exception("解析檔案失敗,LotNo: " + LotNo + " 之LogGroupSerial為空!"); + // } + // LotNo = Conversions.ToString(drTemp["LotNo"]); + // LogGroupSerial = drTemp["LogGroupSerial"].ToString(); + // PSNo = Conversions.ToString(drTemp["PSNo"]); + // } + // else + // { + // throw new Exception("解析檔案失敗,ComponentNo: " + strWaferID + " 無法找到對應的 LotNo,請檢查檔案:" + FileName); + // } + // drTemp.Close(); + // //cmmTemp.Dispose(); + + // // 2019/5/30, Ning, 若AutoLoaderJob.xml的Parameter2有定義TestRecipeType, 則以該值為優先, 若沒有定再以下述方式找TestRecipeType + // if ((strTestRecipeType ?? "") != defString) + // { + // TestRecipeType = strTestRecipeType; + // } + // // 依格式檔內的參數編號及生產批所在區域取得TestRecipeType + // else if (aryFormula.Count > 0) + // { + // strReadFormula = Strings.Split(Strings.Trim(aryFormula[0].ToString()), ":"); + // strTestRecipeNo = strReadFormula[0].ToUpper(); + + // strSQL = "Select TestRecipeType From tblSYSTestRecipeBasis Where TestRecipeNo = '" + strTestRecipeNo + "' And PSNo = '" + PSNo + "'"; + // //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + // drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + // if (drTemp.Read()) + // { + // TestRecipeType = Conversions.ToString(drTemp["TestRecipeType"]); + // } + // else + // { + // throw new Exception("解析檔案失敗, 找不到區段: " + PSNo + ", 參數編號: " + strTestRecipeNo + " 之測試類別!"); + // } + // drTemp.Close(); + // //cmmTemp.Dispose(); + // } + // } + + // // 電性值資料表名稱: tblWIPTestSum_測試類別 + // strTableName = "TBLWIPTESTSUM_" + TestRecipeType; + // strLogTableName = "TBLWIPTESTSUMLOG_" + TestRecipeType; + + // // 依測試類別找出其TestRecipeNo(參數編號), ConversionField(欄位名稱) + // strSQL = "Select TestRecipeNo, ConversionField From tblSYSTestRecipeBasis Where TestRecipeType = '" + TestRecipeType + "'"; + // //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + // //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp); + // dsTemp = new DataSet(); + // //daTemp.Fill(dsTemp, "TestRecipe"); + // ExecuteSQLQuery_Adapter(strSQL, dsTemp, "TestRecipe", cnnTemp); + // dtTestRecipe = dsTemp.Tables["TestRecipe"]; + + // string strExcelField; + // DataTable dtFieldMap; + + // dtFieldMap = new DataTable("FieldMap"); + // dtFieldMap.Columns.Add("TestRecipeNo", Type.GetType("System.String")); + // dtFieldMap.Columns.Add("ExcelField", Type.GetType("System.String")); + // dtFieldMap.Columns.Add("ConversionField", Type.GetType("System.String")); + + // if (aryFormula.Count > 0) + // { + + // for (int w = 0, loopTo = aryFormula.Count - 1; w <= loopTo; w++) + // { + // strReadFormula = Strings.Split(Strings.Trim(aryFormula[w].ToString()), ":"); + // strTestRecipeNo = strReadFormula[0]; + // strExcelField = strReadFormula[1]; + + // // TestRecipeBasis有定義此欄位才需要計算並存入 + // // 2019/3/7, Ning, 存入的欄位名稱為dtTestRecipe.ConversionField + // drSel = dtTestRecipe.Select("TestRecipeNo = '" + strTestRecipeNo + "'"); + // if (drSel.Length > 0) + // { + + // drAdd = dtFieldMap.NewRow(); + // drAdd["TestRecipeNo"] = strTestRecipeNo; + // drAdd["ExcelField"] = strExcelField; + // drAdd["ConversionField"] = drSel[0]["ConversionField"].ToString(); + // dtFieldMap.Rows.Add(drAdd); + // } + // } + // drTemp.Close(); + // //cmmTemp.Dispose(); + + // } + + // // TestSum, TestSumLog存入DB + // datEventTime = DateTime.Now; + // datTestDate = datEventTime; + + // foreach (DataRow drData in dtResult.Rows) + // { + + // strWaferID = Conversions.ToString(drData[intD_CompNo - 1]); + // // tblWIPTestSum刪除已存在的資料, 只保留最新一次資料 + // strSQL = "Delete From " + strTableName + " Where ComponentNo = '" + strWaferID + "'"; + // CollectionSQL.Add(strSQL); + + // // //新增TestSummary, TestSummaryLog + // strSQLHead = "Insert into " + strTableName + " ("; + // strSQLLogHead = "Insert into " + strLogTableName + " ("; + // strSQLAddValue = " Values ("; + + // // 固定欄位 + // strSQLAddField = "LogGroupSerial, ComponentNo, LotNo, FileName, EquipmentNo, ImportUserNo, ImportDate,"; + // strSQLAddValue = strSQLAddValue + "'" + LogGroupSerial + "','" + strWaferID + "','" + LotNo + "','" + FileName + "','" + EquipmentNo + "','AutoRun'," + " To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),"; + + // bool blnD_TestDate, blnD_ProgramNo; // 明細是否有動態表頭欄位, 有的話以明細為準 + // blnD_TestDate = false; + // blnD_ProgramNo = false; + + // // 動態欄位(明細欄位) + // foreach (DataRow drField in dtFieldMap.Rows) + // { + + // if (drField["ConversionField"].ToString().ToUpper() == "TESTDATE") + // { + // strSQLAddField = strSQLAddField + drField["ConversionField"].ToString() + ","; + // strSQLAddValue = strSQLAddValue + "To_Date('" + Strings.Format(Convert.ToDateTime(drData[drField["ExcelField"].ToString()]), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),"; + + // blnD_TestDate = true; + // datTestDate = Conversions.ToDate(drData[drField["ExcelField"].ToString()].ToString()); + // } + // else + // { + // strSQLAddField = strSQLAddField + drField["ConversionField"].ToString() + ","; + // strSQLAddValue = strSQLAddValue + "'" + drData[drField["ExcelField"].ToString()].ToString() + "',"; + + // if (drField["ConversionField"].ToString().ToUpper() == "PROGRAMNO") + // { + // blnD_ProgramNo = true; + // } + // } + + // } + + // // 固定欄位(表頭), 若明細沒有, 則一定要加入, 因Table不允許Null + // if (!blnD_TestDate) + // { + // strSQLAddField = strSQLAddField + "TestDate,"; + // strSQLAddValue = strSQLAddValue + "To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')" + ","; + // } + // if (!blnD_ProgramNo) + // { + // strSQLAddField = strSQLAddField + "ProgramNo,"; + // strSQLAddValue = strSQLAddValue + "'N/A',"; + // } + + // if (Strings.InStr(1, strSQLAddField, ",") != 0) // 刪除最後一個"," + // { + // if (Strings.Right(strSQLAddField, 1) == ",") + // { + // strSQLAddField = Strings.Mid(strSQLAddField, 1, Strings.Len(strSQLAddField) - 1); + // } + // } + + // if (Strings.InStr(1, strSQLAddValue, ",") != 0) // 刪除最後一個"," + // { + // if (Strings.Right(strSQLAddValue, 1) == ",") + // { + // strSQLAddValue = Strings.Mid(strSQLAddValue, 1, Strings.Len(strSQLAddValue) - 1); + // } + // } + + // // 直接給定strSQL + // strSQL = strSQLHead + strSQLAddField + ")" + strSQLAddValue + ")"; + // CollectionSQL.Add(strSQL); + + // // Log SQL + // strSQL = strSQLLogHead + strSQLAddField + ")" + strSQLAddValue + ")"; + // CollectionSQL.Add(strSQL); + + // // 檢查檔案是否已匯入過(資料已存在Log中) + // strSQL = "Select ComponentNo From " + strLogTableName + " Where ComponentNo = '" + strWaferID + "' And FileName = '" + FileName + "'" + " And TestDate = To_Date('" + Strings.Format(datTestDate, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')"; + // strSQL = SQLCommandTuning(Conversions.ToString(DataBaseType), ref strSQL); + // //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + // drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + // if (drTemp.Read()) + // { + // throw new Exception("檔案: " + FileName + ", 測試日期: " + Strings.Format(datTestDate, "yyyy/MM/dd H:mm:ss") + " 已匯入, 不允許重新匯入!!"); + // } + // drTemp.Close(); + // //cmmTemp.Dispose(); + + // } + + // // //執行SQL指令 + // string argstrDatabaseType = Conversions.ToString(DataBaseType); + // ExecuteSQLNoneQuery_UPD(argstrDatabaseType, strConnectionString, CollectionSQL); + + // blnResult = true; + // } + + // catch (Exception ex) + // { + // throw; + // } + + // finally + // { + // CloseConnection(cnnTemp); + // } + + // return blnResult; + + //} + + + //public bool fuReadExcel(string FilePath, ref DataTable dtResult, int StratRowIndex = 0, int StartColumnIndex = 0, int MaxRowCount = -1, string StopCellText = "") + //{ + // bool blnReturn = false; + + // try + // { + // dtResult = new DataTable(); + + // // 開啟要讀取的Excel檔案 + // var fsExcel = new FileStream(FilePath, FileMode.Open); + // // 自動判斷xls或xlsx + // var workbook = WorkbookFactory.Create(fsExcel); + // fsExcel.Close(); // 關閉檔案 + + // if (Information.TypeName(workbook) == "HSSFWorkbook") + // { + // } + // // 早期的Excel格式(97-2003) + // // MsgBox("Excel Format(97-2003)") + // else if (Information.TypeName(workbook) == "XSSFWorkbook") + // { + // // 新的Excel格式(2007 or Later) + // // MsgBox("Excel Format(2007 Later)") + // } + + // // 解析Excel 內容 + // int intStartRowIndex = StratRowIndex; // 要開始讀取資料的列數 + // int intStartCellIndex = StartColumnIndex; // 要開始讀取的欄位次序 + // int intsheetIndex = 0; + // string strFirstSheetName = workbook.GetSheetName(intsheetIndex); + // var sheet = workbook.GetSheetAt(intsheetIndex); + // object formulaValue; + + // // 第一列為欄位名稱 + // int intRowId = intStartRowIndex; + // var excelRow = sheet.GetRow(intRowId); + // ICell excelCell; + // HSSFFormulaEvaluator formulaEvaluator_xls = null; + // XSSFFormulaEvaluator formulaEvaluator_xlsx = null; + // bool blnHasData = false; + // if (excelRow != null) + // { + // for (int columnIndex = intStartCellIndex, loopTo = excelRow.LastCellNum - 1; columnIndex <= loopTo; columnIndex++) + // { + // excelCell = excelRow.GetCell(columnIndex); + // if (excelCell != null) + // { + // DataColumn dc; + // string strColName = excelCell.ToString(); + // dc = new DataColumn(strColName, Type.GetType("System.String")); + // dtResult.Columns.Add(dc); + // } + // } + // } + + // // 第2列開始讀取資料,讀到最後一列 + // while (intRowId <= sheet.LastRowNum - 1) + // { + // var drAdd = dtResult.NewRow(); + // intRowId += 1; + // blnHasData = false; + // excelRow = sheet.GetRow(intRowId); + // if (excelRow == null) + // continue; // 讀不到資料,跳下一列繼續讀取 + // // 讀取所有column + // bool continueWhile = false; + // for (int colIndex = intStartCellIndex, loopTo1 = dtResult.Columns.Count - 1 + intStartCellIndex; colIndex <= loopTo1; colIndex++) + // { + // excelCell = excelRow.GetCell(colIndex); + // // 若第一個 Cell 是 Nothing 就濾掉這筆 + // if (excelCell == null && colIndex == 0) + // { + // continueWhile = true; + // break; + // } + + // // TODO: 讀取到特定文字或指定筆數離開 + // if (MaxRowCount != -1 && intRowId - intStartRowIndex > MaxRowCount) + // { + + // } + // if (excelCell != null) + // { + // string strVal = ""; + // if (excelCell.CellType == CellType.Formula) + // { + // // 2019/7/3, Ning, 公式中若有特定函數如countifs某些電腦會報錯, 再加上cell.CachedFormulaResultType判斷 + // if (excelCell.CachedFormulaResultType == CellType.Numeric) + // { + // if (DateUtil.IsCellDateFormatted(excelCell)) + // { + // strVal = excelCell.DateCellValue.ToString(); + // } + // else + // { + // strVal = excelCell.NumericCellValue.ToString(); + // } + // } + // else if (excelCell.CachedFormulaResultType == CellType.String) + // { + // strVal = excelCell.StringCellValue.ToString(); + // } + // else if (Information.TypeName(workbook) == "HSSFWorkbook") + // { + // if (formulaEvaluator_xls == null) + // formulaEvaluator_xls = new HSSFFormulaEvaluator(workbook); + // formulaValue = formulaEvaluator_xls.Evaluate(excelCell); + // if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual((formulaValue as CellValue).CellType, CellType.Numeric, false))) + // { + // strVal = (formulaValue as CellValue).NumberValue.ToString(); + // } + // else if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual((formulaValue as CellValue).CellType, CellType.String, false))) + // { + // strVal = (formulaValue as CellValue).StringValue.ToString(); + // } + // } + // else if (Information.TypeName(workbook) == "XSSFWorkbook") + // { + // if (formulaEvaluator_xlsx == null) + // formulaEvaluator_xlsx = new XSSFFormulaEvaluator(workbook); + // formulaValue = formulaEvaluator_xlsx.Evaluate(excelCell); + // if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual((formulaValue as CellValue).CellType, CellType.Numeric, false))) + // { + // strVal = (formulaValue as CellValue).NumberValue.ToString(); + // } + // else if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual((formulaValue as CellValue).CellType, CellType.String, false))) + // { + // strVal = (formulaValue as CellValue).StringValue.ToString(); + // } + // } + // } + + // else if (excelCell.CellType == CellType.Numeric && DateUtil.IsValidExcelDate(excelCell.NumericCellValue) && DateUtil.IsCellDateFormatted(excelCell)) + + // { + // strVal = excelCell.DateCellValue.ToString("yyyy/MM/dd"); + // } + // else if (excelCell.CellType == CellType.Numeric) + // { + // strVal = excelCell.NumericCellValue.ToString(); + // if (colIndex == 0) + // { + // strVal = Convert.ToUInt32(strVal).ToString("0000000"); + // } + // } + // else + // { + // strVal = excelCell.ToString(); + // } + // // 若第一個 Cell 是空白值就濾掉這筆 + // if (colIndex == intStartCellIndex && string.IsNullOrEmpty(strVal.Trim())) + // { + // continueWhile = true; + // break; + // } + // drAdd[dtResult.Columns[colIndex - intStartCellIndex]] = strVal; + // blnHasData = true; + // } + // } + + // if (continueWhile) + // { + // continue; + // } + // if (blnHasData) + // dtResult.Rows.Add(drAdd); + // } + + // blnReturn = true; + // } + // catch (Exception ex) + // { + // throw; + // } + + // return blnReturn; + + //} + + + //// 來料電性值匯入 + ////private string funImpMTLVendorTestData(Collection colParameters = null) + ////{ + //// string funImpMTLVendorTestDataRet = default(string); + + //// var cnnTemp = default(IDbConnection); + //// var drTemp = default(DbDataReader); + + //// string strJobNo = string.Empty; // JobNo + //// string strRootPath = string.Empty; // 來源根目錄 + //// string strSourcePath = string.Empty; // 來源檔案路徑 + //// string strDestinationPath = string.Empty; // 目前檔案路徑 + //// string strQueuePath = string.Empty; // 處理中檔案路徑 + //// string strFailPath = string.Empty; // 失敗檔案路徑 + //// string FileName = string.Empty; // 處理中檔案 + //// string DirName = DateTime.Now.ToString("yyyyMM"); // 分類目錄名稱 + //// bool blnMoveFile = true; + //// string strSQL = string.Empty; + + //// // 固定參數資料起始位置(第幾列) + //// int intVendorMTLNo = defInteger; // 供應商料號 + //// int intVendorMTLLotNo = defInteger; // 供應商料批批號 + //// int intVendorNo = defInteger; // 供應商編號 + //// // 2019/2/22,Ning,固定參數新增ComponentLotNo + //// int intCompLotNo = defInteger; // 元件批號 + //// int intColumnStart = defInteger; // 欄位 + //// int intDataStart = defInteger; // 資料 + + //// // 固定參數資料位置(第幾欄) + //// int intD_VendorMTLNo = defInteger; + //// int intD_VendorMTLLotNo = defInteger; + //// int intD_ComponentNo = defInteger; + //// int intD_SlotNo = defInteger; + //// // 2019/2/22,Ning,固定參數新增D_ComponentLotNo, D_LaserMark + //// int intD_CompLotNo = defInteger; + //// int intD_LaserMark = defInteger; + + //// // 動態參數資料起始位置(第幾列) + //// int intEquipmentNo = defInteger; + //// int intThickNess = defInteger; + //// int intWaferSize = defInteger; + + //// string strInventoryNo; + //// string strTemp; + //// string strFileFilter = defString; + + //// var strReadLine = new string[2]; + //// var aryFormula = new ArrayList(); + //// string[] aryWaferInfo = new string[] { defString, defString, defString, defString, defString, defString }; // 存放解析後的Wafer資訊 + //// var fs = default(FileStream); + //// var r = default(StreamReader); + + //// string strFormatFile; // 格式檔路徑+名稱 + //// string strFormatScript; // 格式檔內容 + //// string strFFName = "FormatFile.txt"; + //// StreamWriter sw; + + //// var datEvnetTime = DateTime.Now; + + //// string[] aryDir; + + //// string strMSplitSign, strDSplitSign; + //// string strFailLog = ""; + + //// try + //// { + //// cnnTemp = CreateConnection(strConnectionString); + + //// // //取出colParameter傳入參數 + //// strJobNo = colParameters["JobNo"].ToString().Trim(); + //// strRootPath = colParameters["SourcePath"].ToString().Trim(); + + //// // Parameter1為傳入參數,作為機台編號,若無此值則不進行下面的程式 + //// if (colParameters["Parameter1"] == null || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter1"])))) + //// { + //// funImpMTLVendorTestDataRet = "庫房編號 not found!!!(Parameter1)"; + //// throw new Exception(funImpMTLVendorTestDataRet); + //// } + //// else + //// { + //// strInventoryNo = Strings.Trim(Conversions.ToString(colParameters["Parameter1"])); + //// } + + //// // 找RootPath下的子目錄 + //// aryDir = Directory.GetDirectories(strRootPath); + //// foreach (string strDir in aryDir) + //// { + //// strSourcePath = strDir + @"\Source\"; + //// strDestinationPath = strDir + @"\Destination\"; + //// strQueuePath = strDir + @"\Queue\"; + //// strFailPath = strDir + @"\Fail\"; + + //// if (!Directory.Exists(strSourcePath) || !Directory.Exists(strDestinationPath) || !Directory.Exists(strQueuePath) || !Directory.Exists(strFailPath)) + //// { + //// funImpMTLVendorTestDataRet = strDir + "目錄下必須有 Source,Destination,Queue,Fail四個子資料夾!"; + //// throw new Exception(funImpMTLVendorTestDataRet); + //// // Continue For + //// } + + //// // 取得格式檔 + //// strSQL = "Select FormatScript, MasterSeparateSign, DetailCloumnSeparateSign From tblMTLVENDORALScript Where Upper(MTLFolderPath) = '" + strDir.ToUpper() + @"\'"; + //// //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + //// drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + //// if (drTemp.Read()) + //// { + //// // CLOB類型以.ToString轉換之 + //// strFormatScript = drTemp["FormatScript"].ToString(); + //// if (!(drTemp["MasterSeparateSign"] is DBNull)) + //// { + //// strMSplitSign = Conversions.ToString(drTemp["MasterSeparateSign"]); + //// if (strMSplitSign.ToUpper() == "TAB") + //// { + //// strMSplitSign = Constants.vbTab; + //// } + //// } + //// else + //// { + //// strMSplitSign = ":"; + //// } + //// if (!(drTemp["DetailCloumnSeparateSign"] is DBNull)) + //// { + //// strDSplitSign = Conversions.ToString(drTemp["DetailCloumnSeparateSign"]); + //// if (strDSplitSign.ToUpper() == "TAB") + //// { + //// strDSplitSign = Constants.vbTab; + //// } + //// } + //// else + //// { + //// strDSplitSign = ","; + //// } + //// } + //// else + //// { + //// drTemp.Close(); + //// //cmmTemp.Dispose(); + + //// funImpMTLVendorTestDataRet = "目錄:" + strDir + @"\ 未設定格式檔!"; + //// throw new Exception(funImpMTLVendorTestDataRet); + + //// // Continue For + //// } + //// drTemp.Close(); + //// //cmmTemp.Dispose(); + + //// // //格式檔已存在必須先刪除 + //// if (File.Exists(strSourcePath + strFFName) == true) + //// { + //// File.Delete(strSourcePath + strFFName); + //// } + + //// // 將strFormatScript寫入strFFName中 + //// fs = new FileStream(strSourcePath + strFFName, FileMode.Create, FileAccess.Write); + //// sw = new StreamWriter(fs, Encoding.Default); + //// sw.WriteLine(strFormatScript); + //// sw.Close(); + //// sw = null; + //// fs.Close(); + //// fs = null; + + //// // 格式檔路徑: SourcePath & 格式檔名稱 + //// strFormatFile = strSourcePath + strFFName; + //// aryFormula.Clear(); // 換一個資料夾需清空 + + //// // 參數值Reset + //// intVendorMTLNo = defInteger; + //// intVendorMTLLotNo = defInteger; + //// intVendorNo = defInteger; + //// intCompLotNo = defInteger; + //// intColumnStart = defInteger; + //// intDataStart = defInteger; + + //// intD_VendorMTLNo = defInteger; + //// intD_VendorMTLLotNo = defInteger; + //// intD_ComponentNo = defInteger; + //// intD_SlotNo = defInteger; + //// intD_CompLotNo = defInteger; + //// intD_LaserMark = defInteger; + + //// intEquipmentNo = defInteger; + //// intThickNess = defInteger; + //// intWaferSize = defInteger; + + //// try + //// { + //// var scrFile = new FileInfo(strFormatFile); + //// fs = new FileStream(strFormatFile, FileMode.Open); + //// r = new StreamReader(fs, Encoding.Default); + + //// // 1.先讀取格式檔 + //// if (scrFile.Exists == false) + //// { + //// funImpMTLVendorTestDataRet = "請確認供應商格式檔案是否存在!!"; + //// throw new Exception(funImpMTLVendorTestDataRet); + //// } + //// else + //// { + + //// // 解析格式檔固定資料位置 + //// // 固定參數(列): VendorMaterialNo, VendorMaterialLotNo, VendorNo, ColumnsStart, DataStart + //// // 固定參數(欄): D_VendorMaterialNo, D_VendorMaterialLotNo, D_ComponentNo + //// // 動態參數(列): EquipmentNo, WaferSize, Thickness + //// // 2019/3/22,Ning,需支持位置可能會有重覆的情形 + //// while (r.Peek() > -1) + //// { + //// strTemp = r.ReadLine(); + //// strReadLine = Strings.Split(Strings.Trim(strTemp), "=>>"); + //// switch (strReadLine[0].ToUpper() ?? "") + //// { + //// case "VENDORMATERIALNO": + //// { + //// intVendorMTLNo = (int)Math.Round(Conversion.Val(strReadLine[1])); + //// break; + //// } + //// case "VENDORMATERIALLOTNO": + //// { + //// intVendorMTLLotNo = (int)Math.Round(Conversion.Val(strReadLine[1])); + //// break; + //// } + //// case "VENDORNO": + //// { + //// intVendorNo = (int)Math.Round(Conversion.Val(strReadLine[1])); + //// break; + //// } + //// case "COMPONENTLOTNO": + //// { + //// intCompLotNo = (int)Math.Round(Conversion.Val(strReadLine[1])); + //// break; + //// } + //// case "COLUMNSSTART": + //// { + //// intColumnStart = (int)Math.Round(Conversion.Val(strReadLine[1])); + //// break; + //// } + //// case "DATASTART": + //// { + //// intDataStart = (int)Math.Round(Conversion.Val(strReadLine[1])); + //// break; + //// } + + //// case "D_VENDORMATERIALNO": + //// { + //// intD_VendorMTLNo = (int)Math.Round(Conversion.Val(strReadLine[1])); + //// break; + //// } + //// case "D_VENDORMATERIALLOTNO": + //// { + //// intD_VendorMTLLotNo = (int)Math.Round(Conversion.Val(strReadLine[1])); + //// break; + //// } + //// case "D_COMPONENTNO": + //// { + //// intD_ComponentNo = (int)Math.Round(Conversion.Val(strReadLine[1])); + //// break; + //// } + //// case "D_SLOTNO": + //// { + //// intD_SlotNo = (int)Math.Round(Conversion.Val(strReadLine[1])); + //// break; + //// } + //// case "D_COMPONENTLOTNO": + //// { + //// intD_CompLotNo = (int)Math.Round(Conversion.Val(strReadLine[1])); + //// break; + //// } + //// case "D_LASERMARK": + //// { + //// intD_LaserMark = (int)Math.Round(Conversion.Val(strReadLine[1])); + //// break; + //// } + + //// case "EQUIPMENTNO": + //// { + //// intEquipmentNo = (int)Math.Round(Conversion.Val(strReadLine[1])); + //// break; + //// } + //// case "WAFERSIZE": + //// { + //// intWaferSize = (int)Math.Round(Conversion.Val(strReadLine[1])); + //// break; + //// } + //// case "THICKNESS": + //// { + //// intThickNess = (int)Math.Round(Conversion.Val(strReadLine[1])); + //// break; + //// } + //// } + //// } + //// } + //// } + + //// catch (Exception ex) + //// { + //// funImpMTLVendorTestDataRet = "格式檔解析失敗! " + strFormatFile + " Error Message :" + ex.Message.ToString(); + //// throw new Exception(funImpMTLVendorTestDataRet); + //// } + + //// if (intD_ComponentNo == defInteger || intColumnStart == defInteger || intDataStart == defInteger) + //// { + //// funImpMTLVendorTestDataRet = "請確認供應商格式檔案設定是否正確(ComponentNo、ColumnsStart、DataStart)!!"; + //// throw new Exception(funImpMTLVendorTestDataRet); + //// } + + //// object aryFile = Directory.GetFiles(strSourcePath); + + //// Array.Sort((Array)aryFile); + //// // 2.迴圈Component測試資料讀取 + //// foreach (string fn in (IEnumerable)aryFile) // fn為FileName + //// { + //// try + //// { + //// var fi = new FileInfo(fn); + + //// if (File.Exists(fn) == true && fi.FullName.ToString().IndexOf(strFFName) < 0) // 此檔案存在且非格式檔才處理 + //// { + + //// FileName = fn; + + //// // //移動檔案Source至Queue + //// try + //// { + //// blnMoveFile = true; + //// File.Move(fn, strQueuePath + Path.GetFileName(fn)); + //// } + //// catch (Exception ex) + //// { + //// blnMoveFile = false; + //// funImpMTLVendorTestDataRet = ex.Message; + //// throw new Exception(funImpMTLVendorTestDataRet); + //// // Throw New System.Exception("此執行程序已中止,由另一執行程序處理中!!") + //// } + + //// try + //// { + //// // //將檔案來源改為Queue + //// FileName = strQueuePath + Path.GetFileName(fn); + + //// // 解析來料檔案存入MES TestSummary, 開立進料單, 入原物料倉 + //// if (fuTestDataToTestSum_MTL(FileName, strMSplitSign, strDSplitSign, intVendorMTLNo, intVendorMTLLotNo, intVendorNo, intCompLotNo, intD_VendorMTLNo, intD_VendorMTLLotNo, intD_ComponentNo, intD_SlotNo, intD_CompLotNo, intD_LaserMark, intEquipmentNo, intWaferSize, intThickNess, intColumnStart, intDataStart, strInventoryNo, fi.Name.ToString()) == false) + + //// { + //// throw new Exception(); + //// } + //// } + + //// catch (Exception ex) + //// { + //// funImpMTLVendorTestDataRet = "依格式檔案定義解析資料存入MES TestSummary, 原物料倉 資料表失敗: " + ex.Message; + //// throw new Exception(funImpMTLVendorTestDataRet); + //// } + + + //// // //目錄不存在時必須要先建立 + //// if (Directory.Exists(strDestinationPath + DirName) == false) + //// { + //// Directory.CreateDirectory(strDestinationPath + DirName); + //// } + //// // //檔案已存在Destination必須先刪除 + //// if (File.Exists(strDestinationPath + DirName + @"\" + Path.GetFileName(FileName)) == true) + //// { + //// File.Delete(strDestinationPath + DirName + @"\" + Path.GetFileName(FileName)); + //// } + //// // //移動檔案Queue至Destination + //// File.Move(FileName, strDestinationPath + DirName + @"\" + Path.GetFileName(FileName)); + + //// FileName = ""; + + //// } + //// } + + //// catch (Exception ex) + //// { + + //// // //檔案處理失敗時移動檔案至Fail + //// if (!string.IsNullOrEmpty(FileName)) + //// { + //// // //目錄不存在時必須要先建立 + //// if (Directory.Exists(strFailPath + DirName) == false) + //// { + //// Directory.CreateDirectory(strFailPath + DirName); + //// } + //// // //檔案已存在File必須先刪除 + //// if (File.Exists(strFailPath + DirName + @"\" + Path.GetFileName(FileName)) == true) + //// { + //// File.Delete(strFailPath + DirName + @"\" + Path.GetFileName(FileName)); + //// } + //// // //移動檔案至Fail + //// try + //// { + //// File.Move(FileName, strFailPath + DirName + @"\" + Path.GetFileName(FileName)); + //// } + //// catch (Exception ex1) + //// { + //// } + + //// // 記錄錯誤的FileName + //// strFailLog = strFailLog + "[" + Path.GetFileName(FileName) + "][" + ex.Message + "]" + Constants.vbCrLf; + + //// FileName = ""; + //// } + + //// // 一個檔案失敗繼續讀取下個檔案 + //// continue; + + //// } + + //// } // For Each fn As String In aryFile + + //// } // For Each strDir As String In aryDir + + //// funImpMTLVendorTestDataRet = "success"; + //// } + + //// catch (Exception e1) + //// { + + //// strFailLog = strFailLog + "[" + e1.Message + "]" + Constants.vbCrLf; + //// } + + //// // 2019/8/12,Ning, 已改在上面的Loop中處理檔案移動至Fail目錄 + //// // //檔案處理失敗時移動檔案Queue至Fail + //// // If FileName <> String.Empty AndAlso blnMoveFile = True Then + //// // '//目錄不存在時必須要先建立 + //// // If My.Computer.FileSystem.DirectoryExists(strFailPath & DirName) = False Then + //// // My.Computer.FileSystem.CreateDirectory(strFailPath & DirName) + //// // End If + //// // '//檔案已存在File必須先刪除 + //// // If File.Exists(strFailPath & DirName & "\" & Path.GetFileName(FileName)) = True Then + //// // File.Delete(strFailPath & DirName & "\" & Path.GetFileName(FileName)) + //// // End If + //// // '//移動檔案Queue至Fail + //// // Try + //// // File.Move(FileName, strFailPath & DirName & "\" & Path.GetFileName(FileName)) + //// // Catch ex1 As Exception + //// // End Try + + //// // End If + + //// // '//回傳錯誤原因 + //// // funImpMTLVendorTestData = "[JobNo:" & strJobNo & "][FunctionNo:funImpMTLVendorTestData][FileName:" & Path.GetFileName(FileName) & "][" & e1.Message & ",StackTrace:" & e1.StackTrace & "]" + + //// finally + //// { + + //// CloseConnection(cnnTemp); + //// if (!(drTemp == null)) + //// drTemp.Close(); + //// //if (!(cmmTemp == null)) + //// // cmmTemp.Dispose(); + //// if (r != null) + //// r.Close(); + //// if (fs != null) + //// fs.Close(); + + //// if (!string.IsNullOrEmpty(strFailLog)) + //// { + //// funImpMTLVendorTestDataRet = CombineFailMsg("0000-999999", "[JobNo:" + strJobNo + "][FunctionNo:funImpMTLVendorTestData]" + strFailLog); + //// } + + //// } + + //// return funImpMTLVendorTestDataRet; + + ////} + + //private bool fuTestDataToTestSum_MTL(string pFilePath, string strMSplitSign, string strDSplitSign, int intVendorMTLNo, int intVendorMTLLotNo, int intVendorNo, int intComponentLotNo, int intD_VendorMTLNo, int intD_VendorMTLLotNo, int intD_ComponentNo, int intD_SlotNo, int intD_CompLotNo, int intD_LaserMark, int intEquipmentNo, int intWaferSize, int intThickness, int intColumnStart, int intDataStart, string InventoryNo, string FileName) + + + + //{ + + // bool blnResult; + // var objReader = default(StreamReader); + // // 2019/3/26, Ning, 加入Encode, 排除中文亂碼問題 + // // Dim encode As System.Text.Encoding = System.Text.Encoding.GetEncoding("UTF-8") + // var encode = Encoding.Default; + // string strLine; + + // string strVendorMTLNo = default(string), strVendorMTLLotNo = default(string), strVendorNo = default(string), strCompLotNo = default(string), strD_VendorMTLNo = default(string), strD_VendorMTLLotNo, strD_CompLotNo, strD_SlotNo, strD_LaserMark; + // string strComponentNo; + // var strEquipmentNo = default(string); + // var strWaferSize = default(string); + // var strThickness = default(string); + + // string[] aryTemp; + // var dtData = default(DataTable); + // var dtFixData = default(DataTable); // 存固定參數的欄位值 + // short i; + // bool blnDataAdd = false; + // string strOrgColName, strColumnName; + // DataRow drAdd; + // DataRow drAddFix; + // string strSQL, strTableName, strSQLAddField, strSQLAddValue; + // var CollectionSQL = new Collection(); + + // IDbConnection cnnTemp = default(IDbConnection); + // DbDataReader drTemp; + + // string TestRecipeType; + // string strLogTableName, strSQLHead, strSQLLogHead; + // //System.Data.OleDb.OleDbDataAdapter daTemp; + // DataTable dtTestRecipe; + // DataSet dsTemp; + // DateTime datEventTime; + + // // 開立進料單 + // DataView dvFixData; + // DataRow[] drSel; + // DataTable dtMTLInDetail; + // string strMaterialInNo, strUnitNo; + // bool blnFound; + // var IniCollectionSQL = new Collection(); + // var FinalCollectionSQL = new Collection(); + // decimal decSafeQty; + // bool bIndustryCheck = false; + // try + // { + // // //Create connection + // cnnTemp = CreateConnection(strConnectionString); + + // blnResult = false; + + // strSQL = "Select 1 From tblSYSfunction Where Upper(ActiveModule) in ('IC_CP_PKG','SEMI_WAFER')"; + // //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + // drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + // if (drTemp.Read()) + // { + // bIndustryCheck = true; + // } + // drTemp.Close(); + // //cmmTemp.Dispose(); + + // // 來料只會有一種測試類別, 取得TestRecipeBasis中TestRecipeClass = 1的TestRecipeType即是來料的測試類別 + // strSQL = "Select TestRecipeType From tblSYSTestRecipeBasis Where TestRecipeClass = 1"; + // //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + // drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + // if (drTemp.Read()) + // { + // TestRecipeType = Conversions.ToString(drTemp["TestRecipeType"]); + // } + // else + // { + // throw new Exception("解析檔案失敗, 無法找到分類為來料之測試類別!"); + // } + // drTemp.Close(); + // //cmmTemp.Dispose(); + + // // 電性值資料表名稱: tblWIPTestSum_測試類別 + // strTableName = "TBLWIPTESTSUM_" + TestRecipeType; + // strLogTableName = "TBLWIPTESTSUMLOG_" + TestRecipeType; + + // // 依測試類別找出其TestRecipeNo(參數編號), ConversionField(欄位名稱) + // strSQL = "Select TestRecipeNo, ConversionField From tblSYSTestRecipeBasis Where TestRecipeType = '" + TestRecipeType + "'"; + // //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + // //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp); + // dsTemp = new DataSet(); + // //daTemp.Fill(dsTemp, "TestRecipe"); + // ExecuteSQLQuery_Adapter(strSQL, dsTemp, "TestRecipe", cnnTemp); + // dtTestRecipe = dsTemp.Tables["TestRecipe"]; + + + // // 解檔 + // objReader = new StreamReader(pFilePath, encode); + // // 先讀取第一列, 再以第一列的編碼方式讀檔 + // strLine = objReader.ReadLine().Trim(); + // encode = objReader.CurrentEncoding; + // objReader.Close(); + // objReader = null; + // objReader = new StreamReader(pFilePath, encode); + + // int x = 0; + + // while (!objReader.EndOfStream) + // { + // x = x + 1; + + // strLine = objReader.ReadLine().Trim(); + // if (strLine != null && !string.IsNullOrEmpty(strLine.Trim())) + // { + + // if (x == intVendorMTLNo) // 1.取得VendorMTLNo + // { + // // 2019/2/22, Ning, 以傳入的表頭分隔字元拆解 + // aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + // if (aryTemp.Length > 1) + // { + // strVendorMTLNo = aryTemp[1].ToString().Trim(); + // if (string.IsNullOrEmpty(strVendorMTLNo)) + // { + // throw new Exception("無法取得VendorMaterialNo!!"); + // } + // } + // else + // { + // throw new Exception("不支援此檔案格式,格式內容資料解析需為" + strMSplitSign); + // } + // } + + // if (x == intVendorMTLLotNo) // 2.取得VendorMTLLotNo + // { + // // 2019/2/22, Ning, 以傳入的表頭分隔字元拆解 + // aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + // if (aryTemp.Length > 1) + // { + // strVendorMTLLotNo = aryTemp[1].ToString().Trim(); + // if (string.IsNullOrEmpty(strVendorMTLLotNo)) + // { + // throw new Exception("無法取得VendorMaterialLotNo!!"); + // } + // } + // else + // { + // throw new Exception("不支援此檔案格式,格式內容資料解析需為" + strMSplitSign); + // } + // } + + // if (x == intVendorNo) // 3.取得VendorNo + // { + // // 2019/2/22, Ning, 以傳入的表頭分隔字元拆解 + // aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + // if (aryTemp.Length > 1) + // { + // strVendorNo = aryTemp[1].ToString().Trim(); + // if (string.IsNullOrEmpty(strVendorNo)) + // { + // throw new Exception("無法取得VendorNo!!"); + // } + // } + // else + // { + // throw new Exception("不支援此檔案格式,格式內容資料解析需為" + strMSplitSign); + // } + // } + + // if (x == intComponentLotNo) // 3.5取得ComponentLotNo + // { + // // 2019/2/22, Ning, 以傳入的表頭分隔字元拆解 + // aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + // if (aryTemp.Length > 1) + // { + // strCompLotNo = aryTemp[1].ToString().Trim(); + // if (string.IsNullOrEmpty(strCompLotNo)) + // { + // throw new Exception("無法取得ComponentLotNo!!"); + // } + // } + // else + // { + // throw new Exception("不支援此檔案格式,格式內容資料解析需為" + strMSplitSign); + // } + // } + + // if (x == intEquipmentNo) // 4.取得EquipmentNo + // { + // // 2019/2/22, Ning, 以傳入的表頭分隔字元拆解 + // aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + // if (aryTemp.Length > 1) + // { + // strEquipmentNo = aryTemp[1].ToString().Trim(); + // } + // else + // { + // throw new Exception("不支援此檔案格式,格式內容資料解析需為" + strMSplitSign); + // } + // } + + // if (x == intWaferSize) // 5.取得Wafer尺寸 + // { + // // 2019/2/22, Ning, 以傳入的表頭分隔字元拆解 + // aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + // if (aryTemp.Length > 1) + // { + // strWaferSize = aryTemp[1].ToString().Trim(); + // } + // else + // { + // throw new Exception("不支援此檔案格式,格式內容資料解析需為" + strMSplitSign); + // } + // } + + // if (x == intThickness) // 6.取得厚度 + // { + // // 2019/2/22, Ning, 以傳入的表頭分隔字元拆解 + // aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + // if (aryTemp.Length > 1) + // { + // strThickness = aryTemp[1].ToString().Trim(); + // } + // else + // { + // throw new Exception("不支援此檔案格式,格式內容資料解析需為" + strMSplitSign); + // } + // } + + // if (x == intColumnStart) // 取得欄位名稱 + // { + + // try + // { + // dtData = new DataTable("CSVData"); + // dtFixData = new DataTable("FixData"); + + // // 2019/2/22,Ning明細以strDSplitSign分隔 + // // 若結尾為strDSplitSign則去掉 + // if (strLine.EndsWith(strDSplitSign)) + // { + // strLine = strLine.TrimEnd(Conversions.ToChar(strDSplitSign)); + // } + + // aryTemp = strLine.Split(Conversions.ToChar(strDSplitSign)); + + // drAdd = dtData.NewRow(); + // var loopTo = (short)(aryTemp.Length - 1); + // for (i = 0; i <= loopTo; i++) + // { + // // 新增 Column + // if (dtData.Columns.Count <= i) + // { + + // // 2019/3/22,Ning,先以原始欄位存入, 後端再判斷是否為固定參數的位置 + + // strColumnName = aryTemp[i].ToString().ToUpper().Trim(); + // drSel = dtTestRecipe.Select("TestRecipeNo = '" + strColumnName + "'"); + // if (drSel.Length > 0) + // { + // strColumnName = drSel[0]["ConversionField"].ToString(); + // } + // else + // { + // // 欄位名稱只能是數字或英文字母, 這兩者除外的皆以_取代 + // for (int jj = 0, loopTo1 = strColumnName.Length - 1; jj <= loopTo1; jj++) + // { + // if (!char.IsNumber(Conversions.ToChar(strColumnName.Substring(jj, 1))) && !char.IsLetter(Conversions.ToChar(strColumnName.Substring(jj, 1)))) + // { + // strColumnName = Strings.Replace(strColumnName, strColumnName.Substring(jj, 1), "_"); + // } + // } + + // if (string.IsNullOrEmpty(strColumnName)) + // { + // strColumnName = "COL" + i; + // } + + // // 判斷取代後的欄位是否已存在,若已存在則於欄位後方加COL+欄位顯示順序 + // if (dtData.Columns.Contains(strColumnName)) + // { + // strColumnName = strColumnName + "COL" + i; + // } + // } + + // dtData.Columns.Add(strColumnName.ToUpper(), Type.GetType("System.String")); + + // // 明細固定參數, D_VendorMTLNo, D_VendorMTLLotNo, D_ComponentNo, D_SlotNo, D_ComponentLotNo, D_LaserMark + // if (i + 1 == intD_VendorMTLNo) + // { + // strColumnName = "D_VendorMTLNo"; + // dtFixData.Columns.Add(strColumnName, Type.GetType("System.String")); + // } + // if (i + 1 == intD_VendorMTLLotNo) + // { + // strColumnName = "D_VendorMTLLotNo"; + // dtFixData.Columns.Add(strColumnName, Type.GetType("System.String")); + // } + // if (i + 1 == intD_ComponentNo) + // { + // strColumnName = "D_ComponentNo"; + // dtFixData.Columns.Add(strColumnName, Type.GetType("System.String")); + // } + // if (i + 1 == intD_SlotNo) + // { + // strColumnName = "D_SlotNo"; + // dtFixData.Columns.Add(strColumnName, Type.GetType("System.String")); + // } + // if (i + 1 == intD_CompLotNo) + // { + // strColumnName = "D_ComponentLotNo"; + // dtFixData.Columns.Add(strColumnName, Type.GetType("System.String")); + // } + // if (i + 1 == intD_LaserMark) + // { + // strColumnName = "D_LaserMark"; + // dtFixData.Columns.Add(strColumnName, Type.GetType("System.String")); + // } + // } + // } + // } + + // catch + // { + // throw; + // } + // } + + // if (x == intDataStart || blnDataAdd == true) // 取得明細資料 + // { + + // blnDataAdd = true; + // try + // { + // aryTemp = strLine.Split(Conversions.ToChar(strDSplitSign)); + + // drAdd = dtData.NewRow(); + // drAddFix = dtFixData.NewRow(); + // // 填入資料 + // var loopTo2 = (short)(dtData.Columns.Count - 1); + // for (i = 0; i <= loopTo2; i++) + // { + // drAdd[i] = Strings.Trim(aryTemp[i]); + // if (i + 1 == intD_VendorMTLNo) + // { + // drAddFix["D_VendorMTLNo"] = Strings.Trim(aryTemp[i]); + // } + // if (i + 1 == intD_VendorMTLLotNo) + // { + // drAddFix["D_VendorMTLLotNo"] = Strings.Trim(aryTemp[i]); + // } + // if (i + 1 == intD_ComponentNo) + // { + // drAddFix["D_ComponentNo"] = Strings.Trim(aryTemp[i]); + // } + // if (i + 1 == intD_SlotNo) + // { + // drAddFix["D_SlotNo"] = Strings.Trim(aryTemp[i]); + // } + // if (i + 1 == intD_CompLotNo) + // { + // drAddFix["D_ComponentLotNo"] = Strings.Trim(aryTemp[i]); + // } + // if (i + 1 == intD_LaserMark) + // { + // drAddFix["D_LaserMark"] = Strings.Trim(aryTemp[i]); + // } + // } + // dtData.Rows.Add(drAdd); + // dtFixData.Rows.Add(drAddFix); + // } + // catch (Exception ex) + // { + // throw; + // } + // } + + // } + // } + + // objReader.Close(); + + // // TestSum, TestSumLog存入DB + // if (!dtFixData.Columns.Contains("D_ComponentNo")) + // { + // throw new Exception("無法取得ComponentNo!!"); + // } + + // datEventTime = DateTime.Now; + + // // 取得進料單號 + // strMaterialInNo = funGetMaterialInNo(true); + + // for (int idx = 0, loopTo3 = dtData.Rows.Count - 1; idx <= loopTo3; idx++) + // { + // // 若明細沒有供應商料號, 用表頭資料取代 + // if (dtFixData.Columns.Contains("D_VendorMTLNo")) + // { + // strD_VendorMTLNo = dtFixData.Rows[idx]["D_VendorMTLNo"].ToString(); + // } + // else + // { + // strD_VendorMTLNo = strVendorMTLNo; + // } + // // 若明細沒有供應商物料批號, 用表頭資料取代 + // if (dtFixData.Columns.Contains("D_VendorMTLLotNo")) + // { + // strD_VendorMTLLotNo = dtFixData.Rows[idx]["D_VendorMTLLotNo"].ToString(); + // } + // else + // { + // strD_VendorMTLLotNo = strVendorMTLLotNo; + // } + + // if (string.IsNullOrEmpty(strD_VendorMTLNo)) + // { + // throw new Exception("VendorMaterialNo不可為空白!"); + // } + // // 2019/3/28,Ning,VendorMaterialNo必須存在物料主檔中 + // strSQL = "Select MaterialNo From tblMTLMaterialBasis Where IssueState = 2 And MaterialNo = '" + strD_VendorMTLNo + "'"; + // //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + // drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + // if (!drTemp.Read()) + // { + // throw new Exception("VendorMaterialNo不存在於物料主檔中!"); + // } + // drTemp.Close(); + // //cmmTemp.Dispose(); + // if (string.IsNullOrEmpty(strD_VendorMTLLotNo)) + // { + // throw new Exception("VendorMaterialLotNo不可為空白!"); + // } + // if (dtFixData.Columns.Contains("D_SlotNo")) + // { + // strD_SlotNo = dtFixData.Rows[idx]["D_SlotNo"].ToString(); + // } + // else + // { + // if (bIndustryCheck) + // { + // throw new Exception("SlotNo不可為空白!"); + // } + // strD_SlotNo = ""; + // } + // // 若明細沒有元件批號, 用表頭資料取代 + // if (dtFixData.Columns.Contains("D_ComponentLotNo")) + // { + // strD_CompLotNo = dtFixData.Rows[idx]["D_ComponentLotNo"].ToString(); + // } + // else + // { + // strD_CompLotNo = strCompLotNo; + // } + // if (dtFixData.Columns.Contains("D_LaserMark")) + // { + // strD_LaserMark = dtFixData.Rows[idx]["D_LaserMark"].ToString(); + // } + // else + // { + // strD_LaserMark = ""; + // } + // // tblWIPTestSum刪除已存在資料, 只保留最新一次資料 + // strSQL = Conversions.ToString(Operators.ConcatenateObject(Operators.ConcatenateObject("Delete From " + strTableName + " Where MaterialNo = '" + strD_VendorMTLNo + "' And MaterialLotNo = '" + strD_VendorMTLLotNo + "' And ComponentNo = '", dtFixData.Rows[idx]["D_ComponentNo"]), "'")); + // CollectionSQL.Add(strSQL); + + // // //新增TestSummary, TestSummaryLog + // // strSQLAddField = "Insert into " & strTableName & " (" + // strSQLHead = "Insert into " + strTableName + " ("; + // strSQLLogHead = "Insert into " + strLogTableName + " ("; + // strSQLAddValue = " Values ("; + + // // 固定欄位 + // strSQLAddField = "MaterialNo, MaterialLotNo, ComponentNo, VendorMaterialNo, FileName, ImportUserNo, ImportDate,"; + // strSQLAddValue = strSQLAddValue + "'" + strD_VendorMTLNo + "','" + strD_VendorMTLLotNo + "','" + dtFixData.Rows[idx]["D_ComponentNo"].ToString() + "','" + strD_VendorMTLNo + "','" + FileName + "'," + " 'AutoRun', To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),"; + + // bool blnD_EquipmentNo, blnD_WaferSize, blnD_Thickness; // 明細是否有動態表頭欄位, 有的話以明細為準 + // blnD_EquipmentNo = false; + // blnD_WaferSize = false; + // blnD_Thickness = false; + // // 動態欄位(明細欄位) + // for (int w = 0, loopTo4 = dtData.Columns.Count - 1; w <= loopTo4; w++) + // { + // strColumnName = dtData.Columns[w].ColumnName; + // // If strColumnName = "D_VENDORMTLNO" OrElse strColumnName = "D_VENDORMTLLOTNO" OrElse strColumnName = "D_COMPONENTNO" _ + // // OrElse strColumnName = "D_SLOTNO" OrElse strColumnName = "D_COMPONENTLOTNO" OrElse strColumnName = "D_LASERMARK" Then + // // Continue For + // // End If + + // // TestRecipeBasis有定義此欄位才需要存入, 欄位名稱已轉換為ConversionField + // drSel = dtTestRecipe.Select("ConversionField = '" + strColumnName + "'"); + // if (drSel.Length > 0) + // { + // strSQLAddField = strSQLAddField + strColumnName + ","; + // strSQLAddValue = strSQLAddValue + "'" + dtData.Rows[idx][strColumnName].ToString() + "',"; + + // if (strColumnName.ToUpper() == "EQUIPMENTNO") + // { + // blnD_EquipmentNo = true; + // } + // if (strColumnName.ToUpper() == "WAFERSIZE") + // { + // blnD_WaferSize = true; + // } + // if (strColumnName.ToUpper() == "THICKNESS") + // { + // blnD_Thickness = true; + // } + // } + // } + + // // 動態欄位(表頭欄位) + // // 2019/5/22, Ning, 若明細沒有, 才以表頭的值填入 + // if (!blnD_EquipmentNo && dtTestRecipe.Select("TestRecipeNo = 'EquipmentNo'").Length > 0) + // { + // strSQLAddField = strSQLAddField + "EquipmentNo,"; + // strSQLAddValue = strSQLAddValue + "'" + strEquipmentNo + "',"; + // } + // if (!blnD_WaferSize && dtTestRecipe.Select("TestRecipeNo = 'WaferSize'").Length > 0) + // { + // strSQLAddField = strSQLAddField + "WaferSize,"; + // strSQLAddValue = strSQLAddValue + "'" + strWaferSize + "',"; + // } + // if (!blnD_Thickness && dtTestRecipe.Select("TestRecipeNo = 'Thickness'").Length > 0) + // { + // strSQLAddField = strSQLAddField + "Thickness,"; + // strSQLAddValue = strSQLAddValue + "'" + strThickness + "',"; + // } + + // if (Strings.InStr(1, strSQLAddField, ",") != 0) // 刪除最後一個"," + // { + // if (Strings.Right(strSQLAddField, 1) == ",") + // { + // strSQLAddField = Strings.Mid(strSQLAddField, 1, Strings.Len(strSQLAddField) - 1); + // } + // } + + // if (Strings.InStr(1, strSQLAddValue, ",") != 0) // 刪除最後一個"," + // { + // if (Strings.Right(strSQLAddValue, 1) == ",") + // { + // strSQLAddValue = Strings.Mid(strSQLAddValue, 1, Strings.Len(strSQLAddValue) - 1); + // } + // } + + // // 直接給定strSQL + // strSQL = strSQLHead + strSQLAddField + ")" + strSQLAddValue + ")"; + // CollectionSQL.Add(strSQL); + + // // Log SQL + // strSQL = strSQLLogHead + strSQLAddField + ")" + strSQLAddValue + ")"; + // CollectionSQL.Add(strSQL); + + // // 進料單Component + // strSQL = Conversions.ToString(Operators.ConcatenateObject(Operators.ConcatenateObject(Operators.ConcatenateObject(Operators.ConcatenateObject("Insert into tblINVMaterialInComponent (MaterialInNo, MaterialNo, MaterialLotNo, ComponentNo, SlotNo)" + " Values ('" + strMaterialInNo + "','" + strD_VendorMTLNo + "','" + strD_VendorMTLLotNo + "','", dtFixData.Rows[idx]["D_ComponentNo"]), "', '"), strD_SlotNo), "')")); + // CollectionSQL.Add(strSQL); + + // // 原物料倉Component + // // '2019/6/12, 依Josh指示, 同一ComponentNo在原物料倉不能有兩筆以上, 依ComponentNo先刪除再新增 + // // 'strSQL = "Delete From tblINVRAWInventoryComponent Where ComponentNo = '" & dtFixData.Rows(idx)("D_ComponentNo") & "'" + // // 'CollectionSQL.Add(strSQL) + // strSQL = Conversions.ToString(Operators.ConcatenateObject(Operators.ConcatenateObject("Select ComponentNo From tblINVRAWInventoryComponent Where ComponentNo = '", dtFixData.Rows[idx]["D_ComponentNo"]), "'")); + // //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + // drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + // if (drTemp.Read()) + // { + // throw new Exception(Conversions.ToString(Operators.ConcatenateObject(Operators.ConcatenateObject("WaferID: ", dtFixData.Rows[idx]["D_ComponentNo"]), " 已存在原料倉, 不允許匯入, 若要重新匯入要先做庫房出庫或刪除動作!"))); + // } + // drTemp.Close(); + // //cmmTemp.Dispose(); + + // strSQL = Conversions.ToString(Operators.ConcatenateObject(Operators.ConcatenateObject(Operators.ConcatenateObject(Operators.ConcatenateObject(Operators.ConcatenateObject(Operators.ConcatenateObject(Operators.ConcatenateObject(Operators.ConcatenateObject("Insert into tblINVRAWInventoryComponent (InventoryNo, MaterialNo, MaterialLotNo, ComponentNo, SlotNo, ComponentLotNo, S_LaserMark)" + " Values ('" + InventoryNo + "','" + strD_VendorMTLNo + "','" + strD_VendorMTLLotNo + "','", dtFixData.Rows[idx]["D_ComponentNo"]), "', '"), strD_SlotNo), "','"), strD_CompLotNo), "','"), strD_LaserMark), "')")); + // CollectionSQL.Add(strSQL); + + // // 2019/7/23, Ning, 將資料填入tblINVTemp_Component待AutoRun滾算芯片挑片規則, 原料庫InventoryType:0 + // strSQL = Conversions.ToString(Operators.ConcatenateObject(Operators.ConcatenateObject("Insert Into tblINVTemp_Component (InventoryNo, ComponentNo, InventoryType)" + " Values('" + InventoryNo + "','", dtFixData.Rows[idx]["D_ComponentNo"]), "',0)")); + // CollectionSQL.Add(strSQL); + // } + + // // 進料單明細需以MaterialNo, MaterialLotNo做Group By計算數量 + // dtMTLInDetail = new DataTable("MTLInDetail"); + // dtMTLInDetail.Columns.Add("MaterialNo", Type.GetType("System.String")); + // dtMTLInDetail.Columns.Add("MaterialLotNo", Type.GetType("System.String")); + // dtMTLInDetail.Columns.Add("Qty", Type.GetType("System.Int16")); + // dvFixData = dtFixData.DefaultView; + // dvFixData.Sort = "D_VendorMTLNo, D_VendorMTLLotNo"; + // var loopTo5 = (short)(dvFixData.Count - 1); + // for (i = 0; i <= loopTo5; i++) + // { + // drSel = dtMTLInDetail.Select("MaterialNo = '" + dvFixData[i]["D_VendorMTLNo"].ToString() + "' And MaterialLotNo = '" + dvFixData[i]["D_VendorMTLLotNo"].ToString() + "'"); + // if (drSel.Length > 0) + // { + // drSel[0].BeginEdit(); + // drSel[0]["Qty"] = Operators.AddObject(drSel[0]["Qty"], 1); + // drSel[0].EndEdit(); + // } + // else + // { + // drAdd = dtMTLInDetail.NewRow(); + // drAdd["MaterialNo"] = dvFixData[i]["D_VendorMTLNo"].ToString(); + // drAdd["MaterialLotNo"] = dvFixData[i]["D_VendorMTLLotNo"].ToString(); + // drAdd["Qty"] = 1; + // dtMTLInDetail.Rows.Add(drAdd); + // } + // } + + // // 進料單主檔(State直接給2) + // strSQL = "Insert into tblINVMaterialInBasis (MaterialInNo, InventoryNo, VendorNo, State, Creator, CreateDate,ConfirmDate)" + " Values ('" + strMaterialInNo + "','" + InventoryNo + "','" + strVendorNo + "', 2, 'AutoRun'," + " To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')," + " To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'))"; + // CollectionSQL.Add(strSQL); + + // foreach (DataRow drDetail in dtMTLInDetail.Rows) + // { + + // strSQL = Conversions.ToString(Operators.ConcatenateObject(Operators.ConcatenateObject("Select SafeQty,UnitNo From tblMTLMaterialBasis Where MaterialNo = '", drDetail["MaterialNo"]), "'")); + // //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + // drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + // if (drTemp.Read()) + // { + // if (!(drTemp["SafeQty"] is DBNull)) + // { + // decSafeQty = Conversions.ToDecimal(drTemp["SafeQty"]); + // } + // else + // { + // decSafeQty = 0m; + // } + // strUnitNo = Conversions.ToString(drTemp["UnitNo"]); + // } + // else + // { + // decSafeQty = 0m; + // strUnitNo = "pcs"; + // } + // drTemp.Close(); + + // // 進料單明細檔 + // strSQL = Conversions.ToString(Operators.ConcatenateObject(Operators.ConcatenateObject(Operators.ConcatenateObject(Operators.ConcatenateObject(Operators.ConcatenateObject(Operators.ConcatenateObject(Operators.ConcatenateObject(Operators.ConcatenateObject("Insert into tblINVMaterialInDetail (MaterialInNo,MaterialNo,MaterialLotNo,LocatorNo,UnitNo,Qty,LimitTime)" + " Values ('" + strMaterialInNo + "','", drDetail["MaterialNo"]), "','"), drDetail["MaterialLotNo"]), "','N/A','"), strUnitNo), "',"), drDetail["Qty"]), ",0)")); + // CollectionSQL.Add(strSQL); + + // // 進料單確認(入庫) + // // 處理原料倉現況主檔資料 + // strSQL = Conversions.ToString(Operators.ConcatenateObject(Operators.ConcatenateObject("Select * From tblINVRawInventory Where InventoryNo = '" + InventoryNo + "' And MaterialNo = '", drDetail["MaterialNo"]), "'")); + // //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + // drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + // if (drTemp.Read()) + // { + // // 數量相加 + // strSQL = Conversions.ToString(Operators.ConcatenateObject(Operators.ConcatenateObject(Operators.ConcatenateObject(Operators.ConcatenateObject(Operators.ConcatenateObject(Operators.ConcatenateObject(Operators.ConcatenateObject("Update tblINVRawInventory Set CurQty = CurQty + ", drDetail["Qty"]), " Where InventoryNo = '"), InventoryNo), "'"), " And MaterialNo = '"), strD_VendorMTLNo), "'")); + // CollectionSQL.Add(strSQL); + // drTemp.Close(); + // } + // else // 找不到資料時一律先新增一筆CurrentQty=0的資料列,再做Update動作 + // { + // drTemp.Close(); + // strSQL = Conversions.ToString(Operators.ConcatenateObject(Operators.ConcatenateObject(Operators.ConcatenateObject(Operators.ConcatenateObject(Operators.ConcatenateObject(Operators.ConcatenateObject("Insert into tblINVRawInventory (InventoryNo, MaterialNo, SafeQty, CurQty, AllocateQty, UnitNo)" + " Values ('" + InventoryNo + "','", drDetail["MaterialNo"]), "',"), decSafeQty), ", 0, 0,'"), strUnitNo), "')")); + + // // 先確定之前沒有加過再加這筆資料 + // blnFound = false; + // var loopTo6 = (short)IniCollectionSQL.Count; + // for (i = 1; i <= loopTo6; i++) + // { + // if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(strSQL, IniCollectionSQL[i], false))) + // { + // blnFound = true; + // } + // } + // if (!blnFound) + // { + // IniCollectionSQL.Add(strSQL); + // } + + // strSQL = Conversions.ToString(Operators.ConcatenateObject(Operators.ConcatenateObject(Operators.ConcatenateObject(Operators.ConcatenateObject(Operators.ConcatenateObject(Operators.ConcatenateObject(Operators.ConcatenateObject("Update tblINVRawInventory Set CurQty = CurQty + ", drDetail["Qty"]), " Where InventoryNo = '"), InventoryNo), "'"), " And MaterialNo = '"), drDetail["MaterialNo"]), "'")); + // CollectionSQL.Add(strSQL); + // } + + // // 處理原料倉儲位現況資料 + // strSQL = Conversions.ToString(Operators.ConcatenateObject(Operators.ConcatenateObject(Operators.ConcatenateObject(Operators.ConcatenateObject(Operators.ConcatenateObject("Select * From tblINVRawInventoryLoc Where InventoryNo = '" + InventoryNo + "'" + " And LocatorNo = 'N/A' And MaterialNo = '", drDetail["MaterialNo"]), "'"), " And MaterialLotNo = '"), drDetail["MaterialLotNo"]), "'")); + + // //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + // drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + // if (drTemp.Read()) + // { + // // 數量相加 + // strSQL = Conversions.ToString(Operators.ConcatenateObject(Operators.ConcatenateObject(Operators.ConcatenateObject(Operators.ConcatenateObject(Operators.ConcatenateObject(Operators.ConcatenateObject(Operators.ConcatenateObject(Operators.ConcatenateObject(Operators.ConcatenateObject(Operators.ConcatenateObject(Operators.ConcatenateObject(Operators.ConcatenateObject(Operators.ConcatenateObject(Operators.ConcatenateObject("Update tblINVRawInventoryLoc Set LocQty = LocQty + ", drDetail["Qty"]), ","), " InputDate = To_Date('"), Strings.Format(Conversions.ToDate(datEventTime), "yyyy/MM/dd H:mm:ss")), "','YYYY/MM/DD HH24:MI:SS')"), " Where InventoryNo = '"), InventoryNo), "'"), " And LocatorNo = 'N/A' And MaterialNo = '"), drDetail["MaterialNo"]), "'"), " And MaterialLotNo = '"), drDetail["MaterialLotNo"]), "'")); + + + + // CollectionSQL.Add(strSQL); + // } + // else + // { + // // 新增一筆 + // strSQL = Conversions.ToString(Operators.ConcatenateObject(Operators.ConcatenateObject(Operators.ConcatenateObject(Operators.ConcatenateObject(Operators.ConcatenateObject(Operators.ConcatenateObject(Operators.ConcatenateObject(Operators.ConcatenateObject(Operators.ConcatenateObject(Operators.ConcatenateObject("Insert into tblINVRawInventoryLoc (InventoryNo, LocatorNo, MaterialNo, MaterialLotNo, VendorNo, LocQty, InputDate)" + " Values ('" + InventoryNo + "','N/A','", drDetail["MaterialNo"]), "','"), drDetail["MaterialLotNo"]), "','"), strVendorNo), "',"), drDetail["Qty"]), ", To_Date('"), Strings.Format(Conversions.ToDate(datEventTime), "yyyy/MM/dd H:mm:ss")), "','YYYY/MM/DD HH24:MI:SS'))")); + + // CollectionSQL.Add(strSQL); + // } + // drTemp.Close(); + // } + + // var loopTo7 = (short)IniCollectionSQL.Count; + // for (i = 1; i <= loopTo7; i++) + // FinalCollectionSQL.Add(IniCollectionSQL[i]); + // var loopTo8 = (short)CollectionSQL.Count; + // for (i = 1; i <= loopTo8; i++) + // FinalCollectionSQL.Add(CollectionSQL[i]); + + // // //執行SQL指令 + // string argstrDatabaseType = Conversions.ToString(DataBaseType); + // ExecuteSQLNoneQuery_UPD(argstrDatabaseType, strConnectionString, FinalCollectionSQL); + + // blnResult = true; + // } + + // catch (Exception ex) + // { + // throw; + // } + + // finally + // { + // CloseConnection(cnnTemp); + // objReader.Close(); + // objReader = null; + // aryTemp = null; + // } + + // return blnResult; + + //} + + //private string funGetMaterialInNo(bool ReserveSerialNo) + //{ + // string funGetMaterialInNoRet = default(string); + // var XmlDoc = new System.Xml.XmlDocument(); + + // // 組InXml的字串 + // string argSendTime = Conversions.ToString(DateTime.Now); + // strIdentity = modWIN.CombineXMLIdentity(ref modWIN.gComputerName, ref modWIN.gUserNo, ref argSendTime); + // string argvalue_name = "reserveserialno"; + // string argname = "ReserveSerialNo"; + // string argtype = "Boolean"; + // string argvalue = Conversions.ToString(ReserveSerialNo); + // string argdesc = ""; + // strParameter = modWIN.CombineXMLParameter(ref argvalue_name, ref argname, ref argtype, ref argvalue, ref argdesc); + // ReserveSerialNo = Conversions.ToBoolean(argvalue); + // InXml = modWIN.CombineXMLRequest(ref strIdentity, ref strParameter); + + // try + // { + // OutXml = modAutoLoaderLibrary.InvokeSrv("wsSYS.GetMaterialInNo", InXml); + + // XmlDoc.LoadXml(OutXml); + // if (modWIN.chkExecutionSuccess(ref XmlDoc)) + // { + // // 取出MaterialInNo + // if (XmlDoc.GetElementsByTagName("materialinno").Item(0).SelectNodes("value").Count > 0) + // { + // funGetMaterialInNoRet = XmlDoc.DocumentElement.GetElementsByTagName("materialinno").Item(0).SelectNodes("value").Item(0).InnerText; + // } + // } + // else + // { + // funGetMaterialInNoRet = "fail"; + // return funGetMaterialInNoRet; + // } + // } + + // catch (Exception ex) + // { + // funGetMaterialInNoRet = "fail"; + // } + + // XmlDoc = null; + // return funGetMaterialInNoRet; + + //} + + //private string funImportPage(Collection colParameters = null) + //{ + // string funImportPageRet = default(string); + + // string strJobNo = string.Empty; // JobNo + // string strSourcePath = string.Empty; // 來源檔案路徑 + // string strDestinationPath = string.Empty; // 目前檔案路徑 + // string strQueuePath = string.Empty; // 處理中檔案路徑 + // string strFailPath = string.Empty; // 失敗檔案路徑 + // string FileName = string.Empty; // 處理中檔案 + // string DirName = DateTime.Now.ToString("yyyyMM"); // 分類目錄名稱 + // string strLotNo = string.Empty; + // bool blnMoveFile = true; + // var cnnTemp = default(IDbConnection); + // DbDataReader drTemp; + // string strSQL = string.Empty; + + // try + // { + // // //Create Connection + // cnnTemp = CreateConnection(strConnectionString); + + // // //取出colParameter傳入參數 + // strJobNo = colParameters["JobNo"].ToString().Trim(); + // strSourcePath = colParameters["SourcePath"].ToString().Trim(); + // strDestinationPath = colParameters["DestinationPath"].ToString().Trim(); + // strQueuePath = colParameters["QueuePath"].ToString().Trim(); + // strFailPath = colParameters["FailPath"].ToString().Trim(); + + // string strBinCode = string.Empty; + // strLotNo = string.Empty; + + // // 資料讀取=================================================================================================================================== + // // //取出來源目錄中*.csv檔案 + // string[] DirFiles = Directory.GetFiles(strSourcePath, "*.csv"); + // // //將檔案複製到Queue的目錄中 + // foreach (var currentFileName in DirFiles) + // { + // FileName = currentFileName; + + // // //檢查檔案存不存在,有可能被另一個執行緒先處理 + // if (File.Exists(FileName) == true) + // { + + // var dsTemp = new DataSet(); + + // var CollectionSQL = new Collection(); + + // // //移動檔案Source至Queue + // try + // { + // blnMoveFile = true; + // File.Move(FileName, strQueuePath + Path.GetFileName(FileName)); + // } + // catch (Exception ex) + // { + // blnMoveFile = false; + // throw new Exception("此執行程序已中止,由另一執行程序處理中!!"); + // } + // // //將檔案來源改為Queue + // FileName = strQueuePath + Path.GetFileName(FileName); + // // //開始執行解檔處理 + // using (var myReader = new TextFieldParser(FileName)) + // { + // myReader.TextFieldType = FieldType.Delimited; + // myReader.Delimiters = new string[] { "," }; + + // funImportPage_CreateTempTable(ref dsTemp, "WIPPageSummaryBasis"); + // funImportPage_CreateTempTable(ref dsTemp, "WIPPageSummaryDetail"); + + // string[] currentRow; + + // bool blInsertDataFlag = false; // 判斷是否開始新增資料 或是 新增欄位 + // int intStartField = 0; + + // // //使用Try..Catch避免未釋放資源 + // try + // { + // // //Parser檔案 + // while (!myReader.EndOfData) + // { + // currentRow = myReader.ReadFields(); + + + // if (blInsertDataFlag) + // { + + // funImportPage_InsertDetailData(ref dsTemp, "WIPPageSummaryDetail", currentRow, intStartField); + // } + + + // else if (currentRow[0].ToString().Trim().ToUpper() == "POSX") // 此段為自動新增欄位 + // { + + // bool blnFindWaferFrom = false; + // intStartField = 0; + + // foreach (var currentField in currentRow) + // { + + // if (blnFindWaferFrom == false) + // { + // intStartField += 1; + // } + + // if (currentField.ToUpper() == "WAFERFROM") + // { + // blnFindWaferFrom = true; + // intStartField = intStartField - 1; + // } + + // if (blnFindWaferFrom == true) + // { + // if (currentField.ToUpper() == "WAFERFROM") + // { + // dsTemp.Tables["WIPPageSummaryDetail"].Columns.Add(currentField, Type.GetType("System.String")); + // } + // else + // { + // dsTemp.Tables["WIPPageSummaryDetail"].Columns.Add(currentField, Type.GetType("System.Decimal")); + // } + // } + + // } + + // blInsertDataFlag = true; // 做完此處就要開始新增資料 + // } + + // else if (currentRow[0].ToString().Trim().ToUpper() == "FILEID") + // { + // dsTemp.Tables["WIPPageSummaryBasis"].Rows[0]["FileID"] = currentRow[1].ToString(); + // } + // else if (currentRow[0].ToString().Trim().ToUpper() == "TESTTIME") + // { + // dsTemp.Tables["WIPPageSummaryBasis"].Rows[0]["TestTime"] = currentRow[1].ToString(); + // DirName = Conversions.ToDate(currentRow[1].ToString()).ToString("yyyyMM"); + // } + // else if (currentRow[0].ToString().Trim().ToUpper() == "LOT_ID") + // { + // dsTemp.Tables["WIPPageSummaryBasis"].Rows[0]["LotNo"] = currentRow[1].ToString(); + // strLotNo = currentRow[1].ToString(); // // LotNo + // } + // else if (currentRow[0].ToString().Trim().ToUpper() == "TAPEID") + // { + // dsTemp.Tables["WIPPageSummaryBasis"].Rows[0]["ComponentNo"] = currentRow[1].ToString(); // //ComponentNo + // } + // else if (currentRow[0].ToString().Trim().ToUpper() == "BIN_CODE") + // { + // dsTemp.Tables["WIPPageSummaryBasis"].Rows[0]["BinCode"] = currentRow[1].ToString(); + // strBinCode = currentRow[1].ToString(); // // BinCode + // } + // else if (currentRow[0].ToString().Trim().ToUpper() == "STARTTIME") + // { + // dsTemp.Tables["WIPPageSummaryBasis"].Rows[0]["StartTime"] = currentRow[1].ToString(); + // } + // else if (currentRow[0].ToString().Trim().ToUpper() == "ENDTIME") + // { + // dsTemp.Tables["WIPPageSummaryBasis"].Rows[0]["EndTime"] = currentRow[1].ToString(); + + // } + + // } + // } + + // catch (Exception ex) + // { + // throw; + // } // //直接將錯誤Throw出去 + + // finally + // { + + // } + // } + + // // =========================================================================================================================================== + + // // 取出產品屬性上測試電流 + // string strProbeMajorCurrent = string.Empty; + // strSQL = "Select DefaultValue From tblPRDProductProperty Where ProductNo = (Select A.ProductNo From tblWIPLotBasis A,tblWIPLotState B Where A.BaseLotNo = B.BaseLotNo And B.LotNo = '" + strLotNo + "')" + " And ProductVersion = (Select A.ProductVersion From tblWIPLotBasis A,tblWIPLotState B Where A.BaseLotNo = B.BaseLotNo And B.LotNo = '" + strLotNo + "') And PropertyNo = 'ProbeMajorCurrent'"; + // //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + // drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + // if (drTemp.Read()) + // { + // strProbeMajorCurrent = drTemp["DefaultValue"].ToString(); + // } + // else + // { + // drTemp.Close(); + // //cmmTemp.Dispose(); + // throw new Exception("無法取得此產品的測試電壓"); + // } + // drTemp.Close(); + // //cmmTemp.Dispose(); + + // // 依BinCode取得BinNo + // strSQL = "Select BinNo From tblPRDLEDBinProgramBin " + " Where ProgramNo = (Select PropertyValue From tblWIPLotProperty Where LotNo = '" + strLotNo + "' And PropertyNo = 'BinProgramNo') " + " And ProgramVersion = (Select PropertyValue From tblWIPLotProperty Where LotNo = '" + strLotNo + "' And PropertyNo = 'BinProgramVersion') " + " And MajorCurrent = '" + strProbeMajorCurrent + "' And BinCode = '" + strBinCode + "'"; + // //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + // drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + // if (drTemp.Read()) + // { + // dsTemp.Tables["WIPPageSummaryBasis"].Rows[0]["BinNo"] = drTemp["BinNo"].ToString(); + // } + // else + // { + // drTemp.Close(); + // //cmmTemp.Dispose(); + // throw new Exception("無法取得 Bin_Code: " + strBinCode + " 對應庫別資料,TapeID:" + dsTemp.Tables["WIPPageSummaryBasis"].Rows[0]["ComponentNo"].ToString()); + // } + // drTemp.Close(); + // //cmmTemp.Dispose(); + + + // // 資料讀取完畢 對資料做處理================================================================================================================== + // // 主檔Add Columns "BinQTY" + // var colBinQTY = new DataColumn(); + // colBinQTY.ColumnName = "BinQTY"; + // colBinQTY.DataType = Type.GetType("System.Decimal"); + // dsTemp.Tables["WIPPageSummaryBasis"].Columns.Add(colBinQTY); + // dsTemp.Tables["WIPPageSummaryBasis"].Rows[0]["BinQTY"] = dsTemp.Tables["WIPPageSummaryDetail"].Rows.Count; + + + // funImportPage_CreateTempTable(ref dsTemp, "CalculateWIPPageSummary"); + + // funImportPage_CreateTempTable(ref dsTemp, "CalculateWIPPageBinSummary"); + + // funImportPage_Calculate(ref dsTemp); + // // =========================================================================================================================================== + + // // //判斷用新增還是用更新 + // bool Updateflag = false; // Default新增 + + // strSQL = "SELECT * From tbl_LEDWIPPageSummary Where CreateLot = 1" + " And ComponentNo = '" + dsTemp.Tables["WIPPageSummaryBasis"].Rows[0]["ComponentNo"].ToString() + "'" + " And LotNo = '" + dsTemp.Tables["WIPPageSummaryBasis"].Rows[0]["LotNo"].ToString() + "'"; + // //using (var cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp)) + // //{ + // drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + // if (drTemp.Read()) + // { + // Updateflag = true; + // } + // drTemp.Close(); + // //} + + + // // 存入Mes資料庫============================================================================================================================== + + // string strSQLAddField = string.Empty; + // string strSQLAddValue = string.Empty; + // int i, k; + + // if (Updateflag == false) + // { + + // // //刪除未下線資料 + // strSQL = "Delete From tbl_LEDWIPPageSummary" + " Where CreateLot = 0 And ComponentNo = '" + dsTemp.Tables["WIPPageSummaryBasis"].Rows[0]["ComponentNo"].ToString() + "'" + " And LotNo = '" + dsTemp.Tables["WIPPageSummaryBasis"].Rows[0]["LotNo"].ToString() + "'"; + // CollectionSQL.Add(strSQL); + + + // // tbl_LEDWIPPageSummary 動態欄位組SQLCommand + // strSQLAddField = "Insert into tbl_LEDWIPPageSummary ("; + // strSQLAddValue = " Values ("; + + + // var loopTo = dsTemp.Tables["CalculateWIPPageSummary"].Columns.Count - 1; + // for (i = 0; i <= loopTo; i++) + // { + + + // if (i == 0) + // { + + // switch (dsTemp.Tables["CalculateWIPPageSummary"].Columns[i].DataType.ToString() ?? "") + // { + + // case "System.Decimal": + // { + + // strSQLAddField += dsTemp.Tables["CalculateWIPPageSummary"].Columns[i].ColumnName; + // strSQLAddValue = Conversions.ToString(strSQLAddValue + dsTemp.Tables["CalculateWIPPageSummary"].Rows[0][i]); + // break; + // } + + // case "System.String": + // { + + // strSQLAddField += dsTemp.Tables["CalculateWIPPageSummary"].Columns[i].ColumnName; + // strSQLAddValue += "'" + dsTemp.Tables["CalculateWIPPageSummary"].Rows[0][i].ToString() + "'"; + // break; + // } + + // case "System.DateTime": + // { + + // strSQLAddField += dsTemp.Tables["CalculateWIPPageSummary"].Columns[i].ColumnName; + // strSQLAddValue += " To_Date('" + Strings.Format(Conversions.ToDate(dsTemp.Tables["CalculateWIPPageSummary"].Rows[0][i].ToString()), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')"; + // break; + // } + + // } + // } + + // else + // { + + // switch (dsTemp.Tables["CalculateWIPPageSummary"].Columns[i].DataType.ToString() ?? "") + // { + + // case "System.Decimal": + // { + + // strSQLAddField += "," + dsTemp.Tables["CalculateWIPPageSummary"].Columns[i].ColumnName; + // strSQLAddValue = Conversions.ToString(strSQLAddValue + Operators.ConcatenateObject(",", dsTemp.Tables["CalculateWIPPageSummary"].Rows[0][i])); + // break; + // } + + // case "System.String": + // { + + // strSQLAddField += "," + dsTemp.Tables["CalculateWIPPageSummary"].Columns[i].ColumnName; + // strSQLAddValue += ",'" + dsTemp.Tables["CalculateWIPPageSummary"].Rows[0][i].ToString() + "'"; + // break; + // } + + // case "System.DateTime": + // { + + // strSQLAddField += "," + dsTemp.Tables["CalculateWIPPageSummary"].Columns[i].ColumnName; + // strSQLAddValue += ", To_Date('" + Strings.Format(Conversions.ToDate(dsTemp.Tables["CalculateWIPPageSummary"].Rows[0][i].ToString()), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')"; + // break; + // } + + // } + + // } + + // } + + // strSQL = strSQLAddField + ")" + strSQLAddValue + ")"; + + // CollectionSQL.Add(strSQL); + + + // // //刪除未下線資料 + // strSQL = "Delete From tbl_LEDWIPPageBinSummary" + " Where ComponentNo = '" + dsTemp.Tables["WIPPageSummaryBasis"].Rows[0]["ComponentNo"].ToString() + "'" + " And LotNo = '" + dsTemp.Tables["WIPPageSummaryBasis"].Rows[0]["LotNo"].ToString() + "'"; + // CollectionSQL.Add(strSQL); + + + // // tbl_LEDWIPPageBinSummary 動態欄位組SQLCommand + + + // var loopTo1 = dsTemp.Tables["CalculateWIPPageBinSummary"].Rows.Count - 1; + // for (k = 0; k <= loopTo1; k++) + // { + + // strSQLAddField = "Insert into tbl_LEDWIPPageBinSummary ("; + // strSQLAddValue = " Values ("; + + + // var loopTo2 = dsTemp.Tables["CalculateWIPPageBinSummary"].Columns.Count - 1; + // for (i = 0; i <= loopTo2; i++) + // { + + + // if (i == 0) + // { + + // switch (dsTemp.Tables["CalculateWIPPageBinSummary"].Columns[i].DataType.ToString() ?? "") + // { + + // case "System.Decimal": + // { + + // strSQLAddField += dsTemp.Tables["CalculateWIPPageBinSummary"].Columns[i].ColumnName; + // strSQLAddValue = Conversions.ToString(strSQLAddValue + dsTemp.Tables["CalculateWIPPageBinSummary"].Rows[k][i]); + // break; + // } + + // case "System.String": + // { + + // strSQLAddField += dsTemp.Tables["CalculateWIPPageBinSummary"].Columns[i].ColumnName; + // strSQLAddValue += "'" + dsTemp.Tables["CalculateWIPPageBinSummary"].Rows[k][i].ToString() + "'"; + // break; + // } + + // case "System.DateTime": + // { + + // strSQLAddField += dsTemp.Tables["CalculateWIPPageBinSummary"].Columns[i].ColumnName; + // strSQLAddValue += " To_Date('" + Strings.Format(Conversions.ToDate(dsTemp.Tables["CalculateWIPPageBinSummary"].Rows[k][i].ToString()), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')"; + // break; + // } + + // } + // } + + // else + // { + + // switch (dsTemp.Tables["CalculateWIPPageBinSummary"].Columns[i].DataType.ToString() ?? "") + // { + + // case "System.Decimal": + // { + + // strSQLAddField += "," + dsTemp.Tables["CalculateWIPPageBinSummary"].Columns[i].ColumnName; + // strSQLAddValue = Conversions.ToString(strSQLAddValue + Operators.ConcatenateObject(",", dsTemp.Tables["CalculateWIPPageBinSummary"].Rows[k][i])); + // break; + // } + + // case "System.String": + // { + + // strSQLAddField += "," + dsTemp.Tables["CalculateWIPPageBinSummary"].Columns[i].ColumnName; + // strSQLAddValue += ",'" + dsTemp.Tables["CalculateWIPPageBinSummary"].Rows[k][i].ToString() + "'"; + // break; + // } + + // case "System.DateTime": + // { + + // strSQLAddField += "," + dsTemp.Tables["CalculateWIPPageBinSummary"].Columns[i].ColumnName; + // strSQLAddValue += ", To_Date('" + Strings.Format(Conversions.ToDate(dsTemp.Tables["CalculateWIPPageBinSummary"].Rows[k][i].ToString()), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')"; + // break; + // } + + // } + + // } + + // } + + + // strSQL = strSQLAddField + ")" + strSQLAddValue + ")"; + + // CollectionSQL.Add(strSQL); + + // } + // } + + // else + // { + + // // tbl_LEDWIPPageSummary 動態欄位組SQLCommand + + // strSQL = "UpDate tbl_LEDWIPPageSummary Set "; + + // var loopTo3 = dsTemp.Tables["CalculateWIPPageSummary"].Columns.Count - 1; + // for (i = 0; i <= loopTo3; i++) + // { + + // if (i == 0) + // { + + // switch (dsTemp.Tables["CalculateWIPPageSummary"].Columns[i].DataType.ToString() ?? "") + // { + + // case "System.Decimal": + // { + + // strSQL = Conversions.ToString(strSQL + Operators.ConcatenateObject(dsTemp.Tables["CalculateWIPPageSummary"].Columns[i].ColumnName + "=", dsTemp.Tables["CalculateWIPPageSummary"].Rows[0][i])); + // break; + // } + + // case "System.String": + // { + + // strSQL += dsTemp.Tables["CalculateWIPPageSummary"].Columns[i].ColumnName + "='" + dsTemp.Tables["CalculateWIPPageSummary"].Rows[0][i].ToString() + "'"; + // break; + // } + + // case "System.DateTime": + // { + + // strSQL += dsTemp.Tables["CalculateWIPPageSummary"].Columns[i].ColumnName + "=" + " To_Date('" + Strings.Format(Conversions.ToDate(dsTemp.Tables["CalculateWIPPageSummary"].Rows[0][i].ToString()), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')"; + // break; + // } + + // } + // } + + // else + // { + + // switch (dsTemp.Tables["CalculateWIPPageSummary"].Columns[i].DataType.ToString() ?? "") + // { + + // case "System.Decimal": + // { + + // strSQL = Conversions.ToString(strSQL + Operators.ConcatenateObject("," + dsTemp.Tables["CalculateWIPPageSummary"].Columns[i].ColumnName + "=", dsTemp.Tables["CalculateWIPPageSummary"].Rows[0][i])); + // break; + // } + + // case "System.String": + // { + + // strSQL += "," + dsTemp.Tables["CalculateWIPPageSummary"].Columns[i].ColumnName + "='" + dsTemp.Tables["CalculateWIPPageSummary"].Rows[0][i].ToString() + "'"; + // break; + // } + + // case "System.DateTime": + // { + + // strSQL += "," + dsTemp.Tables["CalculateWIPPageSummary"].Columns[i].ColumnName + "=" + " To_Date('" + Strings.Format(Conversions.ToDate(dsTemp.Tables["CalculateWIPPageSummary"].Rows[0][i].ToString()), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')"; + // break; + // } + + // } + + // } + + // } + + // strSQL = strSQL + " Where ComponentNo = '" + dsTemp.Tables["WIPPageSummaryBasis"].Rows[0]["ComponentNo"].ToString() + "'" + " And LotNo = '" + dsTemp.Tables["WIPPageSummaryBasis"].Rows[0]["LotNo"].ToString() + "'"; + + // CollectionSQL.Add(strSQL); + + + // // //刪除未下線資料 + // strSQL = "Delete From tbl_LEDWIPPageBinSummary" + " Where ComponentNo = '" + dsTemp.Tables["WIPPageSummaryBasis"].Rows[0]["ComponentNo"].ToString() + "'" + " And LotNo = '" + dsTemp.Tables["WIPPageSummaryBasis"].Rows[0]["LotNo"].ToString() + "'"; + // CollectionSQL.Add(strSQL); + + + // // tbl_LEDWIPPageBinSummary 動態欄位組SQLCommand + + + // var loopTo4 = dsTemp.Tables["CalculateWIPPageBinSummary"].Rows.Count - 1; + // for (k = 0; k <= loopTo4; k++) + // { + + // strSQLAddField = "Insert into tbl_LEDWIPPageBinSummary ("; + // strSQLAddValue = " Values ("; + + + // var loopTo5 = dsTemp.Tables["CalculateWIPPageBinSummary"].Columns.Count - 1; + // for (i = 0; i <= loopTo5; i++) + // { + + + // if (i == 0) + // { + + // switch (dsTemp.Tables["CalculateWIPPageBinSummary"].Columns[i].DataType.ToString() ?? "") + // { + + // case "System.Decimal": + // { + + // strSQLAddField += dsTemp.Tables["CalculateWIPPageBinSummary"].Columns[i].ColumnName; + // strSQLAddValue = Conversions.ToString(strSQLAddValue + dsTemp.Tables["CalculateWIPPageBinSummary"].Rows[k][i]); + // break; + // } + + // case "System.String": + // { + + // strSQLAddField += dsTemp.Tables["CalculateWIPPageBinSummary"].Columns[i].ColumnName; + // strSQLAddValue += "'" + dsTemp.Tables["CalculateWIPPageBinSummary"].Rows[k][i].ToString() + "'"; + // break; + // } + + // case "System.DateTime": + // { + + // strSQLAddField += dsTemp.Tables["CalculateWIPPageBinSummary"].Columns[i].ColumnName; + // strSQLAddValue += " To_Date('" + Strings.Format(Conversions.ToDate(dsTemp.Tables["CalculateWIPPageBinSummary"].Rows[k][i].ToString()), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')"; + // break; + // } + + // } + // } + + // else + // { + + // switch (dsTemp.Tables["CalculateWIPPageBinSummary"].Columns[i].DataType.ToString() ?? "") + // { + + // case "System.Decimal": + // { + + // strSQLAddField += "," + dsTemp.Tables["CalculateWIPPageBinSummary"].Columns[i].ColumnName; + // strSQLAddValue = Conversions.ToString(strSQLAddValue + Operators.ConcatenateObject(",", dsTemp.Tables["CalculateWIPPageBinSummary"].Rows[k][i])); + // break; + // } + + // case "System.String": + // { + + // strSQLAddField += "," + dsTemp.Tables["CalculateWIPPageBinSummary"].Columns[i].ColumnName; + // strSQLAddValue += ",'" + dsTemp.Tables["CalculateWIPPageBinSummary"].Rows[k][i].ToString() + "'"; + // break; + // } + + // case "System.DateTime": + // { + + // strSQLAddField += "," + dsTemp.Tables["CalculateWIPPageBinSummary"].Columns[i].ColumnName; + // strSQLAddValue += ", To_Date('" + Strings.Format(Conversions.ToDate(dsTemp.Tables["CalculateWIPPageBinSummary"].Rows[k][i].ToString()), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')"; + // break; + // } + + // } + + // } + + // } + + + // strSQL = strSQLAddField + ")" + strSQLAddValue + ")"; + + // CollectionSQL.Add(strSQL); + + // } + + // } + + // // =========================================================================================================================================== + + // ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, CollectionSQL); + + // // //目錄不存在時必須要先建立 + // if (Directory.Exists(strDestinationPath + DirName) == false) + // { + // Directory.CreateDirectory(strDestinationPath + DirName); + // } + // // //檔案已存在Destination必須先刪除 + // if (File.Exists(strDestinationPath + DirName + @"\" + Path.GetFileName(FileName)) == true) + // { + // File.Delete(strDestinationPath + DirName + @"\" + Path.GetFileName(FileName)); + // } + // // //移動檔案Queue至Destination + // File.Move(FileName, strDestinationPath + DirName + @"\" + Path.GetFileName(FileName)); + + // if (dsTemp != null) + // { + // dsTemp.Dispose(); + // dsTemp = null; + // } + + // } + + // } + // // //回傳Success + // funImportPageRet = "success"; + // } + + // catch (Exception ex) + // { + // // //檔案處理失敗時移動檔案Queue至Fail + // if (!string.IsNullOrEmpty(FileName) && blnMoveFile == true) + // { + // // //目錄不存在時必須要先建立 + // if (Directory.Exists(strFailPath + DirName) == false) + // { + // Directory.CreateDirectory(strFailPath + DirName); + // } + // // //檔案已存在File必須先刪除 + // if (File.Exists(strFailPath + DirName + @"\" + Path.GetFileName(FileName)) == true) + // { + // File.Delete(strFailPath + DirName + @"\" + Path.GetFileName(FileName)); + // } + // // //移動檔案Queue至Fail + // try + // { + // File.Move(FileName, strFailPath + DirName + @"\" + Path.GetFileName(FileName)); + // } + // catch (Exception ex1) + // { + // } + + // } + // // //回傳錯誤原因 + // funImportPageRet = CombineFailMsg("0000-999999", "[JobNo:" + strJobNo + "][FunctionNo:funImportPage][FileName:" + FileName + "][LotNo:" + strLotNo + "][WaferNo:][" + ex.Message + ",StackTrace:" + ex.StackTrace + "][SQL:" + strSQL + "]"); + // } + + // finally + // { + // // //Close Connection + // CloseConnection(cnnTemp); + + // } + + // return funImportPageRet; + + //} + + //private void funImportPage_CreateTempTable(ref DataSet dsTemp, string tblName) + //{ + + // try + // { + + // if (tblName == "WIPPageSummaryBasis") + // { + + // dsTemp.Tables.Add(tblName); + // dsTemp.Tables[tblName].Columns.Add("LotNo", Type.GetType("System.String")); + // dsTemp.Tables[tblName].Columns.Add("ComponentNo", Type.GetType("System.String")); + // dsTemp.Tables[tblName].Columns.Add("FileID", Type.GetType("System.String")); + // dsTemp.Tables[tblName].Columns.Add("TestTime", Type.GetType("System.DateTime")); + // dsTemp.Tables[tblName].Columns.Add("BinCode", Type.GetType("System.String")); + // dsTemp.Tables[tblName].Columns.Add("BinNo", Type.GetType("System.String")); + // dsTemp.Tables[tblName].Columns.Add("StartTime", Type.GetType("System.DateTime")); + // dsTemp.Tables[tblName].Columns.Add("EndTime", Type.GetType("System.DateTime")); + + // dsTemp.Tables[tblName].Rows.Add(dsTemp.Tables[tblName].NewRow()); + // } + + + // else if (tblName == "WIPPageSummaryDetail") + // { + + // dsTemp.Tables.Add(tblName); + // } + + + // else if (tblName == "CalculateWIPPageSummary") + // { + + // int i; + // DataColumn colTemp = null; + + // dsTemp.Tables.Add(tblName); + + // var loopTo = dsTemp.Tables["WIPPageSummaryBasis"].Columns.Count - 1; + // for (i = 0; i <= loopTo; i++) + // { + + // colTemp = new DataColumn(); + // colTemp.ColumnName = dsTemp.Tables["WIPPageSummaryBasis"].Columns[i].ColumnName; + // colTemp.DataType = dsTemp.Tables["WIPPageSummaryBasis"].Columns[i].DataType; + // colTemp.DefaultValue = dsTemp.Tables["WIPPageSummaryBasis"].Rows[0][dsTemp.Tables["WIPPageSummaryBasis"].Columns[i].ColumnName].ToString(); + + // dsTemp.Tables[tblName].Columns.Add(colTemp); + + // } + + + // var loopTo1 = dsTemp.Tables["WIPPageSummaryDetail"].Columns.Count - 1; + // for (i = 0; i <= loopTo1; i++) + // { + + // if (Strings.UCase(dsTemp.Tables["WIPPageSummaryDetail"].Columns[i].ColumnName) != "WAFERFROM") + // { + + // colTemp = new DataColumn(); + // colTemp.ColumnName = dsTemp.Tables["WIPPageSummaryDetail"].Columns[i].ColumnName + "_Max"; + // colTemp.DataType = dsTemp.Tables["WIPPageSummaryDetail"].Columns[i].DataType; + // colTemp.DefaultValue = 0; + + // dsTemp.Tables[tblName].Columns.Add(colTemp); + + // colTemp = new DataColumn(); + // colTemp.ColumnName = dsTemp.Tables["WIPPageSummaryDetail"].Columns[i].ColumnName + "_Min"; + // colTemp.DataType = dsTemp.Tables["WIPPageSummaryDetail"].Columns[i].DataType; + // colTemp.DefaultValue = 0; + + // dsTemp.Tables[tblName].Columns.Add(colTemp); + + // colTemp = new DataColumn(); + // colTemp.ColumnName = dsTemp.Tables["WIPPageSummaryDetail"].Columns[i].ColumnName + "_Avg"; + // colTemp.DataType = dsTemp.Tables["WIPPageSummaryDetail"].Columns[i].DataType; + // colTemp.DefaultValue = 0; + + // dsTemp.Tables[tblName].Columns.Add(colTemp); + + // colTemp = new DataColumn(); + // colTemp.ColumnName = dsTemp.Tables["WIPPageSummaryDetail"].Columns[i].ColumnName + "_Std"; + // colTemp.DataType = dsTemp.Tables["WIPPageSummaryDetail"].Columns[i].DataType; + // colTemp.DefaultValue = 0; + + // dsTemp.Tables[tblName].Columns.Add(colTemp); + + // colTemp = new DataColumn(); + // colTemp.ColumnName = dsTemp.Tables["WIPPageSummaryDetail"].Columns[i].ColumnName + "_Sqr"; + // colTemp.DataType = dsTemp.Tables["WIPPageSummaryDetail"].Columns[i].DataType; + // colTemp.DefaultValue = 0; + + // dsTemp.Tables[tblName].Columns.Add(colTemp); + + // } + + // } + + // // Status + // colTemp = new DataColumn(); + // colTemp.ColumnName = "Status"; + // colTemp.DataType = Type.GetType("System.Decimal"); + // colTemp.DefaultValue = 0; + + // dsTemp.Tables[tblName].Columns.Add(colTemp); + + + // dsTemp.Tables[tblName].Rows.Add(dsTemp.Tables[tblName].NewRow()); + // } + + // else if (tblName == "CalculateWIPPageBinSummary") + // { + + // dsTemp.Tables.Add(tblName); + // dsTemp.Tables[tblName].Columns.Add("LotNo", Type.GetType("System.String")); + // dsTemp.Tables[tblName].Columns.Add("ComponentNo", Type.GetType("System.String")); + // dsTemp.Tables[tblName].Columns.Add("OrgComponentNo", Type.GetType("System.String")); + // dsTemp.Tables[tblName].Columns.Add("BinQty", Type.GetType("System.Decimal")); + + // } + // } + + + + // catch (Exception ex) + // { + // throw; + // } + // finally + // { + + // } + + //} + + //private void funImportPage_InsertDetailData(ref DataSet dstemp, string tblname, string[] dataD, int intStartField) + //{ + + + // int i; + // DataRow drAdd; + + // try + // { + + // drAdd = dstemp.Tables[tblname].NewRow(); + + // var loopTo = dstemp.Tables[tblname].Columns.Count - 1; + // for (i = 0; i <= loopTo; i++) + // { + + // if (!string.IsNullOrEmpty(dataD[i + intStartField].ToString())) + // { + // drAdd[i] = dataD[i + intStartField].ToString(); + // } + // else + // { + // drAdd[i] = 0; + // } + + // } + + // dstemp.Tables[tblname].Rows.Add(drAdd); + // } + + // catch (Exception ex) + // { + // throw; + // } + + //} + + //private void funImportPage_Calculate(ref DataSet dstemp) + //{ + + // try + // { + + // int i, k; + + // int intDCount = dstemp.Tables["WIPPageSummaryDetail"].Rows.Count; + // decimal intMax = 0m; + // decimal intMin = 0m; + // decimal intTotal = 0m; + + // var loopTo = dstemp.Tables["WIPPageSummaryDetail"].Columns.Count - 1; + // for (k = 0; k <= loopTo; k++) + // { + + // intTotal = 0m; + + // if (Strings.UCase(dstemp.Tables["WIPPageSummaryDetail"].Columns[k].ColumnName) != "WAFERFROM") + // { + + // var loopTo1 = dstemp.Tables["WIPPageSummaryDetail"].Rows.Count - 1; + // for (i = 0; i <= loopTo1; i++) + // { + + // if (i == 0) + // { + // intMax = Conversions.ToDecimal(dstemp.Tables["WIPPageSummaryDetail"].Rows[i][k]); + // intMin = Conversions.ToDecimal(dstemp.Tables["WIPPageSummaryDetail"].Rows[i][k]); + // } + // else + // { + + // if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(intMax, dstemp.Tables["WIPPageSummaryDetail"].Rows[i][k], false))) + // { + // intMax = Conversions.ToDecimal(dstemp.Tables["WIPPageSummaryDetail"].Rows[i][k]); + // } + + // if (Conversions.ToBoolean(Operators.ConditionalCompareObjectGreater(intMin, dstemp.Tables["WIPPageSummaryDetail"].Rows[i][k], false))) + // { + // intMin = Conversions.ToDecimal(dstemp.Tables["WIPPageSummaryDetail"].Rows[i][k]); + // } + + // } + + // intTotal = intTotal + Convert.ToDecimal(dstemp.Tables["WIPPageSummaryDetail"].Rows[i][k]); + + + // dstemp.Tables["CalculateWIPPageSummary"].Rows[0][dstemp.Tables["WIPPageSummaryDetail"].Columns[k].ColumnName + "_sqr"] + // = Convert.ToDouble(dstemp.Tables["CalculateWIPPageSummary"].Rows[0][dstemp.Tables["WIPPageSummaryDetail"].Columns[k].ColumnName + "_sqr"]) + // + Math.Pow(Convert.ToDouble(dstemp.Tables["WIPPageSummaryDetail"].Rows[i][k]), 2); + + // } + + + // dstemp.Tables["CalculateWIPPageSummary"].Rows[0][dstemp.Tables["WIPPageSummaryDetail"].Columns[k].ColumnName + "_Max"] = intMax; + // dstemp.Tables["CalculateWIPPageSummary"].Rows[0][dstemp.Tables["WIPPageSummaryDetail"].Columns[k].ColumnName + "_Min"] = intMin; + // dstemp.Tables["CalculateWIPPageSummary"].Rows[0][dstemp.Tables["WIPPageSummaryDetail"].Columns[k].ColumnName + "_Avg"] = intTotal / intDCount; + + + // decimal decSqr = Conversions.ToDecimal(dstemp.Tables["CalculateWIPPageSummary"].Rows[0][dstemp.Tables["WIPPageSummaryDetail"].Columns[k].ColumnName + "_Sqr"]); + // decimal decQty = Conversions.ToDecimal(dstemp.Tables["CalculateWIPPageSummary"].Rows[0]["BinQty"]); + // decimal decAvg = Conversions.ToDecimal(dstemp.Tables["CalculateWIPPageSummary"].Rows[0][dstemp.Tables["WIPPageSummaryDetail"].Columns[k].ColumnName + "_Avg"]); + + // if (decQty > 1m) + // { + // dstemp.Tables["CalculateWIPPageSummary"].Rows[0][dstemp.Tables["WIPPageSummaryDetail"].Columns[k].ColumnName + "_Std"] = Strings.Format(Math.Sqrt(Math.Abs((double)decSqr - (double)decQty * Math.Pow((double)decAvg, 2d)) / (double)(decQty - 1m)), "#.00"); + // } + // else + // { + // dstemp.Tables["CalculateWIPPageSummary"].Rows[0][dstemp.Tables["WIPPageSummaryDetail"].Columns[k].ColumnName + "_Std"] = "0"; + // } + + // // 移除計算用的平方 + // dstemp.Tables["CalculateWIPPageSummary"].Columns.Remove(dstemp.Tables["WIPPageSummaryDetail"].Columns[k].ColumnName + "_Sqr"); + + + // } + + // } + + + // var arTemp = new ArrayList(); + // DataRow[] drSel; + // DataRow drAdd; + + // var loopTo2 = dstemp.Tables["WIPPageSummaryDetail"].Rows.Count - 1; + // for (i = 0; i <= loopTo2; i++) + // { + // if (arTemp.IndexOf(dstemp.Tables["WIPPageSummaryDetail"].Rows[i]["WAFERFROM"]) < 0) // 未做過 + // { + // drSel = dstemp.Tables["WIPPageSummaryDetail"].Select(Conversions.ToString(Operators.ConcatenateObject(Operators.ConcatenateObject("WaferFrom = '", dstemp.Tables["WIPPageSummaryDetail"].Rows[i]["WAFERFROM"]), "'"))); + + // drAdd = dstemp.Tables["CalculateWIPPageBinSummary"].NewRow(); + // drAdd["LotNo"] = dstemp.Tables["CalculateWIPPageSummary"].Rows[0]["LotNo"].ToString(); + // drAdd["ComponentNo"] = dstemp.Tables["CalculateWIPPageSummary"].Rows[0]["ComponentNo"].ToString(); + // drAdd["OrgComponentNo"] = dstemp.Tables["WIPPageSummaryDetail"].Rows[i]["WAFERFROM"]; + // drAdd["BinQty"] = drSel.Length; + + // dstemp.Tables["CalculateWIPPageBinSummary"].Rows.Add(drAdd); + + // arTemp.Add(dstemp.Tables["WIPPageSummaryDetail"].Rows[i]["WAFERFROM"]); + // } + + // else + // { + + // } + + // } + // } + + // catch (Exception ex) + // { + // throw; + // } + + //} + + //#endregion + + //#region ---AutoLoader Sample--- + + //private string funWatchTest(Collection colParameters = null) + //{ + // string funWatchTestRet = default(string); + + // string strJobNo = string.Empty; // JobNo + // string strSourcePath = string.Empty; // 來源檔案路徑 + // string strDestinationPath = string.Empty; // 目前檔案路徑 + // string strQueuePath = string.Empty; // 處理中檔案路徑 + // string strFailPath = string.Empty; // 失敗檔案路徑 + // string FileName = string.Empty; // 處理中檔案 + // string DirName = DateTime.Now.ToString("yyyyMM"); // 分類目錄名稱 + // string strLotNo = string.Empty; + // string strComponentNo = string.Empty; + // bool blnMoveFile = true; + // string strSQL = string.Empty; + + // try + // { + // // //取出colParameter傳入參數 + // strJobNo = colParameters["JobNo"].ToString().Trim(); + // strSourcePath = colParameters["SourcePath"].ToString().Trim(); + // strDestinationPath = colParameters["DestinationPath"].ToString().Trim(); + // strQueuePath = colParameters["QueuePath"].ToString().Trim(); + // strFailPath = colParameters["FailPath"].ToString().Trim(); + // // //取出來源目錄中*.csv檔案 + // string[] DirFiles = Directory.GetFiles(strSourcePath, "*.csv"); + // // //將檔案複製到Queue的目錄中 + // foreach (var currentFileName in DirFiles) + // { + // FileName = currentFileName; + // // //檢查檔案存不存在,有可能被另一個執行緒先處理 + // if (File.Exists(FileName) == true) + // { + // // '//檔案已存在Queue必須先刪除 + // // If File.Exists(strQueuePath & Path.GetFileName(FileName)) = True Then + // // File.Delete(strQueuePath & Path.GetFileName(FileName)) + // // End If + // // //移動檔案Source至Queue + // try + // { + // blnMoveFile = true; + // File.Move(FileName, strQueuePath + Path.GetFileName(FileName)); + // } + // catch (Exception ex) + // { + // blnMoveFile = false; + // throw new Exception("此執行程序已中止,由另一執行程序處理中!!"); + // } + // // //將檔案來源改為Queue + // FileName = strQueuePath + Path.GetFileName(FileName); + // // //開始執行解檔處理 + // using (var myReader = new TextFieldParser(FileName, Encoding.Default)) + // { + // myReader.TextFieldType = FieldType.Delimited; + // myReader.Delimiters = new string[] { "," }; + // // //建立Connection + // var cnnTemp = CreateConnection(strConnectionString); + // //System.Data.OleDb.OleDbCommand cmmTemp = null; + // //System.Data.OleDb.OleDbDataAdapter daTemp = null; + // DbDataReader drTemp = null; + // var CollectionSQL = new Collection(); + // // //變數宣告區域 + + // // //Try Catch + // try + // { + // // //Parser檔案 + // while (!myReader.EndOfData) + // { + + // } + + // // //執行SQL + // ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, CollectionSQL); + // } + + // catch (Exception ex) + // { + // throw; + // } // //直接將錯誤Throw出去 + + // finally + // { + // // //釋放資源 + // CollectionSQL = null; + // // //Close Connection + // CloseConnection(cnnTemp); + // } + // } + // // //目錄不存在時必須要先建立 + // if (Directory.Exists(strDestinationPath + DirName) == false) + // { + // Directory.CreateDirectory(strDestinationPath + DirName); + // } + // // //檔案已存在Destination必須先刪除 + // if (File.Exists(strDestinationPath + DirName + @"\" + Path.GetFileName(FileName)) == true) + // { + // File.Delete(strDestinationPath + DirName + @"\" + Path.GetFileName(FileName)); + // } + // // //移動檔案Queue至Destination + // File.Move(FileName, strDestinationPath + DirName + @"\" + Path.GetFileName(FileName)); + // } + // } + // // //回傳Success + // funWatchTestRet = "success"; + // } + + // catch (Exception ex) + // { + // // //檔案處理失敗時移動檔案Queue至Fail + // if (!string.IsNullOrEmpty(FileName) && blnMoveFile == true) + // { + // // //目錄不存在時必須要先建立 + // if (Directory.Exists(strFailPath + DirName) == false) + // { + // Directory.CreateDirectory(strFailPath + DirName); + // } + // // //檔案已存在File必須先刪除 + // if (File.Exists(strFailPath + DirName + @"\" + Path.GetFileName(FileName)) == true) + // { + // File.Delete(strFailPath + DirName + @"\" + Path.GetFileName(FileName)); + // } + // // //移動檔案Queue至Fail + // try + // { + // File.Move(FileName, strFailPath + DirName + @"\" + Path.GetFileName(FileName)); + // } + // catch (Exception ex1) + // { + // } + + // } + // // //回傳錯誤原因 + // funWatchTestRet = CombineFailMsg("0000-999999", "[JobNo:" + strJobNo + "][FunctionNo:funWatchTest][FileName:" + FileName + "][LotNo:" + strLotNo + "][WaferNo:" + strComponentNo + "][" + ex.Message + ",StackTrace:" + ex.StackTrace + "][SQL:" + strSQL + "]"); + // } + // finally + // { + + + // } + + // return funWatchTestRet; + + //} + + //#endregion + + //#region ---Error Log--- + + //// //Function--------------------------------------------------------------------------------------------------------------------------------- + //public string AddErrorLog(string ServiceName, string UserID, string KeyField, string KeyValue, DateTime RecordDate = default(DateTime), string Description = defString, string ComputerName = defString) + + + + //{ + // string AddErrorLogRet = default(string); + // // 此 Function 將新增一筆資料 + // // 傳入值: 各欄位新增值 + // // 傳回值: success(成功), fail(失敗) + + // string strSQLAddField = string.Empty; + // string strSQLAddValue = string.Empty; + // string strSQL = string.Empty; + + // if (RecordDate == defDateTime) + // RecordDate = DateTime.Now; + + // try + // { + // strSQLAddField = "Insert into tblSysErrorLog (ServiceName, UserID, KeyField, KeyValue"; + // strSQLAddValue = " Values ('" + ChkSingleQuation(Strings.Left(ServiceName, 30)) + "','" + ChkSingleQuation(Strings.Left(UserID, 10)) + "','" + ChkSingleQuation(Strings.Left(KeyField, 999)) + "','" + ChkSingleQuation(Strings.Left(KeyValue, 999)) + "'"; + + // if ((Description ?? "") != defString) + // { + // strSQLAddField += ",Description"; + // strSQLAddValue += ",'" + ChkSingleQuation(Strings.Left(Description, 1999)) + "'"; + // } + // if (RecordDate != defDateTime) + // { + // strSQLAddField += ",RecordDate"; + // strSQLAddValue += ", To_Date('" + Strings.Format(Conversions.ToDate(RecordDate), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')"; + // } + // if ((ComputerName ?? "") != defString) + // { + // strSQLAddField += ",ComputerName"; + // strSQLAddValue += ",'" + ChkSingleQuation(Strings.Left(ComputerName, 50)) + "'"; + // } + + // // 直接給定strSQL + // strSQL = strSQLAddField + ")" + strSQLAddValue + ")"; + + // // //執行SQL指令 + // string argstrDatabaseType = Conversions.ToString(DataBaseType); + // ExecuteSQLNoneQuery(argstrDatabaseType, strConnectionString, ref strSQL); + + // // //Return success + // AddErrorLogRet = "success"; + // } + + // catch (Exception e1) + // { + // AddErrorLogRet = "fail"; + // // 發生錯誤時丟回本身的Function Name及系統錯誤訊息 + // // Throw 'New Exception("kcSYS.AddErrorLog: " & e1.Message) + + // } + + // return AddErrorLogRet; + + //} + //private string CombineFailMsg(string ErrorCode, string Desc) + //{ + // string CombineFailMsgRet = default(string); + // CombineFailMsgRet = "ErrorCode:" + ErrorCode + ";" + Desc; + // return CombineFailMsgRet; + //} + //#endregion + + //~clsAutoLoaderLibrary() + //{ + // if (objSetting != null) + // objSetting = null; + //} + #endregion + + + #region 20230601 MainFunction + //來料電性值匯入 funImpMTLVendorTestData + private string funImpMTLVendorTestData(Collection colParameters = null) + { + string funImpMTLVendorTestDataRet = default(string); + + var cnnTemp = default(IDbConnection); + var drTemp = default(DbDataReader); + DbDataReader drTemp_Loop; + DataRow drFormat; + string strJobNo = string.Empty; // JobNo + string strRootPath = string.Empty; // 來源根目錄 + string strSourcePath = string.Empty; // 來源檔案路徑 + string strDestinationPath = string.Empty; // 目前檔案路徑 + string strQueuePath = string.Empty; // 處理中檔案路徑 + string strFailPath = string.Empty; // 失敗檔案路徑 + string FileName = string.Empty; // 處理中檔案 + string DirName = DateTime.Now.ToString("yyyyMM"); // 分類目錄名稱 + bool blnMoveFile = true; + string strSQL = string.Empty; + + // 固定參數資料起始位置(第幾列) + int intVendorMTLNo = defInteger; // 供應商料號 + int intVendorMTLLotNo = defInteger; // 供應商料批批號 + // 2021/7/22,Ning,新格式改為MaterialLotNo、MaterialLotNo + int intMTLNo = defInteger; // 料號 + int intMTLLotNo = defInteger; // 料批批號 + int intVendorNo = defInteger; // 供應商編號 + // 2019/2/22,Ning,固定參數新增ComponentLotNo + int intCompLotNo = defInteger; // 元件批號 + int intColumnStart = defInteger; // 欄位 + int intDataStart = defInteger; // 資料 + + // 固定參數資料位置(第幾欄) + int intD_VendorMTLNo = defInteger; + int intD_VendorMTLLotNo = defInteger; + // 2021/7/22,Ning,新格式改為D_MaterialLotNo、D_MaterialLotNo + int intD_MTLNo = defInteger; + int intD_MTLLotNo = defInteger; + int intD_ComponentNo = defInteger; + int intD_SlotNo = defInteger; + // 2019/2/22,Ning,固定參數新增D_ComponentLotNo, D_LaserMark + int intD_CompLotNo = defInteger; + int intD_LaserMark = defInteger; + // 2021/7/22,Ning,固定參數新增D_CassetteNo + int intD_CassetteNo = defInteger; + + // 動態參數資料起始位置(第幾列) + int intEquipmentNo = defInteger; + int intThickNess = defInteger; + int intWaferSize = defInteger; + + string strInventoryNo; + string strTemp; + string strFileFilter = defString; + + var strReadLine = new string[2]; + var aryFormula = new ArrayList(); + string[] aryWaferInfo = new string[] { defString, defString, defString, defString, defString, defString }; // 存放解析後的Wafer資訊 + var fs = default(FileStream); + var r = default(StreamReader); + + string strFormatFile; // 格式檔路徑+名稱 + string strFormatScript; // 格式檔內容 + string strFFName = "FormatFile.txt"; + StreamWriter sw; + + var datEvnetTime = DateTime.Now; + + string[] aryDir; + + string strMSplitSign, strDSplitSign; + string strFailLog = ""; + var dtFormat_Postion = new DataTable("Format_Postion"); // 0088935: [SEMI_Wafer] AutoLoader測試資料動態參數收集優化_AutoLoader 電性值匯入調整 + dtFormat_Postion.Columns.Add("ColumnName", Type.GetType("System.String")); + dtFormat_Postion.Columns.Add("ColumnPosition", Type.GetType("System.String")); + dtFormat_Postion.Columns.Add("Value", Type.GetType("System.String")); + dtFormat_Postion.Columns.Add("FileName", Type.GetType("System.String")); + dtFormat_Postion.Columns.Add("AssignFile", Type.GetType("System.String")); + int h; + // 2019/9/9, Ning, 增加區段編號之參數 + string strPSNo; + // 2021/4/19,Ning,增加測試類別之參數 + string strTestRecipeType = defString; + + long lngSplitFileSize = 10485760L; + long lngSplitRecordsLimit = 5000L; + // 2021/5/10 增加現況與log紀錄 + string strJobName = defString; + string strJobFunction = defString; + bool blnSplitPartialSuccess = false; + bool blnNotMoveToFail = false; + string strINVGroupNo = defString; + string FormatFile; + try + { + cnnTemp = CreateConnection(strConnectionString); + + // //取出colParameter傳入參數 + strJobNo = colParameters["JobNo"].ToString().Trim(); + strRootPath = colParameters["SourcePath"].ToString().Trim(); + + // Parameter1為傳入參數,作為機台編號,若無此值則不進行下面的程式 + if (colParameters["Parameter1"] == null || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter1"])))) + { + funImpMTLVendorTestDataRet = "庫房編號 Not found!!!(Parameter1)"; + throw new Exception(funImpMTLVendorTestDataRet); + } + else + { + strInventoryNo = Strings.Trim(Conversions.ToString(colParameters["Parameter1"])); + } + // Parameter2為傳入參數,作為區段編號,若無此值則不進行下面的程式 + if (!colParameters.Contains("Parameter2") || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter2"])))) + { + funImpMTLVendorTestDataRet = "區段 Not found!!!(Parameter2)"; + throw new Exception(funImpMTLVendorTestDataRet); + } + else + { + strPSNo = Strings.Trim(Conversions.ToString(colParameters["Parameter2"])); + } + // Parameter3為傳入參數,作為測試類型(TestRecipeType),若無此值則程式依TestRecipeClass=1+PSNo找TestRecipeType + if (colParameters.Contains("Parameter3") && !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter3"])))) + { + strTestRecipeType = Strings.Trim(Conversions.ToString(colParameters["Parameter3"])); + } + + // SplitFileSize分包檔案大小, 若沒設定則預設為10485760 (10MB) + if (colParameters.Contains("SplitFileSize") && Information.IsNumeric(Strings.Trim(Conversions.ToString(colParameters["SplitFileSize"])))) + { + lngSplitFileSize = Conversions.ToLong(Strings.Trim(Conversions.ToString(colParameters["SplitFileSize"]))); + } + // SplitRecordsLimit分包筆數, 若沒設定則預設為5000筆 + if (colParameters.Contains("SplitRecordsLimit") && Information.IsNumeric(Strings.Trim(Conversions.ToString(colParameters["SplitRecordsLimit"])))) + { + lngSplitRecordsLimit = Conversions.ToLong(Strings.Trim(Conversions.ToString(colParameters["SplitRecordsLimit"]))); + } + + // 沒有設備資料,要怎麼發訊息 + strSQL = "Select ENGINEERGROUPNO From tblINVINventoryBasis Where INVENTORYNO = '" + strInventoryNo + "'"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + strINVGroupNo = drTemp["ENGINEERGROUPNO"].ToString(); + } + drTemp.Close(); + //cmmTemp.Dispose(); + + // 檔案處理應該加在這邊 + // 2021/5/13 Steven 應先找分包處理尚未處理完的檔案 + // 時間小的先做 + bool blnNeedProcessing = false; + int intStartRow = defInteger; + string strAssignedFormat = ""; + strSQL = "Select FileName,FilePath,ImportedRows From TBLMESAUTOLOADERFILESTATE where ServerName = '" + Environment.MachineName + "'And ServiceName = 'AutoLoaderLib'" + " And JobNo = '" + strJobNo + "' order by StartTime"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp_Loop = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + while (drTemp_Loop.Read()) + { + try + { + // 2.迴圈Component測試資料讀取 + intStartRow = Conversions.ToInteger(Operators.AddObject(drTemp_Loop["ImportedRows"], 1)); // 從上次完成的筆數+1開始寫入DB + string fn = Conversions.ToString(drTemp_Loop["FilePath"]); + var fi = new FileInfo(fn); + // 找RootPath下的子目錄 + // 先全部查核檔案路徑有沒有存在 + // 取得正確的格式檔路徑:FilePath 去除掉\Queue\FileName + strAssignedFormat = drTemp_Loop["FilePath"].ToString().Replace(Conversions.ToString(@"\Queue\" + drTemp_Loop["FileName"]), " ").Trim(); + + // aryDir = IO.Directory.GetDirectories(strRootPath) + strSourcePath = strAssignedFormat + @"\Source\"; + strDestinationPath = strAssignedFormat + @"\Destination\"; + strQueuePath = strAssignedFormat + @"\Queue\"; + strFailPath = strAssignedFormat + @"\Fail\"; + + if (!Directory.Exists(strSourcePath) || !Directory.Exists(strDestinationPath) || !Directory.Exists(strQueuePath) || !Directory.Exists(strFailPath)) + { + funImpMTLVendorTestDataRet = strAssignedFormat + "目錄下必須有 Source,Destination,Queue,Fail四個子資料夾!"; + throw new Exception(funImpMTLVendorTestDataRet); + // Continue For + } + // 取得格式檔 + strSQL = "Select FormatScript, MasterSeparateSign, DetailCloumnSeparateSign From tblMTLVENDORALScript Where Upper(MTLFolderPath) = '" + strAssignedFormat.ToUpper() + @"\'"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + // CLOB類型以.ToString轉換之 + strFormatScript = drTemp["FormatScript"].ToString(); + if (!(drTemp["MasterSeparateSign"] is DBNull)) + { + strMSplitSign = Conversions.ToString(drTemp["MasterSeparateSign"]); + if (strMSplitSign.ToUpper() == "TAB") + { + strMSplitSign = Constants.vbTab; + } + } + else + { + strMSplitSign = ":"; + } + if (!(drTemp["DetailCloumnSeparateSign"] is DBNull)) + { + strDSplitSign = Conversions.ToString(drTemp["DetailCloumnSeparateSign"]); + if (strDSplitSign.ToUpper() == "TAB") + { + strDSplitSign = Constants.vbTab; + } + } + else + { + strDSplitSign = ","; + } + } + else + { + + funImpMTLVendorTestDataRet = "目錄:" + strAssignedFormat + @"\ 未設定格式檔!"; + throw new Exception(funImpMTLVendorTestDataRet); + + // Continue For + } + + // //格式檔已存在必須先刪除 + if (File.Exists(strSourcePath + strFFName) == true) + { + File.Delete(strSourcePath + strFFName); + } + + // 將strFormatScript寫入strFFName中 + fs = new FileStream(strSourcePath + strFFName, FileMode.Create, FileAccess.Write); + sw = new StreamWriter(fs, Encoding.Default); + sw.WriteLine(strFormatScript); + sw.Close(); + sw = null; + fs.Close(); + fs = null; + + // 格式檔路徑: SourcePath & 格式檔名稱 + strFormatFile = strSourcePath + strFFName; + aryFormula.Clear(); // 換一個資料夾需清空 + + // 參數值Reset + intVendorMTLNo = defInteger; + intVendorMTLLotNo = defInteger; + intMTLNo = defInteger; + intMTLLotNo = defInteger; + intVendorNo = defInteger; + intCompLotNo = defInteger; + intColumnStart = defInteger; + intDataStart = defInteger; + + intD_VendorMTLNo = defInteger; + intD_VendorMTLLotNo = defInteger; + intD_MTLNo = defInteger; + intD_MTLLotNo = defInteger; + intD_ComponentNo = defInteger; + intD_SlotNo = defInteger; + intD_CompLotNo = defInteger; + intD_LaserMark = defInteger; + intD_CassetteNo = defInteger; + + intEquipmentNo = defInteger; + intThickNess = defInteger; + intWaferSize = defInteger; + + try + { + var scrFile = new FileInfo(strFormatFile); + fs = new FileStream(strFormatFile, FileMode.Open); + r = new StreamReader(fs, Encoding.Default); + + // 1.先讀取格式檔 + if (scrFile.Exists == false) + { + funImpMTLVendorTestDataRet = "請確認供應商格式檔案是否存在!!"; + throw new Exception(funImpMTLVendorTestDataRet); + } + else + { + + // 解析格式檔固定資料位置 + // 固定參數(列): VendorMaterialNo, VendorMaterialLotNo, VendorNo, ColumnsStart, DataStart + // 固定參數(欄): D_VendorMaterialNo, D_VendorMaterialLotNo, D_ComponentNo + // 動態參數(列): EquipmentNo, WaferSize, Thickness + // 2019/3/22,Ning,需支持位置可能會有重覆的情形 + while (r.Peek() > -1) + { + strTemp = r.ReadLine(); + strReadLine = Strings.Split(Strings.Trim(strTemp), "=>>"); + switch (strReadLine[0].ToUpper() ?? "") + { + case "VENDORMATERIALNO": + { + intVendorMTLNo = (int)Math.Round(Conversion.Val(strReadLine[1])); + break; + } + case "VENDORMATERIALLOTNO": + { + intVendorMTLLotNo = (int)Math.Round(Conversion.Val(strReadLine[1])); + break; + } + case "MATERIALNO": + { + intMTLNo = (int)Math.Round(Conversion.Val(strReadLine[1])); + break; + } + case "MATERIALLOTNO": + { + intMTLLotNo = (int)Math.Round(Conversion.Val(strReadLine[1])); + break; + } + case "VENDORNO": + { + intVendorNo = (int)Math.Round(Conversion.Val(strReadLine[1])); + break; + } + case "COMPONENTLOTNO": + { + intCompLotNo = (int)Math.Round(Conversion.Val(strReadLine[1])); + break; + } + case "COLUMNSSTART": + { + intColumnStart = (int)Math.Round(Conversion.Val(strReadLine[1])); + break; + } + case "DATASTART": + { + intDataStart = (int)Math.Round(Conversion.Val(strReadLine[1])); + break; + } + + case "D_VENDORMATERIALNO": + { + intD_VendorMTLNo = (int)Math.Round(Conversion.Val(strReadLine[1])); + break; + } + case "D_VENDORMATERIALLOTNO": + { + intD_VendorMTLLotNo = (int)Math.Round(Conversion.Val(strReadLine[1])); + break; + } + case "D_MATERIALNO": + { + intD_MTLNo = (int)Math.Round(Conversion.Val(strReadLine[1])); + break; + } + case "D_MATERIALLOTNO": + { + intD_MTLLotNo = (int)Math.Round(Conversion.Val(strReadLine[1])); + break; + } + case "D_COMPONENTNO": + { + intD_ComponentNo = (int)Math.Round(Conversion.Val(strReadLine[1])); + break; + } + case "D_SLOTNO": + { + intD_SlotNo = (int)Math.Round(Conversion.Val(strReadLine[1])); + break; + } + case "D_COMPONENTLOTNO": + { + intD_CompLotNo = (int)Math.Round(Conversion.Val(strReadLine[1])); + break; + } + case "D_LASERMARK": + { + intD_LaserMark = (int)Math.Round(Conversion.Val(strReadLine[1])); + break; + } + case "D_CASSETTENO": + { + intD_CassetteNo = (int)Math.Round(Conversion.Val(strReadLine[1])); + break; + } + + case "EQUIPMENTNO": + { + intEquipmentNo = (int)Math.Round(Conversion.Val(strReadLine[1])); + break; + } + case "WAFERSIZE": + { + intWaferSize = (int)Math.Round(Conversion.Val(strReadLine[1])); + break; + } + case "THICKNESS": + { + intThickNess = (int)Math.Round(Conversion.Val(strReadLine[1])); + break; + } + + default: + { + break; + } + // 站時 + // If strReadLine(0).ToUpper <> "D_COMPONENTNO" Then + // drFormat = dtFormat_Postion.NewRow + // drFormat("ColumnName") = strReadLine(0).ToUpper + // drFormat("ColumnPosition") = Val(strReadLine(1)) + // drFormat("FileName") = strFFName + // dtFormat_Postion.Rows.Add(drFormat) + // End If + } + } + } + } + + catch (Exception ex) + { + funImpMTLVendorTestDataRet = "格式檔解析失敗! " + strFormatFile + " Error Message :" + ex.Message.ToString(); + throw new Exception(funImpMTLVendorTestDataRet); + } + finally + { + if (r != null) + r.Close(); + if (fs != null) + fs.Close(); + } + + if (intD_ComponentNo == defInteger || intColumnStart == defInteger || intDataStart == defInteger) + { + funImpMTLVendorTestDataRet = "請確認供應商格式檔案設定是否正確(ComponentNo、ColumnsStart、DataStart)!!"; + throw new Exception(funImpMTLVendorTestDataRet); + } + + // Dim aryFile = IO.Directory.GetFiles(strQueuePath) + + // Array.Sort(aryFile) + + if (File.Exists(fn) == true && fi.FullName.ToString().IndexOf(strFFName) < 0) // 此檔案存在且非格式檔才處理 + { + if (!(dtFormat_Postion == null)) + { + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectGreater(dtFormat_Postion.Rows.Count, 0, false))) + { + var loopTo = Conversions.ToInteger(Operators.SubtractObject(dtFormat_Postion.Rows.Count, 1)); + for (h = 0; h <= loopTo; h++) + { + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtFormat_Postion.Rows[h]["FileName"], fi.Name, false))) + { + dtFormat_Postion.Rows[h]["AssignFile"] = 1; + } + else + { + dtFormat_Postion.Rows[h]["AssignFile"] = 0; + } + } + } + } + FileName = fn; + + // MTLNo,MTLLotNo, D_MTLNo, D_MTLLotNo皆以新格式為主 + // 新格式的位置為<=0才取舊格式的 + if (intMTLNo <= 0) + { + intMTLNo = intVendorMTLNo; + } + if (intMTLLotNo <= 0) + { + intMTLLotNo = intVendorMTLLotNo; + } + if (intD_MTLNo <= 0) + { + intD_MTLNo = intD_VendorMTLNo; + } + if (intD_MTLLotNo <= 0) + { + intD_MTLLotNo = intD_VendorMTLLotNo; + } + + try + { + // //將檔案來源改為Queue + FileName = strQueuePath + Path.GetFileName(fn); + int TotalRows = 0; // 記錄總比數 + if (Microsoft.VisualBasic.FileSystem.FileLen(FileName) <= lngSplitFileSize) + { + // 2022/4/7 Steven Mantis:0108642: [SEMI_Wafer] AutoLoader 來料匯入支援 Excel 格式檔 + if (Path.GetExtension(FileName) == ".csv") + { + // 解析來料檔案存入MES TestSummary, 開立進料單, 入原物料倉 + if (fuTestDataToTestSum_MTL(strTestRecipeType, FileName, strPSNo, strMSplitSign, strDSplitSign, intMTLNo, intMTLLotNo, intVendorNo, intCompLotNo, intD_MTLNo, intD_MTLLotNo, intD_ComponentNo, intD_SlotNo, intD_CompLotNo, intD_LaserMark, intD_CassetteNo, intEquipmentNo, intWaferSize, intThickNess, intColumnStart, intDataStart, strInventoryNo, fi.Name.ToString(), (DataTable)dtFormat_Postion) == false) + { + throw new Exception(); + } + } + // 解析來料檔案存入MES TestSummary, 開立進料單, 入原物料倉 + else if (fuTestDataToTestSum_MTL_Excel(strTestRecipeType, FileName, strPSNo, strMSplitSign, strDSplitSign, intMTLNo, intMTLLotNo, intVendorNo, intCompLotNo, intD_MTLNo, intD_MTLLotNo, intD_ComponentNo, intD_SlotNo, intD_CompLotNo, intD_LaserMark, intD_CassetteNo, intEquipmentNo, intWaferSize, intThickNess, intColumnStart, intDataStart, strInventoryNo, fi.Name.ToString(), (DataTable)dtFormat_Postion) == false) + { + throw new Exception(); + } + } + + else if (Path.GetExtension(FileName) == ".csv") + { + // 解析來料檔案存入MES TestSummary, 開立進料單, 入原物料倉 + string FileNameTmp = fi.Name.ToString(); + FileInfo fInfo = new FileInfo(FileName); + if (fuTestDataToTestSum_MTL_BigFile(strTestRecipeType, FileName, + strPSNo, strMSplitSign, strDSplitSign, intMTLNo, intMTLLotNo, + intVendorNo, intCompLotNo, intD_MTLNo, intD_MTLLotNo, + intD_ComponentNo, intD_SlotNo, intD_CompLotNo, intD_LaserMark, + intD_CassetteNo, intEquipmentNo, intWaferSize, intThickNess, + intColumnStart, intDataStart, strInventoryNo, FileNameTmp, + strJobNo, strJobFunction, FileName, (int)fInfo.Length, + lngSplitRecordsLimit, ref blnSplitPartialSuccess, ref TotalRows, + dtFormat_Postion, intStartRow) == false) + { + throw new Exception(); + } + } + else + { + // 解析來料檔案存入MES TestSummary, 開立進料單, 入原物料倉 + string FileNameTmp = fi.Name.ToString(); + FileInfo fInfo = new FileInfo(FileName); + if (fuTestDataToTestSum_MTL_BigFile_Excel(strTestRecipeType, + FileName, strPSNo, strMSplitSign, strDSplitSign, intMTLNo, + intMTLLotNo, intVendorNo, intCompLotNo, intD_MTLNo, intD_MTLLotNo, + intD_ComponentNo, intD_SlotNo, intD_CompLotNo, intD_LaserMark, + intD_CassetteNo, intEquipmentNo, intWaferSize, intThickNess, + intColumnStart, intDataStart, strInventoryNo, FileNameTmp, + strJobNo, strJobFunction, FileName, (int)fInfo.Length, + lngSplitRecordsLimit, ref blnSplitPartialSuccess, ref TotalRows, + dtFormat_Postion, intStartRow) == false) + { + throw new System.Exception(); + } + + } + } + + catch (Exception ex) + { + funImpMTLVendorTestDataRet = "依格式檔案定義解析資料存入MES TestSummary, 原物料倉 資料表失敗: " + ex.Message; + if (blnSplitPartialSuccess) + { + blnNotMoveToFail = true; + } + else if (blnSplitPartialSuccess == false && intStartRow != defInteger) // 當續處理檔案,第一次就錯時,也不該移動檔案 + { + blnNotMoveToFail = true; + } + blnSplitPartialSuccess = false; + throw new Exception(funImpMTLVendorTestDataRet); + + } + + + // //目錄不存在時必須要先建立 + if (Directory.Exists(strDestinationPath + DirName) == false) + { + Directory.CreateDirectory(strDestinationPath + DirName); + } + // //檔案已存在Destination必須先刪除 + if (File.Exists(strDestinationPath + DirName + @"\" + Path.GetFileName(FileName)) == true) + { + File.Delete(strDestinationPath + DirName + @"\" + Path.GetFileName(FileName)); + } + // //移動檔案Queue至Destination + File.Move(FileName, strDestinationPath + DirName + @"\" + Path.GetFileName(FileName)); + + FileName = ""; + + } + } + + catch (Exception ex) + { + + // //檔案處理失敗時移動檔案至Fail + if (!string.IsNullOrEmpty(FileName)) + { + // //目錄不存在時必須要先建立 + if (Directory.Exists(strFailPath + DirName) == false) + { + Directory.CreateDirectory(strFailPath + DirName); + } + // //檔案已存在File必須先刪除 + if (File.Exists(strFailPath + DirName + @"\" + Path.GetFileName(FileName)) == true) + { + File.Delete(strFailPath + DirName + @"\" + Path.GetFileName(FileName)); + } + // //移動檔案至Fail + try + { + // 2021/5/12 Steven 當有分包成功寫入DB的檔案,不需移動至fail + if (blnNotMoveToFail == false) + File.Move(FileName, strFailPath + DirName + @"\" + Path.GetFileName(FileName)); + blnNotMoveToFail = false; + } + + catch (Exception ex1) + { + } + + // 記錄錯誤的FileName + strFailLog = strFailLog + "[" + Path.GetFileName(FileName) + "][" + ex.Message + "]" + Constants.vbCrLf; + + FileName = ""; + + + if (!string.IsNullOrEmpty(strFailLog)) + { + funImpMTLVendorTestDataRet = "[JobNo:" + strJobNo + "][FunctionNo:funImpMTLVendorTestData]" + strFailLog; + } + // 若設定管理群組或群組人員,如果失敗,需要寄送mail + if ((strINVGroupNo ?? "") != defString && !string.IsNullOrEmpty(strFailLog)) + { + string argFileName = "N/A"; + string argEmailSubject = "來料庫房TestSummary執行失敗"; + modAutoLoaderLibrary.SendMultiEmail(ref argFileName, ref argEmailSubject, funImpMTLVendorTestDataRet, strINVGroupNo, GroupType: modAutoLoaderLibrary.GroupType.InventoryGroup); + } + } + } + } + drTemp_Loop.Close(); + //cmmTemp.Dispose(); + + // 找RootPath下的子目錄 + aryDir = Directory.GetDirectories(strRootPath); + foreach (string strDir in aryDir) + { + strSourcePath = strDir + @"\Source\"; + strDestinationPath = strDir + @"\Destination\"; + strQueuePath = strDir + @"\Queue\"; + strFailPath = strDir + @"\Fail\"; + + if (!Directory.Exists(strSourcePath) || !Directory.Exists(strDestinationPath) || !Directory.Exists(strQueuePath) || !Directory.Exists(strFailPath)) + { + funImpMTLVendorTestDataRet = strDir + "目錄下必須有 Source,Destination,Queue,Fail四個子資料夾!"; + throw new Exception(funImpMTLVendorTestDataRet); + // Continue For + } + + + // 取得格式檔 + strSQL = "Select FormatScript, MasterSeparateSign, DetailCloumnSeparateSign From tblMTLVENDORALScript Where Upper(MTLFolderPath) = '" + strDir.ToUpper() + @"\'"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + // CLOB類型以.ToString轉換之 + strFormatScript = drTemp["FormatScript"].ToString(); + if (!(drTemp["MasterSeparateSign"] is DBNull)) + { + strMSplitSign = Conversions.ToString(drTemp["MasterSeparateSign"]); + if (strMSplitSign.ToUpper() == "TAB") + { + strMSplitSign = Constants.vbTab; + } + } + else + { + strMSplitSign = ":"; + } + if (!(drTemp["DetailCloumnSeparateSign"] is DBNull)) + { + strDSplitSign = Conversions.ToString(drTemp["DetailCloumnSeparateSign"]); + if (strDSplitSign.ToUpper() == "TAB") + { + strDSplitSign = Constants.vbTab; + } + } + else + { + strDSplitSign = ","; + } + } + else + { + drTemp.Close(); + //cmmTemp.Dispose(); + + funImpMTLVendorTestDataRet = "目錄:" + strDir + @"\ 未設定格式檔!"; + throw new Exception(funImpMTLVendorTestDataRet); + + // Continue For + } + drTemp.Close(); + //cmmTemp.Dispose(); + + // //格式檔已存在必須先刪除 + if (File.Exists(strSourcePath + strFFName) == true) + { + File.Delete(strSourcePath + strFFName); + } + + // 將strFormatScript寫入strFFName中 + fs = new FileStream(strSourcePath + strFFName, FileMode.Create, FileAccess.Write); + sw = new StreamWriter(fs, Encoding.Default); + sw.WriteLine(strFormatScript); + sw.Close(); + sw = null; + fs.Close(); + fs = null; + + // 格式檔路徑: SourcePath & 格式檔名稱 + strFormatFile = strSourcePath + strFFName; + aryFormula.Clear(); // 換一個資料夾需清空 + + // 參數值Reset + intVendorMTLNo = defInteger; + intVendorMTLLotNo = defInteger; + intMTLNo = defInteger; + intMTLLotNo = defInteger; + intVendorNo = defInteger; + intCompLotNo = defInteger; + intColumnStart = defInteger; + intDataStart = defInteger; + + intD_VendorMTLNo = defInteger; + intD_VendorMTLLotNo = defInteger; + intD_MTLNo = defInteger; + intD_MTLLotNo = defInteger; + intD_ComponentNo = defInteger; + intD_SlotNo = defInteger; + intD_CompLotNo = defInteger; + intD_LaserMark = defInteger; + intD_CassetteNo = defInteger; + + intEquipmentNo = defInteger; + intThickNess = defInteger; + intWaferSize = defInteger; + + try + { + var scrFile = new FileInfo(strFormatFile); + fs = new FileStream(strFormatFile, FileMode.Open); + r = new StreamReader(fs, Encoding.Default); + + // 1.先讀取格式檔 + if (scrFile.Exists == false) + { + funImpMTLVendorTestDataRet = "請確認供應商格式檔案是否存在!!"; + throw new Exception(funImpMTLVendorTestDataRet); + } + else + { + + // 解析格式檔固定資料位置 + // 固定參數(列): VendorMaterialNo, VendorMaterialLotNo, VendorNo, ColumnsStart, DataStart + // 固定參數(欄): D_VendorMaterialNo, D_VendorMaterialLotNo, D_ComponentNo + // 動態參數(列): EquipmentNo, WaferSize, Thickness + // 2019/3/22,Ning,需支持位置可能會有重覆的情形 + while (r.Peek() > -1) + { + strTemp = r.ReadLine(); + strReadLine = Strings.Split(Strings.Trim(strTemp), "=>>"); + switch (strReadLine[0].ToUpper() ?? "") + { + case "VENDORMATERIALNO": + { + intVendorMTLNo = (int)Math.Round(Conversion.Val(strReadLine[1])); + break; + } + case "VENDORMATERIALLOTNO": + { + intVendorMTLLotNo = (int)Math.Round(Conversion.Val(strReadLine[1])); + break; + } + case "MATERIALNO": + { + intMTLNo = (int)Math.Round(Conversion.Val(strReadLine[1])); + break; + } + case "MATERIALLOTNO": + { + intMTLLotNo = (int)Math.Round(Conversion.Val(strReadLine[1])); + break; + } + case "VENDORNO": + { + intVendorNo = (int)Math.Round(Conversion.Val(strReadLine[1])); + break; + } + case "COMPONENTLOTNO": + { + intCompLotNo = (int)Math.Round(Conversion.Val(strReadLine[1])); + break; + } + case "COLUMNSSTART": + { + intColumnStart = (int)Math.Round(Conversion.Val(strReadLine[1])); + break; + } + case "DATASTART": + { + intDataStart = (int)Math.Round(Conversion.Val(strReadLine[1])); + break; + } + + case "D_VENDORMATERIALNO": + { + intD_VendorMTLNo = (int)Math.Round(Conversion.Val(strReadLine[1])); + break; + } + case "D_VENDORMATERIALLOTNO": + { + intD_VendorMTLLotNo = (int)Math.Round(Conversion.Val(strReadLine[1])); + break; + } + case "D_MATERIALNO": + { + intD_MTLNo = (int)Math.Round(Conversion.Val(strReadLine[1])); + break; + } + case "D_MATERIALLOTNO": + { + intD_MTLLotNo = (int)Math.Round(Conversion.Val(strReadLine[1])); + break; + } + case "D_COMPONENTNO": + { + intD_ComponentNo = (int)Math.Round(Conversion.Val(strReadLine[1])); + break; + } + case "D_SLOTNO": + { + intD_SlotNo = (int)Math.Round(Conversion.Val(strReadLine[1])); + break; + } + case "D_COMPONENTLOTNO": + { + intD_CompLotNo = (int)Math.Round(Conversion.Val(strReadLine[1])); + break; + } + case "D_LASERMARK": + { + intD_LaserMark = (int)Math.Round(Conversion.Val(strReadLine[1])); + break; + } + case "D_CASSETTENO": + { + intD_CassetteNo = (int)Math.Round(Conversion.Val(strReadLine[1])); + break; + } + + case "EQUIPMENTNO": + { + intEquipmentNo = (int)Math.Round(Conversion.Val(strReadLine[1])); + break; + } + case "WAFERSIZE": + { + intWaferSize = (int)Math.Round(Conversion.Val(strReadLine[1])); + break; + } + case "THICKNESS": + { + intThickNess = (int)Math.Round(Conversion.Val(strReadLine[1])); + break; + } + + default: + { + break; + } + // 站時 + // If strReadLine(0).ToUpper <> "D_COMPONENTNO" Then + // drFormat = dtFormat_Postion.NewRow + // drFormat("ColumnName") = strReadLine(0).ToUpper + // drFormat("ColumnPosition") = Val(strReadLine(1)) + // drFormat("FileName") = strFFName + // dtFormat_Postion.Rows.Add(drFormat) + // End If + } + } + } + } + + catch (Exception ex) + { + funImpMTLVendorTestDataRet = "格式檔解析失敗! " + strFormatFile + " Error Message :" + ex.Message.ToString(); + throw new Exception(funImpMTLVendorTestDataRet); + } + finally + { + if (r != null) + r.Close(); + if (fs != null) + fs.Close(); + } + + if (intD_ComponentNo == defInteger || intColumnStart == defInteger || intDataStart == defInteger) + { + funImpMTLVendorTestDataRet = "請確認供應商格式檔案設定是否正確(ComponentNo、ColumnsStart、DataStart)!!"; + throw new Exception(funImpMTLVendorTestDataRet); + } + + object aryFile = Directory.GetFiles(strSourcePath); + + Array.Sort((Array)aryFile); + // 2.迴圈Component測試資料讀取 + foreach (string fn in (IEnumerable)aryFile) // fn為FileName + { + try + { + var fi = new FileInfo(fn); + + if (File.Exists(fn) == true && fi.FullName.ToString().IndexOf(strFFName) < 0) // 此檔案存在且非格式檔才處理 + { + if (!(dtFormat_Postion == null)) + { + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectGreater(dtFormat_Postion.Rows.Count, 0, false))) + { + var loopTo1 = Conversions.ToInteger(Operators.SubtractObject(dtFormat_Postion.Rows.Count, 1)); + for (h = 0; h <= loopTo1; h++) + { + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtFormat_Postion.Rows[h]["FileName"], fi.Name, false))) + { + dtFormat_Postion.Rows[h]["AssignFile"] = 1; + } + else + { + dtFormat_Postion.Rows[h]["AssignFile"] = 0; + } + } + } + } + FileName = fn; + + // //移動檔案Source至Queue + try + { + blnMoveFile = true; + File.Move(fn, strQueuePath + Path.GetFileName(fn)); + } + catch (Exception ex) + { + blnMoveFile = false; + funImpMTLVendorTestDataRet = ex.Message; + throw new Exception(funImpMTLVendorTestDataRet); + // Throw New System.Exception("此執行程序已中止,由另一執行程序處理中!!") + } + + // MTLNo,MTLLotNo, D_MTLNo, D_MTLLotNo皆以新格式為主 + // 新格式的位置為<=0才取舊格式的 + if (intMTLNo <= 0) + { + intMTLNo = intVendorMTLNo; + } + if (intMTLLotNo <= 0) + { + intMTLLotNo = intVendorMTLLotNo; + } + if (intD_MTLNo <= 0) + { + intD_MTLNo = intD_VendorMTLNo; + } + if (intD_MTLLotNo <= 0) + { + intD_MTLLotNo = intD_VendorMTLLotNo; + } + + try + { + // //將檔案來源改為Queue + FileName = strQueuePath + Path.GetFileName(fn); + if (Microsoft.VisualBasic.FileSystem.FileLen(FileName) <= lngSplitFileSize) + { + if (Path.GetExtension(FileName) == ".csv") + { + // 解析來料檔案存入MES TestSummary, 開立進料單, 入原物料倉 + if (fuTestDataToTestSum_MTL(strTestRecipeType, FileName, strPSNo, strMSplitSign, strDSplitSign, intMTLNo, intMTLLotNo, intVendorNo, intCompLotNo, intD_MTLNo, intD_MTLLotNo, intD_ComponentNo, intD_SlotNo, intD_CompLotNo, intD_LaserMark, intD_CassetteNo, intEquipmentNo, intWaferSize, intThickNess, intColumnStart, intDataStart, strInventoryNo, fi.Name.ToString(), (DataTable)dtFormat_Postion) == false) + { + throw new Exception(); + } + } + // 解析來料檔案存入MES TestSummary, 開立進料單, 入原物料倉 + else if (fuTestDataToTestSum_MTL_Excel(strTestRecipeType, FileName, strPSNo, strMSplitSign, strDSplitSign, intMTLNo, intMTLLotNo, intVendorNo, intCompLotNo, intD_MTLNo, intD_MTLLotNo, intD_ComponentNo, intD_SlotNo, intD_CompLotNo, intD_LaserMark, intD_CassetteNo, intEquipmentNo, intWaferSize, intThickNess, intColumnStart, intDataStart, strInventoryNo, fi.Name.ToString(), (DataTable)dtFormat_Postion) == false) + { + throw new Exception(); + } + } + else if (Path.GetExtension(FileName) == ".csv") + { + // 解析來料檔案存入MES TestSummary, 開立進料單, 入原物料倉 + string FileNameTmp = fi.Name.ToString(); + int TatalRowsTmp = default(int); + FileInfo fInfo = new FileInfo(FileName); + if (fuTestDataToTestSum_MTL_BigFile(strTestRecipeType, FileName, + strPSNo, strMSplitSign, strDSplitSign, intMTLNo, intMTLLotNo, + intVendorNo, intCompLotNo, intD_MTLNo, intD_MTLLotNo, intD_ComponentNo, + intD_SlotNo, intD_CompLotNo, intD_LaserMark, intD_CassetteNo, + intEquipmentNo, intWaferSize, intThickNess, intColumnStart, + intDataStart, strInventoryNo, FileNameTmp, strJobNo, + strJobFunction, FileName, (int)fInfo.Length, lngSplitRecordsLimit, + ref blnSplitPartialSuccess, ref TatalRowsTmp, dtFormat_Postion) == false) + { + throw new System.Exception(); + } + } + else + { + // 解析來料檔案存入MES TestSummary, 開立進料單, 入原物料倉 + string FileNameTmp = fi.Name.ToString(); + int TatalRowsTmp = default(int); + FileInfo fInfo = new FileInfo(FileName); + if (fuTestDataToTestSum_MTL_BigFile_Excel(strTestRecipeType, FileName, + strPSNo, strMSplitSign, strDSplitSign, intMTLNo, intMTLLotNo, + intVendorNo, intCompLotNo, intD_MTLNo, intD_MTLLotNo, intD_ComponentNo, + intD_SlotNo, intD_CompLotNo, intD_LaserMark, intD_CassetteNo, + intEquipmentNo, intWaferSize, intThickNess, intColumnStart, intDataStart, + strInventoryNo, FileNameTmp, strJobNo, strJobFunction, FileName, + (int)fInfo.Length, lngSplitRecordsLimit, ref blnSplitPartialSuccess, ref TatalRowsTmp, + dtFormat_Postion) == false) + { + throw new System.Exception(); + } + } + } + + catch (Exception ex) + { + funImpMTLVendorTestDataRet = "依格式檔案定義解析資料存入MES TestSummary, 原物料倉 資料表失敗: " + ex.Message; + if (blnSplitPartialSuccess) + { + blnNotMoveToFail = true; + } + else if (blnSplitPartialSuccess == false && intStartRow != defInteger) // 當續處理檔案,第一次就錯時,也不該移動檔案 + { + blnNotMoveToFail = true; + } + blnSplitPartialSuccess = false; + throw new Exception(funImpMTLVendorTestDataRet); + + } + + + // //目錄不存在時必須要先建立 + if (Directory.Exists(strDestinationPath + DirName) == false) + { + Directory.CreateDirectory(strDestinationPath + DirName); + } + // //檔案已存在Destination必須先刪除 + if (File.Exists(strDestinationPath + DirName + @"\" + Path.GetFileName(FileName)) == true) + { + File.Delete(strDestinationPath + DirName + @"\" + Path.GetFileName(FileName)); + } + // //移動檔案Queue至Destination + File.Move(FileName, strDestinationPath + DirName + @"\" + Path.GetFileName(FileName)); + + FileName = ""; + + } + } + + catch (Exception ex) + { + + // //檔案處理失敗時移動檔案至Fail + if (!string.IsNullOrEmpty(FileName)) + { + // //目錄不存在時必須要先建立 + if (Directory.Exists(strFailPath + DirName) == false) + { + Directory.CreateDirectory(strFailPath + DirName); + } + // //檔案已存在File必須先刪除 + if (File.Exists(strFailPath + DirName + @"\" + Path.GetFileName(FileName)) == true) + { + File.Delete(strFailPath + DirName + @"\" + Path.GetFileName(FileName)); + } + // //移動檔案至Fail + try + { + // 2021/5/12 Steven 當有分包成功寫入DB的檔案,不需移動至fail + if (blnNotMoveToFail == false) + File.Move(FileName, strFailPath + DirName + @"\" + Path.GetFileName(FileName)); + blnNotMoveToFail = false; + } + + catch (Exception ex1) + { + } + + // 記錄錯誤的FileName + strFailLog = strFailLog + "[" + Path.GetFileName(FileName) + "][" + ex.Message + "]" + Constants.vbCrLf; + + if (!string.IsNullOrEmpty(strFailLog)) + { + funImpMTLVendorTestDataRet = "[JobNo:" + strJobNo + "][FunctionNo:funImpMTLVendorTestData]" + strFailLog; + } + // 若設定管理群組或群組人員,如果失敗,需要寄送mail + if ((strINVGroupNo ?? "") != defString && !string.IsNullOrEmpty(strFailLog)) + { + string argFileName = "N/A"; + string argEmailSubject = "來料庫房TestSummary執行失敗"; + modAutoLoaderLibrary.SendMultiEmail(ref argFileName, ref argEmailSubject, funImpMTLVendorTestDataRet, strINVGroupNo, GroupType: modAutoLoaderLibrary.GroupType.InventoryGroup); + } + + FileName = ""; + } + + // 一個檔案失敗繼續讀取下個檔案 + continue; + + } + + } // For Each fn As String In aryFile + + } // For Each strDir As String In aryDir + + funImpMTLVendorTestDataRet = "success"; + } + + catch (Exception e1) + { + + strFailLog = strFailLog + "[" + e1.Message + "]" + Constants.vbCrLf; + } + + + // 2019/8/12,Ning, 已改在上面的Loop中處理檔案移動至Fail目錄 + // //檔案處理失敗時移動檔案Queue至Fail + // If FileName <> String.Empty AndAlso blnMoveFile = True Then + // '//目錄不存在時必須要先建立 + // If My.Computer.FileSystem.DirectoryExists(strFailPath & DirName) = False Then + // My.Computer.FileSystem.CreateDirectory(strFailPath & DirName) + // End If + // '//檔案已存在File必須先刪除 + // If File.Exists(strFailPath & DirName & "\" & Path.GetFileName(FileName)) = True Then + // File.Delete(strFailPath & DirName & "\" & Path.GetFileName(FileName)) + // End If + // '//移動檔案Queue至Fail + // Try + // File.Move(FileName, strFailPath & DirName & "\" & Path.GetFileName(FileName)) + // Catch ex1 As Exception + // End Try + + // End If + + // '//回傳錯誤原因 + // funImpMTLVendorTestData = "[JobNo:" & strJobNo & "][FunctionNo:funImpMTLVendorTestData][FileName:" & Path.GetFileName(FileName) & "][" & e1.Message & ",StackTrace:" & e1.StackTrace & "]" + + finally + { + + CloseConnection(cnnTemp); + if (!(drTemp == null)) + drTemp.Close(); + //if (!(cmmTemp == null)) + // cmmTemp.Dispose(); + if (r != null) + r.Close(); + if (fs != null) + fs.Close(); + + } + + return funImpMTLVendorTestDataRet; + + } + + //廠內設備電性值匯入 funImpEQPTestData + /// + /// + /// + /// + /// + private string funImpEQPTestData(Collection colParameters = null) + { + string funImpEQPTestDataRet = default(string); + + var cnnTemp = default(IDbConnection); + var drTemp = default(DbDataReader); + + + string strJobNo = string.Empty; // JobNo + string strSourcePath = string.Empty; // 來源檔案路徑 + string strDestinationPath = string.Empty; // 目前檔案路徑 + string strQueuePath = string.Empty; // 處理中檔案路徑 + string strFailPath = string.Empty; // 失敗檔案路徑 + string FileName = string.Empty; // 處理中檔案 + string DirName = DateTime.Now.ToString("yyyyMM"); // 分類目錄名稱 + bool blnMoveFile = true; + string strSQL = string.Empty; + + // 固定欄位資料起始位置(第幾列) + // 2019/5/28,Ning, WaferID可能不是數值, 為分隔符號, 第幾個Part, 第幾碼-第幾碼 + string strWaferIDPos = defString; + int intEquipmentNo = defInteger; + int intTestDate = defInteger; + int intThickNess = defInteger; + int intProgramNo = defInteger; + int intWaferSize = defInteger; + int intColumnStart = defInteger; + // 2019/5/30,Ning, 多片格式需定義D_ComponentNo + string intD_ComponentNo = defInteger.ToString(); + // 2021/5/4,Ning, 多批格式需定義D_LotNo + string intD_LotNo = defInteger.ToString(); + // 2019/5/28,Ning, DataStart可能不是數值, 是固定字串, 該字串出現後的下一列為DataStart + string strDataStartPos = defString; + // 2019/5/29, 若為MultiWafer則是Excel的讀檔 + var blnMultiWafer = default(bool); + // 是否是一檔單批 + var blnSingleLot = default(bool); + // 2021/3/25,Ning,是否儲存RawData + var blnStoreRawData = default(bool); + // 2021/5/3,Ning,是否為多批格式 + var blnBatchFormat = default(bool); + // 多檔新增動態位置 + string strLotNumber = defString; + string strRecipe = defString; + string strBinFileName = defString; + string strOperator = defString; + string strTotalScan = defString; + string strTotalTested = defString; + string strTestCondition = defString; + string strCalData = defString; + + string strEquipmentNo; + string strTestRecipeType = defString; + string strTemp; + + var strReadLine = new string[2]; + string[] aryWaferInfo = new string[] { defString, defString, defString, defString, defString, defString }; // 存放解析後的Wafer資訊 + var fs = default(FileStream); + var r = default(StreamReader); + + string strFormatFile, strRawFormatFile; // 格式檔路徑+名稱 + string strFormatScript, strRawFormatScript; // 格式檔內容 + string strFFName, strRawFFName; // 格式檔名稱 + StreamWriter sw; + + var datEvnetTime = DateTime.Now; + + DataTable dtFormatFile = default(DataTable), dtRawScript; + DataView dvFormatFile; + DataRow drAdd; + int idx; + bool blnFound; + var intItemNo = default(int); + string strExtName, strMSplitSign = default(string), strDSplitSign = default(string); + int h; + DataRow drFormat; + string strFailLog = ""; + // 91733: [SEMI_Wafer] AutoLoader 廠內設備電性值匯入,支援可不收集電性測試資料, 只收集 Raw Data + var blnSummaryCollect = default(bool); + + // 2021/3/23,Ning,89890: [SEMI_Wafer]AutoLoader 測試原始數據收集_設備AutoLoader 電性值匯入調整 + long lngSplitFileSize = 10485760L; + long lngSplitRecordsLimit = 5000L; + string strTmpTableName = default(string), strMatchFFName = default(string); + var dtRawData = default(DataTable); + + // 2021/5/10 增加現況與log紀錄 + string strJobName = defString; + string strJobFunction = defString; + bool blnSplitPartialSuccess = false; + bool blnNotMoveToFail = false; + string strEQPGroupNo = defString; + var dtFormat_Postion = new DataTable("Format_Postion"); // 0088935: [SEMI_Wafer] AutoLoader測試資料動態參數收集優化_AutoLoader 電性值匯入調整 + dtFormat_Postion.Columns.Add("ColumnName", Type.GetType("System.String")); + dtFormat_Postion.Columns.Add("ColumnPosition", Type.GetType("System.String")); + dtFormat_Postion.Columns.Add("Value", Type.GetType("System.String")); + dtFormat_Postion.Columns.Add("FileName", Type.GetType("System.String")); + dtFormat_Postion.Columns.Add("AssignFile", Type.GetType("System.String")); + + //Temp 資訊 + IDbConnection cnnTest = default(IDbConnection); + string strTestCnnString = "", strTestDBType = "", strTestDBOwner = ""; + + try + { + // //取出colParameter傳入參數 + strJobNo = colParameters["JobNo"].ToString().Trim(); + strSourcePath = colParameters["SourcePath"].ToString().Trim(); + strDestinationPath = colParameters["DestinationPath"].ToString().Trim(); + strQueuePath = colParameters["QueuePath"].ToString().Trim(); + strFailPath = colParameters["FailPath"].ToString().Trim(); + strJobName = colParameters["JobName"].ToString().Trim(); + strJobFunction = colParameters["JobFunction"].ToString().Trim(); + // Parameter1為傳入參數,作為機台編號,若無此值則不進行下面的程式 + if (colParameters["Parameter1"] == null || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter1"])))) + { + funImpEQPTestDataRet = "機台編號 not found!!!(Parameter1)"; + throw new Exception(funImpEQPTestDataRet); + } + else + { + strEquipmentNo = Strings.Trim(Conversions.ToString(colParameters["Parameter1"])); + } + // Parameter2為傳入參數,作為測試類型(TestRecipeType),若無此值則程式依TestRecipeNo+PSNo找TestRecipeType + if (colParameters["Parameter2"] == null || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter2"])))) + { + } + else + { + strTestRecipeType = Strings.Trim(Conversions.ToString(colParameters["Parameter2"])); + } + + // SplitFileSize分包檔案大小, 若沒設定則預設為10485760 (10MB) + if (colParameters.Contains("SplitFileSize") && Information.IsNumeric(Strings.Trim(Conversions.ToString(colParameters["SplitFileSize"])))) + { + lngSplitFileSize = Conversions.ToLong(Strings.Trim(Conversions.ToString(colParameters["SplitFileSize"]))); + } + // SplitRecordsLimit分包筆數, 若沒設定則預設為5000筆 + if (colParameters.Contains("SplitRecordsLimit") && Information.IsNumeric(Strings.Trim(Conversions.ToString(colParameters["SplitRecordsLimit"])))) + { + lngSplitRecordsLimit = Conversions.ToLong(Strings.Trim(Conversions.ToString(colParameters["SplitRecordsLimit"]))); + } + + cnnTemp = CreateConnection(strConnectionString); + + dtFormatFile = new DataTable("FormatFile"); + dtFormatFile.Columns.Add("ItemNo", Type.GetType("System.Int16")); // 第幾個格式檔, 會與aryFormula(itemno)對應 + dtFormatFile.Columns.Add("FileNameFormat", Type.GetType("System.String")); // DB中完整的FileNameFormat + dtFormatFile.Columns.Add("FFName", Type.GetType("System.String")); // 存完整的FileNameFormat.txt + dtFormatFile.Columns.Add("ExtName", Type.GetType("System.String")); // 格式檔副檔名, Ex ".csv" + dtFormatFile.Columns.Add("FName", Type.GetType("System.String")); // 格式檔去除副檔名 + dtFormatFile.Columns.Add("FFLength", Type.GetType("System.Int16")); // 存%前或%後字串的長度 + dtFormatFile.Columns.Add("FormatScript", Type.GetType("System.String")); + dtFormatFile.Columns.Add("MSplitSign", Type.GetType("System.String")); // 表格分隔符號 + dtFormatFile.Columns.Add("DSplitSign", Type.GetType("System.String")); // 明細分隔符號 + dtFormatFile.Columns.Add("MultiWafer", Type.GetType("System.Int16")); // 是否為有多筆WaferID的 + dtFormatFile.Columns.Add("StoreRawData", Type.GetType("System.Int16")); // 是否儲存RawData + dtFormatFile.Columns.Add("RawFFName", Type.GetType("System.String")); // 存完整的RawData FormatFileName.txt + dtFormatFile.Columns.Add("BatchFormat", Type.GetType("System.Int16")); // 是否為多批格式 0:否 1:是 + // 固定參數位置 + dtFormatFile.Columns.Add("strWaferIDPos", Type.GetType("System.String")); // WaferID可能不是設數值 + dtFormatFile.Columns.Add("intTestDate", Type.GetType("System.Int16")); + dtFormatFile.Columns.Add("intEquipmentNo", Type.GetType("System.Int16")); + dtFormatFile.Columns.Add("intProgramNo", Type.GetType("System.Int16")); + dtFormatFile.Columns.Add("intColumnStart", Type.GetType("System.Int16")); + dtFormatFile.Columns.Add("strDataStartPos", Type.GetType("System.String")); + dtFormatFile.Columns.Add("intD_ComponentNo", Type.GetType("System.Int16")); + dtFormatFile.Columns.Add("intD_LotNo", Type.GetType("System.Int16")); + // 動態位置 + dtFormatFile.Columns.Add("intWaferSize", Type.GetType("System.Int16")); + dtFormatFile.Columns.Add("intThickNess", Type.GetType("System.Int16")); + // 多檔新增動態位置 + dtFormatFile.Columns.Add("LotNumber", Type.GetType("System.String")); + dtFormatFile.Columns.Add("Recipe", Type.GetType("System.String")); + dtFormatFile.Columns.Add("BinFileName", Type.GetType("System.String")); + dtFormatFile.Columns.Add("Operator", Type.GetType("System.String")); + dtFormatFile.Columns.Add("TotalScan", Type.GetType("System.String")); + dtFormatFile.Columns.Add("TotalTested", Type.GetType("System.String")); + dtFormatFile.Columns.Add("Test_Condition", Type.GetType("System.String")); + dtFormatFile.Columns.Add("CalData", Type.GetType("System.String")); + // 91733: [SEMI_Wafer] AutoLoader 廠內設備電性值匯入,支援可不收集電性測試資料, 只收集 Raw Data + dtFormatFile.Columns.Add("intSummaryCollect", Type.GetType("System.Int16")); // 0代表不收集Summart, 1代表收集Summary + + dtRawScript = new DataTable("RawScript"); + dtRawScript.Columns.Add("TestRecipeNo", Type.GetType("System.String")); + dtRawScript.Columns.Add("ColPosition", Type.GetType("System.Int16")); + dtRawScript.Columns.Add("FileNameFormat", Type.GetType("System.String")); + + strSQL = "Select ENGINEERGROUPNO From tblEQPEquipmentBasis Where EquipmentNo = '" + strEquipmentNo + "'"; + ////cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + strEQPGroupNo = drTemp["ENGINEERGROUPNO"].ToString(); + } + drTemp.Close(); + //cmmTemp.Dispose(); + + // 取得格式檔 + // 2019/2/20, Ning, 同一機台格式檔可能會有多筆 + // 2019/5/28, Ning, FileNameFormat支援%在最前面 + strSQL = "Select * From tblEQPALScript Where EquipmentNo = '" + strEquipmentNo + "'"; + ////cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.HasRows) + { + idx = 0; + while (drTemp.Read()) + { + idx = idx + 1; + // 格式檔名稱直接用FileNameFormat存, FileNameFormat可能為A_AOI%.csv或AQL%.csv等 + strFFName = drTemp["FileNameFormat"].ToString(); + strExtName = Strings.Right(strFFName, strFFName.Length - strFFName.LastIndexOf(".")); + // 格式檔名將副檔名取式為.txt + strFFName = Strings.Replace(strFFName, strExtName, ".txt"); + // 原始數據格式檔為格式檔_RAW.txt + strRawFFName = Strings.Mid(strFFName, 1, Strings.Len(strFFName) - 4) + "_RAW" + ".txt"; + // CLOB類型以.ToString轉換之 + strFormatScript = drTemp["FormatScript"].ToString(); + + // //格式檔已存在必須先刪除 + if (File.Exists(strSourcePath + strFFName) == true) + { + File.Delete(strSourcePath + strFFName); + } + + // 將strFormatScript寫入strFFName中 + fs = new FileStream(strSourcePath + strFFName, FileMode.Create, FileAccess.Write); + sw = new StreamWriter(fs, Encoding.Default); + sw.WriteLine(strFormatScript); + sw.Close(); + sw = null; + fs.Close(); + fs = null; + + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["StoreRawData"], 1, false))) + { + // 將Raw格式檔寫入RawFileNameFormat去副檔名+".txt" + strRawFormatScript = drTemp["RawDataFormatScript"].ToString(); + + if (File.Exists(strSourcePath + strRawFFName) == true) + { + File.Delete(strSourcePath + strRawFFName); + } + + // 將strFormatScript寫入strFFName中 + fs = new FileStream(strSourcePath + strRawFFName, FileMode.Create, FileAccess.Write); + sw = new StreamWriter(fs, Encoding.Default); + sw.WriteLine(strRawFormatScript); + sw.Close(); + sw = null; + fs.Close(); + fs = null; + } + + drAdd = dtFormatFile.NewRow(); + drAdd["ItemNo"] = idx; + drAdd["FileNameFormat"] = drTemp["FileNameFormat"].ToString(); + drAdd["FFName"] = strFFName; + drAdd["ExtName"] = strExtName; + drAdd["FName"] = Strings.Mid(strFFName, 1, strFFName.Length - 4); // 因格式檔固定存為.txt, 故直接取第1碼至長度減4碼 + // 去除%與副檔名的長度 + drAdd["FFLength"] = drTemp["FileNameFormat"].ToString().Length - 1 - strExtName.Length; + drAdd["FormatScript"] = strFormatScript; + drAdd["MSplitSign"] = drTemp["MasterSeparateSign"]; + drAdd["DSplitSign"] = drTemp["DetailCloumnSeparateSign"]; + drAdd["MultiWafer"] = drTemp["MultiWafer"]; // 0:單筆Wafer, 有含公式檔 1:多筆Wafer, 為Excel File + // RawData + drAdd["StoreRawData"] = drTemp["StoreRawData"]; // 0:不存RawData 1:要存RawData + drAdd["RawFFName"] = strRawFFName; // 記錄原始數據格式檔名稱 + drAdd["intSummaryCollect"] = 0; // 預設不收集,有讀取到"公式"才收集Summary + // BatchFormat + drAdd["BatchFormat"] = drTemp["BatchFormat"]; // 0:非多批格式 1:多批格式 + + dtFormatFile.Rows.Add(drAdd); + } + } + else + { + funImpEQPTestDataRet = "機台編號: " + strEquipmentNo + " 未設定格式檔!"; + throw new Exception(funImpEQPTestDataRet); + } + drTemp.Close(); + //cmmTemp.Dispose(); + + var aryFormula = new ArrayList[dtFormatFile.Rows.Count + 1]; + + // 解析格式檔將strWaferIDPos, intColumnStart等值存入dtFormatFile中, 公式檔存入aryFormula(ItemNo)中 + foreach (DataRow dr in dtFormatFile.Rows) + { + + // 格式檔路徑: SourcePath & 格式檔名稱 + strFormatFile = Conversions.ToString(strSourcePath + dr["FFName"]); + // 參數Reset + strWaferIDPos = defString; + intTestDate = defInteger; + intEquipmentNo = defInteger; + intProgramNo = defInteger; + intColumnStart = defInteger; + strDataStartPos = defString; + intWaferSize = defInteger; + intThickNess = defInteger; + intD_ComponentNo = defInteger.ToString(); + intD_LotNo = defInteger.ToString(); + strLotNumber = defString; + strRecipe = defString; + strBinFileName = defString; + strOperator = defString; + strTotalScan = defString; + strTotalTested = defString; + strTestCondition = defString; + strCalData = defString; + + try + { + var scrFile = new FileInfo(strFormatFile); + fs = new FileStream(strFormatFile, FileMode.Open); + r = new StreamReader(fs, Encoding.Default); + + // 1.先讀取格式檔 + if (scrFile.Exists == false) + { + funImpEQPTestDataRet = "請確認機台格式檔案是否存在!!"; + throw new Exception(funImpEQPTestDataRet); + } + else + { + + aryFormula[Conversions.ToInteger(dr["ItemNo"])] = new ArrayList(); + + // 解析格式檔固定資料位置 + // 固定參數: WaferID, TestDate, EquipmentNo, ProgramNo, ColumnsStart, DataStart + // 動態參數: WaferSize, Thickness + // 多檔新增的動態參數: LotNumber, Recipe, BinFileName, Operator, TotalScan, + // TotalTested, Test Condition, CalData + while (r.Peek() > -1) + { + strTemp = r.ReadLine(); + strReadLine = Strings.Split(Strings.Trim(strTemp), "=>>"); + switch (strReadLine[0].ToUpper() ?? "") + { + // 固定參數 + case "WAFERID": + { + strWaferIDPos = strReadLine[1]; + dr["strWaferIDPos"] = strWaferIDPos; + break; + } + case "TESTDATE": + { + intTestDate = (int)Math.Round(Conversion.Val(strReadLine[1])); + dr["intTestDate"] = intTestDate; + break; + } + case "EQUIPMENTNO": + { + intEquipmentNo = (int)Math.Round(Conversion.Val(strReadLine[1])); + dr["intEquipmentNo"] = intEquipmentNo; + break; + } + case "PROGRAMNO": + { + intProgramNo = (int)Math.Round(Conversion.Val(strReadLine[1])); + dr["intProgramNo"] = intProgramNo; + break; + } + case "COLUMNSSTART": + { + intColumnStart = (int)Math.Round(Conversion.Val(strReadLine[1])); + dr["intColumnStart"] = intColumnStart; + break; + } + case "DATASTART": + { + strDataStartPos = strReadLine[1]; + dr["strDataStartPos"] = strDataStartPos; + break; + } + case "D_COMPONENTNO": + { + intD_ComponentNo = Conversion.Val(strReadLine[1]).ToString(); + dr["intD_ComponentNo"] = intD_ComponentNo; + break; + } + case "D_LOTNO": + { + intD_LotNo = Conversion.Val(strReadLine[1]).ToString(); + dr["intD_LotNo"] = intD_LotNo; + break; + } + // 動態參數 + case "WAFERSIZE": + { + intWaferSize = (int)Math.Round(Conversion.Val(strReadLine[1])); + dr["intWaferSize"] = intWaferSize; + break; + } + case "LOTNUMBER": + { + strLotNumber = Conversion.Val(strReadLine[1]).ToString(); + dr["LotNumber"] = strLotNumber; + break; + } + // 多檔新增的動態參數 + case "RECIPE": + { + strRecipe = Conversion.Val(strReadLine[1]).ToString(); + dr["Recipe"] = strRecipe; + break; + } + case "BINFILENAME": + { + strBinFileName = Conversion.Val(strReadLine[1]).ToString(); + dr["BinFileName"] = strBinFileName; + break; + } + case "OPERATOR": + { + strOperator = Conversion.Val(strReadLine[1]).ToString(); + dr["Operator"] = strOperator; + break; + } + case "TOTALSCAN": + { + strTotalScan = Conversion.Val(strReadLine[1]).ToString(); + dr["TotalScan"] = strTotalScan; + break; + } + case "TOTALTESTED": + { + strTotalTested = Conversion.Val(strReadLine[1]).ToString(); + dr["TotalTested"] = strTotalTested; + break; + } + case "TEST CONDITION": + { + strTestCondition = Conversion.Val(strReadLine[1]).ToString(); + dr["Test_Conditio"] = strTestCondition; + break; + } + case "CALDATA": + { + strCalData = Conversion.Val(strReadLine[1]).ToString(); + dr["CalData"] = strCalData; + break; + } + + default: + { + if (strReadLine[0].ToUpper().IndexOf("公式") == 0) + { + aryFormula[Conversions.ToInteger(dr["ItemNo"])].Add(strReadLine[1]); + // 91733: [SEMI_Wafer] AutoLoader 廠內設備電性值匯入,支援可不收集電性測試資料, 只收集 Raw Data + dr["intSummaryCollect"] = 1; + } + else if (!string.IsNullOrEmpty(strReadLine[0].ToUpper())) + { + if (strReadLine[0].ToUpper() != "D_COMPONENTNO") + { + drFormat = dtFormat_Postion.NewRow(); + drFormat["ColumnName"] = strReadLine[0].ToUpper(); + drFormat["ColumnPosition"] = Conversion.Val(strReadLine[1]); + drFormat["FileName"] = dr["FFName"]; + dtFormat_Postion.Rows.Add(drFormat); + } + } + + break; + } + } + } + } + } + catch (Exception ex) + { + funImpEQPTestDataRet = "格式檔解析失敗! " + strFormatFile + " Error Message :" + ex.Message.ToString(); + throw new Exception(funImpEQPTestDataRet); + } + finally + { + if (r != null) + r.Close(); + if (fs != null) + fs.Close(); + } + + if ((strWaferIDPos ?? "") == defString || intColumnStart == defInteger || (strDataStartPos ?? "") == defString) + { + funImpEQPTestDataRet = "請確認機台格式檔案設定是否正確(WaferID、ColumnsStart、DataStart)!!"; + throw new Exception(funImpEQPTestDataRet); + } + + if (intColumnStart == 0) + { + funImpEQPTestDataRet = "請確認機台格式檔案設定是否正確(ColumnsStart 不可為0)!!"; + throw new Exception(funImpEQPTestDataRet); + } + + if (!Information.IsNumeric(strWaferIDPos)) + { + // ex: -,2,3-9 表示以"-"分隔, 取第2個Part的第3到第9個字元 + string[] aryWaferID, aryChar; + aryWaferID = Strings.Split(strWaferIDPos, ","); + if (aryWaferID.Length != 3) + { + funImpEQPTestDataRet = "請確認機台格式檔案設定是否正確(WaferID)"; + throw new Exception(funImpEQPTestDataRet); + } + aryChar = aryWaferID[2].Split('-'); + if (aryChar.Length != 2) + { + funImpEQPTestDataRet = "請確認機台格式檔案設定是否正確(WaferID)"; + throw new Exception(funImpEQPTestDataRet); + } + if (!Information.IsNumeric(aryChar[0]) || !Information.IsNumeric(aryChar[0])) + { + funImpEQPTestDataRet = "請確認機台格式檔案設定是否正確(WaferID)"; + throw new Exception(funImpEQPTestDataRet); + } + if (Operators.CompareString(aryChar[0], aryChar[1], false) > 0) + { + funImpEQPTestDataRet = "請確認機台格式檔案設定是否正確(WaferID)"; + throw new Exception(funImpEQPTestDataRet); + } + } + + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dr["StoreRawData"], 1, false))) + { + // 格式檔路徑: SourcePath & 格式檔名稱 + strRawFormatFile = Conversions.ToString(strSourcePath + dr["RawFFName"]); + + try + { + var scrFile = new FileInfo(strRawFormatFile); + fs = new FileStream(strRawFormatFile, FileMode.Open); + r = new StreamReader(fs, Encoding.Default); + + // 1.先讀取原始數據格式檔 + if (scrFile.Exists == false) + { + funImpEQPTestDataRet = "請確認機台原始數據格式檔案是否存在!!"; + throw new Exception(funImpEQPTestDataRet); + } + else + { + // 解析RawData格式檔 + // 測試項目TestRecipeNo==>位置 + while (r.Peek() > -1) + { + strTemp = r.ReadLine(); + strReadLine = Strings.Split(Strings.Trim(strTemp), "=>>"); + if (!string.IsNullOrEmpty(strReadLine[0].ToUpper())) + { + drFormat = dtRawScript.NewRow(); + drFormat["TestRecipeNo"] = strReadLine[0].ToUpper(); + drFormat["ColPosition"] = Conversion.Val(strReadLine[1]); + drFormat["FileNameFormat"] = dr["FileNameFormat"]; // 用以對應是咬到哪個FileNameFormat + dtRawScript.Rows.Add(drFormat); + } + } + } + } + catch (Exception ex) + { + funImpEQPTestDataRet = "原始數據格式檔解析失敗! " + strRawFormatFile + " Error Message :" + ex.Message.ToString(); + throw new Exception(funImpEQPTestDataRet); + } + finally + { + if (r != null) + r.Close(); + if (fs != null) + fs.Close(); + } + } + } // Next of For Each dr As DataRow In dtFormatFile.Rows + + // //目錄不存在時必須要先建立 + if (Directory.Exists(strQueuePath) == false) + { + Directory.CreateDirectory(strQueuePath); + } + + object aryFile = Directory.GetFiles(strSourcePath); + + DataTable dtFName; + string strTmpFName; + + dtFName = new DataTable("FName"); + dtFName.Columns.Add("FName", Type.GetType("System.String")); // FileName去除副檔名 + + dvFormatFile = dtFormatFile.DefaultView; + + Array.Sort((Array)aryFile); + + // 2.迴圈Raw Data資料讀取 + // 2021/5/13 Steven 應先找分包處理尚未處理完的檔案 + // 時間小的先做 + bool blnNeedProcessing = false; + int intStartRow = defInteger; + strSQL = "Select FileName,FilePath,ImportedRows From TBLMESAUTOLOADERFILESTATE where ServerName = '" + Environment.MachineName + "'And ServiceName = 'AutoLoaderLib'" + " And JobNo = '" + strJobNo + "' order by StartTime"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + // 如有找到資料,代表未處理完 + var FormatFile = default(string); + while (drTemp.Read()) + { + try + { + intStartRow = Conversions.ToInteger(Operators.AddObject(drTemp["ImportedRows"], 1)); // 從上次完成的筆數+1開始寫入DB + string fn = Conversions.ToString(drTemp["FilePath"]); + var fi = new FileInfo(fn); + if (File.Exists(fn) == true && dtFormatFile.Select("FFName = '" + fi.Name + "'").Length == 0 && dtFormatFile.Select("RawFFName = '" + fi.Name + "'").Length == 0) // 此檔案存在且不為格式檔(格式檔名會存在dtFormatFile.FFName中) + { + + FileName = fn; + + // 依檔名找到符合的格式檔 + // 符合以長度大的優先 + blnFound = false; + strExtName = Strings.Right(fi.Name, fi.Name.Length - fi.Name.LastIndexOf(".")); // 副檔名 + strTmpFName = Strings.Mid(fi.Name, 1, fi.Name.Length - strExtName.Length); // 去除副檔名的檔名 + + dtFName.Clear(); + drAdd = dtFName.NewRow(); + drAdd["FName"] = strTmpFName; + dtFName.Rows.Add(drAdd); + + // 副檔名需與格式檔副檔名相符 + dvFormatFile.RowFilter = "ExtName = '" + strExtName + "'"; + dvFormatFile.Sort = "FFLength Desc"; + for (int i = 0, loopTo = dvFormatFile.Count - 1; i <= loopTo; i++) + { + if (dtFName.Select(Conversions.ToString("FName Like '" + dvFormatFile[i]["FName"] + "'")).Length > 0) + { + blnFound = true; + FormatFile = Conversions.ToString(dvFormatFile[i]["FileNameFormat"]); + string strFormat = Conversions.ToString(dvFormatFile[i]["FFName"]); + if (!(dtFormat_Postion == null)) + { + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectGreater(dtFormat_Postion.Rows.Count, 0, false))) + { + var loopTo1 = Conversions.ToInteger(Operators.SubtractObject(dtFormat_Postion.Rows.Count, 1)); + for (h = 0; h <= loopTo1; h++) + { + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtFormat_Postion.Rows[h]["FileName"], strFormat, false))) + { + dtFormat_Postion.Rows[h]["AssignFile"] = 1; + } + else + { + dtFormat_Postion.Rows[h]["AssignFile"] = 0; + } + } + } + } + } + + if (blnFound == true) + { + intItemNo = Conversions.ToInteger(dvFormatFile[i]["ItemNo"]); + strWaferIDPos = Conversions.ToString(Interaction.IIf(dvFormatFile[i]["strWaferIDPos"] is DBNull, defString, dvFormatFile[i]["strWaferIDPos"])); + intTestDate = Conversions.ToInteger(Interaction.IIf(dvFormatFile[i]["intTestDate"] is DBNull, defInteger, dvFormatFile[i]["intTestDate"])); + intEquipmentNo = Conversions.ToInteger(Interaction.IIf(dvFormatFile[i]["intEquipmentNo"] is DBNull, defInteger, dvFormatFile[i]["intEquipmentNo"])); + intWaferSize = Conversions.ToInteger(Interaction.IIf(dvFormatFile[i]["intWaferSize"] is DBNull, defInteger, dvFormatFile[i]["intWaferSize"])); + intThickNess = Conversions.ToInteger(Interaction.IIf(dvFormatFile[i]["intThickNess"] is DBNull, defInteger, dvFormatFile[i]["intThickNess"])); + intProgramNo = Conversions.ToInteger(Interaction.IIf(dvFormatFile[i]["intProgramNo"] is DBNull, defInteger, dvFormatFile[i]["intProgramNo"])); + intColumnStart = Conversions.ToInteger(Interaction.IIf(dvFormatFile[i]["intColumnStart"] is DBNull, defInteger, dvFormatFile[i]["intColumnStart"])); + strDataStartPos = Conversions.ToString(Interaction.IIf(dvFormatFile[i]["strDataStartPos"] is DBNull, defInteger, dvFormatFile[i]["strDataStartPos"])); + intD_ComponentNo = Conversions.ToString(Interaction.IIf(dvFormatFile[i]["intD_ComponentNo"] is DBNull, defInteger, dvFormatFile[i]["intD_ComponentNo"])); + intD_LotNo = Conversions.ToString(Interaction.IIf(dvFormatFile[i]["intD_LotNo"] is DBNull, defInteger, dvFormatFile[i]["intD_LotNo"])); + strLotNumber = Conversions.ToString(Interaction.IIf(dvFormatFile[i]["LotNumber"] is DBNull, defInteger, dvFormatFile[i]["LotNumber"])); + strRecipe = Conversions.ToString(Interaction.IIf(dvFormatFile[i]["Recipe"] is DBNull, defInteger, dvFormatFile[i]["Recipe"])); + strBinFileName = Conversions.ToString(Interaction.IIf(dvFormatFile[i]["BinFileName"] is DBNull, defInteger, dvFormatFile[i]["BinFileName"])); + strOperator = Conversions.ToString(Interaction.IIf(dvFormatFile[i]["Operator"] is DBNull, defInteger, dvFormatFile[i]["Operator"])); + strTotalScan = Conversions.ToString(Interaction.IIf(dvFormatFile[i]["TotalScan"] is DBNull, defInteger, dvFormatFile[i]["TotalScan"])); + strTotalTested = Conversions.ToString(Interaction.IIf(dvFormatFile[i]["TotalTested"] is DBNull, defInteger, dvFormatFile[i]["TotalTested"])); + strTestCondition = Conversions.ToString(Interaction.IIf(dvFormatFile[i]["Test_Condition"] is DBNull, defInteger, dvFormatFile[i]["Test_Condition"])); + strCalData = Conversions.ToString(Interaction.IIf(dvFormatFile[i]["CalData"] is DBNull, defInteger, dvFormatFile[i]["CalData"])); + strMatchFFName = Conversions.ToString(dvFormatFile[i]["FileNameFormat"]); + + + // 表頭分隔字元, 沒設定預設為":" + if (dvFormatFile[i]["MSplitSign"] is DBNull) + { + strMSplitSign = ":"; + } + else + { + strMSplitSign = dvFormatFile[i]["MSplitSign"].ToString(); + if (strMSplitSign.ToUpper() == "TAB") + { + strMSplitSign = Constants.vbTab; + } + } + + // 明細分隔字元, 沒設定預設為"," + if (dvFormatFile[i]["DSplitSign"] is DBNull) + { + strDSplitSign = ","; + } + else + { + strDSplitSign = dvFormatFile[i]["DSplitSign"].ToString(); + if (strDSplitSign.ToUpper() == "TAB") + { + strDSplitSign = Constants.vbTab; + } + } + + if (dvFormatFile[i]["MultiWafer"].ToString() == "1") + { + blnMultiWafer = true; + } + else + { + blnMultiWafer = false; + + if (dvFormatFile[i]["MultiWafer"].ToString() == Conversions.ToString(-1)) + { + blnSingleLot = true; + } + else + { + blnSingleLot = false; + } + } + + if (dvFormatFile[i]["StoreRawData"].ToString() == "1") + { + blnStoreRawData = true; + } + else + { + blnStoreRawData = false; + } + + if (dvFormatFile[i]["BatchFormat"].ToString() == "1") + { + blnBatchFormat = true; + } + else + { + blnBatchFormat = false; + } + + // 91733: [SEMI_Wafer] AutoLoader 廠內設備電性值匯入,支援可不收集電性測試資料, 只收集 Raw Data + if (dvFormatFile[i]["intSummaryCollect"].ToString() == "1") + { + blnSummaryCollect = true; + } + else + { + blnSummaryCollect = false; + } + + break; + } + } + + if (blnFound == false) + { + funImpEQPTestDataRet = "檔案: " + fi.Name + " 找不到符合檔名的格式檔!"; + throw new Exception(funImpEQPTestDataRet); + } + + // //移動檔案Source至Queue + try + { + blnMoveFile = true; + File.Move(fn, strQueuePath + Path.GetFileName(fn)); + } + catch (Exception ex) + { + blnMoveFile = false; + funImpEQPTestDataRet = ex.Message; + throw new Exception(funImpEQPTestDataRet); + // Throw New System.Exception("此執行程序已中止,由另一執行程序處理中!!") + } + // 新增寫入四個固定欄位1.STORERAWDATA 2.RAWDATARECORD 3.RawDataTableName 4.FileSize + int intStoreRawData = 0; + if (blnStoreRawData) + intStoreRawData = 1; + + if (blnBatchFormat == true) // 多批格式 + { + try + { + // //將檔案來源改為Queue + FileName = strQueuePath + Path.GetFileName(fn); + + // 解析檔案存入tblWIPEQP_EDC_TestRecipeType + if (fuBatchFormatToEQPEDC(strTestRecipeType, FileName, strMSplitSign, strDSplitSign, strEquipmentNo, Conversions.ToInteger(intD_LotNo), intColumnStart, strDataStartPos, fi.Name.ToString(), lngSplitRecordsLimit) == false) + { + throw new Exception(); + } + } + + catch (Exception ex) + { + funImpEQPTestDataRet = "依格式檔案定義解析資料存入EQPEDC資料表失敗: " + ex.Message; + throw new Exception(funImpEQPTestDataRet); + } + } + + else if (blnMultiWafer) // Excel格式的讀檔 + { + try + { + // //將檔案來源改為Queue + FileName = strQueuePath + Path.GetFileName(fn); + // 91733: [SEMI_Wafer] AutoLoader 廠內設備電性值匯入,支援可不收集電性測試資料, 只收集 Raw Data + if (blnSummaryCollect) + { + // 解析Excel檔案, 將資料存入MES TestSummary + // 目前僅支援只有單身的, 故不需傳入DataStart與ColumnStart + // If fuExcelDataToTestSum_EQP(FileName, strTestRecipeType, aryFormula(intItemNo), strEquipmentNo, intD_ComponentNo, fi.Name.ToString) = False Then + // Throw New System.Exception + // End If + if (strExtName.ToUpper() != ".CSV" && strExtName.ToUpper() != ".TXT") + { + if (fuExcelDataToTestSum_EQP(FileName, strTestRecipeType, aryFormula[intItemNo], strEquipmentNo, Conversions.ToInteger(intD_ComponentNo), fi.Name.ToString(), (int)Microsoft.VisualBasic.FileSystem.FileLen(FileName)) == false) + { + throw new Exception(); + } + } + else + { + // 91737: 加入表頭解析 + string FileNameTmp = fi.Name.ToString(); + FileInfo fInfo = new FileInfo(FileName); + if (fuExcelDataToTestSumWithTitle_EQP(FileName, strMSplitSign, + strDSplitSign, intTestDate, intEquipmentNo, intProgramNo, intColumnStart, + Convert.ToInt32(strDataStartPos), strTestRecipeType, aryFormula[intItemNo], strEquipmentNo, + Convert.ToInt32(intD_ComponentNo), Convert.ToInt32(strLotNumber), Convert.ToInt32(strRecipe), + Convert.ToInt32(strBinFileName), Convert.ToInt32(strOperator), + Convert.ToInt32(strTotalScan), Convert.ToInt32(strTotalTested), + Convert.ToInt32(strTestCondition), Convert.ToInt32(strCalData), FileNameTmp, + ref dtRawData, dtFormat_Postion, (int)fInfo.Length) == false) + { + throw new System.Exception(); + } + } + } + } + + catch (Exception ex) + { + funImpEQPTestDataRet = "格式檔案解析Excel存入MES TestSummary 資料表失敗: " + ex.Message; + throw new Exception(funImpEQPTestDataRet); + } + } + + else + { + + // //將檔案來源改為Queue + FileName = strQueuePath + Path.GetFileName(fn); + int TotalRows = 0; // 記錄總比數 + try + { + + if (Microsoft.VisualBasic.FileSystem.FileLen(FileName) <= lngSplitFileSize) + { + // 2.1解析Raw Data 存入TempTable做資料備查 + string FilenameTmp = fi.Name.ToString(); + if (fuRawDataToTempTable_EQP(FileName, strMSplitSign, strDSplitSign, strWaferIDPos, + intTestDate, intEquipmentNo, intWaferSize, intThickNess, intProgramNo, + intColumnStart, strDataStartPos, ref aryWaferInfo, strEquipmentNo, FilenameTmp, + ref strTmpTableName, blnStoreRawData, ref dtRawData, ref TotalRows, dtFormat_Postion, FormatFile) == false) + { + throw new System.Exception(); + } + } + else + { + string FilenameTmp = fi.Name.ToString(); + FileInfo fInfo = new FileInfo(FileName); + if (fuRawDataToTempTable_EQP_BigFile(FileName, strMSplitSign, strDSplitSign, + strWaferIDPos, intTestDate, intEquipmentNo, intWaferSize, intThickNess, + intProgramNo, intColumnStart, strDataStartPos, ref aryWaferInfo, strEquipmentNo, + FilenameTmp, lngSplitRecordsLimit, ref strTmpTableName, blnStoreRawData, + ref dtRawData, strJobNo, strJobFunction, FileName, (int)fInfo.Length, + ref blnSplitPartialSuccess, ref TotalRows, dtFormat_Postion, intStartRow, FormatFile) == false) + { + throw new System.Exception(); + } + } + } + + catch (Exception ex) + { + funImpEQPTestDataRet = "解析Raw Data 存入TempTable做資料備查失敗: " + ex.Message; + if (blnSplitPartialSuccess) + { + blnNotMoveToFail = true; + } + else if (blnSplitPartialSuccess == false && intStartRow != defInteger) // 當續處理檔案,第一次就錯時,也不該移動檔案 + { + blnNotMoveToFail = true; + } + throw new Exception(funImpEQPTestDataRet); + } + + // 91733: [SEMI_Wafer] AutoLoader 廠內設備電性值匯入,支援可不收集電性測試資料, 只收集 Raw Data + if (blnSummaryCollect) + { + try + { + // 2.2依照格式檔案定義計算存入MES TestSummary 資料表 + string FileNameTmp = fi.Name.ToString(); + FileInfo fInfo = new FileInfo(FileName); + if (fuLEDDataSummary_EQP(strTestRecipeType, aryFormula[intItemNo], + aryWaferInfo, strEquipmentNo, FileNameTmp, strTmpTableName, + blnStoreRawData, dtFormat_Postion, (int)fInfo.Length, TotalRows, blnSingleLot) == false) + { + throw new System.Exception(); + } + } + catch (Exception ex) + { + funImpEQPTestDataRet = "格式檔案定義計算存入MES TestSummary 資料表失敗: " + ex.Message; + throw new Exception(funImpEQPTestDataRet); + } + } + + // 要儲存原始數據 + if (blnStoreRawData) + { + try + { + // 儲存RawData + if (fuStoreRawData_EQP(strTestRecipeType, aryWaferInfo, strEquipmentNo, fi.Name.ToString(), strMatchFFName, ref dtRawScript, strTmpTableName, ref dtRawData, blnSingleLot) == false) + { + throw new Exception(); + } + } + catch (Exception ex) + { + funImpEQPTestDataRet = "依格式檔定義存入原始數據失敗: " + ex.Message; + throw new Exception(funImpEQPTestDataRet); + } + } + + } // End If of If blnMultiWafer + + // //目錄不存在時必須要先建立 + if (Directory.Exists(strDestinationPath + DirName) == false) + { + Directory.CreateDirectory(strDestinationPath + DirName); + } + // //檔案已存在Destination必須先刪除 + if (File.Exists(strDestinationPath + DirName + @"\" + Path.GetFileName(FileName)) == true) + { + File.Delete(strDestinationPath + DirName + @"\" + Path.GetFileName(FileName)); + } + // //移動檔案Queue至Destination + File.Move(FileName, strDestinationPath + DirName + @"\" + Path.GetFileName(FileName)); + + FileName = ""; + } + } + + catch (Exception ex) + { + // //檔案處理失敗時移動檔案至Fail + if (!string.IsNullOrEmpty(FileName)) + { + // //目錄不存在時必須要先建立 + if (Directory.Exists(strFailPath + DirName) == false) + { + Directory.CreateDirectory(strFailPath + DirName); + } + // //檔案已存在File必須先刪除 + if (File.Exists(strFailPath + DirName + @"\" + Path.GetFileName(FileName)) == true) + { + File.Delete(strFailPath + DirName + @"\" + Path.GetFileName(FileName)); + } + // //移動檔案至Fail + try + { + // 2021/5/12 Steven 當有分包成功寫入DB的檔案,不需移動至fail + if (blnNotMoveToFail == false) + File.Move(FileName, strFailPath + DirName + @"\" + Path.GetFileName(FileName)); + blnNotMoveToFail = false; + } + catch (Exception ex1) + { + } + + + // 記錄錯誤的FileName + strFailLog = strFailLog + "[" + Path.GetFileName(FileName) + "][" + ex.Message + "]" + Constants.vbCrLf; + + FileName = ""; + } + } + } + drTemp.Close(); + //cmmTemp.Dispose(); + + var FormatFile1 = default(string); + foreach (string fn in (IEnumerable)aryFile) // fn為FileName + { + try + { + var fi = new FileInfo(fn); + if (File.Exists(fn) == true && dtFormatFile.Select("FFName = '" + fi.Name + "'").Length == 0 && dtFormatFile.Select("RawFFName = '" + fi.Name + "'").Length == 0) // 此檔案存在且不為格式檔(格式檔名會存在dtFormatFile.FFName中) + { + FileName = fn; + + // 依檔名找到符合的格式檔 + // 符合以長度大的優先 + blnFound = false; + strExtName = Strings.Right(fi.Name, fi.Name.Length - fi.Name.LastIndexOf(".")); // 副檔名 + strTmpFName = Strings.Mid(fi.Name, 1, fi.Name.Length - strExtName.Length); // 去除副檔名的檔名 + + dtFName.Clear(); + drAdd = dtFName.NewRow(); + drAdd["FName"] = strTmpFName; + dtFName.Rows.Add(drAdd); + + // 副檔名需與格式檔副檔名相符 + dvFormatFile.RowFilter = "ExtName = '" + strExtName + "'"; + dvFormatFile.Sort = "FFLength Desc"; + for (int i = 0, loopTo2 = dvFormatFile.Count - 1; i <= loopTo2; i++) + { + if (dtFName.Select(Conversions.ToString("FName Like '" + dvFormatFile[i]["FName"] + "'")).Length > 0) + { + blnFound = true; + string strFormat = Conversions.ToString(dvFormatFile[i]["FFName"]); + FormatFile = Conversions.ToString(dvFormatFile[i]["FileNameFormat"]); + if (!(dtFormat_Postion == null)) + { + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectGreater(dtFormat_Postion.Rows.Count, 0, false))) + { + var loopTo3 = Conversions.ToInteger(Operators.SubtractObject(dtFormat_Postion.Rows.Count, 1)); + for (h = 0; h <= loopTo3; h++) + { + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtFormat_Postion.Rows[h]["FileName"], strFormat, false))) + { + dtFormat_Postion.Rows[h]["AssignFile"] = 1; + } + else + { + dtFormat_Postion.Rows[h]["AssignFile"] = 0; + } + } + } + } + } + + if (blnFound == true) + { + intItemNo = Conversions.ToInteger(dvFormatFile[i]["ItemNo"]); + strWaferIDPos = Conversions.ToString(Interaction.IIf(dvFormatFile[i]["strWaferIDPos"] is DBNull, defString, dvFormatFile[i]["strWaferIDPos"])); + intTestDate = Conversions.ToInteger(Interaction.IIf(dvFormatFile[i]["intTestDate"] is DBNull, defInteger, dvFormatFile[i]["intTestDate"])); + intEquipmentNo = Conversions.ToInteger(Interaction.IIf(dvFormatFile[i]["intEquipmentNo"] is DBNull, defInteger, dvFormatFile[i]["intEquipmentNo"])); + intWaferSize = Conversions.ToInteger(Interaction.IIf(dvFormatFile[i]["intWaferSize"] is DBNull, defInteger, dvFormatFile[i]["intWaferSize"])); + intThickNess = Conversions.ToInteger(Interaction.IIf(dvFormatFile[i]["intThickNess"] is DBNull, defInteger, dvFormatFile[i]["intThickNess"])); + intProgramNo = Conversions.ToInteger(Interaction.IIf(dvFormatFile[i]["intProgramNo"] is DBNull, defInteger, dvFormatFile[i]["intProgramNo"])); + intColumnStart = Conversions.ToInteger(Interaction.IIf(dvFormatFile[i]["intColumnStart"] is DBNull, defInteger, dvFormatFile[i]["intColumnStart"])); + strDataStartPos = Conversions.ToString(Interaction.IIf(dvFormatFile[i]["strDataStartPos"] is DBNull, defInteger, dvFormatFile[i]["strDataStartPos"])); + intD_ComponentNo = Conversions.ToString(Interaction.IIf(dvFormatFile[i]["intD_ComponentNo"] is DBNull, defInteger, dvFormatFile[i]["intD_ComponentNo"])); + intD_LotNo = Conversions.ToString(Interaction.IIf(dvFormatFile[i]["intD_LotNo"] is DBNull, defInteger, dvFormatFile[i]["intD_LotNo"])); + strLotNumber = Conversions.ToString(Interaction.IIf(dvFormatFile[i]["LotNumber"] is DBNull, defInteger, dvFormatFile[i]["LotNumber"])); + strRecipe = Conversions.ToString(Interaction.IIf(dvFormatFile[i]["Recipe"] is DBNull, defInteger, dvFormatFile[i]["Recipe"])); + strBinFileName = Conversions.ToString(Interaction.IIf(dvFormatFile[i]["BinFileName"] is DBNull, defInteger, dvFormatFile[i]["BinFileName"])); + strOperator = Conversions.ToString(Interaction.IIf(dvFormatFile[i]["Operator"] is DBNull, defInteger, dvFormatFile[i]["Operator"])); + strTotalScan = Conversions.ToString(Interaction.IIf(dvFormatFile[i]["TotalScan"] is DBNull, defInteger, dvFormatFile[i]["TotalScan"])); + strTotalTested = Conversions.ToString(Interaction.IIf(dvFormatFile[i]["TotalTested"] is DBNull, defInteger, dvFormatFile[i]["TotalTested"])); + strTestCondition = Conversions.ToString(Interaction.IIf(dvFormatFile[i]["Test_Condition"] is DBNull, defInteger, dvFormatFile[i]["Test_Condition"])); + strCalData = Conversions.ToString(Interaction.IIf(dvFormatFile[i]["CalData"] is DBNull, defInteger, dvFormatFile[i]["CalData"])); + strMatchFFName = Conversions.ToString(dvFormatFile[i]["FileNameFormat"]); + + + // 表頭分隔字元, 沒設定預設為":" + if (dvFormatFile[i]["MSplitSign"] is DBNull) + { + strMSplitSign = ":"; + } + else + { + strMSplitSign = dvFormatFile[i]["MSplitSign"].ToString(); + if (strMSplitSign.ToUpper() == "TAB") + { + strMSplitSign = Constants.vbTab; + } + } + + // 明細分隔字元, 沒設定預設為"," + if (dvFormatFile[i]["DSplitSign"] is DBNull) + { + strDSplitSign = ","; + } + else + { + strDSplitSign = dvFormatFile[i]["DSplitSign"].ToString(); + if (strDSplitSign.ToUpper() == "TAB") + { + strDSplitSign = Constants.vbTab; + } + } + + if (dvFormatFile[i]["MultiWafer"].ToString() == "1") + { + blnMultiWafer = true; + } + else + { + blnMultiWafer = false; + + if (dvFormatFile[i]["MultiWafer"].ToString() == Conversions.ToString(-1)) + { + blnSingleLot = true; + } + else + { + blnSingleLot = false; + } + } + + if (dvFormatFile[i]["StoreRawData"].ToString() == "1") + { + blnStoreRawData = true; + } + else + { + blnStoreRawData = false; + } + + if (dvFormatFile[i]["BatchFormat"].ToString() == "1") + { + blnBatchFormat = true; + } + else + { + blnBatchFormat = false; + } + + // 91733: [SEMI_Wafer] AutoLoader 廠內設備電性值匯入,支援可不收集電性測試資料, 只收集 Raw Data + if (dvFormatFile[i]["intSummaryCollect"].ToString() == "1") + { + blnSummaryCollect = true; + } + else + { + blnSummaryCollect = false; + } + + break; + } + } + + if (blnFound == false) + { + funImpEQPTestDataRet = "檔案: " + fi.Name + " 找不到符合檔名的格式檔!"; + throw new Exception(funImpEQPTestDataRet); + } + + // //移動檔案Source至Queue + try + { + blnMoveFile = true; + File.Move(fn, strQueuePath + Path.GetFileName(fn)); + } + catch (Exception ex) + { + blnMoveFile = false; + funImpEQPTestDataRet = ex.Message; + throw new Exception(funImpEQPTestDataRet); + // Throw New System.Exception("此執行程序已中止,由另一執行程序處理中!!") + } + + if (blnBatchFormat == true) // 多批格式 + { + try + { + // //將檔案來源改為Queue + FileName = strQueuePath + Path.GetFileName(fn); + + // 解析檔案存入tblWIPEQP_EDC_TestRecipeType + if (fuBatchFormatToEQPEDC(strTestRecipeType, FileName, strMSplitSign, strDSplitSign, strEquipmentNo, Conversions.ToInteger(intD_LotNo), intColumnStart, strDataStartPos, fi.Name.ToString(), lngSplitRecordsLimit) == false) + { + throw new Exception(); + } + } + + catch (Exception ex) + { + funImpEQPTestDataRet = "依格式檔案定義解析資料存入EQPEDC資料表失敗: " + ex.Message; + throw new Exception(funImpEQPTestDataRet); + } + } + + else if (blnMultiWafer) // Excel格式的讀檔 + { + try + { + // //將檔案來源改為Queue + FileName = strQueuePath + Path.GetFileName(fn); + // 91733: [SEMI_Wafer] AutoLoader 廠內設備電性值匯入,支援可不收集電性測試資料, 只收集 Raw Data + if (blnSummaryCollect) + { + // 解析Excel檔案, 將資料存入MES TestSummary + // 目前僅支援只有單身的, 故不需傳入DataStart與ColumnStart + // If fuExcelDataToTestSum_EQP(FileName, strTestRecipeType, aryFormula(intItemNo), strEquipmentNo, intD_ComponentNo, fi.Name.ToString) = False Then + // Throw New System.Exception + // End If + if (strExtName.ToUpper() != ".CSV" && strExtName.ToUpper() != ".TXT") + { + if (fuExcelDataToTestSum_EQP(FileName, strTestRecipeType, aryFormula[intItemNo], strEquipmentNo, Conversions.ToInteger(intD_ComponentNo), fi.Name.ToString(), (int)Microsoft.VisualBasic.FileSystem.FileLen(FileName)) == false) + { + throw new Exception(); + } + } + else + { + // 91737: 加入表頭解析 + string FileNameTmp = fi.Name.ToString(); + if (fuExcelDataToTestSumWithTitle_EQP(FileName, strMSplitSign, + strDSplitSign, intTestDate, intEquipmentNo, intProgramNo, + intColumnStart, Convert.ToInt32(strDataStartPos), strTestRecipeType, aryFormula[intItemNo], + strEquipmentNo, Convert.ToInt32(intD_ComponentNo), + Convert.ToInt32(strLotNumber), Convert.ToInt32(strRecipe), + Convert.ToInt32(strBinFileName), Convert.ToInt32(strOperator), + Convert.ToInt32(strTotalScan), Convert.ToInt32(strTotalTested), + Convert.ToInt32(strTestCondition), Convert.ToInt32(strCalData), + FileNameTmp, ref dtRawData, dtFormat_Postion) == false) + { + throw new System.Exception(); + } + } + } + } + + catch (Exception ex) + { + funImpEQPTestDataRet = "格式檔案解析Excel存入MES TestSummary 資料表失敗: " + ex.Message; + throw new Exception(funImpEQPTestDataRet); + } + } + + else + { + + // //將檔案來源改為Queue + FileName = strQueuePath + Path.GetFileName(fn); + int TotalRows = 0; // 記錄總比數 + try + { + + // 測試--------- + // If fuStoreRawData_EQP(strTestRecipeType, aryWaferInfo, strEquipmentNo, fi.Name.ToString, strMatchFFName, dtRawScript, strTmpTableName, dtRawData) = False Then + // Throw New System.Exception + // End If + + if (Microsoft.VisualBasic.FileSystem.FileLen(FileName) <= lngSplitFileSize) + { + // 2.1解析Raw Data 存入TempTable做資料備查 + string fileNameTmp = fi.Name.ToString(); + if (fuRawDataToTempTable_EQP(FileName, strMSplitSign, strDSplitSign, + strWaferIDPos, intTestDate, intEquipmentNo, intWaferSize, intThickNess, + intProgramNo, intColumnStart, strDataStartPos, ref aryWaferInfo, + strEquipmentNo, fileNameTmp, ref strTmpTableName, blnStoreRawData, + ref dtRawData, ref TotalRows, dtFormat_Postion, FormatFile) == false) + { + throw new System.Exception(); + } + } + else + { + string fileNameTmp = fi.Name.ToString(); + FileInfo fInfo = new FileInfo(FileName); + if (fuRawDataToTempTable_EQP_BigFile(FileName, strMSplitSign, strDSplitSign, + strWaferIDPos, intTestDate, intEquipmentNo, intWaferSize, intThickNess, + intProgramNo, intColumnStart, strDataStartPos, ref aryWaferInfo, + strEquipmentNo, fileNameTmp, lngSplitRecordsLimit, ref strTmpTableName, + blnStoreRawData, ref dtRawData, strJobNo, strJobFunction, FileName, + (int)fInfo.Length, ref blnSplitPartialSuccess, ref TotalRows, dtFormat_Postion, + FormatFile: FormatFile1) == false) + { + throw new System.Exception(); + } + } + } + + catch (Exception ex) + { + funImpEQPTestDataRet = "解析Raw Data 存入TempTable做資料備查失敗: " + ex.Message; + if (blnSplitPartialSuccess) + { + blnNotMoveToFail = true; + } + throw new Exception(funImpEQPTestDataRet); + } + + // 91733: [SEMI_Wafer] AutoLoader 廠內設備電性值匯入,支援可不收集電性測試資料, 只收集 Raw Data + if (blnSummaryCollect) + { + try + { + // 2.2依照格式檔案定義計算存入MES TestSummary 資料表 + string FileNameTmp = fi.Name.ToString(); + FileInfo fInfo = new FileInfo(FileName); + if (fuLEDDataSummary_EQP(strTestRecipeType, aryFormula[intItemNo], + aryWaferInfo, strEquipmentNo, FileNameTmp, strTmpTableName, + blnStoreRawData, dtFormat_Postion, (int)fInfo.Length, TotalRows, blnSingleLot) == false) + { + throw new System.Exception(); + } + } + catch (Exception ex) + { + funImpEQPTestDataRet = "格式檔案定義計算存入MES TestSummary 資料表失敗: " + ex.Message; + throw new Exception(funImpEQPTestDataRet); + } + } + + // 要儲存原始數據 + if (blnStoreRawData) + { + try + { + // 儲存RawData + if (fuStoreRawData_EQP(strTestRecipeType, aryWaferInfo, strEquipmentNo, fi.Name.ToString(), strMatchFFName, ref dtRawScript, strTmpTableName, ref dtRawData, blnSingleLot) == false) + { + throw new Exception(); + } + } + catch (Exception ex) + { + funImpEQPTestDataRet = "依格式檔定義存入原始數據失敗: " + ex.Message; + throw new Exception(funImpEQPTestDataRet); + } + } + + } // End If of If blnMultiWafer + + // //目錄不存在時必須要先建立 + if (Directory.Exists(strDestinationPath + DirName) == false) + { + Directory.CreateDirectory(strDestinationPath + DirName); + } + // //檔案已存在Destination必須先刪除 + if (File.Exists(strDestinationPath + DirName + @"\" + Path.GetFileName(FileName)) == true) + { + File.Delete(strDestinationPath + DirName + @"\" + Path.GetFileName(FileName)); + } + // //移動檔案Queue至Destination + File.Move(FileName, strDestinationPath + DirName + @"\" + Path.GetFileName(FileName)); + + FileName = ""; + } + } + + catch (Exception ex) + { + // //檔案處理失敗時移動檔案至Fail + if (!string.IsNullOrEmpty(FileName)) + { + // //目錄不存在時必須要先建立 + if (Directory.Exists(strFailPath + DirName) == false) + { + Directory.CreateDirectory(strFailPath + DirName); + } + // //檔案已存在File必須先刪除 + if (File.Exists(strFailPath + DirName + @"\" + Path.GetFileName(FileName)) == true) + { + File.Delete(strFailPath + DirName + @"\" + Path.GetFileName(FileName)); + } + // //移動檔案至Fail + try + { + // 2021/5/12 Steven 當有分包成功寫入DB的檔案,不需移動至fail + if (blnNotMoveToFail == false) + File.Move(FileName, strFailPath + DirName + @"\" + Path.GetFileName(FileName)); + blnNotMoveToFail = false; + } + catch (Exception ex1) + { + } + + + // 記錄錯誤的FileName + strFailLog = strFailLog + "[" + Path.GetFileName(FileName) + "][" + ex.Message + "]" + Constants.vbCrLf; + + FileName = ""; + } + + // 一個檔案失敗繼續讀取下個檔案 + continue; + + } + + } // Next of For Each fn As String In aryFile + + funImpEQPTestDataRet = "success"; + } + + catch (Exception e1) + { + + strFailLog = strFailLog + "[" + e1.Message + "]" + Constants.vbCrLf; + } + + // 2019/8/12,Ning, 已改在上面的Loop中處理檔案移動至Fail目錄 + // //檔案處理失敗時移動檔案Queue至Fail + // If FileName <> String.Empty AndAlso blnMoveFile = True Then + // '//目錄不存在時必須要先建立 + // If My.Computer.FileSystem.DirectoryExists(strFailPath & DirName) = False Then + // My.Computer.FileSystem.CreateDirectory(strFailPath & DirName) + // End If + // '//檔案已存在File必須先刪除 + // If File.Exists(strFailPath & DirName & "\" & Path.GetFileName(FileName)) = True Then + // File.Delete(strFailPath & DirName & "\" & Path.GetFileName(FileName)) + // End If + // '//移動檔案Queue至Fail + // Try + // File.Move(FileName, strFailPath & DirName & "\" & Path.GetFileName(FileName)) + // Catch ex1 As Exception + // End Try + // End If + // //回傳錯誤原因 + // funImpEQPTestData = "[JobNo:" & strJobNo & "][FunctionNo:funImpEQPTestData][FileName:" & Path.GetFileName(FileName) & "][" & e1.Message & ",StackTrace:" & e1.StackTrace & "]" + + finally + { + //0142760: 【立琻】EDC数据库里面多了很多临时表, 19245, 2023/08/10, 刪除TEMP_表 + try + { + // TempTable 連線設定 + // 更改連線字串,改為testdata + fuTransferTestConnection(ref strTestCnnString, ref strTestDBType, ref strTestDBOwner); + + // //Create connection + cnnTest = CreateConnection(strTestCnnString); + + Collection CollectionSQL = new Collection(); + if (colTableName.Count > 0) + { + foreach (string item in colTableName) + { + DataTable dtTableTemp = GetSchema_Tables(cnnTest, strTestDBOwner, item.ToUpper()); + if (!(dtTableTemp == null) && dtTableTemp.Rows.Count > 0) + { + strSQL = " Drop Table " + item; + CollectionSQL.Add(strSQL); + } + } + ExecuteSQLNoneQuery_UPD_NoLimitRows(strTestDBType, strTestCnnString, CollectionSQL); + } + } + catch + { + + } + + CloseConnection(cnnTemp); + CloseConnection(cnnTest); + if (!(drTemp == null)) + drTemp.Close(); + //if (!(cmmTemp == null)) + // cmmTemp.Dispose(); + if (r != null) + r.Close(); + if (fs != null) + fs.Close(); + + if (!string.IsNullOrEmpty(strFailLog)) + { + funImpEQPTestDataRet = "[JobNo:" + strJobNo + "][FunctionNo:funImpEQPTestData]" + strFailLog; + } + // 若設定管理群組或群組人員,如果失敗,需要寄送mail + if ((strEQPGroupNo ?? "") != defString && !string.IsNullOrEmpty(strFailLog)) + { + string argFileName = "N/A"; + string argEmailSubject = "設備TestSummary執行失敗"; + modAutoLoaderLibrary.SendMultiEmail(ref argFileName, ref argEmailSubject, funImpEQPTestDataRet, strEQPGroupNo, GroupType: modAutoLoaderLibrary.GroupType.EquipmentGroup); + } + + // 將此設備的格式檔與原始數據格式檔自目錄中刪除 + if (dtFormatFile != null) + { + foreach (DataRow drFormatFile in dtFormatFile.Rows) + { + if (File.Exists(Conversions.ToString(strSourcePath + drFormatFile["FFName"])) == true) + { + File.Delete(Conversions.ToString(strSourcePath + drFormatFile["FFName"])); + } + if (File.Exists(Conversions.ToString(strSourcePath + drFormatFile["RawFFName"])) == true) + { + File.Delete(Conversions.ToString(strSourcePath + drFormatFile["RawFFName"])); + } + } + } + + } + + return funImpEQPTestDataRet; + + } + + //廠內設備電性值匯入_ByEAP funImpEQPTestData_UploadFile + private string funImpEQPTestData_UploadFile(Collection colParameters = null) + { + string funImpEQPTestData_UploadFileRet = default(string); + + // 2020/12/22, Ning, 取得tblWIPCont_UploadFile中未解析的檔案做解析, 並回填tblWIPCont_UploadFile對應的值 + + var cnnTemp = default(IDbConnection); + var drTemp = default(DbDataReader); + + string strJobNo = string.Empty; // JobNo + string strSourcePath = string.Empty; // 來源檔案路徑 + string strDestinationPath = string.Empty; // 目前檔案路徑 + string strQueuePath = string.Empty; // 處理中檔案路徑 + string strFailPath = string.Empty; // 失敗檔案路徑 + string FileName = string.Empty; // 處理中檔案 + string DirName = DateTime.Now.ToString("yyyyMM"); // 分類目錄名稱 + bool blnMoveFile = true; + string strSQL = string.Empty; + + // 88576 [SEMI_Wafer] EAP 整合接口 LogFile_Send 測試資料匯入調整 Edison 2021/03/04 + // ============================================== 88576 Start ============================================== + // 固定欄位資料起始位置(第幾列) + // 2019/5/28,Ning, WaferID可能不是數值, 為分隔符號, 第幾個Part, 第幾碼-第幾碼 + string strWaferIDPos = defString; + int intEquipmentNo = defInteger; + int intTestDate = defInteger; + int intThickNess = defInteger; + int intProgramNo = defInteger; + int intWaferSize = defInteger; + int intColumnStart = defInteger; + // 2019/5/30,Ning, 多片格式需定義D_ComponentNo + // Dim intD_ComponentNo As String = defInteger + // 2021/5/4,Ning, 多批格式需定義D_LotNo + string intD_LotNo = defInteger.ToString(); + // 2019/5/28,Ning, DataStart可能不是數值, 是固定字串, 該字串出現後的下一列為DataStart + string strDataStartPos = defString; + // 多檔新增動態位置 + string strLotNumber = defString; + string strRecipe = defString; + string strBinFileName = defString; + string strOperator = defString; + string strTotalScan = defString; + string strTotalTested = defString; + string strTestCondition = defString; + string strCalData = defString; + + // ============================================== 88576 End ============================================== + + string strEquipmentNo; + string strTemp; + + var strReadLine = new string[2]; + string[] aryWaferInfo = new string[] { defString, defString, defString, defString, defString, defString }; // 存放解析後的Wafer資訊 + var fs = default(FileStream); + var r = default(StreamReader); + + string strFormatFile, strRawFormatFile; // 格式檔路徑+名稱 + string strFormatScript, strRawFormatScript; // 格式檔內容 + string strFFName, strRawFFName; // 格式檔名稱 + StreamWriter sw; + + var datEvnetTime = DateTime.Now; + + DataTable dtFormatFile = default(DataTable), dtRawScript, dtFormat_Postion; + DataView dvFormatFile; + DataRow drAdd; + int idx; + bool blnFound; + var intItemNo = default(int); + string strExtName, strMSplitSign = default(string), strDSplitSign = default(string); + DataRow drFormat; + string strFailLog = ""; + var CollectionSQL = new Collection(); + // 2021/3/29,Ning,89890: [SEMI_Wafer]AutoLoader 測試原始數據收集_設備AutoLoader 電性值匯入調整 + long lngSplitFileSize = 10485760L; // 10485760 + long lngSplitRecordsLimit = 5000L; // 5000 + string strTmpTableName = default(string), strMatchFFName = default(string); + var dtRawData = default(DataTable); + // 2021/3/29,Ning,是否儲存RawData + var blnStoreRawData = default(bool); + // 2021/5/3,Ning,是否為多批格式 + var blnBatchFormat = default(bool); + // 91733: [SEMI_Wafer] AutoLoader 廠內設備電性值匯入,支援可不收集電性測試資料, 只收集 Raw Data + var blnSummaryCollect = default(bool); + + dtFormat_Postion = new DataTable("Format_Postion"); // 0088935: [SEMI_Wafer] AutoLoader測試資料動態參數收集優化_AutoLoader 電性值匯入調整 + dtFormat_Postion.Columns.Add("ColumnName", Type.GetType("System.String")); + dtFormat_Postion.Columns.Add("ColumnPosition", Type.GetType("System.String")); + dtFormat_Postion.Columns.Add("Value", Type.GetType("System.String")); + dtFormat_Postion.Columns.Add("FileName", Type.GetType("System.String")); + dtFormat_Postion.Columns.Add("AssignFile", Type.GetType("System.String")); + + // 2021/5/10 增加現況與log紀錄 + string strJobName = defString; + string strJobFunction = defString; + bool blnSplitPartialSuccess = false; + bool blnNotMoveToFail = false; + string strEQPGroupNo = defString; + + int h; + //System.Data.OleDb.OleDbDataAdapter daTemp; + DataSet dsTemp; + DataTable dtEQP; + DataTable dtState; + DataRow[] drSel; + bool blnFinishYet = false; + var str_FileFormat = default(string); // FileFormat + var datEventTime = DateTime.Now; + try + { + // //取出colParameter傳入參數 + strJobNo = colParameters["JobNo"].ToString().Trim(); + strSourcePath = colParameters["SourcePath"].ToString().Trim(); + strDestinationPath = colParameters["DestinationPath"].ToString().Trim(); + strQueuePath = colParameters["QueuePath"].ToString().Trim(); + strFailPath = colParameters["FailPath"].ToString().Trim(); + strJobName = colParameters["JobName"].ToString().Trim(); + strJobFunction = colParameters["JobFunction"].ToString().Trim(); + // SplitFileSize分包檔案大小, 若沒設定則預設為10485760 (10MB) + if (colParameters.Contains("SplitFileSize") && Information.IsNumeric(Strings.Trim(Conversions.ToString(colParameters["SplitFileSize"])))) + { + lngSplitFileSize = Conversions.ToLong(Strings.Trim(Conversions.ToString(colParameters["SplitFileSize"]))); + } + // SplitRecordsLimit分包筆數, 若沒設定則預設為5000筆 + if (colParameters.Contains("SplitRecordsLimit") && Information.IsNumeric(Strings.Trim(Conversions.ToString(colParameters["SplitRecordsLimit"])))) + { + lngSplitRecordsLimit = Conversions.ToLong(Strings.Trim(Conversions.ToString(colParameters["SplitRecordsLimit"]))); + } + + // 2021/8/27 Steven Mantis: 0098747調整設備測試檔案解析函式(funImpEQPTestData_UploadFile),讀入Parameter1設定值,如果設定值為數值,設定值為6,代表僅處理tblWIPCont_UploadFile資料表中FileFormat=6的資料進行處理; + // 若Parameter1設定值為空或非數值則固定解析FileFormat <= 5 的檔案資料 + if (colParameters.Contains("Parameter1") && !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter1"])).ToString())) + { + str_FileFormat = Strings.Trim(Conversions.ToString(colParameters["Parameter1"])); + } + + // 88576 [SEMI_Wafer] EAP 整合接口 LogFile_Send 測試資料匯入調整 Edison 2021/03/04 + // ============================================== 88576 Start ============================================== + if (!strSourcePath.EndsWith(@"\")) + strSourcePath += @"\"; + if (!strDestinationPath.EndsWith(@"\")) + strDestinationPath += @"\"; + if (!strQueuePath.EndsWith(@"\")) + strQueuePath += @"\"; + if (!strFailPath.EndsWith(@"\")) + strFailPath += @"\"; + // ============================================== 88576 End ============================================== + + dtFormatFile = new DataTable("FormatFile"); + dtFormatFile.Columns.Add("ItemNo", Type.GetType("System.Int16")); // 第幾個格式檔, 會與aryFormula(itemno)對應 + dtFormatFile.Columns.Add("FileNameFormat", Type.GetType("System.String")); // DB中完整的FileNameFormat + dtFormatFile.Columns.Add("FFName", Type.GetType("System.String")); // 存完整的FormatFileName.txt + dtFormatFile.Columns.Add("ExtName", Type.GetType("System.String")); // 格式檔副檔名, Ex ".csv" + dtFormatFile.Columns.Add("FName", Type.GetType("System.String")); // 格式檔去除副檔名 + dtFormatFile.Columns.Add("FFLength", Type.GetType("System.Int16")); // 存%前或%後字串的長度 + dtFormatFile.Columns.Add("FormatScript", Type.GetType("System.String")); + dtFormatFile.Columns.Add("MSplitSign", Type.GetType("System.String")); // 表格分隔符號 + dtFormatFile.Columns.Add("DSplitSign", Type.GetType("System.String")); // 明細分隔符號 + dtFormatFile.Columns.Add("MultiWafer", Type.GetType("System.Int16")); // 是否為有多筆WaferID的 + dtFormatFile.Columns.Add("StoreRawData", Type.GetType("System.Int16")); // 是否儲存RawData + dtFormatFile.Columns.Add("RawFFName", Type.GetType("System.String")); // 存完整的RawData FormatFileName.txt + dtFormatFile.Columns.Add("BatchFormat", Type.GetType("System.Int16")); // 是否為多批格式 0:否 1:是 + + // 88576 [SEMI_Wafer] EAP 整合接口 LogFile_Send 測試資料匯入調整 Edison 2021/03/04 + // ============================================== 88576 Start ============================================== + // 固定參數位置 + dtFormatFile.Columns.Add("strWaferIDPos", Type.GetType("System.String")); // WaferID可能不是設數值 + dtFormatFile.Columns.Add("intTestDate", Type.GetType("System.Int16")); + dtFormatFile.Columns.Add("intEquipmentNo", Type.GetType("System.Int16")); + dtFormatFile.Columns.Add("intProgramNo", Type.GetType("System.Int16")); + dtFormatFile.Columns.Add("intColumnStart", Type.GetType("System.Int16")); + dtFormatFile.Columns.Add("strDataStartPos", Type.GetType("System.String")); + // dtFormatFile.Columns.Add("intD_ComponentNo", System.Type.GetType("System.Int16")) + dtFormatFile.Columns.Add("intD_LotNo", Type.GetType("System.Int16")); + // 動態位置 + dtFormatFile.Columns.Add("intWaferSize", Type.GetType("System.Int16")); + dtFormatFile.Columns.Add("intThickNess", Type.GetType("System.Int16")); + // 多檔新增動態位置 + dtFormatFile.Columns.Add("LotNumber", Type.GetType("System.String")); + dtFormatFile.Columns.Add("Recipe", Type.GetType("System.String")); + dtFormatFile.Columns.Add("BinFileName", Type.GetType("System.String")); + dtFormatFile.Columns.Add("Operator", Type.GetType("System.String")); + dtFormatFile.Columns.Add("TotalScan", Type.GetType("System.String")); + dtFormatFile.Columns.Add("TotalTested", Type.GetType("System.String")); + dtFormatFile.Columns.Add("Test_Condition", Type.GetType("System.String")); + dtFormatFile.Columns.Add("CalData", Type.GetType("System.String")); + // ============================================== 88576 End ============================================== + // 91733: [SEMI_Wafer] AutoLoader 廠內設備電性值匯入,支援可不收集電性測試資料, 只收集 Raw Data + dtFormatFile.Columns.Add("intSummaryCollect", Type.GetType("System.Int16")); // 0代表不收集Summart, 1代表收集Summary + + dtRawScript = new DataTable("RawScript"); + dtRawScript.Columns.Add("TestRecipeNo", Type.GetType("System.String")); + dtRawScript.Columns.Add("ColPosition", Type.GetType("System.Int16")); + dtRawScript.Columns.Add("FileNameFormat", Type.GetType("System.String")); + + // 2021/3/11,Ning, 89144: [6.0.5] EAP 整合接口 LogFile_Send 一批多個電性測試檔時,AutoLoader 解析失敗 + // Result: 0:未解析 1:成功 -1:失敗 2:解析中 + cnnTemp = CreateConnection(strConnectionString); + // 若參數1= 6,則只寫入表頭資料 + if (str_FileFormat == "6") + { + strSQL = "Select * From tblWIPCont_UploadFile Where Result = 0 and Fileformat = 6 order by CREATEDATE"; + } + else + { + strSQL = "Select * From tblWIPCont_UploadFile Where Result = 0 and (Fileformat <> 6 or Fileformat is null)order by CREATEDATE"; + } + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp); + dsTemp = new DataSet(); + //daTemp.Fill(dsTemp, "UploadFile"); + ExecuteSQLQuery_Adapter(strSQL, dsTemp, "UploadFile", cnnTemp); + dtEQP = dsTemp.Tables["UploadFile"].DefaultView.ToTable(true, "EquipmentNo"); + //cmmTemp.Dispose(); + //daTemp.Dispose(); + + // 分包失敗的資料 + // 規格調整,無論成功或失敗,tblWIPCont_UploadFile資料將刪除,並記錄到log中 + strSQL = "Select A.* ,B.FileName as FileName_State,B.FilePath as FilePath_State,B.ImportedRows as ImportedRows_State From tblWIPCont_UploadFilelog A Left Join TBLMESAUTOLOADERFILESTATE B on A.EquipmentNo = B. EquipmentNo and A.SequenceNo = B.SequenceNo where B.EquipmentNo is not null and B.ServerName = '" + Environment.MachineName + "'And B.ServiceName = 'AutoLoaderLib'" + " And B.JobNo = '" + strJobNo + "' and Result = -1 order by B.StartTime"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp); + //daTemp.Fill(dsTemp, "FileState"); + ExecuteSQLQuery_Adapter(strSQL, dsTemp, "FileState", cnnTemp); + dtState = dsTemp.Tables["FileState"].DefaultView.ToTable(); + if (!(dtState == null) && dtState.Rows.Count > 0) + { + blnFinishYet = true; + } + //cmmTemp.Dispose(); + //daTemp.Dispose(); + + // 資料已取出, 將Result改為解析中以避免再次讀取相同檔案 + if (str_FileFormat == "6") + { + strSQL = "Update tblWIPCont_UploadFile Set Result = 2 Where Result = 0 and FileFormat = 6"; + } + else + { + strSQL = "Update tblWIPCont_UploadFile Set Result = 2 Where Result = 0 and (FileFormat <> 6 or FileFormat is null)"; + } // 有另一AutoLoader 處理format = 6,所以parameter不是6就不處理6的資料 + string argstrDatabaseType = Conversions.ToString(DataBaseType); + ExecuteSQLNoneQuery(argstrDatabaseType, strConnectionString, ref strSQL); + + // FileFormat = 6 只處理表頭資料 + if (blnFinishYet) // 有分包處理失敗的檔案 + { + var FormatFile1 = default(string); + foreach (DataRow drEQP in dtState.Rows) // dtState中的資料是分包處理失敗的檔案 + { + dtFormatFile.Clear(); // 格式檔Reset + dtFormat_Postion.Clear(); + strEquipmentNo = Conversions.ToString(drEQP["EquipmentNo"]); + // 取得格式檔 + // 2019/2/20, Ning, 同一機台格式檔可能會有多筆 + // 2019/5/28, Ning, FileNameFormat支援%在最前面 + strSQL = "Select * From tblEQPALScript Where EquipmentNo = '" + strEquipmentNo + "'"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.HasRows) + { + idx = 0; + while (drTemp.Read()) + { + idx = idx + 1; + // 格式檔名稱直接用FileNameFormat存, FileNameFormat可能為A_AOI%.csv或AQL%.csv等 + strFFName = drTemp["FileNameFormat"].ToString(); + strExtName = Strings.Right(strFFName, strFFName.Length - strFFName.LastIndexOf(".")); + // 格式檔名: 將FileNameFormat副檔名取代為.txt + strFFName = Strings.Replace(strFFName, strExtName, ".txt"); + // 原始數據格式檔為格式檔_RAW.txt + strRawFFName = Strings.Mid(strFFName, 1, Strings.Len(strFFName) - 4) + "_RAW" + ".txt"; + // CLOB類型以.ToString轉換之 + strFormatScript = drTemp["FormatScript"].ToString(); + + // //格式檔已存在必須先刪除 + if (File.Exists(strSourcePath + strFFName) == true) + { + File.Delete(strSourcePath + strFFName); + } + + // 將strFormatScript寫入strFFName中 + fs = new FileStream(strSourcePath + strFFName, FileMode.Create, FileAccess.Write); + sw = new StreamWriter(fs, Encoding.Default); + sw.WriteLine(strFormatScript); + sw.Close(); + sw = null; + fs.Close(); + fs = null; + + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["StoreRawData"], 1, false))) + { + // 將Raw格式檔寫入RawFileNameFormat去副檔名+".txt" + strRawFormatScript = drTemp["RawDataFormatScript"].ToString(); + + if (File.Exists(strSourcePath + strRawFFName) == true) + { + File.Delete(strSourcePath + strRawFFName); + } + + // 將strFormatScript寫入strFFName中 + fs = new FileStream(strSourcePath + strRawFFName, FileMode.Create, FileAccess.Write); + sw = new StreamWriter(fs, Encoding.Default); + sw.WriteLine(strRawFormatScript); + sw.Close(); + sw = null; + fs.Close(); + fs = null; + } + + drAdd = dtFormatFile.NewRow(); + drAdd["ItemNo"] = idx; + drAdd["FileNameFormat"] = drTemp["FileNameFormat"].ToString(); + drAdd["FFName"] = strFFName; + drAdd["ExtName"] = strExtName; + drAdd["FName"] = Strings.Mid(strFFName, 1, strFFName.Length - 4); // 因格式檔固定存為.txt, 故直接取第1碼至長度減4碼 + // 去除%與副檔名的長度 + drAdd["FFLength"] = drTemp["FileNameFormat"].ToString().Length - 1 - strExtName.Length; + drAdd["FormatScript"] = strFormatScript; + drAdd["MSplitSign"] = drTemp["MasterSeparateSign"]; + drAdd["DSplitSign"] = drTemp["DetailCloumnSeparateSign"]; + drAdd["MultiWafer"] = drTemp["MultiWafer"]; // 0:單筆Wafer, 有含公式檔 1:多筆Wafer, 為Excel File + // RawData + drAdd["StoreRawData"] = drTemp["StoreRawData"]; // 0:不存RawData 1:要存RawData + drAdd["RawFFName"] = strRawFFName; // 記錄原始數據格式檔名稱 + drAdd["intSummaryCollect"] = 0; // 預設為零0,有取到"公式"才改為1 + // BatchFormat + drAdd["BatchFormat"] = drTemp["BatchFormat"]; // 0:非多批 1:多批 + dtFormatFile.Rows.Add(drAdd); + } + } + else + { + funImpEQPTestData_UploadFileRet = "機台編號: " + strEquipmentNo + " 未設定格式檔!"; + // Throw New System.Exception(funImpEQPTestData_UploadFile) + strFailLog = strFailLog + funImpEQPTestData_UploadFileRet + Constants.vbCrLf; + // 一個設備未設定格式檔, 繼續下個設備 + continue; + } + drTemp.Close(); + //cmmTemp.Dispose(); + + var aryFormula = new ArrayList[dtFormatFile.Rows.Count + 1]; + + // 解析格式檔將strWaferIDPos, intColumnStart等值存入dtFormatFile中, 公式檔存入aryFormula(ItemNo)中 + foreach (DataRow dr in dtFormatFile.Rows) + { + + // 格式檔路徑: SourcePath & 格式檔名稱 + strFormatFile = Conversions.ToString(strSourcePath + dr["FFName"]); + + // 88576 [SEMI_Wafer] EAP 整合接口 LogFile_Send 測試資料匯入調整 Edison 2021/03/04 + // ============================================== 88576 Start ============================================== + // 參數Reset + strWaferIDPos = defString; + intTestDate = defInteger; + intEquipmentNo = defInteger; + intProgramNo = defInteger; + intColumnStart = defInteger; + strDataStartPos = defString; + intWaferSize = defInteger; + intThickNess = defInteger; + // intD_ComponentNo = defInteger + intD_LotNo = defInteger.ToString(); + strLotNumber = defString; + strRecipe = defString; + strBinFileName = defString; + strOperator = defString; + strTotalScan = defString; + strTotalTested = defString; + strTestCondition = defString; + strCalData = defString; + // ============================================== 88576 Start ============================================== + + try + { + var scrFile = new FileInfo(strFormatFile); + fs = new FileStream(strFormatFile, FileMode.Open); + r = new StreamReader(fs, Encoding.Default); + + // 1.先讀取格式檔 + if (scrFile.Exists == false) + { + funImpEQPTestData_UploadFileRet = "請確認機台格式檔案是否存在!!"; + throw new Exception(funImpEQPTestData_UploadFileRet); + } + else + { + + aryFormula[Conversions.ToInteger(dr["ItemNo"])] = new ArrayList(); + + // 解析格式檔固定資料位置ㄅ + // 固定參數: WaferID, TestDate, EquipmentNo, ProgramNo, ColumnsStart, DataStart + // 動態參數: WaferSize, Thickness + while (r.Peek() > -1) + { + strTemp = r.ReadLine(); + strReadLine = Strings.Split(Strings.Trim(strTemp), "=>>"); + + // 88576 [SEMI_Wafer] EAP 整合接口 LogFile_Send 測試資料匯入調整 Edison 2021/03/04 + // ============================================== 88576 Start ============================================== + // If strReadLine(0).ToUpper.IndexOf("公式") = 0 Then + // aryFormula(dr("ItemNo")).Add(strReadLine(1)) + // End If + switch (strReadLine[0].ToUpper() ?? "") + { + // 固定參數 + case "WAFERID": + { + strWaferIDPos = strReadLine[1]; + dr["strWaferIDPos"] = strWaferIDPos; + break; + } + case "TESTDATE": + { + intTestDate = (int)Math.Round(Conversion.Val(strReadLine[1])); + dr["intTestDate"] = intTestDate; + break; + } + case "EQUIPMENTNO": + { + intEquipmentNo = (int)Math.Round(Conversion.Val(strReadLine[1])); + dr["intEquipmentNo"] = intEquipmentNo; + break; + } + case "PROGRAMNO": + { + intProgramNo = (int)Math.Round(Conversion.Val(strReadLine[1])); + dr["intProgramNo"] = intProgramNo; + break; + } + case "COLUMNSSTART": + { + intColumnStart = (int)Math.Round(Conversion.Val(strReadLine[1])); + dr["intColumnStart"] = intColumnStart; + break; + } + case "DATASTART": + { + strDataStartPos = strReadLine[1]; + dr["strDataStartPos"] = strDataStartPos; + break; + } + // Case "D_COMPONENTNO" + // intD_ComponentNo = Val(strReadLine(1)) + // dr("intD_ComponentNo") = intD_ComponentNo + case "D_LOTNO": + { + intD_LotNo = Conversion.Val(strReadLine[1]).ToString(); + dr["intD_LotNo"] = intD_LotNo; + break; + } + // 動態參數 + case "WAFERSIZE": + { + intWaferSize = (int)Math.Round(Conversion.Val(strReadLine[1])); + dr["intWaferSize"] = intWaferSize; + break; + } + case "THICKNESS": + { + intThickNess = (int)Math.Round(Conversion.Val(strReadLine[1])); + dr["intThickNess"] = intThickNess; + break; + } + // 多檔新增的動態參數 + case "LOTNUMBER": + { + strLotNumber = Conversion.Val(strReadLine[1]).ToString(); + dr["LotNumber"] = strLotNumber; + break; + } + case "RECIPE": + { + strRecipe = Conversion.Val(strReadLine[1]).ToString(); + dr["Recipe"] = strRecipe; + break; + } + case "BINFILENAME": + { + strBinFileName = Conversion.Val(strReadLine[1]).ToString(); + dr["BinFileName"] = strBinFileName; + break; + } + case "OPERATOR": + { + strOperator = Conversion.Val(strReadLine[1]).ToString(); + dr["Operator"] = strOperator; + break; + } + case "TOTALSCAN": + { + strTotalScan = Conversion.Val(strReadLine[1]).ToString(); + dr["TotalScan"] = strTotalScan; + break; + } + case "TOTALTESTED": + { + strTotalTested = Conversion.Val(strReadLine[1]).ToString(); + dr["TotalTested"] = strTotalTested; + break; + } + case "TEST CONDITION": + { + strTestCondition = Conversion.Val(strReadLine[1]).ToString(); + dr["Test_Conditio"] = strTestCondition; + break; + } + case "CALDATA": + { + strCalData = Conversion.Val(strReadLine[1]).ToString(); + dr["CalData"] = strCalData; + break; + } + + default: + { + if (strReadLine[0].ToUpper().IndexOf("公式") == 0) + { + aryFormula[Conversions.ToInteger(dr["ItemNo"])].Add(strReadLine[1]); + dr["intSummaryCollect"] = 1; + } + else if (!string.IsNullOrEmpty(strReadLine[0].ToUpper())) + { + if (strReadLine[0].ToUpper() != "D_COMPONENTNO") + { + drFormat = dtFormat_Postion.NewRow(); + drFormat["ColumnName"] = strReadLine[0].ToUpper(); + drFormat["ColumnPosition"] = Conversion.Val(strReadLine[1]); + drFormat["FileName"] = dr["FFName"]; + dtFormat_Postion.Rows.Add(drFormat); + } + } + + break; + } + } + // ============================================== 88576 End ============================================== + + } + } + } + catch (Exception ex) + { + funImpEQPTestData_UploadFileRet = "格式檔解析失敗! " + strFormatFile + " Error Message :" + ex.Message.ToString(); + throw new Exception(funImpEQPTestData_UploadFileRet); + } + finally + { + if (r != null) + r.Close(); + if (fs != null) + fs.Close(); + } + + // 88576 [SEMI_Wafer] EAP 整合接口 LogFile_Send 測試資料匯入調整 Edison 2021/03/04 + // ============================================== 88576 Start ============================================== + if ((strWaferIDPos ?? "") == defString || intColumnStart == defInteger || (strDataStartPos ?? "") == defString) + { + funImpEQPTestData_UploadFileRet = "請確認機台格式檔案設定是否正確(WaferID、ColumnsStart、DataStart)!!"; + throw new Exception(funImpEQPTestData_UploadFileRet); + } + + if (!Information.IsNumeric(strWaferIDPos)) + { + // ex: -,2,3-9 表示以"-"分隔, 取第2個Part的第3到第9個字元 + string[] aryWaferID, aryChar; + aryWaferID = Strings.Split(strWaferIDPos, ","); + if (aryWaferID.Length != 3) + { + funImpEQPTestData_UploadFileRet = "請確認機台格式檔案設定是否正確(WaferID)"; + throw new Exception(funImpEQPTestData_UploadFileRet); + } + aryChar = aryWaferID[2].Split('-'); + if (aryChar.Length != 2) + { + funImpEQPTestData_UploadFileRet = "請確認機台格式檔案設定是否正確(WaferID)"; + throw new Exception(funImpEQPTestData_UploadFileRet); + } + if (!Information.IsNumeric(aryChar[0]) || !Information.IsNumeric(aryChar[0])) + { + funImpEQPTestData_UploadFileRet = "請確認機台格式檔案設定是否正確(WaferID)"; + throw new Exception(funImpEQPTestData_UploadFileRet); + } + if (Operators.CompareString(aryChar[0], aryChar[1], false) > 0) + { + funImpEQPTestData_UploadFileRet = "請確認機台格式檔案設定是否正確(WaferID)"; + throw new Exception(funImpEQPTestData_UploadFileRet); + } + } + // ============================================== 88576 End ============================================== + + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dr["StoreRawData"], 1, false))) + { + // 格式檔路徑: SourcePath & 格式檔名稱 + strRawFormatFile = Conversions.ToString(strSourcePath + dr["RawFFName"]); + + try + { + var scrFile = new FileInfo(strRawFormatFile); + fs = new FileStream(strRawFormatFile, FileMode.Open); + r = new StreamReader(fs, Encoding.Default); + + // 1.先讀取原始數據格式檔 + if (scrFile.Exists == false) + { + funImpEQPTestData_UploadFileRet = "請確認機台原始數據格式檔案是否存在!!"; + throw new Exception(funImpEQPTestData_UploadFileRet); + } + else + { + // 解析RawData格式檔 + // 測試項目TestRecipeNo==>位置 + while (r.Peek() > -1) + { + strTemp = r.ReadLine(); + strReadLine = Strings.Split(Strings.Trim(strTemp), "=>>"); + if (!string.IsNullOrEmpty(strReadLine[0].ToUpper())) + { + drFormat = dtRawScript.NewRow(); + drFormat["TestRecipeNo"] = strReadLine[0].ToUpper(); + drFormat["ColPosition"] = Conversion.Val(strReadLine[1]); + drFormat["FileNameFormat"] = dr["FileNameFormat"]; // 用以對應是咬到哪個FileNameFormat + dtRawScript.Rows.Add(drFormat); + } + } + } + } + catch (Exception ex) + { + funImpEQPTestData_UploadFileRet = "原始數據格式檔解析失敗! " + strRawFormatFile + " Error Message :" + ex.Message.ToString(); + throw new Exception(funImpEQPTestData_UploadFileRet); + } + finally + { + if (r != null) + r.Close(); + if (fs != null) + fs.Close(); + } + } + + } // Next of For Each dr As DataRow In dtFormatFile.Rows + + // //目錄不存在時必須要先建立 + if (Directory.Exists(strQueuePath) == false) + { + Directory.CreateDirectory(strQueuePath); + } + + drSel = dsTemp.Tables["FileState"].Select("EquipmentNo = '" + strEquipmentNo + "'"); + + foreach (DataRow drUploadFile in drSel) + { + + object aryFile = Directory.GetFiles(strSourcePath); + DataTable dtFName; + string strTmpFName; + + dtFName = null; + dtFName = new DataTable("FName"); + dtFName.Columns.Add("FName", Type.GetType("System.String")); // FileName去除副檔名 + + dvFormatFile = dtFormatFile.DefaultView; + + Array.Sort((Array)aryFile); + + // 2021/5/13 Steven 應先找分包處理尚未處理完的檔案 + // 時間小的先做 + try + { + int intStartRow = 0; + intStartRow = Conversions.ToInteger(Operators.AddObject(drUploadFile["ImportedRows_State"], 1)); // 從上次完成的筆數+1開始寫入DB + string fn = Conversions.ToString(drUploadFile["FilePath_State"]); + var fi = new FileInfo(fn); + // If File.Exists(fn) = True AndAlso dtFormatFile.Select("FFName = '" & fi.Name & "'").Length = 0 Then '此檔案存在且不為格式檔(格式檔名會存在dtFormatFile.FFName中) + if (File.Exists(fn) == true && (fn ?? "") == (strQueuePath + Path.GetFileName(Conversions.ToString(drUploadFile["FilePath"])) ?? "")) // 鎖定只解析drUploadFile("FilePath")的檔案 + { + + FileName = fn; + + // 依檔名找到符合的格式檔 + // 符合以長度大的優先 + blnFound = false; + strExtName = Strings.Right(fi.Name, fi.Name.Length - fi.Name.LastIndexOf(".")); // 副檔名 + strTmpFName = Strings.Mid(fi.Name, 1, fi.Name.Length - strExtName.Length); // 去除副檔名的檔名 + + dtFName.Clear(); + drAdd = dtFName.NewRow(); + drAdd["FName"] = strTmpFName; + dtFName.Rows.Add(drAdd); + + // 副檔名需與格式檔副檔名相符 + dvFormatFile.RowFilter = "ExtName = '" + strExtName + "'"; + dvFormatFile.Sort = "FFLength Desc"; + for (int i = 0, loopTo = dvFormatFile.Count - 1; i <= loopTo; i++) + { + if (dtFName.Select(Conversions.ToString("FName Like '" + dvFormatFile[i]["FName"] + "'")).Length > 0) + { + FormatFile1 = Conversions.ToString(dvFormatFile[i]["FileNameFormat"]); + blnFound = true; + string strFormat = Conversions.ToString(dvFormatFile[i]["FFName"]); + if (!(dtFormat_Postion == null)) + { + if (dtFormat_Postion.Rows.Count > 0) + { + var loopTo1 = dtFormat_Postion.Rows.Count - 1; + for (h = 0; h <= loopTo1; h++) + { + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtFormat_Postion.Rows[h]["FileName"], strFormat, false))) + { + dtFormat_Postion.Rows[h]["AssignFile"] = 1; + } + else + { + dtFormat_Postion.Rows[h]["AssignFile"] = 0; + } + } + } + } + } + + if (blnFound == true) + { + intItemNo = Conversions.ToInteger(dvFormatFile[i]["ItemNo"]); + // 88576 [SEMI_Wafer] EAP 整合接口 LogFile_Send 測試資料匯入調整 Edison 2021/03/04 + // ============================================== 88576 Start ============================================== + intItemNo = Conversions.ToInteger(dvFormatFile[i]["ItemNo"]); + strWaferIDPos = Conversions.ToString(Interaction.IIf(dvFormatFile[i]["strWaferIDPos"] is DBNull, defString, dvFormatFile[i]["strWaferIDPos"])); + intTestDate = Conversions.ToInteger(Interaction.IIf(dvFormatFile[i]["intTestDate"] is DBNull, defInteger, dvFormatFile[i]["intTestDate"])); + intEquipmentNo = Conversions.ToInteger(Interaction.IIf(dvFormatFile[i]["intEquipmentNo"] is DBNull, defInteger, dvFormatFile[i]["intEquipmentNo"])); + intWaferSize = Conversions.ToInteger(Interaction.IIf(dvFormatFile[i]["intWaferSize"] is DBNull, defInteger, dvFormatFile[i]["intWaferSize"])); + intThickNess = Conversions.ToInteger(Interaction.IIf(dvFormatFile[i]["intThickNess"] is DBNull, defInteger, dvFormatFile[i]["intThickNess"])); + intProgramNo = Conversions.ToInteger(Interaction.IIf(dvFormatFile[i]["intProgramNo"] is DBNull, defInteger, dvFormatFile[i]["intProgramNo"])); + intColumnStart = Conversions.ToInteger(Interaction.IIf(dvFormatFile[i]["intColumnStart"] is DBNull, defInteger, dvFormatFile[i]["intColumnStart"])); + strDataStartPos = Conversions.ToString(Interaction.IIf(dvFormatFile[i]["strDataStartPos"] is DBNull, defInteger, dvFormatFile[i]["strDataStartPos"])); + strMatchFFName = Conversions.ToString(dvFormatFile[i]["FileNameFormat"]); + // intD_ComponentNo = IIf(IsDBNull(dvFormatFile(i)("intD_ComponentNo")), defInteger, dvFormatFile(i)("intD_ComponentNo")) + intD_LotNo = Conversions.ToString(Interaction.IIf(dvFormatFile[i]["intD_LotNo"] is DBNull, defInteger, dvFormatFile[i]["intD_LotNo"])); + strLotNumber = Conversions.ToString(Interaction.IIf(dvFormatFile[i]["LotNumber"] is DBNull, defInteger, dvFormatFile[i]["LotNumber"])); + strRecipe = Conversions.ToString(Interaction.IIf(dvFormatFile[i]["Recipe"] is DBNull, defInteger, dvFormatFile[i]["Recipe"])); + strBinFileName = Conversions.ToString(Interaction.IIf(dvFormatFile[i]["BinFileName"] is DBNull, defInteger, dvFormatFile[i]["BinFileName"])); + strOperator = Conversions.ToString(Interaction.IIf(dvFormatFile[i]["Operator"] is DBNull, defInteger, dvFormatFile[i]["Operator"])); + strTotalScan = Conversions.ToString(Interaction.IIf(dvFormatFile[i]["TotalScan"] is DBNull, defInteger, dvFormatFile[i]["TotalScan"])); + strTotalTested = Conversions.ToString(Interaction.IIf(dvFormatFile[i]["TotalTested"] is DBNull, defInteger, dvFormatFile[i]["TotalTested"])); + strTestCondition = Conversions.ToString(Interaction.IIf(dvFormatFile[i]["Test_Condition"] is DBNull, defInteger, dvFormatFile[i]["Test_Condition"])); + strCalData = Conversions.ToString(Interaction.IIf(dvFormatFile[i]["CalData"] is DBNull, defInteger, dvFormatFile[i]["CalData"])); + + // '表頭分隔字元,固定":" + // strMSplitSign = ":" + // '明細分隔字元, 固定為"," + // strDSplitSign = "," + // 表頭分隔字元, 沒設定預設為":" + + if (dvFormatFile[i]["MSplitSign"] is DBNull) + { + strMSplitSign = ":"; + } + else + { + strMSplitSign = dvFormatFile[i]["MSplitSign"].ToString(); + if (strMSplitSign.ToUpper() == "TAB") + { + strMSplitSign = Constants.vbTab; + } + } + + // 明細分隔字元, 沒設定預設為"," + if (dvFormatFile[i]["DSplitSign"] is DBNull) + { + strDSplitSign = ","; + } + else + { + strDSplitSign = dvFormatFile[i]["DSplitSign"].ToString(); + if (strDSplitSign.ToUpper() == "TAB") + { + strDSplitSign = Constants.vbTab; + } + } + // ============================================== 88576 End ============================================== + + if (dvFormatFile[i]["StoreRawData"].ToString() == "1") + { + blnStoreRawData = true; + } + else + { + blnStoreRawData = false; + } + + if (dvFormatFile[i]["BatchFormat"].ToString() == "1") + { + blnBatchFormat = true; + } + else + { + blnBatchFormat = false; + } + + // 91733: [SEMI_Wafer] AutoLoader 廠內設備電性值匯入,支援可不收集電性測試資料, 只收集 Raw Data + if (dvFormatFile[i]["intSummaryCollect"].ToString() == "1") + { + blnSummaryCollect = true; + } + else + { + blnSummaryCollect = false; + } + + break; + } + } + + if (blnFound == false) + { + funImpEQPTestData_UploadFileRet = "檔案: " + fi.Name + " 找不到符合檔名的格式檔!"; + throw new Exception(funImpEQPTestData_UploadFileRet); + } + + // //移動檔案Source至Queue + try + { + blnMoveFile = true; + File.Move(fn, strQueuePath + Path.GetFileName(fn)); + } + catch (Exception ex) + { + blnMoveFile = false; + funImpEQPTestData_UploadFileRet = ex.Message; + throw new Exception(funImpEQPTestData_UploadFileRet); + // Throw New System.Exception("此執行程序已中止,由另一執行程序處理中!!") + } + + // //將檔案來源改為Queue + FileName = strQueuePath + Path.GetFileName(fn); + + if (blnBatchFormat == true) // 多批格式 + { + try + { + // 解析檔案存入tblWIPEQP_EDC_TestRecipeType + if (fuBatchFormatToEQPEDC(drUploadFile["TestRecipeType"].ToString(), FileName, strMSplitSign, strDSplitSign, strEquipmentNo, Conversions.ToInteger(intD_LotNo), intColumnStart, strDataStartPos, fi.Name.ToString(), lngSplitRecordsLimit, true, Conversions.ToString(drUploadFile["SequenceNo"])) == false) + { + throw new Exception(); + } + } + + catch (Exception ex) + { + funImpEQPTestData_UploadFileRet = "依格式檔案定義解析資料存入EQPEDC資料表失敗: " + ex.Message; + throw new Exception(funImpEQPTestData_UploadFileRet); + } + } + + else + { + int TotalRows = 0; // 記錄總比數 + // 2.1解析Raw Data 存入TempTable做資料備查 + if (drUploadFile["FileFormat"].ToString() == "6") + { + if (blnSummaryCollect) + { + try + { + // 2.2依照格式檔案定義計算存入MES TestSummary 資料表 + // 88576 [SEMI_Wafer] EAP 整合接口 LogFile_Send 測試資料匯入調整 Edison 2021/03/04 + // ============================================== 88576 Start ============================================== + string FilenameTmp = fi.Name.ToString(); + FileInfo fInfo = new FileInfo(FileName); + if (AddTestSummary_Format6(aryFormula[intItemNo], drUploadFile["PSNo"].ToString(), + drUploadFile["LogGroupSerial"].ToString(), FileName, strMSplitSign, strDSplitSign, + strWaferIDPos, intTestDate, intEquipmentNo, intWaferSize, intThickNess, + intProgramNo, intColumnStart, strDataStartPos, ref aryWaferInfo, + strEquipmentNo, drUploadFile["LotNo"].ToString(), FilenameTmp, + ref strTmpTableName, blnStoreRawData, ref dtRawData, FileName, + (int)fInfo.Length, drUploadFile["SequenceNo"].ToString(), dtFormat_Postion, + TotalRows, drUploadFile["TESTRECIPETYPE"].ToString()) == false) + { + throw new System.Exception(); + } + } + // ============================================== 88576 Start ============================================== + + catch (Exception ex) + { + funImpEQPTestData_UploadFileRet = "格式檔案定義計算存入MES TestSummary 資料表失敗: " + ex.Message; + throw new Exception(funImpEQPTestData_UploadFileRet); + } + + } + } + else + { + try + { + if (Microsoft.VisualBasic.FileSystem.FileLen(FileName) <= lngSplitFileSize) + { + string FilenameTmp = fi.Name.ToString(); + if (fuRawDataToTempTable_EQP_UploadFile(FileName, strMSplitSign, strDSplitSign, + strWaferIDPos, intTestDate, intEquipmentNo, intWaferSize, intThickNess, + intProgramNo, intColumnStart, strDataStartPos, ref aryWaferInfo, strEquipmentNo, + drUploadFile["LotNo"].ToString(), FilenameTmp, ref strTmpTableName, blnStoreRawData, + ref dtRawData, ref TotalRows, dtFormat_Postion, FormatFile1) == false) + { + throw new System.Exception(); + } + } + else + { + string FilenameTmp = fi.Name.ToString(); + FileInfo fInfo = new FileInfo(FileName); + if (fuRawDataToTempTable_EQP_UploadFile_BigFile(FileName, strMSplitSign, + strDSplitSign, strWaferIDPos, intTestDate, intEquipmentNo, intWaferSize, + intThickNess, intProgramNo, intColumnStart, strDataStartPos, ref aryWaferInfo, + strEquipmentNo, drUploadFile["LotNo"].ToString(), FilenameTmp, + lngSplitRecordsLimit, ref strTmpTableName, blnStoreRawData, ref dtRawData, + strJobNo, strJobFunction, FileName, (int)fInfo.Length, + drUploadFile["SequenceNo"].ToString(), ref blnSplitPartialSuccess, ref TotalRows, + dtFormat_Postion, intStartRow, FormatFile1) == false) + { + throw new System.Exception(); + } + } + } + catch (Exception ex) + { + funImpEQPTestData_UploadFileRet = "解析Raw Data 存入TempTable做資料備查失敗: " + ex.Message; + if (blnSplitPartialSuccess) + { + blnNotMoveToFail = true; + } + else if (blnSplitPartialSuccess == false && intStartRow != defInteger) // 當續處理檔案,第一次就錯時,也不該移動檔案 + { + blnNotMoveToFail = true; + } + throw new Exception(funImpEQPTestData_UploadFileRet); + } + // 91733: [SEMI_Wafer] AutoLoader 廠內設備電性值匯入,支援可不收集電性測試資料, 只收集 Raw Data + if (blnSummaryCollect) + { + try + { + // 2.2依照格式檔案定義計算存入MES TestSummary 資料表 + // 88576 [SEMI_Wafer] EAP 整合接口 LogFile_Send 測試資料匯入調整 Edison 2021/03/04 + // ============================================== 88576 Start ============================================== + + if (fuLEDDataSummary_EQP_UploadFile(drUploadFile["TestRecipeType"].ToString(), aryFormula[intItemNo], aryWaferInfo, strEquipmentNo, Conversions.ToString(drUploadFile["LotNo"]), Conversions.ToString(drUploadFile["PSNo"]), Conversions.ToString(drUploadFile["LogGroupSerial"]), Conversions.ToDate(drUploadFile["CreateDate"]), fi.Name.ToString(), strTmpTableName, blnStoreRawData, Conversions.ToString(drUploadFile["SequenceNo"]), dtFormat_Postion, drUploadFile["Creator"].ToString(), (int)Microsoft.VisualBasic.FileSystem.FileLen(FileName), TotalRows) == false) + { + throw new Exception(); + } + } + // ============================================== 88576 Start ============================================== + + catch (Exception ex) + { + funImpEQPTestData_UploadFileRet = "格式檔案定義計算存入MES TestSummary 資料表失敗: " + ex.Message; + throw new Exception(funImpEQPTestData_UploadFileRet); + } + + } + + // 要儲存原始數據 + if (blnStoreRawData) + { + try + { + // 儲存RawData + if (fuStoreRawData_EQP(drUploadFile["TESTRECIPETYPE"].ToString(), aryWaferInfo, strEquipmentNo, fi.Name.ToString(), strMatchFFName, ref dtRawScript, strTmpTableName, ref dtRawData) == false) + { + throw new Exception(); + } + } + catch (Exception ex) + { + funImpEQPTestData_UploadFileRet = "依格式檔定義存入原始數據失敗: " + ex.Message; + throw new Exception(funImpEQPTestData_UploadFileRet); + } + } + } + } + + // //目錄不存在時必須要先建立 + if (Directory.Exists(strDestinationPath + DirName) == false) + { + Directory.CreateDirectory(strDestinationPath + DirName); + } + // //檔案已存在Destination必須先刪除 + if (File.Exists(strDestinationPath + DirName + @"\" + Path.GetFileName(FileName)) == true) + { + File.Delete(strDestinationPath + DirName + @"\" + Path.GetFileName(FileName)); + } + // //移動檔案Queue至Destination + File.Move(FileName, strDestinationPath + DirName + @"\" + Path.GetFileName(FileName)); + // 保留最新LOG + strSQL = Conversions.ToString("Select EQUIPMENTNO from TBLWIPCONT_UPLOADFILELOG Where EQUIPMENTNO = '" + + drUploadFile["EquipmentNo"] + "' and SequenceNo = '" + drUploadFile["SequenceNo"] + "'"); + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + strSQL = Conversions.ToString("delete from TBLWIPCONT_UPLOADFILELOG Where EQUIPMENTNO = '" + + drUploadFile["EquipmentNo"] + "' and SequenceNo = '" + drUploadFile["SequenceNo"] + "'"); + CollectionSQL.Add(strSQL); + } + drTemp.Close(); + //cmmTemp.Dispose(); + + // 成功資料寫入Log + strSQL = Conversions.ToString(@"Insert into TBLWIPCONT_UPLOADFILELOG + (EQUIPMENTNO, LOTNO, FILEPATH, RESULT, SUMMARYTABLENAME, + PSNO, LOGGROUPSERIAL, ComponentNo,CREATOR, CREATEDATE, READFILEDATE, + SEQUENCENO, TESTRECIPETYPE, FILEFORMAT,TransactionID,WaferLot,WaferId,Description,BatchID)Select EQUIPMENTNO, LOTNO, FILEPATH, RESULT, SUMMARYTABLENAME, + PSNO, LOGGROUPSERIAL,ComponentNo, CREATOR, CREATEDATE, READFILEDATE, + SEQUENCENO, TESTRECIPETYPE, FILEFORMAT,TransactionID,WaferLot,WaferId,Description,BatchID From TBLWIPCONT_UPLOADFILE Where EQUIPMENTNO = '" + + drUploadFile["EquipmentNo"] + "' and SequenceNo = '" + drUploadFile["SequenceNo"] + "'"); + CollectionSQL.Add(strSQL); + // 再將tblWIPCont_UploadFile資料表中的紀錄予以刪除 + strSQL = Conversions.ToString("Delete from TBLWIPCONT_UPLOADFILE Where EQUIPMENTNO = '" + + drUploadFile["EquipmentNo"] + "' and SequenceNo = '" + drUploadFile["SequenceNo"] + "'"); + CollectionSQL.Add(strSQL); + + string argstrDatabaseType1 = Conversions.ToString(DataBaseType); + ExecuteSQLNoneQuery_UPD(argstrDatabaseType1, strConnectionString, CollectionSQL); + + CollectionSQL.Clear(); + + FileName = ""; + } + } + + catch (Exception ex) + { + // //檔案處理失敗時移動檔案至Fail + if (!string.IsNullOrEmpty(FileName)) + { + // //目錄不存在時必須要先建立 + if (Directory.Exists(strFailPath + DirName) == false) + { + Directory.CreateDirectory(strFailPath + DirName); + } + // //檔案已存在File必須先刪除 + if (File.Exists(strFailPath + DirName + @"\" + Path.GetFileName(FileName)) == true) + { + File.Delete(strFailPath + DirName + @"\" + Path.GetFileName(FileName)); + } + // //移動檔案至Fail + try + { + // 2021/5/12 Steven 當有分包成功寫入DB的檔案,不需移動至fail + if (blnNotMoveToFail == false) + File.Move(FileName, strFailPath + DirName + @"\" + Path.GetFileName(FileName)); + blnNotMoveToFail = false; + } + catch (Exception ex1) + { + } + + // 記錄錯誤的FileName + strFailLog = strFailLog + "[" + Path.GetFileName(FileName) + "][" + ex.Message + "]" + Constants.vbCrLf; + + // 更新tblWIPCont_UploadFile.Result = -1 (Fail) + + // 88995: [6.0.5] EAP 整合接口 LogFile_Send PK重複問題調整 + // strSQL = "Update tblWIPCont_UploadFile Set Result = -1 Where EquipmentNo = '" & drUploadFile("EquipmentNo") & "'" & + // " And CreateDate = To_Date('" & Format(drUploadFile("CreateDate"), "yyyy/MM/dd H:mm:ss") & "','YYYY/MM/DD HH24:MI:SS')" + strSQL = Conversions.ToString("Update tblWIPCont_UploadFile Set Result = -1,CreateDate = To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),READFILEDATE = To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') Where EquipmentNo = '" + + drUploadFile["EquipmentNo"] + "'" + " And SequenceNo = '" + drUploadFile["SequenceNo"] + "' "); + CollectionSQL.Add(strSQL); + // 分包失敗會一直寫入log 故保留最新的一次LOG + strSQL = Conversions.ToString("Select EQUIPMENTNO from TBLWIPCONT_UPLOADFILELOG Where EQUIPMENTNO = '" + + drUploadFile["EquipmentNo"] + "' and SequenceNo = '" + drUploadFile["SequenceNo"] + "'"); + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + strSQL = Conversions.ToString("delete from TBLWIPCONT_UPLOADFILELOG Where EQUIPMENTNO = '" + + drUploadFile["EquipmentNo"] + "' and SequenceNo = '" + drUploadFile["SequenceNo"] + "'"); + CollectionSQL.Add(strSQL); + } + drTemp.Close(); + //cmmTemp.Dispose(); + // 失敗資料寫入Log + strSQL = Conversions.ToString(@"Insert into TBLWIPCONT_UPLOADFILELOG + (EQUIPMENTNO, LOTNO, FILEPATH, RESULT, SUMMARYTABLENAME, + PSNO, LOGGROUPSERIAL,ComponentNo, CREATOR, CREATEDATE, READFILEDATE, + SEQUENCENO, TESTRECIPETYPE, FILEFORMAT,TransactionID,WaferLot,WaferId,BatchID,Description)Select EQUIPMENTNO, LOTNO, FILEPATH, RESULT, SUMMARYTABLENAME, + PSNO, LOGGROUPSERIAL,ComponentNo, CREATOR, CREATEDATE, READFILEDATE, + SEQUENCENO, TESTRECIPETYPE, FILEFORMAT,TransactionID,WaferLot,WaferId,BatchID,'" + strFailLog.Replace("'", "''") + "' From TBLWIPCONT_UPLOADFILE Where EQUIPMENTNO = '" + + drUploadFile["EquipmentNo"] + "' and SequenceNo = '" + drUploadFile["SequenceNo"] + "'"); + CollectionSQL.Add(strSQL); + // 再將tblWIPCont_UploadFile資料表中的紀錄予以刪除 + strSQL = Conversions.ToString("Delete from TBLWIPCONT_UPLOADFILE Where EQUIPMENTNO = '" + + drUploadFile["EquipmentNo"] + "' and SequenceNo = '" + drUploadFile["SequenceNo"] + "'"); + CollectionSQL.Add(strSQL); + + string argstrDatabaseType1 = Conversions.ToString(DataBaseType); + ExecuteSQLNoneQuery_UPD(argstrDatabaseType1, strConnectionString, CollectionSQL); + CollectionSQL.Clear(); + + FileName = ""; + } + + // 一個檔案失敗繼續讀取下個檔案 + continue; + + } + } // Next of For Each fn As String In aryFile + // 將此設備的格式檔自目錄中刪除 + foreach (DataRow drFormatFile in dtFormatFile.Rows) + { + if (File.Exists(Conversions.ToString(strSourcePath + drFormatFile["FFName"])) == true) + { + File.Delete(Conversions.ToString(strSourcePath + drFormatFile["FFName"])); + } + } + } // Next of For Each drEQP + } + + var FormatFile2 = default(string); + foreach (DataRow drEQP in dtEQP.Rows) + { + dtFormatFile.Clear(); // 格式檔Reset + dtFormat_Postion.Clear(); + strEquipmentNo = Conversions.ToString(drEQP["EquipmentNo"]); + // 取得格式檔 + // 2019/2/20, Ning, 同一機台格式檔可能會有多筆 + // 2019/5/28, Ning, FileNameFormat支援%在最前面 + strSQL = "Select * From tblEQPALScript Where EquipmentNo = '" + strEquipmentNo + "'"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.HasRows) + { + idx = 0; + while (drTemp.Read()) + { + idx = idx + 1; + // 格式檔名稱直接用FileNameFormat存, FileNameFormat可能為A_AOI%.csv或AQL%.csv等 + strFFName = drTemp["FileNameFormat"].ToString(); + strExtName = Strings.Right(strFFName, strFFName.Length - strFFName.LastIndexOf(".")); + // 格式檔名: 將FileNameFormat副檔名取代為.txt + strFFName = Strings.Replace(strFFName, strExtName, ".txt"); + // 原始數據格式檔為格式檔_RAW.txt + strRawFFName = Strings.Mid(strFFName, 1, Strings.Len(strFFName) - 4) + "_RAW" + ".txt"; + // CLOB類型以.ToString轉換之 + strFormatScript = drTemp["FormatScript"].ToString(); + + // //格式檔已存在必須先刪除 + if (File.Exists(strSourcePath + strFFName) == true) + { + File.Delete(strSourcePath + strFFName); + } + + // 將strFormatScript寫入strFFName中 + fs = new FileStream(strSourcePath + strFFName, FileMode.Create, FileAccess.Write); + sw = new StreamWriter(fs, Encoding.Default); + sw.WriteLine(strFormatScript); + sw.Close(); + sw = null; + fs.Close(); + fs = null; + + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["StoreRawData"], 1, false))) + { + // 將Raw格式檔寫入RawFileNameFormat去副檔名+".txt" + strRawFormatScript = drTemp["RawDataFormatScript"].ToString(); + + if (File.Exists(strSourcePath + strRawFFName) == true) + { + File.Delete(strSourcePath + strRawFFName); + } + + // 將strFormatScript寫入strFFName中 + fs = new FileStream(strSourcePath + strRawFFName, FileMode.Create, FileAccess.Write); + sw = new StreamWriter(fs, Encoding.Default); + sw.WriteLine(strRawFormatScript); + sw.Close(); + sw = null; + fs.Close(); + fs = null; + } + + drAdd = dtFormatFile.NewRow(); + drAdd["ItemNo"] = idx; + drAdd["FileNameFormat"] = drTemp["FileNameFormat"].ToString(); + drAdd["FFName"] = strFFName; + drAdd["ExtName"] = strExtName; + drAdd["FName"] = Strings.Mid(strFFName, 1, strFFName.Length - 4); // 因格式檔固定存為.txt, 故直接取第1碼至長度減4碼 + // 去除%與副檔名的長度 + drAdd["FFLength"] = drTemp["FileNameFormat"].ToString().Length - 1 - strExtName.Length; + drAdd["FormatScript"] = strFormatScript; + drAdd["MSplitSign"] = drTemp["MasterSeparateSign"]; + drAdd["DSplitSign"] = drTemp["DetailCloumnSeparateSign"]; + drAdd["MultiWafer"] = drTemp["MultiWafer"]; // 0:單筆Wafer, 有含公式檔 1:多筆Wafer, 為Excel File + // RawData + drAdd["StoreRawData"] = drTemp["StoreRawData"]; // 0:不存RawData 1:要存RawData + drAdd["RawFFName"] = strRawFFName; // 記錄原始數據格式檔名稱 + drAdd["intSummaryCollect"] = 0; // 預設為零0,有取到"公式"才改為1 + // BatchFormat + drAdd["BatchFormat"] = drTemp["BatchFormat"]; // 0:非多批 1:多批 + dtFormatFile.Rows.Add(drAdd); + } + } + else + { + funImpEQPTestData_UploadFileRet = "機台編號: " + strEquipmentNo + " 未設定格式檔!"; + // Throw New System.Exception(funImpEQPTestData_UploadFile) + strFailLog = strFailLog + funImpEQPTestData_UploadFileRet + Constants.vbCrLf; + // 一個設備未設定格式檔, 繼續下個設備 + continue; + } + drTemp.Close(); + //cmmTemp.Dispose(); + + var aryFormula = new ArrayList[dtFormatFile.Rows.Count + 1]; + + // 解析格式檔將strWaferIDPos, intColumnStart等值存入dtFormatFile中, 公式檔存入aryFormula(ItemNo)中 + foreach (DataRow dr in dtFormatFile.Rows) + { + + // 格式檔路徑: SourcePath & 格式檔名稱 + strFormatFile = Conversions.ToString(strSourcePath + dr["FFName"]); + + // 88576 [SEMI_Wafer] EAP 整合接口 LogFile_Send 測試資料匯入調整 Edison 2021/03/04 + // ============================================== 88576 Start ============================================== + // 參數Reset + strWaferIDPos = defString; + intTestDate = defInteger; + intEquipmentNo = defInteger; + intProgramNo = defInteger; + intColumnStart = defInteger; + strDataStartPos = defString; + intWaferSize = defInteger; + intThickNess = defInteger; + // intD_ComponentNo = defInteger + intD_LotNo = defInteger.ToString(); + strLotNumber = defString; + strRecipe = defString; + strBinFileName = defString; + strOperator = defString; + strTotalScan = defString; + strTotalTested = defString; + strTestCondition = defString; + strCalData = defString; + // ============================================== 88576 Start ============================================== + + try + { + var scrFile = new FileInfo(strFormatFile); + fs = new FileStream(strFormatFile, FileMode.Open); + r = new StreamReader(fs, Encoding.Default); + + // 1.先讀取格式檔 + if (scrFile.Exists == false) + { + funImpEQPTestData_UploadFileRet = "請確認機台格式檔案是否存在!!"; + throw new Exception(funImpEQPTestData_UploadFileRet); + } + else + { + + aryFormula[Conversions.ToInteger(dr["ItemNo"])] = new ArrayList(); + + // 解析格式檔固定資料位置ㄅ + // 固定參數: WaferID, TestDate, EquipmentNo, ProgramNo, ColumnsStart, DataStart + // 動態參數: WaferSize, Thickness + while (r.Peek() > -1) + { + strTemp = r.ReadLine(); + strReadLine = Strings.Split(Strings.Trim(strTemp), "=>>"); + + // 88576 [SEMI_Wafer] EAP 整合接口 LogFile_Send 測試資料匯入調整 Edison 2021/03/04 + // ============================================== 88576 Start ============================================== + // If strReadLine(0).ToUpper.IndexOf("公式") = 0 Then + // aryFormula(dr("ItemNo")).Add(strReadLine(1)) + // End If + switch (strReadLine[0].ToUpper() ?? "") + { + // 固定參數 + case "WAFERID": + { + strWaferIDPos = strReadLine[1]; + dr["strWaferIDPos"] = strWaferIDPos; + break; + } + case "TESTDATE": + { + intTestDate = (int)Math.Round(Conversion.Val(strReadLine[1])); + dr["intTestDate"] = intTestDate; + break; + } + case "EQUIPMENTNO": + { + intEquipmentNo = (int)Math.Round(Conversion.Val(strReadLine[1])); + dr["intEquipmentNo"] = intEquipmentNo; + break; + } + case "PROGRAMNO": + { + intProgramNo = (int)Math.Round(Conversion.Val(strReadLine[1])); + dr["intProgramNo"] = intProgramNo; + break; + } + case "COLUMNSSTART": + { + intColumnStart = (int)Math.Round(Conversion.Val(strReadLine[1])); + dr["intColumnStart"] = intColumnStart; + break; + } + case "DATASTART": + { + strDataStartPos = strReadLine[1]; + dr["strDataStartPos"] = strDataStartPos; + break; + } + // Case "D_COMPONENTNO" + // intD_ComponentNo = Val(strReadLine(1)) + // dr("intD_ComponentNo") = intD_ComponentNo + case "D_LOTNO": + { + intD_LotNo = Conversion.Val(strReadLine[1]).ToString(); + dr["intD_LotNo"] = intD_LotNo; + break; + } + // 動態參數 + case "WAFERSIZE": + { + intWaferSize = (int)Math.Round(Conversion.Val(strReadLine[1])); + dr["intWaferSize"] = intWaferSize; + break; + } + case "THICKNESS": + { + intThickNess = (int)Math.Round(Conversion.Val(strReadLine[1])); + dr["intThickNess"] = intThickNess; + break; + } + // 多檔新增的動態參數 + case "LOTNUMBER": + { + strLotNumber = Conversion.Val(strReadLine[1]).ToString(); + dr["LotNumber"] = strLotNumber; + break; + } + case "RECIPE": + { + strRecipe = Conversion.Val(strReadLine[1]).ToString(); + dr["Recipe"] = strRecipe; + break; + } + case "BINFILENAME": + { + strBinFileName = Conversion.Val(strReadLine[1]).ToString(); + dr["BinFileName"] = strBinFileName; + break; + } + case "OPERATOR": + { + strOperator = Conversion.Val(strReadLine[1]).ToString(); + dr["Operator"] = strOperator; + break; + } + case "TOTALSCAN": + { + strTotalScan = Conversion.Val(strReadLine[1]).ToString(); + dr["TotalScan"] = strTotalScan; + break; + } + case "TOTALTESTED": + { + strTotalTested = Conversion.Val(strReadLine[1]).ToString(); + dr["TotalTested"] = strTotalTested; + break; + } + case "TEST CONDITION": + { + strTestCondition = Conversion.Val(strReadLine[1]).ToString(); + dr["Test_Conditio"] = strTestCondition; + break; + } + case "CALDATA": + { + strCalData = Conversion.Val(strReadLine[1]).ToString(); + dr["CalData"] = strCalData; + break; + } + + default: + { + if (strReadLine[0].ToUpper().IndexOf("公式") == 0) + { + aryFormula[Conversions.ToInteger(dr["ItemNo"])].Add(strReadLine[1]); + dr["intSummaryCollect"] = 1; + } + else if (!string.IsNullOrEmpty(strReadLine[0].ToUpper())) + { + if (strReadLine[0].ToUpper() != "D_COMPONENTNO") + { + drFormat = dtFormat_Postion.NewRow(); + drFormat["ColumnName"] = strReadLine[0].ToUpper(); + drFormat["ColumnPosition"] = Conversion.Val(strReadLine[1]); + drFormat["FileName"] = dr["FFName"]; + dtFormat_Postion.Rows.Add(drFormat); + } + } + + break; + } + } + // ============================================== 88576 End ============================================== + + } + } + } + catch (Exception ex) + { + funImpEQPTestData_UploadFileRet = "格式檔解析失敗! " + strFormatFile + " Error Message :" + ex.Message.ToString(); + throw new Exception(funImpEQPTestData_UploadFileRet); + } + finally + { + if (r != null) + r.Close(); + if (fs != null) + fs.Close(); + } + + // 88576 [SEMI_Wafer] EAP 整合接口 LogFile_Send 測試資料匯入調整 Edison 2021/03/04 + // ============================================== 88576 Start ============================================== + if ((strWaferIDPos ?? "") == defString || intColumnStart == defInteger || (strDataStartPos ?? "") == defString) + { + funImpEQPTestData_UploadFileRet = "請確認機台格式檔案設定是否正確(WaferID、ColumnsStart、DataStart)!!"; + throw new Exception(funImpEQPTestData_UploadFileRet); + } + + if (!Information.IsNumeric(strWaferIDPos)) + { + // ex: -,2,3-9 表示以"-"分隔, 取第2個Part的第3到第9個字元 + string[] aryWaferID, aryChar; + aryWaferID = Strings.Split(strWaferIDPos, ","); + if (aryWaferID.Length != 3) + { + funImpEQPTestData_UploadFileRet = "請確認機台格式檔案設定是否正確(WaferID)"; + throw new Exception(funImpEQPTestData_UploadFileRet); + } + aryChar = aryWaferID[2].Split('-'); + if (aryChar.Length != 2) + { + funImpEQPTestData_UploadFileRet = "請確認機台格式檔案設定是否正確(WaferID)"; + throw new Exception(funImpEQPTestData_UploadFileRet); + } + if (!Information.IsNumeric(aryChar[0]) || !Information.IsNumeric(aryChar[0])) + { + funImpEQPTestData_UploadFileRet = "請確認機台格式檔案設定是否正確(WaferID)"; + throw new Exception(funImpEQPTestData_UploadFileRet); + } + if (Operators.CompareString(aryChar[0], aryChar[1], false) > 0) + { + funImpEQPTestData_UploadFileRet = "請確認機台格式檔案設定是否正確(WaferID)"; + throw new Exception(funImpEQPTestData_UploadFileRet); + } + } + // ============================================== 88576 End ============================================== + + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dr["StoreRawData"], 1, false))) + { + // 格式檔路徑: SourcePath & 格式檔名稱 + strRawFormatFile = Conversions.ToString(strSourcePath + dr["RawFFName"]); + + try + { + var scrFile = new FileInfo(strRawFormatFile); + fs = new FileStream(strRawFormatFile, FileMode.Open); + r = new StreamReader(fs, Encoding.Default); + + // 1.先讀取原始數據格式檔 + if (scrFile.Exists == false) + { + funImpEQPTestData_UploadFileRet = "請確認機台原始數據格式檔案是否存在!!"; + throw new Exception(funImpEQPTestData_UploadFileRet); + } + else + { + // 解析RawData格式檔 + // 測試項目TestRecipeNo==>位置 + while (r.Peek() > -1) + { + strTemp = r.ReadLine(); + strReadLine = Strings.Split(Strings.Trim(strTemp), "=>>"); + if (!string.IsNullOrEmpty(strReadLine[0].ToUpper())) + { + drFormat = dtRawScript.NewRow(); + drFormat["TestRecipeNo"] = strReadLine[0].ToUpper(); + drFormat["ColPosition"] = Conversion.Val(strReadLine[1]); + drFormat["FileNameFormat"] = dr["FileNameFormat"]; // 用以對應是咬到哪個FileNameFormat + dtRawScript.Rows.Add(drFormat); + } + } + } + } + catch (Exception ex) + { + funImpEQPTestData_UploadFileRet = "原始數據格式檔解析失敗! " + strRawFormatFile + " Error Message :" + ex.Message.ToString(); + throw new Exception(funImpEQPTestData_UploadFileRet); + } + finally + { + if (r != null) + r.Close(); + if (fs != null) + fs.Close(); + } + } + + } // Next of For Each dr As DataRow In dtFormatFile.Rows + + // //目錄不存在時必須要先建立 + if (Directory.Exists(strQueuePath) == false) + { + Directory.CreateDirectory(strQueuePath); + } + + drSel = dsTemp.Tables["UploadFile"].Select("EquipmentNo = '" + strEquipmentNo + "'"); + + foreach (DataRow drUploadFile in drSel) + { + // 將檔案Copy到Source目錄 + try + { + if (drUploadFile["FileFormat"].ToString() != "6") + { + // 2021/7/13 '如果queue裡面已經有相同檔名的檔案,這次就跳過不處理,然後記一筆 Log 說明那個檔案因為已經有相同檔名的檔案,還沒處理完,所以這次不處理 + strSQL = "Select FILENAME from TBLMESAUTOLOADERFILESTATE Where FILENAME='" + Path.GetFileName(Conversions.ToString(drUploadFile["FilePath"])) + "'"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + // 保留最新LOG + strSQL = Conversions.ToString("Select EQUIPMENTNO from TBLWIPCONT_UPLOADFILELOG Where EQUIPMENTNO = '" + + drUploadFile["EquipmentNo"] + "' and SequenceNo = '" + drUploadFile["SequenceNo"] + "'"); + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + strSQL = Conversions.ToString("delete from TBLWIPCONT_UPLOADFILELOG Where EQUIPMENTNO = '" + + drUploadFile["EquipmentNo"] + "' and SequenceNo = '" + drUploadFile["SequenceNo"] + "'"); + CollectionSQL.Add(strSQL); + } + drTemp.Close(); + //cmmTemp.Dispose(); + // 成功資料寫入Log + strSQL = Conversions.ToString(@"Insert into TBLWIPCONT_UPLOADFILELOG + (EQUIPMENTNO, LOTNO, FILEPATH, RESULT, SUMMARYTABLENAME, + PSNO, LOGGROUPSERIAL, ComponentNo,CREATOR, CREATEDATE, READFILEDATE, + SEQUENCENO, TESTRECIPETYPE, FILEFORMAT,TransactionID,WaferLot,WaferId,Description,BatchID)Select EQUIPMENTNO, LOTNO, FILEPATH, RESULT, SUMMARYTABLENAME, + PSNO, LOGGROUPSERIAL, ComponentNo,CREATOR, CREATEDATE, READFILEDATE, + SEQUENCENO, TESTRECIPETYPE, FILEFORMAT,TransactionID,WaferLot,WaferId,'已有相同檔名的檔案尚未處理完畢',BatchID From TBLWIPCONT_UPLOADFILE Where EQUIPMENTNO = '" + + drUploadFile["EquipmentNo"] + "' and SequenceNo = '" + drUploadFile["SequenceNo"] + "'"); + CollectionSQL.Add(strSQL); + // 再將tblWIPCont_UploadFile資料表中的紀錄予以刪除 + strSQL = Conversions.ToString("Delete from TBLWIPCONT_UPLOADFILE Where EQUIPMENTNO = '" + + drUploadFile["EquipmentNo"] + "' and SequenceNo = '" + drUploadFile["SequenceNo"] + "'"); + CollectionSQL.Add(strSQL); + + string argstrDatabaseType2 = Conversions.ToString(DataBaseType); + ExecuteSQLNoneQuery_UPD(argstrDatabaseType2, strConnectionString, CollectionSQL); + + CollectionSQL.Clear(); + continue; + } + drTemp.Close(); + //cmmTemp.Dispose(); + } + blnMoveFile = true; + File.Copy(Conversions.ToString(drUploadFile["FilePath"]), strSourcePath + Path.GetFileName(Conversions.ToString(drUploadFile["FilePath"]))); + } + catch (Exception ex) + { + blnMoveFile = false; + funImpEQPTestData_UploadFileRet = ex.Message; + // 保留最新LOG + strSQL = Conversions.ToString("Select EQUIPMENTNO from TBLWIPCONT_UPLOADFILELOG Where EQUIPMENTNO = '" + + drUploadFile["EquipmentNo"] + "' and SequenceNo = '" + drUploadFile["SequenceNo"] + "'"); + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + strSQL = Conversions.ToString("delete from TBLWIPCONT_UPLOADFILELOG Where EQUIPMENTNO = '" + + drUploadFile["EquipmentNo"] + "' and SequenceNo = '" + drUploadFile["SequenceNo"] + "'"); + CollectionSQL.Add(strSQL); + } + drTemp.Close(); + //cmmTemp.Dispose(); + // 成功資料寫入Log + strSQL = Conversions.ToString(@"Insert into TBLWIPCONT_UPLOADFILELOG + (EQUIPMENTNO, LOTNO, FILEPATH, RESULT, SUMMARYTABLENAME, + PSNO, LOGGROUPSERIAL, ComponentNo,CREATOR, CREATEDATE, READFILEDATE, + SEQUENCENO, TESTRECIPETYPE, FILEFORMAT,TransactionID,WaferLot,WaferId,Description,BatchID)Select EQUIPMENTNO, LOTNO, FILEPATH, RESULT, SUMMARYTABLENAME, + PSNO, LOGGROUPSERIAL, ComponentNo,CREATOR, CREATEDATE, READFILEDATE, + SEQUENCENO, TESTRECIPETYPE, FILEFORMAT,TransactionID,WaferLot,WaferId,Description,BatchID From TBLWIPCONT_UPLOADFILE Where EQUIPMENTNO = '" + + drUploadFile["EquipmentNo"] + "' and SequenceNo = '" + drUploadFile["SequenceNo"] + "'"); + CollectionSQL.Add(strSQL); + // 再將tblWIPCont_UploadFile資料表中的紀錄予以刪除 + strSQL = Conversions.ToString("Delete from TBLWIPCONT_UPLOADFILE Where EQUIPMENTNO = '" + + drUploadFile["EquipmentNo"] + "' and SequenceNo = '" + drUploadFile["SequenceNo"] + "'"); + CollectionSQL.Add(strSQL); + + string argstrDatabaseType1 = Conversions.ToString(DataBaseType); + ExecuteSQLNoneQuery_UPD(argstrDatabaseType1, strConnectionString, CollectionSQL); + + CollectionSQL.Clear(); + FileName = ""; + throw new Exception(funImpEQPTestData_UploadFileRet); + // Throw New System.Exception("此執行程序已中止,由另一執行程序處理中!!") + } + + object aryFile = Directory.GetFiles(strSourcePath); + DataTable dtFName; + string strTmpFName; + + dtFName = null; + dtFName = new DataTable("FName"); + dtFName.Columns.Add("FName", Type.GetType("System.String")); // FileName去除副檔名 + + dvFormatFile = dtFormatFile.DefaultView; + + Array.Sort((Array)aryFile); + + // 2.迴圈Raw Data資料讀取 + foreach (string fn in (IEnumerable)aryFile) // fn為FileName + { + try + { + var fi = new FileInfo(fn); + // If File.Exists(fn) = True AndAlso dtFormatFile.Select("FFName = '" & fi.Name & "'").Length = 0 Then '此檔案存在且不為格式檔(格式檔名會存在dtFormatFile.FFName中) + if (File.Exists(fn) == true && (fn ?? "") == (strSourcePath + Path.GetFileName(Conversions.ToString(drUploadFile["FilePath"])) ?? "")) // 鎖定只解析drUploadFile("FilePath")的檔案 + { + FileName = fn; + + // 依檔名找到符合的格式檔 + // 符合以長度大的優先 + blnFound = false; + strExtName = Strings.Right(fi.Name, fi.Name.Length - fi.Name.LastIndexOf(".")); // 副檔名 + strTmpFName = Strings.Mid(fi.Name, 1, fi.Name.Length - strExtName.Length); // 去除副檔名的檔名 + + dtFName.Clear(); + drAdd = dtFName.NewRow(); + drAdd["FName"] = strTmpFName; + dtFName.Rows.Add(drAdd); + + // 副檔名需與格式檔副檔名相符 + dvFormatFile.RowFilter = "ExtName = '" + strExtName + "'"; + dvFormatFile.Sort = "FFLength Desc"; + for (int i = 0, loopTo2 = dvFormatFile.Count - 1; i <= loopTo2; i++) + { + if (dtFName.Select(Conversions.ToString("FName Like '" + dvFormatFile[i]["FName"] + "'")).Length > 0) + { + blnFound = true; + string strFormat = Conversions.ToString(dvFormatFile[i]["FFName"]); + FormatFile2 = Conversions.ToString(dvFormatFile[i]["FileNameFormat"]); + if (!(dtFormat_Postion == null)) + { + if (dtFormat_Postion.Rows.Count > 0) + { + var loopTo3 = dtFormat_Postion.Rows.Count - 1; + for (h = 0; h <= loopTo3; h++) + { + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtFormat_Postion.Rows[h]["FileName"], strFormat, false))) + { + dtFormat_Postion.Rows[h]["AssignFile"] = 1; + } + else + { + dtFormat_Postion.Rows[h]["AssignFile"] = 0; + } + } + } + } + } + + if (blnFound == true) + { + intItemNo = Conversions.ToInteger(dvFormatFile[i]["ItemNo"]); + // 88576 [SEMI_Wafer] EAP 整合接口 LogFile_Send 測試資料匯入調整 Edison 2021/03/04 + // ============================================== 88576 Start ============================================== + intItemNo = Conversions.ToInteger(dvFormatFile[i]["ItemNo"]); + strWaferIDPos = Conversions.ToString(Interaction.IIf(dvFormatFile[i]["strWaferIDPos"] is DBNull, defString, dvFormatFile[i]["strWaferIDPos"])); + intTestDate = Conversions.ToInteger(Interaction.IIf(dvFormatFile[i]["intTestDate"] is DBNull, defInteger, dvFormatFile[i]["intTestDate"])); + intEquipmentNo = Conversions.ToInteger(Interaction.IIf(dvFormatFile[i]["intEquipmentNo"] is DBNull, defInteger, dvFormatFile[i]["intEquipmentNo"])); + intWaferSize = Conversions.ToInteger(Interaction.IIf(dvFormatFile[i]["intWaferSize"] is DBNull, defInteger, dvFormatFile[i]["intWaferSize"])); + intThickNess = Conversions.ToInteger(Interaction.IIf(dvFormatFile[i]["intThickNess"] is DBNull, defInteger, dvFormatFile[i]["intThickNess"])); + intProgramNo = Conversions.ToInteger(Interaction.IIf(dvFormatFile[i]["intProgramNo"] is DBNull, defInteger, dvFormatFile[i]["intProgramNo"])); + intColumnStart = Conversions.ToInteger(Interaction.IIf(dvFormatFile[i]["intColumnStart"] is DBNull, defInteger, dvFormatFile[i]["intColumnStart"])); + strDataStartPos = Conversions.ToString(Interaction.IIf(dvFormatFile[i]["strDataStartPos"] is DBNull, defInteger, dvFormatFile[i]["strDataStartPos"])); + strMatchFFName = Conversions.ToString(dvFormatFile[i]["FileNameFormat"]); + // intD_ComponentNo = IIf(IsDBNull(dvFormatFile(i)("intD_ComponentNo")), defInteger, dvFormatFile(i)("intD_ComponentNo")) + intD_LotNo = Conversions.ToString(Interaction.IIf(dvFormatFile[i]["intD_LotNo"] is DBNull, defInteger, dvFormatFile[i]["intD_LotNo"])); + strLotNumber = Conversions.ToString(Interaction.IIf(dvFormatFile[i]["LotNumber"] is DBNull, defInteger, dvFormatFile[i]["LotNumber"])); + strRecipe = Conversions.ToString(Interaction.IIf(dvFormatFile[i]["Recipe"] is DBNull, defInteger, dvFormatFile[i]["Recipe"])); + strBinFileName = Conversions.ToString(Interaction.IIf(dvFormatFile[i]["BinFileName"] is DBNull, defInteger, dvFormatFile[i]["BinFileName"])); + strOperator = Conversions.ToString(Interaction.IIf(dvFormatFile[i]["Operator"] is DBNull, defInteger, dvFormatFile[i]["Operator"])); + strTotalScan = Conversions.ToString(Interaction.IIf(dvFormatFile[i]["TotalScan"] is DBNull, defInteger, dvFormatFile[i]["TotalScan"])); + strTotalTested = Conversions.ToString(Interaction.IIf(dvFormatFile[i]["TotalTested"] is DBNull, defInteger, dvFormatFile[i]["TotalTested"])); + strTestCondition = Conversions.ToString(Interaction.IIf(dvFormatFile[i]["Test_Condition"] is DBNull, defInteger, dvFormatFile[i]["Test_Condition"])); + strCalData = Conversions.ToString(Interaction.IIf(dvFormatFile[i]["CalData"] is DBNull, defInteger, dvFormatFile[i]["CalData"])); + strMatchFFName = Conversions.ToString(dvFormatFile[i]["FileNameFormat"]); + + // '表頭分隔字元,固定":" + // strMSplitSign = ":" + // '明細分隔字元, 固定為"," + // strDSplitSign = "," + // 表頭分隔字元, 沒設定預設為":" + + if (dvFormatFile[i]["MSplitSign"] is DBNull) + { + strMSplitSign = ":"; + } + else + { + strMSplitSign = dvFormatFile[i]["MSplitSign"].ToString(); + if (strMSplitSign.ToUpper() == "TAB") + { + strMSplitSign = Constants.vbTab; + } + } + + // 明細分隔字元, 沒設定預設為"," + if (dvFormatFile[i]["DSplitSign"] is DBNull) + { + strDSplitSign = ","; + } + else + { + strDSplitSign = dvFormatFile[i]["DSplitSign"].ToString(); + if (strDSplitSign.ToUpper() == "TAB") + { + strDSplitSign = Constants.vbTab; + } + } + // ============================================== 88576 End ============================================== + + if (dvFormatFile[i]["StoreRawData"].ToString() == "1") + { + blnStoreRawData = true; + } + else + { + blnStoreRawData = false; + } + + if (dvFormatFile[i]["BatchFormat"].ToString() == "1") + { + blnBatchFormat = true; + } + else + { + blnBatchFormat = false; + } + + // 91733: [SEMI_Wafer] AutoLoader 廠內設備電性值匯入,支援可不收集電性測試資料, 只收集 Raw Data + if (dvFormatFile[i]["intSummaryCollect"].ToString() == "1") + { + blnSummaryCollect = true; + } + else + { + blnSummaryCollect = false; + } + + break; + } + } + + if (blnFound == false) + { + funImpEQPTestData_UploadFileRet = "檔案: " + fi.Name + " 找不到符合檔名的格式檔!"; + throw new Exception(funImpEQPTestData_UploadFileRet); + } + + // //移動檔案Source至Queue + try + { + blnMoveFile = true; + File.Move(fn, strQueuePath + Path.GetFileName(fn)); + } + catch (Exception ex) + { + blnMoveFile = false; + funImpEQPTestData_UploadFileRet = ex.Message; + throw new Exception(funImpEQPTestData_UploadFileRet); + // Throw New System.Exception("此執行程序已中止,由另一執行程序處理中!!") + } + + if (blnBatchFormat == true) // 多批格式 + { + try + { + // //將檔案來源改為Queue + FileName = strQueuePath + Path.GetFileName(fn); + int TotalRows = 0; // 記錄總比數 + // 解析檔案存入tblWIPEQP_EDC_TestRecipeType + if (fuBatchFormatToEQPEDC(drUploadFile["TestRecipeType"].ToString(), FileName, strMSplitSign, strDSplitSign, strEquipmentNo, Conversions.ToInteger(intD_LotNo), intColumnStart, strDataStartPos, fi.Name.ToString(), lngSplitRecordsLimit, true, Conversions.ToString(drUploadFile["SequenceNo"])) == false) + { + throw new Exception(); + } + } + + catch (Exception ex) + { + funImpEQPTestData_UploadFileRet = "依格式檔案定義解析資料存入EQPEDC資料表失敗: " + ex.Message; + throw new Exception(funImpEQPTestData_UploadFileRet); + } + } + + else + { + int TotalRows = 0; // 記錄總比數 + if (drUploadFile["FileFormat"].ToString() == "6") // 只處理ssummary + { + if (blnSummaryCollect) + { + try + { + // //將檔案來源改為Queue + FileName = strQueuePath + Path.GetFileName(fn); + // 2.2依照格式檔案定義計算存入MES TestSummary 資料表 + // 88576 [SEMI_Wafer] EAP 整合接口 LogFile_Send 測試資料匯入調整 Edison 2021/03/04 + // ============================================== 88576 Start ============================================== + string FilenameTmp = fi.Name.ToString(); + FileInfo fInfo = new FileInfo(FileName); + if (AddTestSummary_Format6(aryFormula[intItemNo], drUploadFile["PSNo"].ToString(), + drUploadFile["LogGroupSerial"].ToString(), FileName, strMSplitSign, + strDSplitSign, strWaferIDPos, intTestDate, intEquipmentNo, + intWaferSize, intThickNess, intProgramNo, intColumnStart, + strDataStartPos, ref aryWaferInfo, strEquipmentNo, drUploadFile["LotNo"].ToString(), + FilenameTmp, ref strTmpTableName, blnStoreRawData, ref dtRawData, + FileName, (int)fInfo.Length, drUploadFile["SequenceNo"].ToString(), + dtFormat_Postion, TotalRows, drUploadFile["TESTRECIPETYPE"].ToString()) == false) + { + throw new System.Exception(); + } + + } + // ============================================== 88576 Start ============================================== + + catch (Exception ex) + { + funImpEQPTestData_UploadFileRet = "格式檔案定義計算存入MES TestSummary 資料表失敗: " + ex.Message; + throw new Exception(funImpEQPTestData_UploadFileRet); + } + + } + } + else + { + try + { + // //將檔案來源改為Queue + FileName = strQueuePath + Path.GetFileName(fn); + // 2.1解析Raw Data 存入TempTable做資料備查 + if (Microsoft.VisualBasic.FileSystem.FileLen(FileName) <= lngSplitFileSize) + { + string FileNameTmp = fi.Name.ToString(); + if (fuRawDataToTempTable_EQP_UploadFile(FileName, strMSplitSign, strDSplitSign, + strWaferIDPos, intTestDate, intEquipmentNo, intWaferSize, intThickNess, + intProgramNo, intColumnStart, strDataStartPos, ref aryWaferInfo, + strEquipmentNo, drUploadFile["LotNo"].ToString(), FileNameTmp, ref strTmpTableName, + blnStoreRawData, ref dtRawData, ref TotalRows, dtFormat_Postion, FormatFile2) == false) + { + throw new System.Exception(); + } + } + else + { + string FileNameTmp = fi.Name.ToString(); + FileInfo fInfo = new FileInfo(FileName); + if (fuRawDataToTempTable_EQP_UploadFile_BigFile(FileName, strMSplitSign, + strDSplitSign, strWaferIDPos, intTestDate, intEquipmentNo, intWaferSize, + intThickNess, intProgramNo, intColumnStart, strDataStartPos, + ref aryWaferInfo, strEquipmentNo, drUploadFile["LotNo"].ToString(), FileNameTmp, + lngSplitRecordsLimit, ref strTmpTableName, blnStoreRawData, ref dtRawData, + strJobNo, strJobFunction, FileName, (int)fInfo.Length, + drUploadFile["SequenceNo"].ToString(), ref blnSplitPartialSuccess, ref TotalRows, + dtFormat_Postion, FormatFile: FormatFile2) == false) + { + throw new System.Exception(); + } + } + } + + catch (Exception ex) + { + funImpEQPTestData_UploadFileRet = "解析Raw Data 存入TempTable做資料備查失敗: " + ex.Message; + if (blnSplitPartialSuccess) + { + blnNotMoveToFail = true; + } + throw new Exception(funImpEQPTestData_UploadFileRet); + } + + // 91733: [SEMI_Wafer] AutoLoader 廠內設備電性值匯入,支援可不收集電性測試資料, 只收集 Raw Data + if (blnSummaryCollect) + { + try + { + // 2.2依照格式檔案定義計算存入MES TestSummary 資料表 + // 88576 [SEMI_Wafer] EAP 整合接口 LogFile_Send 測試資料匯入調整 Edison 2021/03/04 + // ============================================== 88576 Start ============================================== + if (fuLEDDataSummary_EQP_UploadFile(drUploadFile["TESTRECIPETYPE"].ToString(), aryFormula[intItemNo], aryWaferInfo, strEquipmentNo, Conversions.ToString(drUploadFile["LotNo"]), + Conversions.ToString(drUploadFile["PSNo"]), Conversions.ToString(drUploadFile["LogGroupSerial"]), Conversions.ToDate(drUploadFile["CreateDate"]), fi.Name.ToString(), + strTmpTableName, blnStoreRawData, Conversions.ToString(drUploadFile["SequenceNo"]), dtFormat_Postion, drUploadFile["Creator"].ToString(), (int)Microsoft.VisualBasic.FileSystem.FileLen(FileName), TotalRows) == false) + { + throw new Exception(); + } + } + // ============================================== 88576 Start ============================================== + + catch (Exception ex) + { + funImpEQPTestData_UploadFileRet = "格式檔案定義計算存入MES TestSummary 資料表失敗: " + ex.Message; + throw new Exception(funImpEQPTestData_UploadFileRet); + } + + } + + // 要儲存原始數據 + if (blnStoreRawData) + { + try + { + // 儲存RawData + if (fuStoreRawData_EQP(drUploadFile["TESTRECIPETYPE"].ToString(), aryWaferInfo, strEquipmentNo, fi.Name.ToString(), strMatchFFName, ref dtRawScript, strTmpTableName, ref dtRawData) == false) + { + throw new Exception(); + } + } + catch (Exception ex) + { + funImpEQPTestData_UploadFileRet = "依格式檔定義存入原始數據失敗: " + ex.Message; + throw new Exception(funImpEQPTestData_UploadFileRet); + } + } + } + } + + // //目錄不存在時必須要先建立 + if (Directory.Exists(strDestinationPath + DirName) == false) + { + Directory.CreateDirectory(strDestinationPath + DirName); + } + // //檔案已存在Destination必須先刪除 + if (File.Exists(strDestinationPath + DirName + @"\" + Path.GetFileName(FileName)) == true) + { + File.Delete(strDestinationPath + DirName + @"\" + Path.GetFileName(FileName)); + } + // //移動檔案Queue至Destination + File.Move(FileName, strDestinationPath + DirName + @"\" + Path.GetFileName(FileName)); + // 保留最新LOG + strSQL = Conversions.ToString("Select EQUIPMENTNO from TBLWIPCONT_UPLOADFILELOG Where EQUIPMENTNO = '" + + drUploadFile["EquipmentNo"] + "' and SequenceNo = '" + drUploadFile["SequenceNo"] + "'"); + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + strSQL = Conversions.ToString("delete from TBLWIPCONT_UPLOADFILELOG Where EQUIPMENTNO = '" + + drUploadFile["EquipmentNo"] + "' and SequenceNo = '" + drUploadFile["SequenceNo"] + "'"); + CollectionSQL.Add(strSQL); + } + drTemp.Close(); + //cmmTemp.Dispose(); + // 成功資料寫入Log + strSQL = Conversions.ToString(@"Insert into TBLWIPCONT_UPLOADFILELOG + (EQUIPMENTNO, LOTNO, FILEPATH, RESULT, SUMMARYTABLENAME, + PSNO, LOGGROUPSERIAL, ComponentNo,CREATOR, CREATEDATE, READFILEDATE, + SEQUENCENO, TESTRECIPETYPE, FILEFORMAT,TransactionID,WaferLot,WaferId,Description,BatchID)Select EQUIPMENTNO, LOTNO, FILEPATH, RESULT, SUMMARYTABLENAME, + PSNO, LOGGROUPSERIAL, ComponentNo,CREATOR, CREATEDATE, READFILEDATE, + SEQUENCENO, TESTRECIPETYPE, FILEFORMAT,TransactionID,WaferLot,WaferId,Description,BatchID From TBLWIPCONT_UPLOADFILE Where EQUIPMENTNO = '" + + drUploadFile["EquipmentNo"] + "' and SequenceNo = '" + drUploadFile["SequenceNo"] + "'"); + CollectionSQL.Add(strSQL); + // 再將tblWIPCont_UploadFile資料表中的紀錄予以刪除 + strSQL = Conversions.ToString("Delete from TBLWIPCONT_UPLOADFILE Where EQUIPMENTNO = '" + + drUploadFile["EquipmentNo"] + "' and SequenceNo = '" + drUploadFile["SequenceNo"] + "'"); + CollectionSQL.Add(strSQL); + + string argstrDatabaseType3 = Conversions.ToString(DataBaseType); + ExecuteSQLNoneQuery_UPD(argstrDatabaseType3, strConnectionString, CollectionSQL); + + CollectionSQL.Clear(); + FileName = ""; + } + } + + catch (Exception ex) + { + // //檔案處理失敗時移動檔案至Fail + if (!string.IsNullOrEmpty(FileName)) + { + // //目錄不存在時必須要先建立 + if (Directory.Exists(strFailPath + DirName) == false) + { + Directory.CreateDirectory(strFailPath + DirName); + } + // //檔案已存在File必須先刪除 + if (File.Exists(strFailPath + DirName + @"\" + Path.GetFileName(FileName)) == true) + { + File.Delete(strFailPath + DirName + @"\" + Path.GetFileName(FileName)); + } + // //移動檔案至Fail + try + { + // 2021/5/12 Steven 當有分包成功寫入DB的檔案,不需移動至fail + if (blnNotMoveToFail == false) + File.Move(FileName, strFailPath + DirName + @"\" + Path.GetFileName(FileName)); + blnNotMoveToFail = false; + } + catch (Exception ex1) + { + } + + // 記錄錯誤的FileName + strFailLog = strFailLog + "[" + Path.GetFileName(FileName) + "][" + ex.Message + "]" + Constants.vbCrLf; + + // 更新tblWIPCont_UploadFile.Result = -1 (Fail) + + // 88995: [6.0.5] EAP 整合接口 LogFile_Send PK重複問題調整 + // strSQL = "Update tblWIPCont_UploadFile Set Result = -1 Where EquipmentNo = '" & drUploadFile("EquipmentNo") & "'" & + // " And CreateDate = To_Date('" & Format(drUploadFile("CreateDate"), "yyyy/MM/dd H:mm:ss") & "','YYYY/MM/DD HH24:MI:SS')" + strSQL = Conversions.ToString("Update tblWIPCont_UploadFile Set Result = -1,Description = '" + strFailLog.Replace("'", "''") + "',CreateDate = To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),READFILEDATE = To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') Where EquipmentNo = '" + + drUploadFile["EquipmentNo"] + "'" + " And SequenceNo = '" + drUploadFile["SequenceNo"] + "' "); + CollectionSQL.Add(strSQL); + + // 分包失敗會一直寫入log 故保留最新的一次LOG + strSQL = Conversions.ToString("Select EQUIPMENTNO from TBLWIPCONT_UPLOADFILELOG Where EQUIPMENTNO = '" + + drUploadFile["EquipmentNo"] + "' and SequenceNo = '" + drUploadFile["SequenceNo"] + "'"); + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + strSQL = Conversions.ToString("delete from TBLWIPCONT_UPLOADFILELOG Where EQUIPMENTNO = '" + + drUploadFile["EquipmentNo"] + "' and SequenceNo = '" + drUploadFile["SequenceNo"] + "'"); + CollectionSQL.Add(strSQL); + } + drTemp.Close(); + //cmmTemp.Dispose(); + // 失敗資料寫入Log + strSQL = Conversions.ToString(@"Insert into TBLWIPCONT_UPLOADFILELOG + (EQUIPMENTNO, LOTNO, FILEPATH, RESULT, SUMMARYTABLENAME, + PSNO, LOGGROUPSERIAL, ComponentNo,CREATOR, CREATEDATE, READFILEDATE, + SEQUENCENO, TESTRECIPETYPE, FILEFORMAT,TransactionID,WaferLot,WaferId,Description,BatchID)Select EQUIPMENTNO, LOTNO, FILEPATH, RESULT, SUMMARYTABLENAME, + PSNO, LOGGROUPSERIAL,ComponentNo, CREATOR, CREATEDATE, READFILEDATE, + SEQUENCENO, TESTRECIPETYPE, FILEFORMAT,TransactionID,WaferLot,WaferId,'" + strFailLog.Replace("'", "''") + "',BatchID From TBLWIPCONT_UPLOADFILE Where EQUIPMENTNO = '" + + drUploadFile["EquipmentNo"] + "' and SequenceNo = '" + drUploadFile["SequenceNo"] + "'"); + CollectionSQL.Add(strSQL); + // 再將tblWIPCont_UploadFile資料表中的紀錄予以刪除 + strSQL = Conversions.ToString("Delete from TBLWIPCONT_UPLOADFILE Where EQUIPMENTNO = '" + + drUploadFile["EquipmentNo"] + "' and SequenceNo = '" + drUploadFile["SequenceNo"] + "'"); + CollectionSQL.Add(strSQL); + // Call ExecuteSQLNoneQuery(DataBaseType, strConnectionString, strSQL) + string argstrDatabaseType1 = Conversions.ToString(DataBaseType); + ExecuteSQLNoneQuery_UPD(argstrDatabaseType1, strConnectionString, CollectionSQL); + CollectionSQL.Clear(); + FileName = ""; + } + + // 一個檔案失敗繼續讀取下個檔案 + continue; + + } + } // Next of For Each drUploadFile in drSel + } // Next of For Each fn As String In aryFile + // 將此設備的格式檔自目錄中刪除 + foreach (DataRow drFormatFile in dtFormatFile.Rows) + { + if (File.Exists(Conversions.ToString(strSourcePath + drFormatFile["FFName"])) == true) + { + File.Delete(Conversions.ToString(strSourcePath + drFormatFile["FFName"])); + } + } + } // Next of For Each drEQP + + funImpEQPTestData_UploadFileRet = "success"; + } + + catch (Exception e1) + { + + strFailLog = strFailLog + "[" + e1.Message + "]" + Constants.vbCrLf; + } + + // 2019/8/12,Ning, 已改在上面的Loop中處理檔案移動至Fail目錄 + // //檔案處理失敗時移動檔案Queue至Fail + // If FileName <> String.Empty AndAlso blnMoveFile = True Then + // '//目錄不存在時必須要先建立 + // If My.Computer.FileSystem.DirectoryExists(strFailPath & DirName) = False Then + // My.Computer.FileSystem.CreateDirectory(strFailPath & DirName) + // End If + // '//檔案已存在File必須先刪除 + // If File.Exists(strFailPath & DirName & "\" & Path.GetFileName(FileName)) = True Then + // File.Delete(strFailPath & DirName & "\" & Path.GetFileName(FileName)) + // End If + // '//移動檔案Queue至Fail + // Try + // File.Move(FileName, strFailPath & DirName & "\" & Path.GetFileName(FileName)) + // Catch ex1 As Exception + // End Try + // End If + // //回傳錯誤原因 + // funImpEQPTestData_UploadFile = "[JobNo:" & strJobNo & "][FunctionNo:funImpEQPTestData_UploadFile][FileName:" & Path.GetFileName(FileName) & "][" & e1.Message & ",StackTrace:" & e1.StackTrace & "]" + + finally + { + + CloseConnection(cnnTemp); + if (!(drTemp == null)) + drTemp.Close(); + //if (!(cmmTemp == null)) + // cmmTemp.Dispose(); + if (r != null) + r.Close(); + if (fs != null) + fs.Close(); + GC.Collect(); + + if (!string.IsNullOrEmpty(strFailLog)) + { + funImpEQPTestData_UploadFileRet = "[JobNo:" + strJobNo + "][FunctionNo:funImpEQPTestData_UploadFile]" + strFailLog; + } + // 若設定管理群組或群組人員,如果失敗,需要寄送mail + if ((strEQPGroupNo ?? "") != defString && !string.IsNullOrEmpty(strFailLog)) + { + string argFileName = "N/A"; + string argEmailSubject = "設備TestSummary執行失敗"; + modAutoLoaderLibrary.SendMultiEmail(ref argFileName, ref argEmailSubject, funImpEQPTestData_UploadFileRet, strEQPGroupNo, GroupType: modAutoLoaderLibrary.GroupType.EquipmentGroup); + } + + // 將此設備的格式檔與原始數據格式檔自目錄中刪除 + if (dtFormatFile != null) + { + foreach (DataRow drFormatFile in dtFormatFile.Rows) + { + if (File.Exists(Conversions.ToString(strSourcePath + drFormatFile["FFName"])) == true) + { + File.Delete(Conversions.ToString(strSourcePath + drFormatFile["FFName"])); + } + if (File.Exists(Conversions.ToString(strSourcePath + drFormatFile["RawFFName"])) == true) + { + File.Delete(Conversions.ToString(strSourcePath + drFormatFile["RawFFName"])); + } + } + } + + } + + return funImpEQPTestData_UploadFileRet; + + } + + #endregion + + + #region 20230601 Function + + private bool fuTestDataToTestSum_MTL(string strTestRecipeType, string pFilePath, string PSNo, string strMSplitSign, string strDSplitSign, int intMTLNo, int intMTLLotNo, int intVendorNo, int intComponentLotNo, int intD_MTLNo, int intD_MTLLotNo, int intD_ComponentNo, int intD_SlotNo, int intD_CompLotNo, int intD_LaserMark, int intD_CassetteNo, int intEquipmentNo, int intWaferSize, int intThickness, int intColumnStart, int intDataStart, string InventoryNo, string FileName, DataTable dtFormat_Postion = null) + { + + bool blnResult; + var objReader = default(StreamReader); + // 2019/3/26, Ning, 加入Encode, 排除中文亂碼問題 + // Dim encode As System.Text.Encoding = System.Text.Encoding.GetEncoding("UTF-8") + var encode = Encoding.Default; + string strLine; + + string strMTLNo = default(string), strMTLLotNo = default(string), strVendorNo = default(string), strCompLotNo = default(string), strD_MTLNo, strD_MTLLotNo, strD_CompLotNo, strD_SlotNo, strD_LaserMark, strD_CassetteNo; + string strComponentNo; + var strEquipmentNo = default(string); + var strWaferSize = default(string); + var strThickness = default(string); + + string[] aryTemp; + var dtData = default(DataTable); + DataTable dtFixData; // 存固定參數的欄位值 + short i; + short z; + bool blnDataAdd = false; + string strOrgColName, strColumnName; + DataRow drAdd; + DataRow drAddFix; + string strSQL, strTableName, strSQLAddField, strSQLAddValue; + var CollectionSQL = new Collection(); + + IDbConnection cnnTemp = default(IDbConnection); + DbDataReader drTemp; + + string TestRecipeType; + string strLogTableName, strSQLHead, strSQLLogHead; + //System.Data.OleDb.OleDbDataAdapter daTemp; + DataTable dtTestRecipe; + DataSet dsTemp; + DateTime datEventTime; + + // 開立進料單 + DataView dvFixData; + DataRow[] drSel; + DataTable dtMTLInDetail; + string strMaterialInNo, strUnitNo; + bool blnFound; + var IniCollectionSQL = new Collection(); + var FinalCollectionSQL = new Collection(); + decimal decSafeQty; + + // 2020/1/9,Ning,排除庫房編號 + var strExcludeINVNo = default(string); + string[] strSplit; + bool blnExcludeINV; + var dtNotFixData = new DataTable("NotFixData"); // 0088935: [SEMI_Wafer] AutoLoader測試資料動態參數收集優化_AutoLoader 電性值匯入調整 + // 存進非參數資料 + dtNotFixData.Columns.Add("Column_NotFix", Type.GetType("System.String")); + dtNotFixData.Columns.Add("Value_NotFix", Type.GetType("System.String")); + DataRow drNotFix; + dtFixData = new DataTable("NotFixData"); + try + { + // //Create connection + cnnTemp = CreateConnection(strConnectionString); + + blnResult = false; + + // 2021/4/19, Ning, 若AutoLoaderJob.xml的Parameter3有定義TestRecipeType, 則以該值為優先, 若沒有定再以下述方式找TestRecipeType + if ((strTestRecipeType ?? "") != defString) + { + TestRecipeType = strTestRecipeType; + } + else + { + // 來料只會有一種測試類別, 取得TestRecipeBasis中TestRecipeClass = 1的TestRecipeType即是來料的測試類別 + // 2019/9/9,Ning,來料可能有多種測試類別, 但一個區段只會有一個 + strSQL = "Select TestRecipeType From tblSYSTestRecipeBasis Where TestRecipeClass = 1 And IssueState = 2 And PSNo = '" + PSNo + "'"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + TestRecipeType = Conversions.ToString(drTemp["TestRecipeType"]); + } + else + { + throw new Exception("解析檔案失敗, 無法找到分類為來料, 區段為: " + PSNo + " 之測試類別!"); + } + drTemp.Close(); + //cmmTemp.Dispose(); + } + + // 電性值資料表名稱: tblWIPTestSum_測試類別 + strTableName = "TBLWIPTESTSUM_" + TestRecipeType; + strLogTableName = "TBLWIPTESTSUMLOG_" + TestRecipeType; + + // 依測試類別找出其TestRecipeNo(參數編號), ConversionField(欄位名稱) + strSQL = "Select TestRecipeNo, ConversionField From tblSYSTestRecipeBasis Where IssueState = 2 And TestRecipeType = '" + TestRecipeType + "'"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp); + dsTemp = new DataSet(); + //daTemp.Fill(dsTemp, "TestRecipe"); + ExecuteSQLQuery_Adapter(strSQL, dsTemp, "TestRecipe", cnnTemp); + dtTestRecipe = dsTemp.Tables["TestRecipe"]; + + + // 解檔 + objReader = new StreamReader(pFilePath, encode); + // 先讀取第一列, 再以第一列的編碼方式讀檔 + strLine = objReader.ReadLine().Trim(); + encode = objReader.CurrentEncoding; + objReader.Close(); + objReader = null; + objReader = new StreamReader(pFilePath, encode); + + int x = 0; + + while (!objReader.EndOfStream) + { + x = x + 1; + + strLine = objReader.ReadLine().Trim(); + if (strLine != null && !string.IsNullOrEmpty(strLine.Trim())) + { + + if (x == intMTLNo) // 1.取得MTLNo + { + // 2019/2/22, Ning, 以傳入的表頭分隔字元拆解 + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + strMTLNo = aryTemp[1].ToString().Trim(); + if (string.IsNullOrEmpty(strMTLNo)) + { + throw new Exception("無法取得MaterialNo!!"); + } + } + else + { + throw new Exception("不支援此檔案格式,格式內容資料解析需為" + strMSplitSign); + } + } + + if (x == intMTLLotNo) // 2.取得MTLLotNo + { + // 2019/2/22, Ning, 以傳入的表頭分隔字元拆解 + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + strMTLLotNo = aryTemp[1].ToString().Trim(); + if (string.IsNullOrEmpty(strMTLLotNo)) + { + throw new Exception("無法取得MaterialLotNo!!"); + } + } + else + { + throw new Exception("不支援此檔案格式,格式內容資料解析需為" + strMSplitSign); + } + } + + if (x == intVendorNo) // 3.取得VendorNo + { + // 2019/2/22, Ning, 以傳入的表頭分隔字元拆解 + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + strVendorNo = aryTemp[1].ToString().Trim(); + if (string.IsNullOrEmpty(strVendorNo)) + { + throw new Exception("無法取得VendorNo!!"); + } + } + else + { + throw new Exception("不支援此檔案格式,格式內容資料解析需為" + strMSplitSign); + } + } + + if (x == intComponentLotNo) // 3.5取得ComponentLotNo + { + // 2019/2/22, Ning, 以傳入的表頭分隔字元拆解 + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + strCompLotNo = aryTemp[1].ToString().Trim(); + if (string.IsNullOrEmpty(strCompLotNo)) + { + throw new Exception("無法取得ComponentLotNo!!"); + } + } + else + { + throw new Exception("不支援此檔案格式,格式內容資料解析需為" + strMSplitSign); + } + } + + if (x == intEquipmentNo) // 4.取得EquipmentNo + { + // 2019/2/22, Ning, 以傳入的表頭分隔字元拆解 + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + strEquipmentNo = aryTemp[1].ToString().Trim(); + } + else + { + throw new Exception("不支援此檔案格式,格式內容資料解析需為" + strMSplitSign); + } + } + + if (x == intWaferSize) // 5.取得Wafer尺寸 + { + // 2019/2/22, Ning, 以傳入的表頭分隔字元拆解 + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + strWaferSize = aryTemp[1].ToString().Trim(); + } + else + { + throw new Exception("不支援此檔案格式,格式內容資料解析需為" + strMSplitSign); + } + } + + if (x == intThickness) // 6.取得厚度 + { + // 2019/2/22, Ning, 以傳入的表頭分隔字元拆解 + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + strThickness = aryTemp[1].ToString().Trim(); + } + else + { + throw new Exception("不支援此檔案格式,格式內容資料解析需為" + strMSplitSign); + } + } + // 2021/3/12 Steevn Mantis: 0088935: [SEMI_Wafer] AutoLoader測試資料動態參數收集優化_AutoLoader 電性值匯入調整 + // 依照格式檔設定的欄位名語位置在讀EXCEL檔時找到相對的欄位並記錄值 + if (!(dtFormat_Postion == null)) + { + if (dtFormat_Postion.Rows.Count > 0) + { + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + var loopTo = (short)(dtFormat_Postion.Rows.Count - 1); + for (i = 0; i <= loopTo; i++) + { + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(x, dtFormat_Postion.Rows[i]["ColumnPosition"], false))) + { + if (aryTemp.Count() > 2) // EX: Folder:D:\TFS\Industry\v5\Dev_SEMI_Wafer\MESClient\:111 + { + var loopTo1 = (short)(aryTemp.Count() - 1); + for (z = 1; z <= loopTo1; z++) + { + if (z == aryTemp.Count() - 1) + { + dtFormat_Postion.Rows[i]["Value"] += aryTemp[z].ToString().Trim(); + } + else + { + dtFormat_Postion.Rows[i]["Value"] += aryTemp[z].ToString().Trim() + strMSplitSign; + } + } + } + else + { + dtFormat_Postion.Rows[i]["Value"] = aryTemp[1].ToString().Trim(); + } + } + } + } + } + if (x == intColumnStart) // 取得欄位名稱 + { + + try + { + dtData = new DataTable("CSVData"); + dtFixData = new DataTable("FixData"); + + // 2019/2/22,Ning明細以strDSplitSign分隔 + // 若結尾為strDSplitSign則去掉 + if (strLine.EndsWith(strDSplitSign)) + { + strLine = strLine.TrimEnd(Conversions.ToChar(strDSplitSign)); + } + + aryTemp = strLine.Split(Conversions.ToChar(strDSplitSign)); + + drAdd = dtData.NewRow(); + var loopTo2 = (short)(aryTemp.Length - 1); + for (i = 0; i <= loopTo2; i++) + { + // 新增 Column + if (dtData.Columns.Count <= i) + { + + // 2019/3/22,Ning,先以原始欄位存入, 後端再判斷是否為固定參數的位置 + + strColumnName = aryTemp[i].ToString().ToUpper().Trim(); + //2023/10/13,Ning,147871: [Industry_Base] 來料匯入功能的欄位轉換方式邏輯調整 + bool blnMustConvert = false; + if (char.IsLetter(Conversions.ToChar(strColumnName.Substring(0, 1)))) + { + for (int jj = 0, loopTo1 = strColumnName.Length - 1; jj <= loopTo1; jj++) + { + if (!char.IsNumber(Conversions.ToChar(strColumnName.Substring(jj, 1))) && !char.IsLetter(Conversions.ToChar(strColumnName.Substring(jj, 1))) && strColumnName.Substring(jj, 1) != "_") + { + blnMustConvert = true; + break; + } + } + } + else + { + blnMustConvert = true; + } + if (blnMustConvert) + { + strSQL = "Select ConversionField From tblSYSFieldConvertBasis where DocumentField = '" + strColumnName.ToUpper() + "'"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + strColumnName = Conversions.ToString(drTemp["ConversionField"]); + } + drTemp.Close(); + //cmmTemp.Dispose(); + } + + drSel = dtTestRecipe.Select("TestRecipeNo = '" + strColumnName + "'"); + if (drSel.Length > 0) + { + //strColumnName = drSel[0]["ConversionField"].ToString(); + } + else + { + // 欄位名稱只能是數字或英文字母, 這兩者除外的皆以_取代 + for (int jj = 0, loopTo3 = strColumnName.Length - 1; jj <= loopTo3; jj++) + { + if (!char.IsNumber(Conversions.ToChar(strColumnName.Substring(jj, 1))) && !char.IsLetter(Conversions.ToChar(strColumnName.Substring(jj, 1)))) + { + strColumnName = Strings.Replace(strColumnName, strColumnName.Substring(jj, 1), "_"); + } + } + + if (string.IsNullOrEmpty(strColumnName)) + { + strColumnName = "COL" + i; + } + + // 判斷取代後的欄位是否已存在,若已存在則於欄位後方加COL+欄位顯示順序 + if (dtData.Columns.Contains(strColumnName)) + { + strColumnName = strColumnName + "COL" + i; + } + } + + dtData.Columns.Add(strColumnName.ToUpper(), Type.GetType("System.String")); + + // 明細固定參數, D_MTLNo, D_MTLLotNo, D_ComponentNo, D_SlotNo, D_ComponentLotNo, D_LaserMark, D_CassetteNo + if (i + 1 == intD_MTLNo) + { + strColumnName = "D_MTLNo"; + dtFixData.Columns.Add(strColumnName, Type.GetType("System.String")); + } + if (i + 1 == intD_MTLLotNo) + { + strColumnName = "D_MTLLotNo"; + dtFixData.Columns.Add(strColumnName, Type.GetType("System.String")); + } + if (i + 1 == intD_ComponentNo) + { + strColumnName = "D_ComponentNo"; + dtFixData.Columns.Add(strColumnName, Type.GetType("System.String")); + } + if (i + 1 == intD_SlotNo) + { + strColumnName = "D_SlotNo"; + dtFixData.Columns.Add(strColumnName, Type.GetType("System.String")); + } + if (i + 1 == intD_CompLotNo) + { + strColumnName = "D_ComponentLotNo"; + dtFixData.Columns.Add(strColumnName, Type.GetType("System.String")); + } + if (i + 1 == intD_LaserMark) + { + strColumnName = "D_LaserMark"; + dtFixData.Columns.Add(strColumnName, Type.GetType("System.String")); + } + if (i + 1 == intD_CassetteNo) + { + strColumnName = "D_CassetteNo"; + dtFixData.Columns.Add(strColumnName, Type.GetType("System.String")); + } + } + } + } + + catch + { + throw; + } + } + + if (x == intDataStart || blnDataAdd == true) // 取得明細資料 + { + + blnDataAdd = true; + try + { + aryTemp = strLine.Split(Conversions.ToChar(strDSplitSign)); + + drAdd = dtData.NewRow(); + drAddFix = dtFixData.NewRow(); + // 填入資料 + var loopTo4 = (short)(dtData.Columns.Count - 1); + for (i = 0; i <= loopTo4; i++) + { + drAdd[i] = Strings.Trim(aryTemp[i]); + if (i + 1 == intD_MTLNo) + { + drAddFix["D_MTLNo"] = Strings.Trim(aryTemp[i]); + } + if (i + 1 == intD_MTLLotNo) + { + drAddFix["D_MTLLotNo"] = Strings.UCase(Strings.Trim(aryTemp[i])); + } + if (i + 1 == intD_ComponentNo) + { + drAddFix["D_ComponentNo"] = Strings.Trim(aryTemp[i]); + } + if (i + 1 == intD_SlotNo) + { + drAddFix["D_SlotNo"] = Strings.Trim(aryTemp[i]); + } + if (i + 1 == intD_CompLotNo) + { + drAddFix["D_ComponentLotNo"] = Strings.Trim(aryTemp[i]); + } + if (i + 1 == intD_LaserMark) + { + drAddFix["D_LaserMark"] = Strings.Trim(aryTemp[i]); + } + if (i + 1 == intD_CassetteNo) + { + drAddFix["D_Cassetteno"] = Strings.Trim(aryTemp[i]); + } + } + dtData.Rows.Add(drAdd); + dtFixData.Rows.Add(drAddFix); + } + catch (Exception ex) + { + throw; + } + } + + } + } + + objReader.Close(); + + // TestSum, TestSumLog存入DB + if (!dtFixData.Columns.Contains("D_ComponentNo")) + { + throw new Exception("無法取得ComponentNo!!"); + } + if (!(dtFormat_Postion == null)) + { + if (dtFormat_Postion.Rows.Count > 0) + { + for (int j = 0, loopTo5 = dtFormat_Postion.Rows.Count - 1; j <= loopTo5; j++) + { + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtFormat_Postion.Rows[j]["AssignFile"], 1, false))) + { + dtData.Columns.Add(dtFormat_Postion.Rows[j]["ColumnName"].ToString(), Type.GetType("System.String")); + } + } + } + } + foreach (DataColumn column in dtData.Columns) + { + if (dtFormat_Postion.Rows.Count > 0) + { + for (int idx = 0, loopTo6 = dtFormat_Postion.Rows.Count - 1; idx <= loopTo6; idx++) + { + if ((column.ColumnName ?? "") == (dtFormat_Postion.Rows[idx]["ColumnName"].ToString() ?? "")) + { + for (int k = 0, loopTo7 = dtData.Rows.Count - 1; k <= loopTo7; k++) + dtData.Rows[k][dtFormat_Postion.Rows[idx]["ColumnName"].ToString()] = dtFormat_Postion.Rows[idx]["Value"].ToString(); + } + } + } + } + datEventTime = DateTime.Now; + + // 2020/1/9,Ning,取得系統參數ExcludeInventoryCalCompRule(排除的庫房編號) + strSQL = "Select ParameterValue From tblSysParameter Where ParameterType = 'SysInfo' And ParameterNo = 'ExcludeInventoryCalCompRule'"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + strExcludeINVNo = drTemp["ParameterValue"].ToString(); + } + drTemp.Close(); + //cmmTemp.Dispose(); + + blnExcludeINV = false; + if (!string.IsNullOrEmpty(strExcludeINVNo)) + { + strSplit = strExcludeINVNo.Split(','); + foreach (string strINVNo in strSplit) + { + if ((strINVNo.Trim() ?? "") == (InventoryNo ?? "")) + { + blnExcludeINV = true; + break; + } + } + } + + // 取得進料單號 + // 2019/9/17,Ning,進料單若取有問題, 拋出錯誤訊息, 不繼續執行 + strMaterialInNo = funGetMaterialInNo(true); + + for (int idx = 0, loopTo8 = dtData.Rows.Count - 1; idx <= loopTo8; idx++) + { + // 2022/7/22,Ning,MTLNo,MTLLotNo明細與表頭只會有一個有值 + // 若明細沒有供應商料號, 用表頭資料取代 + if (dtFixData.Columns.Contains("D_MTLNo")) + { + strD_MTLNo = dtFixData.Rows[idx]["D_MTLNo"].ToString(); + } + else + { + strD_MTLNo = strMTLNo; + } + // 若明細沒有供應商物料批號, 用表頭資料取代 + if (dtFixData.Columns.Contains("D_MTLLotNo")) + { + strD_MTLLotNo = dtFixData.Rows[idx]["D_MTLLotNo"].ToString(); + } + else + { + strD_MTLLotNo = strMTLLotNo; + } + + if (string.IsNullOrEmpty(strD_MTLNo)) + { + throw new Exception("MaterialNo不可為空白!"); + } + // 2019/3/28,Ning,MaterialNo必須存在物料主檔中 + strSQL = "Select MaterialNo From tblMTLMaterialBasis Where IssueState = 2 And MaterialNo = '" + strD_MTLNo + "'"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (!drTemp.Read()) + { + throw new Exception("MaterialNo不存在於物料主檔中!"); + } + drTemp.Close(); + //cmmTemp.Dispose(); + // 2021/7/22,Ning,若有供應商, 則這筆物料必須有此供應商 + if (!string.IsNullOrEmpty(strVendorNo)) + { + strSQL = "Select MaterialNo From tblMTLMaterialVendorMap Where MaterialNo = '" + strD_MTLNo + "' And VendorNo = '" + strVendorNo + "'"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (!drTemp.Read()) + { + throw new Exception("物料: " + strD_MTLNo + " 未設定供應商: " + strVendorNo); + } + drTemp.Close(); + //cmmTemp.Dispose(); + } + if (string.IsNullOrEmpty(strD_MTLLotNo)) + { + throw new Exception("MaterialLotNo不可為空白!"); + } + if (dtFixData.Columns.Contains("D_SlotNo")) + { + strD_SlotNo = dtFixData.Rows[idx]["D_SlotNo"].ToString(); + } + else + { + strD_SlotNo = ""; + } + // 若明細沒有元件批號, 用表頭資料取代 + if (dtFixData.Columns.Contains("D_ComponentLotNo")) + { + strD_CompLotNo = dtFixData.Rows[idx]["D_ComponentLotNo"].ToString(); + } + else + { + strD_CompLotNo = strCompLotNo; + } + // 當ComponentLotNo與D_ComponentLotNo皆未設定時, ComponentLotNo = MaterialLotNo + if (intComponentLotNo <= 0 && dtFixData.Columns.Contains("D_ComponentLotNo") == false) + { + strD_CompLotNo = strD_MTLLotNo; + } + if (dtFixData.Columns.Contains("D_LaserMark")) + { + strD_LaserMark = dtFixData.Rows[idx]["D_LaserMark"].ToString(); + } + else + { + strD_LaserMark = ""; + } + if (dtFixData.Columns.Contains("D_CassetteNo")) + { + strD_CassetteNo = dtFixData.Rows[idx]["D_CassetteNo"].ToString(); + } + else + { + strD_CassetteNo = ""; + } + // tblWIPTestSum刪除已存在資料, 只保留最新一次資料 + strSQL = "Delete From " + strTableName + " Where MaterialNo = '" + strD_MTLNo + "' And MaterialLotNo = '" + strD_MTLLotNo + "' And UPPER(ComponentNo) = '" + dtFixData.Rows[idx]["D_ComponentNo"].ToString().ToUpper() + "'"; + CollectionSQL.Add(strSQL); + + // //新增TestSummary, TestSummaryLog + // strSQLAddField = "Insert into " & strTableName & " (" + strSQLHead = "Insert into " + strTableName + " ("; + strSQLLogHead = "Insert into " + strLogTableName + " ("; + strSQLAddValue = " Values ("; + + // 固定欄位 + strSQLAddField = "MaterialNo, MaterialLotNo, ComponentNo, VendorMaterialNo, FileName, ImportUserNo, ImportDate,"; + strSQLAddValue = strSQLAddValue + "'" + strD_MTLNo + "','" + strD_MTLLotNo + "','" + dtFixData.Rows[idx]["D_ComponentNo"].ToString().ToUpper() + "','" + strD_MTLNo + "','" + FileName + "'," + " 'AutoRun', To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),"; + + bool blnD_EquipmentNo, blnD_WaferSize, blnD_Thickness; // 明細是否有動態表頭欄位, 有的話以明細為準 + blnD_EquipmentNo = false; + blnD_WaferSize = false; + blnD_Thickness = false; + // 動態欄位(明細欄位) + for (int w = 0, loopTo9 = dtData.Columns.Count - 1; w <= loopTo9; w++) + { + strColumnName = dtData.Columns[w].ColumnName; + // If strColumnName = "D_MTLNo" OrElse strColumnName = "D_MTLLotNo" OrElse strColumnName = "D_COMPONENTNO" _ + // OrElse strColumnName = "D_SLOTNO" OrElse strColumnName = "D_COMPONENTLOTNO" OrElse strColumnName = "D_LASERMARK" Then + // Continue For + // End If + + // TestRecipeBasis有定義此欄位才需要存入, 欄位名稱已轉換為ConversionField + drSel = dtTestRecipe.Select("ConversionField = '" + strColumnName + "'"); + if (drSel.Length > 0) + { + strSQLAddField = strSQLAddField + strColumnName + ","; + strSQLAddValue = strSQLAddValue + "'" + dtData.Rows[idx][strColumnName].ToString() + "',"; + + if (strColumnName.ToUpper() == "EQUIPMENTNO") + { + blnD_EquipmentNo = true; + } + if (strColumnName.ToUpper() == "WAFERSIZE") + { + blnD_WaferSize = true; + } + if (strColumnName.ToUpper() == "THICKNESS") + { + blnD_Thickness = true; + } + } + } + + // 動態欄位(表頭欄位) + // 2019/5/22, Ning, 若明細沒有, 才以表頭的值填入 + if (!blnD_EquipmentNo && dtTestRecipe.Select("TestRecipeNo = 'EquipmentNo'").Length > 0) + { + strSQLAddField = strSQLAddField + "EquipmentNo,"; + strSQLAddValue = strSQLAddValue + "'" + strEquipmentNo + "',"; + } + if (!blnD_WaferSize && dtTestRecipe.Select("TestRecipeNo = 'WaferSize'").Length > 0) + { + strSQLAddField = strSQLAddField + "WaferSize,"; + strSQLAddValue = strSQLAddValue + "'" + strWaferSize + "',"; + } + if (!blnD_Thickness && dtTestRecipe.Select("TestRecipeNo = 'Thickness'").Length > 0) + { + strSQLAddField = strSQLAddField + "Thickness,"; + strSQLAddValue = strSQLAddValue + "'" + strThickness + "',"; + } + + if (Strings.InStr(1, strSQLAddField, ",") != 0) // 刪除最後一個"," + { + if (Strings.Right(strSQLAddField, 1) == ",") + { + strSQLAddField = Strings.Mid(strSQLAddField, 1, Strings.Len(strSQLAddField) - 1); + } + } + + if (Strings.InStr(1, strSQLAddValue, ",") != 0) // 刪除最後一個"," + { + if (Strings.Right(strSQLAddValue, 1) == ",") + { + strSQLAddValue = Strings.Mid(strSQLAddValue, 1, Strings.Len(strSQLAddValue) - 1); + } + } + + // 直接給定strSQL + strSQL = strSQLHead + strSQLAddField + ")" + strSQLAddValue + ")"; + CollectionSQL.Add(strSQL); + + // Log SQL + strSQL = strSQLLogHead + strSQLAddField + ")" + strSQLAddValue + ")"; + CollectionSQL.Add(strSQL); + + //2023/9/15,Ning,华芯振邦相同MATERIALNO允许汇入相同Compoentno + strSQL = "Select MaterialNo ,MaterialLotNo ,ComponentNo From " + strTableName + " Where UPPER(ComponentNo) = '" + dtFixData.Rows[idx]["D_ComponentNo"].ToString().ToUpper() + "' and MaterialNo = '" + strD_MTLNo + "' and MaterialLotNo ='" + strD_MTLLotNo + "'"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + throw new Exception(Conversions.ToString("MaterialNo: " + strD_MTLNo + ", MaterialLotNo: " + strD_MTLLotNo + ", WaferID: " + dtFixData.Rows[idx]["D_ComponentNo"] + " 已匯入, 不允許重新匯入!")); + } + drTemp.Close(); + //cmmTemp.Dispose(); + + // 進料單Component + strSQL = "Insert into tblINVMaterialInComponent (MaterialInNo, MaterialNo, MaterialLotNo, ComponentNo, SlotNo)" + " Values ('" + strMaterialInNo + "','" + strD_MTLNo + "','" + strD_MTLLotNo + "','" + dtFixData.Rows[idx]["D_ComponentNo"].ToString().ToUpper() + "', '" + strD_SlotNo + "')"; + CollectionSQL.Add(strSQL); + + // 原物料倉Component + // '2019/6/12, 依Josh指示, 同一ComponentNo在原物料倉不能有兩筆以上, 依ComponentNo先刪除再新增 + // 'strSQL = "Delete From tblINVRAWInventoryComponent Where ComponentNo = '" & dtFixData.Rows(idx)("D_ComponentNo") & "'" + // 'CollectionSQL.Add(strSQL) + // 2022/11/28,Ning, 071068: 來料檔案匯入, 若不同供應商有相同ComponentNo, 應如何匯入? => 以tblINVRAWInventoryComponent的PK(InventoryNo,MaterialNo,MaterialLotNo, 來檢查, 存在才不允許匯入 + //strSQL = "Select ComponentNo From tblINVRAWInventoryComponent Where InventoryNo = '" + InventoryNo + "' And MaterialNo = '" + strD_MTLNo + "'" + " And MaterialLotNo = '" + strD_MTLLotNo + "' And UPPER(ComponentNo) = '" + dtFixData.Rows[idx]["D_ComponentNo"].ToString().ToUpper() + "'"; + ////cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + //drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + //if (drTemp.Read()) + //{ + // throw new Exception(Conversions.ToString("InventoryNo: " + InventoryNo + ", MaterialNo: " + strD_MTLNo + ", MaterialLotNo: " + strD_MTLLotNo + ", WaferID: " + + // dtFixData.Rows[idx]["D_ComponentNo"] + " 已存在原料倉, 不允許匯入, 若要重新匯入要先做庫房出庫或刪除動作!")); + //} + //drTemp.Close(); + ////cmmTemp.Dispose(); + + strSQL = "Insert into tblINVRAWInventoryComponent (InventoryNo, MaterialNo, MaterialLotNo, ComponentNo, SlotNo, ComponentLotNo, S_LaserMark, B_CassetteNo)" + " Values ('" + InventoryNo + "','" + strD_MTLNo + "','" + strD_MTLLotNo + "','" + dtFixData.Rows[idx]["D_ComponentNo"].ToString().ToUpper() + "', '" + strD_SlotNo + "','" + strD_CompLotNo + "','" + strD_LaserMark + "','" + strD_CassetteNo + "')"; + CollectionSQL.Add(strSQL); + + // 2019/7/23, Ning, 將資料填入tblINVTemp_Component待AutoRun滾算芯片挑片規則, 原料庫InventoryType:0 + // 2019/10/17,Ning,因有可能已存在又重新入庫, 故先刪後增 + // 2020/1/9,Ning,非系統參數ExcludeInventoryCalCompRule中設定的庫房才需寫入tblINVTemp_Component中 + if (blnExcludeINV == false) // 不在排除的庫房內, 需加入tblINVTemp_Component + { + strSQL = "Delete From tblINVTemp_Component Where InventoryNo = '" + InventoryNo + "' And UPPER(ComponentNo) = '" + dtFixData.Rows[idx]["D_ComponentNo"].ToString().ToUpper() + "'"; + CollectionSQL.Add(strSQL); + strSQL = "Insert Into tblINVTemp_Component (InventoryNo, ComponentNo, InventoryType)" + " Values('" + InventoryNo + "','" + dtFixData.Rows[idx]["D_ComponentNo"].ToString().ToUpper() + "',0)"; + CollectionSQL.Add(strSQL); + } + } + + // 若為排除的庫房, 需填入EvnetLog備查 + if (blnExcludeINV == true) + { + strSQL = "Insert into tblSysEventLog (UserID, RecordDate, ServiceName, KeyField, KeyValue, ComputerName)" + " Values ('AutoRun', To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'), 'AutoLoaderLib'," + "'ExcludeInventoryNo','" + InventoryNo + "','" + modWIN.gComputerName + "')"; + CollectionSQL.Add(strSQL); + } + + // 進料單明細需以MaterialNo, MaterialLotNo做Group By計算數量 + dtMTLInDetail = new DataTable("MTLInDetail"); + dtMTLInDetail.Columns.Add("MaterialNo", Type.GetType("System.String")); + dtMTLInDetail.Columns.Add("MaterialLotNo", Type.GetType("System.String")); + dtMTLInDetail.Columns.Add("Qty", Type.GetType("System.Int16")); + if (!dtFixData.Columns.Contains("D_MTLNo")) + { + dtFixData.Columns.Add("D_MTLNo", Type.GetType("System.String")); + foreach (DataRow drFixData in dtFixData.Rows) + { + drFixData["D_MTLNO"] = strMTLNo; + } + } + if (!dtFixData.Columns.Contains("D_MTLLotNo")) + { + dtFixData.Columns.Add("D_MTLLotNo", Type.GetType("System.String")); + foreach (DataRow drFixData in dtFixData.Rows) + { + drFixData["D_MTLLotNo"] = strMTLLotNo; + } + } + dvFixData = dtFixData.DefaultView; + dvFixData.Sort = "D_MTLNo, D_MTLLotNo"; + var loopTo10 = (short)(dvFixData.Count - 1); + for (i = 0; i <= loopTo10; i++) + { + drSel = dtMTLInDetail.Select("MaterialNo = '" + dvFixData[i]["D_MTLNo"].ToString() + "' And MaterialLotNo = '" + dvFixData[i]["D_MTLLotNo"].ToString() + "'"); + if (drSel.Length > 0) + { + drSel[0].BeginEdit(); + drSel[0]["Qty"] = Operators.AddObject(drSel[0]["Qty"], 1); + drSel[0].EndEdit(); + } + else + { + drAdd = dtMTLInDetail.NewRow(); + drAdd["MaterialNo"] = dvFixData[i]["D_MTLNo"].ToString(); + drAdd["MaterialLotNo"] = dvFixData[i]["D_MTLLotNo"].ToString(); + drAdd["Qty"] = 1; + dtMTLInDetail.Rows.Add(drAdd); + } + } + + // 進料單主檔(State直接給2) + strSQL = "Insert into tblINVMaterialInBasis (MaterialInNo, InventoryNo, VendorNo, State, Creator, CreateDate, ConfirmDate)" + " Values ('" + strMaterialInNo + "','" + InventoryNo + "','" + strVendorNo + "', 2, 'AutoRun'," + " To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')," + "To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'))"; + CollectionSQL.Add(strSQL); + + foreach (DataRow drDetail in dtMTLInDetail.Rows) + { + + strSQL = Conversions.ToString("Select SafeQty,UnitNo From tblMTLMaterialBasis Where MaterialNo = '" + drDetail["MaterialNo"] + "'"); + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + if (!(drTemp["SafeQty"] is DBNull)) + { + decSafeQty = Conversions.ToDecimal(drTemp["SafeQty"]); + } + else + { + decSafeQty = 0m; + } + strUnitNo = Conversions.ToString(drTemp["UnitNo"]); + } + else + { + decSafeQty = 0m; + strUnitNo = "pcs"; + } + drTemp.Close(); + + // 進料單明細檔 + strSQL = Conversions.ToString("Insert into tblINVMaterialInDetail (MaterialInNo,MaterialNo,MaterialLotNo,LocatorNo,UnitNo,Qty,LimitTime)" + " Values ('" + strMaterialInNo + "','" + + drDetail["MaterialNo"] + "','" + drDetail["MaterialLotNo"] + "','N/A','" + strUnitNo + "'," + drDetail["Qty"] + ",0)"); + CollectionSQL.Add(strSQL); + + // 進料單確認(入庫) + // 處理原料倉現況主檔資料 + strSQL = Conversions.ToString("Select * From tblINVRawInventory Where InventoryNo = '" + InventoryNo + "' And MaterialNo = '" + + drDetail["MaterialNo"] + "'"); + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + // 數量相加 + strSQL = Conversions.ToString("Update tblINVRawInventory Set CurQty = CurQty + " + + drDetail["Qty"] + " Where InventoryNo = '" + InventoryNo + "'" + " And MaterialNo = '" + drDetail["MaterialNo"] + "'"); + CollectionSQL.Add(strSQL); + drTemp.Close(); + } + else // 找不到資料時一律先新增一筆CurrentQty=0的資料列,再做Update動作 + { + drTemp.Close(); + strSQL = Conversions.ToString("Insert into tblINVRawInventory (InventoryNo, MaterialNo, SafeQty, CurQty, AllocateQty, UnitNo)" + " Values ('" + InventoryNo + "','" + + drDetail["MaterialNo"] + "'," + decSafeQty + ", 0, 0,'" + strUnitNo + "')"); + + // 先確定之前沒有加過再加這筆資料 + blnFound = false; + var loopTo11 = (short)IniCollectionSQL.Count; + for (i = 1; i <= loopTo11; i++) + { + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(strSQL, IniCollectionSQL[i], false))) + { + blnFound = true; + } + } + if (!blnFound) + { + IniCollectionSQL.Add(strSQL); + } + + strSQL = Conversions.ToString("Update tblINVRawInventory Set CurQty = CurQty + " + + drDetail["Qty"] + " Where InventoryNo = '" + InventoryNo + "'" + " And MaterialNo = '" + drDetail["MaterialNo"] + "'"); + CollectionSQL.Add(strSQL); + } + + // 處理原料倉儲位現況資料 + strSQL = Conversions.ToString("Select * From tblINVRawInventoryLoc Where InventoryNo = '" + InventoryNo + "'" + " And LocatorNo = 'N/A' And MaterialNo = '" + + drDetail["MaterialNo"] + "'" + " And MaterialLotNo = '" + drDetail["MaterialLotNo"] + "'"); + + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + // 數量相加 + strSQL = Conversions.ToString("Update tblINVRawInventoryLoc Set LocQty = LocQty + " + + drDetail["Qty"] + "," + " InputDate = To_Date('" + Strings.Format(Conversions.ToDate(datEventTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')" + + " Where InventoryNo = '" + InventoryNo + "'" + " And LocatorNo = 'N/A' And MaterialNo = '" + drDetail["MaterialNo"] + "'" + " And MaterialLotNo = '" + + drDetail["MaterialLotNo"] + "'"); + CollectionSQL.Add(strSQL); + } + else + { + // 新增一筆 + strSQL = Conversions.ToString("Insert into tblINVRawInventoryLoc (InventoryNo, LocatorNo, MaterialNo, MaterialLotNo, VendorNo, LocQty, InputDate)" + " Values ('" + InventoryNo + "','N/A','" + + drDetail["MaterialNo"] + "','" + drDetail["MaterialLotNo"] + "','" + strVendorNo + "'," + drDetail["Qty"] + ", To_Date('" + Strings.Format(Conversions.ToDate(datEventTime), "yyyy/MM/dd H:mm:ss") + + "','YYYY/MM/DD HH24:MI:SS'))"); + CollectionSQL.Add(strSQL); + } + drTemp.Close(); + } + + var loopTo12 = (short)IniCollectionSQL.Count; + for (i = 1; i <= loopTo12; i++) + FinalCollectionSQL.Add(IniCollectionSQL[i]); + var loopTo13 = (short)CollectionSQL.Count; + for (i = 1; i <= loopTo13; i++) + FinalCollectionSQL.Add(CollectionSQL[i]); + + // //執行SQL指令 + string argstrDatabaseType = Conversions.ToString(DataBaseType); + ExecuteSQLNoneQuery_UPD(argstrDatabaseType, strConnectionString, FinalCollectionSQL); + + blnResult = true; + } + + catch (Exception ex) + { + throw; + } + + finally + { + if (objReader != null) + { + objReader.Close(); + objReader = null; + } + CloseConnection(cnnTemp); + aryTemp = null; + } + + return blnResult; + + } + + private bool fuTestDataToTestSum_MTL_Excel(string strTestRecipeType, string pFilePath, string PSNo, string strMSplitSign, string strDSplitSign, int intMTLNo, int intMTLLotNo, int intVendorNo, int intComponentLotNo, int intD_MTLNo, int intD_MTLLotNo, int intD_ComponentNo, int intD_SlotNo, int intD_CompLotNo, int intD_LaserMark, int intD_CassetteNo, int intEquipmentNo, int intWaferSize, int intThickness, int intColumnStart, int intDataStart, string InventoryNo, string FileName, DataTable dtFormat_Postion = null) + { + + bool blnResult; + var objReader = default(StreamReader); + // 2019/3/26, Ning, 加入Encode, 排除中文亂碼問題 + // Dim encode As System.Text.Encoding = System.Text.Encoding.GetEncoding("UTF-8") + var encode = Encoding.Default; + string strLine; + + string strMTLNo = default(string), strMTLLotNo = default(string), strVendorNo = default(string), strCompLotNo = default(string), strD_MTLNo, strD_MTLLotNo, strD_CompLotNo, strD_SlotNo, strD_LaserMark, strD_CassetteNo; + string strComponentNo; + var strEquipmentNo = default(string); + var strWaferSize = default(string); + var strThickness = default(string); + + string[] aryTemp; + var dtData = default(DataTable); + DataTable dtFixData; // 存固定參數的欄位值 + short i; + short z; + bool blnDataAdd = false; + string strOrgColName, strColumnName; + DataRow drAdd; + DataRow drAddFix; + string strSQL, strTableName, strSQLAddField, strSQLAddValue; + var CollectionSQL = new Collection(); + + IDbConnection cnnTemp = default(IDbConnection); + DbDataReader drTemp; + + string TestRecipeType; + string strLogTableName, strSQLHead, strSQLLogHead; + //System.Data.OleDb.OleDbDataAdapter daTemp; + DataTable dtTestRecipe; + DataSet dsTemp; + DateTime datEventTime; + + // 開立進料單 + DataView dvFixData; + DataRow[] drSel; + DataTable dtMTLInDetail; + string strMaterialInNo, strUnitNo; + bool blnFound; + var IniCollectionSQL = new Collection(); + var FinalCollectionSQL = new Collection(); + decimal decSafeQty; + + // 2020/1/9,Ning,排除庫房編號 + var strExcludeINVNo = default(string); + string[] strSplit; + bool blnExcludeINV; + var dtNotFixData = new DataTable("NotFixData"); // 0088935: [SEMI_Wafer] AutoLoader測試資料動態參數收集優化_AutoLoader 電性值匯入調整 + // 存進非參數資料 + dtNotFixData.Columns.Add("Column_NotFix", Type.GetType("System.String")); + dtNotFixData.Columns.Add("Value_NotFix", Type.GetType("System.String")); + DataRow drNotFix; + dtFixData = new DataTable("NotFixData"); + + + DataSet dsExcel; + string strMsg = ""; + int sheetIndex = 0; + int colIndex = 0; + XSSFRow detailrow; + + try + { + // //Create connection + cnnTemp = CreateConnection(strConnectionString); + + blnResult = false; + + // 2021/4/19, Ning, 若AutoLoaderJob.xml的Parameter3有定義TestRecipeType, 則以該值為優先, 若沒有定再以下述方式找TestRecipeType + if ((strTestRecipeType ?? "") != defString) + { + TestRecipeType = strTestRecipeType; + } + else + { + // 來料只會有一種測試類別, 取得TestRecipeBasis中TestRecipeClass = 1的TestRecipeType即是來料的測試類別 + // 2019/9/9,Ning,來料可能有多種測試類別, 但一個區段只會有一個 + strSQL = "Select TestRecipeType From tblSYSTestRecipeBasis Where TestRecipeClass = 1 And IssueState = 2 And PSNo = '" + PSNo + "'"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + TestRecipeType = Conversions.ToString(drTemp["TestRecipeType"]); + } + else + { + throw new Exception("解析檔案失敗, 無法找到分類為來料, 區段為: " + PSNo + " 之測試類別!"); + } + drTemp.Close(); + //cmmTemp.Dispose(); + } + + // 電性值資料表名稱: tblWIPTestSum_測試類別 + strTableName = "TBLWIPTESTSUM_" + TestRecipeType; + strLogTableName = "TBLWIPTESTSUMLOG_" + TestRecipeType; + + // 依測試類別找出其TestRecipeNo(參數編號), ConversionField(欄位名稱) + strSQL = "Select TestRecipeNo, ConversionField From tblSYSTestRecipeBasis Where IssueState = 2 And TestRecipeType = '" + TestRecipeType + "'"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp); + dsTemp = new DataSet(); + //daTemp.Fill(dsTemp, "TestRecipe"); + ExecuteSQLQuery_Adapter(strSQL, dsTemp, "TestRecipe", cnnTemp); + dtTestRecipe = dsTemp.Tables["TestRecipe"]; + + + var file = new FileStream(pFilePath, FileMode.Open); + var workbook = WorkbookFactory.Create(file); + file.Close(); + + dsExcel = new DataSet(); + // 為每個WorkSheet建立出一個table + + // 只需取第1個Sheet + sheetIndex = 0; + var sheet = workbook.GetSheetAt(sheetIndex); + // 建立一個新的table + var dtNew = dsExcel.Tables.Add(workbook.GetSheetName(sheetIndex)); + var excelRow = sheet.GetRow(0); + ICell excelCell; + HSSFFormulaEvaluator formulaEvaluator = null; + + + if (excelRow != null) + { + int x = 0; + while (x <= sheet.LastRowNum) + { + excelRow = sheet.GetRow(x); + x += 1; + + if (excelRow == null) + { + continue; + } + + string strVal = ""; + + bool blFixData = false; + if (x == intMTLNo) // 1.取得VendorMTLNo + { + // 2019/2/22, Ning, 以傳入的表頭分隔字元拆解 + + excelCell = excelRow.GetCell(0); // 第一個儲存格 + strVal = ""; + if (excelCell != null) + { + funGetCellValue(excelCell, sheet, workbook, ref strVal); + } + + aryTemp = strVal.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + + strMTLNo = aryTemp[1].ToString().Trim(); + blFixData = true; + if (string.IsNullOrEmpty(strMTLNo)) + { + throw new Exception("[%DO NOT GET VALUE%]:MaterialNo!!"); + } + } + else + { + throw new Exception("[%Not support this file format%],MaterialNo[%To Analyze data format need to%]" + strMSplitSign); + // Throw New System.Exception("不支援此檔案格式,格式內容資料解析需為:或=") + } + } + + if (x == intMTLLotNo) // 2.取得VendorMTLLotNo + { + // 2019/2/22, Ning, 以傳入的表頭分隔字元拆解 + excelCell = excelRow.GetCell(0); + strVal = ""; + if (excelCell != null) + { + funGetCellValue(excelCell, sheet, workbook, ref strVal); + } + + aryTemp = strVal.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + strMTLLotNo = aryTemp[1].ToString().Trim(); + blFixData = true; + if (string.IsNullOrEmpty(strMTLLotNo)) + { + throw new Exception("[%DO NOT GET VALUE%]:MaterialLotNo!!"); + } + } + else + { + throw new Exception("[%Not support this file format%],MaterialLotNo[%To Analyze data format need to%]" + strMSplitSign); + } + } + + if (x == intVendorNo) // 3.取得VendorNo + { + // 2019/2/22, Ning, 以傳入的表頭分隔字元拆解 + excelCell = excelRow.GetCell(0); + strVal = ""; + if (excelCell != null) + { + funGetCellValue(excelCell, sheet, workbook, ref strVal); + } + + aryTemp = strVal.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + strVendorNo = aryTemp[1].ToString().Trim(); + if (string.IsNullOrEmpty(strVendorNo)) + { + throw new Exception("無法取得VendorNo!!"); + } + } + else + { + throw new Exception("不支援此檔案格式,格式內容資料解析需為" + strMSplitSign); + } + } + + if (x == intComponentLotNo) // 3.5取得ComponentLotNo + { + // 2019/2/22, Ning, 以傳入的表頭分隔字元拆解 + excelCell = excelRow.GetCell(0); + strVal = ""; + if (excelCell != null) + { + funGetCellValue(excelCell, sheet, workbook, ref strVal); + } + + aryTemp = strVal.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + strCompLotNo = aryTemp[1].ToString().Trim(); + blFixData = true; + if (string.IsNullOrEmpty(strCompLotNo)) + { + throw new Exception("[%DO NOT GET VALUE%]:ComponentLotNo!!"); + } + } + else + { + throw new Exception("[%Not support this file format%],ComponentLotNo[%To Analyze data format need to%]" + strMSplitSign); + } + } + + if (x == intEquipmentNo) // 4.取得EquipmentNo + { + + // 2019/2/22, Ning, 以傳入的表頭分隔字元拆解 + excelCell = excelRow.GetCell(0); + strVal = ""; + if (excelCell != null) + { + funGetCellValue(excelCell, sheet, workbook, ref strVal); + } + + aryTemp = strVal.Split(Conversions.ToChar(strMSplitSign)); + + + if (aryTemp.Length > 1) + { + strEquipmentNo = aryTemp[1].ToString().Trim(); + blFixData = true; + } + else + { + throw new Exception("[%Not support this file format%],EquipmentNo[%To Analyze data format need to%]" + strMSplitSign); + } + } + + if (x == intWaferSize) // 5.取得Wafer尺寸 + { + + // 2019/2/22, Ning, 以傳入的表頭分隔字元拆解 + excelCell = excelRow.GetCell(0); + strVal = ""; + if (excelCell != null) + { + funGetCellValue(excelCell, sheet, workbook, ref strVal); + } + + aryTemp = strVal.Split(Conversions.ToChar(strMSplitSign)); + + + if (aryTemp.Length > 1) + { + strWaferSize = aryTemp[1].ToString().Trim(); + blFixData = true; + } + else + { + throw new Exception("[%Not support this file format%],WaferSize[%To Analyze data format need to%]" + strMSplitSign); + } + } + + if (x == intThickness) // 6.取得厚度 + { + // 2019/2/22, Ning, 以傳入的表頭分隔字元拆解 + excelCell = excelRow.GetCell(0); + strVal = ""; + if (excelCell != null) + { + funGetCellValue(excelCell, sheet, workbook, ref strVal); + } + + aryTemp = strVal.Split(Conversions.ToChar(strMSplitSign)); + + if (aryTemp.Length > 1) + { + strThickness = aryTemp[1].ToString().Trim(); + blFixData = true; + } + else + { + throw new Exception("[%Not support this file format%],Thickness[%To Analyze data format need to%]" + strMSplitSign); + } + } + // 2021/3/12 Steevn Mantis: 0088935: [SEMI_Wafer] AutoLoader測試資料動態參數收集優化_AutoLoader 電性值匯入調整 + // 依照格式檔設定的欄位名語位置在讀EXCEL檔時找到相對的欄位並記錄值 excelCell = excelRow.GetCell(x) + excelCell = excelRow.GetCell(0); + strVal = ""; + if (excelCell != null) + { + funGetCellValue(excelCell, sheet, workbook, ref strVal); + } + + aryTemp = strVal.Split(Conversions.ToChar(strMSplitSign)); + + if (!(dtFormat_Postion == null)) + { + if (dtFormat_Postion.Rows.Count > 0) + { + aryTemp = strVal.Split(Conversions.ToChar(strMSplitSign)); + var loopTo = (short)(dtFormat_Postion.Rows.Count - 1); + for (i = 0; i <= loopTo; i++) + { + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(x, dtFormat_Postion.Rows[i]["ColumnPosition"], false))) + { + if (aryTemp.Count() > 2) // EX: Folder:D:\TFS\Industry\v5\Dev_SEMI_Wafer\MESClient\:111 + { + for (int j = 1, loopTo1 = aryTemp.Count() - 1; j <= loopTo1; j++) + { + if (j == aryTemp.Count() - 1) + { + dtFormat_Postion.Rows[i]["Value"] += aryTemp[j].ToString().Trim(); + } + else + { + dtFormat_Postion.Rows[i]["Value"] += aryTemp[j].ToString().Trim() + strMSplitSign; + } + } + } + else + { + dtFormat_Postion.Rows[i]["Value"] = aryTemp[1].ToString().Trim(); + } + } + } + } + } + + if (x == intColumnStart) // 取得欄位名稱 + { + + try + { + + dtData = new DataTable("CSVData"); + dtFixData = new DataTable("FixData"); + drAdd = dtData.NewRow(); + var loopTo2 = excelRow.LastCellNum - 1; + for (colIndex = 0; colIndex <= loopTo2; colIndex++) + { + excelCell = excelRow.GetCell(colIndex); + strVal = ""; + if (excelCell != null) + { + funGetCellValue(excelCell, sheet, workbook, ref strVal); + } + + if (dtData.Columns.Count <= colIndex) + { + + // 2019/3/22,Ning,先以原始欄位存入, 後端再判斷是否為固定參數的位置 + + strColumnName = strVal.ToString().ToUpper().Trim(); + //2023/10/16,Ning,147871: [Industry_Base] 來料匯入功能的欄位轉換方式邏輯調整 + bool blnMustConvert = false; + if (char.IsLetter(Conversions.ToChar(strColumnName.Substring(0, 1)))) + { + for (int jj = 0, loopTo1 = strColumnName.Length - 1; jj <= loopTo1; jj++) + { + if (!char.IsNumber(Conversions.ToChar(strColumnName.Substring(jj, 1))) && !char.IsLetter(Conversions.ToChar(strColumnName.Substring(jj, 1))) && strColumnName.Substring(jj, 1) != "_") + { + blnMustConvert = true; + break; + } + } + } + else + { + blnMustConvert = true; + } + if (blnMustConvert) + { + strSQL = "Select ConversionField From tblSYSFieldConvertBasis where DocumentField = '" + strColumnName.ToUpper() + "'"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + strColumnName = Conversions.ToString(drTemp["ConversionField"]); + } + drTemp.Close(); + //cmmTemp.Dispose(); + } + + drSel = dtTestRecipe.Select("TestRecipeNo = '" + strColumnName + "'"); + if (drSel.Length > 0) + { + //strColumnName = drSel[0]["ConversionField"].ToString(); + } + else + { + // 欄位名稱只能是數字或英文字母, 這兩者除外的皆以_取代 + for (int jj = 0, loopTo3 = strColumnName.Length - 1; jj <= loopTo3; jj++) + { + if (!char.IsNumber(Conversions.ToChar(strColumnName.Substring(jj, 1))) && !char.IsLetter(Conversions.ToChar(strColumnName.Substring(jj, 1)))) + { + strColumnName = Strings.Replace(strColumnName, strColumnName.Substring(jj, 1), "_"); + } + } + + if (string.IsNullOrEmpty(strColumnName)) + { + strColumnName = "COL" + colIndex; + } + + // 判斷取代後的欄位是否已存在,若已存在則於欄位後方加COL+欄位顯示順序 + if (dtData.Columns.Contains(strColumnName)) + { + strColumnName = strColumnName + "COL" + colIndex; + } + } + + dtData.Columns.Add(strColumnName.ToUpper(), Type.GetType("System.String")); + + // 明細固定參數, D_MTLNo, D_MTLLotNo, D_ComponentNo, D_SlotNo, D_ComponentLotNo, D_LaserMark, D_CassetteNo + if (colIndex + 1 == intD_MTLNo) + { + strColumnName = "D_MTLNo"; + dtFixData.Columns.Add(strColumnName, Type.GetType("System.String")); + } + if (colIndex + 1 == intD_MTLLotNo) + { + strColumnName = "D_MTLLotNo"; + dtFixData.Columns.Add(strColumnName, Type.GetType("System.String")); + } + if (colIndex + 1 == intD_ComponentNo) + { + strColumnName = "D_ComponentNo"; + dtFixData.Columns.Add(strColumnName, Type.GetType("System.String")); + } + if (colIndex + 1 == intD_SlotNo) + { + strColumnName = "D_SlotNo"; + dtFixData.Columns.Add(strColumnName, Type.GetType("System.String")); + } + if (colIndex + 1 == intD_CompLotNo) + { + strColumnName = "D_ComponentLotNo"; + dtFixData.Columns.Add(strColumnName, Type.GetType("System.String")); + } + if (colIndex + 1 == intD_LaserMark) + { + strColumnName = "D_LaserMark"; + dtFixData.Columns.Add(strColumnName, Type.GetType("System.String")); + } + if (colIndex + 1 == intD_CassetteNo) + { + strColumnName = "D_CassetteNo"; + dtFixData.Columns.Add(strColumnName, Type.GetType("System.String")); + } + } + + + + } + } + catch + { + throw; + } + } + + if (x == intDataStart || blnDataAdd == true) // 取得明細資料 + { + + blnDataAdd = true; + try + { + // aryTemp = strLine.Split(strDSplitSign) + + drAdd = dtData.NewRow(); + drAddFix = dtFixData.NewRow(); + // 填入資料 + bool blnAddData = false; // 若excel整行都無資料,則不要加row至dtData + var loopTo4 = (short)(dtData.Columns.Count - 1); + for (i = 0; i <= loopTo4; i++) + { + + strVal = ""; + excelCell = excelRow.GetCell(i); + if (excelCell != null) + { + funGetCellValue(excelCell, sheet, workbook, ref strVal); + if (!string.IsNullOrEmpty(strVal)) + { + blnAddData = true; + } + } + drAdd[i] = Strings.Trim(strVal); + if (i + 1 == intD_MTLNo) + { + drAddFix["D_MTLNo"] = Strings.Trim(strVal); + } + if (i + 1 == intD_MTLLotNo) + { + drAddFix["D_MTLLotNo"] = Strings.UCase(Strings.Trim(strVal)); + } + if (i + 1 == intD_ComponentNo) + { + drAddFix["D_ComponentNo"] = Strings.Trim(strVal); + } + if (i + 1 == intD_SlotNo) + { + drAddFix["D_SlotNo"] = Strings.Trim(strVal); + } + if (i + 1 == intD_CompLotNo) + { + drAddFix["D_ComponentLotNo"] = Strings.Trim(strVal); + } + if (i + 1 == intD_LaserMark) + { + drAddFix["D_LaserMark"] = Strings.Trim(strVal); + } + if (i + 1 == intD_CassetteNo) + { + drAddFix["D_Cassetteno"] = Strings.Trim(strVal); + } + } + if (blnAddData) + { + dtData.Rows.Add(drAdd); + dtFixData.Rows.Add(drAddFix); + } + } + catch (Exception ex) + { + throw; + } + + } + + } + } + + // TestSum, TestSumLog存入DB + if (!dtFixData.Columns.Contains("D_ComponentNo")) + { + throw new Exception("無法取得ComponentNo!!"); + } + if (!(dtFormat_Postion == null)) + { + if (dtFormat_Postion.Rows.Count > 0) + { + for (int j = 0, loopTo5 = dtFormat_Postion.Rows.Count - 1; j <= loopTo5; j++) + { + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtFormat_Postion.Rows[j]["AssignFile"], 1, false))) + { + dtData.Columns.Add(dtFormat_Postion.Rows[j]["ColumnName"].ToString(), Type.GetType("System.String")); + } + } + } + } + foreach (DataColumn column in dtData.Columns) + { + if (dtFormat_Postion.Rows.Count > 0) + { + for (int idx = 0, loopTo6 = dtFormat_Postion.Rows.Count - 1; idx <= loopTo6; idx++) + { + if ((column.ColumnName ?? "") == (dtFormat_Postion.Rows[idx]["ColumnName"].ToString() ?? "")) + { + for (int k = 0, loopTo7 = dtData.Rows.Count - 1; k <= loopTo7; k++) + dtData.Rows[k][dtFormat_Postion.Rows[idx]["ColumnName"].ToString()] = dtFormat_Postion.Rows[idx]["Value"].ToString(); + } + } + } + } + datEventTime = DateTime.Now; + + // 2020/1/9,Ning,取得系統參數ExcludeInventoryCalCompRule(排除的庫房編號) + strSQL = "Select ParameterValue From tblSysParameter Where ParameterType = 'SysInfo' And ParameterNo = 'ExcludeInventoryCalCompRule'"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + strExcludeINVNo = drTemp["ParameterValue"].ToString(); + } + drTemp.Close(); + //cmmTemp.Dispose(); + + blnExcludeINV = false; + if (!string.IsNullOrEmpty(strExcludeINVNo)) + { + strSplit = strExcludeINVNo.Split(','); + foreach (string strINVNo in strSplit) + { + if ((strINVNo.Trim() ?? "") == (InventoryNo ?? "")) + { + blnExcludeINV = true; + break; + } + } + } + + // 取得進料單號 + // 2019/9/17,Ning,進料單若取有問題, 拋出錯誤訊息, 不繼續執行 + strMaterialInNo = funGetMaterialInNo(true); + + for (int idx = 0, loopTo8 = dtData.Rows.Count - 1; idx <= loopTo8; idx++) + { + // 2022/7/22,Ning,MTLNo,MTLLotNo明細與表頭只會有一個有值 + // 若明細沒有供應商料號, 用表頭資料取代 + if (dtFixData.Columns.Contains("D_MTLNo")) + { + strD_MTLNo = dtFixData.Rows[idx]["D_MTLNo"].ToString(); + } + else + { + strD_MTLNo = strMTLNo; + } + // 若明細沒有供應商物料批號, 用表頭資料取代 + if (dtFixData.Columns.Contains("D_MTLLotNo")) + { + strD_MTLLotNo = dtFixData.Rows[idx]["D_MTLLotNo"].ToString(); + } + else + { + strD_MTLLotNo = strMTLLotNo; + } + + if (string.IsNullOrEmpty(strD_MTLNo)) + { + throw new Exception("MaterialNo不可為空白!"); + } + // 2019/3/28,Ning,MaterialNo必須存在物料主檔中 + strSQL = "Select MaterialNo From tblMTLMaterialBasis Where IssueState = 2 And MaterialNo = '" + strD_MTLNo + "'"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (!drTemp.Read()) + { + throw new Exception("MaterialNo不存在於物料主檔中!"); + } + drTemp.Close(); + //cmmTemp.Dispose(); + // 2021/7/22,Ning,若有供應商, 則這筆物料必須有此供應商 + if (!string.IsNullOrEmpty(strVendorNo)) + { + strSQL = "Select MaterialNo From tblMTLMaterialVendorMap Where MaterialNo = '" + strD_MTLNo + "' And VendorNo = '" + strVendorNo + "'"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (!drTemp.Read()) + { + throw new Exception("物料: " + strD_MTLNo + " 未設定供應商: " + strVendorNo); + } + drTemp.Close(); + //cmmTemp.Dispose(); + } + if (string.IsNullOrEmpty(strD_MTLLotNo)) + { + throw new Exception("MaterialLotNo不可為空白!"); + } + if (dtFixData.Columns.Contains("D_SlotNo")) + { + strD_SlotNo = dtFixData.Rows[idx]["D_SlotNo"].ToString(); + } + else + { + strD_SlotNo = ""; + } + // 若明細沒有元件批號, 用表頭資料取代 + if (dtFixData.Columns.Contains("D_ComponentLotNo")) + { + strD_CompLotNo = dtFixData.Rows[idx]["D_ComponentLotNo"].ToString(); + } + else + { + strD_CompLotNo = strCompLotNo; + } + // 當ComponentLotNo與D_ComponentLotNo皆未設定時, ComponentLotNo = MaterialLotNo + if (intComponentLotNo <= 0 && dtFixData.Columns.Contains("D_ComponentLotNo") == false) + { + strD_CompLotNo = strD_MTLLotNo; + } + if (dtFixData.Columns.Contains("D_LaserMark")) + { + strD_LaserMark = dtFixData.Rows[idx]["D_LaserMark"].ToString(); + } + else + { + strD_LaserMark = ""; + } + if (dtFixData.Columns.Contains("D_CassetteNo")) + { + strD_CassetteNo = dtFixData.Rows[idx]["D_CassetteNo"].ToString(); + } + else + { + strD_CassetteNo = ""; + } + // tblWIPTestSum刪除已存在資料, 只保留最新一次資料 + strSQL = "Delete From " + strTableName + " Where MaterialNo = '" + strD_MTLNo + "' And MaterialLotNo = '" + strD_MTLLotNo + "' And UPPER(ComponentNo) = '" + dtFixData.Rows[idx]["D_ComponentNo"].ToString().ToUpper() + "'"; + CollectionSQL.Add(strSQL); + + // //新增TestSummary, TestSummaryLog + // strSQLAddField = "Insert into " & strTableName & " (" + strSQLHead = "Insert into " + strTableName + " ("; + strSQLLogHead = "Insert into " + strLogTableName + " ("; + strSQLAddValue = " Values ("; + + // 固定欄位 + strSQLAddField = "MaterialNo, MaterialLotNo, ComponentNo, VendorMaterialNo, FileName, ImportUserNo, ImportDate,"; + strSQLAddValue = strSQLAddValue + "'" + strD_MTLNo + "','" + strD_MTLLotNo + "','" + dtFixData.Rows[idx]["D_ComponentNo"].ToString().ToUpper() + "','" + strD_MTLNo + "','" + FileName + "'," + " 'AutoRun', To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),"; + + bool blnD_EquipmentNo, blnD_WaferSize, blnD_Thickness; // 明細是否有動態表頭欄位, 有的話以明細為準 + blnD_EquipmentNo = false; + blnD_WaferSize = false; + blnD_Thickness = false; + // 動態欄位(明細欄位) + for (int w = 0, loopTo9 = dtData.Columns.Count - 1; w <= loopTo9; w++) + { + strColumnName = dtData.Columns[w].ColumnName; + // If strColumnName = "D_MTLNo" OrElse strColumnName = "D_MTLLotNo" OrElse strColumnName = "D_COMPONENTNO" _ + // OrElse strColumnName = "D_SLOTNO" OrElse strColumnName = "D_COMPONENTLOTNO" OrElse strColumnName = "D_LASERMARK" Then + // Continue For + // End If + + // TestRecipeBasis有定義此欄位才需要存入, 欄位名稱已轉換為ConversionField + drSel = dtTestRecipe.Select("ConversionField = '" + strColumnName + "'"); + if (drSel.Length > 0) + { + strSQLAddField = strSQLAddField + strColumnName + ","; + strSQLAddValue = strSQLAddValue + "'" + dtData.Rows[idx][strColumnName].ToString() + "',"; + + if (strColumnName.ToUpper() == "EQUIPMENTNO") + { + blnD_EquipmentNo = true; + } + if (strColumnName.ToUpper() == "WAFERSIZE") + { + blnD_WaferSize = true; + } + if (strColumnName.ToUpper() == "THICKNESS") + { + blnD_Thickness = true; + } + } + } + + // 動態欄位(表頭欄位) + // 2019/5/22, Ning, 若明細沒有, 才以表頭的值填入 + if (!blnD_EquipmentNo && dtTestRecipe.Select("TestRecipeNo = 'EquipmentNo'").Length > 0) + { + strSQLAddField = strSQLAddField + "EquipmentNo,"; + strSQLAddValue = strSQLAddValue + "'" + strEquipmentNo + "',"; + } + if (!blnD_WaferSize && dtTestRecipe.Select("TestRecipeNo = 'WaferSize'").Length > 0) + { + strSQLAddField = strSQLAddField + "WaferSize,"; + strSQLAddValue = strSQLAddValue + "'" + strWaferSize + "',"; + } + if (!blnD_Thickness && dtTestRecipe.Select("TestRecipeNo = 'Thickness'").Length > 0) + { + strSQLAddField = strSQLAddField + "Thickness,"; + strSQLAddValue = strSQLAddValue + "'" + strThickness + "',"; + } + + if (Strings.InStr(1, strSQLAddField, ",") != 0) // 刪除最後一個"," + { + if (Strings.Right(strSQLAddField, 1) == ",") + { + strSQLAddField = Strings.Mid(strSQLAddField, 1, Strings.Len(strSQLAddField) - 1); + } + } + + if (Strings.InStr(1, strSQLAddValue, ",") != 0) // 刪除最後一個"," + { + if (Strings.Right(strSQLAddValue, 1) == ",") + { + strSQLAddValue = Strings.Mid(strSQLAddValue, 1, Strings.Len(strSQLAddValue) - 1); + } + } + + // 直接給定strSQL + strSQL = strSQLHead + strSQLAddField + ")" + strSQLAddValue + ")"; + CollectionSQL.Add(strSQL); + + // Log SQL + strSQL = strSQLLogHead + strSQLAddField + ")" + strSQLAddValue + ")"; + CollectionSQL.Add(strSQL); + + //2023/9/15,Ning,华芯振邦相同MATERIALNO允许汇入相同Compoentno + strSQL = "Select MaterialNo ,MaterialLotNo ,ComponentNo From " + strTableName + " Where UPPER(ComponentNo) = '" + dtFixData.Rows[idx]["D_ComponentNo"].ToString().ToUpper() + "' and MaterialNo = '" + strD_MTLNo + "' and MaterialLotNo ='" + strD_MTLLotNo + "'"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + throw new Exception(Conversions.ToString("MaterialNo: " + strD_MTLNo + ", MaterialLotNo: " + strD_MTLLotNo + ", WaferID: " + dtFixData.Rows[idx]["D_ComponentNo"] + " 已匯入, 不允許重新匯入!")); + } + drTemp.Close(); + //cmmTemp.Dispose(); + + // 進料單Component + strSQL = "Insert into tblINVMaterialInComponent (MaterialInNo, MaterialNo, MaterialLotNo, ComponentNo, SlotNo)" + " Values ('" + strMaterialInNo + "','" + strD_MTLNo + "','" + strD_MTLLotNo + "','" + dtFixData.Rows[idx]["D_ComponentNo"].ToString().ToUpper() + "', '" + strD_SlotNo + "')"; + CollectionSQL.Add(strSQL); + + // 原物料倉Component + // '2019/6/12, 依Josh指示, 同一ComponentNo在原物料倉不能有兩筆以上, 依ComponentNo先刪除再新增 + // 'strSQL = "Delete From tblINVRAWInventoryComponent Where ComponentNo = '" & dtFixData.Rows(idx)("D_ComponentNo") & "'" + // 'CollectionSQL.Add(strSQL) + // 2022/11/28,Ning, 071068: 來料檔案匯入, 若不同供應商有相同ComponentNo, 應如何匯入? => 以tblINVRAWInventoryComponent的PK(InventoryNo,MaterialNo,MaterialLotNo, 來檢查, 存在才不允許匯入 + //strSQL = "Select ComponentNo From tblINVRAWInventoryComponent Where InventoryNo = '" + InventoryNo + "' And MaterialNo = '" + strD_MTLNo + "'" + " And MaterialLotNo = '" + strD_MTLLotNo + "' And UPPER(ComponentNo) = '" + dtFixData.Rows[idx]["D_ComponentNo"].ToString().ToUpper() + "'"; + ////cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + //drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + //if (drTemp.Read()) + //{ + // throw new Exception(Conversions.ToString("InventoryNo: " + InventoryNo + ", MaterialNo: " + strD_MTLNo + ", MaterialLotNo: " + strD_MTLLotNo + ", WaferID: " + + // dtFixData.Rows[idx]["D_ComponentNo"] + " 已存在原料倉, 不允許匯入, 若要重新匯入要先做庫房出庫或刪除動作!")); + //} + //drTemp.Close(); + ////cmmTemp.Dispose(); + + strSQL = "Insert into tblINVRAWInventoryComponent (InventoryNo, MaterialNo, MaterialLotNo, ComponentNo, SlotNo, ComponentLotNo, S_LaserMark, B_CassetteNo)" + " Values ('" + InventoryNo + "','" + strD_MTLNo + "','" + strD_MTLLotNo + "','" + dtFixData.Rows[idx]["D_ComponentNo"].ToString().ToUpper() + "', '" + strD_SlotNo + "','" + strD_CompLotNo + "','" + strD_LaserMark + "','" + strD_CassetteNo + "')"; + CollectionSQL.Add(strSQL); + + // 2019/7/23, Ning, 將資料填入tblINVTemp_Component待AutoRun滾算芯片挑片規則, 原料庫InventoryType:0 + // 2019/10/17,Ning,因有可能已存在又重新入庫, 故先刪後增 + // 2020/1/9,Ning,非系統參數ExcludeInventoryCalCompRule中設定的庫房才需寫入tblINVTemp_Component中 + if (blnExcludeINV == false) // 不在排除的庫房內, 需加入tblINVTemp_Component + { + strSQL = "Delete From tblINVTemp_Component Where InventoryNo = '" + InventoryNo + "' And UPPER(ComponentNo) = '" + dtFixData.Rows[idx]["D_ComponentNo"].ToString().ToUpper() + "'"; + CollectionSQL.Add(strSQL); + strSQL = "Insert Into tblINVTemp_Component (InventoryNo, ComponentNo, InventoryType)" + " Values('" + InventoryNo + "','" + dtFixData.Rows[idx]["D_ComponentNo"].ToString().ToUpper() + "',0)"; + CollectionSQL.Add(strSQL); + } + } + + // 若為排除的庫房, 需填入EvnetLog備查 + if (blnExcludeINV == true) + { + strSQL = "Insert into tblSysEventLog (UserID, RecordDate, ServiceName, KeyField, KeyValue, ComputerName)" + " Values ('AutoRun', To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'), 'AutoLoaderLib'," + "'ExcludeInventoryNo','" + InventoryNo + "','" + modWIN.gComputerName + "')"; + CollectionSQL.Add(strSQL); + } + + // 進料單明細需以MaterialNo, MaterialLotNo做Group By計算數量 + dtMTLInDetail = new DataTable("MTLInDetail"); + dtMTLInDetail.Columns.Add("MaterialNo", Type.GetType("System.String")); + dtMTLInDetail.Columns.Add("MaterialLotNo", Type.GetType("System.String")); + dtMTLInDetail.Columns.Add("Qty", Type.GetType("System.Int16")); + if (!dtFixData.Columns.Contains("D_MTLNo")) + { + dtFixData.Columns.Add("D_MTLNo", Type.GetType("System.String")); + foreach (DataRow drFixData in dtFixData.Rows) + { + drFixData["D_MTLNO"] = strMTLNo; + } + } + if (!dtFixData.Columns.Contains("D_MTLLotNo")) + { + dtFixData.Columns.Add("D_MTLLotNo", Type.GetType("System.String")); + foreach (DataRow drFixData in dtFixData.Rows) + { + drFixData["D_MTLLotNo"] = strMTLLotNo; + } + } + dvFixData = dtFixData.DefaultView; + dvFixData.Sort = "D_MTLNo, D_MTLLotNo"; + var loopTo10 = (short)(dvFixData.Count - 1); + for (i = 0; i <= loopTo10; i++) + { + drSel = dtMTLInDetail.Select("MaterialNo = '" + dvFixData[i]["D_MTLNo"].ToString() + "' And MaterialLotNo = '" + dvFixData[i]["D_MTLLotNo"].ToString() + "'"); + if (drSel.Length > 0) + { + drSel[0].BeginEdit(); + drSel[0]["Qty"] = Operators.AddObject(drSel[0]["Qty"], 1); + drSel[0].EndEdit(); + } + else + { + drAdd = dtMTLInDetail.NewRow(); + drAdd["MaterialNo"] = dvFixData[i]["D_MTLNo"].ToString(); + drAdd["MaterialLotNo"] = dvFixData[i]["D_MTLLotNo"].ToString(); + drAdd["Qty"] = 1; + dtMTLInDetail.Rows.Add(drAdd); + } + } + + // 進料單主檔(State直接給2) + strSQL = "Insert into tblINVMaterialInBasis (MaterialInNo, InventoryNo, VendorNo, State, Creator, CreateDate, ConfirmDate)" + " Values ('" + strMaterialInNo + "','" + InventoryNo + "','" + strVendorNo + "', 2, 'AutoRun'," + " To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')," + "To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'))"; + CollectionSQL.Add(strSQL); + + foreach (DataRow drDetail in dtMTLInDetail.Rows) + { + + strSQL = Conversions.ToString("Select SafeQty,UnitNo From tblMTLMaterialBasis Where MaterialNo = '" + drDetail["MaterialNo"] + "'"); + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + if (!(drTemp["SafeQty"] is DBNull)) + { + decSafeQty = Conversions.ToDecimal(drTemp["SafeQty"]); + } + else + { + decSafeQty = 0m; + } + strUnitNo = Conversions.ToString(drTemp["UnitNo"]); + } + else + { + decSafeQty = 0m; + strUnitNo = "pcs"; + } + drTemp.Close(); + + // 進料單明細檔 + strSQL = Conversions.ToString("Insert into tblINVMaterialInDetail (MaterialInNo,MaterialNo,MaterialLotNo,LocatorNo,UnitNo,Qty,LimitTime)" + " Values ('" + strMaterialInNo + "','" + + drDetail["MaterialNo"] + "','" + drDetail["MaterialLotNo"] + "','N/A','" + strUnitNo + "'," + drDetail["Qty"] + ",0)"); + CollectionSQL.Add(strSQL); + + // 進料單確認(入庫) + // 處理原料倉現況主檔資料 + strSQL = Conversions.ToString("Select * From tblINVRawInventory Where InventoryNo = '" + InventoryNo + "' And MaterialNo = '" + + drDetail["MaterialNo"] + "'"); + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + // 數量相加 + strSQL = Conversions.ToString("Update tblINVRawInventory Set CurQty = CurQty + " + + drDetail["Qty"] + " Where InventoryNo = '" + InventoryNo + "'" + " And MaterialNo = '" + drDetail["MaterialNo"] + "'"); + CollectionSQL.Add(strSQL); + drTemp.Close(); + } + else // 找不到資料時一律先新增一筆CurrentQty=0的資料列,再做Update動作 + { + drTemp.Close(); + strSQL = Conversions.ToString("Insert into tblINVRawInventory (InventoryNo, MaterialNo, SafeQty, CurQty, AllocateQty, UnitNo)" + " Values ('" + InventoryNo + "','" + + drDetail["MaterialNo"] + "'," + decSafeQty + ", 0, 0,'" + strUnitNo + "')"); + + // 先確定之前沒有加過再加這筆資料 + blnFound = false; + var loopTo11 = (short)IniCollectionSQL.Count; + for (i = 1; i <= loopTo11; i++) + { + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(strSQL, IniCollectionSQL[i], false))) + { + blnFound = true; + } + } + if (!blnFound) + { + IniCollectionSQL.Add(strSQL); + } + + strSQL = Conversions.ToString("Update tblINVRawInventory Set CurQty = CurQty + " + + drDetail["Qty"] + " Where InventoryNo = '" + InventoryNo + "'" + " And MaterialNo = '" + drDetail["MaterialNo"] + "'"); + CollectionSQL.Add(strSQL); + } + + // 處理原料倉儲位現況資料 + strSQL = Conversions.ToString("Select * From tblINVRawInventoryLoc Where InventoryNo = '" + InventoryNo + "'" + " And LocatorNo = 'N/A' And MaterialNo = '" + + drDetail["MaterialNo"] + "'" + " And MaterialLotNo = '" + drDetail["MaterialLotNo"] + "'"); + + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + // 數量相加 + strSQL = Conversions.ToString("Update tblINVRawInventoryLoc Set LocQty = LocQty + " + + drDetail["Qty"] + "," + " InputDate = To_Date('" + Strings.Format(Conversions.ToDate(datEventTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')" + + " Where InventoryNo = '" + InventoryNo + "'" + " And LocatorNo = 'N/A' And MaterialNo = '" + drDetail["MaterialNo"] + "'" + " And MaterialLotNo = '" + + drDetail["MaterialLotNo"] + "'"); + CollectionSQL.Add(strSQL); + } + else + { + // 新增一筆 + strSQL = Conversions.ToString("Insert into tblINVRawInventoryLoc (InventoryNo, LocatorNo, MaterialNo, MaterialLotNo, VendorNo, LocQty, InputDate)" + " Values ('" + InventoryNo + "','N/A','" + + drDetail["MaterialNo"] + "','" + drDetail["MaterialLotNo"] + "','" + strVendorNo + "'," + drDetail["Qty"] + ", To_Date('" + Strings.Format(Conversions.ToDate(datEventTime), "yyyy/MM/dd H:mm:ss") + + "','YYYY/MM/DD HH24:MI:SS'))"); + CollectionSQL.Add(strSQL); + } + drTemp.Close(); + } + + var loopTo12 = (short)IniCollectionSQL.Count; + for (i = 1; i <= loopTo12; i++) + FinalCollectionSQL.Add(IniCollectionSQL[i]); + var loopTo13 = (short)CollectionSQL.Count; + for (i = 1; i <= loopTo13; i++) + FinalCollectionSQL.Add(CollectionSQL[i]); + + // //執行SQL指令 + string argstrDatabaseType = Conversions.ToString(DataBaseType); + ExecuteSQLNoneQuery_UPD(argstrDatabaseType, strConnectionString, FinalCollectionSQL); + + blnResult = true; + } + + catch (Exception ex) + { + throw; + } + + finally + { + if (objReader != null) + { + objReader.Close(); + objReader = null; + } + CloseConnection(cnnTemp); + aryTemp = null; + } + + return blnResult; + + } + + /// + /// + /// + /// 原vb預設值false + /// 原vb預設值0 + /// + /// + private bool fuTestDataToTestSum_MTL_BigFile(string strTestRecipeType, string pFilePath, string PSNo, string strMSplitSign, string strDSplitSign, + int intMTLNo, int intMTLLotNo, int intVendorNo, int intComponentLotNo, + int intD_MTLNo, int intD_MTLLotNo, int intD_ComponentNo, int intD_SlotNo, + int intD_CompLotNo, int intD_LaserMark, int intD_CassetteNo, + int intEquipmentNo, int intWaferSize, int intThickness, + int intColumnStart, int intDataStart, + string InventoryNo, string FileName, + string JobNo, string JobFunction, + string FilePath, int FileSize, long SplitRecordsLimit, + ref bool blnSplitPartialSuccess, ref int TotalRows, + DataTable dtFormat_Postion = null, int StartRow = defInteger) + { + + bool blnResult; + var objReader = default(StreamReader); + // 2019/3/26, Ning, 加入Encode, 排除中文亂碼問題 + // Dim encode As System.Text.Encoding = System.Text.Encoding.GetEncoding("UTF-8") + var encode = Encoding.Default; + string strLine; + + string strMTLNo = default(string), strMTLLotNo = default(string), strVendorNo = default(string), strCompLotNo = default(string), strD_MTLNo = default(string), strD_MTLLotNo = default(string), strD_CompLotNo = default(string), strD_SlotNo = default(string), strD_LaserMark = default(string), strD_CassetteNo = default(string); + string strComponentNo; + var strEquipmentNo = default(string); + var strWaferSize = default(string); + var strThickness = default(string); + + string[] aryTemp; + var dtData = default(DataTable); + DataTable dtFixData; // 存固定參數的欄位值 + short i; + short z; + bool blnDataAdd = false; + string strOrgColName, strColumnName; + DataRow drAdd; + DataRow drAddFix; + string strSQL, strTableName, strSQLAddField, strSQLAddValue; + var CollectionSQL = new Collection(); + + IDbConnection cnnTemp = default(IDbConnection); + DbDataReader drTemp; + + string TestRecipeType; + string strLogTableName, strSQLHead, strSQLLogHead; + //System.Data.OleDb.OleDbDataAdapter daTemp; + DataTable dtTestRecipe; + DataTable dtMaterialBasis; + DataSet dsTemp; + DateTime datEventTime; + + // 開立進料單 + DataView dvFixData; + DataRow[] drSel; + DataTable dtMTLInDetail; + string strMaterialInNo, strUnitNo; + bool blnFound; + var IniCollectionSQL = new Collection(); + var FinalCollectionSQL = new Collection(); + decimal decSafeQty; + + // 2020/1/9,Ning,排除庫房編號 + var strExcludeINVNo = default(string); + string[] strSplit; + bool blnExcludeINV; + var dtNotFixData = new DataTable("NotFixData"); // 0088935: [SEMI_Wafer] AutoLoader測試資料動態參數收集優化_AutoLoader 電性值匯入調整 + // 存進非參數資料 + dtNotFixData.Columns.Add("Column_NotFix", Type.GetType("System.String")); + dtNotFixData.Columns.Add("Value_NotFix", Type.GetType("System.String")); + DataRow drNotFix; + dtFixData = new DataTable("NotFixData"); + + var oSQLContent = new Dictionary(); + uint intSQLIndex = 1U; + + var aryCol = new string[501][]; + var aryCol_FixString = new string[501][]; // 固定欄位 MaterialNo, MaterialLotNo, ComponentNo, VendorMaterialNo, FileName, ImportUserNo + var aryCol_FixDateTime = new DateTime[501][]; // 固定欄位 ImportDate + int idx = 0; + int idx2 = 0; + int intSeq = 1; + bool WriteString = false; + bool WriteDate = false; + var dtUnNumeric = new DataTable("UnNumeric"); + int intRow = 0; + string strlotNo = "N/A"; + string strWaferID = "N/A"; + var datStartTime = DateTime.Now; + string strFailMessage = defString; + try + { + // //Create connection + cnnTemp = CreateConnection(strConnectionString); + + blnResult = false; + + // 2021/4/19, Ning, 若AutoLoaderJob.xml的Parameter3有定義TestRecipeType, 則以該值為優先, 若沒有定再以下述方式找TestRecipeType + if ((strTestRecipeType ?? "") != defString) + { + TestRecipeType = strTestRecipeType; + } + else + { + // 來料只會有一種測試類別, 取得TestRecipeBasis中TestRecipeClass = 1的TestRecipeType即是來料的測試類別 + // 2019/9/9,Ning,來料可能有多種測試類別, 但一個區段只會有一個 + strSQL = "Select TestRecipeType From tblSYSTestRecipeBasis Where TestRecipeClass = 1 And IssueState = 2 And PSNo = '" + PSNo + "'"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + TestRecipeType = Conversions.ToString(drTemp["TestRecipeType"]); + } + else + { + throw new Exception("解析檔案失敗, 無法找到分類為來料, 區段為: " + PSNo + " 之測試類別!"); + } + drTemp.Close(); + //cmmTemp.Dispose(); + } + + // 電性值資料表名稱: tblWIPTestSum_測試類別 + strTableName = "TBLWIPTESTSUM_" + TestRecipeType; + strLogTableName = "TBLWIPTESTSUMLOG_" + TestRecipeType; + + // 依測試類別找出其TestRecipeNo(參數編號), ConversionField(欄位名稱) + strSQL = "Select TestRecipeNo, ConversionField,DataType From tblSYSTestRecipeBasis Where IssueState = 2 And TestRecipeType = '" + TestRecipeType + "'"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp); + dsTemp = new DataSet(); + //daTemp.Fill(dsTemp, "TestRecipe"); + ExecuteSQLQuery_Adapter(strSQL, dsTemp, "TestRecipe", cnnTemp); + dtTestRecipe = dsTemp.Tables["TestRecipe"]; + + strSQL = "Select MaterialNo From tblMTLMaterialBasis Where IssueState = 2 "; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp); + dsTemp = new DataSet(); + //daTemp.Fill(dsTemp, "MaterialBasis"); + ExecuteSQLQuery_Adapter(strSQL, dsTemp, "MaterialBasis", cnnTemp); + dtMaterialBasis = dsTemp.Tables["MaterialBasis"]; + + + // 分包機制:程式搬移 + // 2020/1/9,Ning,取得系統參數ExcludeInventoryCalCompRule(排除的庫房編號) + strSQL = "Select ParameterValue From tblSysParameter Where ParameterType = 'SysInfo' And ParameterNo = 'ExcludeInventoryCalCompRule'"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + strExcludeINVNo = drTemp["ParameterValue"].ToString(); + } + drTemp.Close(); + //cmmTemp.Dispose(); + + blnExcludeINV = false; + if (!string.IsNullOrEmpty(strExcludeINVNo)) + { + strSplit = strExcludeINVNo.Split(','); + foreach (string strINVNo in strSplit) + { + if ((strINVNo.Trim() ?? "") == (InventoryNo ?? "")) + { + blnExcludeINV = true; + break; + } + } + } + + // 取得進料單號 + // 2019/9/17,Ning,進料單若取有問題, 拋出錯誤訊息, 不繼續執行 + strMaterialInNo = funGetMaterialInNo(true); + + + // 解檔 + objReader = new StreamReader(pFilePath, encode); + // 先讀取第一列, 再以第一列的編碼方式讀檔 + strLine = objReader.ReadLine().Trim(); + encode = objReader.CurrentEncoding; + objReader.Close(); + objReader = null; + objReader = new StreamReader(pFilePath, encode); + datEventTime = DateTime.Now; + + if (StartRow != defInteger) // 未完成的資料,分包筆數必須加上已完成筆數 + { + intDataStart = StartRow + intDataStart - 1; // 應該要加上DataStart + // 如果intDataStart 1) + { + strMTLNo = aryTemp[1].ToString().Trim(); + if (string.IsNullOrEmpty(strMTLNo)) + { + throw new Exception("無法取得MaterialNo!!"); + } + } + else + { + throw new Exception("不支援此檔案格式,格式內容資料解析需為" + strMSplitSign); + } + } + + if (x == intMTLLotNo) // 2.取得MTLLotNo + { + // 2019/2/22, Ning, 以傳入的表頭分隔字元拆解 + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + strMTLLotNo = aryTemp[1].ToString().Trim(); + if (string.IsNullOrEmpty(strMTLLotNo)) + { + throw new Exception("無法取得MaterialLotNo!!"); + } + } + else + { + throw new Exception("不支援此檔案格式,格式內容資料解析需為" + strMSplitSign); + } + } + + if (x == intVendorNo) // 3.取得VendorNo + { + // 2019/2/22, Ning, 以傳入的表頭分隔字元拆解 + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + strVendorNo = aryTemp[1].ToString().Trim(); + if (string.IsNullOrEmpty(strVendorNo)) + { + throw new Exception("無法取得VendorNo!!"); + } + } + else + { + throw new Exception("不支援此檔案格式,格式內容資料解析需為" + strMSplitSign); + } + } + + if (x == intComponentLotNo) // 3.5取得ComponentLotNo + { + // 2019/2/22, Ning, 以傳入的表頭分隔字元拆解 + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + strCompLotNo = aryTemp[1].ToString().Trim(); + if (string.IsNullOrEmpty(strCompLotNo)) + { + throw new Exception("無法取得ComponentLotNo!!"); + } + } + else + { + throw new Exception("不支援此檔案格式,格式內容資料解析需為" + strMSplitSign); + } + } + + if (x == intEquipmentNo) // 4.取得EquipmentNo + { + // 2019/2/22, Ning, 以傳入的表頭分隔字元拆解 + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + strEquipmentNo = aryTemp[1].ToString().Trim(); + } + else + { + throw new Exception("不支援此檔案格式,格式內容資料解析需為" + strMSplitSign); + } + } + + if (x == intWaferSize) // 5.取得Wafer尺寸 + { + // 2019/2/22, Ning, 以傳入的表頭分隔字元拆解 + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + strWaferSize = aryTemp[1].ToString().Trim(); + } + else + { + throw new Exception("不支援此檔案格式,格式內容資料解析需為" + strMSplitSign); + } + } + + if (x == intThickness) // 6.取得厚度 + { + // 2019/2/22, Ning, 以傳入的表頭分隔字元拆解 + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + strThickness = aryTemp[1].ToString().Trim(); + } + else + { + throw new Exception("不支援此檔案格式,格式內容資料解析需為" + strMSplitSign); + } + } + // 2021/3/12 Steevn Mantis: 0088935: [SEMI_Wafer] AutoLoader測試資料動態參數收集優化_AutoLoader 電性值匯入調整 + // 依照格式檔設定的欄位名語位置在讀EXCEL檔時找到相對的欄位並記錄值 + if (!(dtFormat_Postion == null)) + { + if (dtFormat_Postion.Rows.Count > 0) + { + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + var loopTo = (short)(dtFormat_Postion.Rows.Count - 1); + for (i = 0; i <= loopTo; i++) + { + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(x, dtFormat_Postion.Rows[i]["ColumnPosition"], false))) + { + if (aryTemp.Count() > 2) // EX: Folder:D:\TFS\Industry\v5\Dev_SEMI_Wafer\MESClient\:111 + { + var loopTo1 = (short)(aryTemp.Count() - 1); + for (z = 1; z <= loopTo1; z++) + { + if (z == aryTemp.Count() - 1) + { + dtFormat_Postion.Rows[i]["Value"] += aryTemp[z].ToString().Trim(); + } + else + { + dtFormat_Postion.Rows[i]["Value"] += aryTemp[z].ToString().Trim() + strMSplitSign; + } + } + } + else + { + dtFormat_Postion.Rows[i]["Value"] = aryTemp[1].ToString().Trim(); + } + } + } + } + } + if (x == intColumnStart) // 取得欄位名稱 + { + + try + { + dtData = new DataTable("CSVData"); + dtFixData = new DataTable("FixData"); + + // 2019/2/22,Ning明細以strDSplitSign分隔 + // 若結尾為strDSplitSign則去掉 + if (strLine.EndsWith(strDSplitSign)) + { + strLine = strLine.TrimEnd(Conversions.ToChar(strDSplitSign)); + } + + aryTemp = strLine.Split(Conversions.ToChar(strDSplitSign)); + + drAdd = dtData.NewRow(); + var loopTo2 = (short)(aryTemp.Length - 1); + for (i = 0; i <= loopTo2; i++) + { + // 新增 Column + if (dtData.Columns.Count <= i) + { + + // 2019/3/22,Ning,先以原始欄位存入, 後端再判斷是否為固定參數的位置 + + strColumnName = aryTemp[i].ToString().ToUpper().Trim(); + //2023/10/16,Ning,147871: [Industry_Base] 來料匯入功能的欄位轉換方式邏輯調整 + bool blnMustConvert = false; + if (char.IsLetter(Conversions.ToChar(strColumnName.Substring(0, 1)))) + { + for (int jj = 0, loopTo1 = strColumnName.Length - 1; jj <= loopTo1; jj++) + { + if (!char.IsNumber(Conversions.ToChar(strColumnName.Substring(jj, 1))) && !char.IsLetter(Conversions.ToChar(strColumnName.Substring(jj, 1))) && strColumnName.Substring(jj, 1) != "_") + { + blnMustConvert = true; + break; + } + } + } + else + { + blnMustConvert = true; + } + if (blnMustConvert) + { + strSQL = "Select ConversionField From tblSYSFieldConvertBasis where DocumentField = '" + strColumnName.ToUpper() + "'"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + strColumnName = Conversions.ToString(drTemp["ConversionField"]); + } + drTemp.Close(); + //cmmTemp.Dispose(); + } + + drSel = dtTestRecipe.Select("TestRecipeNo = '" + strColumnName + "'"); + if (drSel.Length > 0) + { + //strColumnName = drSel[0]["ConversionField"].ToString(); + } + else + { + // 欄位名稱只能是數字或英文字母, 這兩者除外的皆以_取代 + for (int jj = 0, loopTo3 = strColumnName.Length - 1; jj <= loopTo3; jj++) + { + if (!char.IsNumber(Conversions.ToChar(strColumnName.Substring(jj, 1))) && !char.IsLetter(Conversions.ToChar(strColumnName.Substring(jj, 1)))) + { + strColumnName = Strings.Replace(strColumnName, strColumnName.Substring(jj, 1), "_"); + } + } + + if (string.IsNullOrEmpty(strColumnName)) + { + strColumnName = "COL" + i; + } + + // 判斷取代後的欄位是否已存在,若已存在則於欄位後方加COL+欄位顯示順序 + if (dtData.Columns.Contains(strColumnName)) + { + strColumnName = strColumnName + "COL" + i; + } + } + + dtData.Columns.Add(strColumnName.ToUpper(), Type.GetType("System.String")); + + // 明細固定參數, D_MTLNo, D_MTLLotNo, D_ComponentNo, D_SlotNo, D_ComponentLotNo, D_LaserMark, D_CassetteNo + if (i + 1 == intD_MTLNo) + { + strColumnName = "D_MTLNo"; + dtFixData.Columns.Add(strColumnName, Type.GetType("System.String")); + } + if (i + 1 == intD_MTLLotNo) + { + strColumnName = "D_MTLLotNo"; + dtFixData.Columns.Add(strColumnName, Type.GetType("System.String")); + } + if (i + 1 == intD_ComponentNo) + { + strColumnName = "D_ComponentNo"; + dtFixData.Columns.Add(strColumnName, Type.GetType("System.String")); + } + if (i + 1 == intD_SlotNo) + { + strColumnName = "D_SlotNo"; + dtFixData.Columns.Add(strColumnName, Type.GetType("System.String")); + } + if (i + 1 == intD_CompLotNo) + { + strColumnName = "D_ComponentLotNo"; + dtFixData.Columns.Add(strColumnName, Type.GetType("System.String")); + } + if (i + 1 == intD_LaserMark) + { + strColumnName = "D_LaserMark"; + dtFixData.Columns.Add(strColumnName, Type.GetType("System.String")); + } + if (i + 1 == intD_CassetteNo) + { + strColumnName = "D_CassetteNo"; + dtFixData.Columns.Add(strColumnName, Type.GetType("System.String")); + } + } + } + } + + catch + { + throw; + } + + } + + if (x == intDataStart || blnDataAdd == true) // 取得明細資料 + { + + blnDataAdd = true; + if (x == intDataStart) + { + aryCol[dtData.Columns.Count - 1] = new string[(int)(SplitRecordsLimit - 1L + 1)]; + aryCol_FixString[5] = new string[(int)(SplitRecordsLimit - 1L + 1)]; + aryCol_FixDateTime[0] = new DateTime[(int)(SplitRecordsLimit - 1L + 1)]; + // 二維陣列初始化 + var loopTo4 = (short)(dtData.Columns.Count - 1); + for (i = 0; i <= loopTo4; i++) + { + aryCol[i] = new string[(int)(SplitRecordsLimit - 1L + 1)]; + aryCol_FixString[i] = new string[(int)(SplitRecordsLimit - 1L + 1)]; + aryCol_FixDateTime[i] = new DateTime[(int)(SplitRecordsLimit - 1L + 1)]; + } + + } + try + { + aryTemp = strLine.Split(Conversions.ToChar(strDSplitSign)); + + drAdd = dtData.NewRow(); + drAddFix = dtFixData.NewRow(); + // 填入資料 + var loopTo5 = (short)(dtData.Columns.Count - 1); + for (i = 0; i <= loopTo5; i++) + { + drAdd[i] = Strings.Trim(aryTemp[i]); + if (i + 1 == intD_MTLNo) + { + drAddFix["D_MTLNo"] = Strings.Trim(aryTemp[i]); + + // 若明細沒有供應商料號, 用表頭資料取代 + if (dtFixData.Columns.Contains("D_MTLNo")) + { + strD_MTLNo = Strings.Trim(aryTemp[i]); + } + else + { + strD_MTLNo = strMTLNo; + } + if (string.IsNullOrEmpty(strD_MTLNo)) + { + throw new Exception("MaterialNo不可為空白!"); + } + aryCol_FixString[0][idx] = strD_MTLNo; + aryCol_FixString[3][idx] = strD_MTLNo; + + } + if (i + 1 == intD_MTLLotNo) + { + drAddFix["D_MTLLotNo"] = Strings.UCase(Strings.Trim(aryTemp[i])); + // 若明細沒有供應商物料批號, 用表頭資料取代 + if (dtFixData.Columns.Contains("D_MTLLotNo")) + { + strD_MTLLotNo = Strings.Trim(aryTemp[i]); + } + else + { + strD_MTLLotNo = strMTLLotNo; + } + if (string.IsNullOrEmpty(strD_MTLLotNo)) + { + throw new Exception("MaterialLotNo不可為空白!"); + } + aryCol_FixString[1][idx] = Strings.UCase(strD_MTLLotNo); + + } + if (i + 1 == intD_ComponentNo) + { + drAddFix["D_ComponentNo"] = Strings.Trim(aryTemp[i].ToUpper()); + aryCol_FixString[2][idx] = Strings.Trim(aryTemp[i].ToUpper()); + + } + if (i + 1 == intD_SlotNo) + { + drAddFix["D_SlotNo"] = Strings.Trim(aryTemp[i]); + if (dtFixData.Columns.Contains("D_SlotNo")) + { + strD_SlotNo = Strings.Trim(aryTemp[i]); + } + else + { + strD_SlotNo = ""; + } + } + if (i + 1 == intD_CompLotNo) + { + drAddFix["D_ComponentLotNo"] = Strings.Trim(aryTemp[i]); + if (dtFixData.Columns.Contains("D_ComponentLotNo")) + { + strD_CompLotNo = Strings.Trim(aryTemp[i]); + } + else + { + strD_CompLotNo = strCompLotNo; + } + } + // 當ComponentLotNo與D_ComponentLotNo皆未設定時, ComponentLotNo = MaterialLotNo + if (intComponentLotNo <= 0 && dtFixData.Columns.Contains("D_ComponentLotNo") == false) + { + strD_CompLotNo = strD_MTLLotNo; + } + if (i + 1 == intD_LaserMark) + { + drAddFix["D_LaserMark"] = Strings.Trim(aryTemp[i]); + if (dtFixData.Columns.Contains("D_LaserMark")) + { + strD_LaserMark = Strings.Trim(aryTemp[i]); + } + else + { + strD_LaserMark = ""; + } + } + if (i + 1 == intD_CassetteNo) + { + drAddFix["D_CassetteNo"] = Strings.Trim(aryTemp[i]); + if (dtFixData.Columns.Contains("D_CassetteNo")) + { + strD_CassetteNo = Strings.Trim(aryTemp[i]); + } + else + { + strD_CassetteNo = ""; + } + } + // 刪除SQL以分包進行 + // strSQL = "Delete From " & strTableName & " Where MaterialNo = '" & strD_MTLNo & "' And MaterialLotNo = '" & strD_MTLLotNo & "' And ComponentNo = '" & drAddFix("D_ComponentNo") & "'" + // CollectionSQL.Add(strSQL) + + drSel = dtTestRecipe.Select("ConversionField = '" + dtData.Columns[i].ColumnName + "'"); + + if (drSel.Length > 0) + { + aryCol[i][idx] = aryTemp[i]; + } + + aryCol_FixString[4][idx] = FileName; + aryCol_FixString[5][idx] = "AutoRun"; + aryCol_FixDateTime[0][idx] = Conversions.ToDate(Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss")); + + } + dtData.Rows.Add(drAdd); + dtFixData.Rows.Add(drAddFix); + + if (x == intDataStart) + { + // 找出lotNo: + strWaferID = dtFixData.Rows[0]["D_ComponentNo"].ToString(); + strSQL = "Select A.LotNo From tblWIPComponentState A, tblWIPLotState B Where A.LotNo = B.LotNo And A.ComponentNo = '" + strWaferID + "'" + " And B.Status In (0,1,2,3,4,5)"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + // 如有找到資料,代表未處理完 + if (drTemp.Read()) + strlotNo = drTemp["LotNo"].ToString(); + drTemp.Close(); + //cmmTemp.Dispose(); + } + + drSel = dtMaterialBasis.Select("MaterialNo= '" + strD_MTLNo + "'"); + if (drSel.Length == 0) + { + throw new Exception("MaterialNo不存在於物料主檔中!"); + } + // 2021/7/22,Ning,若有供應商, 則這筆物料必須有此供應商 + if (!string.IsNullOrEmpty(strVendorNo)) + { + strSQL = "Select MaterialNo From tblMTLMaterialVendorMap Where MaterialNo = '" + strD_MTLNo + "' And VendorNo = '" + strVendorNo + "'"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (!drTemp.Read()) + { + throw new Exception("物料: " + strD_MTLNo + " 未設定供應商: " + strVendorNo); + } + drTemp.Close(); + //cmmTemp.Dispose(); + } + + + idx = idx + 1; + intSeq = intSeq + 1; + + // 分包 檔案搬移 等等處理 改寫 只寫第一筆資料就好 + if (!(dtFormat_Postion == null)) + { + if (dtFormat_Postion.Rows.Count > 0) + { + for (int j = 0, loopTo6 = dtFormat_Postion.Rows.Count - 1; j <= loopTo6; j++) + { + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtFormat_Postion.Rows[j]["AssignFile"], 1, false))) + { + if (!dtData.Columns.Contains(dtFormat_Postion.Rows[j]["ColumnName"].ToString())) + { + dtData.Columns.Add(dtFormat_Postion.Rows[j]["ColumnName"].ToString(), Type.GetType("System.String")); + } + } + } + } + } + foreach (DataColumn column in dtData.Columns) + { + if (dtFormat_Postion.Rows.Count > 0) + { + for (int a = 0, loopTo7 = dtFormat_Postion.Rows.Count - 1; a <= loopTo7; a++) + { + if ((column.ColumnName ?? "") == (dtFormat_Postion.Rows[a]["ColumnName"].ToString() ?? "")) + { + for (int k = 0, loopTo8 = dtData.Rows.Count - 1; k <= loopTo8; k++) + dtData.Rows[k][dtFormat_Postion.Rows[a]["ColumnName"].ToString()] = dtFormat_Postion.Rows[a]["Value"].ToString(); + } + } + } + } + + + if (idx == SplitRecordsLimit) + { + + var oParameterNames_Del = new Dictionary(); + var VarcharParameter_Del = new Dictionary(); + oParameterNames_Del.Add("MaterialNo", "Varchar"); + VarcharParameter_Del.Add("MaterialNo", aryCol_FixString[0]); + oParameterNames_Del.Add("MaterialLotNo", "Varchar"); + VarcharParameter_Del.Add("MaterialLotNo", aryCol_FixString[1]); + oParameterNames_Del.Add("ComponentNo", "Varchar"); + VarcharParameter_Del.Add("ComponentNo", aryCol_FixString[2]); + strSQL = "Delete From " + strTableName + " Where MaterialNo = : MaterialNo And MaterialLotNo = :MaterialLotNo And UPPER(ComponentNo) =:ComponentNo"; + Dictionary argInt32Parameter = null; + Dictionary argDecimalParameter = null; + Dictionary argDateParameter = null; + funAddSQLContent(oSQLContent, ref intSQLIndex, strSQL, -1, HasParameter: true, ParameterNames: oParameterNames_Del, VarcharParameter: VarcharParameter_Del, Int32Parameter: argInt32Parameter, DecimalParameter: argDecimalParameter, DateTimeParameter: argDateParameter); + string argstrDatabaseType = Conversions.ToString(DataBaseType); + ExecuteSQLNoneQuery_ArrayBinding(argstrDatabaseType, strConnectionString, oSQLContent); + // 已成功完成分包 + + intSQLIndex = 1U; + oSQLContent = new Dictionary(); + + var oParameterNames = new Dictionary(); + var Int32Parameter = new Dictionary(); + var DecimalParameter = new Dictionary(); + var VarcharParameter = new Dictionary(); + var DateParameter = new Dictionary(); + // //新增TestSummary, TestSummaryLog + // strSQLAddField = "Insert into " & strTableName & " (" + + oParameterNames.Add("MaterialNo", "Varchar"); + VarcharParameter.Add("MaterialNo", aryCol_FixString[0]); + + oParameterNames.Add("MaterialLotNo", "Varchar"); + VarcharParameter.Add("MaterialLotNo", aryCol_FixString[1]); + + oParameterNames.Add("ComponentNo", "Varchar"); + VarcharParameter.Add("ComponentNo", aryCol_FixString[2]); + + oParameterNames.Add("VendorMaterialNo", "Varchar"); + VarcharParameter.Add("VendorMaterialNo", aryCol_FixString[3]); + + oParameterNames.Add("FileName", "Varchar"); + VarcharParameter.Add("FileName", aryCol_FixString[4]); + + oParameterNames.Add("ImportUserNo", "Varchar"); + VarcharParameter.Add("ImportUserNo", aryCol_FixString[5]); + + oParameterNames.Add("ImportDate", "DateTime"); + DateParameter.Add("ImportDate", aryCol_FixDateTime[0]); + + + strSQLAddField = "Insert into " + strTableName + " (MaterialNo, MaterialLotNo, ComponentNo, VendorMaterialNo, FileName, ImportUserNo, ImportDate"; + strSQLAddValue = " Values (:MaterialNo, :MaterialLotNo, :ComponentNo, :VendorMaterialNo, :FileName, :ImportUserNo,:ImportDate"; + strSQLLogHead = "Insert into " + strLogTableName + " (MaterialNo, MaterialLotNo, ComponentNo, VendorMaterialNo, FileName, ImportUserNo, ImportDate"; + var loopTo9 = (short)(dtData.Columns.Count - 1); + for (i = 0; i <= loopTo9; i++) + { + // TestRecipeBasis有定義此欄位才需要存入, 欄位名稱已轉換為ConversionField + drSel = dtTestRecipe.Select("ConversionField = '" + dtData.Columns[i].ColumnName + "'"); + if (drSel.Length > 0) + { + oParameterNames.Add(dtData.Columns[i].ColumnName, "Varchar"); + VarcharParameter.Add(dtData.Columns[i].ColumnName, aryCol[i]); + strSQLAddField = strSQLAddField + "," + dtData.Columns[i].ColumnName; + strSQLAddValue = strSQLAddValue + ", :" + dtData.Columns[i].ColumnName; + } + + // 明細是否有動態表頭欄位, 有的話以明細為準 + blnD_EquipmentNo = false; + blnD_WaferSize = false; + blnD_Thickness = false; + strColumnName = dtData.Columns[i].ColumnName; + + drSel = dtTestRecipe.Select("ConversionField = '" + strColumnName + "'"); + if (drSel.Length > 0) + { + if (strColumnName.ToUpper() == "EQUIPMENTNO") + { + blnD_EquipmentNo = true; + } + if (strColumnName.ToUpper() == "WAFERSIZE") + { + blnD_WaferSize = true; + } + if (strColumnName.ToUpper() == "THICKNESS") + { + blnD_Thickness = true; + } + } + } + if (!blnD_EquipmentNo && dtTestRecipe.Select("TestRecipeNo = 'EquipmentNo'").Length > 0) + { + strSQLAddField = strSQLAddField + ",EquipmentNo"; + strSQLAddValue = strSQLAddValue + ",'" + strEquipmentNo + "'"; + } + if (!blnD_WaferSize && dtTestRecipe.Select("TestRecipeNo = 'WaferSize'").Length > 0) + { + strSQLAddField = strSQLAddField + ",WaferSize"; + strSQLAddValue = strSQLAddValue + ",'" + strWaferSize + "'"; + } + if (!blnD_Thickness && dtTestRecipe.Select("TestRecipeNo = 'Thickness'").Length > 0) + { + strSQLAddField = strSQLAddField + ",Thickness"; + strSQLAddValue = strSQLAddValue + ",'" + strThickness + "'"; + } + + + strSQL = strSQLAddField + ")" + strSQLAddValue + ")"; + + // Drop table + string argstrDatabaseType1 = Conversions.ToString(DataBaseType); + ExecuteSQLNoneQuery_UPD(argstrDatabaseType1, strConnectionString, CollectionSQL); + CollectionSQL.Clear(); + + funAddSQLContent(oSQLContent, ref intSQLIndex, strSQL, -1, HasParameter: true, ParameterNames: oParameterNames, DecimalParameter: DecimalParameter, Int32Parameter: Int32Parameter, VarcharParameter: VarcharParameter, DateTimeParameter: DateParameter); + string argstrDatabaseType2 = Conversions.ToString(DataBaseType); + ExecuteSQLNoneQuery_ArrayBinding(argstrDatabaseType2, strConnectionString, oSQLContent); + // 已成功完成分包 + + intSQLIndex = 1U; + oSQLContent = new Dictionary(); + + strSQL = Strings.Replace(strSQL, strTableName, strLogTableName); + + funAddSQLContent(oSQLContent, ref intSQLIndex, strSQL, -1, HasParameter: true, ParameterNames: oParameterNames, DecimalParameter: DecimalParameter, Int32Parameter: Int32Parameter, VarcharParameter: VarcharParameter, DateTimeParameter: DateParameter); + string argstrDatabaseType3 = Conversions.ToString(DataBaseType); + ExecuteSQLNoneQuery_ArrayBinding(argstrDatabaseType3, strConnectionString, oSQLContent); + // 已成功完成分包 + + intSQLIndex = 1U; + oSQLContent = new Dictionary(); + + blnSplitPartialSuccess = true; + // SplitRecordsLimit 分包的筆數 ExecuteTimes 已做了幾次分包 相乘 = 已做過的筆數 + // 2021/5/10 Steven Mantis:0090855 當成功寫入DB時,要寫入現況表並記錄已處理的筆數 + intRow = (int)(intRow + SplitRecordsLimit); + // 如果是未完成的檔案,筆數加上上次已執行完的比數 + + fuUpdateAutoLoaderState(Environment.MachineName, "AutoLoaderLib", JobNo, JobFunction, FileName, FilePath, FileSize, strTableName, "N/A", intRow, strlotNo, dtFixData.Rows[0]["D_ComponentNo"].ToString(), defString, datStartTime, defDateTime, SplitRecordsLimit: (int)SplitRecordsLimit); + + idx = 0; + datEventTime = DateTime.Now; + } + } + + + catch (Exception ex) + { + throw; + } + } + + } + } + + TotalRows = TotalRows - intDataStart; // 計算所有筆數 + + // 最後一包的idx筆資料, array中的index 0~idx-1 有值 + if (idx >= 1) + { + try + { + var aryCol_C = new string[501][]; + var aryCol_FixString_C = new string[501][]; + var aryCol_FixDateTime_C = new DateTime[501][]; + + aryCol_C[dtData.Columns.Count - 1] = new string[idx]; // 重新定義二維陣列aryCol_C的維度 + aryCol_FixString_C[5] = new string[idx]; + aryCol_FixDateTime_C[0] = new DateTime[idx]; + + var loopTo10 = (short)(dtData.Columns.Count - 1); + for (i = 0; i <= loopTo10; i++) + { + aryCol_C[i] = new string[idx]; + aryCol_FixString_C[i] = new string[idx]; + aryCol_FixDateTime_C[i] = new DateTime[idx]; + } + + Array.Copy(aryCol_FixString[0], aryCol_FixString_C[0], idx); + Array.Copy(aryCol_FixString[1], aryCol_FixString_C[1], idx); + Array.Copy(aryCol_FixString[2], aryCol_FixString_C[2], idx); + Array.Copy(aryCol_FixString[3], aryCol_FixString_C[3], idx); + Array.Copy(aryCol_FixString[4], aryCol_FixString_C[4], idx); + Array.Copy(aryCol_FixString[5], aryCol_FixString_C[5], idx); + Array.Copy(aryCol_FixDateTime[0], aryCol_FixDateTime_C[0], idx); + + var oParameterNames_Del = new Dictionary(); + var VarcharParameter_Del = new Dictionary(); + oParameterNames_Del.Add("MaterialNo", "Varchar"); + VarcharParameter_Del.Add("MaterialNo", aryCol_FixString_C[0]); + oParameterNames_Del.Add("MaterialLotNo", "Varchar"); + VarcharParameter_Del.Add("MaterialLotNo", aryCol_FixString_C[1]); + oParameterNames_Del.Add("ComponentNo", "Varchar"); + VarcharParameter_Del.Add("ComponentNo", aryCol_FixString_C[2]); + strSQL = "Delete From " + strTableName + " Where MaterialNo = : MaterialNo And MaterialLotNo = :MaterialLotNo And ComponentNo =:ComponentNo"; + Dictionary argInt32Parameter1 = null; + Dictionary argDecimalParameter1 = null; + Dictionary argDateParameter1 = null; + funAddSQLContent(oSQLContent, ref intSQLIndex, strSQL, -1, HasParameter: true, ParameterNames: oParameterNames_Del, VarcharParameter: VarcharParameter_Del, Int32Parameter: argInt32Parameter1, DecimalParameter: argDecimalParameter1, DateTimeParameter: argDateParameter1); + string argstrDatabaseType4 = Conversions.ToString(DataBaseType); + ExecuteSQLNoneQuery_ArrayBinding(argstrDatabaseType4, strConnectionString, oSQLContent); + // 已成功完成分包 + + intSQLIndex = 1U; + oSQLContent = new Dictionary(); + + var oParameterNames = new Dictionary(); + var Int32Parameter = new Dictionary(); + var DecimalParameter = new Dictionary(); + var VarcharParameter = new Dictionary(); + var DateParameter = new Dictionary(); + // //新增TestSummary, TestSummaryLog + // strSQLAddField = "Insert into " & strTableName & " (" + oParameterNames.Add("MaterialNo", "Varchar"); + VarcharParameter.Add("MaterialNo", aryCol_FixString_C[0]); + + oParameterNames.Add("MaterialLotNo", "Varchar"); + VarcharParameter.Add("MaterialLotNo", aryCol_FixString_C[1]); + + oParameterNames.Add("ComponentNo", "Varchar"); + VarcharParameter.Add("ComponentNo", aryCol_FixString_C[2]); + + oParameterNames.Add("VendorMaterialNo", "Varchar"); + VarcharParameter.Add("VendorMaterialNo", aryCol_FixString_C[3]); + + oParameterNames.Add("FileName", "Varchar"); + VarcharParameter.Add("FileName", aryCol_FixString_C[4]); + + oParameterNames.Add("ImportUserNo", "Varchar"); + VarcharParameter.Add("ImportUserNo", aryCol_FixString_C[5]); + + oParameterNames.Add("ImportDate", "DateTime"); + DateParameter.Add("ImportDate", aryCol_FixDateTime_C[0]); + + + strSQLAddField = "Insert into " + strTableName + " (MaterialNo, MaterialLotNo, ComponentNo, VendorMaterialNo, FileName, ImportUserNo, ImportDate"; + strSQLAddValue = " Values (:MaterialNo, :MaterialLotNo, :ComponentNo, :VendorMaterialNo, :FileName, :ImportUserNo,:ImportDate"; + strSQLLogHead = "Insert into " + strLogTableName + " (MaterialNo, MaterialLotNo, ComponentNo, VendorMaterialNo, FileName, ImportUserNo, ImportDate"; + + + bool blnD_EquipmentNo1 = default(bool), blnD_WaferSize1 = default(bool), blnD_Thickness1 = default(bool); + var loopTo11 = (short)(dtData.Columns.Count - 1); + for (i = 0; i <= loopTo11; i++) + { + // TestRecipeBasis有定義此欄位才需要存入, 欄位名稱已轉換為ConversionField + drSel = dtTestRecipe.Select("ConversionField = '" + dtData.Columns[i].ColumnName + "'"); + if (drSel.Length > 0) + { + oParameterNames.Add(dtData.Columns[i].ColumnName, "Varchar"); + Array.Copy(aryCol[i], aryCol_C[i], idx); + VarcharParameter.Add(dtData.Columns[i].ColumnName, aryCol_C[i]); + strSQLAddField = strSQLAddField + "," + dtData.Columns[i].ColumnName; + strSQLAddValue = strSQLAddValue + ", :" + dtData.Columns[i].ColumnName; + } + + // 明細是否有動態表頭欄位, 有的話以明細為準 + blnD_EquipmentNo1 = false; + blnD_WaferSize1 = false; + blnD_Thickness1 = false; + strColumnName = dtData.Columns[i].ColumnName; + + drSel = dtTestRecipe.Select("ConversionField = '" + strColumnName + "'"); + if (drSel.Length > 0) + { + if (strColumnName.ToUpper() == "EQUIPMENTNO") + { + blnD_EquipmentNo1 = true; + } + if (strColumnName.ToUpper() == "WAFERSIZE") + { + blnD_WaferSize1 = true; + } + if (strColumnName.ToUpper() == "THICKNESS") + { + blnD_Thickness1 = true; + } + } + } + if (!blnD_EquipmentNo1 && dtTestRecipe.Select("TestRecipeNo = 'EquipmentNo'").Length > 0) + { + strSQLAddField = strSQLAddField + ",EquipmentNo"; + strSQLAddValue = strSQLAddValue + ",'" + strEquipmentNo + "'"; + } + if (!blnD_WaferSize && dtTestRecipe.Select("TestRecipeNo = 'WaferSize'").Length > 0) + { + strSQLAddField = strSQLAddField + ",WaferSize"; + strSQLAddValue = strSQLAddValue + ",'" + strWaferSize + "'"; + } + if (!blnD_Thickness && dtTestRecipe.Select("TestRecipeNo = 'Thickness'").Length > 0) + { + strSQLAddField = strSQLAddField + ",Thickness"; + strSQLAddValue = strSQLAddValue + ",'" + strThickness + "'"; + } + + + strSQL = strSQLAddField + ")" + strSQLAddValue + ")"; + + // Drop table + string argstrDatabaseType5 = Conversions.ToString(DataBaseType); + ExecuteSQLNoneQuery_UPD(argstrDatabaseType5, strConnectionString, CollectionSQL); + CollectionSQL.Clear(); + + Dictionary argBLOBParameter4 = null; + funAddSQLContent(oSQLContent, ref intSQLIndex, strSQL, -1, HasParameter: true, ParameterNames: oParameterNames, DecimalParameter: DecimalParameter, Int32Parameter: Int32Parameter, VarcharParameter: VarcharParameter, DateTimeParameter: DateParameter); + string argstrDatabaseType6 = Conversions.ToString(DataBaseType); + ExecuteSQLNoneQuery_ArrayBinding(argstrDatabaseType6, strConnectionString, oSQLContent); + + intSQLIndex = 1U; + oSQLContent = new Dictionary(); + + + strSQL = Strings.Replace(strSQL, strTableName, strLogTableName); + funAddSQLContent(oSQLContent, ref intSQLIndex, strSQL, -1, HasParameter: true, ParameterNames: oParameterNames, DecimalParameter: DecimalParameter, Int32Parameter: Int32Parameter, VarcharParameter: VarcharParameter, DateTimeParameter: DateParameter); + string argstrDatabaseType7 = Conversions.ToString(DataBaseType); + ExecuteSQLNoneQuery_ArrayBinding(argstrDatabaseType7, strConnectionString, oSQLContent); + intSQLIndex = 1U; + oSQLContent = new Dictionary(); + idx = 0; + + // 全都完成,將現況表的資料刪除,並寫入資料到log + fuUpdateAutoLoaderState(Environment.MachineName, "AutoLoaderLib", JobNo, JobFunction, FileName, FilePath, FileSize, strTableName, "N/A", intRow, strlotNo, dtFixData.Rows[0]["D_ComponentNo"].ToString(), defString, datStartTime, defDateTime, true); + } + + catch (Exception ex) + { + throw; + } + } + + objReader.Close(); + } + + catch (Exception ex) + { + // 有錯誤時,要將錯誤訊息紀錄上現況表上 + // 若有成功處理的筆數,則把失敗訊息寫上;若無成功處理筆數,則不寫現況表,並將檔案直接搬移到fail + strFailMessage = "分包處理失敗: " + ex.Message; + if (blnSplitPartialSuccess) + { + fuUpdateAutoLoaderState(Environment.MachineName, "AutoLoaderLib", JobNo, JobFunction, FileName, FilePath, FileSize, strTableName, "N/A", intRow, strlotNo, strWaferID, strFailMessage, datStartTime, defDateTime, false, (int)SplitRecordsLimit); + } + else if (blnSplitPartialSuccess == false && StartRow != defInteger) // 分包續處理,第一次就錯,需要更新錯誤訊息與時間'完全沒成功,又有起始處理筆數 + { + fuUpdateAutoLoaderState(Environment.MachineName, "AutoLoaderLib", JobNo, JobFunction, FileName, FilePath, FileSize, strTableName, "N/A", intRow, strlotNo, strWaferID, strFailMessage, datStartTime, defDateTime, false, (int)SplitRecordsLimit); + } + + throw; + } + finally + { + // 寫入log資料 + fuAddAutoLoaderLog(Environment.MachineName, "AutoLoaderLib", JobNo, JobFunction, FileName, FilePath, FileSize, "N/A", strlotNo, strWaferID, strFailMessage, datStartTime, defDateTime, TotalRows); + } + // TestSum, TestSumLog存入DB + if (!dtFixData.Columns.Contains("D_ComponentNo")) + { + throw new Exception("無法取得ComponentNo!!"); + } + + // datEventTime = Now + + for (int idx_INV = 0, loopTo12 = dtData.Rows.Count - 1; idx_INV <= loopTo12; idx_INV++) + { + + //2023/9/15,Ning,华芯振邦相同MATERIALNO允许汇入相同Compoentno + strSQL = "Select MaterialNo ,MaterialLotNo ,ComponentNo From " + strTableName + " Where UPPER(ComponentNo) = '" + dtFixData.Rows[idx]["D_ComponentNo"].ToString().ToUpper() + "' and MaterialNo = '" + strD_MTLNo + "' and MaterialLotNo ='" + strD_MTLLotNo + "'"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + throw new Exception(Conversions.ToString("MaterialNo: " + strD_MTLNo + ", MaterialLotNo: " + strD_MTLLotNo + ", WaferID: " + dtFixData.Rows[idx]["D_ComponentNo"] + " 已匯入, 不允許重新匯入!")); + } + drTemp.Close(); + //cmmTemp.Dispose(); + + // 進料單Component + strSQL = "Insert into tblINVMaterialInComponent (MaterialInNo, MaterialNo, MaterialLotNo, ComponentNo, SlotNo)" + " Values ('" + strMaterialInNo + "','" + strD_MTLNo + "','" + strD_MTLLotNo + "','" + dtFixData.Rows[idx_INV]["D_ComponentNo"].ToString().ToUpper() + "', '" + strD_SlotNo + "')"; + CollectionSQL.Add(strSQL); + + // 原物料倉Component + // '2019/6/12, 依Josh指示, 同一ComponentNo在原物料倉不能有兩筆以上, 依ComponentNo先刪除再新增 + // 'strSQL = "Delete From tblINVRAWInventoryComponent Where ComponentNo = '" & dtFixData.Rows(idx)("D_ComponentNo") & "'" + // 'CollectionSQL.Add(strSQL) + // 2022/11/28,Ning, 071068: 來料檔案匯入, 若不同供應商有相同ComponentNo, 應如何匯入? => 以tblINVRAWInventoryComponent的PK(InventoryNo,MaterialNo,MaterialLotNo, 來檢查, 存在才不允許匯入 + //strSQL = "Select ComponentNo From tblINVRAWInventoryComponent Where InventoryNo = '" + InventoryNo + "' And MaterialNo = '" + strD_MTLNo + "'" + " And MaterialLotNo = '" + strD_MTLLotNo + "' And UPPER(ComponentNo) = '" + dtFixData.Rows[idx]["D_ComponentNo"].ToString().ToUpper() + "'"; + ////cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + //drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + //if (drTemp.Read()) + //{ + // throw new Exception(Conversions.ToString("InventoryNo: " + InventoryNo + ", MaterialNo: " + strD_MTLNo + ", MaterialLotNo: " + strD_MTLLotNo + ", WaferID: " + + // dtFixData.Rows[idx]["D_ComponentNo"] + " 已存在原料倉, 不允許匯入, 若要重新匯入要先做庫房出庫或刪除動作!")); + //} + //drTemp.Close(); + ////cmmTemp.Dispose(); + + strSQL = "Insert into tblINVRAWInventoryComponent (InventoryNo, MaterialNo, MaterialLotNo, ComponentNo, SlotNo, ComponentLotNo, S_LaserMark, B_CassetteNo)" + " Values ('" + InventoryNo + "','" + strD_MTLNo + "','" + strD_MTLLotNo + "','" + dtFixData.Rows[idx_INV]["D_ComponentNo"].ToString().ToUpper() + "', '" + strD_SlotNo + "','" + strD_CompLotNo + "','" + strD_LaserMark + "','" + strD_CassetteNo + "')"; + CollectionSQL.Add(strSQL); + + // 2019/7/23, Ning, 將資料填入tblINVTemp_Component待AutoRun滾算芯片挑片規則, 原料庫InventoryType:0 + // 2019/10/17,Ning,因有可能已存在又重新入庫, 故先刪後增 + // 2020/1/9,Ning,非系統參數ExcludeInventoryCalCompRule中設定的庫房才需寫入tblINVTemp_Component中 + if (blnExcludeINV == false) // 不在排除的庫房內, 需加入tblINVTemp_Component + { + strSQL = "Delete From tblINVTemp_Component Where InventoryNo = '" + InventoryNo + "' And UPPER(ComponentNo) = '" + dtFixData.Rows[idx_INV]["D_ComponentNo"].ToString().ToUpper() + "'"; + CollectionSQL.Add(strSQL); + strSQL = "Insert Into tblINVTemp_Component (InventoryNo, ComponentNo, InventoryType)" + " Values('" + InventoryNo + "','" + dtFixData.Rows[idx_INV]["D_ComponentNo"].ToString().ToUpper() + "',0)"; + CollectionSQL.Add(strSQL); + } + } + + // 若為排除的庫房, 需填入EvnetLog備查 + if (blnExcludeINV == true) + { + strSQL = "Insert into tblSysEventLog (UserID, RecordDate, ServiceName, KeyField, KeyValue, ComputerName)" + " Values ('AutoRun', To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'), 'AutoLoaderLib'," + "'ExcludeInventoryNo','" + InventoryNo + "','" + modWIN.gComputerName + "')"; + CollectionSQL.Add(strSQL); + } + + // 進料單明細需以MaterialNo, MaterialLotNo做Group By計算數量 + dtMTLInDetail = new DataTable("MTLInDetail"); + dtMTLInDetail.Columns.Add("MaterialNo", Type.GetType("System.String")); + dtMTLInDetail.Columns.Add("MaterialLotNo", Type.GetType("System.String")); + dtMTLInDetail.Columns.Add("Qty", Type.GetType("System.Int16")); + if (!dtFixData.Columns.Contains("D_MTLNo")) + { + dtFixData.Columns.Add("D_MTLNo", Type.GetType("System.String")); + foreach (DataRow drFixData in dtFixData.Rows) + { + drFixData["D_MTLNO"] = strMTLNo; + } + } + if (!dtFixData.Columns.Contains("D_MTLLotNo")) + { + dtFixData.Columns.Add("D_MTLLotNo", Type.GetType("System.String")); + foreach (DataRow drFixData in dtFixData.Rows) + { + drFixData["D_MTLLotNo"] = strMTLLotNo; + } + } + dvFixData = dtFixData.DefaultView; + dvFixData.Sort = "D_MTLNo, D_MTLLotNo"; + var loopTo13 = (short)(dvFixData.Count - 1); + for (i = 0; i <= loopTo13; i++) + { + drSel = dtMTLInDetail.Select("MaterialNo = '" + dvFixData[i]["D_MTLNo"].ToString() + "' And MaterialLotNo = '" + dvFixData[i]["D_MTLLotNo"].ToString() + "'"); + if (drSel.Length > 0) + { + drSel[0].BeginEdit(); + drSel[0]["Qty"] = Operators.AddObject(drSel[0]["Qty"], 1); + drSel[0].EndEdit(); + } + else + { + drAdd = dtMTLInDetail.NewRow(); + drAdd["MaterialNo"] = dvFixData[i]["D_MTLNo"].ToString(); + drAdd["MaterialLotNo"] = dvFixData[i]["D_MTLLotNo"].ToString(); + drAdd["Qty"] = 1; + dtMTLInDetail.Rows.Add(drAdd); + } + } + + // 進料單主檔(State直接給2) + strSQL = "Insert into tblINVMaterialInBasis (MaterialInNo, InventoryNo, VendorNo, State, Creator, CreateDate, ConfirmDate)" + " Values ('" + strMaterialInNo + "','" + InventoryNo + "','" + strVendorNo + "', 2, 'AutoRun'," + " To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')," + "To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'))"; + CollectionSQL.Add(strSQL); + + foreach (DataRow drDetail in dtMTLInDetail.Rows) + { + + strSQL = Conversions.ToString("Select SafeQty,UnitNo From tblMTLMaterialBasis Where MaterialNo = '" + drDetail["MaterialNo"] + "'"); + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + if (!(drTemp["SafeQty"] is DBNull)) + { + decSafeQty = Conversions.ToDecimal(drTemp["SafeQty"]); + } + else + { + decSafeQty = 0m; + } + strUnitNo = Conversions.ToString(drTemp["UnitNo"]); + } + else + { + decSafeQty = 0m; + strUnitNo = "pcs"; + } + drTemp.Close(); + + // 進料單明細檔 + strSQL = Conversions.ToString("Insert into tblINVMaterialInDetail (MaterialInNo,MaterialNo,MaterialLotNo,LocatorNo,UnitNo,Qty,LimitTime)" + " Values ('" + strMaterialInNo + "','" + + drDetail["MaterialNo"] + "','" + drDetail["MaterialLotNo"] + "','N/A','" + strUnitNo + "'," + drDetail["Qty"] + ",0)"); + CollectionSQL.Add(strSQL); + + // 進料單確認(入庫) + // 處理原料倉現況主檔資料 + strSQL = Conversions.ToString("Select * From tblINVRawInventory Where InventoryNo = '" + InventoryNo + "' And MaterialNo = '" + + drDetail["MaterialNo"] + "'"); + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + // 數量相加 + strSQL = Conversions.ToString("Update tblINVRawInventory Set CurQty = CurQty + " + + drDetail["Qty"] + " Where InventoryNo = '" + InventoryNo + "'" + " And MaterialNo = '" + drDetail["MaterialNo"] + "'"); + CollectionSQL.Add(strSQL); + drTemp.Close(); + } + else // 找不到資料時一律先新增一筆CurrentQty=0的資料列,再做Update動作 + { + drTemp.Close(); + strSQL = Conversions.ToString("Insert into tblINVRawInventory (InventoryNo, MaterialNo, SafeQty, CurQty, AllocateQty, UnitNo)" + " Values ('" + InventoryNo + "','" + + drDetail["MaterialNo"] + "'," + decSafeQty + ", 0, 0,'" + strUnitNo + "')"); + + // 先確定之前沒有加過再加這筆資料 + blnFound = false; + var loopTo14 = (short)IniCollectionSQL.Count; + for (i = 1; i <= loopTo14; i++) + { + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(strSQL, IniCollectionSQL[i], false))) + { + blnFound = true; + } + } + if (!blnFound) + { + IniCollectionSQL.Add(strSQL); + } + + strSQL = Conversions.ToString("Update tblINVRawInventory Set CurQty = CurQty + " + + drDetail["Qty"] + " Where InventoryNo = '" + InventoryNo + "'" + " And MaterialNo = '" + drDetail["MaterialNo"] + "'"); + CollectionSQL.Add(strSQL); + } + + // 處理原料倉儲位現況資料 + strSQL = Conversions.ToString("Select * From tblINVRawInventoryLoc Where InventoryNo = '" + InventoryNo + "'" + " And LocatorNo = 'N/A' And MaterialNo = '" + + drDetail["MaterialNo"] + "'" + " And MaterialLotNo = '" + drDetail["MaterialLotNo"] + "'"); + + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + // 數量相加 + strSQL = Conversions.ToString("Update tblINVRawInventoryLoc Set LocQty = LocQty + " + + drDetail["Qty"] + "," + " InputDate = To_Date('" + Strings.Format(Conversions.ToDate(datEventTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')" + + " Where InventoryNo = '" + InventoryNo + "'" + " And LocatorNo = 'N/A' And MaterialNo = '" + drDetail["MaterialNo"] + "'" + " And MaterialLotNo = '" + + drDetail["MaterialLotNo"] + "'"); + CollectionSQL.Add(strSQL); + } + else + { + // 新增一筆 + strSQL = Conversions.ToString("Insert into tblINVRawInventoryLoc (InventoryNo, LocatorNo, MaterialNo, MaterialLotNo, VendorNo, LocQty, InputDate)" + " Values ('" + InventoryNo + "','N/A','" + + drDetail["MaterialNo"] + "','" + drDetail["MaterialLotNo"] + "','" + strVendorNo + "'," + drDetail["Qty"] + ", To_Date('" + Strings.Format(Conversions.ToDate(datEventTime), "yyyy/MM/dd H:mm:ss") + + "','YYYY/MM/DD HH24:MI:SS'))"); + CollectionSQL.Add(strSQL); + } + drTemp.Close(); + } + + var loopTo15 = (short)IniCollectionSQL.Count; + for (i = 1; i <= loopTo15; i++) + FinalCollectionSQL.Add(IniCollectionSQL[i]); + var loopTo16 = (short)CollectionSQL.Count; + for (i = 1; i <= loopTo16; i++) + FinalCollectionSQL.Add(CollectionSQL[i]); + + // //執行SQL指令 + string argstrDatabaseType8 = Conversions.ToString(DataBaseType); + ExecuteSQLNoneQuery_UPD(argstrDatabaseType8, strConnectionString, FinalCollectionSQL); + + blnResult = true; + } + + catch (Exception ex) + { + throw; + } + + finally + { + if (objReader != null) + { + objReader.Close(); + objReader = null; + } + CloseConnection(cnnTemp); + aryTemp = null; + } + + return blnResult; + + } + + /// + /// + /// + /// 原vb預設值false + /// 原vb預設值0 + /// + /// + private bool fuTestDataToTestSum_MTL_BigFile_Excel(string strTestRecipeType, string pFilePath, string PSNo, string strMSplitSign, string strDSplitSign, + int intMTLNo, int intMTLLotNo, int intVendorNo, int intComponentLotNo, + int intD_MTLNo, int intD_MTLLotNo, int intD_ComponentNo, int intD_SlotNo, + int intD_CompLotNo, int intD_LaserMark, int intD_CassetteNo, + int intEquipmentNo, int intWaferSize, int intThickness, + int intColumnStart, int intDataStart, + string InventoryNo, string FileName, + string JobNo, string JobFunction, + string FilePath, int FileSize, long SplitRecordsLimit, + ref bool blnSplitPartialSuccess, ref int TotalRows, + DataTable dtFormat_Postion = null, int StartRow = defInteger) + { + + bool blnResult; + var objReader = default(StreamReader); + // 2019/3/26, Ning, 加入Encode, 排除中文亂碼問題 + // Dim encode As System.Text.Encoding = System.Text.Encoding.GetEncoding("UTF-8") + var encode = Encoding.Default; + string strLine; + + string strMTLNo = default(string), strMTLLotNo = default(string), strVendorNo = default(string), strCompLotNo = default(string), strD_MTLNo = default(string), strD_MTLLotNo = default(string), strD_CompLotNo = default(string), strD_SlotNo = default(string), strD_LaserMark = default(string), strD_CassetteNo = default(string); + string strComponentNo; + var strEquipmentNo = default(string); + var strWaferSize = default(string); + var strThickness = default(string); + + string[] aryTemp; + var dtData = default(DataTable); + DataTable dtFixData; // 存固定參數的欄位值 + short i; + short z; + bool blnDataAdd = false; + string strOrgColName, strColumnName; + DataRow drAdd; + DataRow drAddFix; + string strSQL, strTableName, strSQLAddField, strSQLAddValue; + var CollectionSQL = new Collection(); + + IDbConnection cnnTemp = default(IDbConnection); + DbDataReader drTemp; + + string TestRecipeType; + string strLogTableName, strSQLHead, strSQLLogHead; + //System.Data.OleDb.OleDbDataAdapter daTemp; + DataTable dtTestRecipe; + DataTable dtMaterialBasis; + DataSet dsTemp; + DateTime datEventTime; + + // 開立進料單 + DataView dvFixData; + DataRow[] drSel; + DataTable dtMTLInDetail; + string strMaterialInNo, strUnitNo; + bool blnFound; + var IniCollectionSQL = new Collection(); + var FinalCollectionSQL = new Collection(); + decimal decSafeQty; + + // 2020/1/9,Ning,排除庫房編號 + var strExcludeINVNo = default(string); + string[] strSplit; + bool blnExcludeINV; + var dtNotFixData = new DataTable("NotFixData"); // 0088935: [SEMI_Wafer] AutoLoader測試資料動態參數收集優化_AutoLoader 電性值匯入調整 + // 存進非參數資料 + dtNotFixData.Columns.Add("Column_NotFix", Type.GetType("System.String")); + dtNotFixData.Columns.Add("Value_NotFix", Type.GetType("System.String")); + DataRow drNotFix; + dtFixData = new DataTable("NotFixData"); + + var oSQLContent = new Dictionary(); + uint intSQLIndex = 1U; + + var aryCol = new string[501][]; + var aryCol_FixString = new string[501][]; // 固定欄位 MaterialNo, MaterialLotNo, ComponentNo, VendorMaterialNo, FileName, ImportUserNo + var aryCol_FixDateTime = new DateTime[501][]; // 固定欄位 ImportDate + int idx = 0; + int idx2 = 0; + int intSeq = 1; + bool WriteString = false; + bool WriteDate = false; + var dtUnNumeric = new DataTable("UnNumeric"); + int intRow = 0; + string strlotNo = "N/A"; + string strWaferID = "N/A"; + var datStartTime = DateTime.Now; + string strFailMessage = defString; + + DataSet dsExcel; + string strMsg = ""; + int sheetIndex = 0; + int colIndex = 0; + XSSFRow detailrow; + try + { + // //Create connection + cnnTemp = CreateConnection(strConnectionString); + + blnResult = false; + + // 2021/4/19, Ning, 若AutoLoaderJob.xml的Parameter3有定義TestRecipeType, 則以該值為優先, 若沒有定再以下述方式找TestRecipeType + if ((strTestRecipeType ?? "") != defString) + { + TestRecipeType = strTestRecipeType; + } + else + { + // 來料只會有一種測試類別, 取得TestRecipeBasis中TestRecipeClass = 1的TestRecipeType即是來料的測試類別 + // 2019/9/9,Ning,來料可能有多種測試類別, 但一個區段只會有一個 + strSQL = "Select TestRecipeType From tblSYSTestRecipeBasis Where TestRecipeClass = 1 And IssueState = 2 And PSNo = '" + PSNo + "'"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + TestRecipeType = Conversions.ToString(drTemp["TestRecipeType"]); + } + else + { + throw new Exception("解析檔案失敗, 無法找到分類為來料, 區段為: " + PSNo + " 之測試類別!"); + } + drTemp.Close(); + //cmmTemp.Dispose(); + } + + // 電性值資料表名稱: tblWIPTestSum_測試類別 + strTableName = "TBLWIPTESTSUM_" + TestRecipeType; + strLogTableName = "TBLWIPTESTSUMLOG_" + TestRecipeType; + + // 依測試類別找出其TestRecipeNo(參數編號), ConversionField(欄位名稱) + strSQL = "Select TestRecipeNo, ConversionField,DataType From tblSYSTestRecipeBasis Where IssueState = 2 And TestRecipeType = '" + TestRecipeType + "'"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp); + dsTemp = new DataSet(); + //daTemp.Fill(dsTemp, "TestRecipe"); + ExecuteSQLQuery_Adapter(strSQL, dsTemp, "TestRecipe", cnnTemp); + dtTestRecipe = dsTemp.Tables["TestRecipe"]; + + strSQL = "Select MaterialNo From tblMTLMaterialBasis Where IssueState = 2 "; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp); + dsTemp = new DataSet(); + //daTemp.Fill(dsTemp, "MaterialBasis"); + ExecuteSQLQuery_Adapter(strSQL, dsTemp, "MaterialBasis", cnnTemp); + dtMaterialBasis = dsTemp.Tables["MaterialBasis"]; + + + // 分包機制:程式搬移 + // 2020/1/9,Ning,取得系統參數ExcludeInventoryCalCompRule(排除的庫房編號) + strSQL = "Select ParameterValue From tblSysParameter Where ParameterType = 'SysInfo' And ParameterNo = 'ExcludeInventoryCalCompRule'"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + strExcludeINVNo = drTemp["ParameterValue"].ToString(); + } + drTemp.Close(); + //cmmTemp.Dispose(); + + blnExcludeINV = false; + if (!string.IsNullOrEmpty(strExcludeINVNo)) + { + strSplit = strExcludeINVNo.Split(','); + foreach (string strINVNo in strSplit) + { + if ((strINVNo.Trim() ?? "") == (InventoryNo ?? "")) + { + blnExcludeINV = true; + break; + } + } + } + + // 取得進料單號 + // 2019/9/17,Ning,進料單若取有問題, 拋出錯誤訊息, 不繼續執行 + strMaterialInNo = funGetMaterialInNo(true); + + + var file = new FileStream(pFilePath, FileMode.Open); + var workbook = WorkbookFactory.Create(file); + file.Close(); + + dsExcel = new DataSet(); + // 為每個WorkSheet建立出一個table + + // 只需取第1個Sheet + sheetIndex = 0; + var sheet = workbook.GetSheetAt(sheetIndex); + // 建立一個新的table + var dtNew = dsExcel.Tables.Add(workbook.GetSheetName(sheetIndex)); + var excelRow = sheet.GetRow(0); + ICell excelCell; + HSSFFormulaEvaluator formulaEvaluator = null; + + datEventTime = DateTime.Now; + + if (StartRow != defInteger) // 未完成的資料,分包筆數必須加上已完成筆數 + { + intDataStart = StartRow + intDataStart - 1; // 應該要加上DataStart + // 如果intDataStart 1) + { + + strMTLNo = aryTemp[1].ToString().Trim(); + blFixData = true; + if (string.IsNullOrEmpty(strMTLNo)) + { + throw new Exception("[%DO NOT GET VALUE%]:MaterialNo!!"); + } + } + else + { + throw new Exception("[%Not support this file format%],MaterialNo[%To Analyze data format need to%]" + strMSplitSign); + // Throw New System.Exception("不支援此檔案格式,格式內容資料解析需為:或=") + } + } + + if (x == intMTLLotNo) // 2.取得VendorMTLLotNo + { + // 2019/2/22, Ning, 以傳入的表頭分隔字元拆解 + excelCell = excelRow.GetCell(0); + strVal = ""; + if (excelCell != null) + { + funGetCellValue(excelCell, sheet, workbook, ref strVal); + } + + aryTemp = strVal.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + strMTLLotNo = aryTemp[1].ToString().Trim(); + blFixData = true; + if (string.IsNullOrEmpty(strMTLLotNo)) + { + throw new Exception("[%DO NOT GET VALUE%]:MaterialLotNo!!"); + } + } + else + { + throw new Exception("[%Not support this file format%],MaterialLotNo[%To Analyze data format need to%]" + strMSplitSign); + } + } + + if (x == intVendorNo) // 3.取得VendorNo + { + // 2019/2/22, Ning, 以傳入的表頭分隔字元拆解 + excelCell = excelRow.GetCell(0); + strVal = ""; + if (excelCell != null) + { + funGetCellValue(excelCell, sheet, workbook, ref strVal); + } + + aryTemp = strVal.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + strVendorNo = aryTemp[1].ToString().Trim(); + if (string.IsNullOrEmpty(strVendorNo)) + { + throw new Exception("無法取得VendorNo!!"); + } + } + else + { + throw new Exception("不支援此檔案格式,格式內容資料解析需為" + strMSplitSign); + } + } + + if (x == intComponentLotNo) // 3.5取得ComponentLotNo + { + // 2019/2/22, Ning, 以傳入的表頭分隔字元拆解 + excelCell = excelRow.GetCell(0); + strVal = ""; + if (excelCell != null) + { + funGetCellValue(excelCell, sheet, workbook, ref strVal); + } + + aryTemp = strVal.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + strCompLotNo = aryTemp[1].ToString().Trim(); + blFixData = true; + if (string.IsNullOrEmpty(strCompLotNo)) + { + throw new Exception("[%DO NOT GET VALUE%]:ComponentLotNo!!"); + } + } + else + { + throw new Exception("[%Not support this file format%],ComponentLotNo[%To Analyze data format need to%]" + strMSplitSign); + } + } + + if (x == intEquipmentNo) // 4.取得EquipmentNo + { + + // 2019/2/22, Ning, 以傳入的表頭分隔字元拆解 + excelCell = excelRow.GetCell(0); + strVal = ""; + if (excelCell != null) + { + funGetCellValue(excelCell, sheet, workbook, ref strVal); + } + + aryTemp = strVal.Split(Conversions.ToChar(strMSplitSign)); + + + if (aryTemp.Length > 1) + { + strEquipmentNo = aryTemp[1].ToString().Trim(); + blFixData = true; + } + else + { + throw new Exception("[%Not support this file format%],EquipmentNo[%To Analyze data format need to%]" + strMSplitSign); + } + } + + if (x == intWaferSize) // 5.取得Wafer尺寸 + { + + // 2019/2/22, Ning, 以傳入的表頭分隔字元拆解 + excelCell = excelRow.GetCell(0); + strVal = ""; + if (excelCell != null) + { + funGetCellValue(excelCell, sheet, workbook, ref strVal); + } + + aryTemp = strVal.Split(Conversions.ToChar(strMSplitSign)); + + + if (aryTemp.Length > 1) + { + strWaferSize = aryTemp[1].ToString().Trim(); + blFixData = true; + } + else + { + throw new Exception("[%Not support this file format%],WaferSize[%To Analyze data format need to%]" + strMSplitSign); + } + } + + if (x == intThickness) // 6.取得厚度 + { + // 2019/2/22, Ning, 以傳入的表頭分隔字元拆解 + excelCell = excelRow.GetCell(0); + strVal = ""; + if (excelCell != null) + { + funGetCellValue(excelCell, sheet, workbook, ref strVal); + } + + aryTemp = strVal.Split(Conversions.ToChar(strMSplitSign)); + + if (aryTemp.Length > 1) + { + strThickness = aryTemp[1].ToString().Trim(); + blFixData = true; + } + else + { + throw new Exception("[%Not support this file format%],Thickness[%To Analyze data format need to%]" + strMSplitSign); + } + } + // 2021/3/12 Steevn Mantis: 0088935: [SEMI_Wafer] AutoLoader測試資料動態參數收集優化_AutoLoader 電性值匯入調整 + // 依照格式檔設定的欄位名語位置在讀EXCEL檔時找到相對的欄位並記錄值 excelCell = excelRow.GetCell(x) + excelCell = excelRow.GetCell(0); + strVal = ""; + if (excelCell != null) + { + funGetCellValue(excelCell, sheet, workbook, ref strVal); + } + + aryTemp = strVal.Split(Conversions.ToChar(strMSplitSign)); + + if (!(dtFormat_Postion == null)) + { + if (dtFormat_Postion.Rows.Count > 0) + { + aryTemp = strVal.Split(Conversions.ToChar(strMSplitSign)); + var loopTo1 = (short)(dtFormat_Postion.Rows.Count - 1); + for (i = 0; i <= loopTo1; i++) + { + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(x, dtFormat_Postion.Rows[i]["ColumnPosition"], false))) + { + if (aryTemp.Count() > 2) // EX: Folder:D:\TFS\Industry\v5\Dev_SEMI_Wafer\MESClient\:111 + { + for (int j = 1, loopTo2 = aryTemp.Count() - 1; j <= loopTo2; j++) + { + if (j == aryTemp.Count() - 1) + { + dtFormat_Postion.Rows[i]["Value"] += aryTemp[j].ToString().Trim(); + } + else + { + dtFormat_Postion.Rows[i]["Value"] += aryTemp[j].ToString().Trim() + strMSplitSign; + } + } + } + else + { + dtFormat_Postion.Rows[i]["Value"] = aryTemp[1].ToString().Trim(); + } + } + } + } + } + + if (x == intColumnStart) // 取得欄位名稱 + { + + try + { + + dtData = new DataTable("CSVData"); + dtFixData = new DataTable("FixData"); + drAdd = dtData.NewRow(); + var loopTo3 = excelRow.LastCellNum - 1; + for (colIndex = 0; colIndex <= loopTo3; colIndex++) + { + excelCell = excelRow.GetCell(colIndex); + strVal = ""; + if (excelCell != null) + { + funGetCellValue(excelCell, sheet, workbook, ref strVal); + } + + if (dtData.Columns.Count <= colIndex) + { + + // 2019/3/22,Ning,先以原始欄位存入, 後端再判斷是否為固定參數的位置 + + strColumnName = strVal.ToString().ToUpper().Trim(); + //2023/10/16,Ning,147871: [Industry_Base] 來料匯入功能的欄位轉換方式邏輯調整 + bool blnMustConvert = false; + if (char.IsLetter(Conversions.ToChar(strColumnName.Substring(0, 1)))) + { + for (int jj = 0, loopTo1 = strColumnName.Length - 1; jj <= loopTo1; jj++) + { + if (!char.IsNumber(Conversions.ToChar(strColumnName.Substring(jj, 1))) && !char.IsLetter(Conversions.ToChar(strColumnName.Substring(jj, 1))) && strColumnName.Substring(jj, 1) != "_") + { + blnMustConvert = true; + break; + } + } + } + else + { + blnMustConvert = true; + } + if (blnMustConvert) + { + strSQL = "Select ConversionField From tblSYSFieldConvertBasis where DocumentField = '" + strColumnName.ToUpper() + "'"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + strColumnName = Conversions.ToString(drTemp["ConversionField"]); + } + drTemp.Close(); + //cmmTemp.Dispose(); + } + + drSel = dtTestRecipe.Select("TestRecipeNo = '" + strColumnName + "'"); + if (drSel.Length > 0) + { + //strColumnName = drSel[0]["ConversionField"].ToString(); + } + else + { + // 欄位名稱只能是數字或英文字母, 這兩者除外的皆以_取代 + for (int jj = 0, loopTo4 = strColumnName.Length - 1; jj <= loopTo4; jj++) + { + if (!char.IsNumber(Conversions.ToChar(strColumnName.Substring(jj, 1))) && !char.IsLetter(Conversions.ToChar(strColumnName.Substring(jj, 1)))) + { + strColumnName = Strings.Replace(strColumnName, strColumnName.Substring(jj, 1), "_"); + } + } + + if (string.IsNullOrEmpty(strColumnName)) + { + strColumnName = "COL" + colIndex; + } + + // 判斷取代後的欄位是否已存在,若已存在則於欄位後方加COL+欄位顯示順序 + if (dtData.Columns.Contains(strColumnName)) + { + strColumnName = strColumnName + "COL" + colIndex; + } + } + + dtData.Columns.Add(strColumnName.ToUpper(), Type.GetType("System.String")); + + // 明細固定參數, D_MTLNo, D_MTLLotNo, D_ComponentNo, D_SlotNo, D_ComponentLotNo, D_LaserMark, D_CassetteNo + if (colIndex + 1 == intD_MTLNo) + { + strColumnName = "D_MTLNo"; + dtFixData.Columns.Add(strColumnName, Type.GetType("System.String")); + } + if (colIndex + 1 == intD_MTLLotNo) + { + strColumnName = "D_MTLLotNo"; + dtFixData.Columns.Add(strColumnName, Type.GetType("System.String")); + } + if (colIndex + 1 == intD_ComponentNo) + { + strColumnName = "D_ComponentNo"; + dtFixData.Columns.Add(strColumnName, Type.GetType("System.String")); + } + if (colIndex + 1 == intD_SlotNo) + { + strColumnName = "D_SlotNo"; + dtFixData.Columns.Add(strColumnName, Type.GetType("System.String")); + } + if (colIndex + 1 == intD_CompLotNo) + { + strColumnName = "D_ComponentLotNo"; + dtFixData.Columns.Add(strColumnName, Type.GetType("System.String")); + } + if (colIndex + 1 == intD_LaserMark) + { + strColumnName = "D_LaserMark"; + dtFixData.Columns.Add(strColumnName, Type.GetType("System.String")); + } + if (colIndex + 1 == intD_CassetteNo) + { + strColumnName = "D_CassetteNo"; + dtFixData.Columns.Add(strColumnName, Type.GetType("System.String")); + } + } + + + + } + } + catch + { + throw; + } + } + + if (x == intDataStart || blnDataAdd == true) // 取得明細資料 + { + + blnDataAdd = true; + if (x == intDataStart) + { + aryCol[dtData.Columns.Count - 1] = new string[(int)(SplitRecordsLimit - 1L + 1)]; + aryCol_FixString[5] = new string[(int)(SplitRecordsLimit - 1L + 1)]; + aryCol_FixDateTime[0] = new DateTime[(int)(SplitRecordsLimit - 1L + 1)]; + // 二維陣列初始化 + var loopTo5 = (short)(dtData.Columns.Count - 1); + for (i = 0; i <= loopTo5; i++) + { + aryCol[i] = new string[(int)(SplitRecordsLimit - 1L + 1)]; + aryCol_FixString[i] = new string[(int)(SplitRecordsLimit - 1L + 1)]; + aryCol_FixDateTime[i] = new DateTime[(int)(SplitRecordsLimit - 1L + 1)]; + } + + } + try + { + // aryTemp = strLine.Split(strDSplitSign) + bool blnAddData = false; // 若excel整行都無資料,則不要加row至dtData + drAdd = dtData.NewRow(); + drAddFix = dtFixData.NewRow(); + // 填入資料 + var loopTo6 = (short)(dtData.Columns.Count - 1); + for (i = 0; i <= loopTo6; i++) + { + strVal = ""; + excelCell = excelRow.GetCell(i); + if (excelCell != null) + { + funGetCellValue(excelCell, sheet, workbook, ref strVal); + if (!string.IsNullOrEmpty(strVal)) + { + blnAddData = true; + } + } + if (!string.IsNullOrEmpty(strVal)) + { + drAdd[i] = Strings.Trim(strVal); + if (i + 1 == intD_MTLNo) + { + drAddFix["D_MTLNo"] = Strings.Trim(strVal); + + // 若明細沒有供應商料號, 用表頭資料取代 + if (dtFixData.Columns.Contains("D_MTLNo")) + { + strD_MTLNo = Strings.Trim(strVal); + } + else + { + strD_MTLNo = strMTLNo; + } + if (string.IsNullOrEmpty(strD_MTLNo)) + { + throw new Exception("MaterialNo不可為空白!"); + } + aryCol_FixString[0][idx] = strD_MTLNo; + aryCol_FixString[3][idx] = strD_MTLNo; + + } + if (i + 1 == intD_MTLLotNo) + { + drAddFix["D_MTLLotNo"] = Strings.UCase(Strings.Trim(strVal)); + // 若明細沒有供應商物料批號, 用表頭資料取代 + if (dtFixData.Columns.Contains("D_MTLLotNo")) + { + strD_MTLLotNo = Strings.Trim(strVal); + } + else + { + strD_MTLLotNo = strMTLLotNo; + } + if (string.IsNullOrEmpty(strD_MTLLotNo)) + { + throw new Exception("MaterialLotNo不可為空白!"); + } + aryCol_FixString[1][idx] = Strings.UCase(strD_MTLLotNo); + + } + if (i + 1 == intD_ComponentNo) + { + drAddFix["D_ComponentNo"] = Strings.Trim(strVal.ToUpper()); + aryCol_FixString[2][idx] = Strings.Trim(strVal.ToUpper()); + + } + if (i + 1 == intD_SlotNo) + { + drAddFix["D_SlotNo"] = Strings.Trim(strVal); + if (dtFixData.Columns.Contains("D_SlotNo")) + { + strD_SlotNo = Strings.Trim(strVal); + } + else + { + strD_SlotNo = ""; + } + } + if (i + 1 == intD_CompLotNo) + { + drAddFix["D_ComponentLotNo"] = Strings.Trim(strVal); + if (dtFixData.Columns.Contains("D_ComponentLotNo")) + { + strD_CompLotNo = Strings.Trim(strVal); + } + else + { + strD_CompLotNo = strCompLotNo; + } + } + // 當ComponentLotNo與D_ComponentLotNo皆未設定時, ComponentLotNo = MaterialLotNo + if (intComponentLotNo <= 0 && dtFixData.Columns.Contains("D_ComponentLotNo") == false) + { + strD_CompLotNo = strD_MTLLotNo; + } + if (i + 1 == intD_LaserMark) + { + drAddFix["D_LaserMark"] = Strings.Trim(strVal); + if (dtFixData.Columns.Contains("D_LaserMark")) + { + strD_LaserMark = Strings.Trim(strVal); + } + else + { + strD_LaserMark = ""; + } + } + if (i + 1 == intD_CassetteNo) + { + drAddFix["D_CassetteNo"] = Strings.Trim(strVal); + if (dtFixData.Columns.Contains("D_CassetteNo")) + { + strD_CassetteNo = Strings.Trim(strVal); + } + else + { + strD_CassetteNo = ""; + } + } + + drSel = dtTestRecipe.Select("ConversionField = '" + dtData.Columns[i].ColumnName + "'"); + + if (drSel.Length > 0) + { + aryCol[i][idx] = strVal; + } + + aryCol_FixString[4][idx] = FileName; + aryCol_FixString[5][idx] = "AutoRun"; + aryCol_FixDateTime[0][idx] = Conversions.ToDate(Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss")); + } + } + if (blnAddData) + { + dtData.Rows.Add(drAdd); + dtFixData.Rows.Add(drAddFix); + } + + if (x == intDataStart) + { + // 找出lotNo: + strWaferID = dtFixData.Rows[0]["D_ComponentNo"].ToString(); + strSQL = "Select A.LotNo From tblWIPComponentState A, tblWIPLotState B Where A.LotNo = B.LotNo And A.ComponentNo = '" + strWaferID + "'" + " And B.Status In (0,1,2,3,4,5)"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + // 如有找到資料,代表未處理完 + if (drTemp.Read()) + strlotNo = drTemp["LotNo"].ToString(); + drTemp.Close(); + //cmmTemp.Dispose(); + } + + drSel = dtMaterialBasis.Select("MaterialNo= '" + strD_MTLNo + "'"); + if (drSel.Length == 0) + { + throw new Exception("MaterialNo不存在於物料主檔中!"); + } + // 2021/7/22,Ning,若有供應商, 則這筆物料必須有此供應商 + if (!string.IsNullOrEmpty(strVendorNo)) + { + strSQL = "Select MaterialNo From tblMTLMaterialVendorMap Where MaterialNo = '" + strD_MTLNo + "' And VendorNo = '" + strVendorNo + "'"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (!drTemp.Read()) + { + throw new Exception("物料: " + strD_MTLNo + " 未設定供應商: " + strVendorNo); + } + drTemp.Close(); + //cmmTemp.Dispose(); + } + + + idx = idx + 1; + intSeq = intSeq + 1; + + // 分包 檔案搬移 等等處理 改寫 只寫第一筆資料就好 + if (!(dtFormat_Postion == null)) + { + if (dtFormat_Postion.Rows.Count > 0) + { + for (int j = 0, loopTo7 = dtFormat_Postion.Rows.Count - 1; j <= loopTo7; j++) + { + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtFormat_Postion.Rows[j]["AssignFile"], 1, false))) + { + if (!dtData.Columns.Contains(dtFormat_Postion.Rows[j]["ColumnName"].ToString())) + { + dtData.Columns.Add(dtFormat_Postion.Rows[j]["ColumnName"].ToString(), Type.GetType("System.String")); + } + } + } + } + } + foreach (DataColumn column in dtData.Columns) + { + if (dtFormat_Postion.Rows.Count > 0) + { + for (int a = 0, loopTo8 = dtFormat_Postion.Rows.Count - 1; a <= loopTo8; a++) + { + if ((column.ColumnName ?? "") == (dtFormat_Postion.Rows[a]["ColumnName"].ToString() ?? "")) + { + for (int k = 0, loopTo9 = dtData.Rows.Count - 1; k <= loopTo9; k++) + dtData.Rows[k][dtFormat_Postion.Rows[a]["ColumnName"].ToString()] = dtFormat_Postion.Rows[a]["Value"].ToString(); + } + } + } + } + + + if (idx == SplitRecordsLimit) + { + + var oParameterNames_Del = new Dictionary(); + var VarcharParameter_Del = new Dictionary(); + oParameterNames_Del.Add("MaterialNo", "Varchar"); + VarcharParameter_Del.Add("MaterialNo", aryCol_FixString[0]); + oParameterNames_Del.Add("MaterialLotNo", "Varchar"); + VarcharParameter_Del.Add("MaterialLotNo", aryCol_FixString[1]); + oParameterNames_Del.Add("ComponentNo", "Varchar"); + VarcharParameter_Del.Add("ComponentNo", aryCol_FixString[2]); + strSQL = "Delete From " + strTableName + " Where MaterialNo = : MaterialNo And MaterialLotNo = :MaterialLotNo And UPPER(ComponentNo) =:ComponentNo"; + Dictionary argInt32Parameter = null; + Dictionary argDecimalParameter = null; + Dictionary argDateParameter = null; + Dictionary argBLOBParameter = null; + funAddSQLContent(oSQLContent, ref intSQLIndex, strSQL, -1, HasParameter: true, ParameterNames: oParameterNames_Del, VarcharParameter: VarcharParameter_Del, Int32Parameter: argInt32Parameter, DecimalParameter: argDecimalParameter, DateTimeParameter: argDateParameter); + string argstrDatabaseType = Conversions.ToString(DataBaseType); + ExecuteSQLNoneQuery_ArrayBinding(argstrDatabaseType, strConnectionString, oSQLContent); + // 已成功完成分包 + + intSQLIndex = 1U; + oSQLContent = new Dictionary(); + + var oParameterNames = new Dictionary(); + var Int32Parameter = new Dictionary(); + var DecimalParameter = new Dictionary(); + var VarcharParameter = new Dictionary(); + var DateParameter = new Dictionary(); + // //新增TestSummary, TestSummaryLog + // strSQLAddField = "Insert into " & strTableName & " (" + + oParameterNames.Add("MaterialNo", "Varchar"); + VarcharParameter.Add("MaterialNo", aryCol_FixString[0]); + + oParameterNames.Add("MaterialLotNo", "Varchar"); + VarcharParameter.Add("MaterialLotNo", aryCol_FixString[1]); + + oParameterNames.Add("ComponentNo", "Varchar"); + VarcharParameter.Add("ComponentNo", aryCol_FixString[2]); + + oParameterNames.Add("VendorMaterialNo", "Varchar"); + VarcharParameter.Add("VendorMaterialNo", aryCol_FixString[3]); + + oParameterNames.Add("FileName", "Varchar"); + VarcharParameter.Add("FileName", aryCol_FixString[4]); + + oParameterNames.Add("ImportUserNo", "Varchar"); + VarcharParameter.Add("ImportUserNo", aryCol_FixString[5]); + + oParameterNames.Add("ImportDate", "DateTime"); + DateParameter.Add("ImportDate", aryCol_FixDateTime[0]); + + + strSQLAddField = "Insert into " + strTableName + " (MaterialNo, MaterialLotNo, ComponentNo, VendorMaterialNo, FileName, ImportUserNo, ImportDate"; + strSQLAddValue = " Values (:MaterialNo, :MaterialLotNo, :ComponentNo, :VendorMaterialNo, :FileName, :ImportUserNo,:ImportDate"; + strSQLLogHead = "Insert into " + strLogTableName + " (MaterialNo, MaterialLotNo, ComponentNo, VendorMaterialNo, FileName, ImportUserNo, ImportDate"; + var loopTo10 = (short)(dtData.Columns.Count - 1); + for (i = 0; i <= loopTo10; i++) + { + // TestRecipeBasis有定義此欄位才需要存入, 欄位名稱已轉換為ConversionField + drSel = dtTestRecipe.Select("ConversionField = '" + dtData.Columns[i].ColumnName + "'"); + if (drSel.Length > 0) + { + oParameterNames.Add(dtData.Columns[i].ColumnName, "Varchar"); + VarcharParameter.Add(dtData.Columns[i].ColumnName, aryCol[i]); + strSQLAddField = strSQLAddField + "," + dtData.Columns[i].ColumnName; + strSQLAddValue = strSQLAddValue + ", :" + dtData.Columns[i].ColumnName; + } + + // 明細是否有動態表頭欄位, 有的話以明細為準 + blnD_EquipmentNo = false; + blnD_WaferSize = false; + blnD_Thickness = false; + strColumnName = dtData.Columns[i].ColumnName; + + drSel = dtTestRecipe.Select("ConversionField = '" + strColumnName + "'"); + if (drSel.Length > 0) + { + if (strColumnName.ToUpper() == "EQUIPMENTNO") + { + blnD_EquipmentNo = true; + } + if (strColumnName.ToUpper() == "WAFERSIZE") + { + blnD_WaferSize = true; + } + if (strColumnName.ToUpper() == "THICKNESS") + { + blnD_Thickness = true; + } + } + } + if (!blnD_EquipmentNo && dtTestRecipe.Select("TestRecipeNo = 'EquipmentNo'").Length > 0) + { + strSQLAddField = strSQLAddField + ",EquipmentNo"; + strSQLAddValue = strSQLAddValue + ",'" + strEquipmentNo + "'"; + } + if (!blnD_WaferSize && dtTestRecipe.Select("TestRecipeNo = 'WaferSize'").Length > 0) + { + strSQLAddField = strSQLAddField + ",WaferSize"; + strSQLAddValue = strSQLAddValue + ",'" + strWaferSize + "'"; + } + if (!blnD_Thickness && dtTestRecipe.Select("TestRecipeNo = 'Thickness'").Length > 0) + { + strSQLAddField = strSQLAddField + ",Thickness"; + strSQLAddValue = strSQLAddValue + ",'" + strThickness + "'"; + } + + + strSQL = strSQLAddField + ")" + strSQLAddValue + ")"; + + // Drop table + string argstrDatabaseType1 = Conversions.ToString(DataBaseType); + ExecuteSQLNoneQuery_UPD(argstrDatabaseType1, strConnectionString, CollectionSQL); + CollectionSQL.Clear(); + + funAddSQLContent(oSQLContent, ref intSQLIndex, strSQL, -1, HasParameter: true, ParameterNames: oParameterNames, DecimalParameter: DecimalParameter, Int32Parameter: Int32Parameter, VarcharParameter: VarcharParameter, DateTimeParameter: DateParameter); + string argstrDatabaseType2 = Conversions.ToString(DataBaseType); + ExecuteSQLNoneQuery_ArrayBinding(argstrDatabaseType2, strConnectionString, oSQLContent); + // 已成功完成分包 + + intSQLIndex = 1U; + oSQLContent = new Dictionary(); + + strSQL = Strings.Replace(strSQL, strTableName, strLogTableName); + + funAddSQLContent(oSQLContent, ref intSQLIndex, strSQL, -1, HasParameter: true, ParameterNames: oParameterNames, DecimalParameter: DecimalParameter, Int32Parameter: Int32Parameter, VarcharParameter: VarcharParameter, DateTimeParameter: DateParameter); + string argstrDatabaseType3 = Conversions.ToString(DataBaseType); + ExecuteSQLNoneQuery_ArrayBinding(argstrDatabaseType3, strConnectionString, oSQLContent); + // 已成功完成分包 + + intSQLIndex = 1U; + oSQLContent = new Dictionary(); + + blnSplitPartialSuccess = true; + // SplitRecordsLimit 分包的筆數 ExecuteTimes 已做了幾次分包 相乘 = 已做過的筆數 + // 2021/5/10 Steven Mantis:0090855 當成功寫入DB時,要寫入現況表並記錄已處理的筆數 + intRow = (int)(intRow + SplitRecordsLimit); + // 如果是未完成的檔案,筆數加上上次已執行完的比數 + + fuUpdateAutoLoaderState(Environment.MachineName, "AutoLoaderLib", JobNo, JobFunction, FileName, FilePath, FileSize, strTableName, "N/A", intRow, strlotNo, dtFixData.Rows[0]["D_ComponentNo"].ToString(), defString, datStartTime, defDateTime, SplitRecordsLimit: (int)SplitRecordsLimit); + + idx = 0; + datEventTime = DateTime.Now; + } + } + + + catch (Exception ex) + { + throw; + } + } + + } + } + + + TotalRows = TotalRows - intDataStart; // 計算所有筆數 + + // 最後一包的idx筆資料, array中的index 0~idx-1 有值 + if (idx >= 1) + { + try + { + var aryCol_C = new string[501][]; + var aryCol_FixString_C = new string[501][]; + var aryCol_FixDateTime_C = new DateTime[501][]; + + aryCol_C[dtData.Columns.Count - 1] = new string[idx]; // 重新定義二維陣列aryCol_C的維度 + aryCol_FixString_C[5] = new string[idx]; + aryCol_FixDateTime_C[0] = new DateTime[idx]; + + var loopTo11 = (short)(dtData.Columns.Count - 1); + for (i = 0; i <= loopTo11; i++) + { + aryCol_C[i] = new string[idx]; + aryCol_FixString_C[i] = new string[idx]; + aryCol_FixDateTime_C[i] = new DateTime[idx]; + } + + Array.Copy(aryCol_FixString[0], aryCol_FixString_C[0], idx); + Array.Copy(aryCol_FixString[1], aryCol_FixString_C[1], idx); + Array.Copy(aryCol_FixString[2], aryCol_FixString_C[2], idx); + Array.Copy(aryCol_FixString[3], aryCol_FixString_C[3], idx); + Array.Copy(aryCol_FixString[4], aryCol_FixString_C[4], idx); + Array.Copy(aryCol_FixString[5], aryCol_FixString_C[5], idx); + Array.Copy(aryCol_FixDateTime[0], aryCol_FixDateTime_C[0], idx); + + var oParameterNames_Del = new Dictionary(); + var VarcharParameter_Del = new Dictionary(); + oParameterNames_Del.Add("MaterialNo", "Varchar"); + VarcharParameter_Del.Add("MaterialNo", aryCol_FixString_C[0]); + oParameterNames_Del.Add("MaterialLotNo", "Varchar"); + VarcharParameter_Del.Add("MaterialLotNo", aryCol_FixString_C[1]); + oParameterNames_Del.Add("ComponentNo", "Varchar"); + VarcharParameter_Del.Add("ComponentNo", aryCol_FixString_C[2]); + strSQL = "Delete From " + strTableName + " Where MaterialNo = : MaterialNo And MaterialLotNo = :MaterialLotNo And ComponentNo =:ComponentNo"; + Dictionary argInt32Parameter1 = null; + Dictionary argDecimalParameter1 = null; + Dictionary argDateParameter1 = null; + funAddSQLContent(oSQLContent, ref intSQLIndex, strSQL, -1, HasParameter: true, ParameterNames: oParameterNames_Del, VarcharParameter: VarcharParameter_Del, Int32Parameter: argInt32Parameter1, DecimalParameter: argDecimalParameter1, DateTimeParameter: argDateParameter1); + string argstrDatabaseType4 = Conversions.ToString(DataBaseType); + ExecuteSQLNoneQuery_ArrayBinding(argstrDatabaseType4, strConnectionString, oSQLContent); + // 已成功完成分包 + + intSQLIndex = 1U; + oSQLContent = new Dictionary(); + + var oParameterNames = new Dictionary(); + var Int32Parameter = new Dictionary(); + var DecimalParameter = new Dictionary(); + var VarcharParameter = new Dictionary(); + var DateParameter = new Dictionary(); + // //新增TestSummary, TestSummaryLog + // strSQLAddField = "Insert into " & strTableName & " (" + oParameterNames.Add("MaterialNo", "Varchar"); + VarcharParameter.Add("MaterialNo", aryCol_FixString_C[0]); + + oParameterNames.Add("MaterialLotNo", "Varchar"); + VarcharParameter.Add("MaterialLotNo", aryCol_FixString_C[1]); + + oParameterNames.Add("ComponentNo", "Varchar"); + VarcharParameter.Add("ComponentNo", aryCol_FixString_C[2]); + + oParameterNames.Add("VendorMaterialNo", "Varchar"); + VarcharParameter.Add("VendorMaterialNo", aryCol_FixString_C[3]); + + oParameterNames.Add("FileName", "Varchar"); + VarcharParameter.Add("FileName", aryCol_FixString_C[4]); + + oParameterNames.Add("ImportUserNo", "Varchar"); + VarcharParameter.Add("ImportUserNo", aryCol_FixString_C[5]); + + oParameterNames.Add("ImportDate", "DateTime"); + DateParameter.Add("ImportDate", aryCol_FixDateTime_C[0]); + + + strSQLAddField = "Insert into " + strTableName + " (MaterialNo, MaterialLotNo, ComponentNo, VendorMaterialNo, FileName, ImportUserNo, ImportDate"; + strSQLAddValue = " Values (:MaterialNo, :MaterialLotNo, :ComponentNo, :VendorMaterialNo, :FileName, :ImportUserNo,:ImportDate"; + strSQLLogHead = "Insert into " + strLogTableName + " (MaterialNo, MaterialLotNo, ComponentNo, VendorMaterialNo, FileName, ImportUserNo, ImportDate"; + + + bool blnD_EquipmentNo = default(bool), blnD_WaferSize = default(bool), blnD_Thickness = default(bool); + var loopTo12 = (short)(dtData.Columns.Count - 1); + for (i = 0; i <= loopTo12; i++) + { + // TestRecipeBasis有定義此欄位才需要存入, 欄位名稱已轉換為ConversionField + drSel = dtTestRecipe.Select("ConversionField = '" + dtData.Columns[i].ColumnName + "'"); + if (drSel.Length > 0) + { + oParameterNames.Add(dtData.Columns[i].ColumnName, "Varchar"); + Array.Copy(aryCol[i], aryCol_C[i], idx); + VarcharParameter.Add(dtData.Columns[i].ColumnName, aryCol_C[i]); + strSQLAddField = strSQLAddField + "," + dtData.Columns[i].ColumnName; + strSQLAddValue = strSQLAddValue + ", :" + dtData.Columns[i].ColumnName; + } + + // 明細是否有動態表頭欄位, 有的話以明細為準 + blnD_EquipmentNo = false; + blnD_WaferSize = false; + blnD_Thickness = false; + strColumnName = dtData.Columns[i].ColumnName; + + drSel = dtTestRecipe.Select("ConversionField = '" + strColumnName + "'"); + if (drSel.Length > 0) + { + if (strColumnName.ToUpper() == "EQUIPMENTNO") + { + blnD_EquipmentNo = true; + } + if (strColumnName.ToUpper() == "WAFERSIZE") + { + blnD_WaferSize = true; + } + if (strColumnName.ToUpper() == "THICKNESS") + { + blnD_Thickness = true; + } + } + } + if (!blnD_EquipmentNo && dtTestRecipe.Select("TestRecipeNo = 'EquipmentNo'").Length > 0) + { + strSQLAddField = strSQLAddField + ",EquipmentNo"; + strSQLAddValue = strSQLAddValue + ",'" + strEquipmentNo + "'"; + } + if (!blnD_WaferSize && dtTestRecipe.Select("TestRecipeNo = 'WaferSize'").Length > 0) + { + strSQLAddField = strSQLAddField + ",WaferSize"; + strSQLAddValue = strSQLAddValue + ",'" + strWaferSize + "'"; + } + if (!blnD_Thickness && dtTestRecipe.Select("TestRecipeNo = 'Thickness'").Length > 0) + { + strSQLAddField = strSQLAddField + ",Thickness"; + strSQLAddValue = strSQLAddValue + ",'" + strThickness + "'"; + } + + + strSQL = strSQLAddField + ")" + strSQLAddValue + ")"; + + // Drop table + string argstrDatabaseType5 = Conversions.ToString(DataBaseType); + ExecuteSQLNoneQuery_UPD(argstrDatabaseType5, strConnectionString, CollectionSQL); + CollectionSQL.Clear(); + + funAddSQLContent(oSQLContent, ref intSQLIndex, strSQL, -1, HasParameter: true, ParameterNames: oParameterNames, DecimalParameter: DecimalParameter, Int32Parameter: Int32Parameter, VarcharParameter: VarcharParameter, DateTimeParameter: DateParameter); + string argstrDatabaseType6 = Conversions.ToString(DataBaseType); + ExecuteSQLNoneQuery_ArrayBinding(argstrDatabaseType6, strConnectionString, oSQLContent); + + intSQLIndex = 1U; + oSQLContent = new Dictionary(); + + + strSQL = Strings.Replace(strSQL, strTableName, strLogTableName); + funAddSQLContent(oSQLContent, ref intSQLIndex, strSQL, -1, HasParameter: true, ParameterNames: oParameterNames, DecimalParameter: DecimalParameter, Int32Parameter: Int32Parameter, VarcharParameter: VarcharParameter, DateTimeParameter: DateParameter); + string argstrDatabaseType7 = Conversions.ToString(DataBaseType); + ExecuteSQLNoneQuery_ArrayBinding(argstrDatabaseType7, strConnectionString, oSQLContent); + intSQLIndex = 1U; + oSQLContent = new Dictionary(); + idx = 0; + + // 全都完成,將現況表的資料刪除,並寫入資料到log + fuUpdateAutoLoaderState(Environment.MachineName, "AutoLoaderLib", JobNo, JobFunction, FileName, FilePath, FileSize, strTableName, "N/A", intRow, strlotNo, dtFixData.Rows[0]["D_ComponentNo"].ToString(), defString, datStartTime, defDateTime, true); + } + + catch (Exception ex) + { + throw; + } + } + } + + catch (Exception ex) + { + // 有錯誤時,要將錯誤訊息紀錄上現況表上 + // 若有成功處理的筆數,則把失敗訊息寫上;若無成功處理筆數,則不寫現況表,並將檔案直接搬移到fail + strFailMessage = "分包處理失敗: " + ex.Message; + if (blnSplitPartialSuccess) + { + fuUpdateAutoLoaderState(Environment.MachineName, "AutoLoaderLib", JobNo, JobFunction, FileName, FilePath, FileSize, strTableName, "N/A", intRow, strlotNo, strWaferID, strFailMessage, datStartTime, defDateTime, false, (int)SplitRecordsLimit); + } + else if (blnSplitPartialSuccess == false && StartRow != defInteger) // 分包續處理,第一次就錯,需要更新錯誤訊息與時間'完全沒成功,又有起始處理筆數 + { + fuUpdateAutoLoaderState(Environment.MachineName, "AutoLoaderLib", JobNo, JobFunction, FileName, FilePath, FileSize, strTableName, "N/A", intRow, strlotNo, strWaferID, strFailMessage, datStartTime, defDateTime, false, (int)SplitRecordsLimit); + } + + throw; + } + finally + { + // 寫入log資料 + fuAddAutoLoaderLog(Environment.MachineName, "AutoLoaderLib", JobNo, JobFunction, FileName, FilePath, FileSize, "N/A", strlotNo, strWaferID, strFailMessage, datStartTime, defDateTime, TotalRows); + } + // TestSum, TestSumLog存入DB + if (!dtFixData.Columns.Contains("D_ComponentNo")) + { + throw new Exception("無法取得ComponentNo!!"); + } + + // datEventTime = Now + + for (int idx_INV = 0, loopTo13 = dtData.Rows.Count - 1; idx_INV <= loopTo13; idx_INV++) + { + + //2023/9/15,Ning,华芯振邦相同MATERIALNO允许汇入相同Compoentno + strSQL = "Select MaterialNo ,MaterialLotNo ,ComponentNo From " + strTableName + " Where UPPER(ComponentNo) = '" + dtFixData.Rows[idx]["D_ComponentNo"].ToString().ToUpper() + "' and MaterialNo = '" + strD_MTLNo + "' and MaterialLotNo ='" + strD_MTLLotNo + "'"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + throw new Exception(Conversions.ToString("MaterialNo: " + strD_MTLNo + ", MaterialLotNo: " + strD_MTLLotNo + ", WaferID: " + dtFixData.Rows[idx]["D_ComponentNo"] + " 已匯入, 不允許重新匯入!")); + } + drTemp.Close(); + //cmmTemp.Dispose(); + + // 進料單Component + strSQL = "Insert into tblINVMaterialInComponent (MaterialInNo, MaterialNo, MaterialLotNo, ComponentNo, SlotNo)" + " Values ('" + strMaterialInNo + "','" + strD_MTLNo + "','" + strD_MTLLotNo + "','" + dtFixData.Rows[idx_INV]["D_ComponentNo"].ToString().ToUpper() + "', '" + strD_SlotNo + "')"; + CollectionSQL.Add(strSQL); + + // 原物料倉Component + // '2019/6/12, 依Josh指示, 同一ComponentNo在原物料倉不能有兩筆以上, 依ComponentNo先刪除再新增 + // 'strSQL = "Delete From tblINVRAWInventoryComponent Where ComponentNo = '" & dtFixData.Rows(idx)("D_ComponentNo") & "'" + // 'CollectionSQL.Add(strSQL) + // 2022/11/28,Ning, 071068: 來料檔案匯入, 若不同供應商有相同ComponentNo, 應如何匯入? => 以tblINVRAWInventoryComponent的PK(InventoryNo,MaterialNo,MaterialLotNo, 來檢查, 存在才不允許匯入 + //strSQL = "Select ComponentNo From tblINVRAWInventoryComponent Where InventoryNo = '" + InventoryNo + "' And MaterialNo = '" + strD_MTLNo + "'" + " And MaterialLotNo = '" + strD_MTLLotNo + "' And UPPER(ComponentNo) = '" + dtFixData.Rows[idx]["D_ComponentNo"].ToString().ToUpper() + "'"; + ////cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + //drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + //if (drTemp.Read()) + //{ + // throw new Exception(Conversions.ToString("InventoryNo: " + InventoryNo + ", MaterialNo: " + strD_MTLNo + ", MaterialLotNo: " + strD_MTLLotNo + ", WaferID: " + + // dtFixData.Rows[idx]["D_ComponentNo"] + " 已存在原料倉, 不允許匯入, 若要重新匯入要先做庫房出庫或刪除動作!")); + //} + //drTemp.Close(); + ////cmmTemp.Dispose(); + + strSQL = "Insert into tblINVRAWInventoryComponent (InventoryNo, MaterialNo, MaterialLotNo, ComponentNo, SlotNo, ComponentLotNo, S_LaserMark, B_CassetteNo)" + " Values ('" + InventoryNo + "','" + strD_MTLNo + "','" + strD_MTLLotNo + "','" + dtFixData.Rows[idx_INV]["D_ComponentNo"].ToString().ToUpper() + "', '" + strD_SlotNo + "','" + strD_CompLotNo + "','" + strD_LaserMark + "','" + strD_CassetteNo + "')"; + CollectionSQL.Add(strSQL); + + // 2019/7/23, Ning, 將資料填入tblINVTemp_Component待AutoRun滾算芯片挑片規則, 原料庫InventoryType:0 + // 2019/10/17,Ning,因有可能已存在又重新入庫, 故先刪後增 + // 2020/1/9,Ning,非系統參數ExcludeInventoryCalCompRule中設定的庫房才需寫入tblINVTemp_Component中 + if (blnExcludeINV == false) // 不在排除的庫房內, 需加入tblINVTemp_Component + { + strSQL = "Delete From tblINVTemp_Component Where InventoryNo = '" + InventoryNo + "' And UPPER(ComponentNo) = '" + dtFixData.Rows[idx_INV]["D_ComponentNo"].ToString().ToUpper() + "'"; + CollectionSQL.Add(strSQL); + strSQL = "Insert Into tblINVTemp_Component (InventoryNo, ComponentNo, InventoryType)" + " Values('" + InventoryNo + "','" + dtFixData.Rows[idx_INV]["D_ComponentNo"].ToString().ToUpper() + "',0)"; + CollectionSQL.Add(strSQL); + } + } + + // 若為排除的庫房, 需填入EvnetLog備查 + if (blnExcludeINV == true) + { + strSQL = "Insert into tblSysEventLog (UserID, RecordDate, ServiceName, KeyField, KeyValue, ComputerName)" + " Values ('AutoRun', To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'), 'AutoLoaderLib'," + "'ExcludeInventoryNo','" + InventoryNo + "','" + modWIN.gComputerName + "')"; + CollectionSQL.Add(strSQL); + } + + // 進料單明細需以MaterialNo, MaterialLotNo做Group By計算數量 + dtMTLInDetail = new DataTable("MTLInDetail"); + dtMTLInDetail.Columns.Add("MaterialNo", Type.GetType("System.String")); + dtMTLInDetail.Columns.Add("MaterialLotNo", Type.GetType("System.String")); + dtMTLInDetail.Columns.Add("Qty", Type.GetType("System.Int16")); + if (!dtFixData.Columns.Contains("D_MTLNo")) + { + dtFixData.Columns.Add("D_MTLNo", Type.GetType("System.String")); + foreach (DataRow drFixData in dtFixData.Rows) + { + drFixData["D_MTLNO"] = strMTLNo; + } + } + if (!dtFixData.Columns.Contains("D_MTLLotNo")) + { + dtFixData.Columns.Add("D_MTLLotNo", Type.GetType("System.String")); + foreach (DataRow drFixData in dtFixData.Rows) + { + drFixData["D_MTLLotNo"] = strMTLLotNo; + } + } + dvFixData = dtFixData.DefaultView; + dvFixData.Sort = "D_MTLNo, D_MTLLotNo"; + var loopTo14 = (short)(dvFixData.Count - 1); + for (i = 0; i <= loopTo14; i++) + { + drSel = dtMTLInDetail.Select("MaterialNo = '" + dvFixData[i]["D_MTLNo"].ToString() + "' And MaterialLotNo = '" + dvFixData[i]["D_MTLLotNo"].ToString() + "'"); + if (drSel.Length > 0) + { + drSel[0].BeginEdit(); + drSel[0]["Qty"] = Operators.AddObject(drSel[0]["Qty"], 1); + drSel[0].EndEdit(); + } + else + { + drAdd = dtMTLInDetail.NewRow(); + drAdd["MaterialNo"] = dvFixData[i]["D_MTLNo"].ToString(); + drAdd["MaterialLotNo"] = dvFixData[i]["D_MTLLotNo"].ToString(); + drAdd["Qty"] = 1; + dtMTLInDetail.Rows.Add(drAdd); + } + } + + // 進料單主檔(State直接給2) + strSQL = "Insert into tblINVMaterialInBasis (MaterialInNo, InventoryNo, VendorNo, State, Creator, CreateDate, ConfirmDate)" + " Values ('" + strMaterialInNo + "','" + InventoryNo + "','" + strVendorNo + "', 2, 'AutoRun'," + " To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')," + "To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'))"; + CollectionSQL.Add(strSQL); + + foreach (DataRow drDetail in dtMTLInDetail.Rows) + { + + strSQL = Conversions.ToString("Select SafeQty,UnitNo From tblMTLMaterialBasis Where MaterialNo = '" + drDetail["MaterialNo"] + "'"); + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + if (!(drTemp["SafeQty"] is DBNull)) + { + decSafeQty = Conversions.ToDecimal(drTemp["SafeQty"]); + } + else + { + decSafeQty = 0m; + } + strUnitNo = Conversions.ToString(drTemp["UnitNo"]); + } + else + { + decSafeQty = 0m; + strUnitNo = "pcs"; + } + drTemp.Close(); + + // 進料單明細檔 + strSQL = Conversions.ToString("Insert into tblINVMaterialInDetail (MaterialInNo,MaterialNo,MaterialLotNo,LocatorNo,UnitNo,Qty,LimitTime)" + " Values ('" + strMaterialInNo + "','" + + drDetail["MaterialNo"] + "','" + drDetail["MaterialLotNo"] + "','N/A','" + strUnitNo + "'," + drDetail["Qty"] + ",0)"); + CollectionSQL.Add(strSQL); + + // 進料單確認(入庫) + // 處理原料倉現況主檔資料 + strSQL = Conversions.ToString("Select * From tblINVRawInventory Where InventoryNo = '" + InventoryNo + "' And MaterialNo = '" + + drDetail["MaterialNo"] + "'"); + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + // 數量相加 + strSQL = Conversions.ToString("Update tblINVRawInventory Set CurQty = CurQty + " + + drDetail["Qty"] + " Where InventoryNo = '" + InventoryNo + "'" + " And MaterialNo = '" + drDetail["MaterialNo"] + "'"); + CollectionSQL.Add(strSQL); + drTemp.Close(); + } + else // 找不到資料時一律先新增一筆CurrentQty=0的資料列,再做Update動作 + { + drTemp.Close(); + strSQL = Conversions.ToString("Insert into tblINVRawInventory (InventoryNo, MaterialNo, SafeQty, CurQty, AllocateQty, UnitNo)" + " Values ('" + InventoryNo + "','" + + drDetail["MaterialNo"] + "'," + decSafeQty + ", 0, 0,'" + strUnitNo + "')"); + + // 先確定之前沒有加過再加這筆資料 + blnFound = false; + var loopTo15 = (short)IniCollectionSQL.Count; + for (i = 1; i <= loopTo15; i++) + { + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(strSQL, IniCollectionSQL[i], false))) + { + blnFound = true; + } + } + if (!blnFound) + { + IniCollectionSQL.Add(strSQL); + } + + strSQL = Conversions.ToString("Update tblINVRawInventory Set CurQty = CurQty + " + + drDetail["Qty"] + " Where InventoryNo = '" + InventoryNo + "'" + " And MaterialNo = '" + drDetail["MaterialNo"] + "'"); + CollectionSQL.Add(strSQL); + } + + // 處理原料倉儲位現況資料 + strSQL = Conversions.ToString("Select * From tblINVRawInventoryLoc Where InventoryNo = '" + InventoryNo + "'" + " And LocatorNo = 'N/A' And MaterialNo = '" + + drDetail["MaterialNo"] + "'" + " And MaterialLotNo = '" + drDetail["MaterialLotNo"] + "'"); + + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + // 數量相加 + strSQL = Conversions.ToString("Update tblINVRawInventoryLoc Set LocQty = LocQty + " + + drDetail["Qty"] + "," + " InputDate = To_Date('" + Strings.Format(Conversions.ToDate(datEventTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')" + + " Where InventoryNo = '" + InventoryNo + "'" + " And LocatorNo = 'N/A' And MaterialNo = '" + drDetail["MaterialNo"] + "'" + " And MaterialLotNo = '" + + drDetail["MaterialLotNo"] + "'"); + CollectionSQL.Add(strSQL); + } + else + { + // 新增一筆 + strSQL = Conversions.ToString("Insert into tblINVRawInventoryLoc (InventoryNo, LocatorNo, MaterialNo, MaterialLotNo, VendorNo, LocQty, InputDate)" + " Values ('" + InventoryNo + "','N/A','" + + drDetail["MaterialNo"] + "','" + drDetail["MaterialLotNo"] + "','" + strVendorNo + "'," + drDetail["Qty"] + ", To_Date('" + Strings.Format(Conversions.ToDate(datEventTime), "yyyy/MM/dd H:mm:ss") + + "','YYYY/MM/DD HH24:MI:SS'))"); + CollectionSQL.Add(strSQL); + } + drTemp.Close(); + } + + var loopTo16 = (short)IniCollectionSQL.Count; + for (i = 1; i <= loopTo16; i++) + FinalCollectionSQL.Add(IniCollectionSQL[i]); + var loopTo17 = (short)CollectionSQL.Count; + for (i = 1; i <= loopTo17; i++) + FinalCollectionSQL.Add(CollectionSQL[i]); + + // //執行SQL指令 + string argstrDatabaseType8 = Conversions.ToString(DataBaseType); + ExecuteSQLNoneQuery_UPD(argstrDatabaseType8, strConnectionString, FinalCollectionSQL); + + blnResult = true; + } + + catch (Exception ex) + { + throw; + } + + finally + { + if (objReader != null) + { + objReader.Close(); + objReader = null; + } + CloseConnection(cnnTemp); + aryTemp = null; + } + + return blnResult; + + } + + private object funGetCellValue(ICell excelCell, ISheet sheet, IWorkbook workbook, ref string strVal) + { + // 2022/4/7 讀取儲存格資料,轉為String + HSSFFormulaEvaluator formulaEvaluator = null; + if (excelCell.CellType == CellType.Formula) + { + if (formulaEvaluator == null) + { + formulaEvaluator = new HSSFFormulaEvaluator((IWorkbook)sheet, (NPOI.SS.Formula.IStabilityClassifier)workbook); + } + strVal = formulaEvaluator.Evaluate(excelCell).FormatAsString(); + } + else if (excelCell.CellType == CellType.Numeric && DateUtil.IsValidExcelDate(excelCell.NumericCellValue) && DateUtil.IsCellDateFormatted(excelCell)) + + { + strVal = excelCell.DateCellValue.ToString("yyyy/MM/dd HH:mm:ss"); + } + else if (excelCell.CellType == CellType.Numeric) + { + strVal = excelCell.NumericCellValue.ToString(); + } + else + { + strVal = excelCell.ToString(); + } + strVal = strVal.Trim(); + return default(Object); + + } + + public string fuAddAutoLoaderLog(string ServerName = defString, string ServiceName = defString, string JobNo = defString, string JobFunction = defString, string FileName = defString, string FilePath = defString, int FileSize = defInteger, string EquipmentNo = defString, string LotNo = defString, string ComponentNo = defString, string Description = defString, DateTime StartTime = default(DateTime), DateTime EndTime = default(DateTime), int ImportedRows = defInteger, string Status = defString, DateTime RunTime = default(DateTime), string MEMO = defString, string SequenceNo = defString) + { + string fuAddAutoLoaderLogRet = default(string); + // 此 Function 將新增一筆資料 + // 傳入值: 各欄位新增值 + // 傳回值: success(成功), fail(失敗) + + string strSQLAddField = string.Empty; + string strSQLAddValue = string.Empty; + string strSQL = string.Empty; + if (EndTime == defDateTime) + EndTime = DateTime.Now; + IDbConnection cnnTemp, cnnMES; + DbDataReader drTemp; + // 當Description有值,代表執行失敗 + Status = "success"; + if ((Description ?? "") != defString) + Status = "fail"; + try + { + + cnnTemp = CreateConnection(strConnectionString); + // 找到總比數 + strSQL = "Select ImportedRows From TBLMESAUTOLOADERFILESTATE where ServerName = '" + ServerName + "'And ServiceName = '" + ServiceName + "'" + " And JobNo = '" + JobNo + "' and FileName = '" + FileName + "'"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) // 有資料更新筆數 + { + ImportedRows = Conversions.ToInteger(drTemp["ImportedRows"]); + } + else if (Status == "fail") // 找不到代表成功或者是直接失敗 + { + ImportedRows = 0; + } + else + { + } // 全部成功 用原來的ImportedRows + drTemp.Close(); + //cmmTemp.Dispose(); + + strSQLAddField = "Insert into TBLMESAUTOLOADERLOG (ServerName, ServiceName, JobNo,JobFunction,FileName,FilePath,FileSize,Status"; + strSQLAddValue = " Values ('" + Environment.MachineName + "','AutoLoaderLib', '" + JobNo + "','" + JobFunction + "','" + FileName + "','" + FilePath + "'," + FileSize + ",'" + Status + "'"; + + if ((EquipmentNo ?? "") != defString) + { + strSQLAddField = strSQLAddField + ",EquipmentNo"; + strSQLAddValue = strSQLAddValue + ",'" + EquipmentNo + "'"; + } + if ((LotNo ?? "") != defString) + { + strSQLAddField = strSQLAddField + ",LotNo"; + strSQLAddValue = strSQLAddValue + ",'" + LotNo + "'"; + } + if ((ComponentNo ?? "") != defString) + { + strSQLAddField = strSQLAddField + ",ComponentNo"; + strSQLAddValue = strSQLAddValue + ",'" + ComponentNo + "'"; + } + if (ImportedRows != defInteger) + { + strSQLAddField = strSQLAddField + ",ImportedRows"; + strSQLAddValue = strSQLAddValue + "," + ImportedRows + ""; + } + + if ((Description ?? "") != defString) // 錯誤才寫 + { + strSQLAddField = strSQLAddField + ",DESCRIPTION"; + strSQLAddValue = strSQLAddValue + ",'" + Description + "'"; + } + if (StartTime != defDateTime) + { + strSQLAddField = strSQLAddField + ",RunTime"; + strSQLAddValue = strSQLAddValue + "," + DateAndTime.DateDiff(DateInterval.Second, StartTime, EndTime).ToString() + ""; + } + if (StartTime != defDateTime) + { + strSQLAddField = strSQLAddField + ",StartTime"; + strSQLAddValue = strSQLAddValue + ", To_Date('" + Strings.Format(Conversions.ToDate(StartTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')"; + } + if (EndTime != defDateTime) + { + strSQLAddField = strSQLAddField + ",EndTime"; + strSQLAddValue = strSQLAddValue + ", To_Date('" + Strings.Format(Conversions.ToDate(DateTime.Now), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')"; + } + + // 直接給定strSQL + strSQL = strSQLAddField + ")" + strSQLAddValue + ")"; + + // //執行SQL指令 + string argstrDatabaseType = Conversions.ToString(DataBaseType); + ExecuteSQLNoneQuery(argstrDatabaseType, strConnectionString, ref strSQL); + + // //Return success + fuAddAutoLoaderLogRet = "success"; + } + + catch (Exception e1) + { + fuAddAutoLoaderLogRet = "fail"; + // 發生錯誤時丟回本身的Function Name及系統錯誤訊息 + // Throw 'New Exception("kcSYS.AddErrorLog: " & e1.Message) + + } + + return fuAddAutoLoaderLogRet; + + } + + public string fuUpdateAutoLoaderState(string ServerName, string ServiceName, string JobNo, string JobFunction, string FileName, string FilePath, int FileSize, string TempTableName = defString, string EquipmentNo = defString, int ImportedRows = defInteger, string LotNo = defString, string ComponentNo = defString, string DESCRIPTION = defString, DateTime StartTime = default(DateTime), DateTime EndTime = default(DateTime), bool blnDelete = false, int SplitRecordsLimit = defInteger, string SequenceNo = defString) + { + string fuUpdateAutoLoaderStateRet = default(string); + // 此 Function 將新增一筆資料 + // 傳入值: 各欄位新增值 + // 傳回值: success(成功), fail(失敗) + + string strSQLAddField = string.Empty; + string strSQLAddValue = string.Empty; + string strSQL = string.Empty; + if (EndTime == defDateTime) + EndTime = DateTime.Now; + IDbConnection cnnTemp, cnnMES; + DbDataReader drTemp; + int intUpdateRows = 0; + try + { + cnnTemp = CreateConnection(strConnectionString); + + strSQL = "Select * From TBLMESAUTOLOADERFILESTATE where ServerName = '" + ServerName + "'And ServiceName = '" + ServiceName + "'" + " And JobNo = '" + JobNo + "' and FileName = '" + FileName + "'"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) // 有資料更新筆數 + { + if (blnDelete) // 所有筆數處理完,要將現況表資料刪除 + { + strSQL = "delete from TBLMESAUTOLOADERFILESTATE Where ServerName = '" + ServerName + "'And ServiceName = '" + ServiceName + "'" + " And JobNo = '" + JobNo + "' and FileName = '" + FileName + "'"; + } + else + { + intUpdateRows = Conversions.ToInteger(Operators.AddObject(drTemp["ImportedRows"], SplitRecordsLimit)); // 當有錯誤訊息,則不用update筆數,因為就錯在上一次分包,縣在這行row上的筆數就是最新的 + if ((DESCRIPTION ?? "") != defString) + { + strSQL = Conversions.ToString("Update TBLMESAUTOLOADERFILESTATE set ImportedRows = " + + drTemp["ImportedRows"] + " , StartTime " + "= To_Date('" + Strings.Format(Conversions.ToDate(StartTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') , EndTime = To_Date('" + + Strings.Format(Conversions.ToDate(DateTime.Now), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),DESCRIPTION = '" + DESCRIPTION + + "' Where ServerName = '" + ServerName + "'And ServiceName = '" + ServiceName + "'" + " And JobNo = '" + JobNo + "' and FileName = '" + + FileName + "'"); + } + else + { + strSQL = "Update TBLMESAUTOLOADERFILESTATE set ImportedRows = " + intUpdateRows + " , StartTime " + "= To_Date('" + Strings.Format(Conversions.ToDate(StartTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') , EndTime = To_Date('" + Strings.Format(Conversions.ToDate(DateTime.Now), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') Where ServerName = '" + ServerName + "'And ServiceName = '" + ServiceName + "'" + " And JobNo = '" + JobNo + "' and FileName = '" + FileName + "'"; + } + } + } + else if (blnDelete == false) // 沒資料新增 + { + strSQLAddField = "Insert into TBLMESAUTOLOADERFILESTATE (ServerName, ServiceName, JobNo,JobFunction,FileName,FilePath,FileSize"; + strSQLAddValue = " Values ('" + Environment.MachineName + "','AutoLoaderLib', '" + JobNo + "','" + JobFunction + "','" + FileName + "','" + FilePath + "'," + FileSize + ""; + + if ((EquipmentNo ?? "") != defString) + { + strSQLAddField = strSQLAddField + ",EquipmentNo"; + strSQLAddValue = strSQLAddValue + ",'" + EquipmentNo + "'"; + } + if ((LotNo ?? "") != defString) + { + strSQLAddField = strSQLAddField + ",LotNo"; + strSQLAddValue = strSQLAddValue + ",'" + LotNo + "'"; + } + if ((ComponentNo ?? "") != defString) + { + strSQLAddField = strSQLAddField + ",ComponentNo"; + strSQLAddValue = strSQLAddValue + ",'" + ComponentNo + "'"; + } + if ((TempTableName ?? "") != defString) + { + strSQLAddField = strSQLAddField + ",TempTableName"; + strSQLAddValue = strSQLAddValue + ",'" + TempTableName + "'"; + } + if (ImportedRows != defInteger) + { + strSQLAddField = strSQLAddField + ",ImportedRows"; + strSQLAddValue = strSQLAddValue + "," + ImportedRows + ""; + } + + if ((DESCRIPTION ?? "") != defString) // 錯誤才寫 + { + strSQLAddField = strSQLAddField + ",DESCRIPTION"; + strSQLAddValue = strSQLAddValue + ",'" + DESCRIPTION + "'"; + } + if ((SequenceNo ?? "") != defString) + { + strSQLAddField = strSQLAddField + ",SequenceNo"; + strSQLAddValue = strSQLAddValue + ",'" + SequenceNo + "'"; + } + if (StartTime != defDateTime) + { + strSQLAddField = strSQLAddField + ",StartTime"; + strSQLAddValue = strSQLAddValue + ", To_Date('" + Strings.Format(Conversions.ToDate(StartTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')"; + } + strSQLAddField = strSQLAddField + ",EndTime"; + strSQLAddValue = strSQLAddValue + ", To_Date('" + Strings.Format(Conversions.ToDate(DateTime.Now), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')"; + + // 直接給定strSQL + strSQL = strSQLAddField + ")" + strSQLAddValue + ")"; + } + else + { + strSQL = string.Empty; + } + drTemp.Close(); + //cmmTemp.Dispose(); + + // //執行SQL指令 + if (!string.IsNullOrEmpty(strSQL)) + { + string argstrDatabaseType = Conversions.ToString(DataBaseType); + ExecuteSQLNoneQuery(argstrDatabaseType, strConnectionString, ref strSQL); + } + + // //Return success + fuUpdateAutoLoaderStateRet = "success"; + } + + catch (Exception e1) + { + fuUpdateAutoLoaderStateRet = "fail"; + // 發生錯誤時丟回本身的Function Name及系統錯誤訊息 + // Throw 'New Exception("kcSYS.AddErrorLog: " & e1.Message) + + } + + return fuUpdateAutoLoaderStateRet; + + } + + private bool fuBatchFormatToEQPEDC(string strTestRecipeType, string pFilePath, string strMSplitSign, string strDSplitSign, string EquipmentNo, int intD_LotNo, int intColumnStart, string strDataStartPos, string FileName, long SplitRecordsLimit, bool CallByUploadFile = false, string SequenceNo = defString) + { + + bool blnResult; + var objReader = default(StreamReader); + // 2019/3/26, Ning, 加入Encode, 排除中文亂碼問題 + // Dim encode As System.Text.Encoding = System.Text.Encoding.GetEncoding("UTF-8") + var encode = Encoding.Default; + string strLine; + + string[] aryTemp; + var dtData = default(DataTable); + int i; + bool blnDataAdd = false; + string strColumnName; + DataRow drAddFix; + string strSQL, strTableName, strSQLAddField, strSQLAddValue; + var CollectionSQL = new Collection(); + + IDbConnection cnnTemp = default(IDbConnection); + DbDataReader drTemp; + + string TestRecipeType; + //System.Data.OleDb.OleDbDataAdapter daTemp; + DataTable dtTestRecipe; + DataSet dsTemp; + var datEventTime = DateTime.Now; + + DataRow[] drSel; + + string strD_LotNo; + long lngSerialNo; + int intDataStart = defInteger; + int x = 0; + + // 分包機制 + int idx = 0; + int intSeq = 1; + var oSQLContent = new Dictionary(); + uint intSQLIndex = 1U; + + var arySerialNo = new int[(int)(SplitRecordsLimit - 1L + 1)]; + var aryLotNo = new string[(int)(SplitRecordsLimit - 1L + 1)]; + var aryCol = new string[501][]; + var aryCol_Date = new DateTime[101][]; + + string strTestCnnString, strTestDBType; + + string[] strSplit; + var dtNotFixData = new DataTable("NotFixData"); // 0088935: [SEMI_Wafer] AutoLoader測試資料動態參數收集優化_AutoLoader 電性值匯入調整 + // 存進非參數資料 + dtNotFixData.Columns.Add("Column_NotFix", Type.GetType("System.String")); + dtNotFixData.Columns.Add("Value_NotFix", Type.GetType("System.String")); + DataRow drNotFix; + + try + { + // //Create connection + cnnTemp = CreateConnection(strConnectionString); + + blnResult = false; + + // 2021/5/4,Ning, 多批格式的TestRecipeType一定要有, ,funImpEQPTest_UploadFile來自Table,funImpEQPTest來自Parameter2 + if ((strTestRecipeType ?? "") != defString && !string.IsNullOrEmpty(strTestRecipeType)) + { + TestRecipeType = strTestRecipeType; + } + else + { + throw new Exception("多批格式測試類別 not found!!!"); + } + + // 當DataStart位置為數值時, 同原本處理方式 + if (Information.IsNumeric(strDataStartPos)) + { + intDataStart = Conversions.ToInteger(strDataStartPos); + } + else // 非數值, 先掃一次檔案, 找到固定字串的列數+1為intDataStart + { + x = 0; + while (!objReader.EndOfStream) + { + x = x + 1; + strLine = objReader.ReadLine(); + if ((strLine.ToUpper() ?? "") == (strDataStartPos.ToUpper() ?? "")) + { + intDataStart = x + 1; + break; + } + } + objReader.Close(); + objReader = null; + objReader = new StreamReader(pFilePath, encode); + } + + // 電性值資料表名稱: tblWIPTestSum_測試類別 + strTableName = "tblWIPEQPEDC_" + TestRecipeType; + + // 依測試類別找出其TestRecipeNo(參數編號), ConversionField(欄位名稱) + strSQL = "Select TestRecipeNo,TestRecipeName, ConversionField, DataType From tblSYSTestRecipeBasis Where TestRecipeClass = 3 And TestRecipeType = '" + TestRecipeType + "'And IssueState = 2"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp); + dsTemp = new DataSet(); + //daTemp.Fill(dsTemp, "TestRecipe"); + ExecuteSQLQuery_Adapter(strSQL, dsTemp, "TestRecipe", cnnTemp); + dtTestRecipe = dsTemp.Tables["TestRecipe"]; + + + + #region -----XLS格式读取----- + int StratRowIndex = 0; + int StartColumnIndex = 0; + if (Strings.Right(FileName, 4).ToUpper() == ".XLS") + { + + dtData = new DataTable(); + // 開啟要讀取的Excel檔案 + var fsExcel = new FileStream(pFilePath, FileMode.Open); + // 自動判斷xls或xlsx + var workbook = WorkbookFactory.Create(fsExcel); + fsExcel.Close(); // 關閉檔案 + + // If TypeName(workbook) = "HSSFWorkbook" Then + // '早期的Excel格式(97-2003) + // 'MsgBox("Excel Format(97-2003)") + // ElseIf TypeName(workbook) = "XSSFWorkbook" Then + // '新的Excel格式(2007 or Later) + // 'MsgBox("Excel Format(2007 Later)") + // End If + + // 解析Excel 內容 + int intStartRowIndex = StratRowIndex; // 要開始讀取資料的列數 + int intStartCellIndex = StartColumnIndex; // 要開始讀取的欄位次序 + int intsheetIndex = 0; + string strFirstSheetName = workbook.GetSheetName(intsheetIndex); + var sheet = workbook.GetSheetAt(intsheetIndex); + object formulaValue; + + // 第一列為欄位名稱 + int MaxRowCount = -1; + int intRowId = intStartRowIndex; + var excelRow = sheet.GetRow(intRowId); + ICell excelCell; + HSSFFormulaEvaluator formulaEvaluator_xls = null; + XSSFFormulaEvaluator formulaEvaluator_xlsx = null; + bool blnHasData = false; + if (excelRow != null) + { + for (int columnIndex = intStartCellIndex, loopTo = excelRow.LastCellNum - 1; columnIndex <= loopTo; columnIndex++) + { + excelCell = excelRow.GetCell(columnIndex); + if (excelCell != null) + { + string strColName; + DataColumn dc; + strColName = excelCell.ToString(); + + bool blnMustConvert = false; + // 2021/4/29,Ning,91736 AutoLoader 欄位名稱若有包含非數值及字元或_, 則至欄名轉換中找, 找不到則報錯 + // 第一個字必須為字元, 不為字元必須轉換 + if (char.IsLetter(Conversions.ToChar(strColName.Substring(0, 1)))) + { + for (int jj = 0, loopTo1 = strColName.Length - 1; jj <= loopTo1; jj++) + { + if (!char.IsNumber(Conversions.ToChar(strColName.Substring(jj, 1))) && !char.IsLetter(Conversions.ToChar(strColName.Substring(jj, 1))) && strColName.Substring(jj, 1) != "_") + { + blnMustConvert = true; + break; + } + } + } + else + { + blnMustConvert = true; + } + if (blnMustConvert) + { + strSQL = "Select ConversionField From tblSYSFieldConvertBasis where DocumentField = '" + strColName.ToUpper() + "'"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + strColName = Conversions.ToString(drTemp["ConversionField"]); + } + else + { + dc = new DataColumn(strColName, Type.GetType("System.String")); + dtData.Columns.Add(dc); + continue; + } + drTemp.Close(); + //cmmTemp.Dispose(); + } + + drSel = dtTestRecipe.Select("TestRecipeNo = '" + strColName + "'"); + if (drSel.Length > 0) + { + strColName = drSel[0]["ConversionField"].ToString(); + + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drSel[0]["DataType"], 2, false))) // 日期格式 + { + dtData.Columns.Add(strColName.ToUpper(), Type.GetType("System.DateTime")); + } + else + { + dtData.Columns.Add(strColName.ToUpper(), Type.GetType("System.String")); + } + } + else + { + // 欄位名稱只能是數字或英文字母, 這兩者除外的皆以_取代 + for (int jj = 0, loopTo2 = strColName.Length - 1; jj <= loopTo2; jj++) + { + if (!char.IsNumber(Conversions.ToChar(strColName.Substring(jj, 1))) && !char.IsLetter(Conversions.ToChar(strColName.Substring(jj, 1)))) + { + strColName = Strings.Replace(strColName, strColName.Substring(jj, 1), "_"); + } + } + + dtData.Columns.Add(strColName.ToUpper(), Type.GetType("System.String")); + + } + + + + + + + } + + } + } + + // 第2列開始讀取資料,讀到最後一列 + while (intRowId <= sheet.LastRowNum - 1) + { + var drAdd = dtData.NewRow(); + intRowId += 1; + blnHasData = false; + excelRow = sheet.GetRow(intRowId); + if (excelRow == null) + continue; // 讀不到資料,跳下一列繼續讀取 + // 讀取所有column + bool continueWhile = false; + for (int colIndex = intStartCellIndex, loopTo3 = dtData.Columns.Count - 1 + intStartCellIndex; colIndex <= loopTo3; colIndex++) + { + excelCell = excelRow.GetCell(colIndex); + // 若第一個 Cell 是 Nothing 就濾掉這筆 + if (excelCell == null && colIndex == 0) + { + continueWhile = true; + break; + } + + // TODO: 讀取到特定文字或指定筆數離開 + if (MaxRowCount != -1 && intRowId - intStartRowIndex > MaxRowCount) + { + + } + if (excelCell != null) + { + string strVal = ""; + if (excelCell.CellType == CellType.Formula) + { + // 2019/7/3, Ning, 公式中若有特定函數如countifs某些電腦會報錯, 再加上cell.CachedFormulaResultType判斷 + if (excelCell.CachedFormulaResultType == CellType.Numeric) + { + if (DateUtil.IsCellDateFormatted(excelCell)) + { + strVal = excelCell.DateCellValue.ToString(); + } + else + { + strVal = excelCell.NumericCellValue.ToString(); + } + } + else if (excelCell.CachedFormulaResultType == CellType.String) + { + strVal = excelCell.StringCellValue.ToString(); + } + else if (Information.TypeName(workbook) == "HSSFWorkbook") + { + if (formulaEvaluator_xls == null) + formulaEvaluator_xls = new HSSFFormulaEvaluator(workbook); + formulaValue = formulaEvaluator_xls.Evaluate(excelCell); + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual((formulaValue as CellValue).CellType, CellType.Numeric, false))) + { + strVal = (formulaValue as CellValue).NumberValue.ToString(); + } + else if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual((formulaValue as CellValue).CellType, CellType.String, false))) + { + strVal = (formulaValue as CellValue).StringValue.ToString(); + } + } + else if (Information.TypeName(workbook) == "XSSFWorkbook") + { + if (formulaEvaluator_xlsx == null) + formulaEvaluator_xlsx = new XSSFFormulaEvaluator(workbook); + formulaValue = formulaEvaluator_xlsx.Evaluate(excelCell); + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual((formulaValue as CellValue).CellType, CellType.Numeric, false))) + { + strVal = (formulaValue as CellValue).NumberValue.ToString(); + } + else if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual((formulaValue as CellValue).CellType, CellType.String, false))) + { + strVal = (formulaValue as CellValue).StringValue.ToString(); + } + } + } + + else if (excelCell.CellType == CellType.Numeric && DateUtil.IsValidExcelDate(excelCell.NumericCellValue) && DateUtil.IsCellDateFormatted(excelCell)) + + { + strVal = excelCell.DateCellValue.ToString("yyyy/MM/dd"); + } + else if (excelCell.CellType == CellType.Numeric) + { + strVal = excelCell.NumericCellValue.ToString(); + if (colIndex == 0) + { + strVal = Convert.ToUInt32(strVal).ToString("0000000"); + } + } + else + { + strVal = excelCell.ToString(); + } + // 若第一個 Cell 是空白值就濾掉這筆 + if (colIndex == intStartCellIndex && string.IsNullOrEmpty(strVal.Trim())) + { + continueWhile = true; + break; + } + drAdd[dtData.Columns[colIndex - intStartCellIndex]] = strVal; + blnHasData = true; + } + } + + if (continueWhile) + { + continue; + } + if (blnHasData) + dtData.Rows.Add(drAdd); + } + + var oParameterNames = new Dictionary(); + var Int32Parameter = new Dictionary(); + var VarcharParameter = new Dictionary(); + var DateParameter = new Dictionary(); + + try + { + strTestCnnString = objSetting.GetConnectionString_DY("TestDataConnectionString", "TestDataDatabasePassword"); + strTestDBType = objSetting.GetDataBaseType_DY("TestDataDatabaseType"); + } + catch + { + strTestCnnString = null; + strTestDBType = null; + } + + // 取不到TestData相關連線時以MES連線取代之 + if (string.IsNullOrEmpty(strTestCnnString) || string.IsNullOrEmpty(strTestDBType)) + { + strTestCnnString = strConnectionString; + strTestDBType = strDataBaseType; + } + + aryCol[dtData.Columns.Count - 1] = new string[(int)(SplitRecordsLimit - 1L + 1)]; + aryCol_Date[dtData.Columns.Count - 1] = new DateTime[(int)(SplitRecordsLimit - 1L + 1)]; + var loopTo4 = dtData.Columns.Count - 1; + for (i = 0; i <= loopTo4; i++) + { + // 二維陣列初始化 + aryCol[i] = new string[(int)(SplitRecordsLimit - 1L + 1)]; + aryCol_Date[i] = new DateTime[(int)(SplitRecordsLimit - 1L + 1)]; + } + + arySerialNo = new int[dtData.Rows.Count]; + aryLotNo = new string[dtData.Rows.Count + 1]; + for (long intRowCount = 0L, loopTo5 = dtData.Rows.Count - 1; intRowCount <= loopTo5; intRowCount++) + { + arySerialNo[(int)intRowCount] = (int)(intRowCount + 1L); + aryLotNo[(int)intRowCount] = "N/A"; + + } + + var loopTo6 = dtData.Columns.Count - 1; + for (i = 0; i <= loopTo6; i++) + { + for (long intRowCount = 0L, loopTo7 = dtData.Rows.Count - 1; intRowCount <= loopTo7; intRowCount++) + { + if (dtData.Columns[i].DataType == Type.GetType("System.DateTime")) + { + if (Information.IsDate(Conversions.ToDate(dtData.Rows[(int)intRowCount][i]))) + { + aryCol_Date[i][(int)intRowCount] = Conversions.ToDate(dtData.Rows[(int)intRowCount][i]); + } + else + { + aryCol_Date[i][(int)intRowCount] = defDateTime; + } + } + else + { + aryCol[i][(int)intRowCount] = dtData.Rows[(int)intRowCount][i].ToString(); + } + } + } + + + + + oParameterNames.Add("SerialNo", "Int32"); + Int32Parameter.Add("SerialNo", arySerialNo); + oParameterNames.Add("LotNo", "Varchar"); + VarcharParameter.Add("LotNo", aryLotNo); + + strSQLAddField = "Insert into " + strTableName + " (SerialNo,LotNo,FileName,EquipmentNo,ImportUserNo,ImportDate"; + strSQLAddValue = " Values (:SerialNo, :LotNo, '" + FileName + "','" + EquipmentNo + "','AutoRun', To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')"; + + var loopTo8 = dtData.Columns.Count - 1; + for (i = 0; i <= loopTo8; i++) + { + + strColumnName = dtData.Columns[i].ColumnName; + + + // TestRecipeBasis有定義此欄位才需要存入, 欄位名稱已轉換為ConversionField + drSel = dtTestRecipe.Select("TestRecipeNo = '" + strColumnName + "'"); + if (drSel.Length > 0) + { + strColumnName = Conversions.ToString(drSel[0]["ConversionField"]); + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drSel[0]["DataType"], 2, false))) // 日期型態 + { + oParameterNames.Add(strColumnName, "DateTime"); + DateParameter.Add(strColumnName, aryCol_Date[i]); + strSQLAddField = strSQLAddField + "," + strColumnName; + strSQLAddValue = strSQLAddValue + ", :" + strColumnName; + } + + else + { + oParameterNames.Add(strColumnName, "Varchar"); + VarcharParameter.Add(strColumnName, aryCol[i]); + strSQLAddField = strSQLAddField + "," + strColumnName; + strSQLAddValue = strSQLAddValue + ", :" + strColumnName; + } + } + } + strSQL = strSQLAddField + ")" + strSQLAddValue + ")"; + + Dictionary argDecimalParameter = null; + funAddSQLContent(oSQLContent, ref intSQLIndex, strSQL, -1, HasParameter: true, ParameterNames: oParameterNames, VarcharParameter: VarcharParameter, Int32Parameter: Int32Parameter, DateTimeParameter: DateParameter, DecimalParameter: argDecimalParameter); + ExecuteSQLNoneQuery_ArrayBinding(strTestDBType, strTestCnnString, oSQLContent); + + intSQLIndex = 1U; + oSQLContent = new Dictionary(); + } + + else //处理CSV + { + #endregion + + // 解檔 + objReader = new StreamReader(pFilePath, encode); + // 先讀取第一列, 再以第一列的編碼方式讀檔 + strLine = objReader.ReadLine().Trim(); + encode = objReader.CurrentEncoding; + objReader.Close(); + objReader = null; + objReader = new StreamReader(pFilePath, encode); + + try + { + strTestCnnString = objSetting.GetConnectionString_DY("TestDataConnectionString", "TestDataDatabasePassword"); + strTestDBType = objSetting.GetDataBaseType_DY("TestDataDatabaseType"); + } + catch + { + strTestCnnString = null; + strTestDBType = null; + } + + // 取不到TestData相關連線時以MES連線取代之 + if (string.IsNullOrEmpty(strTestCnnString) || string.IsNullOrEmpty(strTestDBType)) + { + strTestCnnString = strConnectionString; + strTestDBType = strDataBaseType; + } + string[] aryORGColumnName = new string[] { }; + string aryColumnName = ""; + //切割欄位的正規式 + var regex = new Regex("(?<=^|,)(\"(?:[^\"]|\"\")*\"|[^,]*)", + RegexOptions.Multiline); + + //去除前後的雙引號 + //IEnumerable clear(MatchCollection matches) + //{ + // foreach (Match match in matches) + // { + // //去除頭尾空白 + // var value = match.Value.Trim(); + // //如果開頭是雙引號,就去除頭尾的雙引號 + // yield return value.StartsWith("\"") ? + // match.Value.Substring(1, match.Value.Length - 2) : value; + // } + //}; + while (!objReader.EndOfStream) + { + x = x + 1; + + strLine = objReader.ReadLine().Trim(); + var matches = regex.Matches(strLine); + if (strLine != null && !string.IsNullOrEmpty(strLine.Trim())) + { + + if (x == intColumnStart) // 取得欄位名稱 + { + + try + { + dtData = new DataTable("CSVData"); + + // 2019/2/22,Ning明細以strDSplitSign分隔 + // 若結尾為strDSplitSign則去掉 + if (strLine.EndsWith(strDSplitSign)) + { + strLine = strLine.TrimEnd(Conversions.ToChar(strDSplitSign)); + } + + aryTemp = strLine.Split(Conversions.ToChar(strDSplitSign)); + + var loopTo9 = aryTemp.Length - 1; + for (i = 0; i <= loopTo9; i++) + { + // 新增 Column + if (dtData.Columns.Count <= i) + { + + // 2019/3/22,Ning,先以原始欄位存入, 後端再判斷是否為固定參數的位置 + strColumnName = aryTemp[i].ToString().ToUpper().Trim(); + + bool blnMustConvert = false; + // 2021/4/29,Ning,91736 AutoLoader 欄位名稱若有包含非數值及字元或_, 則至欄名轉換中找, 找不到則報錯 + // 第一個字必須為字元, 不為字元必須轉換 + if (char.IsLetter(Conversions.ToChar(strColumnName.Substring(0, 1)))) + { + for (int jj = 0, loopTo10 = strColumnName.Length - 1; jj <= loopTo10; jj++) + { + if (!char.IsNumber(Conversions.ToChar(strColumnName.Substring(jj, 1))) && !char.IsLetter(Conversions.ToChar(strColumnName.Substring(jj, 1))) && strColumnName.Substring(jj, 1) != "_") + { + blnMustConvert = true; + break; + } + } + } + else + { + blnMustConvert = true; + } + if (blnMustConvert) + { + strSQL = "Select ConversionField From tblSYSFieldConvertBasis where DocumentField = '" + strColumnName.ToUpper() + "'"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + strColumnName = Conversions.ToString(drTemp["ConversionField"]); + } + else + { + throw new Exception("解析檔案失敗,檔案欄位: " + strColumnName + " 含有特殊字元但未設定欄名轉換, 請檢查檔案:" + FileName); + } + drTemp.Close(); + //cmmTemp.Dispose(); + } + + drSel = dtTestRecipe.Select("TestRecipeNo = '" + strColumnName + "'"); + if (drSel.Length > 0) + { + strColumnName = drSel[0]["ConversionField"].ToString(); + + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drSel[0]["DataType"], 2, false))) // 日期格式 + { + dtData.Columns.Add(strColumnName.ToUpper(), Type.GetType("System.DateTime")); + } + else + { + dtData.Columns.Add(strColumnName.ToUpper(), Type.GetType("System.String")); + } + } + else + { + // 欄位名稱只能是數字或英文字母, 這兩者除外的皆以_取代 + for (int jj = 0, loopTo11 = strColumnName.Length - 1; jj <= loopTo11; jj++) + { + if (!char.IsNumber(Conversions.ToChar(strColumnName.Substring(jj, 1))) && !char.IsLetter(Conversions.ToChar(strColumnName.Substring(jj, 1)))) + { + strColumnName = Strings.Replace(strColumnName, strColumnName.Substring(jj, 1), "_"); + } + } + + if (string.IsNullOrEmpty(strColumnName)) + { + strColumnName = "COL" + i; + } + + // 判斷取代後的欄位是否已存在,若已存在則於欄位後方加COL+欄位顯示順序 + if (dtData.Columns.Contains(strColumnName)) + { + strColumnName = strColumnName + "COL" + i; + } + + dtData.Columns.Add(strColumnName.ToUpper(), Type.GetType("System.String")); + + } + + } + } + } + + catch + { + throw; + } + } + + if (x == intDataStart || blnDataAdd == true) // 取得明細資料 + { + + blnDataAdd = true; + datEventTime = DateTime.Now; + + if (x == intDataStart) + { + aryCol[dtData.Columns.Count - 1] = new string[(int)(SplitRecordsLimit - 1L + 1)]; + aryCol_Date[dtData.Columns.Count - 1] = new DateTime[(int)(SplitRecordsLimit - 1L + 1)]; + var loopTo12 = dtData.Columns.Count - 1; + for (i = 0; i <= loopTo12; i++) + { + // 二維陣列初始化 + aryCol[i] = new string[(int)(SplitRecordsLimit - 1L + 1)]; + aryCol_Date[i] = new DateTime[(int)(SplitRecordsLimit - 1L + 1)]; + } + } + + try + { + //aryTemp = strLine.Split(Conversions.ToChar(strDSplitSign)); + + aryTemp = new string[matches.Count]; + + for (int int_tmp = 0; int_tmp <= aryTemp.Length - 1; int_tmp++) + { + if (matches[int_tmp].ToString() != "") + { + aryTemp[int_tmp] = matches[int_tmp].ToString(); + string[] parts = aryTemp[int_tmp].Split(new char[] { '\"' }, StringSplitOptions.RemoveEmptyEntries); + aryTemp[int_tmp] = parts[0]; + } + + } + + arySerialNo[idx] = intSeq; + aryLotNo[idx] = "N/A"; + var loopTo13 = dtData.Columns.Count - 1; + for (i = 0; i <= loopTo13; i++) + { + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(aryTemp[i], 1) == Conversions.ToString('"') && Strings.Right(aryTemp[i], 1) == Conversions.ToString('"')) + { + aryTemp[i] = Strings.Mid(aryTemp[i], 2, Strings.Len(aryTemp[i]) - 2); + } + } + if (!string.IsNullOrEmpty(aryTemp[i])) + { + if (dtData.Columns[i].DataType == Type.GetType("System.DateTime")) + { + if (Information.IsDate(Conversions.ToDate(aryTemp[i]))) + { + aryCol_Date[i][idx] = Conversions.ToDate(aryTemp[i]); + } + else + { + aryCol_Date[i][idx] = defDateTime; + } + } + else + { + aryCol[i][idx] = aryTemp[i].ToString(); + } + } + else if (dtData.Columns[i].DataType == Type.GetType("System.DateTime")) + { + aryCol_Date[i][idx] = defDateTime; + } + else + { + aryCol[i][idx] = ""; + } + if (i + 1 == intD_LotNo) + { + aryLotNo[idx] = Strings.Trim(aryTemp[i]); + } + } + + idx = idx + 1; + intSeq = intSeq + 1; + + // 當筆數達到SplitRecordsLimit時寫入DB + if (idx == SplitRecordsLimit) + { + + var oParameterNames = new Dictionary(); + var Int32Parameter = new Dictionary(); + var VarcharParameter = new Dictionary(); + var DateParameter = new Dictionary(); + + oParameterNames.Add("SerialNo", "Int32"); + Int32Parameter.Add("SerialNo", arySerialNo); + oParameterNames.Add("LotNo", "Varchar"); + VarcharParameter.Add("LotNo", aryLotNo); + + strSQLAddField = "Insert into " + strTableName + " (SerialNo,LotNo,FileName,EquipmentNo,ImportUserNo,ImportDate"; + strSQLAddValue = " Values (:SerialNo, :LotNo, '" + FileName + "','" + EquipmentNo + "','AutoRun', To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')"; + + var loopTo14 = dtData.Columns.Count - 1; + for (i = 0; i <= loopTo14; i++) + { + + strColumnName = dtData.Columns[i].ColumnName; + + + // TestRecipeBasis有定義此欄位才需要存入, 欄位名稱已轉換為ConversionField + drSel = dtTestRecipe.Select("TestRecipeNo = '" + strColumnName + "'"); + if (drSel.Length > 0) + { + strColumnName = Conversions.ToString(drSel[0]["ConversionField"]); + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drSel[0]["DataType"], 2, false))) // 日期型態 + { + oParameterNames.Add(strColumnName, "DateTime"); + DateParameter.Add(strColumnName, aryCol_Date[i]); + strSQLAddField = strSQLAddField + "," + strColumnName; + strSQLAddValue = strSQLAddValue + ", :" + strColumnName; + } + + else + { + oParameterNames.Add(strColumnName, "Varchar"); + VarcharParameter.Add(strColumnName, aryCol[i]); + strSQLAddField = strSQLAddField + "," + strColumnName; + strSQLAddValue = strSQLAddValue + ", :" + strColumnName; + } + } + } + strSQL = strSQLAddField + ")" + strSQLAddValue + ")"; + + Dictionary argDecimalParameter1 = null; + funAddSQLContent(oSQLContent, ref intSQLIndex, strSQL, -1, HasParameter: true, ParameterNames: oParameterNames, VarcharParameter: VarcharParameter, Int32Parameter: Int32Parameter, DateTimeParameter: DateParameter, DecimalParameter: argDecimalParameter1); + ExecuteSQLNoneQuery_ArrayBinding(strTestDBType, strTestCnnString, oSQLContent); + + intSQLIndex = 1U; + oSQLContent = new Dictionary(); + idx = 0; + } + } + + catch (Exception ex) + { + throw; + } + } + + } + } + + + + + // 最後一包的idx筆資料, array中的index 0~idx-1 有值 + if (idx >= 1) + { + try + { + var arySerialNo_C = new int[idx]; + var aryLotNo_C = new string[idx]; + var aryCol_C = new string[501][]; + var aryCol_Date_C = new DateTime[101][]; + + aryCol_C[dtData.Columns.Count - 1] = new string[idx]; // 重新定義二維陣列aryCol_C的維度 + aryCol_Date_C[dtData.Columns.Count - 1] = new DateTime[idx]; // 重新定義二維陣列aryCol_Date_C的維度 + var loopTo15 = dtData.Columns.Count - 1; + for (i = 0; i <= loopTo15; i++) + { + // 二維陣列初始化 + aryCol_C[i] = new string[idx]; + aryCol_Date_C[i] = new DateTime[idx]; + } + + var oParameterNames = new Dictionary(); + var Int32Parameter = new Dictionary(); + var VarcharParameter = new Dictionary(); + var DateParameter = new Dictionary(); + + // 將arySerialNo的前idx筆複製給arySerialNo_C + Array.Copy(arySerialNo, arySerialNo_C, idx); + oParameterNames.Add("SerialNo", "Int32"); + Int32Parameter.Add("SerialNo", arySerialNo_C); + + // 將aryLotNo的前idx筆複製給aryLotNo_C + Array.Copy(aryLotNo, aryLotNo_C, idx); + oParameterNames.Add("LotNo", "Varchar"); + VarcharParameter.Add("LotNo", aryLotNo_C); + + strSQLAddField = "Insert into " + strTableName + " (SerialNo,LotNo,FileName,EquipmentNo,ImportUserNo,ImportDate"; + strSQLAddValue = " Values (:SerialNo, :LotNo, '" + FileName + "','" + EquipmentNo + "','AutoRun', To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')"; + var loopTo16 = dtData.Columns.Count - 1; + for (i = 0; i <= loopTo16; i++) + { + + strColumnName = dtData.Columns[i].ColumnName; + + // TestRecipeBasis有定義此欄位才需要存入, 欄位名稱已轉換為ConversionField + drSel = dtTestRecipe.Select("TestRecipeNo = '" + strColumnName + "'"); + if (drSel.Length > 0) + { + strColumnName = Conversions.ToString(drSel[0]["ConversionField"]); + // 將aryCol(i)的前idx筆複製給aryCol_C(i) + Array.Copy(aryCol[i], aryCol_C[i], idx); + Array.Copy(aryCol_Date[i], aryCol_Date_C[i], idx); + + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drSel[0]["DataType"], 2, false))) // 日期型態 + { + oParameterNames.Add(strColumnName, "DateTime"); + DateParameter.Add(strColumnName, aryCol_Date_C[i]); + strSQLAddField = strSQLAddField + "," + strColumnName; + strSQLAddValue = strSQLAddValue + ", :" + strColumnName; + } + else + { + oParameterNames.Add(strColumnName, "Varchar"); + VarcharParameter.Add(strColumnName, aryCol_C[i]); + strSQLAddField = strSQLAddField + "," + strColumnName; + strSQLAddValue = strSQLAddValue + ", :" + strColumnName; + } + + } + } + strSQL = strSQLAddField + ")" + strSQLAddValue + ")"; + + Dictionary argDecimalParameter2 = null; + funAddSQLContent(oSQLContent, ref intSQLIndex, strSQL, -1, HasParameter: true, ParameterNames: oParameterNames, VarcharParameter: VarcharParameter, Int32Parameter: Int32Parameter, DateTimeParameter: DateParameter, DecimalParameter: argDecimalParameter2); + ExecuteSQLNoneQuery_ArrayBinding(strTestDBType, strTestCnnString, oSQLContent); + + intSQLIndex = 1U; + oSQLContent = new Dictionary(); + idx = 0; + } + catch (Exception ex) + { + throw; + } + } + + if (CallByUploadFile) + { + // 更新tblWIPCont_UploadFile + // 88995: [6.0.5] EAP 整合接口 LogFile_Send PK重複問題調整 + // strSQL = "Update tblWIPCont_UploadFile Set Result = 1, SummaryTableName = '" & strTableName & "', ComponentNo = '" & strWaferID & "', ReadFileDate = To_Date('" & Format(datEventTime, "yyyy/MM/dd H:mm:ss") & "','YYYY/MM/DD HH24:MI:SS')" & + // " Where EquipmentNo = '" & EquipmentNo & "' And CreateDate = To_Date('" & Format(CreateDate, "yyyy/MM/dd H:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') " + strSQL = "Update tblWIPCont_UploadFile Set Result = 1,CreateDate = To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'), SummaryTableName = '" + strTableName + "', ReadFileDate = To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')" + " Where EquipmentNo = '" + EquipmentNo + "' And SequenceNo='" + SequenceNo + "' "; + CollectionSQL.Add(strSQL); + + // 呼叫執行SQL指令 + string argstrDatabaseType = Conversions.ToString(DataBaseType); + ExecuteSQLNoneQuery_UPD(argstrDatabaseType, strConnectionString, CollectionSQL); + } + + objReader.Close(); + } + + blnResult = true; + } + + catch (Exception ex) + { + throw; + } + + finally + { + if (objReader != null) + { + objReader.Close(); + objReader = null; + } + CloseConnection(cnnTemp); + aryTemp = null; + } + + return blnResult; + + } + + private bool fuExcelDataToTestSum_EQP(string pFilePath, string strTestRecipeType, ArrayList aryFormula, string EquipmentNo, int intD_CompNo, string FileName, int FileSize = defInteger) + { + + bool blnResult; + // 2019/3/26, Ning, 加入Encode, 排除中文亂碼問題 + // Dim encode As System.Text.Encoding = System.Text.Encoding.GetEncoding("UTF-8") + var encode = Encoding.Default; + string strLine; + + short i; + string strTestRecipeNo; + DataRow drAdd; + DataRow drAddFix; + string strSQL, strTableName, strSQLAddField, strSQLAddValue; + var CollectionSQL = new Collection(); + + IDbConnection cnnTemp = default(IDbConnection); + var drTemp = default(DbDataReader); + + var TestRecipeType = default(string); + string strLogTableName, strSQLHead, strSQLLogHead; + //System.Data.OleDb.OleDbDataAdapter daTemp; + DataTable dtTestRecipe; + DataSet dsTemp; + DateTime datEventTime, datTestDate; + + DataTable dtFixData; + DataView dvFixData; + DataRow[] drSel; + DataTable dtResult = null; + string strWaferID; + string LotNo = default(string), LogGroupSerial = default(string), PSNo; + var strReadFormula = new string[2]; + + try + { + // //Create connection + cnnTemp = CreateConnection(strConnectionString); + + blnResult = false; + + // 將Excel資料匯入到dtResult中, 只有單身, 沒有單頭, 第一列即是欄位名稱 + fuReadExcel(pFilePath, ref dtResult); + + if (dtResult.Columns.Count < intD_CompNo) + { + throw new Exception("無法取得ComponentNo!!"); + } + + dtFixData = new DataTable("WaferID"); + dtFixData.Columns.Add("WaferID", Type.GetType("System.String")); + + foreach (DataRow drResult in dtResult.Rows) + { + drAdd = dtFixData.NewRow(); + drAdd["WaferID"] = drResult[intD_CompNo - 1].ToString(); + dtFixData.Rows.Add(drAdd); + } + + // 以第一筆ComponentNo取得LotNo及PSNo + if (dtResult.Rows.Count > 0) + { + strWaferID = dtFixData.Rows[0]["WaferID"].ToString(); + // 取得LotNo, LogGroupSerial + // 因ComponentState中同一ComponentNo可能會對到多筆Lot, 但只會有一筆還在WIP中的, 故限制Status in (0,1,2,3,4,5) + strSQL = "Select A.LotNo, B.PSNo, B.LogGroupSerial From tblWIPComponentState A, tblWIPLotState B Where A.LotNo = B.LotNo And A.ComponentNo = '" + strWaferID + "'" + " And B.Status In (0,1,2,3,4,5)"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + if (string.IsNullOrEmpty(drTemp["LogGroupSerial"].ToString())) + { + throw new Exception("解析檔案失敗,LotNo: " + LotNo + " 之LogGroupSerial為空!"); + } + LotNo = Conversions.ToString(drTemp["LotNo"]); + LogGroupSerial = drTemp["LogGroupSerial"].ToString(); + PSNo = Conversions.ToString(drTemp["PSNo"]); + } + else + { + throw new Exception("解析檔案失敗,ComponentNo: " + strWaferID + " 無法找到對應的 LotNo,請檢查檔案:" + FileName); + } + drTemp.Close(); + //cmmTemp.Dispose(); + + // 2019/5/30, Ning, 若AutoLoaderJob.xml的Parameter2有定義TestRecipeType, 則以該值為優先, 若沒有定再以下述方式找TestRecipeType + if ((strTestRecipeType ?? "") != defString) + { + TestRecipeType = strTestRecipeType; + } + // 依格式檔內的參數編號及生產批所在區域取得TestRecipeType + else if (aryFormula.Count > 0) + { + strReadFormula = Strings.Split(Strings.Trim(aryFormula[0].ToString()), ":"); + strTestRecipeNo = strReadFormula[0].ToUpper(); + + strSQL = "Select TestRecipeType From tblSYSTestRecipeBasis Where TestRecipeNo = '" + strTestRecipeNo + "' And PSNo = '" + PSNo + "'"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + TestRecipeType = Conversions.ToString(drTemp["TestRecipeType"]); + } + else + { + throw new Exception("解析檔案失敗, 找不到區段: " + PSNo + ", 參數編號: " + strTestRecipeNo + " 之測試類別!"); + } + drTemp.Close(); + //cmmTemp.Dispose(); + } + } + + // 電性值資料表名稱: tblWIPTestSum_測試類別 + strTableName = "TBLWIPTESTSUM_" + TestRecipeType; + strLogTableName = "TBLWIPTESTSUMLOG_" + TestRecipeType; + + // 依測試類別找出其TestRecipeNo(參數編號), ConversionField(欄位名稱) + strSQL = "Select TestRecipeNo, ConversionField From tblSYSTestRecipeBasis Where TestRecipeType = '" + TestRecipeType + "'"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp); + dsTemp = new DataSet(); + //daTemp.Fill(dsTemp, "TestRecipe"); + ExecuteSQLQuery_Adapter(strSQL, dsTemp, "TestRecipe", cnnTemp); + dtTestRecipe = dsTemp.Tables["TestRecipe"]; + + string strExcelField; + DataTable dtFieldMap; + + dtFieldMap = new DataTable("FieldMap"); + dtFieldMap.Columns.Add("TestRecipeNo", Type.GetType("System.String")); + dtFieldMap.Columns.Add("ExcelField", Type.GetType("System.String")); + dtFieldMap.Columns.Add("ConversionField", Type.GetType("System.String")); + + if (aryFormula.Count > 0) + { + + for (int w = 0, loopTo = aryFormula.Count - 1; w <= loopTo; w++) + { + strReadFormula = Strings.Split(Strings.Trim(aryFormula[w].ToString()), ":"); + strTestRecipeNo = strReadFormula[0]; + strExcelField = strReadFormula[1]; + + // TestRecipeBasis有定義此欄位才需要計算並存入 + // 2019/3/7, Ning, 存入的欄位名稱為dtTestRecipe.ConversionField + drSel = dtTestRecipe.Select("TestRecipeNo = '" + strTestRecipeNo + "'"); + if (drSel.Length > 0) + { + + drAdd = dtFieldMap.NewRow(); + drAdd["TestRecipeNo"] = strTestRecipeNo; + drAdd["ExcelField"] = strExcelField; + drAdd["ConversionField"] = drSel[0]["ConversionField"].ToString(); + dtFieldMap.Rows.Add(drAdd); + } + } + drTemp.Close(); + //cmmTemp.Dispose(); + + } + + // TestSum, TestSumLog存入DB + datEventTime = DateTime.Now; + datTestDate = datEventTime; + + foreach (DataRow drData in dtResult.Rows) + { + + strWaferID = Conversions.ToString(drData[intD_CompNo - 1]); + // tblWIPTestSum刪除已存在的資料, 只保留最新一次資料 + strSQL = "Delete From " + strTableName + " Where ComponentNo = '" + strWaferID + "'"; + CollectionSQL.Add(strSQL); + + // //新增TestSummary, TestSummaryLog + strSQLHead = "Insert into " + strTableName + " ("; + strSQLLogHead = "Insert into " + strLogTableName + " ("; + strSQLAddValue = " Values ("; + + // 固定欄位 + // 2021/5/13 加入新增的四個固定欄位 多片沒有rawdata + strSQLAddField = "LogGroupSerial, ComponentNo, LotNo, FileName, EquipmentNo, ImportUserNo, ImportDate,STORERAWDATA,FileSize,"; + strSQLAddValue = strSQLAddValue + "'" + LogGroupSerial + "','" + strWaferID + "','" + LotNo + "','" + FileName + "','" + EquipmentNo + "','AutoRun'," + " To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),0," + FileSize + ","; + + bool blnD_TestDate, blnD_ProgramNo; // 明細是否有動態表頭欄位, 有的話以明細為準 + blnD_TestDate = false; + blnD_ProgramNo = false; + + // 動態欄位(明細欄位) + foreach (DataRow drField in dtFieldMap.Rows) + { + + if (drField["ConversionField"].ToString().ToUpper() == "TESTDATE") + { + strSQLAddField = strSQLAddField + drField["ConversionField"].ToString() + ","; + strSQLAddValue = strSQLAddValue + "To_Date('" + Strings.Format(Convert.ToDateTime(drData[drField["ExcelField"].ToString()].ToString()), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),"; + + blnD_TestDate = true; + datTestDate = Convert.ToDateTime(drData[drField["ExcelField"].ToString()].ToString()); + } + else + { + strSQLAddField = strSQLAddField + drField["ConversionField"].ToString() + ","; + strSQLAddValue = strSQLAddValue + "'" + drData[drField["ExcelField"].ToString()].ToString() + "',"; + + if (drField["ConversionField"].ToString().ToUpper() == "PROGRAMNO") + { + blnD_ProgramNo = true; + } + } + + } + + // 固定欄位(表頭), 若明細沒有, 則一定要加入, 因Table不允許Null + if (!blnD_TestDate) + { + strSQLAddField = strSQLAddField + "TestDate,"; + strSQLAddValue = strSQLAddValue + "To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')" + ","; + } + if (!blnD_ProgramNo) + { + strSQLAddField = strSQLAddField + "ProgramNo,"; + strSQLAddValue = strSQLAddValue + "'N/A',"; + } + + if (Strings.InStr(1, strSQLAddField, ",") != 0) // 刪除最後一個"," + { + if (Strings.Right(strSQLAddField, 1) == ",") + { + strSQLAddField = Strings.Mid(strSQLAddField, 1, Strings.Len(strSQLAddField) - 1); + } + } + + if (Strings.InStr(1, strSQLAddValue, ",") != 0) // 刪除最後一個"," + { + if (Strings.Right(strSQLAddValue, 1) == ",") + { + strSQLAddValue = Strings.Mid(strSQLAddValue, 1, Strings.Len(strSQLAddValue) - 1); + } + } + + // 直接給定strSQL + strSQL = strSQLHead + strSQLAddField + ")" + strSQLAddValue + ")"; + CollectionSQL.Add(strSQL); + + // Log SQL + strSQL = strSQLLogHead + strSQLAddField + ")" + strSQLAddValue + ")"; + CollectionSQL.Add(strSQL); + + // 檢查檔案是否已匯入過(資料已存在Log中) + // 2021/3/16 Steven Mantis: 0089578: [SEMI_Wafer] AutoLoader 廠內電性測試資料,允許相同測試時間的測試檔的匯入 + //strSQL = "Select ComponentNo From " + strLogTableName + " Where ComponentNo = '" + strWaferID + "' And FileName = '" + FileName + "'" + " And TestDate = To_Date('" + Strings.Format(datTestDate, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') And ImportDate = To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + if (strDataBaseType == "oracle") + { + strSQL = "Select ComponentNo From " + strLogTableName + " Where ComponentNo = '" + strWaferID + "' And FileName = '" + FileName + "'" + " And TestDate = To_Date('" + Strings.Format(datTestDate, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') And ImportDate = To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')"; + } + else if (strDataBaseType == "mssql") + { + strSQL = "Select ComponentNo From " + strLogTableName + " Where ComponentNo = '" + strWaferID + "' And FileName = '" + FileName + "'" + " And TestDate = '" + Strings.Format(datTestDate, "yyyy/MM/dd H:mm:ss") + "' And ImportDate = '" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "'"; + + } + + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + throw new Exception("檔案: " + FileName + ", 測試日期: " + Strings.Format(datTestDate, "yyyy/MM/dd H:mm:ss") + ", 匯入時間" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + " 已匯入, 不允許重新匯入!!"); + } + drTemp.Close(); + //cmmTemp.Dispose(); + + } + + // //執行SQL指令 + string argstrDatabaseType = Conversions.ToString(DataBaseType); + ExecuteSQLNoneQuery_UPD(argstrDatabaseType, strConnectionString, CollectionSQL); + + blnResult = true; + } + + catch (Exception ex) + { + throw; + } + + finally + { + CloseConnection(cnnTemp); + } + + return blnResult; + + } + + //91737: [SEMI_Wafer] AutoLoader 設備電性測試多片解檔優化_AutoLoader 廠內設備電性值匯入調整--- + private bool fuExcelDataToTestSumWithTitle_EQP(string pFilePath, string strMSplitSign, string strDSplitSign, int TestDatePos, int EquipmentNoPos, int ProgramNoPos, int intColumnStart, int intDataStart, + string strTestRecipeType, ArrayList aryFormula, string EquipmentNo, int intD_CompNo, int intLotNumber, int intRecipe, int intBinFileName, int intOperator, int intTotalScan, int intTotalTested, int intTestCondition, int intCalData, + string FileName, ref DataTable dtData, + DataTable dtFormat_Postion = null, int FileSize = defInteger) + { + + bool blnResult; + // 2019/3/26, Ning, 加入Encode, 排除中文亂碼問題 + // Dim encode As System.Text.Encoding = System.Text.Encoding.GetEncoding("UTF-8") + var encode = Encoding.Default; + string strLine; + + short i; + string strTestRecipeNo; + DataRow drAdd; + DataRow drAddFix; + string strSQL, strTableName, strSQLAddField, strSQLAddValue; + var CollectionSQL = new Collection(); + + IDbConnection cnnTemp = default(IDbConnection); + var drTemp = default(DbDataReader); + + var TestRecipeType = default(string); + string strLogTableName, strSQLHead, strSQLLogHead; + //System.Data.OleDb.OleDbDataAdapter daTemp; + DataTable dtTestRecipe; + DataSet dsTemp; + DateTime datEventTime, datTestDate; + + DataTable dtFixData; + DataView dvFixData; + DataRow[] drSel; + DataTable dtResult = null; + string strWaferID; + string LotNo = default(string), LogGroupSerial = default(string), PSNo; + var strReadFormula = new string[2]; + + StreamReader objReader = default(StreamReader); + string strTestDate = default(string), strFileEquipmentNo, strProgramNo; + string strLotNumber, strRecipe, strBinFileName, strOperator, strTotalScan, strTotalTested, strTestCondition, strCalData; + string[] aryWaferInfo = new string[] { defString, defString, defString, defString, defString, defString, defString, defString, defString, defString, defString, defString, defString, defString }; // 存放解析後的Wafer資訊 + string strColumnName, strOrgColName; + bool blnDataAdd = false; + string[] aryTemp; + + try + { + // //Create connection + cnnTemp = CreateConnection(strConnectionString); + + blnResult = false; + // 取得單頭 + objReader = new StreamReader(pFilePath, encode); + // 先讀取第一列, 再以第一列的編碼方式讀檔 + strLine = objReader.ReadLine().Trim(); + encode = objReader.CurrentEncoding; + objReader.Close(); + objReader = null; + objReader = new StreamReader(pFilePath, encode); + + int x = 0; + while (!objReader.EndOfStream) + { + x = x + 1; + + strLine = objReader.ReadLine(); + + if (strLine != null && !string.IsNullOrEmpty(strLine.Trim())) + { + + if (x == TestDatePos) // 2.取得測試時間 + { + // 2019/2/20, Ning, 以傳入的表頭分隔字元拆解 + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + // 因日期格式中可能有/或:會作為分隔符號, 需特別處理 + if (strMSplitSign == ":" || strMSplitSign == "/") + { + for (int k = 1, loopTo = aryTemp.Length - 1; k <= loopTo; k++) + strTestDate = strTestDate + aryTemp[k].ToString().Trim() + strMSplitSign; + // 刪除最後的分隔符號":"或"/" + // 2019/6/26, Ning, 若分隔符號太多, 有多餘的分隔符號, 會不只一個 :或/ + while ((Strings.Right(strTestDate, 1) ?? "") == (strMSplitSign ?? "")) + strTestDate = Strings.Mid(strTestDate, 1, Strings.Len(strTestDate) - 1); + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(strTestDate, 1) == Conversions.ToString('"') && Strings.Right(strTestDate, 1) == Conversions.ToString('"')) + { + strTestDate = Strings.Mid(strTestDate, 2, Strings.Len(strTestDate) - 2); + } + } + aryWaferInfo[1] = strTestDate; + } + else + { + strTestDate = aryTemp[1].ToString().Trim(); + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(strTestDate, 1) == Conversions.ToString('"') && Strings.Right(strTestDate, 1) == Conversions.ToString('"')) + { + strTestDate = Strings.Mid(strTestDate, 2, Strings.Len(strTestDate) - 2); + } + } + aryWaferInfo[1] = strTestDate; + } + } + else + { + throw new Exception("不支援此檔案格式,Raw Data格式內容資料解析需為" + strMSplitSign); + } + } + + if (x == EquipmentNoPos) // 3.取得設備編號 + { + // 2019/2/20, Ning, 以傳入的表頭分隔字元拆解 + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + strFileEquipmentNo = aryTemp[1].ToString().Trim(); + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(strFileEquipmentNo, 1) == Conversions.ToString('"') && Strings.Right(strFileEquipmentNo, 1) == Conversions.ToString('"')) + { + strFileEquipmentNo = Strings.Mid(strFileEquipmentNo, 2, Strings.Len(strFileEquipmentNo) - 2); + } + } + aryWaferInfo[2] = strFileEquipmentNo; + } + else + { + throw new Exception("不支援此檔案格式,Raw Data格式內容資料解析需為" + strMSplitSign); + } + } + + if (x == ProgramNoPos) // 6.取得測試程式編號 + { + // 2019/2/20, Ning, 以傳入的表頭分隔字元拆解 + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + strProgramNo = aryTemp[1].ToString().Trim(); + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(strProgramNo, 1) == Conversions.ToString('"') && Strings.Right(strProgramNo, 1) == Conversions.ToString('"')) + { + strProgramNo = Strings.Mid(strProgramNo, 2, Strings.Len(strProgramNo) - 2); + } + } + aryWaferInfo[5] = strProgramNo; + } + else + { + throw new Exception("不支援此檔案格式,Raw Data格式內容資料解析需為" + strMSplitSign); + } + } + + if (x == intLotNumber) + { + // 2019/2/20, Ning, 以傳入的表頭分隔字元拆解 + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + strLotNumber = aryTemp[1].ToString().Trim(); + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(strLotNumber, 1) == Conversions.ToString('"') && Strings.Right(strLotNumber, 1) == Conversions.ToString('"')) + { + strLotNumber = Strings.Mid(strLotNumber, 2, Strings.Len(strLotNumber) - 2); + } + } + aryWaferInfo[6] = strLotNumber; + } + else + { + throw new Exception("不支援此檔案格式,Raw Data格式內容資料解析需為" + strMSplitSign); + } + } + + if (x == intRecipe) + { + // 2019/2/20, Ning, 以傳入的表頭分隔字元拆解 + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + strRecipe = aryTemp[1].ToString().Trim(); + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(strRecipe, 1) == Conversions.ToString('"') && Strings.Right(strRecipe, 1) == Conversions.ToString('"')) + { + strRecipe = Strings.Mid(strRecipe, 2, Strings.Len(strRecipe) - 2); + } + } + aryWaferInfo[7] = strRecipe; + } + else + { + throw new Exception("不支援此檔案格式,Raw Data格式內容資料解析需為" + strMSplitSign); + } + } + + if (x == intBinFileName) + { + // 2019/2/20, Ning, 以傳入的表頭分隔字元拆解 + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + strBinFileName = aryTemp[1].ToString().Trim(); + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(strBinFileName, 1) == Conversions.ToString('"') && Strings.Right(strBinFileName, 1) == Conversions.ToString('"')) + { + strBinFileName = Strings.Mid(strBinFileName, 2, Strings.Len(strBinFileName) - 2); + } + } + aryWaferInfo[8] = strBinFileName; + } + else + { + throw new Exception("不支援此檔案格式,Raw Data格式內容資料解析需為" + strMSplitSign); + } + } + + if (x == intOperator) + { + // 2019/2/20, Ning, 以傳入的表頭分隔字元拆解 + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + strOperator = aryTemp[1].ToString().Trim(); + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(strOperator, 1) == Conversions.ToString('"') && Strings.Right(strOperator, 1) == Conversions.ToString('"')) + { + strOperator = Strings.Mid(strOperator, 2, Strings.Len(strOperator) - 2); + } + } + aryWaferInfo[9] = strOperator; + } + else + { + throw new Exception("不支援此檔案格式,Raw Data格式內容資料解析需為" + strMSplitSign); + } + } + + if (x == intTotalScan) + { + // 2019/2/20, Ning, 以傳入的表頭分隔字元拆解 + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + strTotalScan = aryTemp[1].ToString().Trim(); + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(strTotalScan, 1) == Conversions.ToString('"') && Strings.Right(strTotalScan, 1) == Conversions.ToString('"')) + { + strTotalScan = Strings.Mid(strTotalScan, 2, Strings.Len(strTotalScan) - 2); + } + } + aryWaferInfo[10] = strTotalScan; + } + else + { + throw new Exception("不支援此檔案格式,Raw Data格式內容資料解析需為" + strMSplitSign); + } + } + + if (x == intTotalTested) + { + // 2019/2/20, Ning, 以傳入的表頭分隔字元拆解 + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + strTotalTested = aryTemp[1].ToString().Trim(); + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(strTotalTested, 1) == Conversions.ToString('"') && Strings.Right(strTotalTested, 1) == Conversions.ToString('"')) + { + strTotalTested = Strings.Mid(strTotalTested, 2, Strings.Len(strTotalTested) - 2); + } + } + aryWaferInfo[11] = strTotalTested; + } + else + { + throw new Exception("不支援此檔案格式,Raw Data格式內容資料解析需為" + strMSplitSign); + } + } + + if (x == intTestCondition) + { + // 2019/2/20, Ning, 以傳入的表頭分隔字元拆解 + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + strTestCondition = aryTemp[1].ToString().Trim(); + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(strTestCondition, 1) == Conversions.ToString('"') && Strings.Right(strTestCondition, 1) == Conversions.ToString('"')) + { + strTestCondition = Strings.Mid(strTestCondition, 2, Strings.Len(strTestCondition) - 2); + } + } + aryWaferInfo[12] = strTestCondition; + } + else + { + throw new Exception("不支援此檔案格式,Raw Data格式內容資料解析需為" + strMSplitSign); + } + } + + if (x == intCalData) + { + // 2019/2/20, Ning, 以傳入的表頭分隔字元拆解 + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + strCalData = aryTemp[1].ToString().Trim(); + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(strCalData, 1) == Conversions.ToString('"') && Strings.Right(strCalData, 1) == Conversions.ToString('"')) + { + strCalData = Strings.Mid(strCalData, 2, Strings.Len(strCalData) - 2); + } + } + aryWaferInfo[13] = strCalData; + } + else + { + throw new Exception("不支援此檔案格式,Raw Data格式內容資料解析需為" + strMSplitSign); + } + } + + if (!(dtFormat_Postion == null)) + { + if (dtFormat_Postion.Rows.Count > 0) + { + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + var loopTo1 = (short)(dtFormat_Postion.Rows.Count - 1); + for (i = 0; i <= loopTo1; i++) + { + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(x, dtFormat_Postion.Rows[i]["ColumnPosition"], false))) + { + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + dtFormat_Postion.Rows[i]["Value"] = aryTemp[1].ToString().Trim(); + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(Conversions.ToString(dtFormat_Postion.Rows[i]["Value"]), 1) == Conversions.ToString('"') && Strings.Right(Conversions.ToString(dtFormat_Postion.Rows[i]["Value"]), 1) == Conversions.ToString('"')) + { + dtFormat_Postion.Rows[i]["Value"] = Strings.Mid(Conversions.ToString(dtFormat_Postion.Rows[i]["Value"]), 2, Strings.Len(dtFormat_Postion.Rows[i]["Value"]) - 2); + } + } + } + else + { + throw new Exception("不支援此檔案格式,Raw Data格式內容資料解析需為" + strMSplitSign); + } + } + } + } + } + + if (x == intColumnStart) // 取得欄位名稱 + { + try + { + dtData = new DataTable("CSVData"); + + // 2019/2/20,Ning明細以strDSplitSign分隔 + // 若結尾為strDSplitSign則去掉 + if (strLine.EndsWith(strDSplitSign)) + { + strLine = strLine.TrimEnd(Conversions.ToChar(strDSplitSign)); + } + + aryTemp = strLine.Split(Conversions.ToChar(strDSplitSign)); + + drAdd = dtData.NewRow(); + var loopTo2 = (short)(aryTemp.Length - 1); + for (i = 0; i <= loopTo2; i++) + { + // 新增 Column + if (dtData.Columns.Count <= i) + { + + strOrgColName = aryTemp[i].ToString().ToUpper().Trim(); + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(strOrgColName, 1) == Conversions.ToString('"') && Strings.Right(strOrgColName, 1) == Conversions.ToString('"')) + { + strOrgColName = Strings.Mid(strOrgColName, 2, Strings.Len(strOrgColName) - 2); + } + } + + strColumnName = strOrgColName; + + // 欄位名稱只能是數字或英文字母, 這兩者除外的皆以_取代 + for (int jj = 0, loopTo3 = strColumnName.Length - 1; jj <= loopTo3; jj++) + { + if (!char.IsNumber(Conversions.ToChar(strColumnName.Substring(jj, 1))) && !char.IsLetter(Conversions.ToChar(strColumnName.Substring(jj, 1)))) + { + strColumnName = Strings.Replace(strColumnName, strColumnName.Substring(jj, 1), "_"); + } + } + + if (string.IsNullOrEmpty(strColumnName)) + { + strColumnName = "COL" + i; + } + + // 判斷取代後的欄位是否已存在,若已存在則於欄位後方加COL+欄位顯示順序 + if (dtData.Columns.Contains(strColumnName)) + { + strColumnName = strColumnName + "COL" + i; + } + + // Memory Table欄位開String + dtData.Columns.Add(strColumnName.ToUpper(), Type.GetType("System.String")); + + } + } + } + + catch + { + throw; + } + } + + if (x == intDataStart || blnDataAdd == true) // 取得Raw Data資料 + { + blnDataAdd = true; + + try + { + //aryTemp = strLine.Split(Conversions.ToChar(strDSplitSign)); + + string[] aryORGColumnName = new string[] { }; + string aryColumnName = ""; + //切割欄位的正規式 + var regex = new Regex("(?<=^|,)(\"(?:[^\"]|\"\")*\"|[^,]*)", + RegexOptions.Multiline); + + //去除前後的雙引號 + //IEnumerable clear(MatchCollection matches) + //{ + // foreach (Match match in matches) + // { + // //去除頭尾空白 + // var value = match.Value.Trim(); + // //如果開頭是雙引號,就去除頭尾的雙引號 + // yield return value.StartsWith("\"") ? + // match.Value.Substring(1, match.Value.Length - 2) : value; + // } + //}; + //while (!objReader.EndOfStream) + //{ + //var line = objReader.ReadLine(); + + //切割欄位 + //var aryTemp = regex.Matches(line); + var matches = regex.Matches(strLine); + aryTemp = new string[matches.Count]; + + for (int int_tmp = 0; int_tmp <= aryTemp.Length - 1; int_tmp++) + { + aryTemp[int_tmp] = matches[int_tmp].ToString(); + string[] parts = aryTemp[int_tmp].Split(new char[] { '\"' }, StringSplitOptions.RemoveEmptyEntries); + if (parts.Length > 0) + { + aryTemp[int_tmp] = parts[0]; + } + } + + //drAdd = dtData.NewRow(); + //// 填入資料 + //var loopTo4 = (short)(dtData.Columns.Count - 1); + //for (i = 0; i <= loopTo4; i++) + //{ + // // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + // if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + // { + // if (Strings.Left(aryTemp[i], 1) == Conversions.ToString('"') && Strings.Right(aryTemp[i], 1) == Conversions.ToString('"')) + // { + // aryTemp[i] = Strings.Mid(aryTemp[i], 2, Strings.Len(aryTemp[i]) - 2); + // } + // } + // drAdd[i] = Strings.Trim(aryTemp[i]); + //} + //dtData.Rows.Add(drAdd); + + if (dtData.Columns.Count == 0) + { + for (int columnIndex = 0; columnIndex <= matches.Count - 1; columnIndex++) + { + if (aryORGColumnName.Contains(matches[columnIndex].ToString())) + { + dtData.Columns.Add(aryColumnName[Array.IndexOf(aryORGColumnName, matches[columnIndex].ToString())].ToString(), typeof(string)); + } + else + { + dtData.Columns.Add(matches[columnIndex].ToString(), System.Type.GetType("System.String")); + } + } + } + else + { + DataRow drNew = dtData.NewRow(); + + for (int valueIndex = 0; valueIndex < matches.Count; valueIndex++) + { + drNew[valueIndex] = matches[valueIndex]; + } + + dtData.Rows.Add(drNew); + } + + + //} + } + catch (Exception ex) + { + throw; + } + } + + } + } + + objReader.Close(); + objReader = null; + + // 將Excel資料匯入到dtResult中, 只有單身, 沒有單頭, 第一列即是欄位名稱 + // Call fuReadExcel(pFilePath, dtResult, "0", TestDatePos, EquipmentNoPos, ProgramNoPos) + + if (dtData.Columns.Count < intD_CompNo) + { + throw new Exception("無法取得ComponentNo!!"); + } + + dtFixData = new DataTable("WaferID"); + dtFixData.Columns.Add("WaferID", Type.GetType("System.String")); + + foreach (DataRow drResult in dtData.Rows) + { + drAdd = dtFixData.NewRow(); + drAdd["WaferID"] = drResult[intD_CompNo - 1].ToString(); + dtFixData.Rows.Add(drAdd); + } + + // 以第一筆ComponentNo取得LotNo及PSNo + if (dtData.Rows.Count > 0) + { + strWaferID = dtFixData.Rows[0]["WaferID"].ToString(); + // 取得LotNo, LogGroupSerial + // 因ComponentState中同一ComponentNo可能會對到多筆Lot, 但只會有一筆還在WIP中的, 故限制Status in (0,1,2,3,4,5) + strSQL = "Select A.LotNo, B.PSNo, B.LogGroupSerial From tblWIPComponentState A, tblWIPLotState B Where A.LotNo = B.LotNo And A.ComponentNo = '" + strWaferID + "'" + " And B.Status In (0,1,2,3,4,5)"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + if (string.IsNullOrEmpty(drTemp["LogGroupSerial"].ToString())) + { + throw new Exception("解析檔案失敗,LotNo: " + LotNo + " 之LogGroupSerial為空!"); + } + LotNo = Conversions.ToString(drTemp["LotNo"]); + LogGroupSerial = drTemp["LogGroupSerial"].ToString(); + PSNo = Conversions.ToString(drTemp["PSNo"]); + } + else + { + throw new Exception("解析檔案失敗,ComponentNo: " + strWaferID + " 無法找到對應的 LotNo,請檢查檔案:" + FileName); + } + drTemp.Close(); + //cmmTemp.Dispose(); + + // 2019/5/30, Ning, 若AutoLoaderJob.xml的Parameter2有定義TestRecipeType, 則以該值為優先, 若沒有定再以下述方式找TestRecipeType + if ((strTestRecipeType ?? "") != defString) + { + TestRecipeType = strTestRecipeType; + } + // 依格式檔內的參數編號及生產批所在區域取得TestRecipeType + else if (aryFormula.Count > 0) + { + strReadFormula = Strings.Split(Strings.Trim(aryFormula[0].ToString()), ":"); + strTestRecipeNo = strReadFormula[0].ToUpper(); + + strSQL = "Select TestRecipeType From tblSYSTestRecipeBasis Where TestRecipeNo = '" + strTestRecipeNo + "' And PSNo = '" + PSNo + "'"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + TestRecipeType = Conversions.ToString(drTemp["TestRecipeType"]); + } + else + { + throw new Exception("解析檔案失敗, 找不到區段: " + PSNo + ", 參數編號: " + strTestRecipeNo + " 之測試類別!"); + } + drTemp.Close(); + //cmmTemp.Dispose(); + } + } + + // 電性值資料表名稱: tblWIPTestSum_測試類別 + strTableName = "TBLWIPTESTSUM_" + TestRecipeType; + strLogTableName = "TBLWIPTESTSUMLOG_" + TestRecipeType; + + // 依測試類別找出其TestRecipeNo(參數編號), ConversionField(欄位名稱) + strSQL = "Select TestRecipeNo, ConversionField From tblSYSTestRecipeBasis Where TestRecipeType = '" + TestRecipeType + "'"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp); + dsTemp = new DataSet(); + //daTemp.Fill(dsTemp, "TestRecipe"); + ExecuteSQLQuery_Adapter(strSQL, dsTemp, "TestRecipe", cnnTemp); + dtTestRecipe = dsTemp.Tables["TestRecipe"]; + + string strExcelField; + DataTable dtFieldMap; + + dtFieldMap = new DataTable("FieldMap"); + dtFieldMap.Columns.Add("TestRecipeNo", Type.GetType("System.String")); + dtFieldMap.Columns.Add("ExcelField", Type.GetType("System.String")); + dtFieldMap.Columns.Add("ConversionField", Type.GetType("System.String")); + + if (aryFormula.Count > 0) + { + + for (int w = 0, loopTo5 = aryFormula.Count - 1; w <= loopTo5; w++) + { + strReadFormula = Strings.Split(Strings.Trim(aryFormula[w].ToString()), ":"); + strTestRecipeNo = strReadFormula[0]; + strExcelField = strReadFormula[1]; + + // TestRecipeBasis有定義此欄位才需要計算並存入 + // 2019/3/7, Ning, 存入的欄位名稱為dtTestRecipe.ConversionField + drSel = dtTestRecipe.Select("TestRecipeNo = '" + strTestRecipeNo + "'"); + if (drSel.Length > 0) + { + + drAdd = dtFieldMap.NewRow(); + drAdd["TestRecipeNo"] = strTestRecipeNo; + drAdd["ExcelField"] = strExcelField; + drAdd["ConversionField"] = drSel[0]["ConversionField"].ToString(); + dtFieldMap.Rows.Add(drAdd); + } + } + //drTemp.Close(); + //cmmTemp.Dispose(); + + } + + // TestSum, TestSumLog存入DB + datEventTime = DateTime.Now; + datTestDate = datEventTime; + + foreach (DataRow drData in dtData.Rows) + { + + strWaferID = Conversions.ToString(drData[intD_CompNo - 1]); + // tblWIPTestSum刪除已存在的資料, 只保留最新一次資料 + strSQL = "Delete From " + strTableName + " Where ComponentNo = '" + strWaferID + "'"; + CollectionSQL.Add(strSQL); + + // //新增TestSummary, TestSummaryLog + strSQLHead = "Insert into " + strTableName + " ("; + strSQLLogHead = "Insert into " + strLogTableName + " ("; + strSQLAddValue = " Values ("; + + // 固定欄位 + strSQLAddField = "LogGroupSerial, ComponentNo, LotNo, FileName, EquipmentNo, ImportUserNo, ImportDate,StoreRawData,FileSize,"; + strSQLAddValue = strSQLAddValue + "'" + LogGroupSerial + "','" + strWaferID + "','" + LotNo + "','" + FileName + "','" + EquipmentNo + "','AutoRun'," + " To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),0," + FileSize + ","; + + bool blnD_TestDate, blnD_ProgramNo; // 明細是否有動態表頭欄位, 有的話以明細為準 + blnD_TestDate = false; + blnD_ProgramNo = false; + + // 動態欄位(明細欄位) + foreach (DataRow drField in dtFieldMap.Rows) + { + + if (drField["ConversionField"].ToString().ToUpper() == "TESTDATE") + { + strSQLAddField = strSQLAddField + drField["ConversionField"].ToString() + ","; + strSQLAddValue = strSQLAddValue + "To_Date('" + Strings.Format(Convert.ToDateTime(drData[drField["ExcelField"].ToString()].ToString()), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),"; + + blnD_TestDate = true; + datTestDate = Convert.ToDateTime(drData[drField["ExcelField"].ToString()].ToString()); + } + else + { + strSQLAddField = strSQLAddField + drField["ConversionField"].ToString() + ","; + strSQLAddValue = strSQLAddValue + "'" + drData[drField["ExcelField"].ToString()].ToString() + "',"; + + if (drField["ConversionField"].ToString().ToUpper() == "PROGRAMNO") + { + blnD_ProgramNo = true; + } + } + + } + + // 91737: 表頭 + // 固定欄位(表頭), 若明細沒有, 則一定要加入, 因Table不允許Null + if (!blnD_TestDate) + { + if (!string.IsNullOrEmpty(aryWaferInfo[1].ToString()) && (aryWaferInfo[1].ToString() ?? "") != defString) + { + strSQLAddField = strSQLAddField + "TestDate,"; + strSQLAddValue = strSQLAddValue + "To_Date('" + Strings.Format(Conversions.ToDate(aryWaferInfo[1].ToString()), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')" + ","; + } + else + { + strSQLAddField = strSQLAddField + "TestDate,"; + strSQLAddValue = strSQLAddValue + "To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')" + ","; + } + } + if (!blnD_ProgramNo) + { + if (!string.IsNullOrEmpty(aryWaferInfo[5].ToString()) && (aryWaferInfo[5].ToString() ?? "") != defString) + { + strSQLAddField = strSQLAddField + "ProgramNo,"; + strSQLAddValue = strSQLAddValue + "'" + aryWaferInfo[5].ToString() + "',"; + } + else + { + strSQLAddField = strSQLAddField + "ProgramNo,"; + strSQLAddValue = strSQLAddValue + "'N/A',"; + } + } + if (!string.IsNullOrEmpty(aryWaferInfo[2].ToString()) && (aryWaferInfo[2].ToString() ?? "") != defString) + { + strSQLAddField = strSQLAddField + "FileEquipmentNo,"; + strSQLAddValue = strSQLAddValue + "'" + aryWaferInfo[2].ToString() + "',"; + } + + if (!string.IsNullOrEmpty(aryWaferInfo[6].ToString()) && (aryWaferInfo[6].ToString() ?? "") != defString) + { + strSQLAddField = strSQLAddField + "LotNumber,"; + strSQLAddValue = strSQLAddValue + "'" + aryWaferInfo[6].ToString() + "',"; + } + + if (!string.IsNullOrEmpty(aryWaferInfo[7].ToString()) && (aryWaferInfo[7].ToString() ?? "") != defString) + { + strSQLAddField = strSQLAddField + "Recipe,"; + strSQLAddValue = strSQLAddValue + "'" + aryWaferInfo[7].ToString() + "',"; + } + + if (!string.IsNullOrEmpty(aryWaferInfo[8].ToString()) && (aryWaferInfo[8].ToString() ?? "") != defString) + { + strSQLAddField = strSQLAddField + "BinFileName,"; + strSQLAddValue = strSQLAddValue + "'" + aryWaferInfo[8].ToString() + "',"; + } + + if (!string.IsNullOrEmpty(aryWaferInfo[9].ToString()) && (aryWaferInfo[9].ToString() ?? "") != defString) + { + strSQLAddField = strSQLAddField + "Operator,"; + strSQLAddValue = strSQLAddValue + "'" + aryWaferInfo[9].ToString() + "',"; + } + + if (!string.IsNullOrEmpty(aryWaferInfo[10].ToString()) && (aryWaferInfo[10].ToString() ?? "") != defString) + { + strSQLAddField = strSQLAddField + "TotalScan,"; + strSQLAddValue = strSQLAddValue + "'" + aryWaferInfo[10].ToString() + "',"; + } + + if (!string.IsNullOrEmpty(aryWaferInfo[11].ToString()) && (aryWaferInfo[11].ToString() ?? "") != defString) + { + strSQLAddField = strSQLAddField + "TotalTested,"; + strSQLAddValue = strSQLAddValue + "'" + aryWaferInfo[11].ToString() + "',"; + } + + if (!string.IsNullOrEmpty(aryWaferInfo[12].ToString()) && (aryWaferInfo[12].ToString() ?? "") != defString) + { + strSQLAddField = strSQLAddField + "Test_Condition,"; + strSQLAddValue = strSQLAddValue + "'" + aryWaferInfo[12].ToString() + "',"; + } + + if (!string.IsNullOrEmpty(aryWaferInfo[13].ToString()) && (aryWaferInfo[13].ToString() ?? "") != defString) + { + strSQLAddField = strSQLAddField + "CalData,"; + strSQLAddValue = strSQLAddValue + "'" + aryWaferInfo[13].ToString() + "',"; + } + + if (Strings.InStr(1, strSQLAddField, ",") != 0) // 刪除最後一個"," + { + if (Strings.Right(strSQLAddField, 1) == ",") + { + strSQLAddField = Strings.Mid(strSQLAddField, 1, Strings.Len(strSQLAddField) - 1); + } + } + + if (Strings.InStr(1, strSQLAddValue, ",") != 0) // 刪除最後一個"," + { + if (Strings.Right(strSQLAddValue, 1) == ",") + { + strSQLAddValue = Strings.Mid(strSQLAddValue, 1, Strings.Len(strSQLAddValue) - 1); + } + } + + // 直接給定strSQL + strSQL = strSQLHead + strSQLAddField + ")" + strSQLAddValue + ")"; + CollectionSQL.Add(strSQL); + + // Log SQL + strSQL = strSQLLogHead + strSQLAddField + ")" + strSQLAddValue + ")"; + CollectionSQL.Add(strSQL); + + // 檢查檔案是否已匯入過(資料已存在Log中) + // 2021/3/16 Steven Mantis: 0089578: [SEMI_Wafer] AutoLoader 廠內電性測試資料,允許相同測試時間的測試檔的匯入 + //strSQL = "Select ComponentNo From " + strLogTableName + " Where ComponentNo = '" + strWaferID + "' And FileName = '" + FileName + "'" + " And TestDate = To_Date('" + Strings.Format(datTestDate, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') And ImportDate = To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + if (strDataBaseType == "oracle") + { + strSQL = "Select ComponentNo From " + strLogTableName + " Where ComponentNo = '" + strWaferID + "' And FileName = '" + FileName + "'" + " And TestDate = To_Date('" + Strings.Format(datTestDate, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') And ImportDate = To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')"; + } + else if (strDataBaseType == "mssql") + { + strSQL = "Select ComponentNo From " + strLogTableName + " Where ComponentNo = '" + strWaferID + "' And FileName = '" + FileName + "'" + " And TestDate = '" + Strings.Format(datTestDate, "yyyy/MM/dd H:mm:ss") + "' And ImportDate = '" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "'"; + + } + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + throw new Exception("檔案: " + FileName + ", 測試日期: " + Strings.Format(datTestDate, "yyyy/MM/dd H:mm:ss") + ", 匯入時間" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + " 已匯入, 不允許重新匯入!!"); + } + drTemp.Close(); + //cmmTemp.Dispose(); + + } + + // //執行SQL指令 + string argstrDatabaseType = Conversions.ToString(DataBaseType); + ExecuteSQLNoneQuery_UPD(argstrDatabaseType, strConnectionString, CollectionSQL); + + blnResult = true; + } + + catch (Exception ex) + { + throw; + } + + finally + { + if (objReader != null) + { + objReader.Close(); + objReader = null; + } + CloseConnection(cnnTemp); + } + + return blnResult; + + } + + /// + /// + /// + /// 原vb預設值0 + /// + /// + private bool fuRawDataToTempTable_EQP(string pFilePath, string strMSplitSign, string strDSplitSign, + string strWaferIDPos, int intTestDate, + int intEquipmentNo, int intWaferSize, + int intThickness, int intProgramNo, + int intColumnStart, string strDataStartPos, + ref string[] aryWaferInfo, string EquipmentNo, + string FileName, ref string strTableName, + bool blnStoreRawData, ref DataTable dtData, + ref int TotalRows, DataTable dtFormat_Postion = null, string FormatFile = defString) + { + + bool blnResult; + var objReader = default(StreamReader); + // 2019/3/26, Ning, 加入Encode, 排除中文亂碼問題 + // 2019/3/28, Ning, TestDate預設為目前時間, ProgramNo預設為N/A + // Dim encode As System.Text.Encoding = System.Text.Encoding.GetEncoding("UTF-8") + var encode = Encoding.Default; + string strLine; + var strWaferID = default(string); + var strTestDate = default(string); + string strFileEquipmentNo; + string strWaferSize; + string strThickness; + string strProgramNo; + string[] aryTemp; + // Dim dtData As DataTable + var i = default(short); + bool blnDataAdd = false; + string strOrgColName, strColumnName; + DataRow drAdd; + string strSQL, strSQLColumn, strSQLAddField, strSQLAddValue; + var CollectionSQL = new Collection(); + + IDbConnection cnnTest = default(IDbConnection), cnnMES = default(IDbConnection); + DbDataReader drTemp; + + int intWaferID = defInteger; + int intDataStart = defInteger; + int x = 0; + short z; + short a; + string strTestCnnString = "", strTestDBType = "", strTestDBOwner = ""; + bool blnMustConvert; + var dtUnNumeric = new DataTable("UnNumeric"); + DataRow drData; + bool WriteString = false; + bool WriteDate = false; + try + { + // //Create connection + cnnMES = CreateConnection(strConnectionString); + + blnResult = false; + + objReader = new StreamReader(pFilePath, encode); + // 先讀取第一列, 再以第一列的編碼方式讀檔 + strLine = objReader.ReadLine().Trim(); + encode = objReader.CurrentEncoding; + objReader.Close(); + objReader = null; + objReader = new StreamReader(pFilePath, encode); + + // 當WaferID位置為數值時, 同原本處理方式取得檔案內的WaferID + if (Information.IsNumeric(strWaferIDPos)) + { + intWaferID = Conversions.ToInteger(strWaferIDPos); + } + // 當DataStart位置為數值時, 同原本處理方式 + if (Information.IsNumeric(strDataStartPos)) + { + intDataStart = Conversions.ToInteger(strDataStartPos); + } + else // 非數值, 先掃一次檔案, 找到固定字串的列數+1為intDataStart + { + x = 0; + while (!objReader.EndOfStream) + { + x = x + 1; + strLine = objReader.ReadLine(); + if ((strLine.ToUpper() ?? "") == (strDataStartPos.ToUpper() ?? "")) + { + intDataStart = x + 1; + break; + } + } + objReader.Close(); + objReader = null; + objReader = new StreamReader(pFilePath, encode); + } + + dtUnNumeric.Columns.Add("EquipmentNo", Type.GetType("System.String")); + dtUnNumeric.Columns.Add("FileNameFormat", Type.GetType("System.String")); + dtUnNumeric.Columns.Add("FieldName", Type.GetType("System.String")); + dtUnNumeric.Columns.Add("DataType", Type.GetType("System.Int16")); + dtUnNumeric.Columns.Add("Index", Type.GetType("System.Int16")); // 紀錄非數值欄位在excel的index + dtUnNumeric.Columns.Add("Exist", Type.GetType("System.Boolean")); // 紀錄EXCEL是否存在檔案內 + + x = 0; + while (!objReader.EndOfStream) + { + x = x + 1; + TotalRows = TotalRows + 1; + strLine = objReader.ReadLine(); + + if (strLine != null && !string.IsNullOrEmpty(strLine.Trim())) + { + + if (x == intWaferID) // 1.取得WaferID + { + // 2019/2/20, Ning, 以傳入的表頭分隔字元拆解 + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + strWaferID = aryTemp[1].ToString().Trim(); + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(strWaferID, 1) == Conversions.ToString('"') && Strings.Right(strWaferID, 1) == Conversions.ToString('"')) + { + strWaferID = Strings.Mid(strWaferID, 2, Strings.Len(strWaferID) - 2); + } + } + if (string.IsNullOrEmpty(strWaferID)) + { + throw new Exception("無法取得WaferID!!"); + } + else + { + aryWaferInfo[0] = strWaferID; + } + } + else + { + throw new Exception("不支援此檔案格式,Raw Data格式內容資料解析需為" + strMSplitSign); + } + } + + if (x == intTestDate) // 2.取得測試時間 + { + // 2019/2/20, Ning, 以傳入的表頭分隔字元拆解 + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + // 因日期格式中可能有/或:會作為分隔符號, 需特別處理 + if (strMSplitSign == ":" || strMSplitSign == "/") + { + for (int k = 1, loopTo = aryTemp.Length - 1; k <= loopTo; k++) + strTestDate = strTestDate + aryTemp[k].ToString().Trim() + strMSplitSign; + // 刪除最後的分隔符號":"或"/" + // 2019/6/26, Ning, 若分隔符號太多, 有多餘的分隔符號, 會不只一個 :或/ + while ((Strings.Right(strTestDate, 1) ?? "") == (strMSplitSign ?? "")) + strTestDate = Strings.Mid(strTestDate, 1, Strings.Len(strTestDate) - 1); + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(strTestDate, 1) == Conversions.ToString('"') && Strings.Right(strTestDate, 1) == Conversions.ToString('"')) + { + strTestDate = Strings.Mid(strTestDate, 2, Strings.Len(strTestDate) - 2); + } + } + aryWaferInfo[1] = strTestDate; + } + else + { + strTestDate = aryTemp[1].ToString().Trim(); + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(strTestDate, 1) == Conversions.ToString('"') && Strings.Right(strTestDate, 1) == Conversions.ToString('"')) + { + strTestDate = Strings.Mid(strTestDate, 2, Strings.Len(strTestDate) - 2); + } + } + aryWaferInfo[1] = strTestDate; + } + } + else + { + throw new Exception("不支援此檔案格式,Raw Data格式內容資料解析需為" + strMSplitSign); + } + } + + if (x == intEquipmentNo) // 3.取得設備編號 + { + // 2019/2/20, Ning, 以傳入的表頭分隔字元拆解 + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + strFileEquipmentNo = aryTemp[1].ToString().Trim(); + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(strFileEquipmentNo, 1) == Conversions.ToString('"') && Strings.Right(strFileEquipmentNo, 1) == Conversions.ToString('"')) + { + strFileEquipmentNo = Strings.Mid(strFileEquipmentNo, 2, Strings.Len(strFileEquipmentNo) - 2); + } + } + aryWaferInfo[2] = strFileEquipmentNo; + } + else + { + throw new Exception("不支援此檔案格式,Raw Data格式內容資料解析需為" + strMSplitSign); + } + } + + if (x == intWaferSize) // 4.取得Wafer尺寸 + { + // 2019/2/20, Ning, 以傳入的表頭分隔字元拆解 + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + strWaferSize = aryTemp[1].ToString().Trim(); + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(strWaferSize, 1) == Conversions.ToString('"') && Strings.Right(strWaferSize, 1) == Conversions.ToString('"')) + { + strWaferSize = Strings.Mid(strWaferSize, 2, Strings.Len(strWaferSize) - 2); + } + } + aryWaferInfo[3] = strWaferSize; + } + else + { + throw new Exception("不支援此檔案格式,Raw Data格式內容資料解析需為" + strMSplitSign); + } + } + + if (x == intThickness) // 5.取得厚度 + { + // 2019/2/20, Ning, 以傳入的表頭分隔字元拆解 + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + strThickness = aryTemp[1].ToString().Trim(); + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(strThickness, 1) == Conversions.ToString('"') && Strings.Right(strThickness, 1) == Conversions.ToString('"')) + { + strThickness = Strings.Mid(strThickness, 2, Strings.Len(strThickness) - 2); + } + } + aryWaferInfo[4] = strThickness; + } + else + { + throw new Exception("不支援此檔案格式,Raw Data格式內容資料解析需為" + strMSplitSign); + } + } + + if (x == intProgramNo) // 6.取得測試程式編號 + { + // 2019/2/20, Ning, 以傳入的表頭分隔字元拆解 + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + strProgramNo = aryTemp[1].ToString().Trim(); + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(strProgramNo, 1) == Conversions.ToString('"') && Strings.Right(strProgramNo, 1) == Conversions.ToString('"')) + { + strProgramNo = Strings.Mid(strProgramNo, 2, Strings.Len(strProgramNo) - 2); + } + } + aryWaferInfo[5] = strProgramNo; + } + else + { + throw new Exception("不支援此檔案格式,Raw Data格式內容資料解析需為" + strMSplitSign); + } + } + + if (!(dtFormat_Postion == null)) + { + if (dtFormat_Postion.Rows.Count > 0) + { + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + var loopTo1 = (short)(dtFormat_Postion.Rows.Count - 1); + for (i = 0; i <= loopTo1; i++) + { + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(x, dtFormat_Postion.Rows[i]["ColumnPosition"], false))) + { + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + dtFormat_Postion.Rows[i]["Value"] = aryTemp[1].ToString().Trim(); + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(Conversions.ToString(dtFormat_Postion.Rows[i]["Value"]), 1) == Conversions.ToString('"') && Strings.Right(Conversions.ToString(dtFormat_Postion.Rows[i]["Value"]), 1) == Conversions.ToString('"')) + { + dtFormat_Postion.Rows[i]["Value"] = Strings.Mid(Conversions.ToString(dtFormat_Postion.Rows[i]["Value"]), 2, Strings.Len(dtFormat_Postion.Rows[i]["Value"]) - 2); + } + } + } + else + { + throw new Exception("不支援此檔案格式,Raw Data格式內容資料解析需為" + strMSplitSign); + } + } + } + } + } + + if (x == intColumnStart) // 取得欄位名稱 + { + try + { + dtData = new DataTable("CSVData"); + + // 2021/5/20 Steven Mantis:0092711: [SEMI_Wafer] AutoLoader 設備電性匯入支援可收集非數值的電性值_AutoLoader 廠內設備電性值匯入調整 + // 找到所有非數值的欄位 + strSQL = "Select FieldName,DATATYPE From TBLEQPALSCRIPT_UnNumericField where EQUIPMENTNO = '" + EquipmentNo + "'and FILENAMEFORMAT = '" + FormatFile + "'"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnMES); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); + while (drTemp.Read()) + { + drData = dtUnNumeric.NewRow(); + drData["EquipmentNo"] = EquipmentNo; + drData["FileNameForMat"] = FormatFile; + drData["FieldName"] = drTemp["FieldName"].ToString(); + drData["DataType"] = drTemp["DATATYPE"].ToString(); + dtUnNumeric.Rows.Add(drData); + } + drTemp.Close(); + //cmmTemp.Dispose(); + + + // 2019/2/20,Ning明細以strDSplitSign分隔 + // 若結尾為strDSplitSign則去掉 + if (strLine.EndsWith(strDSplitSign)) + { + strLine = strLine.TrimEnd(Conversions.ToChar(strDSplitSign)); + } + + aryTemp = strLine.Split(Conversions.ToChar(strDSplitSign)); + + drAdd = dtData.NewRow(); + var loopTo2 = (short)(aryTemp.Length - 1); + for (i = 0; i <= loopTo2; i++) + { + // 新增 Column + if (dtData.Columns.Count <= i) + { + + strOrgColName = aryTemp[i].ToString().ToUpper().Trim(); + if (strOrgColName.Length == 0) + { + throw new Exception("解析檔案失敗,檔案中有空白的欄位名稱,請檢查欄位名稱:"+ strLine); + } + + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(strOrgColName, 1) == Conversions.ToString('"') && Strings.Right(strOrgColName, 1) == Conversions.ToString('"')) + { + strOrgColName = Strings.Mid(strOrgColName, 2, Strings.Len(strOrgColName) - 2); + } + } + + strColumnName = strOrgColName; + + // 判斷檔案內是否有存在設定的非數值欄位 + if (dtUnNumeric.Rows.Count > 0) + { + var loopTo3 = (short)(dtUnNumeric.Rows.Count - 1); + for (a = 0; a <= loopTo3; a++) + { + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtUnNumeric.Rows[a]["FieldName"], strColumnName, false))) + { + dtUnNumeric.Rows[a]["Exist"] = true; + } + } + } + + blnMustConvert = false; + // 2021/4/29,Ning,91736 AutoLoader 欄位名稱若有包含非數值及字元或_, 則至欄名轉換中找, 找不到則報錯 + // 第一個字必須為字元, 不為字元必須轉換 + if (char.IsLetter(Conversions.ToChar(strColumnName.Substring(0, 1)))) + { + for (int jj = 0, loopTo4 = strColumnName.Length - 1; jj <= loopTo4; jj++) + { + if (!char.IsNumber(Conversions.ToChar(strColumnName.Substring(jj, 1))) && !char.IsLetter(Conversions.ToChar(strColumnName.Substring(jj, 1))) && strColumnName.Substring(jj, 1) != "_") + { + blnMustConvert = true; + break; + } + } + } + else + { + blnMustConvert = true; + } + if (blnMustConvert) + { + strSQL = "Select ConversionField From tblSYSFieldConvertBasis where DocumentField = '" + strColumnName.ToUpper() + "'"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnMES); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); + if (drTemp.Read()) + { + strColumnName = Conversions.ToString(drTemp["ConversionField"]); + } + else + { + throw new Exception("解析檔案失敗,檔案欄位: " + strColumnName + " 含有特殊字元但未設定欄名轉換, 請檢查檔案:" + FileName); + } + drTemp.Close(); + //cmmTemp.Dispose(); + } + + // '欄位名稱只能是數字或英文字母, 這兩者除外的皆以_取代 + // For jj As Integer = 0 To strColumnName.Length - 1 + // If Not Char.IsNumber(strColumnName.Substring(jj, 1)) AndAlso Not Char.IsLetter(strColumnName.Substring(jj, 1)) Then + // strColumnName = Replace(strColumnName, strColumnName.Substring(jj, 1), "_") + // End If + // Next + + if (string.IsNullOrEmpty(strColumnName)) + { + strColumnName = "COL" + i; + } + + // 判斷取代後的欄位是否已存在,若已存在則於欄位後方加COL+欄位顯示順序 + if (dtData.Columns.Contains(strColumnName)) + { + strColumnName = strColumnName + "COL" + i; + } + + // Memory Table欄位開String + dtData.Columns.Add(strColumnName.ToUpper(), Type.GetType("System.String")); + + } + } + } + + catch + { + throw; + } + } + + if (x == intDataStart || blnDataAdd == true) // 取得Raw Data資料 + { + blnDataAdd = true; + + try + { + //aryTemp = strLine.Split(Conversions.ToChar(strDSplitSign)); + + //drAdd = dtData.NewRow(); + //// 填入資料 + //var loopTo5 = (short)(dtData.Columns.Count - 1); + //for (i = 0; i <= loopTo5; i++) + //{ + // // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + // if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + // { + // if (Strings.Left(aryTemp[i], 1) == Conversions.ToString('"') && Strings.Right(aryTemp[i], 1) == Conversions.ToString('"')) + // { + // aryTemp[i] = Strings.Mid(aryTemp[i], 2, Strings.Len(aryTemp[i]) - 2); + // } + // } + // drAdd[i] = Strings.Trim(aryTemp[i].Trim()); + //} + //dtData.Rows.Add(drAdd); + string[] aryORGColumnName = new string[] { }; + string aryColumnName = ""; + //切割欄位的正規式 + var regex = new Regex("(?<=^|,)(\"(?:[^\"]|\"\")*\"|[^,]*)", + RegexOptions.Multiline); + + //去除前後的雙引號 + //IEnumerable clear(MatchCollection matches) + //{ + // foreach (Match match in matches) + // { + // //去除頭尾空白 + // var value = match.Value.Trim(); + // //如果開頭是雙引號,就去除頭尾的雙引號 + // yield return value.StartsWith("\"") ? + // match.Value.Substring(1, match.Value.Length - 2) : value; + // } + //}; + //while (!objReader.EndOfStream) + //{ + // var line = objReader.ReadLine(); + + //切割欄位 + //var aryTemp = regex.Matches(line); + var matches = regex.Matches(strLine); + aryTemp = new string[matches.Count]; + for (int int_tmp = 0; int_tmp <= aryTemp.Length - 1; int_tmp++) + { + if (matches[int_tmp].ToString() != "") + { + aryTemp[int_tmp] = matches[int_tmp].ToString(); + string[] parts = aryTemp[int_tmp].Split(new char[] { '\"' }, StringSplitOptions.RemoveEmptyEntries); + aryTemp[int_tmp] = parts[0]; + } + else + { + aryTemp[int_tmp] = matches[int_tmp].ToString(); + } + + } + //drAdd = dtData.NewRow(); + // // 填入資料 + // var loopTo5 = (short)(dtData.Columns.Count - 1); + // for (i = 0; i <= loopTo5; i++) + // { + // // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + // if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + // { + // if (Strings.Left(aryTemp[i], 1) == Conversions.ToString('"') && Strings.Right(aryTemp[i], 1) == Conversions.ToString('"')) + // { + // aryTemp[i] = Strings.Mid(aryTemp[i], 2, Strings.Len(aryTemp[i]) - 2); + // } + // } + // drAdd[i] = Strings.Trim(aryTemp[i].Trim()); + // } + // dtData.Rows.Add(drAdd); + + //for (int int_tmp = 0; int_tmp <= aryTemp.Length - 1; int_tmp++) + //{ + // aryTemp[int_tmp] = matches[int_tmp].ToString(); + // string[] parts = aryTemp[int_tmp].Split(new char[] { '\"' }, StringSplitOptions.RemoveEmptyEntries); + // aryTemp[int_tmp] = parts[0]; + //} + if (dtData.Columns.Count == 0) + { + for (int columnIndex = 0; columnIndex <= matches.Count - 1; columnIndex++) + { + if (aryORGColumnName.Contains(matches[columnIndex].ToString())) + { + dtData.Columns.Add(aryColumnName[Array.IndexOf(aryORGColumnName, matches[columnIndex].ToString())].ToString(), typeof(string)); + } + else + { + dtData.Columns.Add(matches[columnIndex].ToString(), System.Type.GetType("System.String")); + } + } + } + else + { + DataRow drNew = dtData.NewRow(); + + for (int valueIndex = 0; valueIndex < matches.Count; valueIndex++) + { + drNew[valueIndex] = matches[valueIndex]; + } + + dtData.Rows.Add(drNew); + } + //} + + } + catch (Exception ex) + { + throw; + } + } + + } + } + + TotalRows = TotalRows - intDataStart + 1; // 計算總筆數 + + // 若intWaferID=0, 則WaferID為檔名(去除副檔名) + if (intWaferID == 0) + { + strWaferID = FileName.Substring(0, FileName.LastIndexOf(".")); + aryWaferInfo[0] = strWaferID; + } + // 2019/5/28,Ning, WaferID不為數值, Ex. -,2,3-9 + if (!Information.IsNumeric(strWaferIDPos)) + { + string[] aryWaferID, aryChar; + string strSplitChar; + int intPart, intLength; + strWaferID = FileName.Substring(0, FileName.LastIndexOf(".")); + aryWaferID = strWaferIDPos.Split(','); + strSplitChar = aryWaferID[0]; + intPart = Conversions.ToInteger(aryWaferID[1]); + aryChar = aryWaferID[2].Split('-'); + intLength = (int)Math.Round(Conversions.ToDouble(aryChar[1]) - Conversions.ToDouble(aryChar[0]) + 1d); + aryWaferID = strWaferID.Split(Conversions.ToChar(strSplitChar)); + strWaferID = Strings.Mid(aryWaferID[intPart - 1], Conversions.ToInteger(aryChar[0]), intLength); + aryWaferInfo[0] = strWaferID; + } + // 若TestDate為空則以目前時間為TestDate + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(aryWaferInfo[1], defString, false))) + { + aryWaferInfo[1] = Strings.Format(DateTime.Now, "yyyy/MM/dd hh:mm:ss"); + } + // 若ProgramNo為空, 則以N/A代入 + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(aryWaferInfo[5], defString, false))) + { + aryWaferInfo[5] = "N/A"; + } + // 若未傳入EquipmentNo, 則用Parameter1的值填入 + // 2019/7/9,Ning, aryWaferInfo[2]存的是檔案內的EquipmentNo, 檔案內沒有就維持預設值, 不存入XML中的EquipmentNo + // If IsNothing(aryWaferInfo[2]) OrElse aryWaferInfo[2].ToString.Trim = "" Then + // aryWaferInfo[2] = EquipmentNo + // End If + // 指定暫存資料 Temp_機台編號 + if (EquipmentNo.Contains("-")) + { + strTableName = "Temp" + "_" + Strings.Mid(EquipmentNo.Replace("-", "_"), 1, 10) + "_" + Strings.Format(DateTime.Now, "mmssff"); + } + else + { + strTableName = "Temp" + "_" + Strings.Mid(EquipmentNo, 1, 10) + "_" + Strings.Format(DateTime.Now, "mmssff"); + } + + if (blnStoreRawData) + { + // 要儲存RawData,則將TempTable開在TestData那一組Connection中 + try + { + strTestCnnString = objSetting.GetConnectionString_DY("TestDataConnectionString", "TestDataDatabasePassword"); + strTestDBType = objSetting.GetDataBaseType_DY("TestDataDatabaseType"); + strTestDBOwner = strDataBaseTestOwner; + } + catch + { + strTestCnnString = null; + strTestDBType = null; + strTestDBOwner = null; + } + + // 取不到TestData相關連線時以MES連線取代之 + if (string.IsNullOrEmpty(strTestCnnString) || string.IsNullOrEmpty(strTestDBType) || string.IsNullOrEmpty(strTestDBOwner)) + { + strTestCnnString = strConnectionString; + strTestDBType = strDataBaseType; + strTestDBOwner = strDataBaseMesOwner; + } + } + else + { + // 不存RawData, 則開立在MES的DB中 + strTestCnnString = strConnectionString; + strTestDBType = strDataBaseType; + strTestDBOwner = strDataBaseMesOwner; + } + + // //Create connection + cnnTest = CreateConnection(strTestCnnString); + strSQLColumn = ""; + + foreach (DataColumn column in dtData.Columns) + { + // strSQLColumn = strSQLColumn + column.ColumnName & " VARCHAR2(50)," + // 欄位皆以NUMBER(38,15)儲存運算 + bool isString = false; + bool isDateTime = false; + var loopTo6 = (short)(dtUnNumeric.Rows.Count - 1); + for (z = 0; z <= loopTo6; z++) + { + if ((column.ColumnName ?? "") == (dtUnNumeric.Rows[z]["FieldName"].ToString() ?? "")) + { + if (dtUnNumeric.Rows[z]["DataType"].ToString() == "0") + { + isString = true; + } + else if (dtUnNumeric.Rows[z]["DataType"].ToString() == "2") + { + isDateTime = true; + } + dtUnNumeric.Rows[z]["Index"] = i; + } + } + if (isString) + { + if (strTestDBType == "mssql") + { + strSQLColumn = strSQLColumn + "\"" + column.ColumnName + "\"" + " VARCHAR(100),"; + } + else + { + strSQLColumn = strSQLColumn + "\"" + column.ColumnName + "\"" + " VARCHAR2(100),"; + } + } + else if (isDateTime) + { + if (strTestDBType == "mssql") + { + strSQLColumn = strSQLColumn + "\"" + column.ColumnName + "\"" + " datetime,"; + } + else + { + strSQLColumn = strSQLColumn + "\"" + column.ColumnName + "\"" + " DATE,"; + } + } + else + { + if (strTestDBType == "mssql") + { + strSQLColumn = strSQLColumn + "\"" + column.ColumnName + "\"" + " decimal(18, 0),"; + } + else + { + strSQLColumn = strSQLColumn + "\"" + column.ColumnName + "\"" + " NUMBER(38,15),"; + } + } + } + + if (Strings.InStr(1, strSQLColumn, ",") != 0) // 刪除最後一個"," + { + if (Strings.Right(strSQLColumn, 1) == ",") + { + strSQLColumn = Strings.Mid(strSQLColumn, 1, Strings.Len(strSQLColumn) - 1); + } + } + + + + // 先刪除Table,若出錯用try...catch避開 + try + { + //if (strTestDBType == "mssql") + //{ + // strSQL = "SELECT name FROM sys.tables where name='" + strTableName.ToUpper() + "'"; + //} + //else + //{ + // strSQL = "Select Table_Name From User_Tables Where Table_Name = '" + strTableName.ToUpper() + "'"; + //} + ////cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + //drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + // 0143038, 將取得Table Name改為GetSchema_Tables, 19245, 2023/08/10 + DataTable dtTableTemp = GetSchema_Tables(cnnTest, strTestDBOwner, strTableName.ToUpper()); + if (!(dtTableTemp == null) && dtTableTemp.Rows.Count > 0) + { + strSQL = " Drop Table " + strTableName; + ExecuteSQLNoneQuery_NoLimitRows(strTestDBType, strTestCnnString, ref strSQL); + // CollectionSQL.Add(strSQL) + } + //drTemp.Close(); + //cmmTemp.Dispose(); + // Create 暫存Table + // 2018/05/14 Josh 增加WaferID欄位 + // strSQL = " Create Table " & strTableName & "(SequenceNo NUMBER(20),WaferID VARCHAR2(20), " & strSQLColumn & ")" + // 2018/11/6, Ning 使用 Oracle Temporary Table + // strSQL = " Create Global Temporary Table " & strTableName & "(SequenceNo NUMBER(20),WaferID VARCHAR2(30), " & strSQLColumn & ")" + // 2021/3/25,Ning,89890: [SEMI_Wafer]AutoLoader 測試原始數據收集_設備AutoLoader 電性值匯入調整:改為實體TempTable + if (strTestDBType == "mssql") + { + strSQL = " Create Table " + strTableName + "(SequenceNo int,WaferID VARCHAR(30), " + strSQLColumn + ")"; + } + else + { + strSQL = " Create Table " + strTableName + "(SequenceNo NUMBER(20),WaferID VARCHAR2(30), " + strSQLColumn + ")"; + } + ExecuteSQLNoneQuery_NoLimitRows(strTestDBType, strTestCnnString, ref strSQL); + colTableName.Add(strTableName); + } + // CollectionSQL.Add(strSQL) + catch (Exception ex) + { + throw ex; + } + + // 寫入Raw Data + strSQLAddField = "Insert into " + strTableName + " ("; + strSQLAddValue = " Values ("; + + for (int j = 0, loopTo7 = dtData.Rows.Count - 1; j <= loopTo7; j++) + { + + // 增加流水號 + strSQLAddField = strSQLAddField + "SequenceNo,"; + strSQLAddValue = strSQLAddValue + (j + 1) + ","; + + // 增加WaferID + strSQLAddField = strSQLAddField + "WaferID,"; + strSQLAddValue = strSQLAddValue + "'" + strWaferID + "',"; + + // 2019/6/5,Ning,以下程式取自錸創, 但實測後都會跑到"System.String"中, 以String的方式加入, 程式先保留不做調整 + var loopTo8 = (short)(dtData.Columns.Count - 1); + for (i = 0; i <= loopTo8; i++) + { + // 2019/6/12,Ning,非數值的欄位皆填definteger,因非數值的欄位不做運算, 只是方便填入TempTable中 + // 非數值欄位寫入 + WriteString = false; + WriteDate = false; + if (dtUnNumeric.Rows.Count > 0) + { + var loopTo9 = (short)(dtUnNumeric.Rows.Count - 1); + for (z = 0; z <= loopTo9; z++) + { + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtData.Columns[i].ColumnName, dtUnNumeric.Rows[z]["FieldName"], false)) && Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtUnNumeric.Rows[z]["Exist"], true, false)) && Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtUnNumeric.Rows[z]["DataType"], 0, false))) + { + WriteString = true; + } + else if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtData.Columns[i].ColumnName, dtUnNumeric.Rows[z]["FieldName"], false)) && Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtUnNumeric.Rows[z]["Exist"], true, false)) && Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtUnNumeric.Rows[z]["DataType"], 2, false))) // Date + { + WriteDate = true; + } + } + } + if (dtData.Rows[j][i].ToString() != "") + { + // 非數值欄位寫入 + if (WriteString) // String + { + strSQLAddField = strSQLAddField + "\"" + dtData.Columns[i].ColumnName.ToString() + "\","; + if (string.IsNullOrEmpty(dtData.Rows[j][i].ToString())) + { + strSQLAddValue = strSQLAddValue + "'',"; + } + else + { + strSQLAddValue = strSQLAddValue + "'" + dtData.Rows[j][i].ToString() + "',"; + } + } + else if (WriteDate) + { + strSQLAddField = strSQLAddField + "\"" + dtData.Columns[i].ColumnName.ToString() + "\","; + if (string.IsNullOrEmpty(dtData.Rows[j][i].ToString())) + { + strSQLAddValue = strSQLAddValue + "'',"; + } + else + { + strSQLAddValue = strSQLAddValue + "To_Date('" + Strings.Format(Conversions.ToDate(dtData.Rows[j][i].ToString()), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),"; + } + } + else + { + // 數值: + strSQLAddField = strSQLAddField + "\"" + dtData.Columns[i].ColumnName.ToString() + "\","; + if (string.IsNullOrEmpty(dtData.Rows[j][i].ToString()) || !Information.IsNumeric(dtData.Rows[j][i])) + { + strSQLAddValue = strSQLAddValue + "'',"; + } + else + { + strSQLAddValue = strSQLAddValue + "" + dtData.Rows[j][i].ToString() + ","; + } + } + } + // If Not IsNumeric(dtData.Rows(j).Item(i).ToString) Then + // '2021/4/8,Ning,當不為數值時, 不填入這個欄位的值 + // 'strSQLAddField = strSQLAddField & """" & dtData.Columns(i).ColumnName.ToString & """," + // 'strSQLAddValue = strSQLAddValue & "'" & defInteger & "'," + // Else + // strSQLAddField = strSQLAddField & """" & dtData.Columns(i).ColumnName.ToString & """," + // strSQLAddValue = strSQLAddValue & "'" & dtData.Rows(j).Item(i).ToString & "'," + // End If + // Select Case dtData.Rows(j).Item(i).GetType.ToString + // Case "System.String" + // strSQLAddField = strSQLAddField & """" & dtData.Columns(i).ColumnName.ToString & """," + // strSQLAddValue = strSQLAddValue & "'" & dtData.Rows(j).Item(i).ToString & "'," + // Case "System.Decimal" + // strSQLAddField = strSQLAddField & dtData.Columns(i).ColumnName.ToString & "," + // strSQLAddValue = strSQLAddValue & dtData.Rows(j).Item(i).ToString & "," + // Case "System.DateTime" + // strSQLAddField = strSQLAddField & dtData.Columns(i).ColumnName.ToString & "," + // strSQLAddValue = strSQLAddValue & "To_Date('" & Format(dtData.Rows(j).Item(i), "yyyy/MM/dd H:mm:ss") & "','YYYY/MM/DD HH24:MI:SS')," + // Case "System.DBNull" + // '未處理 + // End Select + + } + + if (Strings.InStr(1, strSQLAddField, ",") != 0) // 刪除最後一個"," + { + if (Strings.Right(strSQLAddField, 1) == ",") + { + strSQLAddField = Strings.Mid(strSQLAddField, 1, Strings.Len(strSQLAddField) - 1); + } + } + + if (Strings.InStr(1, strSQLAddValue, ",") != 0) // 刪除最後一個"," + { + if (Strings.Right(strSQLAddValue, 1) == ",") + { + strSQLAddValue = Strings.Mid(strSQLAddValue, 1, Strings.Len(strSQLAddValue) - 1); + } + } + + // 直接給定strSQL + strSQL = strSQLAddField + ")" + strSQLAddValue + ")"; + + // //新增一筆Data指令加入集合內 + CollectionSQL.Add(strSQL); + + strSQLAddField = "Insert into " + strTableName + " ("; + strSQLAddValue = " Values ("; + } + + // //執行SQL指令 + ExecuteSQLNoneQuery_UPD_NoLimitRows(strTestDBType, strTestCnnString, CollectionSQL); + + objReader.Close(); + + blnResult = true; + } + + catch (Exception ex) + { + throw; + } + + finally + { + CloseConnection(cnnMES); + CloseConnection(cnnTest); + objReader.Close(); + objReader = null; + aryTemp = null; + } + + return blnResult; + + } + + /// + /// + /// + /// 原vb預設值false + /// 原vb預設值0 + /// + /// + private bool fuRawDataToTempTable_EQP_BigFile(string pFilePath, string strMSplitSign, string strDSplitSign, + string strWaferIDPos, int intTestDate, + int intEquipmentNo, int intWaferSize, + int intThickness, int intProgramNo, + int intColumnStart, string strDataStartPos, + ref string[] aryWaferInfo, string EquipmentNo, + string FileName, long SplitRecordsLimit, ref string strTableName, + bool blnStoreRawData, ref DataTable dtData, + string JobNo, string JobFunction, + string FilePath, int FileSize, + ref bool blnSplitPartialSuccess, ref int TotalRows, + DataTable dtFormat_Postion = null, int StartRow = defInteger, + string FormatFile = defString) + { + + bool blnResult; + var objReader = default(StreamReader); + // 2019/3/26, Ning, 加入Encode, 排除中文亂碼問題 + // 2019/3/28, Ning, TestDate預設為目前時間, ProgramNo預設為N/A + // Dim encode As System.Text.Encoding = System.Text.Encoding.GetEncoding("UTF-8") + var encode = Encoding.Default; + string strLine; + var strWaferID = default(string); + var strTestDate = default(string); + string strFileEquipmentNo; + string strWaferSize; + string strThickness; + string strProgramNo; + string[] aryTemp; + // Dim dtData As DataTable + short i; + short z; + short a; + bool blnDataAdd = false; + string strOrgColName, strColumnName; + string strSQL, strSQLColumn, strSQLAddField, strSQLAddValue; + // Dim CollectionSQL As New Collection + + IDbConnection cnnTest = default(IDbConnection), cnnMES = default(IDbConnection); + DbDataReader drTemp; + + int intWaferID = defInteger; + int intDataStart = defInteger; + int x = 0; + int intRow = 0; + int idx = 0; + int intSeq = 1; + var oSQLContent = new Dictionary(); + uint intSQLIndex = 1U; + var arySequence = new int[(int)(SplitRecordsLimit - 1L + 1)]; + var aryCol = new decimal[501][]; + var aryCol_String = new string[501][]; + var aryCol_DateTime = new DateTime[501][]; + int StringCount = 0; + int DateCount = 0; + string strTestCnnString = default(string), strTestDBType = default(string), strTestDBOwner = default(string); + bool blnMustConvert; + int intImportedRows = 1; // 紀錄完成幾次封包 + bool WriteString = false; + bool WriteDate = false; + var datStartTime = DateTime.Now; + string strFailMessage = defString; + string strlotNo = "N/A"; + var dtUnNumeric = new DataTable("UnNumeric"); + DataRow drData; + blnSplitPartialSuccess = false; + TotalRows = 0; + try + { + // //Create connection + cnnMES = CreateConnection(strConnectionString); + + blnResult = false; + + objReader = new StreamReader(pFilePath, encode); + // 先讀取第一列, 再以第一列的編碼方式讀檔 + strLine = objReader.ReadLine().Trim(); + encode = objReader.CurrentEncoding; + objReader.Close(); + objReader = null; + objReader = new StreamReader(pFilePath, encode); + // 當WaferID位置為數值時, 同原本處理方式取得檔案內的WaferID + if (Information.IsNumeric(strWaferIDPos)) + { + intWaferID = Conversions.ToInteger(strWaferIDPos); + } + // 當DataStart位置為數值時, 同原本處理方式 + if (Information.IsNumeric(strDataStartPos)) + { + intDataStart = Conversions.ToInteger(strDataStartPos); + } + else // 非數值, 先掃一次檔案, 找到固定字串的列數+1為intDataStart + { + x = 0; + while (!objReader.EndOfStream) + { + x = x + 1; + strLine = objReader.ReadLine(); + if ((strLine.ToUpper() ?? "") == (strDataStartPos.ToUpper() ?? "")) + { + intDataStart = x + 1; + break; + } + } + objReader.Close(); + objReader = null; + objReader = new StreamReader(pFilePath, encode); + } + if (StartRow != defInteger) // 未完成的資料,分包筆數必須加上已完成筆數 + { + intDataStart = StartRow + intDataStart - 1; // 應該要加上DataStart + // 如果intDataStart 1) + { + strWaferID = aryTemp[1].ToString().Trim(); + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(strWaferID, 1) == Conversions.ToString('"') && Strings.Right(strWaferID, 1) == Conversions.ToString('"')) + { + strWaferID = Strings.Mid(strWaferID, 2, Strings.Len(strWaferID) - 2); + } + } + if (string.IsNullOrEmpty(strWaferID)) + { + throw new Exception("無法取得WaferID!!"); + } + else + { + aryWaferInfo[0] = strWaferID; + } + } + else + { + throw new Exception("不支援此檔案格式,Raw Data格式內容資料解析需為" + strMSplitSign); + } + + // 找出lotNo: + strSQL = "Select A.LotNo From tblWIPComponentState A, tblWIPLotState B Where A.LotNo = B.LotNo And A.ComponentNo = '" + strWaferID + "'" + " And B.Status In (0,1,2,3,4,5)"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnMES); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); + // 如有找到資料,代表未處理完 + if (drTemp.Read()) + strlotNo = Conversions.ToString(drTemp["LotNo"]); + drTemp.Close(); + //cmmTemp.Dispose(); + + } + + if (x == intTestDate) // 2.取得測試時間 + { + // 2019/2/20, Ning, 以傳入的表頭分隔字元拆解 + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + // 因日期格式中可能有/或:會作為分隔符號, 需特別處理 + if (strMSplitSign == ":" || strMSplitSign == "/") + { + for (int k = 1, loopTo = aryTemp.Length - 1; k <= loopTo; k++) + strTestDate = strTestDate + aryTemp[k].ToString().Trim() + strMSplitSign; + // 刪除最後的分隔符號":"或"/" + // 2019/6/26, Ning, 若分隔符號太多, 有多餘的分隔符號, 會不只一個 :或/ + while ((Strings.Right(strTestDate, 1) ?? "") == (strMSplitSign ?? "")) + strTestDate = Strings.Mid(strTestDate, 1, Strings.Len(strTestDate) - 1); + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(strTestDate, 1) == Conversions.ToString('"') && Strings.Right(strTestDate, 1) == Conversions.ToString('"')) + { + strTestDate = Strings.Mid(strTestDate, 2, Strings.Len(strTestDate) - 2); + } + } + aryWaferInfo[1] = strTestDate; + } + else + { + strTestDate = aryTemp[1].ToString().Trim(); + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(strTestDate, 1) == Conversions.ToString('"') && Strings.Right(strTestDate, 1) == Conversions.ToString('"')) + { + strTestDate = Strings.Mid(strTestDate, 2, Strings.Len(strTestDate) - 2); + } + } + aryWaferInfo[1] = strTestDate; + } + } + else + { + throw new Exception("不支援此檔案格式,Raw Data格式內容資料解析需為" + strMSplitSign); + } + } + + if (x == intEquipmentNo) // 3.取得設備編號 + { + // 2019/2/20, Ning, 以傳入的表頭分隔字元拆解 + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + strFileEquipmentNo = aryTemp[1].ToString().Trim(); + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(strFileEquipmentNo, 1) == Conversions.ToString('"') && Strings.Right(strFileEquipmentNo, 1) == Conversions.ToString('"')) + { + strFileEquipmentNo = Strings.Mid(strFileEquipmentNo, 2, Strings.Len(strFileEquipmentNo) - 2); + } + } + aryWaferInfo[2] = strFileEquipmentNo; + } + else + { + throw new Exception("不支援此檔案格式,Raw Data格式內容資料解析需為" + strMSplitSign); + } + } + + if (x == intWaferSize) // 4.取得Wafer尺寸 + { + // 2019/2/20, Ning, 以傳入的表頭分隔字元拆解 + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + strWaferSize = aryTemp[1].ToString().Trim(); + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(strWaferSize, 1) == Conversions.ToString('"') && Strings.Right(strWaferSize, 1) == Conversions.ToString('"')) + { + strWaferSize = Strings.Mid(strWaferSize, 2, Strings.Len(strWaferSize) - 2); + } + } + aryWaferInfo[3] = strWaferSize; + } + else + { + throw new Exception("不支援此檔案格式,Raw Data格式內容資料解析需為" + strMSplitSign); + } + } + + if (x == intThickness) // 5.取得厚度 + { + // 2019/2/20, Ning, 以傳入的表頭分隔字元拆解 + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + strThickness = aryTemp[1].ToString().Trim(); + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(strThickness, 1) == Conversions.ToString('"') && Strings.Right(strThickness, 1) == Conversions.ToString('"')) + { + strThickness = Strings.Mid(strThickness, 2, Strings.Len(strThickness) - 2); + } + } + aryWaferInfo[4] = strThickness; + } + else + { + throw new Exception("不支援此檔案格式,Raw Data格式內容資料解析需為" + strMSplitSign); + } + } + + if (x == intProgramNo) // 6.取得測試程式編號 + { + // 2019/2/20, Ning, 以傳入的表頭分隔字元拆解 + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + strProgramNo = aryTemp[1].ToString().Trim(); + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(strProgramNo, 1) == Conversions.ToString('"') && Strings.Right(strProgramNo, 1) == Conversions.ToString('"')) + { + strProgramNo = Strings.Mid(strProgramNo, 2, Strings.Len(strProgramNo) - 2); + } + } + aryWaferInfo[5] = strProgramNo; + } + else + { + throw new Exception("不支援此檔案格式,Raw Data格式內容資料解析需為" + strMSplitSign); + } + } + + if (!(dtFormat_Postion == null)) + { + if (dtFormat_Postion.Rows.Count > 0) + { + //aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + //var loopTo1 = (short)(dtFormat_Postion.Rows.Count - 1); + //for (i = 0; i <= loopTo1; i++) + //{ + // if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(x, dtFormat_Postion.Rows[i]["ColumnPosition"], false))) + // { + // aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + // if (aryTemp.Length > 1) + // { + // dtFormat_Postion.Rows[i]["Value"] = aryTemp[1].ToString().Trim(); + // // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + // if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + // { + // if (Strings.Left(Conversions.ToString(dtFormat_Postion.Rows[i]["Value"]), 1) == Conversions.ToString('"') && Strings.Right(Conversions.ToString(dtFormat_Postion.Rows[i]["Value"]), 1) == Conversions.ToString('"')) + // { + // dtFormat_Postion.Rows[i]["Value"] = Strings.Mid(Conversions.ToString(dtFormat_Postion.Rows[i]["Value"]), 2, Strings.Len(dtFormat_Postion.Rows[i]["Value"]) - 2); + // } + // } + // } + // else + // { + // throw new Exception("不支援此檔案格式,Raw Data格式內容資料解析需為" + strMSplitSign); + // } + // } + //} + string[] aryORGColumnName = new string[] { }; + string aryColumnName = ""; + //切割欄位的正規式 + var regex = new Regex("(?<=^|,)(\"(?:[^\"]|\"\")*\"|[^,]*)", + RegexOptions.Multiline); + + //去除前後的雙引號 + //IEnumerable clear(MatchCollection matches) + //{ + // foreach (Match match in matches) + // { + // //去除頭尾空白 + // var value = match.Value.Trim(); + // //如果開頭是雙引號,就去除頭尾的雙引號 + // yield return value.StartsWith("\"") ? + // match.Value.Substring(1, match.Value.Length - 2) : value; + // } + //}; + while (!objReader.EndOfStream) + { + var line = objReader.ReadLine(); + + //切割欄位 + //var aryTemp = regex.Matches(line); + var matches = regex.Matches(line); + aryTemp = new string[matches.Count]; + + for (int int_tmp = 0; int_tmp <= aryTemp.Length - 1; int_tmp++) + { + aryTemp[int_tmp] = matches[int_tmp].ToString(); + string[] parts = aryTemp[int_tmp].Split(new char[] { '\"' }, StringSplitOptions.RemoveEmptyEntries); + aryTemp[int_tmp] = parts[0]; + } + + var loopTo1 = (short)(dtFormat_Postion.Rows.Count - 1); + for (i = 0; i <= loopTo1; i++) + { + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(x, dtFormat_Postion.Rows[i]["ColumnPosition"], false))) + { + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + dtFormat_Postion.Rows[i]["Value"] = aryTemp[1].ToString().Trim(); + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(Conversions.ToString(dtFormat_Postion.Rows[i]["Value"]), 1) == Conversions.ToString('"') && Strings.Right(Conversions.ToString(dtFormat_Postion.Rows[i]["Value"]), 1) == Conversions.ToString('"')) + { + dtFormat_Postion.Rows[i]["Value"] = Strings.Mid(Conversions.ToString(dtFormat_Postion.Rows[i]["Value"]), 2, Strings.Len(dtFormat_Postion.Rows[i]["Value"]) - 2); + } + } + } + else + { + throw new Exception("不支援此檔案格式,Raw Data格式內容資料解析需為" + strMSplitSign); + } + } + } + + if (dtData.Columns.Count == 0) + { + for (int columnIndex = 0; columnIndex <= matches.Count - 1; columnIndex++) + { + if (aryORGColumnName.Contains(matches[columnIndex].ToString())) + { + dtData.Columns.Add(aryColumnName[Array.IndexOf(aryORGColumnName, matches[columnIndex].ToString())].ToString(), typeof(string)); + } + else + { + dtData.Columns.Add(matches[columnIndex].ToString(), System.Type.GetType("System.String")); + } + } + } + else + { + DataRow drNew = dtData.NewRow(); + + for (int valueIndex = 0; valueIndex < matches.Count; valueIndex++) + { + drNew[valueIndex] = matches[valueIndex]; + } + + dtData.Rows.Add(drNew); + } + } + } + } + + if (x == intColumnStart) // 取得欄位名稱 + { + try + { + dtData = new DataTable("CSVData"); + + // 2021/5/20 Steven Mantis:0092711: [SEMI_Wafer] AutoLoader 設備電性匯入支援可收集非數值的電性值_AutoLoader 廠內設備電性值匯入調整 + // 找到所有非數值的欄位 + strSQL = "Select FieldName,DATATYPE From TBLEQPALSCRIPT_UnNumericField where EQUIPMENTNO = '" + EquipmentNo + "'and FILENAMEFORMAT = '" + FormatFile + "'"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnMES); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); + while (drTemp.Read()) + { + drData = dtUnNumeric.NewRow(); + drData["EquipmentNo"] = EquipmentNo; + drData["FileNameForMat"] = FormatFile; + drData["FieldName"] = drTemp["FieldName"].ToString(); + drData["DataType"] = drTemp["DATATYPE"].ToString(); + dtUnNumeric.Rows.Add(drData); + } + drTemp.Close(); + //cmmTemp.Dispose(); + + // 2019/2/20,Ning明細以strDSplitSign分隔 + // 若結尾為strDSplitSign則去掉 + if (strLine.EndsWith(strDSplitSign)) + { + strLine = strLine.TrimEnd(Conversions.ToChar(strDSplitSign)); + } + + aryTemp = strLine.Split(Conversions.ToChar(strDSplitSign)); + + var loopTo2 = (short)(aryTemp.Length - 1); + for (i = 0; i <= loopTo2; i++) + { + // 新增 Column + if (dtData.Columns.Count <= i) + { + + strOrgColName = aryTemp[i].ToString().ToUpper().Trim(); + if (strOrgColName.Length == 0) + { + throw new Exception("解析檔案失敗,檔案中有空白的欄位名稱,請檢查欄位名稱:" + strLine); + } + + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(strOrgColName, 1) == Conversions.ToString('"') && Strings.Right(strOrgColName, 1) == Conversions.ToString('"')) + { + strOrgColName = Strings.Mid(strOrgColName, 2, Strings.Len(strOrgColName) - 2); + } + } + + strColumnName = strOrgColName; + // 判斷檔案內是否有存在設定的非數值欄位 + if (dtUnNumeric.Rows.Count > 0) + { + var loopTo3 = (short)(dtUnNumeric.Rows.Count - 1); + for (a = 0; a <= loopTo3; a++) + { + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtUnNumeric.Rows[a]["FieldName"], strColumnName, false))) + { + dtUnNumeric.Rows[a]["Exist"] = true; + } + } + } + blnMustConvert = false; + // 2021/4/29,Ning,91736 AutoLoader 欄位名稱若有包含非數值及字元或_, 則至欄名轉換中找, 找不到則報錯 + // 第一個字必須為字元, 不為字元必須轉換 + if (char.IsLetter(Conversions.ToChar(strColumnName.Substring(0, 1)))) + { + for (int jj = 0, loopTo4 = strColumnName.Length - 1; jj <= loopTo4; jj++) + { + if (!char.IsNumber(Conversions.ToChar(strColumnName.Substring(jj, 1))) && !char.IsLetter(Conversions.ToChar(strColumnName.Substring(jj, 1))) && strColumnName.Substring(jj, 1) != "_") + { + blnMustConvert = true; + break; + } + } + } + else + { + blnMustConvert = true; + } + if (blnMustConvert) + { + strSQL = "Select ConversionField From tblSYSFieldConvertBasis where DocumentField = '" + strColumnName.ToUpper() + "'"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnMES); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); + if (drTemp.Read()) + { + strColumnName = Conversions.ToString(drTemp["ConversionField"]); + } + else + { + throw new Exception("解析檔案失敗,檔案欄位: " + strColumnName + " 含有特殊字元但未設定欄名轉換, 請檢查檔案:" + FileName); + } + drTemp.Close(); + //cmmTemp.Dispose(); + } + + // '欄位名稱只能是數字或英文字母, 這兩者除外的皆以_取代 + // For jj As Integer = 0 To strColumnName.Length - 1 + // If Not Char.IsNumber(strColumnName.Substring(jj, 1)) AndAlso Not Char.IsLetter(strColumnName.Substring(jj, 1)) Then + // strColumnName = Replace(strColumnName, strColumnName.Substring(jj, 1), "_") + // End If + // Next + + if (string.IsNullOrEmpty(strColumnName)) + { + strColumnName = "COL" + i; + } + + // 判斷取代後的欄位是否已存在,若已存在則於欄位後方加COL+欄位顯示順序 + if (dtData.Columns.Contains(strColumnName)) + { + strColumnName = strColumnName + "COL" + i; + } + + // Memory Table欄位開String + dtData.Columns.Add(strColumnName.ToUpper(), Type.GetType("System.String")); + + } + } + } + + catch (Exception ex) + { + throw; + } + } + + if (x == intDataStart || blnDataAdd == true) // 取得Raw Data資料 + { + + blnDataAdd = true; + + // 在開始組第一筆Insert SQL前需先開立資料表 + if (x == intDataStart) + { + + // 若intWaferID=0, 則WaferID為檔名(去除副檔名) + if (intWaferID == 0) + { + strWaferID = FileName.Substring(0, FileName.LastIndexOf(".")); + aryWaferInfo[0] = strWaferID; + } + // 2019/5/28,Ning, WaferID不為數值, Ex. -,2,3-9 + if (!Information.IsNumeric(strWaferIDPos)) + { + string[] aryWaferID, aryChar; + string strSplitChar; + int intPart, intLength; + strWaferID = FileName.Substring(0, FileName.LastIndexOf(".")); + aryWaferID = strWaferIDPos.Split(','); + strSplitChar = aryWaferID[0]; + intPart = Conversions.ToInteger(aryWaferID[1]); + aryChar = aryWaferID[2].Split('-'); + intLength = (int)Math.Round(Conversions.ToDouble(aryChar[1]) - Conversions.ToDouble(aryChar[0]) + 1d); + aryWaferID = strWaferID.Split(Conversions.ToChar(strSplitChar)); + strWaferID = Strings.Mid(aryWaferID[intPart - 1], Conversions.ToInteger(aryChar[0]), intLength); + aryWaferInfo[0] = strWaferID; + } + // 若TestDate為空則以目前時間為TestDate + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(aryWaferInfo[1], defString, false))) + { + aryWaferInfo[1] = Strings.Format(DateTime.Now, "yyyy/MM/dd hh:mm:ss"); + } + // 若ProgramNo為空, 則以N/A代入 + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(aryWaferInfo[5], defString, false))) + { + aryWaferInfo[5] = "N/A"; + } + // 若未傳入EquipmentNo, 則用Parameter1的值填入 + // 2019/7/9,Ning, aryWaferInfo[2]存的是檔案內的EquipmentNo, 檔案內沒有就維持預設值, 不存入XML中的EquipmentNo + if (aryWaferInfo[2] == null || string.IsNullOrEmpty(aryWaferInfo[2].ToString().Trim())) + { + aryWaferInfo[2] = EquipmentNo; + } + + strSQLColumn = ""; + DataRow[] drSel; + if (dtUnNumeric.Rows.Count > 0) // 找出存在於檔案中的非數值欄位 + { + drSel = dtUnNumeric.Select("Exist = " + true + " And DataType = 0"); // String + StringCount = drSel.Length; + drSel = dtUnNumeric.Select("Exist = " + true + " And DataType = 2"); // Date + DateCount = drSel.Length; + } + aryCol[dtData.Columns.Count - 1 - StringCount - DateCount] = new decimal[(int)(SplitRecordsLimit - 1L + 1)]; // 扣除String&Date欄位數量 + // 字串陣列 長度為dtUnNumeric的行數(欄位數量)*分包筆數 + if (StringCount > 0) + { + aryCol_String[StringCount] = new string[(int)(SplitRecordsLimit - 1L + 1)]; + } + if (DateCount > 0) + { + aryCol_DateTime[DateCount] = new DateTime[(int)(SplitRecordsLimit - 1L + 1)]; + } + var loopTo5 = (short)(dtData.Columns.Count - 1); + for (i = 0; i <= loopTo5; i++) + { + // strSQLColumn = strSQLColumn + column.ColumnName & " VARCHAR2(50)," + // 欄位皆以NUMBER(38,15)儲存運算 + bool isString = false; + bool isDateTime = false; + var loopTo6 = (short)(dtUnNumeric.Rows.Count - 1); + for (z = 0; z <= loopTo6; z++) + { + if ((dtData.Columns[i].ColumnName ?? "") == (dtUnNumeric.Rows[z]["FieldName"].ToString() ?? "")) + { + if (dtUnNumeric.Rows[z]["DataType"].ToString() == "0") + { + isString = true; + } + else if (dtUnNumeric.Rows[z]["DataType"].ToString() == "2") + { + isDateTime = true; + } + dtUnNumeric.Rows[z]["Index"] = i; + } + } + if (isString) + { + strSQLColumn = strSQLColumn + "\"" + dtData.Columns[i].ColumnName + "\"" + " VARCHAR2(100),"; + } + else if (isDateTime) + { + strSQLColumn = strSQLColumn + "\"" + dtData.Columns[i].ColumnName + "\"" + " DATE,"; + } + else + { + strSQLColumn = strSQLColumn + "\"" + dtData.Columns[i].ColumnName + "\"" + " NUMBER(38,15),"; + } + // 二維陣列初始化 + aryCol[i] = new decimal[(int)(SplitRecordsLimit - 1L + 1)]; + aryCol_String[i] = new string[(int)(SplitRecordsLimit - 1L + 1)]; + aryCol_DateTime[i] = new DateTime[(int)(SplitRecordsLimit - 1L + 1)]; + } + + if (Strings.InStr(1, strSQLColumn, ",") != 0) // 刪除最後一個"," + { + if (Strings.Right(strSQLColumn, 1) == ",") + { + strSQLColumn = Strings.Mid(strSQLColumn, 1, Strings.Len(strSQLColumn) - 1); + } + } + + // 指定暫存資料 Temp_機台編號 + if (EquipmentNo.Contains("-")) + { + strTableName = "Temp" + "_" + Strings.Mid(EquipmentNo.Replace("-", "_"), 1, 10) + "_" + Strings.Format(DateTime.Now, "mmssff"); + } + else + { + strTableName = "Temp" + "_" + Strings.Mid(EquipmentNo, 1, 10) + "_" + Strings.Format(DateTime.Now, "mmssff"); + } + + if (blnStoreRawData) + { + // 要儲存RawData,則將TempTable開在TestData那一組Connection中 + try + { + strTestCnnString = objSetting.GetConnectionString_DY("TestDataConnectionString", "TestDataDatabasePassword"); + strTestDBType = objSetting.GetDataBaseType_DY("TestDataDatabaseType"); + strTestDBOwner = strDataBaseTestOwner; + } + catch + { + strTestCnnString = null; + strTestDBType = null; + strTestDBOwner = null; + } + + // 取不到TestData相關連線時以MES連線取代之 + if (strTestCnnString == null || strTestDBType == null || strTestDBOwner == null) + { + strTestCnnString = strConnectionString; + strTestDBType = strDataBaseType; + strTestDBOwner = strDataBaseMesOwner; + } + } + else + { + // 不存RawData, 則開立在MES的DB中 + strTestCnnString = strConnectionString; + strTestDBType = strDataBaseType; + strTestDBOwner = strDataBaseMesOwner; + } + + // //Create connection + cnnTest = CreateConnection(strTestCnnString); + + // 先刪除Table,若出錯用try...catch避開 + // 如果有分包處理到一半的資料,應該繼續用上一個TempTable + try + { + strSQL = "Select TempTableName From TBLMESAUTOLOADERFILESTATE T where ServerName = '" + Environment.MachineName + "'And ServiceName = 'AutoLoaderLib'" + " And JobNo = '" + JobNo + "' and FileName = '" + FileName + "'And (T.Description is not null or dbms_lob.getlength(T.Description) <> 0 )"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnMES); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); + // 如有找到資料,代表未處理完 + if (drTemp.Read()) + { + strTableName = Conversions.ToString(drTemp["TempTableName"]); + } + else + { + drTemp.Close(); + //cmmTemp.Dispose(); + + //strSQL = "Select Table_Name From User_Tables Where Table_Name = '" + strTableName.ToUpper() + "'"; + ////cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnMES); + //drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); + // 0143038, 將取得Table Name改為GetSchema_Tables, 19245, 2023/08/10 + DataTable dtTableTemp = GetSchema_Tables(cnnTest, strTestDBOwner, strTableName.ToUpper()); + if (!(dtTableTemp == null) && dtTableTemp.Rows.Count > 0) + { + strSQL = " Drop Table " + strTableName; + ExecuteSQLNoneQuery_NoLimitRows(strTestDBType, strTestCnnString, ref strSQL); + // CollectionSQL.Add(strSQL) + } + //drTemp.Close(); + //cmmTemp.Dispose(); + // Create 暫存Table + // 2018/05/14 Josh 增加WaferID欄位 + // strSQL = " Create Table " & strTableName & "(SequenceNo NUMBER(20),WaferID VARCHAR2(20), " & strSQLColumn & ")" + // 2018/11/6, Ning 使用 Oracle Temporary Table + // strSQL = " Create Global Temporary Table " & strTableName & "(SequenceNo NUMBER(20),WaferID VARCHAR2(30), " & strSQLColumn & ")" + // 2021/3/24,Ning,改為實體 Temp Table + if (strTestDBType == "mssql") + { + strSQL = " Create Table " + strTableName + "(SequenceNo int,WaferID VARCHAR(30), " + strSQLColumn + ")"; + } + else + { + strSQL = " Create Table " + strTableName + "(SequenceNo NUMBER(20),WaferID VARCHAR2(30), " + strSQLColumn + ")"; + } + ExecuteSQLNoneQuery_NoLimitRows(strTestDBType, strTestCnnString, ref strSQL); + // CollectionSQL.Add(strSQL) + + } + } + + catch (Exception ex) + { + throw ex; + } + } + + try + { + aryTemp = strLine.Split(Conversions.ToChar(strDSplitSign)); // 應與dtData的count相同 + + var loopTo7 = (short)(dtData.Columns.Count - 1); + for (i = 0; i <= loopTo7; i++) + { + + // 2021/5/21 Steven 增加紀錄String欄位 + WriteString = false; + WriteDate = false; + if (dtUnNumeric.Rows.Count > 0) + { + var loopTo8 = (short)(dtUnNumeric.Rows.Count - 1); + for (z = 0; z <= loopTo8; z++) + { + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(i, dtUnNumeric.Rows[z]["Index"], false)) && Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtUnNumeric.Rows[z]["Exist"], true, false))) // index相同時記錄欄位 + { + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtUnNumeric.Rows[z]["DataType"], 0, false))) // String + { + WriteString = true; + } + else if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtUnNumeric.Rows[z]["DataType"], 2, false))) // DateTime + { + WriteDate = true; + } + } + } + } + if (WriteString) + { + arySequence[idx] = intSeq; // idx開始第一筆 + aryCol_String[i][idx] = aryTemp[i].Trim(); // String需要去除前後空白 + } + else if (WriteDate) + { + arySequence[idx] = intSeq; // idx開始第一筆 + if (Information.IsDate(aryTemp[i])) + { + aryCol_DateTime[i][idx] = Conversions.ToDate(aryTemp[i]); + } + else if (string.IsNullOrEmpty(aryTemp[i].ToString())) + { + aryCol_DateTime[i][idx] = defDateTime; + } + } + + else + { + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(aryTemp[i], 1) == Conversions.ToString('"') && Strings.Right(aryTemp[i], 1) == Conversions.ToString('"')) + { + aryTemp[i] = Strings.Mid(aryTemp[i], 2, Strings.Len(aryTemp[i]) - 2); + } + } + arySequence[idx] = intSeq; // idx開始第一筆 + if (Information.IsNumeric(aryTemp[i])) + { + aryCol[i][idx] = Conversions.ToDecimal(aryTemp[i]); + } + else + { + aryCol[i][idx] = defInteger; + } + } + } + + idx = idx + 1; + intSeq = intSeq + 1; + + // 當筆數達到SplitRecordsLimit時寫入DB + if (idx == SplitRecordsLimit) + { + + var oParameterNames = new Dictionary(); + var Int32Parameter = new Dictionary(); + var DecimalParameter = new Dictionary(); + var VarcharParameter = new Dictionary(); + var DateParameter = new Dictionary(); + + oParameterNames.Add("SequenceNo", "Int32"); + Int32Parameter.Add("SequenceNo", arySequence); + + strSQLAddField = "Insert into " + strTableName + " (SequenceNo,WaferID"; + strSQLAddValue = " Values (:SequenceNo, '" + strWaferID + "'"; + var loopTo9 = (short)(dtData.Columns.Count - 1); + for (i = 0; i <= loopTo9; i++) // 如有設定非數值欄位,依著欄位的index找出是String or Date + { + WriteString = false; + WriteDate = false; + if (dtUnNumeric.Rows.Count > 0) + { + var loopTo10 = (short)(dtUnNumeric.Rows.Count - 1); + for (z = 0; z <= loopTo10; z++) + { + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(i, dtUnNumeric.Rows[z]["Index"], false)) && Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtUnNumeric.Rows[z]["Exist"], true, false)) && Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtUnNumeric.Rows[z]["DataType"], 0, false))) // index相同時記錄欄位 + { + WriteString = true; + } + else if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(i, dtUnNumeric.Rows[z]["Index"], false)) && Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtUnNumeric.Rows[z]["Exist"], true, false)) && Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtUnNumeric.Rows[z]["DataType"], 2, false))) // Date + { + WriteDate = true; + } + } + } + // 非數值欄位寫入 + if (WriteString) + { + oParameterNames.Add(dtData.Columns[i].ColumnName, "Varchar"); + VarcharParameter.Add(dtData.Columns[i].ColumnName, aryCol_String[i]); + } + else if (WriteDate) + { + oParameterNames.Add(dtData.Columns[i].ColumnName, "DateTime"); + DateParameter.Add(dtData.Columns[i].ColumnName, aryCol_DateTime[i]); + } + else + { + oParameterNames.Add(dtData.Columns[i].ColumnName, "Decimal"); + DecimalParameter.Add(dtData.Columns[i].ColumnName, aryCol[i]); + } + strSQLAddField = strSQLAddField + "," + dtData.Columns[i].ColumnName; + strSQLAddValue = strSQLAddValue + ", :" + dtData.Columns[i].ColumnName; + } + strSQL = strSQLAddField + ")" + strSQLAddValue + ")"; + + Dictionary argBLOBParameter = null; + funAddSQLContent(oSQLContent, ref intSQLIndex, strSQL, -1, HasParameter: true, ParameterNames: oParameterNames, DecimalParameter: DecimalParameter, Int32Parameter: Int32Parameter, VarcharParameter: VarcharParameter, DateTimeParameter: DateParameter); + ExecuteSQLNoneQuery_ArrayBinding(strTestDBType, strTestCnnString, oSQLContent); + // 已成功完成分包 + blnSplitPartialSuccess = true; + // SplitRecordsLimit 分包的筆數 ExecuteTimes 已做了幾次分包 相乘 = 已做過的筆數 + // 2021/5/10 Steven Mantis:0090855 當成功寫入DB時,要寫入現況表並記錄已處理的筆數 + intRow = (int)(intRow + SplitRecordsLimit); + // 如果是未完成的檔案,筆數加上上次已執行完的比數 + + fuUpdateAutoLoaderState(Environment.MachineName, "AutoLoaderLib", JobNo, JobFunction, FileName, FilePath, FileSize, strTableName, EquipmentNo, intRow, strlotNo, strWaferID, defString, datStartTime, defDateTime, SplitRecordsLimit: (int)SplitRecordsLimit); + + intSQLIndex = 1U; + oSQLContent = new Dictionary(); + idx = 0; + } + } + + catch (Exception ex) + { + throw; + } + + } + + } + } + + TotalRows = TotalRows - intDataStart + 1; // 計算所有筆數 + + // 最後一包的idx筆資料, array中的index 0~idx-1 有值 + if (idx >= 1) + { + try + { + var arySequence_C = new int[idx]; + var aryCol_C = new decimal[501][]; + + var aryCol_String_C = new string[501][]; + var aryCol_DateTime_C = new DateTime[501][]; + + aryCol_C[dtData.Columns.Count - 1 - StringCount - DateCount] = new decimal[idx]; // 重新定義二維陣列aryCol_C的維度 + // 字串陣列 長度為dtUnNumeric的行數(欄位數量)*分包筆數 + aryCol_String_C[StringCount] = new string[idx]; + aryCol_DateTime_C[DateCount] = new DateTime[idx]; + + var loopTo11 = (short)(dtData.Columns.Count - 1); + for (i = 0; i <= loopTo11; i++) + { + // 2021/5/21 Steven 增加紀錄String欄位 + WriteString = false; + WriteDate = false; + if (dtUnNumeric.Rows.Count > 0) + { + var loopTo12 = (short)(dtUnNumeric.Rows.Count - 1); + for (z = 0; z <= loopTo12; z++) + { + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(i, dtUnNumeric.Rows[z]["Index"], false)) && Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtUnNumeric.Rows[z]["Exist"], true, false))) // index相同時記錄欄位 + { + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtUnNumeric.Rows[z]["DataType"], 0, false))) // String + { + WriteString = true; + } + else if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtUnNumeric.Rows[z]["DataType"], 2, false))) // DateTime + { + WriteDate = true; + } + } + } + } + if (WriteString) + { + aryCol_String_C[i] = new string[idx]; + } + else if (WriteDate) + { + aryCol_DateTime_C[i] = new DateTime[idx]; + } + else + { + aryCol_C[i] = new decimal[idx]; + } // 初始化二維陣列 + + } + + var oParameterNames = new Dictionary(); + var Int32Parameter = new Dictionary(); + var DecimalParameter = new Dictionary(); + var VarcharParameter = new Dictionary(); + var DateParameter = new Dictionary(); + + // 將arySequence的前idx筆複製給arySequence_C + Array.Copy(arySequence, arySequence_C, idx); + + oParameterNames.Add("SequenceNo", "Int32"); + Int32Parameter.Add("SequenceNo", arySequence_C); + + strSQLAddField = "Insert into " + strTableName + " (SequenceNo,WaferID"; + strSQLAddValue = " Values (:SequenceNo, '" + strWaferID + "'"; + + + var loopTo13 = (short)(dtData.Columns.Count - 1); + for (i = 0; i <= loopTo13; i++) + { + WriteString = false; + WriteDate = false; + if (dtUnNumeric.Rows.Count > 0) + { + var loopTo14 = (short)(dtUnNumeric.Rows.Count - 1); + for (z = 0; z <= loopTo14; z++) + { + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(i, dtUnNumeric.Rows[z]["Index"], false)) && Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtUnNumeric.Rows[z]["Exist"], true, false)) && Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtUnNumeric.Rows[z]["DataType"], 0, false))) // index相同時記錄欄位 + { + WriteString = true; + } + else if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(i, dtUnNumeric.Rows[z]["Index"], false)) && Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtUnNumeric.Rows[z]["Exist"], true, false)) && Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtUnNumeric.Rows[z]["DataType"], 2, false))) // Date + { + WriteDate = true; + } + } + } + // 非數值欄位寫入 + if (WriteString) + { + oParameterNames.Add(dtData.Columns[i].ColumnName, "Varchar"); + // 將aryCol(i)的前idx筆複製給aryCol_String_C(i) + Array.Copy(aryCol_String[i], aryCol_String_C[i], idx); + VarcharParameter.Add(dtData.Columns[i].ColumnName, aryCol_String_C[i]); + } + else if (WriteDate) + { + oParameterNames.Add(dtData.Columns[i].ColumnName, "DateTime"); + // 將aryCol(i)的前idx筆複製給aryCol_DateTime_C(i) + Array.Copy(aryCol_DateTime[i], aryCol_DateTime_C[i], idx); + DateParameter.Add(dtData.Columns[i].ColumnName, aryCol_DateTime_C[i]); + } + else + { + oParameterNames.Add(dtData.Columns[i].ColumnName, "Decimal"); + // 將aryCol(i)的前idx筆複製給aryCol_C(i) + Array.Copy(aryCol[i], aryCol_C[i], idx); + DecimalParameter.Add(dtData.Columns[i].ColumnName, aryCol_C[i]); + } + + strSQLAddField = strSQLAddField + "," + dtData.Columns[i].ColumnName; + strSQLAddValue = strSQLAddValue + ", :" + dtData.Columns[i].ColumnName; + } + strSQL = strSQLAddField + ")" + strSQLAddValue + ")"; + + funAddSQLContent(oSQLContent, ref intSQLIndex, strSQL, -1, HasParameter: true, ParameterNames: oParameterNames, DecimalParameter: DecimalParameter, Int32Parameter: Int32Parameter, VarcharParameter: VarcharParameter, DateTimeParameter: DateParameter); + ExecuteSQLNoneQuery_ArrayBinding(strTestDBType, strTestCnnString, oSQLContent); + + intSQLIndex = 1U; + oSQLContent = new Dictionary(); + idx = 0; + // 全都完成,將現況表的資料刪除,並寫入資料到log + fuUpdateAutoLoaderState(Environment.MachineName, "AutoLoaderLib", JobNo, JobFunction, FileName, FilePath, FileSize, strTableName, EquipmentNo, intRow, strlotNo, strWaferID, defString, datStartTime, defDateTime, true); + } + catch (Exception ex) + { + throw; + } + } + + objReader.Close(); + + blnResult = true; + } + + catch (Exception ex) + { + // 有錯誤時把TempTable Drop 掉 + if (!string.IsNullOrEmpty(strTableName) && blnSplitPartialSuccess == false && StartRow == defInteger) // StartRow = defString代表要續go的檔案 + { + strSQL = "Drop Table " + strTableName; + ExecuteSQLNoneQuery_NoLimitRows(strTestDBType, strTestCnnString, ref strSQL); + } + // 有錯誤時,要將錯誤訊息紀錄上現況表上 + // 若有成功處理的筆數,則把失敗訊息寫上;若無成功處理筆數,則不寫現況表,並將檔案直接搬移到fail + strFailMessage = "分包處理失敗: " + ex.Message; + if (blnSplitPartialSuccess) + { + fuUpdateAutoLoaderState(Environment.MachineName, "AutoLoaderLib", JobNo, JobFunction, FileName, FilePath, FileSize, strTableName, EquipmentNo, intRow, strlotNo, strWaferID, strFailMessage, datStartTime, defDateTime, false, (int)SplitRecordsLimit); + } + else if (blnSplitPartialSuccess == false && StartRow != defInteger) // 分包續處理,第一次就錯,需要更新錯誤訊息與時間'完全沒成功,又有起始處理筆數 + { + fuUpdateAutoLoaderState(Environment.MachineName, "AutoLoaderLib", JobNo, JobFunction, FileName, FilePath, FileSize, strTableName, EquipmentNo, intRow, strlotNo, strWaferID, strFailMessage, datStartTime, defDateTime, false, (int)SplitRecordsLimit); + } + + throw; + } + + finally + { + // 寫入log資料 + fuAddAutoLoaderLog(Environment.MachineName, "AutoLoaderLib", JobNo, JobFunction, FileName, FilePath, FileSize, EquipmentNo, strlotNo, strWaferID, strFailMessage, datStartTime, defDateTime, TotalRows); + CloseConnection(cnnMES); + CloseConnection(cnnTest); + objReader.Close(); + objReader = null; + aryTemp = null; + } + + return blnResult; + + } + + private bool fuLEDDataSummary_EQP(string strTestRecipeType, ArrayList aryFormula, + string[] aryWaferInfo, string EquipmentNo, + string FileName, string strTempTable, + bool blnStoreRawData, DataTable dtFormat_Postion = null, + int FileSize = 0, int TotalRows = 0, bool blnSingleLot = false) + { + + bool blnResult = false; + string strWaferID; + string strColumnName = defString; + string strFormulaSQL = defString; + string strCalResult; // 儲存SQL公式計算完的結果 + string strSQL = ""; + string strTableName = ""; + string strSQLColumn, strSQLAddField, strSQLAddValue; + var CollectionSQL = new Collection(); + DateTime datEventTime; + var strReadFormula = new string[2]; + int i = 0; + var cnnTemp = default(IDbConnection); + DbDataReader drTemp; + + string LotNo, LogGroupSerial, PSNo, TestRecipeType = default(string); + var dsTemp = default(DataSet); + //var daTemp = default(System.Data.OleDb.OleDbDataAdapter); + DataTable dtTestRecipe; + string strLogTableName, strSQLHead, strSQLLogHead; + + DataRow[] drSel; + + var cnnTest = default(IDbConnection); + string strTestCnnString = default(string), strTestDBType = default(string), strTestDBOwner = default(string); + var RawDataTableName = default(string); + // Dim intMillionTimes As Integer = 1000000 '2021/9/22 Steven Mantis:0099773 當測試資料超過16位數時,drTemp無法承載。調整方式:寫入TempTable先將資料/1000000,寫入TestSummary與RawData時,再將資料乘上1000000 + try + { + datEventTime = DateTime.Now; + + // //Create connection + cnnTemp = CreateConnection(strConnectionString); + + if (blnStoreRawData) + { + // 要儲存RawData,則將TempTable開在TestData那一組Connection中 + try + { + strTestCnnString = objSetting.GetConnectionString_DY("TestDataConnectionString", "TestDataDatabasePassword"); + strTestDBType = objSetting.GetDataBaseType_DY("TestDataDatabaseType"); + strTestDBOwner = strDataBaseTestOwner; + } + catch + { + strTestCnnString = null; + strTestDBType = null; + strTestDBOwner = null; + } + + // 取不到TestData相關連線時以MES連線取代之 + if (string.IsNullOrEmpty(strTestCnnString) || string.IsNullOrEmpty(strTestDBType) || string.IsNullOrEmpty(strTestDBOwner)) + { + strTestCnnString = strConnectionString; + strTestDBType = strDataBaseType; + strTestDBOwner = strDataBaseMesOwner; + } + } + else + { + // 不存RawData, 則開立在MES的DB中 + strTestCnnString = strConnectionString; + strTestDBType = strDataBaseType; + strTestDBOwner = strDataBaseMesOwner; + } + + // //Create connection + cnnTest = CreateConnection(strTestCnnString); + + + strWaferID = aryWaferInfo[0].ToString(); + + if (!blnSingleLot) + { + // 取得LotNo, LogGroupSerial + strSQL = "Select A.LotNo From tblWIPComponentState A, tblWIPLotState B Where A.LotNo = B.LotNo And A.ComponentNo = '" + strWaferID + "'" + " And B.Status In (0,1,2,3,4,5)"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + LotNo = Conversions.ToString(drTemp["LotNo"]); + } + else + { + throw new Exception("解析檔案失敗,ComponentNo: " + strWaferID + " 無法找到對應的 LotNo,請檢查檔案:" + FileName); + } + drTemp.Close(); + //cmmTemp.Dispose(); + } + else + { + //是一檔單批時,為生產批號 + LotNo = strWaferID; + } + + strSQL = "Select LogGroupSerial, PSNo From tblWIPLotState Where LotNo = '" + LotNo + "'"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + if (string.IsNullOrEmpty(drTemp["LogGroupSerial"].ToString())) + { + throw new Exception("解析檔案失敗,LotNo: " + LotNo + " 之LogGroupSerial為空!"); + } + LogGroupSerial = Conversions.ToString(drTemp["LogGroupSerial"]); + PSNo = Conversions.ToString(drTemp["PSNo"]); + } + else + { + throw new Exception("解析檔案失敗,LotNo: " + LotNo + " 無法找到生產批現況!"); + } + drTemp.Close(); + //cmmTemp.Dispose(); + + // 2019/5/30, Ning, 若AutoLoaderJob.xml的Parameter2有定義TestRecipeType, 則以該值為優先, 若沒有定再以下述方式找TestRecipeType + if ((strTestRecipeType ?? "") != defString) + { + TestRecipeType = strTestRecipeType; + } + // 依格式檔內的參數編號及生產批所在區域取得TestRecipeType + else if (aryFormula.Count > 0) + { + strReadFormula = Strings.Split(Strings.Trim(aryFormula[0].ToString()), ":"); + strColumnName = strReadFormula[0].ToUpper(); + + strSQL = "Select TestRecipeType From tblSYSTestRecipeBasis Where TestRecipeNo = '" + strColumnName + "' And PSNo = '" + PSNo + "'"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + TestRecipeType = Conversions.ToString(drTemp["TestRecipeType"]); + } + else + { + throw new Exception("解析檔案失敗, 找不到區段: " + PSNo + ", 參數編號: " + strColumnName + " 之測試類別!"); + } + drTemp.Close(); + //cmmTemp.Dispose(); + } + + // 電性值資料表名稱: tblWIPTestSum_測試類別 + strTableName = "TBLWIPTESTSUM_" + TestRecipeType; + strLogTableName = "TBLWIPTESTSUMLOG_" + TestRecipeType; + + if (blnStoreRawData) + RawDataTableName = "TBLWIPRAWDATA_" + TestRecipeType; + + // 檢查檔案是否已匯入過(資料已存在Log中) + // 2021/3/16 Steven Mantis: 0089578: [SEMI_Wafer] AutoLoader 廠內電性測試資料,允許相同測試時間的測試檔的匯入 + string strConditionSQL = " Where ComponentNo = '" + strWaferID + "'"; + if (blnSingleLot) + { + strConditionSQL = " Where LotNo = '" + strWaferID + "'"; + } + strSQL = "Select LotNo,ComponentNo From " + strLogTableName + strConditionSQL + " And FileName = '" + FileName + "'" + " And TestDate = To_Date('" + Strings.Format(Conversions.ToDate(aryWaferInfo[1].ToString()), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') And ImportDate = To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')"; + strSQL = SQLCommandTuning(strTestDBType, ref strSQL); + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + throw new Exception("檔案: " + FileName + ", 測試日期: " + aryWaferInfo[1].ToString() + ", 匯入時間" + Strings.Format((object)datEventTime, "yyyy/MM/dd H:mm:ss") + " 已匯入, 不允許重新匯入!!"); + } + drTemp.Close(); + //cmmTemp.Dispose(); + + // 依測試類別找出其TestRecipeNo(參數編號), ConversionField(欄位名稱) + strSQL = "Select TestRecipeNo, ConversionField From tblSYSTestRecipeBasis Where TestRecipeType = '" + TestRecipeType + "'"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp); + dsTemp = new DataSet(); + //daTemp.Fill(dsTemp, "TestRecipe"); + ExecuteSQLQuery_Adapter(strSQL, dsTemp, "TestRecipe", cnnTemp); + dtTestRecipe = dsTemp.Tables["TestRecipe"]; + + // tblWIPTestSum刪除已存在資料, 只保留最新一次資料 + strSQL = "Delete From " + strTableName + strConditionSQL; + CollectionSQL.Add(strSQL); + + // //新增TestSummary, TestSummaryLog + // strSQLAddField = "Insert into " & strTableName & " (" + strSQLHead = "Insert into " + strTableName + " ("; + strSQLLogHead = "Insert into " + strLogTableName + " ("; + strSQLAddValue = " Values ("; + + // 固定欄位 + strSQLAddField = "LogGroupSerial, ComponentNo, LotNo, FileName, EquipmentNo, ImportUserNo, ImportDate,"; + + string strComponentNoAndLotNo = strWaferID + "','" + LotNo; + if (blnSingleLot) + { + strComponentNoAndLotNo = "N/A', '" + strWaferID; + } + strSQLAddValue = strSQLAddValue + "'" + LogGroupSerial + "','" + strComponentNoAndLotNo + "','" + FileName + "','" + EquipmentNo + "','AutoRun'," + " To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),"; + + // 動態欄位 + // 拆解公式檔:欄位名稱、計算SQL + bool blnF_WaferSize, blnF_Thickness, blnF_TestDate, blnF_ProgramNo; + blnF_WaferSize = false; // 預設公式檔沒有WaferSize + blnF_Thickness = false; // 預設公式檔沒有Thickness + blnF_TestDate = false; // 預設公式檔沒有TestDate + blnF_ProgramNo = false; // 預設公式檔沒有ProgramNo + + if (aryFormula.Count > 0) + { + + for (int w = 0, loopTo = aryFormula.Count - 1; w <= loopTo; w++) + { + strCalResult = ""; + + strReadFormula = Strings.Split(Strings.Trim(aryFormula[w].ToString()), ":"); + strColumnName = strReadFormula[0]; + strFormulaSQL = strReadFormula[1]; + + // TestRecipeBasis有定義此欄位才需要計算並存入 + // 2019/3/7, Ning, 存入的欄位名稱為dtTestRecipe.ConversionField + drSel = dtTestRecipe.Select("TestRecipeNo = '" + strColumnName + "'"); + if (drSel.Length > 0) + { + // 將SQL計算工式的temp_Table改為 + strFormulaSQL = Strings.Replace(strFormulaSQL, "[TEMP_TABLE]", strTempTable); + // 2021/11/9 因測試資料有可能超過16位數,導致dataReader無法乘載,故先將select SQL 縮小百萬倍 + // EX: SELECT STDDEV(NS_2) FROM TBLWIPTESTSUM_CP_VL 轉換成: SELECT (STDDEV(NS_2))/1000000 FROM TBLWIPTESTSUM_CP_VL + // strFormulaSQL = strFormulaSQL.ToUpper + // strFormulaSQL = strFormulaSQL.Trim + // strFormulaSQL = Replace(strFormulaSQL, Left("" & strFormulaSQL & "", 6), "SELECT(") + // strFormulaSQL = Replace(strFormulaSQL, "FROM " & strTempTable.ToUpper & "", ")/1000000 FROM " & strTempTable.ToUpper & "") + // 取得計算結果 + // 欄位皆以NUMBER(38,15)儲存運算 + //cmmTemp = new System.Data.OleDb.OleDbCommand(strFormulaSQL, cnnTest); + drTemp = ExecuteSQLQuery_Reader(strFormulaSQL, cnnTest); + if (drTemp.Read()) + { + strCalResult = drTemp[0].ToString(); + if (Information.IsNumeric(strCalResult)) + { + strCalResult = strCalResult; + } + } + else + { + throw new Exception("公式計算失敗,請檢查參數名稱:" + strColumnName); + } + + if (!string.IsNullOrEmpty(strCalResult)) + { + // 2019/3/7, Ning, 存入的欄位名稱為dtTestRecipe.ConversionField + // strSQLAddField = strSQLAddField & strColumnName & "," + strSQLAddField = strSQLAddField + drSel[0]["ConversionField"].ToString() + ","; + strSQLAddValue = strSQLAddValue + "'" + strCalResult.ToString() + "',"; + + if (drSel[0]["ConversionField"].ToString().ToUpper() == "WAFERSIZE") + { + blnF_WaferSize = true; + } + if (drSel[0]["ConversionField"].ToString().ToUpper() == "THICKNESS") + { + blnF_Thickness = true; + } + if (drSel[0]["ConversionField"].ToString().ToUpper() == "TESTDATE") + { + blnF_TestDate = true; + } + if (drSel[0]["ConversionField"].ToString().ToUpper() == "PROGRAMNO") + { + blnF_ProgramNo = true; + } + } + } + } + drTemp.Close(); + //cmmTemp.Dispose(); + } + + // 固定欄位(TestDate, ProgramNo) + if (!blnF_TestDate) + { + strSQLAddField = strSQLAddField + "TestDate,"; + strSQLAddValue = strSQLAddValue + "To_Date('" + Strings.Format(Conversions.ToDate(aryWaferInfo[1].ToString()), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')" + ","; + } + if (!blnF_ProgramNo) + { + strSQLAddField = strSQLAddField + "ProgramNo,"; + strSQLAddValue = strSQLAddValue + "'" + aryWaferInfo[5].ToString() + "',"; + } + // Steven Manits:0088935: [SEMI_Wafer] AutoLoader測試資料動態參數收集優化_AutoLoader 電性值匯入調整 + // 表頭的非固定欄位,需寫入電性資料表 + if (!(dtFormat_Postion == null)) + { + if (dtFormat_Postion.Rows.Count > 0) + { + var loopTo1 = dtFormat_Postion.Rows.Count - 1; + for (i = 0; i <= loopTo1; i++) + { + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtFormat_Postion.Rows[i]["AssignFile"], 1, false))) + { + if (dtTestRecipe.Select("TestRecipeNo = '" + dtFormat_Postion.Rows[i]["ColumnName"].ToString() + "'").Length > 0) + { + strSQLAddField = strSQLAddField + "" + dtFormat_Postion.Rows[i]["ColumnName"].ToString() + ","; + strSQLAddValue = strSQLAddValue + "'" + dtFormat_Postion.Rows[i]["Value"].ToString() + "',"; + } + } + } + } + } + // 動態欄位 + // 2019/5/22, Ning, 公式檔沒有WaferSize才將表頭的填入 + if (!blnF_WaferSize && dtTestRecipe.Select("TestRecipeNo = 'WaferSize'").Length > 0 && (aryWaferInfo[3].ToString() ?? "") != defString) + { + strSQLAddField = strSQLAddField + "WaferSize,"; + strSQLAddValue = strSQLAddValue + "'" + aryWaferInfo[3].ToString() + "',"; + } + // 2019/5/22, Ning, 公式檔沒有Thickness才將表頭的填入 + if (!blnF_Thickness && dtTestRecipe.Select("TestRecipeNo = 'Thickness'").Length > 0 && (aryWaferInfo[4].ToString() ?? "") != defString) + { + strSQLAddField = strSQLAddField + "Thickness,"; + strSQLAddValue = strSQLAddValue + "'" + aryWaferInfo[4].ToString() + "',"; + } + + // 2019/7/9,Ning, FileEquipmentNo(aryWaferInfo[2]),有值則需存入 + if (!string.IsNullOrEmpty(aryWaferInfo[2].ToString()) && (aryWaferInfo[2].ToString() ?? "") != defString) + { + strSQLAddField = strSQLAddField + "FileEquipmentNo,"; + strSQLAddValue = strSQLAddValue + "'" + aryWaferInfo[2].ToString() + "',"; + } + // 2021/9/2 修正StoreRawData,RawDataTableName,RAWDATARECORD 資料未填入問題 + if (blnStoreRawData) // StoreRawData:是否存原始數據 RawDataTableName:原始數據數據表名稱 + { + strSQLAddField = strSQLAddField + "StoreRawData,RawDataTableName,RAWDATARECORD"; + strSQLAddValue = strSQLAddValue + "1,'" + RawDataTableName + "'," + TotalRows + ""; + } + else + { + strSQLAddField = strSQLAddField + "StoreRawData,"; + strSQLAddValue = strSQLAddValue + "0,"; + } + + if (Strings.InStr(1, strSQLAddField, ",") != 0) // 刪除最後一個"," + { + if (Strings.Right(strSQLAddField, 1) == ",") + { + strSQLAddField = Strings.Mid(strSQLAddField, 1, Strings.Len(strSQLAddField) - 1); + } + } + + if (Strings.InStr(1, strSQLAddValue, ",") != 0) // 刪除最後一個"," + { + if (Strings.Right(strSQLAddValue, 1) == ",") + { + strSQLAddValue = Strings.Mid(strSQLAddValue, 1, Strings.Len(strSQLAddValue) - 1); + } + } + + // 直接給定strSQL + strSQL = strSQLHead + strSQLAddField + ")" + strSQLAddValue + ")"; + CollectionSQL.Add(strSQL); + + // Log SQL + strSQL = strSQLLogHead + strSQLAddField + ")" + strSQLAddValue + ")"; + CollectionSQL.Add(strSQL); + + // 若不儲存RawData則在此Drop TempTable + if (blnStoreRawData == false) + { + strSQL = "Drop Table " + strTempTable; + CollectionSQL.Add(strSQL); + } + + // 呼叫執行SQL指令 + string argstrDatabaseType = Conversions.ToString(DataBaseType); + ExecuteSQLNoneQuery_UPD(argstrDatabaseType, strConnectionString, CollectionSQL); + + blnResult = true; + } + + catch (Exception ex) + { + //if (strTestDBType == "mssql") + //{ + // strSQL = "SELECT name FROM sys.tables where name='" + strTableName.ToUpper() + "'"; + //} + //else + //{ + // // 2021/9/2 若執行失敗,Temptable不會刪除,因此要補刪 + // strSQL = "Select Table_Name From User_Tables Where Table_Name = '" + strTempTable.ToUpper() + "'"; + //} + ////cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTest); + //drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTest); + if (string.IsNullOrEmpty(strTempTable) == false) + { + DataTable dtTableTemp = GetSchema_Tables(cnnTest, strTestDBOwner, strTempTable.ToUpper()); + if (!(dtTableTemp == null) && dtTableTemp.Rows.Count > 0) + { + strSQL = " Drop Table " + strTempTable.ToUpper(); + ExecuteSQLNoneQuery_NoLimitRows(strTestDBType, strTestCnnString, ref strSQL); + // CollectionSQL.Add(strSQL) + } + } + + //drTemp.Close(); + //cmmTemp.Dispose(); + throw; + } + + finally + { + CloseConnection(cnnTemp); + CloseConnection(cnnTest); + //if (daTemp != null) + //{ + // daTemp.Dispose(); + //} + if (dsTemp != null) + { + dsTemp.Dispose(); + } + } + + return blnResult; + + } + + private bool fuStoreRawData_EQP(string strTestRecipeType, string[] aryWaferInfo, string EquipmentNo, string FileName, string FileNameFormat, ref DataTable dtRawScript, string TempTableName, ref DataTable dtRawData, bool blnSingleLot = false) + { + bool blnResult = false; + string strWaferID; + string strColumnName = defString; + string strRawColName = defString; + string strSQL, strSQLColumn, strSQLAddField = default(string), strSQLAddValue = default(string); + var CollectionSQL = new Collection(); + DateTime datEventTime; + + IDbConnection cnnTemp = default(IDbConnection), cnnTest = default(IDbConnection); + DbDataReader drTemp; + + string LotNo, LogGroupSerial, PSNo, TestRecipeType; + var dsTemp = default(DataSet); + //var daTemp = default(System.Data.OleDb.OleDbDataAdapter); + DataTable dtTestRecipe; + DataTable dtRawData_Fix; + DataRow[] drSel; + DataView dvRawScript; + string strRawTableName, strSerialNo; + bool blnCreateRawTable; + string[] strCol; + var strAllCol = default(string); + int x = 0; + int y = 0; + int j = 0; + IDataParameter param; + var CollectionParameter = new Collection(); + var oSQLContent = new Dictionary(); + uint intSQLIndex = 1U; + string strTestCnnString = default(string), strTestDBType = default(string), strTestDBOwner = default(string); + int intHaveCoordInfo = 0; + int intIsCoordinatey = 1; + // Dim intMillionTimes As Integer = 1000000 '2021/9/22 Steven Mantis:0099773 當測試資料超過16位數時,drTemp無法承載。調整方式:寫入TempTable先將資料/1000000,寫入TestSummary與RawData時,再將資料乘上1000000 + try + { + datEventTime = DateTime.Now; + + // //Create connection + cnnTemp = CreateConnection(strConnectionString); + + // 更改連線字串,改為testdata + fuTransferTestConnection(ref strTestCnnString, ref strTestDBType, ref strTestDBOwner); + // 置換連線 + cnnTest = CreateConnection(strTestCnnString); + + dvRawScript = dtRawScript.DefaultView; + dvRawScript.RowFilter = "FileNameFormat = '" + FileNameFormat + "'"; + if (dvRawScript.Count == 0) + { + throw new Exception("未設定要儲存的原始數據參數,無法儲存原始數據"); + } + + strWaferID = aryWaferInfo[0].ToString(); + + if (!blnSingleLot) + { + // 取得LotNo, LogGroupSerial + strSQL = "Select A.LotNo From tblWIPComponentState A, tblWIPLotState B Where A.LotNo = B.LotNo And A.ComponentNo = '" + strWaferID + "'" + " And B.Status In (0,1,2,3,4,5)"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + LotNo = Conversions.ToString(drTemp["LotNo"]); + } + else + { + throw new Exception("解析檔案失敗,ComponentNo: " + strWaferID + " 無法找到對應的 LotNo,請檢查檔案:" + FileName); + } + drTemp.Close(); + //cmmTemp.Dispose(); + } + else + { + //是一檔單批時,為生產批號 + LotNo = strWaferID; + } + + strSQL = "Select LogGroupSerial, PSNo From tblWIPLotState Where LotNo = '" + LotNo + "'"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + if (string.IsNullOrEmpty(drTemp["LogGroupSerial"].ToString())) + { + throw new Exception("解析檔案失敗,LotNo: " + LotNo + " 之LogGroupSerial為空!"); + } + LogGroupSerial = Conversions.ToString(drTemp["LogGroupSerial"]); + PSNo = Conversions.ToString(drTemp["PSNo"]); + } + else + { + throw new Exception("解析檔案失敗,LotNo: " + LotNo + " 無法找到生產批現況!"); + } + drTemp.Close(); + //cmmTemp.Dispose(); + + // 2019/5/30, Ning, 若AutoLoaderJob.xml的Parameter2有定義TestRecipeType, 則以該值為優先, 若沒有定再以下述方式找TestRecipeType + // 0103356: [SEMI_Wafer] EAP 整合接口 LogFile_Send 調整為必須傳入測試類別 + if ((strTestRecipeType ?? "") != defString && !string.IsNullOrEmpty(strTestRecipeType) && strTestRecipeType != "N/A") + { + TestRecipeType = strTestRecipeType; + } + else + { + // 依原始數據格式檔內的參數編號及生產批所在區域取得TestRecipeType + strColumnName = Conversions.ToString(dvRawScript[0]["TestRecipeNo"]); + + strSQL = "Select TestRecipeType From tblSYSTestRecipeBasis_RawData Where TestRecipeClass = 2 And TestRecipeNo = '" + strColumnName + "' And PSNo = '" + PSNo + "'"; + + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + TestRecipeType = Conversions.ToString(drTemp["TestRecipeType"]); + } + else + { + throw new Exception("解析檔案失敗, 找不到區段: " + PSNo + ", 參數編號: " + strColumnName + " 之測試類別!"); + } + drTemp.Close(); + //cmmTemp.Dispose(); + } + + if (!blnSingleLot) + { + // 2021/8/29 Steven Mantis:0098747 若LOG資料存在FileFormat = 6,resulit = 1,ComponentNo相等,則要替換PSNO與LoggroupSerial + ReplacePSNoandLotGroupSerial(EquipmentNo, strWaferID, aryWaferInfo, TestRecipeType, ref PSNo, ref LogGroupSerial); + } + + // 找座標設定: + strSQL = "Select HaveCoordInfo,IsCoordinatey From tblEQPALScript Where EQUIPMENTNO = '" + EquipmentNo + "'And FILENAMEFORMAT = '" + FileNameFormat + "'"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + if (drTemp["HaveCoordInfo"].ToString() == "1") + intHaveCoordInfo = 1; // 1:有設定;0沒設定 + if (!(drTemp["IsCoordinatey"] is DBNull) && drTemp["IsCoordinatey"].ToString() == "0") + intIsCoordinatey = 0; // 0:不指定 NULL、1:指定 + } + drTemp.Close(); + //cmmTemp.Dispose(); + // X & Y軸的欄位次序 + int X_Axis_Index = defInteger; + int Y_Axis_Index = defInteger; + string X_Axis_ColName = defString; + string Y_Axis_ColName = defString; + + if (intHaveCoordInfo == 1) + { + strSQL = "Select FieldIndex,CoordAxisType From tblEQPALScript_CoordInfo Where EQUIPMENTNO = '" + EquipmentNo + "'And FILENAMEFORMAT = '" + FileNameFormat + "'"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + + while (drTemp.Read()) // 找出X Y index + { + if (Conversions.ToDouble(drTemp["CoordAxisType"].ToString()) == 1d) // 座標軸類別1: X座標軸2:Y座標軸 + { + X_Axis_Index = Conversions.ToInteger(drTemp["FieldIndex"]); + } + else if (Conversions.ToDouble(drTemp["CoordAxisType"].ToString()) == 2d) + { + Y_Axis_Index = Conversions.ToInteger(drTemp["FieldIndex"]); + } + } + drTemp.Close(); + //cmmTemp.Dispose(); + + if (X_Axis_Index == defInteger || Y_Axis_Index == defInteger) + throw new Exception("解析檔案失敗, 找不到設備: " + EquipmentNo + ", 檔案格式:: " + FileNameFormat + " 之座標資訊指定設定!"); + if (strDataBaseType == "mssql") + { + strSQL = "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '" + TempTableName.ToUpper() + "' ORDER BY ORDINAL_POSITION"; + } + else + { + // 找出Temp table 中座標的欄位名稱: + strSQL = "SELECT COLUMN_NAME FROM USER_TAB_COLUMNS WHERE TABLE_NAME = '" + TempTableName.ToUpper() + "' ORDER BY COLUMN_ID"; + } + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTest); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTest); + int index = 0; + while (drTemp.Read()) + { + if (index == X_Axis_Index + 1) + { + X_Axis_ColName = Conversions.ToString(drTemp["COLUMN_NAME"]); + } + else if (index == Y_Axis_Index + 1) + { + if (intIsCoordinatey != 0) + { + Y_Axis_ColName = Conversions.ToString(drTemp["COLUMN_NAME"]); + } + } + index += 1; + } + + drTemp.Close(); + //cmmTemp.Dispose(); + + if (intIsCoordinatey == 0) + { + if (X_Axis_ColName == defString) // 欄位次序超過Temp Table的總欄位數目 + { + throw new Exception("解析檔案失敗, 座標指定欄位次序: " + X_Axis_Index + " 超出電性欄位總數目!!!"); + } + } + else + { + if (X_Axis_ColName == defString || Y_Axis_ColName == defString) // 欄位次序超過Temp Table的總欄位數目 + { + throw new Exception("解析檔案失敗, 座標指定欄位次序: " + X_Axis_Index + "或" + Y_Axis_Index + " 超出電性欄位總數目!!!"); + } + } + } + // 開立或修正TestRawData Table Schema + // 改為原始數據主檔,核准時開立table + + // 從區段改回測試類別 + // strRawTableName = "TBLWIPRAWDATA_" & PSNo + strRawTableName = "TBLWIPRAWDATA_" + TestRecipeType; + // 依要收集的原始數據TestRecipeNo(參數編號)找出ConversionField(欄位名稱) + + // 從區段改回測試類別 + // strSQL = "Select TestRecipeNo, ConversionField From tblSYSTestRecipeBasis_RawData Where TestRecipeClass = 2 And TestRecipeType = '" & TestRecipeType & "' And IssueState = 2 And PSNO = '" & PSNo & "'" + strSQL = "Select TestRecipeNo, ConversionField,DataType From tblSYSTestRecipeBasis_RawData Where TestRecipeClass = 2 And TestRecipeType = '" + TestRecipeType + "' And IssueState = 2"; + + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp); + dsTemp = new DataSet(); + //daTemp.Fill(dsTemp, "TestRecipe"); + ExecuteSQLQuery_Adapter(strSQL, dsTemp, "TestRecipe", cnnTemp); + dtTestRecipe = dsTemp.Tables["TestRecipe"]; + + // 檢查是否有電性質要寫入 + for (int w = 0, loopTo = dvRawScript.Count - 1; w <= loopTo; w++) + { + strColumnName = Conversions.ToString(dvRawScript[w]["TestRecipeNo"]); + drSel = dtTestRecipe.Select("TestRecipeNo = '" + strColumnName + "'"); + if (drSel.Length > 0) + { + x += 1; + } + } + + strCol = new string[x]; + x = 0; + + for (int w = 0, loopTo1 = dvRawScript.Count - 1; w <= loopTo1; w++) + { + strColumnName = Conversions.ToString(dvRawScript[w]["TestRecipeNo"]); + drSel = dtTestRecipe.Select("TestRecipeNo = '" + strColumnName + "'"); + if (drSel.Length > 0) + { + strCol[x] = strColumnName; // 找出需要SELECT 的欄位 + x += 1; + } + } + + if (x > 0) // 沒有任何欄位維持原邏輯 + { + // 判斷是否設定座標,如果有資料append的方式為: [X座標1],[Y座標1],[電性數值1] + if (intHaveCoordInfo == 1) + { + bool blnExistSameCol_X = false; // 找出座標欄位是否與需要蒐集的電性欄位相同,用來處理後去陣列的大小 + bool blnExistSameCol_Y = false; + var loopTo2 = strCol.Length - 1; + for (j = 0; j <= loopTo2; j++) + { + if (strCol[j] == X_Axis_ColName) + blnExistSameCol_X = true; + if (intIsCoordinatey != 0) + { + if (strCol[j] == Y_Axis_ColName) + blnExistSameCol_Y = true; + } + else + { + blnExistSameCol_Y = true; + } + strAllCol = strAllCol + strCol[j] + ","; // 找出所有要蒐集的電性欄位 + } + + if (Strings.InStr(1, strAllCol, ",") != 0) // 刪除最後一個"," + { + if (Strings.Right(strAllCol, 1) == ",") + { + strAllCol = Strings.Mid(strAllCol, 1, Strings.Len(strAllCol) - 1); + } + } + + int RowCounts = 0; + var dtTemp = new DataTable(); + strSQL = "SELECT * FROM " + TempTableName.ToUpper() + ""; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTest); + ExecuteSQLQuery_Adapter(strSQL, dtTemp, cnnTest); + RowCounts = dtTemp.Rows.Count; + //drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTest); + //if (drTemp.Read()) + //{ + // RowCounts = Conversions.ToInteger(drTemp["COUNT(*)"]); + //} + //drTemp.Dispose(); + //cmmTemp.Dispose(); + string strColumn; + int intDuplicateColCount = 0; + // 需判斷需要蒐集的電性欄位與座標欄位是否有重複,如果重複,則不放進array中,因為array數量有可能有問題 + if (blnExistSameCol_X && blnExistSameCol_Y) + { + strColumn = "WaferID,SequenceNo ," + strAllCol + ""; + } + else if (blnExistSameCol_X && blnExistSameCol_Y == false) + { + strColumn = "WaferID,SequenceNo ," + strAllCol + "," + Y_Axis_ColName + ""; + intDuplicateColCount = 1; + } + else if (blnExistSameCol_X == false && blnExistSameCol_Y) + { + strColumn = "WaferID,SequenceNo ," + strAllCol + "," + X_Axis_ColName + ""; + intDuplicateColCount = 1; + } + else + { + strColumn = "WaferID,SequenceNo ," + strAllCol + "," + X_Axis_ColName + "," + Y_Axis_ColName + ""; + intDuplicateColCount = 2; + } + + string[] aryColumn; + aryColumn = strColumn.Split(','); + // 電性資料用分號串起 + var oReceipe = new StringBuilder[501][]; + + oReceipe[strCol.Length - 1] = new StringBuilder[RowCounts]; + + var oReceipe_Update = new StringBuilder[strCol.Length]; + + var loopTo3 = strCol.Length - 1; + for (x = 0; x <= loopTo3; x++) + oReceipe_Update[x] = new StringBuilder(); // -2 代表排除掉固定欄位,只放需要Append的資料 + + // Dim WaferID As String = "" + // strSQL = "Select WaferID from " & TempTableName & " Where RowNum = 1" '找出WaferID + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTest) + // drTemp = ExecuteSQLQuery_Reader() + // If drTemp.Read Then WaferID = drTemp("WaferID").ToString + // drTemp.Dispose() + // cmmTemp.Dispose() + + strSQL = "Select WaferID,SequenceNo ," + strAllCol + "," + X_Axis_ColName + ((intIsCoordinatey != 0) ? "," + Y_Axis_ColName : "") + " from " + TempTableName + " Order by SequenceNo asc"; // 找出固定欄位:WaferID,SequenceNo & 需要append的資料 + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTest); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTest); + + while (drTemp.Read()) + { + var loopTo4 = aryColumn.Length - 1 - intDuplicateColCount; + for (x = 2; x <= loopTo4; x++) // x =2 要扣除固定欄位:WaferID、SequenceNo;intDuplicateColCount 是座標欄位與電性欄位重複的數量 + { + Double Y_Axis_ColValue = defDouble; + if (intIsCoordinatey == 0) + { + // 座標欄位不可不為數值 + if (!Information.IsNumeric(drTemp[X_Axis_ColName])) + { + throw new Exception("解析檔案失敗, 座標欄位: " + X_Axis_ColName + " 資料不為數值"); + } + Y_Axis_ColValue = 0; + } + else + { + // 座標欄位不可不為數值 + if (!Information.IsNumeric(drTemp[X_Axis_ColName]) || !Information.IsNumeric(drTemp[Y_Axis_ColName])) + { + throw new Exception("解析檔案失敗, 座標欄位: " + X_Axis_ColName + "或" + Y_Axis_ColName + " 資料不為數值"); + } + Y_Axis_ColValue = Conversions.ToDouble(drTemp[Y_Axis_ColName]); + } + if (Information.IsNumeric(drTemp[aryColumn[x]])) + { + oReceipe_Update[x - 2].Append("" + Conversions.ToDouble(drTemp[X_Axis_ColName]) + "," + Y_Axis_ColValue + "," + Conversions.ToDouble(drTemp[aryColumn[x]]) + ";"); + } + else + { + oReceipe_Update[x - 2].Append("" + Conversions.ToDouble(drTemp[X_Axis_ColName]) + "," + Y_Axis_ColValue + "," + drTemp[aryColumn[x]].ToString() + ";"); + } + } + } + + drTemp.Dispose(); + //cmmTemp.Dispose(); + if (strDataBaseType == "mssql") + { + strSQL = "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = UPPER('" + strRawTableName + "')And COLUMN_NAME = 'SEQUENCENO'"; + } + else + { + // 2021/7/23移除RawData的SequenceNo,但確保不出錯,查核SequenceNo是否存在 + strSQL = "SELECT Column_Name FROM USER_TAB_COLUMNS WHERE TABLE_NAME = UPPER('" + strRawTableName + "')And Column_Name = 'SEQUENCENO'"; + } + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTest); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTest); + + string strComponentNoAndLotNo = strWaferID + "', '" + LotNo; + if (blnSingleLot) + { + strComponentNoAndLotNo = "N/A', '" + strWaferID; + } + + if (drTemp.Read()) + { + strSQLAddField = "Insert into " + strRawTableName + " (LogGroupSerial, ComponentNo, LotNo, SEQUENCENO, FileName, EquipmentNo, ImportUserNo, ImportDate,TestDate,ProgramNo,HAVECOORDINFO"; + strSQLAddValue = "Values( '" + LogGroupSerial + "', '" + strComponentNoAndLotNo + "',1, '" + FileName + "','" + EquipmentNo + "','AutoRun'," + " To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')," + " To_Date('" + Strings.Format(Conversions.ToDate(aryWaferInfo[1].ToString()), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')" + ",'" + aryWaferInfo[5].ToString() + "'," + intHaveCoordInfo + ""; + } + else + { + strSQLAddField = "Insert into " + strRawTableName + " (LogGroupSerial, ComponentNo, LotNo, FileName, EquipmentNo, ImportUserNo, ImportDate,TestDate,ProgramNo,HAVECOORDINFO"; + strSQLAddValue = "Values( '" + LogGroupSerial + "', '" + strComponentNoAndLotNo + "', '" + FileName + "','" + EquipmentNo + "','AutoRun'," + " To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')," + " To_Date('" + Strings.Format(Conversions.ToDate(aryWaferInfo[1].ToString()), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')" + ",'" + aryWaferInfo[5].ToString() + "'," + intHaveCoordInfo + ""; + } + drTemp.Dispose(); + //cmmTemp.Dispose(); + + var loopTo5 = aryColumn.Length - 1 - intDuplicateColCount; + for (x = 0; x <= loopTo5; x++) // intDuplicateColCount代表排除座標欄位: + { + if (x >= 2) + { + strSQLAddField = strSQLAddField + "," + aryColumn[x]; + if (strDataBaseType == "oracle") + { + strSQLAddValue = strSQLAddValue + ", :" + aryColumn[x] + ""; + } + else if (strDataBaseType == "mssql") + { + strSQLAddValue = strSQLAddValue + ", @" + aryColumn[x] + ""; + } + byte[] recipe = Encoding.Default.GetBytes(oReceipe_Update[x - 2].ToString()); + if (strDataBaseType == "oracle") + { + + param = new OracleParameter(":" + aryColumn[x] + "", OracleDbType.Blob, recipe.Length, ((int)ParameterDirection.Input).ToString()); + param.Value = recipe; + CollectionParameter.Add(param); + param = null; + } + + else if (strDataBaseType == "mssql") + { + + param = new System.Data.SqlClient.SqlParameter("@" + aryColumn[x] + "", SqlDbType.VarBinary, recipe.Length, ParameterDirection.Input, false, 0, 0, null, DataRowVersion.Current, recipe); + CollectionParameter.Add(param); + param = null; + + } + + } + } + } + else if (intHaveCoordInfo == 0) + { + var loopTo6 = strCol.Length - 1; + for (j = 0; j <= loopTo6; j++) + strAllCol = strAllCol + strCol[j] + ","; + + if (Strings.InStr(1, strAllCol, ",") != 0) // 刪除最後一個"," + { + if (Strings.Right(strAllCol, 1) == ",") + { + strAllCol = Strings.Mid(strAllCol, 1, Strings.Len(strAllCol) - 1); + } + } + + int RowCounts = 0; + var dtTemp = new DataTable(); + strSQL = "SELECT * FROM " + TempTableName.ToUpper() + ""; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTest); + ExecuteSQLQuery_Adapter(strSQL, dtTemp, cnnTest); + RowCounts = dtTemp.Rows.Count; + //drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTest); + //if (drTemp.Read()) + //{ + // RowCounts = Conversions.ToInteger(drTemp["COUNT(*)"]); + //} + //drTemp.Dispose(); + //cmmTemp.Dispose(); + string strColumn = "WaferID,SequenceNo ," + strAllCol + ""; + string[] aryColumn; + aryColumn = strColumn.Split(','); + + // 電性資料用分號串起 + var oReceipe = new StringBuilder[501][]; + + oReceipe[strCol.Length - 1] = new StringBuilder[RowCounts]; + + var oReceipe_Update = new StringBuilder[strCol.Length]; + + var loopTo7 = aryColumn.Length - 1; + for (x = 2; x <= loopTo7; x++) // x =2 要扣除固定欄位:WaferID、SequenceNo + oReceipe_Update[x - 2] = new StringBuilder(); // -2 代表排除掉固定欄位,只放需要Append的資料 + + strSQL = "Select WaferID,SequenceNo ," + strAllCol + " from " + TempTableName + " Order by SequenceNo asc"; // 找出固定欄位:WaferID,SequenceNo & 需要append的資料 + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTest); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTest); + + while (drTemp.Read()) + { + var loopTo8 = aryColumn.Length - 1; + for (x = 2; x <= loopTo8; x++) // x =2 要扣除固定欄位:WaferID、SequenceNo + { + if (Information.IsNumeric(drTemp[aryColumn[x]])) + { + oReceipe_Update[x - 2].Append("" + Conversions.ToDouble(drTemp[aryColumn[x]]) + ";"); + } + else + { + oReceipe_Update[x - 2].Append("" + drTemp[aryColumn[x]].ToString() + ";"); + } + } + } + + drTemp.Dispose(); + //cmmTemp.Dispose(); + + if (strDataBaseType == "mssql") + { + strSQL = "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = UPPER('" + strRawTableName + "')And COLUMN_NAME = 'SEQUENCENO'"; + } + else + { + strSQL = "SELECT Column_Name FROM USER_TAB_COLUMNS WHERE TABLE_NAME = UPPER('" + strRawTableName + "')And Column_Name = 'SEQUENCENO'"; + } + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTest); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTest); + + string strComponentNoAndLotNo = strWaferID + "', '" + LotNo; + if (blnSingleLot) + { + strComponentNoAndLotNo = "N/A', '" + strWaferID; + } + + if (drTemp.Read()) + { + strSQLAddField = "Insert into " + strRawTableName + " (LogGroupSerial, ComponentNo, LotNo, SEQUENCENO, FileName, EquipmentNo, ImportUserNo, ImportDate,TestDate,ProgramNo,HAVECOORDINFO"; + strSQLAddValue = "Values( '" + LogGroupSerial + "', '" + strComponentNoAndLotNo + "',1, '" + FileName + "','" + EquipmentNo + "','AutoRun'," + " To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')," + " To_Date('" + Strings.Format(Conversions.ToDate(aryWaferInfo[1].ToString()), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')" + ",'" + aryWaferInfo[5].ToString() + "'," + intHaveCoordInfo + ""; + } + else + { + strSQLAddField = "Insert into " + strRawTableName + " (LogGroupSerial, ComponentNo, LotNo, FileName, EquipmentNo, ImportUserNo, ImportDate,TestDate,ProgramNo,HAVECOORDINFO"; + strSQLAddValue = "Values( '" + LogGroupSerial + "', '" + strComponentNoAndLotNo + "', '" + FileName + "','" + EquipmentNo + "','AutoRun'," + " To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')," + " To_Date('" + Strings.Format(Conversions.ToDate(aryWaferInfo[1].ToString()), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')" + ",'" + aryWaferInfo[5].ToString() + "'," + intHaveCoordInfo + ""; + } + drTemp.Dispose(); + //cmmTemp.Dispose(); + + var loopTo9 = aryColumn.Length - 1; + for (x = 0; x <= loopTo9; x++) + { + if (x >= 2) + { + strSQLAddField = strSQLAddField + "," + aryColumn[x]; + if (strDataBaseType == "oracle") + { + strSQLAddValue = strSQLAddValue + ", :" + aryColumn[x] + ""; + } + else if (strDataBaseType == "mssql") + { + strSQLAddValue = strSQLAddValue + ", @" + aryColumn[x] + ""; + } + byte[] recipe = Encoding.Default.GetBytes(oReceipe_Update[x - 2].ToString()); + if (strDataBaseType == "oracle") + { + + param = new OracleParameter(":" + aryColumn[x] + "", OracleDbType.Blob, recipe.Length, ((int)ParameterDirection.Input).ToString()); + param.Value = recipe; + CollectionParameter.Add(param); + param = null; + } + + else if (strDataBaseType == "mssql") + { + + param = new System.Data.SqlClient.SqlParameter("@" + aryColumn[x] + "", SqlDbType.VarBinary, recipe.Length, ParameterDirection.Input, false, 0, 0, null, DataRowVersion.Current, recipe); + CollectionParameter.Add(param); + param = null; + + } + + } + } + } + + // 2019/7/9,Ning, FileEquipmentNo(aryWaferInfo[2]),有值則需存入 + if (!string.IsNullOrEmpty(aryWaferInfo[2].ToString()) && (aryWaferInfo[2].ToString() ?? "") != defString) + { + strSQLAddField = strSQLAddField + ",FileEquipmentNo,"; + strSQLAddValue = strSQLAddValue + ",'" + aryWaferInfo[2].ToString() + "'"; + } + + if (Strings.InStr(1, strSQLAddField, ",") != 0) // 刪除最後一個"," + { + if (Strings.Right(strSQLAddField, 1) == ",") + { + strSQLAddField = Strings.Mid(strSQLAddField, 1, Strings.Len(strSQLAddField) - 1); + } + } + + if (Strings.InStr(1, strSQLAddValue, ",") != 0) // 刪除最後一個"," + { + if (Strings.Right(strSQLAddValue, 1) == ",") + { + strSQLAddValue = Strings.Mid(strSQLAddValue, 1, Strings.Len(strSQLAddValue) - 1); + } + } + + strSQL = strSQLAddField + ")" + strSQLAddValue + ")"; + string strSQL_Col = string.Empty; + strSQL_Col = strSQL; + strSQL = "Drop Table " + TempTableName; + CollectionSQL.Add(strSQL); + + ExecuteSQLNoneQuery_AttachFile_NoLimitRows(strTestDBType, strTestCnnString, CollectionSQL, strSQL_Col, CollectionParameter); + blnResult = true; + } + + else + { + if (strDataBaseType == "mssql") + { + strSQL = "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = UPPER('" + strRawTableName + "')And COLUMN_NAME = 'SEQUENCENO'"; + } + else + { + strSQL = "SELECT Column_Name FROM USER_TAB_COLUMNS WHERE TABLE_NAME = UPPER('" + strRawTableName + "')And Column_Name = 'SEQUENCENO'"; + } + + string strComponentNoAndLotNo = "WaferID, '" + LotNo; + if (blnSingleLot) + { + strComponentNoAndLotNo = "'N/A', '" + strWaferID; + } + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTest); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTest); + if (drTemp.Read()) + { + strSQLAddField = "Insert into " + strRawTableName + " (LogGroupSerial, ComponentNo, LotNo, SequenceNo, FileName, EquipmentNo, ImportUserNo, ImportDate,TestDate,ProgramNo,"; + strSQLAddValue = "Select '" + LogGroupSerial + "'," + strComponentNoAndLotNo + "', 1, '" + FileName + "','" + EquipmentNo + "','AutoRun'," + " To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')," + " To_Date('" + Strings.Format(Conversions.ToDate(aryWaferInfo[1].ToString()), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')" + ",'" + aryWaferInfo[5].ToString() + "',"; + } + else + { + strSQLAddField = "Insert into " + strRawTableName + " (LogGroupSerial, ComponentNo, LotNo, FileName, EquipmentNo, ImportUserNo, ImportDate,TestDate,ProgramNo,"; + strSQLAddValue = "Select '" + LogGroupSerial + "'," + strComponentNoAndLotNo + "', '" + FileName + "','" + EquipmentNo + "','AutoRun'," + " To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')," + " To_Date('" + Strings.Format(Conversions.ToDate(aryWaferInfo[1].ToString()), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')" + ",'" + aryWaferInfo[5].ToString() + "',"; + } + drTemp.Dispose(); + //cmmTemp.Dispose(); + + for (int w = 0, loopTo10 = dvRawScript.Count - 1; w <= loopTo10; w++) + { + strColumnName = Conversions.ToString(dvRawScript[w]["TestRecipeNo"]); + strRawColName = Conversions.ToString(dtRawData.Columns[Convert.ToInt32(Operators.SubtractObject(dvRawScript[w]["ColPosition"], 1))].ColumnName); + + // TestRecipeBasis有定義此欄位才需要計算並存入 + // 2019/3/7, Ning, 存入的欄位名稱為dtTestRecipe.ConversionField + drSel = dtTestRecipe.Select("TestRecipeNo = '" + strColumnName + "'"); + if (drSel.Length > 0) + { + // 2019/3/7, Ning, 存入的欄位名稱為dtTestRecipe.ConversionField + // strSQLAddField = strSQLAddField & strColumnName & "," + strSQLAddField = strSQLAddField + drSel[0]["ConversionField"].ToString() + ","; + strSQLAddValue = strSQLAddValue + strRawColName + ","; + } + } + drTemp.Close(); + //cmmTemp.Dispose(); + + // 2019/7/9,Ning, FileEquipmentNo(aryWaferInfo[2]),有值則需存入 + if (!string.IsNullOrEmpty(aryWaferInfo[2].ToString()) && (aryWaferInfo[2].ToString() ?? "") != defString) + { + strSQLAddField = strSQLAddField + "FileEquipmentNo,"; + strSQLAddValue = strSQLAddValue + "'" + aryWaferInfo[2].ToString() + "',"; + } + + if (Strings.InStr(1, strSQLAddField, ",") != 0) // 刪除最後一個"," + { + if (Strings.Right(strSQLAddField, 1) == ",") + { + strSQLAddField = Strings.Mid(strSQLAddField, 1, Strings.Len(strSQLAddField) - 1); + } + } + + if (Strings.InStr(1, strSQLAddValue, ",") != 0) // 刪除最後一個"," + { + if (Strings.Right(strSQLAddValue, 1) == ",") + { + strSQLAddValue = Strings.Mid(strSQLAddValue, 1, Strings.Len(strSQLAddValue) - 1); + } + } + + // 直接給定strSQL + strSQL = strSQLAddField + ")" + strSQLAddValue + " From " + TempTableName; + CollectionSQL.Add(strSQL); + + strSQL = "Drop Table " + TempTableName; + CollectionSQL.Add(strSQL); + + // 呼叫執行SQL指令 + ExecuteSQLNoneQuery_UPD_NoLimitRows(strTestDBType, strTestCnnString, CollectionSQL); + //if (strTestDBType == "mssql") + //{ + // strSQL = "SELECT name FROM sys.tables where name='" + TempTableName.ToUpper() + "'"; + //} + //else + //{ + // // 刪除Temptable + // strSQL = "Select Table_Name From User_Tables Where Table_Name = '" + TempTableName.ToUpper() + "'"; + //} + ////cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTest); + //drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTest); + DataTable dtTableTemp = GetSchema_Tables(cnnTest, strTestDBOwner, TempTableName.ToUpper()); + if (!(dtTableTemp == null) && dtTableTemp.Rows.Count > 0) + { + strSQL = " Drop Table " + TempTableName.ToUpper(); + ExecuteSQLNoneQuery_NoLimitRows(strTestDBType, strTestCnnString, ref strSQL); + } + //drTemp.Close(); + //cmmTemp.Dispose(); + + + blnResult = true; + } + } + catch (Exception ex) + { + //if (strTestDBType == "mssql") + //{ + // strSQL = "SELECT name FROM sys.tables where name='" + TempTableName.ToUpper() + "'"; + //} + //else + //{ + // // 刪除Temptable + // strSQL = "Select Table_Name From User_Tables Where Table_Name = '" + TempTableName.ToUpper() + "'"; + //} + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTest); + //drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTest); + if (string.IsNullOrEmpty(TempTableName) == false) + { + DataTable dtTableTemp = GetSchema_Tables(cnnTest, strTestDBOwner, TempTableName.ToUpper()); + if (!(dtTableTemp == null) && dtTableTemp.Rows.Count > 0) + { + strSQL = " Drop Table " + TempTableName.ToUpper(); + ExecuteSQLNoneQuery_NoLimitRows(strTestDBType, strTestCnnString, ref strSQL); + } + } + + //drTemp.Close(); + //cmmTemp.Dispose(); + throw; + } + finally + { + CloseConnection(cnnTemp); + CloseConnection(cnnTest); + //if (daTemp != null) + //{ + // daTemp.Dispose(); + //} + if (dsTemp != null) + { + dsTemp.Dispose(); + } + + } + + return blnResult; + + } + private object fuTransferTestConnection(ref string strTestCnnString, ref string strTestDBType, ref string strTestDBOwner) + { + + IDbConnection cnnTemp, cnnTest; + DbDataReader drTemp; + //System.Data.OleDb.OleDbDataAdapter daTemp; + DataSet dsTemp; + Collection colSQL = new Collection(), colSQL_Test = new Collection(); + + string strSQL, strSQL_Col, strSerialNo; + bool blnNewtable; + + var datEventTime = DateTime.Now; + + try + { + try + { + strTestCnnString = objSetting.GetConnectionString_DY("TestDataConnectionString", "TestDataDatabasePassword"); + strTestDBType = objSetting.GetDataBaseType_DY("TestDataDatabaseType"); + strTestDBOwner = strDataBaseTestOwner; + } + catch + { + strTestCnnString = null; + strTestDBType = null; + strTestDBOwner = null; + } + + // 取不到TestData相關連線時以MES連線取代之 + if (string.IsNullOrEmpty(strTestCnnString) || string.IsNullOrEmpty(strTestDBType) || string.IsNullOrEmpty(strTestDBOwner)) + { + strTestCnnString = strConnectionString; + strTestDBType = strDataBaseType; + strTestDBOwner = strDataBaseMesOwner; + } + } + + catch (Exception ex) + { + throw; + } + + finally + { + + } + + return default(Object); + + + } + + public object ReplacePSNoandLotGroupSerial(string EquipmentNo, string ComponentNo, string[] aryWaferInfo, string TestRecipeType, ref string PSNo, ref string LogGroupSerial) + { + string strSQL = string.Empty; + IDbConnection cnnTemp, cnnMES; + DbDataReader drTemp; + string PSNo_Replace = ""; // 替換PSNo + string LogGroupSerial_Replace = ""; // 替換LogGroupSerial + string TestDate_Replace = ""; // 替換TestDate (aryWaferInfo[1]) + string strTestSumTable = ""; // TBLWIPTESTSUM_Table + try + { + // //Create connection + cnnTemp = CreateConnection(strConnectionString); + strTestSumTable = "TBLWIPTESTSUM_" + TestRecipeType; + // 2021/8/29 Steven Mantis:0098747 若LOG資料存在FileFormat = 6,resulit = 1,ComponentNo相等,則要替換PSNO與LoggroupSerial + // 以ComponentNo與測試日期(TestDate),FileFormat=6, Result=1(成功)為條件查詢 tblWIPCont_UploadFileLog資料表,找出CreateDate最後一筆的資料 + // 測試日期(TestDate)對應TBLWIPTESTSUM_.TestDate + strSQL = "Select A.PSNO,A.LogGroupSerial,B.TestDate from tblWIPCont_UploadFileLog A," + strTestSumTable + " B " + " where A.EquipmentNo = '" + EquipmentNo + "' and A.ComponentNo = '" + ComponentNo + "' and A.FileFormat = 6 and A.Result = 1 " + " And A.LogGroupSerial = B.LogGroupSerial And A.ComponentNo=B.ComponentNo " + " And B.TestDate = To_Date('" + Strings.Format(Conversions.ToDate(aryWaferInfo[1].ToString()), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') order by A.createDate desc"; + strSQL = SQLCommandTuning(strDataBaseType, ref strSQL); + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + PSNo_Replace = drTemp["PSNo"].ToString(); + LogGroupSerial_Replace = drTemp["LogGroupSerial"].ToString(); + TestDate_Replace = drTemp["TestDate"].ToString(); + } + drTemp.Close(); + //cmmTemp.Dispose(); + + if (!string.IsNullOrEmpty(PSNo_Replace)) + PSNo = PSNo_Replace; + if (!string.IsNullOrEmpty(LogGroupSerial_Replace)) + LogGroupSerial = LogGroupSerial_Replace; + if (!string.IsNullOrEmpty(TestDate_Replace)) + aryWaferInfo[1] = TestDate_Replace; + } + // Convert.ToDateTime(TestDate_Replace).ToString("yyyy/MM/dd HH:mm:ss") + catch (Exception ex) + { + + } + + return default(Object); + } + + /// + /// + /// + /// 原vb預設值0 + /// + /// + private bool AddTestSummary_Format6(ArrayList aryFormula, string PSNo, string LogGroupSerial, string pFilePath, string strMSplitSign, string strDSplitSign, + string strWaferIDPos, int intTestDate, + int intEquipmentNo, int intWaferSize, + int intThickness, int intProgramNo, + int intColumnStart, string strDataStartPos, + ref string[] aryWaferInfo, string EquipmentNo, string LotNo, + string FileName, ref string strTableName, + bool blnStoreRawData, ref DataTable dtData, + string FilePath, int FileSize, string SequenceNo, + DataTable dtFormat_Postion = null, + int TotalRows = 0, string strTestRecipeType = defString) + { + + bool blnResult; + var objReader = default(StreamReader); + // 2019/3/26, Ning, 加入Encode, 排除中文亂碼問題 + // 2019/3/28, Ning, TestDate預設為目前時間, ProgramNo預設為N/A + // Dim encode As System.Text.Encoding = System.Text.Encoding.GetEncoding("UTF-8") + var encode = Encoding.Default; + string strLine; + string strWaferID; + var strTestDate = default(string); + string strFileEquipmentNo = defString; + string strWaferSize = "N/A"; + string strThickness = "N/A"; + string strProgramNo = "N/A"; + string[] aryTemp; + // Dim dtData As DataTable + short i; + bool blnDataAdd = false; + string strOrgColName, strColumnName; + string strSQL, strSQLColumn, strSQLAddField, strSQLAddValue; + var CollectionSQL = new Collection(); + + var cnnTemp = default(IDbConnection); + DbDataReader drTemp; + + int intWaferID = defInteger; + int intDataStart = defInteger; + int x = 0; + short z; + short a; + var dtUnNumeric = new DataTable("UnNumeric"); + DataRow drData; + + string strTestCnnString, strTestDBType; + bool blnMustConvert; + var datStartTime = DateTime.Now; + string strFailMessage = defString; + string strlotNo = "N/A"; + string strLogTableName; + strTableName = ""; // 避免跑回圈重複讀取 + string strSQLHead, strSQLLogHead; + var TestRecipeType = default(string); + var dsTemp = default(DataSet); + //var daTemp = default(System.Data.OleDb.OleDbDataAdapter); + DataTable dtTestRecipe; + string strFormulaSQL = defString; + DataRow[] drSel; + string strCalResult; // 儲存SQL公式計算完的結果 + string RawDataTableName = defString; + if (strTestRecipeType == "N/A") + strTestRecipeType = defString; + + try + { + // //Create connection + cnnTemp = CreateConnection(strConnectionString); + + blnResult = false; + + objReader = new StreamReader(pFilePath, encode); + // 先讀取第一列, 再以第一列的編碼方式讀檔 + strLine = objReader.ReadLine().Trim(); + encode = objReader.CurrentEncoding; + objReader.Close(); + objReader = null; + objReader = new StreamReader(pFilePath, encode); + + // 當WaferID位置為數值時, 同原本處理方式取得檔案內的WaferID + if (Information.IsNumeric(strWaferIDPos)) + { + intWaferID = Conversions.ToInteger(strWaferIDPos); + } + + dtUnNumeric.Columns.Add("EquipmentNo", Type.GetType("System.String")); + dtUnNumeric.Columns.Add("FileNameFormat", Type.GetType("System.String")); + dtUnNumeric.Columns.Add("FieldName", Type.GetType("System.String")); + dtUnNumeric.Columns.Add("DataType", Type.GetType("System.Int16")); + dtUnNumeric.Columns.Add("Index", Type.GetType("System.Int16")); // 紀錄非數值欄位在excel的index + dtUnNumeric.Columns.Add("Exist", Type.GetType("System.Boolean")); // 紀錄EXCEL是否存在檔案內 + + // 當DataStart位置為數值時, 同原本處理方式 + if (Information.IsNumeric(strDataStartPos)) + { + intDataStart = Conversions.ToInteger(strDataStartPos); + } + else // 非數值, 先掃一次檔案, 找到固定字串的列數+1為intDataStart + { + x = 0; + while (!objReader.EndOfStream) + { + x = x + 1; + strLine = objReader.ReadLine(); + if ((strLine.ToUpper() ?? "") == (strDataStartPos.ToUpper() ?? "")) + { + intDataStart = x + 1; + break; + } + } + objReader.Close(); + objReader = null; + objReader = new StreamReader(pFilePath, encode); + } + + x = 0; + while (!objReader.EndOfStream) + { + x = x + 1; + + strLine = objReader.ReadLine(); + + if (strLine != null && !string.IsNullOrEmpty(strLine.Trim())) + { + + if (x == intWaferID) // 1.取得WaferID + { + // 2019/2/20, Ning, 以傳入的表頭分隔字元拆解 + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + strWaferID = aryTemp[1].ToString().Trim(); + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(strWaferID, 1) == Conversions.ToString('"') && Strings.Right(strWaferID, 1) == Conversions.ToString('"')) + { + strWaferID = Strings.Mid(strWaferID, 2, Strings.Len(strWaferID) - 2); + } + } + if (string.IsNullOrEmpty(strWaferID)) + { + throw new Exception("無法取得WaferID!!"); + } + else + { + aryWaferInfo[0] = strWaferID; + } + // 找出lotNo: + strSQL = "Select A.LotNo From tblWIPComponentState A, tblWIPLotState B Where A.LotNo = B.LotNo And A.ComponentNo = '" + strWaferID + "'" + " And B.Status In (0,1,2,3,4,5)"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + // 如有找到資料,代表未處理完 + if (drTemp.Read()) + strlotNo = Conversions.ToString(drTemp["LotNo"]); + drTemp.Close(); + //cmmTemp.Dispose(); + } + else + { + throw new Exception("不支援此檔案格式,Raw Data格式內容資料解析需為" + strMSplitSign); + } + } + + if (x == intTestDate) // 2.取得測試時間 + { + // 2019/2/20, Ning, 以傳入的表頭分隔字元拆解 + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + // 因日期格式中可能有/或:會作為分隔符號, 需特別處理 + if (strMSplitSign == ":" || strMSplitSign == "/") + { + for (int k = 1, loopTo = aryTemp.Length - 1; k <= loopTo; k++) + strTestDate = strTestDate + aryTemp[k].ToString().Trim() + strMSplitSign; + // 刪除最後的分隔符號":"或"/" + // 2019/6/26, Ning, 若分隔符號太多, 有多餘的分隔符號, 會不只一個 :或/ + while ((Strings.Right(strTestDate, 1) ?? "") == (strMSplitSign ?? "")) + strTestDate = Strings.Mid(strTestDate, 1, Strings.Len(strTestDate) - 1); + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(strTestDate, 1) == Conversions.ToString('"') && Strings.Right(strTestDate, 1) == Conversions.ToString('"')) + { + strTestDate = Strings.Mid(strTestDate, 2, Strings.Len(strTestDate) - 2); + } + } + aryWaferInfo[1] = strTestDate; + } + else + { + strTestDate = aryTemp[1].ToString().Trim(); + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(strTestDate, 1) == Conversions.ToString('"') && Strings.Right(strTestDate, 1) == Conversions.ToString('"')) + { + strTestDate = Strings.Mid(strTestDate, 2, Strings.Len(strTestDate) - 2); + } + } + aryWaferInfo[1] = strTestDate; + } + } + else + { + throw new Exception("不支援此檔案格式,Raw Data格式內容資料解析需為" + strMSplitSign); + } + } + + if (x == intEquipmentNo) // 3.取得設備編號 + { + // 2019/2/20, Ning, 以傳入的表頭分隔字元拆解 + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + strFileEquipmentNo = aryTemp[1].ToString().Trim(); + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(strFileEquipmentNo, 1) == Conversions.ToString('"') && Strings.Right(strFileEquipmentNo, 1) == Conversions.ToString('"')) + { + strFileEquipmentNo = Strings.Mid(strFileEquipmentNo, 2, Strings.Len(strFileEquipmentNo) - 2); + } + } + aryWaferInfo[2] = strFileEquipmentNo; + + if ((strFileEquipmentNo ?? "") != defString && (EquipmentNo ?? "") != (strFileEquipmentNo ?? "")) + { + throw new Exception("檔案內容設備編號與EAP上傳設備編號不符"); + } + } + else + { + throw new Exception("不支援此檔案格式,Raw Data格式內容資料解析需為" + strMSplitSign); + } + } + + if (x == intWaferSize) // 4.取得Wafer尺寸 + { + // 2019/2/20, Ning, 以傳入的表頭分隔字元拆解 + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + strWaferSize = aryTemp[1].ToString().Trim(); + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(strWaferSize, 1) == Conversions.ToString('"') && Strings.Right(strWaferSize, 1) == Conversions.ToString('"')) + { + strWaferSize = Strings.Mid(strWaferSize, 2, Strings.Len(strWaferSize) - 2); + } + } + aryWaferInfo[3] = strWaferSize; + } + else + { + throw new Exception("不支援此檔案格式,Raw Data格式內容資料解析需為" + strMSplitSign); + } + } + + if (x == intThickness) // 5.取得厚度 + { + // 2019/2/20, Ning, 以傳入的表頭分隔字元拆解 + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + strThickness = aryTemp[1].ToString().Trim(); + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(strThickness, 1) == Conversions.ToString('"') && Strings.Right(strThickness, 1) == Conversions.ToString('"')) + { + strThickness = Strings.Mid(strThickness, 2, Strings.Len(strThickness) - 2); + } + } + aryWaferInfo[4] = strThickness; + } + else + { + throw new Exception("不支援此檔案格式,Raw Data格式內容資料解析需為" + strMSplitSign); + } + } + + if (x == intProgramNo) // 6.取得測試程式編號 + { + // 2019/2/20, Ning, 以傳入的表頭分隔字元拆解 + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + strProgramNo = aryTemp[1].ToString().Trim(); + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(strProgramNo, 1) == Conversions.ToString('"') && Strings.Right(strProgramNo, 1) == Conversions.ToString('"')) + { + strProgramNo = Strings.Mid(strProgramNo, 2, Strings.Len(strProgramNo) - 2); + } + } + aryWaferInfo[5] = strProgramNo; + } + else + { + throw new Exception("不支援此檔案格式,Raw Data格式內容資料解析需為" + strMSplitSign); + } + } + + if (!(dtFormat_Postion == null)) // 2021/3/11 Steven Mantis: 0088935: [SEMI_Wafer] AutoLoader測試資料動態參數收集優化_AutoLoader 電性值匯入調整 + { + if (dtFormat_Postion.Rows.Count > 0) + { + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + var loopTo1 = (short)(dtFormat_Postion.Rows.Count - 1); + for (i = 0; i <= loopTo1; i++) + { + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(x, dtFormat_Postion.Rows[i]["ColumnPosition"], false))) + { + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + dtFormat_Postion.Rows[i]["Value"] = aryTemp[1].ToString().Trim(); + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(Conversions.ToString(dtFormat_Postion.Rows[i]["Value"]), 1) == Conversions.ToString('"') && Strings.Right(Conversions.ToString(dtFormat_Postion.Rows[i]["Value"]), 1) == Conversions.ToString('"')) + { + dtFormat_Postion.Rows[i]["Value"] = Strings.Mid(Conversions.ToString(dtFormat_Postion.Rows[i]["Value"]), 2, Strings.Len(dtFormat_Postion.Rows[i]["Value"]) - 2); + } + } + } + // aryWaferInfo[5] = dtFormat_Postion.Rows(i)("Value") + else + { + throw new Exception("不支援此檔案格式,Raw Data格式內容資料解析需為" + strMSplitSign); + } + } + } + } + } + } + } + + objReader.Close(); + + blnResult = true; + + try + { + var datEventTime = DateTime.Now; + var strReadFormula = new string[2]; + // //Create connection + cnnTemp = CreateConnection(strConnectionString); + + strWaferID = aryWaferInfo[0].ToString(); + // 2019/5/30, Ning, 若AutoLoaderJob.xml的Parameter2有定義TestRecipeType, 則以該值為優先, 若沒有定再以下述方式找TestRecipeType + if ((strTestRecipeType ?? "") != defString) + { + TestRecipeType = strTestRecipeType; + } + // 依格式檔內的參數編號及生產批所在區域取得TestRecipeType + else if (aryFormula.Count > 0) + { + strReadFormula = Strings.Split(Strings.Trim(aryFormula[0].ToString()), ":"); + strColumnName = strReadFormula[0].ToUpper(); + + strSQL = "Select TestRecipeType From tblSYSTestRecipeBasis Where TestRecipeNo = '" + strColumnName + "' And PSNo = '" + PSNo + "'"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + TestRecipeType = Conversions.ToString(drTemp["TestRecipeType"]); + } + else + { + throw new Exception("解析檔案失敗, 找不到區段: " + PSNo + ", 參數編號: " + strColumnName + " 之測試類別!"); + } + drTemp.Close(); + //cmmTemp.Dispose(); + } + + // 電性值資料表名稱: tblWIPTestSum_測試類別 + strTableName = "TBLWIPTESTSUM_" + TestRecipeType; + strLogTableName = "TBLWIPTESTSUMLOG_" + TestRecipeType; + + if (blnStoreRawData) + { + RawDataTableName = "TBLWIPRAWDATA_" + TestRecipeType; + } + + // 檢查檔案是否已匯入過(資料已存在Log中) + // 2021/3/16 Steven Mantis: 0089578: [SEMI_Wafer] AutoLoader 廠內電性測試資料,允許相同測試時間的測試檔的匯入 + strSQL = "Select ComponentNo From " + strLogTableName + " Where ComponentNo = '" + strWaferID + "' And FileName = '" + FileName + "'" + " And TestDate = To_Date('" + Strings.Format(Conversions.ToDate(aryWaferInfo[1].ToString()), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') And ImportDate = To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + throw new Exception("檔案: " + FileName + ", 測試日期: " + aryWaferInfo[1].ToString() + ", 匯入時間" + Strings.Format((object)datEventTime, "yyyy/MM/dd H:mm:ss") + " 已匯入, 不允許重新匯入!!"); + } + drTemp.Close(); + //cmmTemp.Dispose(); + + // 依測試類別找出其TestRecipeNo(參數編號), ConversionField(欄位名稱) + strSQL = "Select TestRecipeNo, ConversionField From tblSYSTestRecipeBasis Where TestRecipeType = '" + TestRecipeType + "'"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp); + dsTemp = new DataSet(); + //daTemp.Fill(dsTemp, "TestRecipe"); + ExecuteSQLQuery_Adapter(strSQL, dsTemp, "TestRecipe", cnnTemp); + dtTestRecipe = dsTemp.Tables["TestRecipe"]; + + // tblWIPTestSum刪除已存在資料, 只保留最新一次資料 + strSQL = "Delete From " + strTableName + " Where ComponentNo = '" + strWaferID + "'"; + CollectionSQL.Add(strSQL); + + // //新增TestSummary, TestSummaryLog + // strSQLAddField = "Insert into " & strTableName & " (" + strSQLHead = "Insert into " + strTableName + " ("; + strSQLLogHead = "Insert into " + strLogTableName + " ("; + strSQLAddValue = " Values ("; + + // 固定欄位 + strSQLAddField = "LogGroupSerial, ComponentNo, LotNo, FileName, EquipmentNo, ImportUserNo, ImportDate,FileSize,"; + strSQLAddValue = strSQLAddValue + "'" + LogGroupSerial + "','" + strWaferID + "','" + LotNo + "','" + FileName + "','" + EquipmentNo + "','AutoRun'," + " To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')," + FileSize + ","; + + // 動態欄位 + // 拆解公式檔:欄位名稱、計算SQL + bool blnF_WaferSize, blnF_Thickness, blnF_TestDate, blnF_ProgramNo; + blnF_WaferSize = false; // 預設公式檔沒有WaferSize + blnF_Thickness = false; // 預設公式檔沒有Thickness + blnF_TestDate = false; // 預設公式檔沒有TestDate + blnF_ProgramNo = false; // 預設公式檔沒有ProgramNo + + // 固定欄位(TestDate, ProgramNo) + if (!blnF_TestDate) + { + strSQLAddField = strSQLAddField + "TestDate,"; + strSQLAddValue = strSQLAddValue + "To_Date('" + Strings.Format(Conversions.ToDate(aryWaferInfo[1].ToString()), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')" + ","; + } + if (!blnF_ProgramNo) + { + strSQLAddField = strSQLAddField + "ProgramNo,"; + strSQLAddValue = strSQLAddValue + "'" + strProgramNo + "',"; + } + + // Steven Manits:0088935: [SEMI_Wafer] AutoLoader測試資料動態參數收集優化_AutoLoader 電性值匯入調整 + // 表頭的非固定欄位,需寫入電性資料表 + if (!(dtFormat_Postion == null)) + { + if (dtFormat_Postion.Rows.Count > 0) + { + var loopTo2 = (short)(dtFormat_Postion.Rows.Count - 1); + for (i = 0; i <= loopTo2; i++) + { + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtFormat_Postion.Rows[i]["AssignFile"], 1, false))) + { + if (dtTestRecipe.Select("TestRecipeNo = '" + dtFormat_Postion.Rows[i]["ColumnName"].ToString() + "'").Length > 0) + { + strSQLAddField = strSQLAddField + "" + dtFormat_Postion.Rows[i]["ColumnName"].ToString() + ","; + strSQLAddValue = strSQLAddValue + "'" + dtFormat_Postion.Rows[i]["Value"].ToString() + "',"; + } + } + } + } + } + + // 動態欄位 + // 2019/5/22, Ning, 公式檔沒有WaferSize才將表頭的填入 + if (!blnF_WaferSize && dtTestRecipe.Select("TestRecipeNo = 'WaferSize'").Length > 0 && (aryWaferInfo[3].ToString() ?? "") != defString) + { + strSQLAddField = strSQLAddField + "WaferSize,"; + strSQLAddValue = strSQLAddValue + "'" + aryWaferInfo[3].ToString() + "',"; + } + // 2019/5/22, Ning, 公式檔沒有Thickness才將表頭的填入 + if (!blnF_Thickness && dtTestRecipe.Select("TestRecipeNo = 'Thickness'").Length > 0 && (aryWaferInfo[4].ToString() ?? "") != defString) + { + strSQLAddField = strSQLAddField + "Thickness,"; + strSQLAddValue = strSQLAddValue + "'" + aryWaferInfo[4].ToString() + "',"; + } + + // 2019/7/9,Ning, FileEquipmentNo(aryWaferInfo[2]),有值則需存入 + if (!string.IsNullOrEmpty(aryWaferInfo[2].ToString()) && (aryWaferInfo[2].ToString() ?? "") != defString) + { + strSQLAddField = strSQLAddField + "FileEquipmentNo,"; + strSQLAddValue = strSQLAddValue + "'" + aryWaferInfo[2].ToString() + "',"; + } + + strSQLAddField = strSQLAddField + "StoreRawData,"; + strSQLAddValue = strSQLAddValue + "0,"; + + // If blnStoreRawData Then 'StoreRawData:是否存原始數據 RawDataTableName:原始數據數據表名稱 + // strSQLAddField = strSQLAddField & "StoreRawData,RawDataTableName,RAWDATARECORD" + // strSQLAddValue = strSQLAddValue & "1,'" & RawDataTableName & "'," & TotalRows & "" + // Else + // strSQLAddField = strSQLAddField & "StoreRawData," + // strSQLAddValue = strSQLAddValue & "0," + // End If + + if (Strings.InStr(1, strSQLAddField, ",") != 0) // 刪除最後一個"," + { + if (Strings.Right(strSQLAddField, 1) == ",") + { + strSQLAddField = Strings.Mid(strSQLAddField, 1, Strings.Len(strSQLAddField) - 1); + } + } + + if (Strings.InStr(1, strSQLAddValue, ",") != 0) // 刪除最後一個"," + { + if (Strings.Right(strSQLAddValue, 1) == ",") + { + strSQLAddValue = Strings.Mid(strSQLAddValue, 1, Strings.Len(strSQLAddValue) - 1); + } + } + + // 直接給定strSQL + strSQL = strSQLHead + strSQLAddField + ")" + strSQLAddValue + ")"; + CollectionSQL.Add(strSQL); + + // Log SQL + strSQL = strSQLLogHead + strSQLAddField + ")" + strSQLAddValue + ")"; + CollectionSQL.Add(strSQL); + + + // 更新tblWIPCont_UploadFile + + // 88995: [6.0.5] EAP 整合接口 LogFile_Send PK重複問題調整 + // strSQL = "Update tblWIPCont_UploadFile Set Result = 1, SummaryTableName = '" & strTableName & "', ComponentNo = '" & strWaferID & "', ReadFileDate = To_Date('" & Format(datEventTime, "yyyy/MM/dd H:mm:ss") & "','YYYY/MM/DD HH24:MI:SS')" & + // " Where EquipmentNo = '" & EquipmentNo & "' And CreateDate = To_Date('" & Format(CreateDate, "yyyy/MM/dd H:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') " + strSQL = "Update tblWIPCont_UploadFile Set Result = 1,CreateDate = To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'), SummaryTableName = '" + strTableName + "', ComponentNo = '" + strWaferID + "', ReadFileDate = To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')" + " Where EquipmentNo = '" + EquipmentNo + "' And SequenceNo='" + SequenceNo + "' and FileFormat = 6 "; + + CollectionSQL.Add(strSQL); + + // 呼叫執行SQL指令 + string argstrDatabaseType = Conversions.ToString(DataBaseType); + ExecuteSQLNoneQuery_UPD(argstrDatabaseType, strConnectionString, CollectionSQL); + + blnResult = true; + } + + catch (Exception ex) + { + throw; + } + } + + + + catch (Exception ex) + { + throw; + } + finally + { + + //if (daTemp != null) + //{ + // daTemp.Dispose(); + //} + if (dsTemp != null) + { + dsTemp.Dispose(); + } + CloseConnection(cnnTemp); + objReader.Close(); + objReader = null; + aryTemp = null; + } + + return blnResult; + + } + + private bool fuRawDataToTempTable_EQP_UploadFile(string pFilePath, string strMSplitSign, string strDSplitSign, + string strWaferIDPos, int intTestDate, + int intEquipmentNo, int intWaferSize, + int intThickness, int intProgramNo, + int intColumnStart, string strDataStartPos, + ref string[] aryWaferInfo, string EquipmentNo, + string LotNo, string FileName, + ref string strTableName, bool blnStoreRawData, + ref DataTable dtData, ref int TotalRows, DataTable dtFormat_Postion = null, + string FormatFile = defString) + { + + bool blnResult; + var objReader = default(StreamReader); + // 2019/3/26, Ning, 加入Encode, 排除中文亂碼問題 + // 2019/3/28, Ning, TestDate預設為目前時間, ProgramNo預設為N/A + // Dim encode As System.Text.Encoding = System.Text.Encoding.GetEncoding("UTF-8") + var encode = Encoding.Default; + string strLine; + var strWaferID = default(string); + var strTestDate = default(string); + string strFileEquipmentNo = defString; + string strWaferSize = "N/A"; + string strThickness = "N/A"; + string strProgramNo = "N/A"; + string[] aryTemp; + // Dim dtData As DataTable + var i = default(short); + bool blnDataAdd = false; + string strOrgColName, strColumnName; + DataRow drAdd; + string strSQL, strSQLColumn, strSQLAddField, strSQLAddValue; + var CollectionSQL = new Collection(); + + IDbConnection cnnTemp = default(IDbConnection), cnnTest = default(IDbConnection); + DbDataReader drTemp; + + int intWaferID = defInteger; + int intDataStart = defInteger; + + int x = 0; + + string strTestCnnString = "", strTestDBType = "", strTestDBOwner = ""; + bool blnMustConvert; + + var dtUnNumeric = new DataTable("UnNumeric"); + dtUnNumeric.Columns.Add("EquipmentNo", Type.GetType("System.String")); + dtUnNumeric.Columns.Add("FileNameFormat", Type.GetType("System.String")); + dtUnNumeric.Columns.Add("FieldName", Type.GetType("System.String")); + dtUnNumeric.Columns.Add("DataType", Type.GetType("System.Int16")); + dtUnNumeric.Columns.Add("Index", Type.GetType("System.Int16")); // 紀錄非數值欄位在excel的index + dtUnNumeric.Columns.Add("Exist", Type.GetType("System.Boolean")); // 紀錄EXCEL是否存在檔案內 + DataRow drData; + bool WriteString = false; + bool WriteDate = false; + short z; + short a; + strTableName = ""; // 避免迴圈重複讀取 + try + { + // //Create connection + cnnTemp = CreateConnection(strConnectionString); + + blnResult = false; + + objReader = new StreamReader(pFilePath, encode); + // 先讀取第一列, 再以第一列的編碼方式讀檔 + strLine = objReader.ReadLine().Trim(); + encode = objReader.CurrentEncoding; + objReader.Close(); + objReader = null; + objReader = new StreamReader(pFilePath, encode); + + // 當WaferID位置為數值時, 同原本處理方式取得檔案內的WaferID + if (Information.IsNumeric(strWaferIDPos)) + { + intWaferID = Conversions.ToInteger(strWaferIDPos); + } + + // 當DataStart位置為數值時, 同原本處理方式 + if (Information.IsNumeric(strDataStartPos)) + { + intDataStart = Conversions.ToInteger(strDataStartPos); + } + else // 非數值, 先掃一次檔案, 找到固定字串的列數+1為intDataStart + { + x = 0; + while (!objReader.EndOfStream) + { + x = x + 1; + strLine = objReader.ReadLine(); + if ((strLine.ToUpper() ?? "") == (strDataStartPos.ToUpper() ?? "")) + { + intDataStart = x + 1; + break; + } + } + objReader.Close(); + objReader = null; + objReader = new StreamReader(pFilePath, encode); + } + + x = 0; + while (!objReader.EndOfStream) + { + x = x + 1; + TotalRows = TotalRows + 1; + strLine = objReader.ReadLine(); + + if (strLine != null && !string.IsNullOrEmpty(strLine.Trim())) + { + + if (x == intWaferID) // 1.取得WaferID + { + // 2019/2/20, Ning, 以傳入的表頭分隔字元拆解 + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + strWaferID = aryTemp[1].ToString().Trim(); + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(strWaferID, 1) == Conversions.ToString('"') && Strings.Right(strWaferID, 1) == Conversions.ToString('"')) + { + strWaferID = Strings.Mid(strWaferID, 2, Strings.Len(strWaferID) - 2); + } + } + if (string.IsNullOrEmpty(strWaferID)) + { + throw new Exception("無法取得WaferID!!"); + } + else + { + aryWaferInfo[0] = strWaferID; + } + } + else + { + throw new Exception("不支援此檔案格式,Raw Data格式內容資料解析需為" + strMSplitSign); + } + } + + if (x == intTestDate) // 2.取得測試時間 + { + // 2019/2/20, Ning, 以傳入的表頭分隔字元拆解 + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + // 因日期格式中可能有/或:會作為分隔符號, 需特別處理 + if (strMSplitSign == ":" || strMSplitSign == "/") + { + for (int k = 1, loopTo = aryTemp.Length - 1; k <= loopTo; k++) + strTestDate = strTestDate + aryTemp[k].ToString().Trim() + strMSplitSign; + // 刪除最後的分隔符號":"或"/" + // 2019/6/26, Ning, 若分隔符號太多, 有多餘的分隔符號, 會不只一個 :或/ + while ((Strings.Right(strTestDate, 1) ?? "") == (strMSplitSign ?? "")) + strTestDate = Strings.Mid(strTestDate, 1, Strings.Len(strTestDate) - 1); + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(strTestDate, 1) == Conversions.ToString('"') && Strings.Right(strTestDate, 1) == Conversions.ToString('"')) + { + strTestDate = Strings.Mid(strTestDate, 2, Strings.Len(strTestDate) - 2); + } + } + aryWaferInfo[1] = strTestDate; + } + else + { + strTestDate = aryTemp[1].ToString().Trim(); + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(strTestDate, 1) == Conversions.ToString('"') && Strings.Right(strTestDate, 1) == Conversions.ToString('"')) + { + strTestDate = Strings.Mid(strTestDate, 2, Strings.Len(strTestDate) - 2); + } + } + aryWaferInfo[1] = strTestDate; + } + } + else + { + throw new Exception("不支援此檔案格式,Raw Data格式內容資料解析需為" + strMSplitSign); + } + } + + if (x == intEquipmentNo) // 3.取得設備編號 + { + // 2019/2/20, Ning, 以傳入的表頭分隔字元拆解 + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + strFileEquipmentNo = aryTemp[1].ToString().Trim(); + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(strFileEquipmentNo, 1) == Conversions.ToString('"') && Strings.Right(strFileEquipmentNo, 1) == Conversions.ToString('"')) + { + strFileEquipmentNo = Strings.Mid(strFileEquipmentNo, 2, Strings.Len(strFileEquipmentNo) - 2); + } + } + aryWaferInfo[2] = strFileEquipmentNo; + } + else + { + throw new Exception("不支援此檔案格式,Raw Data格式內容資料解析需為" + strMSplitSign); + } + } + + if (x == intWaferSize) // 4.取得Wafer尺寸 + { + // 2019/2/20, Ning, 以傳入的表頭分隔字元拆解 + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + strWaferSize = aryTemp[1].ToString().Trim(); + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(strWaferSize, 1) == Conversions.ToString('"') && Strings.Right(strWaferSize, 1) == Conversions.ToString('"')) + { + strWaferSize = Strings.Mid(strWaferSize, 2, Strings.Len(strWaferSize) - 2); + } + } + aryWaferInfo[3] = strWaferSize; + } + else + { + throw new Exception("不支援此檔案格式,Raw Data格式內容資料解析需為" + strMSplitSign); + } + } + + if (x == intThickness) // 5.取得厚度 + { + // 2019/2/20, Ning, 以傳入的表頭分隔字元拆解 + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + strThickness = aryTemp[1].ToString().Trim(); + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(strThickness, 1) == Conversions.ToString('"') && Strings.Right(strThickness, 1) == Conversions.ToString('"')) + { + strThickness = Strings.Mid(strThickness, 2, Strings.Len(strThickness) - 2); + } + } + aryWaferInfo[4] = strThickness; + } + else + { + throw new Exception("不支援此檔案格式,Raw Data格式內容資料解析需為" + strMSplitSign); + } + } + + if (x == intProgramNo) // 6.取得測試程式編號 + { + // 2019/2/20, Ning, 以傳入的表頭分隔字元拆解 + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + strProgramNo = aryTemp[1].ToString().Trim(); + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(strProgramNo, 1) == Conversions.ToString('"') && Strings.Right(strProgramNo, 1) == Conversions.ToString('"')) + { + strProgramNo = Strings.Mid(strProgramNo, 2, Strings.Len(strProgramNo) - 2); + } + } + aryWaferInfo[5] = strProgramNo; + } + else + { + throw new Exception("不支援此檔案格式,Raw Data格式內容資料解析需為" + strMSplitSign); + } + } + + if (!(dtFormat_Postion == null)) // 2021/3/11 Steven Mantis: 0088935: [SEMI_Wafer] AutoLoader測試資料動態參數收集優化_AutoLoader 電性值匯入調整 + { + if (dtFormat_Postion.Rows.Count > 0) + { + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + var loopTo1 = (short)(dtFormat_Postion.Rows.Count - 1); + for (i = 0; i <= loopTo1; i++) + { + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(x, dtFormat_Postion.Rows[i]["ColumnPosition"], false))) + { + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + dtFormat_Postion.Rows[i]["Value"] = aryTemp[1].ToString().Trim(); + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(Conversions.ToString(dtFormat_Postion.Rows[i]["Value"]), 1) == Conversions.ToString('"') && Strings.Right(Conversions.ToString(dtFormat_Postion.Rows[i]["Value"]), 1) == Conversions.ToString('"')) + { + dtFormat_Postion.Rows[i]["Value"] = Strings.Mid(Conversions.ToString(dtFormat_Postion.Rows[i]["Value"]), 2, Strings.Len(dtFormat_Postion.Rows[i]["Value"]) - 2); + } + } + } + // aryWaferInfo[5] = dtFormat_Postion.Rows(i)("Value") + else + { + throw new Exception("不支援此檔案格式,Raw Data格式內容資料解析需為" + strMSplitSign); + } + } + } + } + } + + if (x == intColumnStart) // 取得欄位名稱 + { + try + { + dtData = new DataTable("CSVData"); + + // 2021/5/20 Steven Mantis:0092711: [SEMI_Wafer] AutoLoader 設備電性匯入支援可收集非數值的電性值_AutoLoader 廠內設備電性值匯入調整 + // 找到所有非數值的欄位 + strSQL = "Select FieldName,DATATYPE From TBLEQPALSCRIPT_UnNumericField where EQUIPMENTNO = '" + EquipmentNo + "'and FILENAMEFORMAT = '" + FormatFile + "'"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + while (drTemp.Read()) + { + drData = dtUnNumeric.NewRow(); + drData["EquipmentNo"] = EquipmentNo; + drData["FileNameForMat"] = FormatFile; + drData["FieldName"] = drTemp["FieldName"].ToString(); + drData["DataType"] = drTemp["DATATYPE"].ToString(); + dtUnNumeric.Rows.Add(drData); + } + drTemp.Close(); + //cmmTemp.Dispose(); + + // 2019/2/20,Ning明細以strDSplitSign分隔 + // 若結尾為strDSplitSign則去掉 + if (strLine.EndsWith(strDSplitSign)) + { + strLine = strLine.TrimEnd(Conversions.ToChar(strDSplitSign)); + } + + aryTemp = strLine.Split(Conversions.ToChar(strDSplitSign)); + + drAdd = dtData.NewRow(); + var loopTo2 = (short)(aryTemp.Length - 1); + for (i = 0; i <= loopTo2; i++) + { + // 新增 Column + if (dtData.Columns.Count <= i) + { + + strOrgColName = aryTemp[i].ToString().ToUpper().Trim(); + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(strOrgColName, 1) == Conversions.ToString('"') && Strings.Right(strOrgColName, 1) == Conversions.ToString('"')) + { + strOrgColName = Strings.Mid(strOrgColName, 2, Strings.Len(strOrgColName) - 2); + } + } + + strColumnName = strOrgColName; + + // 判斷檔案內是否有存在設定的非數值欄位 + if (dtUnNumeric.Rows.Count > 0) + { + var loopTo3 = (short)(dtUnNumeric.Rows.Count - 1); + for (a = 0; a <= loopTo3; a++) + { + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtUnNumeric.Rows[a]["FieldName"], strColumnName, false))) + { + dtUnNumeric.Rows[a]["Exist"] = true; + } + } + } + + blnMustConvert = false; + // 2021/4/29,Ning,91736 AutoLoader 欄位名稱若有包含非數值及字元或_, 則至欄名轉換中找, 找不到則報錯 + // 第一個字必須為字元, 不為字元必須轉換 + if (char.IsLetter(Conversions.ToChar(strColumnName.Substring(0, 1)))) + { + for (int jj = 0, loopTo4 = strColumnName.Length - 1; jj <= loopTo4; jj++) + { + if (!char.IsNumber(Conversions.ToChar(strColumnName.Substring(jj, 1))) && !char.IsLetter(Conversions.ToChar(strColumnName.Substring(jj, 1))) && strColumnName.Substring(jj, 1) != "_") + { + blnMustConvert = true; + break; + } + } + } + else + { + blnMustConvert = true; + } + if (blnMustConvert) + { + strSQL = "Select ConversionField From tblSYSFieldConvertBasis where DocumentField = '" + strColumnName.ToUpper() + "'"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + strColumnName = Conversions.ToString(drTemp["ConversionField"]); + } + else + { + throw new Exception("解析檔案失敗,檔案欄位: " + strColumnName + " 含有特殊字元但未設定欄名轉換, 請檢查檔案:" + FileName); + } + drTemp.Close(); + //cmmTemp.Dispose(); + } + + // '欄位名稱只能是數字或英文字母, 這兩者除外的皆以_取代 + // For jj As Integer = 0 To strColumnName.Length - 1 + // If Not Char.IsNumber(strColumnName.Substring(jj, 1)) AndAlso Not Char.IsLetter(strColumnName.Substring(jj, 1)) Then + // strColumnName = Replace(strColumnName, strColumnName.Substring(jj, 1), "_") + // End If + // Next + + if (string.IsNullOrEmpty(strColumnName)) + { + strColumnName = "COL" + i; + } + + // 判斷取代後的欄位是否已存在,若已存在則於欄位後方加COL+欄位顯示順序 + if (dtData.Columns.Contains(strColumnName)) + { + strColumnName = strColumnName + "COL" + i; + } + + // Memory Table欄位開String + dtData.Columns.Add(strColumnName.ToUpper(), Type.GetType("System.String")); + + } + } + } + + catch + { + throw; + } + } + + if (x == intDataStart || blnDataAdd == true) // 取得Raw Data資料 + { + blnDataAdd = true; + + try + { + aryTemp = strLine.Split(Conversions.ToChar(strDSplitSign)); + + drAdd = dtData.NewRow(); + // 填入資料 + var loopTo5 = (short)(dtData.Columns.Count - 1); + for (i = 0; i <= loopTo5; i++) + { + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(aryTemp[i], 1) == Conversions.ToString('"') && Strings.Right(aryTemp[i], 1) == Conversions.ToString('"')) + { + aryTemp[i] = Strings.Mid(aryTemp[i], 2, Strings.Len(aryTemp[i]) - 2); + } + } + drAdd[i] = Strings.Trim(aryTemp[i]); + } + dtData.Rows.Add(drAdd); + } + catch (Exception ex) + { + throw; + } + } + + } + } + TotalRows = TotalRows - intDataStart; // 計算所有筆數 + + if ((strFileEquipmentNo ?? "") != defString && (EquipmentNo ?? "") != (strFileEquipmentNo ?? "")) + { + throw new Exception("檔案內容設備編號與EAP上傳設備編號不符"); + } + // If LotNo <> strFileLotNo Then + // Throw New System.Exception("檔案內容生產批批號與EAP上傳生產批批號不符") + // End If + + // 若intWaferID=0, 則WaferID為檔名(去除副檔名) + if (intWaferID == 0) + { + strWaferID = FileName.Substring(0, FileName.LastIndexOf(".")); + aryWaferInfo[0] = strWaferID; + } + // 2019/5/28,Ning, WaferID不為數值, Ex. -,2,3-9 + if (!Information.IsNumeric(strWaferIDPos)) + { + string[] aryWaferID, aryChar; + string strSplitChar; + int intPart, intLength; + strWaferID = FileName.Substring(0, FileName.LastIndexOf(".")); + aryWaferID = strWaferIDPos.Split(','); + strSplitChar = aryWaferID[0]; + intPart = Conversions.ToInteger(aryWaferID[1]); + aryChar = aryWaferID[2].Split('-'); + intLength = (int)Math.Round(Conversions.ToDouble(aryChar[1]) - Conversions.ToDouble(aryChar[0]) + 1d); + aryWaferID = strWaferID.Split(Conversions.ToChar(strSplitChar)); + strWaferID = Strings.Mid(aryWaferID[intPart - 1], Conversions.ToInteger(aryChar[0]), intLength); + aryWaferInfo[0] = strWaferID; + } + // 若TestDate為空則以目前時間為TestDate + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(aryWaferInfo[1], defString, false))) + { + aryWaferInfo[1] = Strings.Format(DateTime.Now, "yyyy/MM/dd hh:mm:ss"); + } + // 若ProgramNo為空, 則以N/A代入 + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(aryWaferInfo[5], defString, false))) + { + aryWaferInfo[5] = "N/A"; + } + + // 取得比對LotNo + strSQL = "Select A.LotNo From tblWIPComponentState A, tblWIPLotState B Where A.LotNo = B.LotNo And A.ComponentNo = '" + strWaferID + "'" + " And B.Status In (0,1,2,3,4,5)"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + // LotNo = drTemp("LotNo") + // 2021/3/17 Steven 此元件不屬於該LotNo + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectNotEqual(LotNo, drTemp["LotNo"], false))) + { + throw new Exception("解析檔案失敗,ComponentNo: " + strWaferID + " 此元件不屬於該 LotNo,請檢查檔案:" + FileName); + } + } + else + { + throw new Exception("解析檔案失敗,ComponentNo: " + strWaferID + " 無法找到對應的 LotNo,請檢查檔案:" + FileName); + } + drTemp.Close(); + //cmmTemp.Dispose(); + + + strSQLColumn = ""; + foreach (DataColumn column in dtData.Columns) + { + // strSQLColumn = strSQLColumn + column.ColumnName & " VARCHAR2(50)," + // 欄位皆以NUMBER(38,15)儲存運算 + bool isString = false; + bool isDateTime = false; + var loopTo6 = (short)(dtUnNumeric.Rows.Count - 1); + for (z = 0; z <= loopTo6; z++) + { + if ((column.ColumnName ?? "") == (dtUnNumeric.Rows[z]["FieldName"].ToString() ?? "")) + { + if (dtUnNumeric.Rows[z]["DataType"].ToString() == "0") + { + isString = true; + } + else if (dtUnNumeric.Rows[z]["DataType"].ToString() == "2") + { + isDateTime = true; + } + dtUnNumeric.Rows[z]["Index"] = i; + } + } + if (isString) + { + strSQLColumn = strSQLColumn + "\"" + column.ColumnName + "\"" + " VARCHAR2(100),"; + } + else if (isDateTime) + { + strSQLColumn = strSQLColumn + "\"" + column.ColumnName + "\"" + " DATE,"; + } + else + { + strSQLColumn = strSQLColumn + "\"" + column.ColumnName + "\"" + " NUMBER(38,15),"; + } + } + + if (Strings.InStr(1, strSQLColumn, ",") != 0) // 刪除最後一個"," + { + if (Strings.Right(strSQLColumn, 1) == ",") + { + strSQLColumn = Strings.Mid(strSQLColumn, 1, Strings.Len(strSQLColumn) - 1); + } + } + + // 指定暫存資料 Temp_機台編號 + if (EquipmentNo.Contains("-")) + { + strTableName = "Temp" + "_" + Strings.Mid(EquipmentNo.Replace("-", "_"), 1, 10) + "_" + Strings.Format(DateTime.Now, "mmssff"); + } + else + { + strTableName = "Temp" + "_" + Strings.Mid(EquipmentNo, 1, 10) + "_" + Strings.Format(DateTime.Now, "mmssff"); + } + + if (blnStoreRawData) + { + // 要儲存RawData,則將TempTable開在TestData那一組Connection中 + try + { + strTestCnnString = objSetting.GetConnectionString_DY("TestDataConnectionString", "TestDataDatabasePassword"); + strTestDBType = objSetting.GetDataBaseType_DY("TestDataDatabaseType"); + strTestDBOwner = strDataBaseTestOwner; + } + catch + { + strTestCnnString = null; + strTestDBType = null; + strTestDBOwner = null; + } + + // 取不到TestData相關連線時以MES連線取代之 + if (string.IsNullOrEmpty(strTestCnnString) || string.IsNullOrEmpty(strTestDBType) || string.IsNullOrEmpty(strTestDBOwner)) + { + strTestCnnString = strConnectionString; + strTestDBType = strDataBaseType; + strTestDBOwner = strDataBaseMesOwner; + } + } + else + { + // 不存RawData, 則開立在MES的DB中 + strTestCnnString = strConnectionString; + strTestDBType = strDataBaseType; + strTestDBOwner = strDataBaseMesOwner; + } + + // //Create connection + cnnTest = CreateConnection(strTestCnnString); + + // 先刪除Table,若出錯用try...catch避開 + try + { + //strSQL = "Select Table_Name From User_Tables Where Table_Name = '" + strTableName.ToUpper() + "'"; + ////cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTest); + //drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTest); + DataTable dtTableTemp = GetSchema_Tables(cnnTest, strTestDBOwner, strTableName.ToUpper()); + if (!(dtTableTemp == null) && dtTableTemp.Rows.Count > 0) + { + strSQL = " Drop Table " + strTableName; + ExecuteSQLNoneQuery_NoLimitRows(strTestDBType, strTestCnnString, ref strSQL); + // CollectionSQL.Add(strSQL) + } + //drTemp.Close(); + //cmmTemp.Dispose(); + // Create 暫存Table + // 2018/05/14 Josh 增加WaferID欄位 + // strSQL = " Create Table " & strTableName & "(SequenceNo NUMBER(20),WaferID VARCHAR2(20), " & strSQLColumn & ")" + // 2018/11/6, Ning 使用 Oracle Temporary Table + // strSQL = " Create Global Temporary Table " & strTableName & "(SequenceNo NUMBER(20),WaferID VARCHAR2(30), " & strSQLColumn & ")" + // 2021/3/29,Ning,89890: [SEMI_Wafer]AutoLoader 測試原始數據收集_設備AutoLoader 電性值匯入調整:改為實體TempTable + if (strTestDBType == "mssql") + { + strSQL = " Create Table " + strTableName + "(SequenceNo int,WaferID VARCHAR(30), " + strSQLColumn + ")"; + } + else + { + strSQL = " Create Table " + strTableName + "(SequenceNo NUMBER(20),WaferID VARCHAR2(30), " + strSQLColumn + ")"; + } + ExecuteSQLNoneQuery_NoLimitRows(strTestDBType, strTestCnnString, ref strSQL); + colTableName.Add(strTableName); + } + // CollectionSQL.Add(strSQL) + catch (Exception ex) + { + throw ex; + } + + // 寫入Raw Data + strSQLAddField = "Insert into " + strTableName + " ("; + strSQLAddValue = " Values ("; + // 2021/3/11 Steven Mantis:0088935: [SEMI_Wafer] AutoLoader測試資料動態參數收集優化_AutoLoader 電性值匯入調整 + // If Not IsNothing(dtFormat_Postion) Then + // For j As Integer = 0 To dtFormat_Postion.Rows.Count - 1 + // If dtFormat_Postion.Rows(j)("AssignFile") = 1 Then + // dtData.Columns.Add(dtFormat_Postion.Rows(j)("ColumnName").ToString, System.Type.GetType("System.String")) + // End If + // Next + // End If + // For Each column As DataColumn In dtData.Columns + // If dtFormat_Postion.Rows.Count > 0 Then + // For idx As Integer = 0 To dtFormat_Postion.Rows.Count - 1 + // If column.ColumnName = dtFormat_Postion.Rows(idx)("ColumnName").ToString Then + // For k As Integer = 0 To dtData.Rows.Count - 1 + // dtData.Rows(k)(dtFormat_Postion.Rows(idx)("ColumnName").ToString) = dtFormat_Postion.Rows(idx)("Value").ToString + // Next + // End If + // Next + // End If + // Next + + for (int j = 0, loopTo7 = dtData.Rows.Count - 1; j <= loopTo7; j++) + { + + // 增加流水號 + strSQLAddField = strSQLAddField + "SequenceNo,"; + strSQLAddValue = strSQLAddValue + (j + 1) + ","; + + // 增加WaferID + strSQLAddField = strSQLAddField + "WaferID,"; + strSQLAddValue = strSQLAddValue + "'" + strWaferID + "',"; + + // 2019/6/5,Ning,以下程式取自錸創, 但實測後都會跑到"System.String"中, 以String的方式加入, 程式先保留不做調整 + var loopTo8 = (short)(dtData.Columns.Count - 1); + for (i = 0; i <= loopTo8; i++) + { + // 2019/6/12,Ning,非數值的欄位皆填definteger,因非數值的欄位不做運算, 只是方便填入TempTable中 + // 非數值欄位寫入 + WriteString = false; + WriteDate = false; + if (dtUnNumeric.Rows.Count > 0) + { + var loopTo9 = (short)(dtUnNumeric.Rows.Count - 1); + for (z = 0; z <= loopTo9; z++) + { + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtData.Columns[i].ColumnName, dtUnNumeric.Rows[z]["FieldName"], false)) && Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtUnNumeric.Rows[z]["Exist"], true, false)) && Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtUnNumeric.Rows[z]["DataType"], 0, false))) + { + WriteString = true; + } + else if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtData.Columns[i].ColumnName, dtUnNumeric.Rows[z]["FieldName"], false)) && Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtUnNumeric.Rows[z]["Exist"], true, false)) && Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtUnNumeric.Rows[z]["DataType"], 2, false))) // Date + { + WriteDate = true; + } + } + } + // 非數值欄位寫入 + if (WriteString) // String + { + strSQLAddField = strSQLAddField + "\"" + dtData.Columns[i].ColumnName.ToString() + "\","; + if (string.IsNullOrEmpty(dtData.Rows[j][i].ToString())) + { + strSQLAddValue = strSQLAddValue + "'',"; + } + else + { + strSQLAddValue = strSQLAddValue + "'" + dtData.Rows[j][i].ToString() + "',"; + } + } + else if (WriteDate) + { + strSQLAddField = strSQLAddField + "\"" + dtData.Columns[i].ColumnName.ToString() + "\","; + if (string.IsNullOrEmpty(dtData.Rows[j][i].ToString())) + { + strSQLAddValue = strSQLAddValue + "'',"; + } + else + { + strSQLAddValue = strSQLAddValue + "To_Date('" + Strings.Format(Conversions.ToDate(dtData.Rows[j][i].ToString()), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),"; + } + } + else + { + // 數值: + strSQLAddField = strSQLAddField + "\"" + dtData.Columns[i].ColumnName.ToString() + "\","; + if (string.IsNullOrEmpty(dtData.Rows[j][i].ToString()) || !Information.IsNumeric(dtData.Rows[j][i])) + { + strSQLAddValue = strSQLAddValue + "'',"; + } + else + { + strSQLAddValue = strSQLAddValue + "" + dtData.Rows[j][i].ToString() + ","; + } + } + + // If Not IsNumeric(dtData.Rows(j).Item(i).ToString) Then + // '2021/4/8,Ning,當不為數值時, 不填入這個欄位的值 + // 'strSQLAddField = strSQLAddField & """" & dtData.Columns(i).ColumnName.ToString & """," + // 'strSQLAddValue = strSQLAddValue & "'" & defInteger & "'," + // Else + // strSQLAddField = strSQLAddField & """" & dtData.Columns(i).ColumnName.ToString & """," + // strSQLAddValue = strSQLAddValue & "'" & dtData.Rows(j).Item(i).ToString & "'," + // End If + // Select Case dtData.Rows(j).Item(i).GetType.ToString + // Case "System.String" + // strSQLAddField = strSQLAddField & """" & dtData.Columns(i).ColumnName.ToString & """," + // strSQLAddValue = strSQLAddValue & "'" & dtData.Rows(j).Item(i).ToString & "'," + // Case "System.Decimal" + // strSQLAddField = strSQLAddField & dtData.Columns(i).ColumnName.ToString & "," + // strSQLAddValue = strSQLAddValue & dtData.Rows(j).Item(i).ToString & "," + // Case "System.DateTime" + // strSQLAddField = strSQLAddField & dtData.Columns(i).ColumnName.ToString & "," + // strSQLAddValue = strSQLAddValue & "To_Date('" & Format(dtData.Rows(j).Item(i), "yyyy/MM/dd H:mm:ss") & "','YYYY/MM/DD HH24:MI:SS')," + // Case "System.DBNull" + // '未處理 + // End Select + + } + // Steven Manits:0088935: [SEMI_Wafer] AutoLoader測試資料動態參數收集優化_AutoLoader 電性值匯入調整 + // 表頭的非固定欄位,需寫入電性資料表 + + if (Strings.InStr(1, strSQLAddField, ",") != 0) // 刪除最後一個"," + { + if (Strings.Right(strSQLAddField, 1) == ",") + { + strSQLAddField = Strings.Mid(strSQLAddField, 1, Strings.Len(strSQLAddField) - 1); + } + } + + if (Strings.InStr(1, strSQLAddValue, ",") != 0) // 刪除最後一個"," + { + if (Strings.Right(strSQLAddValue, 1) == ",") + { + strSQLAddValue = Strings.Mid(strSQLAddValue, 1, Strings.Len(strSQLAddValue) - 1); + } + } + + // 直接給定strSQL + strSQL = strSQLAddField + ")" + strSQLAddValue + ")"; + + // //新增一筆Data指令加入集合內 + CollectionSQL.Add(strSQL); + + strSQLAddField = "Insert into " + strTableName + " ("; + strSQLAddValue = " Values ("; + + } + + // //執行SQL指令 + ExecuteSQLNoneQuery_UPD_NoLimitRows(strTestDBType, strTestCnnString, CollectionSQL); + + objReader.Close(); + + blnResult = true; + } + + catch (Exception ex) + { + throw; + } + + finally + { + CloseConnection(cnnTemp); + CloseConnection(cnnTest); + objReader.Close(); + objReader = null; + aryTemp = null; + } + + return blnResult; + + } + + /// + /// + /// + /// 原vb預設值false + /// 原vb預設值0 + /// + /// + private bool fuRawDataToTempTable_EQP_UploadFile_BigFile(string pFilePath, string strMSplitSign, string strDSplitSign, + string strWaferIDPos, int intTestDate, + int intEquipmentNo, int intWaferSize, + int intThickness, int intProgramNo, + int intColumnStart, string strDataStartPos, + ref string[] aryWaferInfo, string EquipmentNo, + string LotNo, string FileName, + long SplitRecordsLimit, ref string strTableName, + bool blnStoreRawData, ref DataTable dtData, + string JobNo, string JobFunction, + string FilePath, int FileSize, string SequenceNo, + ref bool blnSplitPartialSuccess, ref int TotalRows, + DataTable dtFormat_Postion = null, int StartRow = defInteger, + string FormatFile = defString) + { + + bool blnResult; + var objReader = default(StreamReader); + // 2019/3/26, Ning, 加入Encode, 排除中文亂碼問題 + // 2019/3/28, Ning, TestDate預設為目前時間, ProgramNo預設為N/A + // Dim encode As System.Text.Encoding = System.Text.Encoding.GetEncoding("UTF-8") + var encode = Encoding.Default; + string strLine; + var strWaferID = default(string); + var strTestDate = default(string); + string strFileEquipmentNo = defString; + string strWaferSize = "N/A"; + string strThickness = "N/A"; + string strProgramNo = "N/A"; + string[] aryTemp; + // Dim dtData As DataTable + short i; + bool blnDataAdd = false; + string strOrgColName, strColumnName; + string strSQL, strSQLColumn, strSQLAddField, strSQLAddValue; + var CollectionSQL = new Collection(); + + IDbConnection cnnTemp = default(IDbConnection), cnnTest = default(IDbConnection); + DbDataReader drTemp; + + int intWaferID = defInteger; + int intDataStart = defInteger; + int x = 0; + short z; + short a; + int idx = 0; + int intSeq = 1; + var oSQLContent = new Dictionary(); + uint intSQLIndex = 1U; + + var arySequence = new int[(int)(SplitRecordsLimit - 1L + 1)]; + var aryCol = new decimal[501][]; + // 2021/5/21 分包允許寫入空值與非數值資料 + var aryCol_String = new string[501][]; + var aryCol_DateTime = new DateTime[501][]; + int StringCount = 0; + int DateCount = 0; + bool WriteString = false; + bool WriteDate = false; + var dtUnNumeric = new DataTable("UnNumeric"); + DataRow drData; + + string strTestCnnString = default(string), strTestDBType = default(string), strTestDBOwner = ""; + bool blnMustConvert; + blnSplitPartialSuccess = false; + TotalRows = 0; + int intRow = 0; + var datStartTime = DateTime.Now; + string strFailMessage = defString; + string strlotNo = "N/A"; + strTableName = ""; // 避免跑回圈重複讀取 + try + { + // //Create connection + cnnTemp = CreateConnection(strConnectionString); + + blnResult = false; + + objReader = new StreamReader(pFilePath, encode); + // 先讀取第一列, 再以第一列的編碼方式讀檔 + strLine = objReader.ReadLine().Trim(); + encode = objReader.CurrentEncoding; + objReader.Close(); + objReader = null; + objReader = new StreamReader(pFilePath, encode); + + // 當WaferID位置為數值時, 同原本處理方式取得檔案內的WaferID + if (Information.IsNumeric(strWaferIDPos)) + { + intWaferID = Conversions.ToInteger(strWaferIDPos); + } + + dtUnNumeric.Columns.Add("EquipmentNo", Type.GetType("System.String")); + dtUnNumeric.Columns.Add("FileNameFormat", Type.GetType("System.String")); + dtUnNumeric.Columns.Add("FieldName", Type.GetType("System.String")); + dtUnNumeric.Columns.Add("DataType", Type.GetType("System.Int16")); + dtUnNumeric.Columns.Add("Index", Type.GetType("System.Int16")); // 紀錄非數值欄位在excel的index + dtUnNumeric.Columns.Add("Exist", Type.GetType("System.Boolean")); // 紀錄EXCEL是否存在檔案內 + + // 當DataStart位置為數值時, 同原本處理方式 + if (Information.IsNumeric(strDataStartPos)) + { + intDataStart = Conversions.ToInteger(strDataStartPos); + } + else // 非數值, 先掃一次檔案, 找到固定字串的列數+1為intDataStart + { + x = 0; + while (!objReader.EndOfStream) + { + x = x + 1; + strLine = objReader.ReadLine(); + if ((strLine.ToUpper() ?? "") == (strDataStartPos.ToUpper() ?? "")) + { + intDataStart = x + 1; + break; + } + } + objReader.Close(); + objReader = null; + objReader = new StreamReader(pFilePath, encode); + } + + if (StartRow != defInteger) // 未完成的資料,分包筆數必須加上已完成筆數 + { + intDataStart = StartRow + intDataStart - 1; // 應該要加上DataStart + // 如果intDataStart 1) + { + strWaferID = aryTemp[1].ToString().Trim(); + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(strWaferID, 1) == Conversions.ToString('"') && Strings.Right(strWaferID, 1) == Conversions.ToString('"')) + { + strWaferID = Strings.Mid(strWaferID, 2, Strings.Len(strWaferID) - 2); + } + } + if (string.IsNullOrEmpty(strWaferID)) + { + throw new Exception("無法取得WaferID!!"); + } + else + { + aryWaferInfo[0] = strWaferID; + } + // 找出lotNo: + strSQL = "Select A.LotNo From tblWIPComponentState A, tblWIPLotState B Where A.LotNo = B.LotNo And A.ComponentNo = '" + strWaferID + "'" + " And B.Status In (0,1,2,3,4,5)"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + // 如有找到資料,代表未處理完 + if (drTemp.Read()) + strlotNo = Conversions.ToString(drTemp["LotNo"]); + drTemp.Close(); + //cmmTemp.Dispose(); + } + else + { + throw new Exception("不支援此檔案格式,Raw Data格式內容資料解析需為" + strMSplitSign); + } + } + + if (x == intTestDate) // 2.取得測試時間 + { + // 2019/2/20, Ning, 以傳入的表頭分隔字元拆解 + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + // 因日期格式中可能有/或:會作為分隔符號, 需特別處理 + if (strMSplitSign == ":" || strMSplitSign == "/") + { + for (int k = 1, loopTo = aryTemp.Length - 1; k <= loopTo; k++) + strTestDate = strTestDate + aryTemp[k].ToString().Trim() + strMSplitSign; + // 刪除最後的分隔符號":"或"/" + // 2019/6/26, Ning, 若分隔符號太多, 有多餘的分隔符號, 會不只一個 :或/ + while ((Strings.Right(strTestDate, 1) ?? "") == (strMSplitSign ?? "")) + strTestDate = Strings.Mid(strTestDate, 1, Strings.Len(strTestDate) - 1); + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(strTestDate, 1) == Conversions.ToString('"') && Strings.Right(strTestDate, 1) == Conversions.ToString('"')) + { + strTestDate = Strings.Mid(strTestDate, 2, Strings.Len(strTestDate) - 2); + } + } + aryWaferInfo[1] = strTestDate; + } + else + { + strTestDate = aryTemp[1].ToString().Trim(); + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(strTestDate, 1) == Conversions.ToString('"') && Strings.Right(strTestDate, 1) == Conversions.ToString('"')) + { + strTestDate = Strings.Mid(strTestDate, 2, Strings.Len(strTestDate) - 2); + } + } + aryWaferInfo[1] = strTestDate; + } + } + else + { + throw new Exception("不支援此檔案格式,Raw Data格式內容資料解析需為" + strMSplitSign); + } + } + + if (x == intEquipmentNo) // 3.取得設備編號 + { + // 2019/2/20, Ning, 以傳入的表頭分隔字元拆解 + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + strFileEquipmentNo = aryTemp[1].ToString().Trim(); + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(strFileEquipmentNo, 1) == Conversions.ToString('"') && Strings.Right(strFileEquipmentNo, 1) == Conversions.ToString('"')) + { + strFileEquipmentNo = Strings.Mid(strFileEquipmentNo, 2, Strings.Len(strFileEquipmentNo) - 2); + } + } + aryWaferInfo[2] = strFileEquipmentNo; + + if ((strFileEquipmentNo ?? "") != defString && (EquipmentNo ?? "") != (strFileEquipmentNo ?? "")) + { + throw new Exception("檔案內容設備編號與EAP上傳設備編號不符"); + } + } + else + { + throw new Exception("不支援此檔案格式,Raw Data格式內容資料解析需為" + strMSplitSign); + } + } + + if (x == intWaferSize) // 4.取得Wafer尺寸 + { + // 2019/2/20, Ning, 以傳入的表頭分隔字元拆解 + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + strWaferSize = aryTemp[1].ToString().Trim(); + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(strWaferSize, 1) == Conversions.ToString('"') && Strings.Right(strWaferSize, 1) == Conversions.ToString('"')) + { + strWaferSize = Strings.Mid(strWaferSize, 2, Strings.Len(strWaferSize) - 2); + } + } + aryWaferInfo[3] = strWaferSize; + } + else + { + throw new Exception("不支援此檔案格式,Raw Data格式內容資料解析需為" + strMSplitSign); + } + } + + if (x == intThickness) // 5.取得厚度 + { + // 2019/2/20, Ning, 以傳入的表頭分隔字元拆解 + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + strThickness = aryTemp[1].ToString().Trim(); + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(strThickness, 1) == Conversions.ToString('"') && Strings.Right(strThickness, 1) == Conversions.ToString('"')) + { + strThickness = Strings.Mid(strThickness, 2, Strings.Len(strThickness) - 2); + } + } + aryWaferInfo[4] = strThickness; + } + else + { + throw new Exception("不支援此檔案格式,Raw Data格式內容資料解析需為" + strMSplitSign); + } + } + + if (x == intProgramNo) // 6.取得測試程式編號 + { + // 2019/2/20, Ning, 以傳入的表頭分隔字元拆解 + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + strProgramNo = aryTemp[1].ToString().Trim(); + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(strProgramNo, 1) == Conversions.ToString('"') && Strings.Right(strProgramNo, 1) == Conversions.ToString('"')) + { + strProgramNo = Strings.Mid(strProgramNo, 2, Strings.Len(strProgramNo) - 2); + } + } + aryWaferInfo[5] = strProgramNo; + } + else + { + throw new Exception("不支援此檔案格式,Raw Data格式內容資料解析需為" + strMSplitSign); + } + } + + if (!(dtFormat_Postion == null)) // 2021/3/11 Steven Mantis: 0088935: [SEMI_Wafer] AutoLoader測試資料動態參數收集優化_AutoLoader 電性值匯入調整 + { + if (dtFormat_Postion.Rows.Count > 0) + { + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + var loopTo1 = (short)(dtFormat_Postion.Rows.Count - 1); + for (i = 0; i <= loopTo1; i++) + { + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(x, dtFormat_Postion.Rows[i]["ColumnPosition"], false))) + { + aryTemp = strLine.Split(Conversions.ToChar(strMSplitSign)); + if (aryTemp.Length > 1) + { + dtFormat_Postion.Rows[i]["Value"] = aryTemp[1].ToString().Trim(); + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(Conversions.ToString(dtFormat_Postion.Rows[i]["Value"]), 1) == Conversions.ToString('"') && Strings.Right(Conversions.ToString(dtFormat_Postion.Rows[i]["Value"]), 1) == Conversions.ToString('"')) + { + dtFormat_Postion.Rows[i]["Value"] = Strings.Mid(Conversions.ToString(dtFormat_Postion.Rows[i]["Value"]), 2, Strings.Len(dtFormat_Postion.Rows[i]["Value"]) - 2); + } + } + } + // aryWaferInfo[5] = dtFormat_Postion.Rows(i)("Value") + else + { + throw new Exception("不支援此檔案格式,Raw Data格式內容資料解析需為" + strMSplitSign); + } + } + } + } + } + + if (x == intColumnStart) // 取得欄位名稱 + { + try + { + dtData = new DataTable("CSVData"); + + + // 2021/5/20 Steven Mantis:0092711: [SEMI_Wafer] AutoLoader 設備電性匯入支援可收集非數值的電性值_AutoLoader 廠內設備電性值匯入調整 + // 找到所有非數值的欄位 + strSQL = Conversions.ToString("Select FieldName,DATATYPE From TBLEQPALSCRIPT_UnNumericField where EQUIPMENTNO = '" + + aryWaferInfo[2] + "'and FILENAMEFORMAT = '" + FormatFile + "'"); + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + while (drTemp.Read()) + { + drData = dtUnNumeric.NewRow(); + drData["EquipmentNo"] = aryWaferInfo[2]; + drData["FileNameForMat"] = FormatFile; + drData["FieldName"] = drTemp["FieldName"].ToString(); + drData["DataType"] = drTemp["DATATYPE"].ToString(); + dtUnNumeric.Rows.Add(drData); + } + drTemp.Close(); + //cmmTemp.Dispose(); + + // 2019/2/20,Ning明細以strDSplitSign分隔 + // 若結尾為strDSplitSign則去掉 + if (strLine.EndsWith(strDSplitSign)) + { + strLine = strLine.TrimEnd(Conversions.ToChar(strDSplitSign)); + } + + aryTemp = strLine.Split(Conversions.ToChar(strDSplitSign)); + + var loopTo2 = (short)(aryTemp.Length - 1); + for (i = 0; i <= loopTo2; i++) + { + // 新增 Column + if (dtData.Columns.Count <= i) + { + + strOrgColName = aryTemp[i].ToString().ToUpper().Trim(); + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(strOrgColName, 1) == Conversions.ToString('"') && Strings.Right(strOrgColName, 1) == Conversions.ToString('"')) + { + strOrgColName = Strings.Mid(strOrgColName, 2, Strings.Len(strOrgColName) - 2); + } + } + + strColumnName = strOrgColName; + + // 判斷檔案內是否有存在設定的非數值欄位 + if (dtUnNumeric.Rows.Count > 0) + { + var loopTo3 = (short)(dtUnNumeric.Rows.Count - 1); + for (a = 0; a <= loopTo3; a++) + { + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtUnNumeric.Rows[a]["FieldName"], strColumnName, false))) + { + dtUnNumeric.Rows[a]["Exist"] = true; + } + } + } + + blnMustConvert = false; + // 2021/4/29,Ning,91736 AutoLoader 欄位名稱若有包含非數值及字元或_, 則至欄名轉換中找, 找不到則報錯 + // 第一個字必須為字元, 不為字元必須轉換 + if (char.IsLetter(Conversions.ToChar(strColumnName.Substring(0, 1)))) + { + for (int jj = 0, loopTo4 = strColumnName.Length - 1; jj <= loopTo4; jj++) + { + if (!char.IsNumber(Conversions.ToChar(strColumnName.Substring(jj, 1))) && !char.IsLetter(Conversions.ToChar(strColumnName.Substring(jj, 1))) && strColumnName.Substring(jj, 1) != "_") + { + blnMustConvert = true; + break; + } + } + } + else + { + blnMustConvert = true; + } + if (blnMustConvert) + { + strSQL = "Select ConversionField From tblSYSFieldConvertBasis where DocumentField = '" + strColumnName.ToUpper() + "'"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + strColumnName = Conversions.ToString(drTemp["ConversionField"]); + } + else + { + throw new Exception("解析檔案失敗,檔案欄位: " + strColumnName + " 含有特殊字元但未設定欄名轉換, 請檢查檔案:" + FileName); + } + drTemp.Close(); + //cmmTemp.Dispose(); + } + + // '欄位名稱只能是數字或英文字母, 這兩者除外的皆以_取代 + // For jj As Integer = 0 To strColumnName.Length - 1 + // If Not Char.IsNumber(strColumnName.Substring(jj, 1)) AndAlso Not Char.IsLetter(strColumnName.Substring(jj, 1)) Then + // strColumnName = Replace(strColumnName, strColumnName.Substring(jj, 1), "_") + // End If + // Next + + if (string.IsNullOrEmpty(strColumnName)) + { + strColumnName = "COL" + i; + } + + // 判斷取代後的欄位是否已存在,若已存在則於欄位後方加COL+欄位顯示順序 + if (dtData.Columns.Contains(strColumnName)) + { + strColumnName = strColumnName + "COL" + i; + } + + // Memory Table欄位開String + dtData.Columns.Add(strColumnName.ToUpper(), Type.GetType("System.String")); + + } + } + } + + catch + { + throw; + } + } + + if (x == intDataStart || blnDataAdd == true) // 取得Raw Data資料 + { + blnDataAdd = true; + + // 在開始組第一筆Insert SQL前需先開立資料表 + if (x == intDataStart) + { + + // 若intWaferID=0, 則WaferID為檔名(去除副檔名) + if (intWaferID == 0) + { + strWaferID = FileName.Substring(0, FileName.LastIndexOf(".")); + aryWaferInfo[0] = strWaferID; + } + // 2019/5/28,Ning, WaferID不為數值, Ex. -,2,3-9 + if (!Information.IsNumeric(strWaferIDPos)) + { + string[] aryWaferID, aryChar; + string strSplitChar; + int intPart, intLength; + strWaferID = FileName.Substring(0, FileName.LastIndexOf(".")); + aryWaferID = strWaferIDPos.Split(','); + strSplitChar = aryWaferID[0]; + intPart = Conversions.ToInteger(aryWaferID[1]); + aryChar = aryWaferID[2].Split('-'); + intLength = (int)Math.Round(Conversions.ToDouble(aryChar[1]) - Conversions.ToDouble(aryChar[0]) + 1d); + aryWaferID = strWaferID.Split(Conversions.ToChar(strSplitChar)); + strWaferID = Strings.Mid(aryWaferID[intPart - 1], Conversions.ToInteger(aryChar[0]), intLength); + aryWaferInfo[0] = strWaferID; + } + // 若TestDate為空則以目前時間為TestDate + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(aryWaferInfo[1], defString, false))) + { + aryWaferInfo[1] = Strings.Format(DateTime.Now, "yyyy/MM/dd hh:mm:ss"); + } + // 若ProgramNo為空, 則以N/A代入 + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(aryWaferInfo[5], defString, false))) + { + aryWaferInfo[5] = "N/A"; + } + // 若未傳入EquipmentNo, 則用Parameter1的值填入 + // 2019/7/9,Ning, aryWaferInfo[2]存的是檔案內的EquipmentNo, 檔案內沒有就維持預設值, 不存入XML中的EquipmentNo + if (aryWaferInfo[2] == null || string.IsNullOrEmpty(aryWaferInfo[2].ToString().Trim())) + { + aryWaferInfo[2] = EquipmentNo; + } + + // 取得比對LotNo + strSQL = "Select A.LotNo From tblWIPComponentState A, tblWIPLotState B Where A.LotNo = B.LotNo And A.ComponentNo = '" + strWaferID + "'" + " And B.Status In (0,1,2,3,4,5)"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + // 2021/3/17 Steven 此元件不屬於該LotNo + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectNotEqual(LotNo, drTemp["LotNo"], false))) + { + throw new Exception("解析檔案失敗,ComponentNo: " + strWaferID + " 此元件不屬於該 LotNo,請檢查檔案:" + FileName); + } + } + else + { + throw new Exception("解析檔案失敗,ComponentNo: " + strWaferID + " 無法找到對應的 LotNo,請檢查檔案:" + FileName); + } + drTemp.Close(); + //cmmTemp.Dispose(); + + strSQLColumn = ""; + DataRow[] drSel; + if (dtUnNumeric.Rows.Count > 0) // 找出存在於檔案中的非數值欄位 + { + drSel = dtUnNumeric.Select("Exist = " + true + " And DataType = 0"); // String + StringCount = drSel.Length; + drSel = dtUnNumeric.Select("Exist = " + true + " And DataType = 2"); // Date + DateCount = drSel.Length; + } + aryCol[dtData.Columns.Count - 1 - StringCount - DateCount] = new decimal[(int)(SplitRecordsLimit - 1L + 1)]; // 扣除String&Date欄位數量 + // 字串陣列 長度為dtUnNumeric的行數(欄位數量)*分包筆數 + if (StringCount > 0) + { + aryCol_String[StringCount] = new string[(int)(SplitRecordsLimit - 1L + 1)]; + } + if (DateCount > 0) + { + aryCol_DateTime[DateCount] = new DateTime[(int)(SplitRecordsLimit - 1L + 1)]; + } + + var loopTo5 = (short)(dtData.Columns.Count - 1); + for (i = 0; i <= loopTo5; i++) + { + // strSQLColumn = strSQLColumn + column.ColumnName & " VARCHAR2(50)," + // 欄位皆以NUMBER(38,15)儲存運算 + bool isString = false; + bool isDateTime = false; + var loopTo6 = (short)(dtUnNumeric.Rows.Count - 1); + for (z = 0; z <= loopTo6; z++) + { + if ((dtData.Columns[i].ColumnName ?? "") == (dtUnNumeric.Rows[z]["FieldName"].ToString() ?? "")) + { + if (dtUnNumeric.Rows[z]["DataType"].ToString() == "0") + { + isString = true; + } + else if (dtUnNumeric.Rows[z]["DataType"].ToString() == "2") + { + isDateTime = true; + } + dtUnNumeric.Rows[z]["Index"] = i; + } + } + if (isString) + { + strSQLColumn = strSQLColumn + "\"" + dtData.Columns[i].ColumnName + "\"" + " VARCHAR2(100),"; + } + else if (isDateTime) + { + strSQLColumn = strSQLColumn + "\"" + dtData.Columns[i].ColumnName + "\"" + " DATE,"; + } + else + { + strSQLColumn = strSQLColumn + "\"" + dtData.Columns[i].ColumnName + "\"" + " NUMBER(38,15),"; + } + // 二維陣列初始化 + aryCol[i] = new decimal[(int)(SplitRecordsLimit - 1L + 1)]; + aryCol_String[i] = new string[(int)(SplitRecordsLimit - 1L + 1)]; + aryCol_DateTime[i] = new DateTime[(int)(SplitRecordsLimit - 1L + 1)]; + } + + if (Strings.InStr(1, strSQLColumn, ",") != 0) // 刪除最後一個"," + { + if (Strings.Right(strSQLColumn, 1) == ",") + { + strSQLColumn = Strings.Mid(strSQLColumn, 1, Strings.Len(strSQLColumn) - 1); + } + } + + // 指定暫存資料 Temp_機台編號 + if (EquipmentNo.Contains("-")) + { + strTableName = "Temp" + "_" + Strings.Mid(EquipmentNo.Replace("-", "_"), 1, 10) + "_" + Strings.Format(DateTime.Now, "mmssff"); + } + else + { + strTableName = "Temp" + "_" + Strings.Mid(EquipmentNo, 1, 10) + "_" + Strings.Format(DateTime.Now, "mmssff"); + } + + if (blnStoreRawData) + { + // 要儲存RawData,則將TempTable開在TestData那一組Connection中 + try + { + strTestCnnString = objSetting.GetConnectionString_DY("TestDataConnectionString", "TestDataDatabasePassword"); + strTestDBType = objSetting.GetDataBaseType_DY("TestDataDatabaseType"); + strTestDBOwner = strDataBaseTestOwner; + } + catch + { + strTestCnnString = null; + strTestDBType = null; + strTestDBOwner = null; + } + + // 取不到TestData相關連線時以MES連線取代之 + if (strTestCnnString == null || strTestDBType == null || strTestDBOwner == null) + { + strTestCnnString = strConnectionString; + strTestDBType = strDataBaseType; + strTestDBOwner = strDataBaseMesOwner; + } + } + else + { + // 不存RawData, 則開立在MES的DB中 + strTestCnnString = strConnectionString; + strTestDBType = strDataBaseType; + strTestDBOwner = strDataBaseMesOwner; + } + + // //Create connection + cnnTest = CreateConnection(strTestCnnString); + + // 先刪除Table,若出錯用try...catch避開 + // 如果有分包處理到一半的資料,應該繼續用上一個TempTable + try + { + strSQL = "Select TempTableName From TBLMESAUTOLOADERFILESTATE T where ServerName = '" + Environment.MachineName + "'And ServiceName = 'AutoLoaderLib'" + " And JobNo = '" + JobNo + "' and FileName = '" + FileName + "'And (T.Description is not null or dbms_lob.getlength(T.Description) <> 0 )"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + // 如有找到資料,代表未處理完 + if (drTemp.Read()) + { + strTableName = Conversions.ToString(drTemp["TempTableName"]); + } + else + { + drTemp.Close(); + //cmmTemp.Dispose(); + + //strSQL = "Select Table_Name From User_Tables Where Table_Name = '" + strTableName.ToUpper() + "'"; + ////cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTest); + //drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTest); + DataTable dtTableTemp = GetSchema_Tables(cnnTest, strTestDBOwner, strTableName.ToUpper()); + if (!(dtTableTemp == null) && dtTableTemp.Rows.Count > 0) + { + strSQL = " Drop Table " + strTableName; + ExecuteSQLNoneQuery_NoLimitRows(strTestDBType, strTestCnnString, ref strSQL); + // CollectionSQL.Add(strSQL) + } + //drTemp.Close(); + //cmmTemp.Dispose(); + // Create 暫存Table + // 2018/05/14 Josh 增加WaferID欄位 + // strSQL = " Create Table " & strTableName & "(SequenceNo NUMBER(20),WaferID VARCHAR2(20), " & strSQLColumn & ")" + // 2018/11/6, Ning 使用 Oracle Temporary Table + // strSQL = " Create Global Temporary Table " & strTableName & "(SequenceNo NUMBER(20),WaferID VARCHAR2(30), " & strSQLColumn & ")" + // 2021/3/24,Ning,改為實體 Temp Table + if (strTestDBType == "mssql") + { + strSQL = " Create Table " + strTableName + "(SequenceNo int,WaferID VARCHAR(30), " + strSQLColumn + ")"; + } + else + { + strSQL = " Create Table " + strTableName + "(SequenceNo NUMBER(20),WaferID VARCHAR2(30), " + strSQLColumn + ")"; + } + CollectionSQL.Add(strSQL); + // 2021/6/24加入index增加後續資料排序效能 + // strSQL = " Create Index Idx_" & strTableName & "_01 on " & strTableName & " (sequenceno)" + // CollectionSQL.Add(strSQL) + ExecuteSQLNoneQuery_UPD_NoLimitRows(strTestDBType, strTestCnnString, CollectionSQL); + // CollectionSQL.Add(strSQL) + } + } + catch (Exception ex) + { + throw ex; + } + } + + try + { + aryTemp = strLine.Split(Conversions.ToChar(strDSplitSign)); + + var loopTo7 = (short)(dtData.Columns.Count - 1); + for (i = 0; i <= loopTo7; i++) + { + + // 2021/5/21 Steven 增加紀錄String欄位 + WriteString = false; + WriteDate = false; + if (dtUnNumeric.Rows.Count > 0) + { + var loopTo8 = (short)(dtUnNumeric.Rows.Count - 1); + for (z = 0; z <= loopTo8; z++) + { + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(i, dtUnNumeric.Rows[z]["Index"], false)) && Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtUnNumeric.Rows[z]["Exist"], true, false))) // index相同時記錄欄位 + { + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtUnNumeric.Rows[z]["DataType"], 0, false))) // String + { + WriteString = true; + } + else if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtUnNumeric.Rows[z]["DataType"], 2, false))) // DateTime + { + WriteDate = true; + } + } + } + } + if (WriteString) + { + arySequence[idx] = intSeq; // idx開始第一筆 + aryCol_String[i][idx] = aryTemp[i].Trim(); + } + else if (WriteDate) + { + arySequence[idx] = intSeq; // idx開始第一筆 + if (Information.IsDate(aryTemp[i])) + { + aryCol_DateTime[i][idx] = Conversions.ToDate(aryTemp[i]); + } + else + { + throw new Exception("解析Raw Data錯誤,資料型態不為DateTime"); + } + } + + else + { + // 2019/7/5,Ning, CSV檔去除頭尾的雙引號 + if (Strings.Right(FileName, 4).ToUpper() == ".CSV") + { + if (Strings.Left(aryTemp[i], 1) == Conversions.ToString('"') && Strings.Right(aryTemp[i], 1) == Conversions.ToString('"')) + { + aryTemp[i] = Strings.Mid(aryTemp[i], 2, Strings.Len(aryTemp[i]) - 2); + } + } + arySequence[idx] = intSeq; // idx開始第一筆 + if (Information.IsNumeric(aryTemp[i])) + { + aryCol[i][idx] = Conversions.ToDecimal(aryTemp[i]); + } + else + { + aryCol[i][idx] = defInteger; + } + } + } + + idx = idx + 1; + intSeq = intSeq + 1; + + // 當筆數達到SplitRecordsLimit時寫入DB + if (idx == SplitRecordsLimit) + { + + var oParameterNames = new Dictionary(); + var Int32Parameter = new Dictionary(); + var DecimalParameter = new Dictionary(); + var VarcharParameter = new Dictionary(); + var DateParameter = new Dictionary(); + + oParameterNames.Add("SequenceNo", "Int32"); + Int32Parameter.Add("SequenceNo", arySequence); + strSQLAddField = "Insert into " + strTableName + " (SequenceNo,WaferID"; + strSQLAddValue = " Values (:SequenceNo, '" + strWaferID + "'"; + var loopTo9 = (short)(dtData.Columns.Count - 1); + for (i = 0; i <= loopTo9; i++) // 如有設定非數值欄位,依著欄位的index找出是String or Date + { + WriteString = false; + WriteDate = false; + if (dtUnNumeric.Rows.Count > 0) + { + var loopTo10 = (short)(dtUnNumeric.Rows.Count - 1); + for (z = 0; z <= loopTo10; z++) + { + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(i, dtUnNumeric.Rows[z]["Index"], false)) && Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtUnNumeric.Rows[z]["Exist"], true, false)) && Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtUnNumeric.Rows[z]["DataType"], 0, false))) // index相同時記錄欄位 + { + WriteString = true; + } + else if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(i, dtUnNumeric.Rows[z]["Index"], false)) && Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtUnNumeric.Rows[z]["Exist"], true, false)) && Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtUnNumeric.Rows[z]["DataType"], 2, false))) // Date + { + WriteDate = true; + } + } + } + // 非數值欄位寫入 + if (WriteString) + { + oParameterNames.Add(dtData.Columns[i].ColumnName, "Varchar"); + VarcharParameter.Add(dtData.Columns[i].ColumnName, aryCol_String[i]); + } + else if (WriteDate) + { + oParameterNames.Add(dtData.Columns[i].ColumnName, "DateTime"); + DateParameter.Add(dtData.Columns[i].ColumnName, aryCol_DateTime[i]); + } + else + { + oParameterNames.Add(dtData.Columns[i].ColumnName, "Decimal"); + DecimalParameter.Add(dtData.Columns[i].ColumnName, aryCol[i]); + } + strSQLAddField = strSQLAddField + "," + dtData.Columns[i].ColumnName; + strSQLAddValue = strSQLAddValue + ", :" + dtData.Columns[i].ColumnName; + } + strSQL = strSQLAddField + ")" + strSQLAddValue + ")"; + + funAddSQLContent(oSQLContent, ref intSQLIndex, strSQL, -1, HasParameter: true, ParameterNames: oParameterNames, DecimalParameter: DecimalParameter, Int32Parameter: Int32Parameter, VarcharParameter: VarcharParameter, DateTimeParameter: DateParameter); + ExecuteSQLNoneQuery_ArrayBinding(strTestDBType, strTestCnnString, oSQLContent); + // 已成功完成分包 + blnSplitPartialSuccess = true; + // SplitRecordsLimit 分包的筆數 ExecuteTimes 已做了幾次分包 相乘 = 已做過的筆數 + // 2021/5/10 Steven Mantis:0090855 當成功寫入DB時,要寫入現況表並記錄已處理的筆數 + intRow = (int)(intRow + SplitRecordsLimit); + // 如果是未完成的檔案,筆數加上上次已執行完的比數 + + fuUpdateAutoLoaderState(Environment.MachineName, "AutoLoaderLib", JobNo, JobFunction, FileName, FilePath, FileSize, strTableName, EquipmentNo, intRow, strlotNo, strWaferID, defString, datStartTime, defDateTime, SplitRecordsLimit: (int)SplitRecordsLimit, SequenceNo: SequenceNo); + intSQLIndex = 1U; + oSQLContent = new Dictionary(); + idx = 0; + } + } + + catch (Exception ex) + { + throw; + } + } + + } + } + + TotalRows = TotalRows - intDataStart; // 計算所有筆數 + + // 最後一包的idx筆資料, array中的index 0~idx-1 有值 + if (idx >= 1) + { + try + { + var arySequence_C = new int[idx]; + var aryCol_C = new decimal[501][]; + + var aryCol_String_C = new string[501][]; + var aryCol_DateTime_C = new DateTime[501][]; + + aryCol_C[dtData.Columns.Count - 1 - StringCount - DateCount] = new decimal[idx]; // 重新定義二維陣列aryCol_C的維度 + // 字串陣列 長度為dtUnNumeric的行數(欄位數量)*分包筆數 + aryCol_String_C[StringCount] = new string[idx]; + aryCol_DateTime_C[DateCount] = new DateTime[idx]; + + var loopTo11 = (short)(dtData.Columns.Count - 1); + for (i = 0; i <= loopTo11; i++) + { + // 2021/5/21 Steven 增加紀錄String欄位 + WriteString = false; + WriteDate = false; + if (dtUnNumeric.Rows.Count > 0) + { + var loopTo12 = (short)(dtUnNumeric.Rows.Count - 1); + for (z = 0; z <= loopTo12; z++) + { + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(i, dtUnNumeric.Rows[z]["Index"], false)) && Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtUnNumeric.Rows[z]["Exist"], true, false))) // index相同時記錄欄位 + { + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtUnNumeric.Rows[z]["DataType"], 0, false))) // String + { + WriteString = true; + } + else if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtUnNumeric.Rows[z]["DataType"], 2, false))) // DateTime + { + WriteDate = true; + } + } + } + } + if (WriteString) + { + aryCol_String_C[i] = new string[idx]; + } + else if (WriteDate) + { + aryCol_DateTime_C[i] = new DateTime[idx]; + } + else + { + aryCol_C[i] = new decimal[idx]; + } // 初始化二維陣列 + + } + + var oParameterNames = new Dictionary(); + var Int32Parameter = new Dictionary(); + var DecimalParameter = new Dictionary(); + var VarcharParameter = new Dictionary(); + var DateParameter = new Dictionary(); + + // 將arySequence的前idx筆複製給arySequence_C + Array.Copy(arySequence, arySequence_C, idx); + + oParameterNames.Add("SequenceNo", "Int32"); + Int32Parameter.Add("SequenceNo", arySequence_C); + + strSQLAddField = "Insert into " + strTableName + " (SequenceNo,WaferID"; + strSQLAddValue = " Values (:SequenceNo, '" + strWaferID + "'"; + + + var loopTo13 = (short)(dtData.Columns.Count - 1); + for (i = 0; i <= loopTo13; i++) + { + WriteString = false; + WriteDate = false; + if (dtUnNumeric.Rows.Count > 0) + { + var loopTo14 = (short)(dtUnNumeric.Rows.Count - 1); + for (z = 0; z <= loopTo14; z++) + { + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(i, dtUnNumeric.Rows[z]["Index"], false)) && Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtUnNumeric.Rows[z]["Exist"], true, false)) && Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtUnNumeric.Rows[z]["DataType"], 0, false))) // index相同時記錄欄位 + { + WriteString = true; + } + else if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(i, dtUnNumeric.Rows[z]["Index"], false)) && Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtUnNumeric.Rows[z]["Exist"], true, false)) && Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtUnNumeric.Rows[z]["DataType"], 2, false))) // Date + { + WriteDate = true; + } + } + } + // 非數值欄位寫入 + if (WriteString) + { + oParameterNames.Add(dtData.Columns[i].ColumnName, "Varchar"); + // 將aryCol(i)的前idx筆複製給aryCol_String_C(i) + Array.Copy(aryCol_String[i], aryCol_String_C[i], idx); + VarcharParameter.Add(dtData.Columns[i].ColumnName, aryCol_String_C[i]); + } + else if (WriteDate) + { + oParameterNames.Add(dtData.Columns[i].ColumnName, "DateTime"); + // 將aryCol(i)的前idx筆複製給aryCol_DateTime_C(i) + Array.Copy(aryCol_DateTime[i], aryCol_DateTime_C[i], idx); + DateParameter.Add(dtData.Columns[i].ColumnName, aryCol_DateTime_C[i]); + } + else + { + oParameterNames.Add(dtData.Columns[i].ColumnName, "Decimal"); + // 將aryCol(i)的前idx筆複製給aryCol_C(i) + Array.Copy(aryCol[i], aryCol_C[i], idx); + DecimalParameter.Add(dtData.Columns[i].ColumnName, aryCol_C[i]); + } + + strSQLAddField = strSQLAddField + "," + dtData.Columns[i].ColumnName; + strSQLAddValue = strSQLAddValue + ", :" + dtData.Columns[i].ColumnName; + } + strSQL = strSQLAddField + ")" + strSQLAddValue + ")"; + + funAddSQLContent(oSQLContent, ref intSQLIndex, strSQL, -1, HasParameter: true, ParameterNames: oParameterNames, DecimalParameter: DecimalParameter, Int32Parameter: Int32Parameter, VarcharParameter: VarcharParameter, DateTimeParameter: DateParameter); + ExecuteSQLNoneQuery_ArrayBinding(strTestDBType, strTestCnnString, oSQLContent); + + intSQLIndex = 1U; + oSQLContent = new Dictionary(); + idx = 0; + // 全都完成,將現況表的資料刪除,並寫入資料到log + fuUpdateAutoLoaderState(Environment.MachineName, "AutoLoaderLib", JobNo, JobFunction, FileName, FilePath, FileSize, strTableName, EquipmentNo, intRow, strlotNo, strWaferID, defString, datStartTime, defDateTime, true); + } + catch (Exception ex) + { + throw; + } + } + + objReader.Close(); + + blnResult = true; + } + + catch (Exception ex) + { + // 有錯誤時把TempTable Drop 掉 + if (!string.IsNullOrEmpty(strTableName) && blnSplitPartialSuccess == false && StartRow == defInteger) // StartRow = defString代表要續go的檔案 + { + strSQL = "Drop Table " + strTableName; + ExecuteSQLNoneQuery_NoLimitRows(strTestDBType, strTestCnnString, ref strSQL); + } + // 有錯誤時,要將錯誤訊息紀錄上現況表上 + // 若有成功處理的筆數,則把失敗訊息寫上;若無成功處理筆數,則不寫現況表,並將檔案直接搬移到fail + strFailMessage = "分包處理失敗: " + ex.Message; + if (blnSplitPartialSuccess) + { + fuUpdateAutoLoaderState(Environment.MachineName, "AutoLoaderLib", JobNo, JobFunction, FileName, FilePath, FileSize, strTableName, EquipmentNo, intRow, strlotNo, strWaferID, strFailMessage, datStartTime, defDateTime, false, (int)SplitRecordsLimit); + } + else if (blnSplitPartialSuccess == false && StartRow != defInteger) // 分包續處理,第一次就錯,需要更新錯誤訊息與時間'完全沒成功,又有起始處理筆數 + { + fuUpdateAutoLoaderState(Environment.MachineName, "AutoLoaderLib", JobNo, JobFunction, FileName, FilePath, FileSize, strTableName, EquipmentNo, intRow, strlotNo, strWaferID, strFailMessage, datStartTime, defDateTime, false, (int)SplitRecordsLimit); + } + + throw; + } + + + finally + { + // 寫入log資料 + fuAddAutoLoaderLog(Environment.MachineName, "AutoLoaderLib", JobNo, JobFunction, FileName, FilePath, FileSize, EquipmentNo, strlotNo, strWaferID, strFailMessage, datStartTime, defDateTime, TotalRows, SequenceNo: SequenceNo); + + CloseConnection(cnnTemp); + CloseConnection(cnnTest); + objReader.Close(); + objReader = null; + aryTemp = null; + if (!(aryCol == null)) + { + aryCol = null; + } + if (!(aryCol_String == null)) + { + aryCol_String = null; + } + if (!(aryCol_DateTime == null)) + { + aryCol_DateTime = null; + } + if (!(arySequence == null)) + { + arySequence = null; + } + } + + return blnResult; + + } + + private bool fuLEDDataSummary_EQP_UploadFile(string strTestRecipeType, ArrayList aryFormula, + string[] aryWaferInfo, string EquipmentNo, string LotNo, string PSNo, string LogGroupSerial, DateTime CreateDate, + string FileName, string strTempTable, bool blnStoreRawData, string SequenceNo = defString, + DataTable dtFormat_Postion = null, string ImportUserNo = defString, + int FileSize = 0, int TotalRows = 0) + { + + bool blnResult = false; + string strWaferID; + string strColumnName = defString; + string strFormulaSQL = defString; + string strCalResult; // 儲存SQL公式計算完的結果 + string strSQL, strSQLColumn, strTableName, strSQLAddField, strSQLAddValue; + var CollectionSQL = new Collection(); + DateTime datEventTime; + var strReadFormula = new string[2]; + int i = 0; + var cnnTemp = default(IDbConnection); + DbDataReader drTemp; + + var TestRecipeType = default(string); + var dsTemp = default(DataSet); + //var daTemp = default(System.Data.OleDb.OleDbDataAdapter); + DataTable dtTestRecipe; + string strLogTableName, strSQLHead, strSQLLogHead; + + DataRow[] drSel; + + var cnnTest = default(IDbConnection); + string strTestCnnString = default(string), strTestDBType = default(string), strTestDBOwner = default(string); + int intStoreRawData = 0; + if (blnStoreRawData) + intStoreRawData = 1; + string RawDataTableName = defString; + // Dim intMillionTimes As Integer = 1000000 '2021/9/22 Steven Mantis:0099773 當測試資料超過16位數時,drTemp無法承載。調整方式:寫入TempTable先將資料/1000000,寫入TestSummary與RawData時,再將資料乘上1000000 + try + { + datEventTime = DateTime.Now; + + // //Create connection + cnnTemp = CreateConnection(strConnectionString); + + strWaferID = aryWaferInfo[0].ToString(); + // LotNo, PSNo, LogGroupSerial皆由外部傳入 + // '取得LotNo, LogGroupSerial + // strSQL = "Select A.LotNo From tblWIPComponentState A, tblWIPLotState B Where A.LotNo = B.LotNo And A.ComponentNo = '" & strWaferID & "'" & + // " And B.Status In (0,1,2,3,4,5)" + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + // drTemp = ExecuteSQLQuery_Reader() + // If drTemp.Read Then + // LotNo = drTemp("LotNo") + // Else + // Throw New System.Exception("解析檔案失敗,ComponentNo: " & strWaferID & " 無法找到對應的 LotNo,請檢查檔案:" & FileName) + // End If + // drTemp.Close() + // cmmTemp.Dispose() + + // strSQL = "Select LogGroupSerial, PSNo From tblWIPLotState Where LotNo = '" & LotNo & "'" + // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) + // drTemp = ExecuteSQLQuery_Reader() + // If drTemp.Read Then + // If drTemp("LogGroupSerial").ToString = "" Then + // Throw New System.Exception("解析檔案失敗,LotNo: " & LotNo & " 之LogGroupSerial為空!") + // End If + // LogGroupSerial = drTemp("LogGroupSerial") + // PSNo = drTemp("PSNo") + // Else + // Throw New System.Exception("解析檔案失敗,LotNo: " & LotNo & " 無法找到生產批現況!") + // End If + // drTemp.Close() + // cmmTemp.Dispose() + if (blnStoreRawData) + { + // 要儲存RawData,則將TempTable開在TestData那一組Connection中 + try + { + strTestCnnString = objSetting.GetConnectionString_DY("TestDataConnectionString", "TestDataDatabasePassword"); + strTestDBType = objSetting.GetDataBaseType_DY("TestDataDatabaseType"); + strTestDBOwner = strDataBaseTestOwner; + } + catch + { + strTestCnnString = null; + strTestDBType = null; + strTestDBOwner = null; + } + + // 取不到TestData相關連線時以MES連線取代之 + if (string.IsNullOrEmpty(strTestCnnString) || string.IsNullOrEmpty(strTestDBType) || string.IsNullOrEmpty(strTestDBOwner)) + { + strTestCnnString = strConnectionString; + strTestDBType = strDataBaseType; + strTestDBOwner = strDataBaseMesOwner; + } + } + else + { + // 不存RawData, 則開立在MES的DB中 + strTestCnnString = strConnectionString; + strTestDBType = strDataBaseType; + strTestDBOwner = strDataBaseMesOwner; + } + + // //Create connection + cnnTest = CreateConnection(strTestCnnString); + + + // 2019/5/30, Ning, 若AutoLoaderJob.xml的Parameter2有定義TestRecipeType, 則以該值為優先, 若沒有定再以下述方式找TestRecipeType + // 0103356: [SEMI_Wafer] EAP 整合接口 LogFile_Send 調整為必須傳入測試類別 + if ((strTestRecipeType ?? "") != defString && !string.IsNullOrEmpty(strTestRecipeType) && strTestRecipeType != "N/A") + { + TestRecipeType = strTestRecipeType; + } + // 依格式檔內的參數編號及生產批所在區域取得TestRecipeType + else if (aryFormula.Count > 0) + { + strReadFormula = Strings.Split(Strings.Trim(aryFormula[0].ToString()), ":"); + strColumnName = strReadFormula[0].ToUpper(); + + strSQL = "Select TestRecipeType From tblSYSTestRecipeBasis Where TestRecipeNo = '" + strColumnName + "' And PSNo = '" + PSNo + "'"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + TestRecipeType = Conversions.ToString(drTemp["TestRecipeType"]); + } + else + { + throw new Exception("解析檔案失敗, 找不到區段: " + PSNo + ", 參數編號: " + strColumnName + " 之測試類別!"); + } + drTemp.Close(); + //cmmTemp.Dispose(); + + } + + // 電性值資料表名稱: tblWIPTestSum_測試類別 + strTableName = "TBLWIPTESTSUM_" + TestRecipeType; + strLogTableName = "TBLWIPTESTSUMLOG_" + TestRecipeType; + + if (blnStoreRawData) + { + RawDataTableName = "TBLWIPRAWDATA_" + TestRecipeType; + } + + // 2021/8/29 Steven Mantis:0098747 若LOG資料存在FileFormat = 6,resulit = 1,ComponentNo相等,則要替換PSNO與LoggroupSerial + // 以ComponentNo與測試日期(TestDate),FileFormat=6, Result=1(成功)為條件查詢 tblWIPCont_UploadFileLog資料表,找出CreateDate最後一筆的資料 + ReplacePSNoandLotGroupSerial(EquipmentNo, strWaferID, aryWaferInfo, TestRecipeType, ref PSNo, ref LogGroupSerial); + + + // 檢查檔案是否已匯入過(資料已存在Log中) + // 2021/3/16 Steven Mantis: 0089578: [SEMI_Wafer] AutoLoader 廠內電性測試資料,允許相同測試時間的測試檔的匯入 + strSQL = "Select ComponentNo From " + strLogTableName + " Where ComponentNo = '" + strWaferID + "' And FileName = '" + FileName + "'" + " And TestDate = To_Date('" + Strings.Format(Conversions.ToDate(aryWaferInfo[1].ToString()), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') And ImportDate = To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + if (drTemp.Read()) + { + throw new Exception("檔案: " + FileName + ", 測試日期: " + aryWaferInfo[1].ToString() + ", 匯入時間" + Strings.Format((object)datEventTime, "yyyy/MM/dd H:mm:ss") + " 已匯入, 不允許重新匯入!!"); + } + drTemp.Close(); + //cmmTemp.Dispose(); + + // 依測試類別找出其TestRecipeNo(參數編號), ConversionField(欄位名稱) + strSQL = "Select TestRecipeNo, ConversionField From tblSYSTestRecipeBasis Where TestRecipeType = '" + TestRecipeType + "'"; + //cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTemp); + //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp); + dsTemp = new DataSet(); + //daTemp.Fill(dsTemp, "TestRecipe"); + ExecuteSQLQuery_Adapter(strSQL, dsTemp, "TestRecipe", cnnTemp); + dtTestRecipe = dsTemp.Tables["TestRecipe"]; + + // tblWIPTestSum刪除已存在資料, 只保留最新一次資料 + strSQL = "Delete From " + strTableName + " Where ComponentNo = '" + strWaferID + "'"; + CollectionSQL.Add(strSQL); + + // //新增TestSummary, TestSummaryLog + // strSQLAddField = "Insert into " & strTableName & " (" + strSQLHead = "Insert into " + strTableName + " ("; + strSQLLogHead = "Insert into " + strLogTableName + " ("; + strSQLAddValue = " Values ("; + + // 固定欄位 'FileSize:檔案大小 RAWDATARECORD:RawData總筆數ImportUserNo應為TBLWIPCONT_UPLOADFILE上的Creator + if ((ImportUserNo ?? "") == defString) + ImportUserNo = "AutoRun"; + strSQLAddField = "LogGroupSerial, ComponentNo, LotNo, FileName, EquipmentNo, ImportUserNo, ImportDate,FileSize,"; + strSQLAddValue = strSQLAddValue + "'" + LogGroupSerial + "','" + strWaferID + "','" + LotNo + "','" + FileName + "','" + EquipmentNo + "','" + ImportUserNo + "'," + " To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')," + FileSize + ","; + + // 動態欄位 + // 拆解公式檔:欄位名稱、計算SQL + bool blnF_WaferSize, blnF_Thickness, blnF_TestDate, blnF_ProgramNo; + blnF_WaferSize = false; // 預設公式檔沒有WaferSize + blnF_Thickness = false; // 預設公式檔沒有Thickness + blnF_TestDate = false; // 預設公式檔沒有TestDate + blnF_ProgramNo = false; // 預設公式檔沒有ProgramNo + + if (aryFormula.Count > 0) + { + + for (int w = 0, loopTo = aryFormula.Count - 1; w <= loopTo; w++) + { + strCalResult = ""; + + strReadFormula = Strings.Split(Strings.Trim(aryFormula[w].ToString()), ":"); + strColumnName = strReadFormula[0]; + strFormulaSQL = strReadFormula[1]; + + // TestRecipeBasis有定義此欄位才需要計算並存入 + // 2019/3/7, Ning, 存入的欄位名稱為dtTestRecipe.ConversionField + drSel = dtTestRecipe.Select("TestRecipeNo = '" + strColumnName + "'"); + if (drSel.Length > 0) + { + // 將SQL計算公式的temp_Table改為 + strFormulaSQL = Strings.Replace(strFormulaSQL, "[TEMP_TABLE]", strTempTable); + // 2021/11/9 因測試資料有可能超過16位數,導致dataReader無法乘載,故先將select SQL 縮小百萬倍 + // EX: SELECT STDDEV(NS_2) FROM TBLWIPTESTSUM_CP_VL 轉換成: SELECT (STDDEV(NS_2))/1000000 FROM TBLWIPTESTSUM_CP_VL + // strFormulaSQL = strFormulaSQL.ToUpper + // strFormulaSQL = strFormulaSQL.Trim + // strFormulaSQL = Replace(strFormulaSQL, Left("" & strFormulaSQL & "", 6), "SELECT(") + // strFormulaSQL = Replace(strFormulaSQL, "FROM " & strTempTable.ToUpper & "", ")/1000000 FROM " & strTempTable.ToUpper & "") + // 取得計算結果 + // 欄位皆以NUMBER(38,15)儲存運算 + //cmmTemp = new System.Data.OleDb.OleDbCommand(strFormulaSQL, cnnTest); + drTemp = ExecuteSQLQuery_Reader(strFormulaSQL, cnnTest); + if (drTemp.Read()) + { + strCalResult = drTemp[0].ToString(); + if (Information.IsNumeric(strCalResult)) + { + strCalResult = strCalResult; + } + } + else + { + throw new Exception("公式計算失敗,請檢查參數名稱:" + strColumnName); + } + + if (!string.IsNullOrEmpty(strCalResult)) + { + // 2019/3/7, Ning, 存入的欄位名稱為dtTestRecipe.ConversionField + // strSQLAddField = strSQLAddField & strColumnName & "," + strSQLAddField = strSQLAddField + drSel[0]["ConversionField"].ToString() + ","; + strSQLAddValue = strSQLAddValue + "'" + strCalResult.ToString() + "',"; + + if (drSel[0]["ConversionField"].ToString().ToUpper() == "WAFERSIZE") + { + blnF_WaferSize = true; + } + if (drSel[0]["ConversionField"].ToString().ToUpper() == "THICKNESS") + { + blnF_Thickness = true; + } + if (drSel[0]["ConversionField"].ToString().ToUpper() == "TESTDATE") + { + blnF_TestDate = true; + } + if (drSel[0]["ConversionField"].ToString().ToUpper() == "PROGRAMNO") + { + blnF_ProgramNo = true; + } + } + } + } + drTemp.Close(); + //cmmTemp.Dispose(); + + } + + // 固定欄位(TestDate, ProgramNo) + if (!blnF_TestDate) + { + strSQLAddField = strSQLAddField + "TestDate,"; + strSQLAddValue = strSQLAddValue + "To_Date('" + Strings.Format(Conversions.ToDate(aryWaferInfo[1].ToString()), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')" + ","; + } + if (!blnF_ProgramNo) + { + strSQLAddField = strSQLAddField + "ProgramNo,"; + strSQLAddValue = strSQLAddValue + "'" + aryWaferInfo[5].ToString() + "',"; + } + + // Steven Manits:0088935: [SEMI_Wafer] AutoLoader測試資料動態參數收集優化_AutoLoader 電性值匯入調整 + // 表頭的非固定欄位,需寫入電性資料表 + if (!(dtFormat_Postion == null)) + { + if (dtFormat_Postion.Rows.Count > 0) + { + var loopTo1 = dtFormat_Postion.Rows.Count - 1; + for (i = 0; i <= loopTo1; i++) + { + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtFormat_Postion.Rows[i]["AssignFile"], 1, false))) + { + if (dtTestRecipe.Select("TestRecipeNo = '" + dtFormat_Postion.Rows[i]["ColumnName"].ToString() + "'").Length > 0) + { + strSQLAddField = strSQLAddField + "" + dtFormat_Postion.Rows[i]["ColumnName"].ToString() + ","; + strSQLAddValue = strSQLAddValue + "'" + dtFormat_Postion.Rows[i]["Value"].ToString() + "',"; + } + } + } + } + } + + // 動態欄位 + // 2019/5/22, Ning, 公式檔沒有WaferSize才將表頭的填入 + if (!blnF_WaferSize && dtTestRecipe.Select("TestRecipeNo = 'WaferSize'").Length > 0 && (aryWaferInfo[3].ToString() ?? "") != defString) + { + strSQLAddField = strSQLAddField + "WaferSize,"; + strSQLAddValue = strSQLAddValue + "'" + aryWaferInfo[3].ToString() + "',"; + } + // 2019/5/22, Ning, 公式檔沒有Thickness才將表頭的填入 + if (!blnF_Thickness && dtTestRecipe.Select("TestRecipeNo = 'Thickness'").Length > 0 && (aryWaferInfo[4].ToString() ?? "") != defString) + { + strSQLAddField = strSQLAddField + "Thickness,"; + strSQLAddValue = strSQLAddValue + "'" + aryWaferInfo[4].ToString() + "',"; + } + + // 2019/7/9,Ning, FileEquipmentNo(aryWaferInfo[2]),有值則需存入 + if (!string.IsNullOrEmpty(aryWaferInfo[2].ToString()) && (aryWaferInfo[2].ToString() ?? "") != defString) + { + strSQLAddField = strSQLAddField + "FileEquipmentNo,"; + strSQLAddValue = strSQLAddValue + "'" + aryWaferInfo[2].ToString() + "',"; + } + + if (blnStoreRawData) // StoreRawData:是否存原始數據 RawDataTableName:原始數據數據表名稱 + { + strSQLAddField = strSQLAddField + "StoreRawData,RawDataTableName,RAWDATARECORD"; + strSQLAddValue = strSQLAddValue + "1,'" + RawDataTableName + "'," + TotalRows + ""; + } + else + { + strSQLAddField = strSQLAddField + "StoreRawData,"; + strSQLAddValue = strSQLAddValue + "0,"; + } + + if (Strings.InStr(1, strSQLAddField, ",") != 0) // 刪除最後一個"," + { + if (Strings.Right(strSQLAddField, 1) == ",") + { + strSQLAddField = Strings.Mid(strSQLAddField, 1, Strings.Len(strSQLAddField) - 1); + } + } + + if (Strings.InStr(1, strSQLAddValue, ",") != 0) // 刪除最後一個"," + { + if (Strings.Right(strSQLAddValue, 1) == ",") + { + strSQLAddValue = Strings.Mid(strSQLAddValue, 1, Strings.Len(strSQLAddValue) - 1); + } + } + + // 直接給定strSQL + strSQL = strSQLHead + strSQLAddField + ")" + strSQLAddValue + ")"; + CollectionSQL.Add(strSQL); + + // Log SQL + strSQL = strSQLLogHead + strSQLAddField + ")" + strSQLAddValue + ")"; + CollectionSQL.Add(strSQL); + + // 若不儲存RawData則在此Drop TempTable + if (blnStoreRawData == false) + { + strSQL = "Drop Table " + strTempTable; + CollectionSQL.Add(strSQL); + } + + // 更新tblWIPCont_UploadFile + + // 88995: [6.0.5] EAP 整合接口 LogFile_Send PK重複問題調整 + // strSQL = "Update tblWIPCont_UploadFile Set Result = 1, SummaryTableName = '" & strTableName & "', ComponentNo = '" & strWaferID & "', ReadFileDate = To_Date('" & Format(datEventTime, "yyyy/MM/dd H:mm:ss") & "','YYYY/MM/DD HH24:MI:SS')" & + // " Where EquipmentNo = '" & EquipmentNo & "' And CreateDate = To_Date('" & Format(CreateDate, "yyyy/MM/dd H:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') " + strSQL = "Update tblWIPCont_UploadFile Set Result = 1,CreateDate = To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'), SummaryTableName = '" + strTableName + "', ComponentNo = '" + strWaferID + "', ReadFileDate = To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')" + " ,LotNo = '" + LotNo + "',LoggroupSerial = '" + LogGroupSerial + "' Where EquipmentNo = '" + EquipmentNo + "' And SequenceNo='" + SequenceNo + "' "; + + CollectionSQL.Add(strSQL); + + // 呼叫執行SQL指令 + string argstrDatabaseType = Conversions.ToString(DataBaseType); + ExecuteSQLNoneQuery_UPD(argstrDatabaseType, strConnectionString, CollectionSQL); + + blnResult = true; + } + + catch (Exception ex) + { + //strSQL = "Select Table_Name From User_Tables Where Table_Name = '" + strTempTable.ToUpper() + "'"; + ////cmmTemp = new System.Data.OleDb.OleDbCommand(strSQL, cnnTest); + //drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTest); + + // 0143038, 將取得Table Name改為GetSchema_Tables + if (string.IsNullOrEmpty(strTempTable) == false) + { + DataTable dtTableTemp = GetSchema_Tables(cnnTest, strTestDBOwner, strTempTable.ToUpper()); + if (!(dtTableTemp == null) && dtTableTemp.Rows.Count > 0) + { + strSQL = " Drop Table " + strTempTable.ToUpper(); + ExecuteSQLNoneQuery_NoLimitRows(strTestDBType, strTestCnnString, ref strSQL); + // CollectionSQL.Add(strSQL) + } + } + + //drTemp.Close(); + //cmmTemp.Dispose(); + throw; + } + + finally + { + CloseConnection(cnnTemp); + CloseConnection(cnnTest); + //if (daTemp != null) + //{ + // daTemp.Dispose(); + //} + if (dsTemp != null) + { + dsTemp.Dispose(); + } + } + + return blnResult; + + } + + public bool fuReadExcel(string FilePath, ref DataTable dtResult, int StratRowIndex = 0, int StartColumnIndex = 0, int MaxRowCount = -1, string StopCellText = "") + { + bool blnReturn = false; + var fsExcel = default(FileStream); + + try + { + dtResult = new DataTable(); + + // 開啟要讀取的Excel檔案 + fsExcel = new FileStream(FilePath, FileMode.Open); + // 自動判斷xls或xlsx + var workbook = WorkbookFactory.Create(fsExcel); + fsExcel.Close(); // 關閉檔案 + + if (Information.TypeName(workbook) == "HSSFWorkbook") + { + } + // 早期的Excel格式(97-2003) + // MsgBox("Excel Format(97-2003)") + else if (Information.TypeName(workbook) == "XSSFWorkbook") + { + // 新的Excel格式(2007 or Later) + // MsgBox("Excel Format(2007 Later)") + } + + // 解析Excel 內容 + int intStartRowIndex = StratRowIndex; // 要開始讀取資料的列數 + int intStartCellIndex = StartColumnIndex; // 要開始讀取的欄位次序 + int intsheetIndex = 0; + string strFirstSheetName = workbook.GetSheetName(intsheetIndex); + var sheet = workbook.GetSheetAt(intsheetIndex); + object formulaValue; + + // 第一列為欄位名稱 + int intRowId = intStartRowIndex; + var excelRow = sheet.GetRow(intRowId); + ICell excelCell; + HSSFFormulaEvaluator formulaEvaluator_xls = null; + XSSFFormulaEvaluator formulaEvaluator_xlsx = null; + bool blnHasData = false; + if (excelRow != null) + { + for (int columnIndex = intStartCellIndex, loopTo = excelRow.LastCellNum - 1; columnIndex <= loopTo; columnIndex++) + { + excelCell = excelRow.GetCell(columnIndex); + if (excelCell != null) + { + DataColumn dc; + string strColName = excelCell.ToString(); + dc = new DataColumn(strColName, Type.GetType("System.String")); + dtResult.Columns.Add(dc); + } + } + } + + // 第2列開始讀取資料,讀到最後一列 + while (intRowId <= sheet.LastRowNum - 1) + { + var drAdd = dtResult.NewRow(); + intRowId += 1; + blnHasData = false; + excelRow = sheet.GetRow(intRowId); + if (excelRow == null) + continue; // 讀不到資料,跳下一列繼續讀取 + // 讀取所有column + bool continueWhile = false; + for (int colIndex = intStartCellIndex, loopTo1 = dtResult.Columns.Count - 1 + intStartCellIndex; colIndex <= loopTo1; colIndex++) + { + excelCell = excelRow.GetCell(colIndex); + // 若第一個 Cell 是 Nothing 就濾掉這筆 + if (excelCell == null && colIndex == 0) + { + continueWhile = true; + break; + } + + // TODO: 讀取到特定文字或指定筆數離開 + if (MaxRowCount != -1 && intRowId - intStartRowIndex > MaxRowCount) + { + + } + if (excelCell != null) + { + string strVal = ""; + if (excelCell.CellType == CellType.Formula) + { + // 2019/7/3, Ning, 公式中若有特定函數如countifs某些電腦會報錯, 再加上cell.CachedFormulaResultType判斷 + if (excelCell.CachedFormulaResultType == CellType.Numeric) + { + if (DateUtil.IsCellDateFormatted(excelCell)) + { + strVal = excelCell.DateCellValue.ToString(); + } + else + { + strVal = excelCell.NumericCellValue.ToString(); + } + } + else if (excelCell.CachedFormulaResultType == CellType.String) + { + strVal = excelCell.StringCellValue.ToString(); + } + else if (Information.TypeName(workbook) == "HSSFWorkbook") + { + if (formulaEvaluator_xls == null) + formulaEvaluator_xls = new HSSFFormulaEvaluator(workbook); + formulaValue = formulaEvaluator_xls.Evaluate(excelCell); + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual((formulaValue as CellValue).CellType, CellType.Numeric, false))) + { + strVal = (formulaValue as CellValue).NumberValue.ToString(); + } + else if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual((formulaValue as CellValue).CellType, CellType.String, false))) + { + strVal = (formulaValue as CellValue).StringValue.ToString(); + } + } + else if (Information.TypeName(workbook) == "XSSFWorkbook") + { + if (formulaEvaluator_xlsx == null) + formulaEvaluator_xlsx = new XSSFFormulaEvaluator(workbook); + formulaValue = formulaEvaluator_xlsx.Evaluate(excelCell); + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual((formulaValue as CellValue).CellType, CellType.Numeric, false))) + { + strVal = (formulaValue as CellValue).NumberValue.ToString(); + } + else if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual((formulaValue as CellValue).CellType, CellType.String, false))) + { + strVal = (formulaValue as CellValue).StringValue.ToString(); + } + } + } + + else if (excelCell.CellType == CellType.Numeric && DateUtil.IsValidExcelDate(excelCell.NumericCellValue) && DateUtil.IsCellDateFormatted(excelCell)) + + { + strVal = excelCell.DateCellValue.ToString("yyyy/MM/dd"); + } + else if (excelCell.CellType == CellType.Numeric) + { + strVal = excelCell.NumericCellValue.ToString(); + if (colIndex == 0) + { + strVal = Convert.ToUInt32(strVal).ToString("0000000"); + } + } + else + { + strVal = excelCell.ToString(); + } + // 若第一個 Cell 是空白值就濾掉這筆 + if (colIndex == intStartCellIndex && string.IsNullOrEmpty(strVal.Trim())) + { + continueWhile = true; + break; + } + drAdd[dtResult.Columns[colIndex - intStartCellIndex]] = strVal; + blnHasData = true; + } + } + + if (continueWhile) + { + continue; + } + if (blnHasData) + dtResult.Rows.Add(drAdd); + } + + blnReturn = true; + } + catch (Exception ex) + { + throw; + } + + finally + { + if (fsExcel != null) + { + fsExcel.Close(); + fsExcel = null; + } + } + + return blnReturn; + + } + + private string funGetMaterialInNo(bool ReserveSerialNo) + { + string funGetMaterialInNoRet = default(string); + var XmlDoc = new System.Xml.XmlDocument(); + + // 組InXml的字串 + string argSendTime = Conversions.ToString(DateTime.Now); + strIdentity = modWIN.CombineXMLIdentity(ref modWIN.gComputerName, ref modWIN.gUserNo, ref argSendTime); + string argvalue_name = "reserveserialno"; + string argname = "ReserveSerialNo"; + string argtype = "Boolean"; + string argvalue = Conversions.ToString(ReserveSerialNo); + string argdesc = ""; + strParameter = modWIN.CombineXMLParameter(ref argvalue_name, ref argname, ref argtype, ref argvalue, ref argdesc); + ReserveSerialNo = Conversions.ToBoolean(argvalue); + InXml = modWIN.CombineXMLRequest(ref strIdentity, ref strParameter); + + try + { + OutXml = modAutoLoaderLibrary.InvokeSrv("wsSYS.GetMaterialInNo", InXml); + + XmlDoc.LoadXml(OutXml); + if (modWIN.chkExecutionSuccess(ref XmlDoc)) + { + // 取出MaterialInNo + if (XmlDoc.GetElementsByTagName("materialinno").Item(0).SelectNodes("value").Count > 0) + { + funGetMaterialInNoRet = XmlDoc.DocumentElement.GetElementsByTagName("materialinno").Item(0).SelectNodes("value").Item(0).InnerText; + } + } + else + { + throw new Exception(modWIN.GetExceptionSysMsg(ref XmlDoc)); + // funGetMaterialInNo = "fail" + return funGetMaterialInNoRet; + } + } + + catch (Exception ex) + { + throw new Exception(ex.Message); + // funGetMaterialInNo = "fail" + } + + XmlDoc = null; + return funGetMaterialInNoRet; + + } + + + #endregion + + #region "SDD230613_01-04 / 鍵合資訊AutoLoader採集" + private string funParsingDieAttchInfo(Collection colParameters = null) + { + string funParsingDieAttchInfoRet = default(string); + + string strJobNo = string.Empty; // JobNo + string strSourcePath = string.Empty; // 來源檔案路徑 + string strDestinationPath = string.Empty; // 目前檔案路徑 + string strQueuePath = string.Empty; // 處理中檔案路徑 + string strFailPath = string.Empty; // 失敗檔案路徑 + string FileName = string.Empty; // 處理中檔案 + string strJobFunction = string.Empty; // 處理中檔案 + string DirName = DateTime.Now.ToString("yyyyMM"); // 分類目錄名稱 + string strLotNo = string.Empty; + bool blnMoveFile = true; + var cnnTemp = default(IDbConnection); + DbDataReader drTemp; + string strSQL = string.Empty; + DataTable dtSummary = new DataTable(); + DataTable dtRaw = new DataTable(); + Collection CollectionSQL_Rows = new Collection(); + try + { + // //Create Connection + cnnTemp = CreateConnection(strConnectionString); + + // //取出colParameter傳入參數 + strJobNo = colParameters["JobNo"].ToString().Trim(); + strSourcePath = colParameters["SourcePath"].ToString().Trim(); + strDestinationPath = colParameters["DestinationPath"].ToString().Trim(); + strQueuePath = colParameters["QueuePath"].ToString().Trim(); + strFailPath = colParameters["FailPath"].ToString().Trim(); + strJobFunction = colParameters["JobFunction"].ToString().Trim(); + string strBinCode = string.Empty; + strLotNo = string.Empty; + + Boolean blnSubStrateIdExist; + // 資料讀取=================================================================================================================================== + // //取出來源目錄中*.csv檔案 + string[] DirFiles = Directory.GetFiles(strSourcePath, "*.csv"); + // //將檔案複製到Queue的目錄中 + foreach (var currentFileName in DirFiles) + { + FileName = currentFileName; + + // //檢查檔案存不存在,有可能被另一個執行緒先處理 + if (File.Exists(FileName) == true) + { + modWIN.WriteLog("开始读档:"+ Path.GetFileName(FileName), iMESLog.iMESLogLevel.Trace ); + // //移動檔案Source至Queue + try + { + blnMoveFile = true; + File.Move(FileName, strQueuePath + Path.GetFileName(FileName)); + } + catch (Exception ex) + { + blnMoveFile = false; + modWIN.WriteLog(FileName + ex.Message, iMESLog.iMESLogLevel.Error); + throw new Exception("此執行程序已中止,由另一執行程序處理中!!"); + } + // //將檔案來源改為Queue + FileName = strQueuePath + Path.GetFileName(FileName); + try + { + int intCheckInteger; + strLotNo = string.Empty; + Boolean isOk = true; + dtSummary = new DataTable(); + string strLogGroupSerial = ""; + string MoNo = ""; + string EquipmentNo_Import = ""; + var dsTemp = new DataSet(); + var CollectionSQL = new Collection(); + DataTable dtUpdateSubStrate = new DataTable(); + DataTable dtUpdateInkless = new DataTable(); + DataTable dtCom = new DataTable(); + DataTable dtMTLBasis = new DataTable(); + DataTable dtMTLState_Comp = new DataTable(); + DataRow[] drSel; + DataRow[] drSel1; + Boolean IsRawData = false; + Int32 RowColIndex=-1; + using (var myReader = new TextFieldParser(FileName)) + { + myReader.TextFieldType = FieldType.Delimited; + myReader.Delimiters = new string[] { "," }; + // //使用Try..Catch避免未釋放資源 + try + { + string[] currentRow; + string A1 = ""; + string A2 = ""; + string A3 = ""; + string A4 = ""; + string A5 = ""; + string A6 = ""; + string LotNo_Import = ""; + int intStartField = 0; + DateTime StartTime_Import; + DateTime EndTime_Import; + double SubstrateQty_Impotr; + // //Parser檔案 + while (!myReader.EndOfData) + { + currentRow = myReader.ReadFields(); + //lotno + if (intStartField == 0) + { + A1 = currentRow[0].ToString().Trim(); // LotNo + if (A1.ToString() == "") + { + modWIN.WriteLog(modWIN.TranslateMsg("[%LotNo%] [%COLUMN%] [%ISEMPTY%]"), iMESLog.iMESLogLevel.Error); + isOk = false; + break ; + } + + // Find the index of the colon (':') in the string + int colIndex1 = A1.IndexOf(":"); + // Extract the value after the colon + LotNo_Import = colIndex1 >= 0 ? A1.Substring(colIndex1 + 1).Trim() : A1; // LotNo_Import + // VendorNo2 = If(colIndex1 >= 0, A1.Substring(0, colIndex1).Trim(), A1 + if (LotNo_Import == null | LotNo_Import == "") + { + modWIN.WriteLog(modWIN.TranslateMsg("[% LotNo %] [% FIELDVALUE %] [% ISEMPTY %]"), iMESLog.iMESLogLevel.Error); + isOk = false; + break; + } + // 找出lotNo: + strSQL = "Select * From tblwiplotbasis A, tblWIPLotState B Where A.BASELOTNO = B.LotNo And B.LotNO = '" + LotNo_Import + "'" + " And B.Status=1"; + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + // 如有找到資料,代表未處理完 + if (!drTemp.Read()) + { + modWIN.WriteLog(modWIN.TranslateMsg("[%LOTSTATUS%][%MUST BE%][%RUNNING%]!!"), iMESLog.iMESLogLevel.Error); + isOk = false; + break; + } + else + { + strLogGroupSerial = drTemp["LogGroupSerial"].ToString(); + MoNo = drTemp["MoNo"].ToString(); + strLotNo = drTemp["LotNo"].ToString(); + } + drTemp.Close(); + } + // EquipmentNo + if (intStartField == 1) + { + A2 = currentRow[0].ToString().Trim() ; // LotNo + if (A2.ToString() == "") + { + modWIN.WriteLog(modWIN.TranslateMsg("[%EquipmentNo%] [%COLUMN%] [%ISEMPTY%]"), iMESLog.iMESLogLevel.Error); + isOk = false; + break; + } + // EquipmentNo ------------------------------------------------ + int colIndex2 = A2.IndexOf(":"); + EquipmentNo_Import = colIndex2 >= 0 ? A2.Substring(colIndex2 + 1).Trim() : A2; // EquipmentNo_Import + + strSQL = "SELECT * FROM tblWIPCont_Equipment where LOGGROUPSERIAL='" + strLogGroupSerial + "' and EquipmentNo = '" + EquipmentNo_Import + "'"; + drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); + // 如有找到資料,代表未處理完 + if (!drTemp.Read()) + { + modWIN.WriteLog(modWIN.TranslateMsg("[%EQUIPMENT%][%MUST BE%][%BATCHLOT%][%CHECK IN%][%EQUIPMENT%]!!"), iMESLog.iMESLogLevel.Error); + isOk = false; + break; + } + drTemp.Close(); + } + // StartTime + if (intStartField == 2) + { + A3 = currentRow[0].ToString().Trim(); // StartTime + if (A3.ToString() == "") + { + modWIN.WriteLog(modWIN.TranslateMsg("[%StartTime%] [%COLUMN%] [%ISEMPTY%]"), iMESLog.iMESLogLevel.Error); + isOk = false; + break; + } + // StartTime ------------------------------------------------ + int colIndex3 = A3.IndexOf(":"); + StartTime_Import = Convert.ToDateTime(colIndex3 >= 0 ? A3.Substring(colIndex3 + 1).Trim() : A3); + } + // EndTime ------------------------------------------------ + if (intStartField == 3) + { + A4 = currentRow[0].ToString().Trim(); + if (A4.ToString () == "") + { + modWIN.WriteLog(modWIN.TranslateMsg("[%EndTime%] [%COLUMN%] [%ISEMPTY%]"), iMESLog.iMESLogLevel.Error); + isOk = false; + break; + } + int colIndex4 = A4.IndexOf(":"); + EndTime_Import = Convert.ToDateTime(colIndex4 >= 0 ? A4.Substring(colIndex4 + 1).Trim() : A4); // + } + //SubstrateQty + if (intStartField == 4) + { + A5 = currentRow[0].ToString().Trim(); + if (A5.ToString ()=="") + { + modWIN.WriteLog(modWIN.TranslateMsg("[%SubstrateQty%] [%COLUMN%] [%ISEMPTY%]"), iMESLog.iMESLogLevel.Error); + isOk = false; + break; + } + // SubstrateQty ------------------------------------------------ + int colIndex5 = A5.IndexOf(":"); + if (int.TryParse(colIndex5 >= 0 ? A5.Substring(colIndex5 + 1).Trim() : A5, out intCheckInteger)) + { + SubstrateQty_Impotr = Convert.ToDouble(colIndex5 >= 0 ? A5.Substring(colIndex5 + 1).Trim() : A5); // SubstrateQty + if (SubstrateQty_Impotr < 0) + { + modWIN.WriteLog(modWIN.TranslateMsg(SubstrateQty_Impotr + "[% MUST BE GREATER THAN OR EQUAL TO %] 0!!"), iMESLog.iMESLogLevel.Error); + isOk = false; + break; + } + } + else + { + modWIN.WriteLog(modWIN.TranslateMsg(A5 + " [%INPUTNUMERIC ERROR%]"), iMESLog.iMESLogLevel.Error); + isOk = false; + break; + } + } + // [Summary Data] + if (intStartField == 6) + { + A6= currentRow[0].ToString().Trim() ; // [Summary Data] + if (A6.ToString()=="") + { + modWIN.WriteLog(modWIN.TranslateMsg("[%Summary Data%] [%COLUMN%] [%ISEMPTY%]"), iMESLog.iMESLogLevel.Error); + isOk = false; + break; + } + } + //开始读取数据 + if (intStartField > 6) + { + if (intStartField == 7) + { + for (int i = 0; i <= currentRow.Length -1; i++) + { + if (currentRow[i].ToString() != "") + { + dtSummary.Columns.Add(currentRow[i].ToString()); + } + } + if (dtSummary.Columns .Count == 0) + { + modWIN.WriteLog(modWIN.TranslateMsg("[%Summary Data%] [%FIELDNAME%] [%ISEMPTY%]!!"), iMESLog.iMESLogLevel.Error); + isOk =false ; + break; + } + } + else + { + if (currentRow[0].ToString()=="" && IsRawData) + {//已经读完 + break; + } + else if(currentRow[0].ToString() != "" && !IsRawData) + {//再读 summary data + DataRow drAdd; + drAdd = dtSummary.NewRow(); + for (int i = 0; i <= dtSummary.Columns.Count - 1; i++) + { + drAdd[i] = currentRow[i].ToString(); + } + dtSummary.Rows.Add(drAdd); + } + else if (currentRow[0].ToString() == "" && !IsRawData) + {//下面要开始读 RawData + IsRawData = true; + RowColIndex = intStartField + 2;//空行加2 + + // 檢查// 找生產批的元件資料 + strSQL = "Select * from TBLWIPCOMPONENTSTATE where lotno='" + LotNo_Import + "'"; + ExecuteSQLQuery_Adapter(strSQL, dtCom, cnnTemp); + strSQL = "Select * From tbl_BReciveMTLBasis Where MaterialNo Is Not Null and MaterilaLotNo='" + LotNo_Import + "'"; + ExecuteSQLQuery_Adapter(strSQL, dtMTLBasis, cnnTemp); + strSQL = "Select * From tblWIPEQPMTLState_Comp Where MONo Is Not Null And MaterialLotNo = '" + LotNo_Import + "'"; + ExecuteSQLQuery_Adapter(strSQL, dtMTLState_Comp, cnnTemp); + + drSel = dtMTLBasis.Select("MaterialLotNo = '" + LotNo_Import + "'"); + if (drSel.Length == 0) + { + modWIN.WriteLog(modWIN.TranslateMsg("[%LotNo%]:" + LotNo_Import + ", [%LOTNO IS NOT IN STRIPMAP%]!!"), iMESLog.iMESLogLevel.Error); + isOk = false; + break; + } + foreach (DataRow dr in dtSummary.Rows) + { + if (dtCom.Rows.Count > 0) + { + // 生產批有元件資料, 且元件編號為來料基板, 必須一定在同一生產批中必須能夠找到對應的元件編號; + blnSubStrateIdExist = false; + for (int j = 0; j <= dtCom.Rows.Count - 1; j++) + { + if (dr["SubStrateId"].ToString() == dtCom.Rows[j]["ComponentNo"].ToString()) + { + blnSubStrateIdExist = true; + break; + } + } + if (blnSubStrateIdExist == false)// '生產批中找不到對應的元件編號 + { + modWIN.WriteLog(modWIN.TranslateMsg("[%CAN NOT FIND THE CORRESPONDING COMPONENTNO IN LOT%]!!"), iMESLog.iMESLogLevel.Error); + isOk = false; + break; + } + } + else//''若生產批無元件資料, 檔案中的基板編號必須在來料基板存在資料, 且設備上料現況中必須有指定的基板編號 + { + drSel = dtMTLBasis.Select("ComponentNo = '" + dr["SubStrateId"].ToString() + "'" + " And SubstrateSubIndex = '" + dr["SubstrateSubIndex"].ToString() + "'"); + if (drSel.Length == 0)// '無資料 + { + modWIN.WriteLog(modWIN.TranslateMsg("[%SubStrateId%]: " + dr["SubStrateId"].ToString() + " [%IS NOT EXIST%]!!"), iMESLog.iMESLogLevel.Error); + isOk = false; + break; + } + else//'有資料取出MaterialNo,MaterialLotNo,ComponentNo 作為設備是否上料的檢查條件 + { + drSel1 = dtMTLState_Comp.Select("EquipmentNo = '" + EquipmentNo_Import + "'" + " And MaterialNo = '" + drSel[0]["MaterialNo"].ToString() + "'" + " And MaterialLotNo = '" + drSel[0]["MaterialLotNo"].ToString() + "'" + " And ComponentNo = '" + drSel[0]["ComponentNo"].ToString() + "'" + " And MoNo = '" + MoNo + "'"); + if (drSel1.Length == 0) + { + modWIN.WriteLog(modWIN.TranslateMsg("[%[%SubStrateId%]: " + dr["SubStrateId"].ToString() + "[%StripMapLayer%]: " + dr["SubstrateSubIndex"].ToString() + ", [%NO SUBSTRATE ON EQUIPMENT%]!!"), iMESLog.iMESLogLevel.Error); + isOk = false; + break; + } + } + } + } + if (!isOk) + { + break ; + } + } + else + {//读 RawData + if (intStartField>=RowColIndex) + { + if (intStartField == RowColIndex && RowColIndex != -1) + { + for (int i = 0; i <= currentRow.Length - 1; i++) + { + if (currentRow[i].ToString() != "") + { + dtRaw.Columns.Add(currentRow[i].ToString()); + } + } + if (dtRaw.Columns.Count == 0) + { + modWIN.WriteLog(modWIN.TranslateMsg("[%Raw Data%] [%FIELDNAME%] [%ISEMPTY%]!!"), iMESLog.iMESLogLevel.Error); + isOk = false; + break; + } + } + else + { + DataRow drAdd; + drAdd = dtRaw.NewRow(); + for (int i = 0; i <= dtRaw.Columns.Count - 1; i++) + { + drAdd[i] = currentRow[i].ToString(); + } + dtRaw.Rows.Add(drAdd); + } + } + + } + } + } + + intStartField++; + } + } + catch (Exception ex) + { + modWIN.WriteLog("读档中错误:" + ex.Message, iMESLog.iMESLogLevel.Error); + isOk = false; + } + } + if (!isOk) + { + funMoveFailFile(FileName, strFailPath, DirName); + continue; + } + //读档结束 + // 檢查 dtSummary 表 + foreach (DataRow row in dtSummary.Rows) + { + foreach (DataColumn column in dtSummary.Columns) + { + if (row.IsNull(column)) + { + modWIN.WriteLog(modWIN.TranslateMsg("Summary Data [%COLUMN%]: " + column.ColumnName + " [%NOTALLOWEMPTYVALUE%]!!"), iMESLog.iMESLogLevel.Error); + isOk = false; + break; + } + } + } + if (!isOk) + { + funMoveFailFile(FileName, strFailPath, DirName); + continue; + } + // 檢查 dtRaw 表 + foreach (DataRow row in dtRaw.Rows) + { + foreach (DataColumn column in dtRaw.Columns) + { + if (row.IsNull(column)) + { + modWIN.WriteLog(modWIN.TranslateMsg("Raw Data [%COLUMN%]:" + column.ColumnName + " [%NOTALLOWEMPTYVALUE%]!!"), iMESLog.iMESLogLevel.Error); + isOk = false; + break; + } + } + } + if (!isOk) + { + funMoveFailFile(FileName, strFailPath, DirName); + continue; + } + + + // 步驟 1: 建立一個 HashSet 來追蹤已經出現的組合 (SubStrateId, Row, Column) + HashSet uniqueCombinations = new HashSet(); + + // 步驟 2: 檢查 DataTable 中的每一個資料列 + foreach (DataRow row in dtRaw.Rows) + { + // 從資料列中取得 SubStrateId、Row、Column 的值 + string substrateId = row["SubStrateId"].ToString(); + string rowValue = row["Row"].ToString(); + string columnValue = row["Column"].ToString(); + string SubstrateSubIndex = row["SubstrateSubIndex"].ToString(); + + if (int.TryParse(row["Row"].ToString(), out intCheckInteger)) + { + if (Convert.ToInt32(row["Row"].ToString()) < 0) + { + modWIN.WriteLog(modWIN.TranslateMsg("[%COLUMN%]" + " Row" + " [%MUST BE GREATER THAN OR EQUAL TO%] 0"), iMESLog.iMESLogLevel.Error); + isOk = false; + break; + } + } + else + { + modWIN.WriteLog(modWIN.TranslateMsg("[%COLUMN%]" + " Row" + " [%INPUTNUMERIC ERROR%]"), iMESLog.iMESLogLevel.Error); + isOk = false; + break; + } + + if (int.TryParse(row["Column"].ToString(), out intCheckInteger)) + { + if (Convert.ToInt32(row["Column"].ToString()) < 0) + { + modWIN.WriteLog(modWIN.TranslateMsg("[%COLUMN%]" + " Column" + " [%MUST BE GREATER THAN OR EQUAL TO%] 0"), iMESLog.iMESLogLevel.Error); + isOk = false; + break; + } + } + else + { + modWIN.WriteLog(modWIN.TranslateMsg("[%COLUMN%]" + " Column" + " [%INPUTNUMERIC ERROR%]"), iMESLog.iMESLogLevel.Error); + isOk = false; + break; + } + + if (int.TryParse(row["SubstrateSubIndex"].ToString(), out intCheckInteger)) + { + if (Convert.ToInt32(row["SubstrateSubIndex"].ToString()) < 0) + { + modWIN.WriteLog(modWIN.TranslateMsg("[%COLUMN%]" + " SubstrateSubIndex" + " [%MUST BE GREATER THAN OR EQUAL TO%] 0"), iMESLog.iMESLogLevel.Error); + isOk = false; + break; + + } + } + else + { + + modWIN.WriteLog(modWIN.TranslateMsg("[%COLUMN%]" + " SubstrateSubIndex" + " [%INPUTNUMERIC ERROR%]"), iMESLog.iMESLogLevel.Error); + isOk = false; + break; + } + // 組合成唯一的鍵值, 用來判斷是否已經出現相同的組合 + string combinationKey = @"{substrateId}_{rowValue}_{columnValue}_{SubstrateSubIndex}"; + // 檢查這個組合是否已經出現過, 如果是, 則報錯 + if (uniqueCombinations.Contains(combinationKey)) + { + modWIN.WriteLog(modWIN.TranslateMsg("[%IMPORT DATA%]" + " SubStrateId、Row、Column、SubstrateSubIndex " + "[%COLUMN%]" + " [%IS NOT ONLY ONE ROW%]"), iMESLog.iMESLogLevel.Error); + isOk = false; + break; + } + // 如果組合沒有出現過, 將其加入 HashSet 中, 以便後續檢查 + uniqueCombinations.Add(combinationKey); + } + if (!isOk) + { + funMoveFailFile(FileName, strFailPath, DirName); + continue; + } + dtSummary.Columns.Add("CheckResult", typeof(string)); + + strSQL = "Select * From tbl_BSubstrateMAPState Where MaterialLotNo Is Not Null And MaterialLotNo = '" + strLotNo + "' "; + ExecuteSQLQuery_Adapter(strSQL, dtUpdateSubStrate, cnnTemp); + dtUpdateSubStrate.Columns.Add("blnAdd", System.Type.GetType("System.Boolean")); + strSQL = "Select * From tbl_BInklessMAPState Where MaterialLotNo Is Not Null And MaterialLotNo = '" + strLotNo + "' "; + ExecuteSQLQuery_Adapter(strSQL, dtUpdateInkless, cnnTemp); + dtUpdateInkless.Columns.Add("blnAdd", System.Type.GetType("System.Boolean")); + // 暫存用 + DataTable dtSubstrateMAPState; + dtSubstrateMAPState = dtUpdateSubStrate.Clone(); + DataTable dtInklessMAPState; + dtInklessMAPState = dtUpdateInkless.Clone(); + + // 檢查dtRaw + foreach (DataRow drRaw in dtRaw.Rows) + { + blnSubStrateIdExist = false; + // SubStrateId: 基板編號, 必須是Summary Data(dtSummary)的基板編號的其中之一 + foreach (DataRow drSummary in dtSummary.Rows) + { + if (drRaw["SubStrateId"].ToString() == drSummary["SubStrateId"].ToString()) + { + blnSubStrateIdExist = true; + break; + } + } + if (blnSubStrateIdExist == false) + { + modWIN.WriteLog(modWIN.TranslateMsg("[%COLUMN%] SubStrateId: " + drRaw["SubStrateId"].ToString() + ", [%SUBSTRATEID IS NOT IN SUMMARY DATA%]!!"), iMESLog.iMESLogLevel.Error); + isOk = false; + break; + } + + // ========== + // 基板的子鍵位數值必須為大於零的正整數 + if (int.TryParse(drRaw["SubstrateSubIndex"].ToString(), out intCheckInteger)) + { + if (Convert.ToInt32(drRaw["SubstrateSubIndex"].ToString()) < 0) + { + modWIN.WriteLog(modWIN.TranslateMsg("[%COLUMN%]" + " SubstrateSubIndex" + " [%MUST BE GREATER THAN OR EQUAL TO%] 0!!"), iMESLog.iMESLogLevel.Error); + isOk = false; + break; + } + } + else + { + modWIN.WriteLog(modWIN.TranslateMsg("[%COLUMN%]" + " SubstrateSubIndex" + " [%INPUTNUMERIC ERROR%]"), iMESLog.iMESLogLevel.Error); + isOk = false; + break; + } + // 基板的子鍵位數值必須小於等於來料基板的子鍵位 + drSel = dtMTLBasis.Select("MaterialLotNo = '" + strLotNo + "'" + " And ComponentNo = '" + drRaw["SubStrateId"].ToString() + "'"); + if (drSel.Length > 0) + { + if (Convert.ToInt32(drRaw["SubstrateSubIndex"]) > Convert.ToInt32(drSel[0]["SubstrateSubIndex"])) + { + modWIN.WriteLog(modWIN.TranslateMsg("[%SUBSTRATESUBINDEX MUST BE LESS THAN SUBSTRATESUBINDEX IN RECIVEMTL%]"), iMESLog.iMESLogLevel.Error); + isOk = false; + break; + } + } + + // ========== + // 基板的X軸位置,Y軸位置必須為整數 + if (int.TryParse(drRaw["Row"].ToString(), out intCheckInteger)) + { + if (Convert.ToInt32(drRaw["Row"].ToString()) < 0) + { + modWIN.WriteLog(modWIN.TranslateMsg("[%COLUMN%]" + " Row" + " [%MUST BE GREATER THAN OR EQUAL TO%] 0"), iMESLog.iMESLogLevel.Error); + isOk = false; + break; + } + } + else + { + modWIN.WriteLog(modWIN.TranslateMsg("[%COLUMN%]" + " Row" + " [%INPUTNUMERIC ERROR%]"), iMESLog.iMESLogLevel.Error); + isOk = false; + break; + } + + if (int.TryParse(drRaw["Column"].ToString(), out intCheckInteger)) + { + if (Convert.ToInt32(drRaw["Column"].ToString()) < 0) + { + modWIN.WriteLog(modWIN.TranslateMsg("[%COLUMN%]" + " Column" + " [%MUST BE GREATER THAN OR EQUAL TO%] 0"), iMESLog.iMESLogLevel.Error); + isOk = false; + break; + } + } + else + { + modWIN.WriteLog(modWIN.TranslateMsg("[%COLUMN%]" + " Column" + " [%INPUTNUMERIC ERROR%]"), iMESLog.iMESLogLevel.Error); + isOk = false; + break; + + } + + // 基板的X軸位置,Y軸位置必須在基板中存在 + DataRow[] drSubstrate; + drSubstrate = dtUpdateSubStrate.Select("ComponentNo = '" + drRaw["SubStrateId"].ToString() + "'" + " And CoordinateX = '" + drRaw["Row"].ToString() + "'" + " And CoordinateY = '" + drRaw["Column"].ToString() + "'" + " And SubstrateSubIndex = '" + drRaw["SubstrateSubIndex"].ToString() + "'"); + if (drSubstrate.Length == 0) + { + modWIN.WriteLog(modWIN.TranslateMsg("[%COLUMN%] SubStrateId: " + drRaw["SubStrateId"].ToString() + "," + Constants.vbCrLf + " Row: " + drRaw["Row"].ToString() + ", Column: " + drRaw["Column"].ToString() + ", SubstrateSubIndex: " + drRaw["SubstrateSubIndex"].ToString() + "," + Constants.vbCrLf + "[%Coordinate is not exist%]!!"), iMESLog.iMESLogLevel.Error); + isOk = false; + break; + } + + if (Convert.ToInt32(drSubstrate[0]["Result"]) == 2) + { + modWIN.WriteLog(modWIN.TranslateMsg("[%COLUMN%] SubStrateId: " + drRaw["SubStrateId"].ToString() + "," + Constants.vbCrLf + " Row: " + drRaw["Row"].ToString() + ", Column: " + drRaw["Column"].ToString() + ", SubstrateSubIndex: " + drRaw["SubstrateSubIndex"].ToString() + "," + Constants.vbCrLf + "[%STATUS MUST Not BE DUMMY%]!!"), iMESLog.iMESLogLevel.Error); + isOk = false; + break; + } + + // tbl_BSubstrateMAPState.AttachLotNo is null + if (drSubstrate[0]["AttachLotNo"].ToString() != "") + { + modWIN.WriteLog(modWIN.TranslateMsg("[%COLUMN%] SubStrateId: " + drRaw["SubStrateId"].ToString() + "," + Constants.vbCrLf + " Row: " + drRaw["Row"].ToString() + ", Column: " + drRaw["Column"].ToString() + ", SubstrateSubIndex: " + drRaw["SubstrateSubIndex"].ToString() + "," + Constants.vbCrLf + "[%ATTACH IS EXIST%]!!"), iMESLog.iMESLogLevel.Error); + isOk = false; + break; + } + + // 封裝來料芯片的X軸位置,Y軸位置必須為整數 + if (int.TryParse(drRaw["WaferCoordinateX"].ToString(), out intCheckInteger)) + { + if (Convert.ToInt32(drRaw["WaferCoordinateX"].ToString()) < 0) + { + modWIN.WriteLog(modWIN.TranslateMsg("[%COLUMN%]" + " WaferCoordinateX" + " [%MUST BE GREATER THAN OR EQUAL TO%] 0"), iMESLog.iMESLogLevel.Error); + isOk = false; + break; + } + } + else + { + modWIN.WriteLog(modWIN.TranslateMsg("[%COLUMN%]" + " WaferCoordinateX" + " [%INPUTNUMERIC ERROR%]"), iMESLog.iMESLogLevel.Error); + isOk = false; + break; + } + + if (int.TryParse(drRaw["WaferCoordinateY"].ToString(), out intCheckInteger)) + { + if (Convert.ToInt32(drRaw["WaferCoordinateY"].ToString()) < 0) + { + modWIN.WriteLog(modWIN.TranslateMsg("[%COLUMN%]" + " WaferCoordinateY" + " [%MUST BE GREATER THAN OR EQUAL TO%] 0"), iMESLog.iMESLogLevel.Error); + isOk = false; + break; + } + } + else + { + modWIN.WriteLog(modWIN.TranslateMsg("[%COLUMN%]" + " WaferCoordinateY" + " [%INPUTNUMERIC ERROR%]"), iMESLog.iMESLogLevel.Error); + isOk = false; + break; + } + // ======= + + // '封裝來料芯片的來料批號(WaferLot)必須存在來料芯片圖譜 + drSel = dtUpdateInkless.Select("MaterialLotNo = '" + drRaw["WaferLot"].ToString() + "'"); + if (drSel.Length == 0) + { + modWIN.WriteLog(modWIN.TranslateMsg("[%COLUMN%] WaferLot: " + drRaw["WaferLot"].ToString() + "," + "[%WAFER IS NOT EXIST%]"), iMESLog.iMESLogLevel.Error); + isOk = false; + break; + } + + // 且來料芯片必須存在設備上料現況 + drSel = dtMTLBasis.Select("WaferLot = '" + drRaw["WaferLot"].ToString() + "'" + " And WaferID = '" + drRaw["WaferID"].ToString() + "'"); + if (drSel.Length == 0) + { + modWIN.WriteLog(modWIN.TranslateMsg("[%RECIVEMTLBASIS%][%No wafer data%]" + Constants.vbCrLf + "[%COLUMN%] WaferLot: " + drRaw["WaferLot"].ToString() + ", WaferID: " + drRaw["WaferID"].ToString() + " [%IS NOT EXIST%]!!"), iMESLog.iMESLogLevel.Error); + isOk = false; + break; + } + else + { + drSel1 = dtMTLState_Comp.Select("EquipmentNo = '" + EquipmentNo_Import + "'" + " And MaterialNo = '" + drSel[0]["MaterialNo"].ToString() + "'" + " And MaterialLotNo = '" + drSel[0]["MaterialLotNo"].ToString() + "'" + " And ComponentNo = '" + drSel[0]["ComponentNo"].ToString() + "'" + " And MoNo = '" + MoNo + "'"); + if (drSel1.Length == 0) + { + modWIN.WriteLog(modWIN.TranslateMsg("[%COLUMN%] WaferLot: " + drRaw["WaferLot"].ToString() + ", [%NO WAFERS ON EQUIPMENT%]"), iMESLog.iMESLogLevel.Error); + isOk = false; + break; + } + } + + // 封裝來料芯片的X,Y位置, 必須在芯片圖譜中存在 + DataRow[] drInkless; + drInkless = dtUpdateInkless.Select("MaterialLotNo = '" + drRaw["WaferLot"].ToString() + "'" + " And CoordinateX = '" + drRaw["WaferCoordinateX"].ToString() + "'" + " And CoordinateY = '" + drRaw["WaferCoordinateY"].ToString() + "'"); + if (drInkless.Length == 0) + { + modWIN.WriteLog(modWIN.TranslateMsg("[%COLUMN%] WaferLot: " + drRaw["WaferLot"].ToString() + "," + Constants.vbCrLf + "WaferCoordinateX: " + drRaw["WaferCoordinateX"].ToString() + ", WaferCoordinateY: " + drRaw["WaferCoordinateY"].ToString() + "," + Constants.vbCrLf + "[%WAFER IS NOT EXIST%]"), iMESLog.iMESLogLevel.Error); + isOk = false; + break; + } + else + { + if (Convert.ToInt32(drInkless[0]["Result"]) != 0) + { + modWIN.WriteLog(modWIN.TranslateMsg("[%COLUMN%] WaferLot: " + drRaw["WaferLot"].ToString() + "," + Constants.vbCrLf + "WaferCoordinateX: " + drRaw["WaferCoordinateX"].ToString() + ", WaferCoordinateY: " + drRaw["WaferCoordinateY"].ToString() + "," + Constants.vbCrLf + "[%MUST BE GOOD%]!!"), iMESLog.iMESLogLevel.Error); + isOk = false; + break; + } + if (drInkless[0]["AttachLotNo"].ToString() != "") + { + modWIN.WriteLog(modWIN.TranslateMsg("[%COLUMN%] WaferLot: " + drRaw["WaferLot"].ToString() + "," + Constants.vbCrLf + "WaferCoordinateX: " + drRaw["WaferCoordinateX"].ToString() + ", WaferCoordinateY: " + drRaw["WaferCoordinateY"].ToString() + "," + Constants.vbCrLf + "[%WAFER IS ATTACHED%]!!"), iMESLog.iMESLogLevel.Error); + isOk = false; + break; + } + } + string strWaferIDText = ""; + string strWaferId = ""; + + // '找出DataSet中的WaferIDText + drSel = dtMTLBasis.Select("MaterialLotNo = '" + strLotNo + "'" + "And ComponentNo = '" + drRaw["SubStrateId"].ToString() + "'"); + if (drSel.Length > 0) + { + if (drSel[0]["WaferIDText"].ToString() != "") + strWaferIDText = drSel[0]["WaferIDText"].ToString(); + else + strWaferIDText = ""; + } + // 寫入datatable傳到後端存入資料庫 + // update datatable + strWaferId = drRaw["WaferID"].ToString(); + + // Substrate + DataRow drS = dtSubstrateMAPState.NewRow(); + drS["AttachLotNo"] = strLotNo; + drS["AttachEquipmentNo"] = EquipmentNo_Import; + if (strLogGroupSerial != defString) + drS["AttachLogGroupSerial"] = strLogGroupSerial; + drS["SubstrateSubIndex"] = drRaw["SubstrateSubIndex"].ToString(); + drS["ComponentNo"] = drRaw["SubStrateId"].ToString(); + drS["CoordinateX"] = drRaw["Row"].ToString(); + drS["CoordinateY"] = drRaw["Column"].ToString(); + drS["FromWaferLot"] = drInkless[0]["MaterialLotNo"].ToString(); + drS["FromWaferId"] = strWaferId; + if (strWaferIDText != defString) + drS["FromWaferIDText"] = strWaferIDText; + if (drInkless[0]["BinNo"].ToString() != "") + drS["FromWaferBinNo"] = drInkless[0]["BinNo"].ToString(); + drS["FromCoordinateX"] = drInkless[0]["CoordinateX"]; + drS["FromCoordinateY"] = drInkless[0]["CoordinateY"]; + drS["AttachUserNo"] = "EAP"; + drS["AttachEventTime"] = Strings.Format(DateTime.Now, "yyyy/MM/dd HH:mm:ss"); + drS["blnAdd"] = true; + dtSubstrateMAPState.Rows.Add(drS); + + // Inkless + if (!Information.IsNothing(drInkless)) + { + DataRow[] drchkExist = dtInklessMAPState.Select("MaterialLotNo = '" + drRaw["WaferLot"].ToString() + "'" + " And CoordinateX = '" + drRaw["WaferCoordinateX"].ToString() + "'" + " And CoordinateY = '" + drRaw["WaferCoordinateY"].ToString() + "'"); + if (drchkExist.Length > 0) + { + modWIN.WriteLog(modWIN.TranslateMsg("[%COLUMN%] WaferLot: " + drRaw["WaferLot"].ToString() + "," + Constants.vbCrLf + "WaferCoordinateX: " + drRaw["WaferCoordinateX"].ToString() + ", WaferCoordinateY: " + drRaw["WaferCoordinateY"].ToString() + "," + Constants.vbCrLf + "[%DUPLICATE DATA%]"), iMESLog.iMESLogLevel.Error); + isOk = false; + break; + } + + DataRow drI = dtInklessMAPState.NewRow(); + // 存入datatable + drI["MaterialLotNo"] = drInkless[0]["MaterialLotNo"].ToString(); + drI["ComponentNo"] = drInkless[0]["ComponentNo"].ToString(); + drI["CoordinateX"] = drInkless[0]["CoordinateX"]; + drI["CoordinateY"] = drInkless[0]["CoordinateY"]; + drI["BinNo"] = drInkless[0]["BinNo"]; + drI["Result"] = drInkless[0]["Result"]; + drI["AttachEquipmentNo"] = EquipmentNo_Import; + drI["AttachLotNo"] = strLotNo; + drI["AttachLogGroupSerial"] = strLogGroupSerial; + drI["SubstrateMaterialLotNo"] = drInkless[0]["MaterialLotNo"].ToString(); // 基板的物料批號 + drI["SubstrateComponentNo"] = drRaw["SubStrateId"].ToString(); + drI["SubstrateCoordinateX"] = drRaw["Row"].ToString(); + drI["SubstrateCoordinateY"] = drRaw["Column"].ToString(); + drI["SubstrateSubIndex"] = drRaw["SubstrateSubIndex"].ToString(); + drI["AttachUserNo"] = "EAP"; + drI["AttachEventTime"] = Strings.Format(DateTime.Now, "yyyy/MM/dd HH:mm:ss"); + + drI["Reviser"] = ""; + drI["ReviseDate"] = ""; + + drI["blnAdd"] = true; + dtInklessMAPState.Rows.Add(drI); + } + } + if (!isOk) + { + funMoveFailFile(FileName, strFailPath, DirName); + continue; + } + // update tbl_BSubstrateMAPState + for (int idx = 0, loopTo = dtSubstrateMAPState.Rows.Count - 1; idx <= loopTo; idx++) + { + if (!(dtSubstrateMAPState.Rows[idx]["blnAdd"] is DBNull)) //有值表示在前端有修改 + { + strSQL = "Update tbl_BSubstrateMAPState" + + " Set Result = " + Convert.ToInt32(dtSubstrateMAPState.Rows[idx]["Result"]) + + ", AttachEquipmentNo = '" + dtSubstrateMAPState.Rows[idx]["AttachEquipmentNo"].ToString() + "'" + + ", AttachLotNo = '" + dtSubstrateMAPState.Rows[idx]["AttachLotNo"].ToString() + "'"; + + if (!(dtSubstrateMAPState.Rows[idx]["AttachLogGroupSerial"] is DBNull)) + strSQL += ", AttachLogGroupSerial = '" + dtSubstrateMAPState.Rows[idx]["AttachLogGroupSerial"].ToString() + "'"; + if (!(dtSubstrateMAPState.Rows[idx]["FromWaferLot"] is DBNull)) + strSQL += ", FromWaferLot = '" + dtSubstrateMAPState.Rows[idx]["FromWaferLot"].ToString() + "'"; + if (!(dtSubstrateMAPState.Rows[idx]["FromWaferID"] is DBNull)) + strSQL += ", FromWaferID = '" + Convert.ToInt32(dtSubstrateMAPState.Rows[idx]["FromWaferID"]) + "'"; + if (!(dtSubstrateMAPState.Rows[idx]["FromWaferIDText"] is DBNull)) + strSQL += ", FromWaferIDText = '" + dtSubstrateMAPState.Rows[idx]["FromWaferIDText"].ToString() + "'"; + if (!(dtSubstrateMAPState.Rows[idx]["FromWaferBinNo"] is DBNull)) + strSQL += ", FromWaferBinNo = '" + Convert.ToInt32(dtSubstrateMAPState.Rows[idx]["FromWaferBinNo"]) + "'"; + if (!(dtSubstrateMAPState.Rows[idx]["FromCoordinateX"] is DBNull)) + strSQL += ", FromCoordinateX = '" + Convert.ToInt32(dtSubstrateMAPState.Rows[idx]["FromCoordinateX"]) + "'"; + if (!(dtSubstrateMAPState.Rows[idx]["FromCoordinateY"] is DBNull)) + strSQL += ", FromCoordinateY = '" + Convert.ToInt32(dtSubstrateMAPState.Rows[idx]["FromCoordinateY"]) + "'"; + + if (Convert.ToBoolean(dtSubstrateMAPState.Rows[idx]["blnAdd"]) == true) //表示為新增資料 + { + strSQL += ", AttachUserNo = '" + dtSubstrateMAPState.Rows[idx]["AttachUserNo"].ToString() + "'"; + strSQL += ", AttachEventTime = To_Date('" + Strings.Format(DateTime.Now, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')"; + } + else //表示為修改資料 + { + strSQL += ", Reviser = '" + dtSubstrateMAPState.Rows[idx]["Reviser"].ToString() + "'"; + strSQL += ", ReviseDate = To_Date('" + Strings.Format(DateTime.Now, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')"; + } + strSQL += " Where MaterialLotNo = '" + dtSubstrateMAPState.Rows[idx]["MaterialLotNo"].ToString() + "'" + + " And ComponentNo = '" + dtSubstrateMAPState.Rows[idx]["ComponentNo"].ToString() + "'" + + " And CoordinateX = '" + Convert.ToInt32(dtSubstrateMAPState.Rows[idx]["CoordinateX"]) + "'" + + " And CoordinateY = '" + Convert.ToInt32(dtSubstrateMAPState.Rows[idx]["CoordinateY"]) + "'" + + " And SubstrateSubIndex = '" + Convert.ToInt32(dtSubstrateMAPState.Rows[idx]["SubstrateSubIndex"]) + "'"; + CollectionSQL.Add(strSQL); + CollectionSQL_Rows.Add(1); + } + } + + // update tbl_BInklessMAPState + for (int idx = 0, loopTo = dtInklessMAPState.Rows.Count - 1; idx <= loopTo; idx++) + { + if (!(dtInklessMAPState.Rows[idx]["blnAdd"] is DBNull)) //有值表示在前端有修改 + { + strSQL = "Update tbl_BInklessMAPState Set " + + " AttachEquipmentNo = '" + dtInklessMAPState.Rows[idx]["AttachEquipmentNo"].ToString() + "'" + + ", AttachLotNo = '" + dtInklessMAPState.Rows[idx]["AttachLotNo"].ToString() + "'"; + + if (!(dtInklessMAPState.Rows[idx]["AttachLogGroupSerial"] is DBNull)) + strSQL += ", AttachLogGroupSerial = '" + dtInklessMAPState.Rows[idx]["AttachLogGroupSerial"].ToString() + "'"; + + if (!(dtInklessMAPState.Rows[idx]["SubstrateMaterialLotNo"] is DBNull)) + strSQL += ", SubstrateMaterialLotNo = '" + dtInklessMAPState.Rows[idx]["SubstrateMaterialLotNo"].ToString() + "'"; + + if (!(dtInklessMAPState.Rows[idx]["SubstrateComponentNo"] is DBNull)) + strSQL += ", SubstrateComponentNo = '" + dtInklessMAPState.Rows[idx]["SubstrateComponentNo"].ToString() + "'"; + + if (!(dtInklessMAPState.Rows[idx]["SubstrateCoordinateX"] is DBNull)) + strSQL += ", SubstrateCoordinateX = '" + Convert.ToInt32(dtInklessMAPState.Rows[idx]["SubstrateCoordinateX"]) + "'"; + + if (!(dtInklessMAPState.Rows[idx]["SubstrateCoordinateY"] is DBNull)) + strSQL += ", SubstrateCoordinateY = '" + Convert.ToInt32(dtInklessMAPState.Rows[idx]["SubstrateCoordinateY"]) + "'"; + + if (!(dtInklessMAPState.Rows[idx]["SubstrateSubIndex"] is DBNull)) + strSQL += ", SubstrateSubIndex = '" + Convert.ToInt32(dtInklessMAPState.Rows[idx]["SubstrateSubIndex"]) + "'"; + + if (Convert.ToBoolean(dtInklessMAPState.Rows[idx]["blnAdd"]) == true) + { + strSQL += ", AttachUserNo = '" + dtInklessMAPState.Rows[idx]["AttachUserNo"].ToString() + "'"; + strSQL += ", AttachEventTime = To_Date('" + Strings.Format(DateTime.Now, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')"; + } + else + { + strSQL += ", Reviser = '" + dtInklessMAPState.Rows[idx]["Reviser"].ToString() + "'"; + strSQL += ", ReviseDate = To_Date('" + Strings.Format(DateTime.Now, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')"; + } + + strSQL += " Where MaterialLotNo = '" + dtInklessMAPState.Rows[idx]["MaterialLotNo"].ToString() + "'" + + " And ComponentNo = '" + dtInklessMAPState.Rows[idx]["ComponentNo"].ToString() + "'" + + " And CoordinateX = '" + Convert.ToInt32(dtInklessMAPState.Rows[idx]["CoordinateX"]) + "'" + + " And CoordinateY = '" + Convert.ToInt32(dtInklessMAPState.Rows[idx]["CoordinateY"]) + "'"; + CollectionSQL.Add(strSQL); + CollectionSQL_Rows.Add(1); + } + } + ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, CollectionSQL, CollectionSQL_Rows); + + // //目錄不存在時必須要先建立 + if (Directory.Exists(strDestinationPath + DirName) == false) + { + Directory.CreateDirectory(strDestinationPath + DirName); + } + // //檔案已存在Destination必須先刪除 + if (File.Exists(strDestinationPath + DirName + @"\" + Path.GetFileName(FileName)) == true) + { + File.Delete(strDestinationPath + DirName + @"\" + Path.GetFileName(FileName)); + } + // //移動檔案Queue至Destination + File.Move(FileName, strDestinationPath + DirName + @"\" + Path.GetFileName(FileName)); + + if (dsTemp != null) + { + dsTemp.Dispose(); + dsTemp = null; + } + modWIN.WriteLog("读档成功:"+Path.GetFileName(FileName), iMESLog.iMESLogLevel.Trace ); + } + catch (Exception ex) + { + modWIN.WriteLog(FileName + ex.Message, iMESLog.iMESLogLevel.Error); + funMoveFailFile(FileName, strFailPath, DirName); + continue; + } + modWIN.WriteLog("读档结束:" + Path.GetFileName(FileName), iMESLog.iMESLogLevel.Trace); + } + } + // //回傳Success + funParsingDieAttchInfoRet = "success"; + } + catch (Exception ex) + { + // //檔案處理失敗時移動檔案Queue至Fail + if (!string.IsNullOrEmpty(FileName) && blnMoveFile == true) + { + funMoveFailFile(FileName, strFailPath, DirName); + } + // //回傳錯誤原因 + // 寫入log資料 + modWIN.WriteLog(ex.Message, iMESLog.iMESLogLevel.Error); + funParsingDieAttchInfoRet = "fail," + ex.Message; + } + + finally + { + // //Close Connection + CloseConnection(cnnTemp); + + } + + return funParsingDieAttchInfoRet; + + } + + public void funMoveFailFile(string strFromPath,string strToPath, string DirName) + { + modWIN.WriteLog("读档失败" + Path.GetFileName(strFromPath) , iMESLog.iMESLogLevel.Trace ); + // //目錄不存在時必須要先建立 + if (Directory.Exists(strToPath + DirName) == false) + { + Directory.CreateDirectory(strToPath + DirName); + } + // //檔案已存在File必須先刪除 + if (File.Exists(strToPath + DirName + @"\" + Path.GetFileName(strFromPath)) == true) + { + File.Delete(strToPath + DirName + @"\" + Path.GetFileName(strFromPath)); + } + // //移動檔案Queue至Fail + try + { + File.Move(strFromPath, strToPath + DirName + @"\" + Path.GetFileName(strFromPath)); + } + catch (Exception ex) + { + modWIN.WriteLog("转移档案失败"+ strFromPath + ex.Message, iMESLog.iMESLogLevel.Error); + } + } + #endregion + + } +} diff --git a/SRC/MESAgent/MESAutoLoader/AutoLoaderLib/modAutoLoaderLibrary.cs b/SRC/MESAgent/MESAutoLoader/AutoLoaderLib/modAutoLoaderLibrary.cs new file mode 100644 index 0000000..53a3eac --- /dev/null +++ b/SRC/MESAgent/MESAutoLoader/AutoLoaderLib/modAutoLoaderLibrary.cs @@ -0,0 +1,948 @@ +using System; +using System.Data; +using System.Runtime.InteropServices; +using Microsoft.VisualBasic; +using Microsoft.VisualBasic.CompilerServices; +using static iMESCore.Base.iMESConst; +using static iMESCore.Base.iMESComXML; + +namespace AutoLoaderLib_Base +{ + static class modAutoLoaderLibrary + { + public enum GroupType + { + UserGroup = 0, // 使用者群組 + IssueGroup = 1, // 簽核群組 + EquipmentGroup = 2, // 設備工程師群組 + InventoryGroup = 3, // 庫房工程師群組 + ReportGroup = 4, // 報表使用群組 + ERFDispositionGroup = 5, // 異常處理群組 + ERFMailccGroup = 6 // 附件收件人群組 + } + + private static string InXml, OutXml, strIdentity, strParameter, XmlData, XmlSchema; + + #region 計算最大、最小、總合、平方根、良品數 + + /// + /// + /// + /// 原vb預設值true + /// 原vb預設值true + /// 原vb預設值true + /// + /// + public static bool funCalculateMinMaxSumSqr(ref bool blnGoodFlag_Yield, ref bool blnGoodFlag_Avg, ref bool blnGoodFlag_AOI, + DataRow rowRawData, string colFieldName, ref DataRow rowReslut, + DataRow rowRawData_SpecYield, string min_colFieldName, string max_colFieldName, + DataRow rowRawData_SpecAvg, DataRow rowRawData_SpecEng, string colFieldName_IR = defString + ) + { + bool funCalculateMinMaxSumSqrRet = default(bool); + + + // //符合規格的顆數(AVG) + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectGreaterEqual(decimal.Parse(Conversions.ToString(rowRawData[colFieldName])), rowRawData_SpecAvg[min_colFieldName], false)) && Conversions.ToBoolean(Operators.ConditionalCompareObjectLessEqual(decimal.Parse(Conversions.ToString(rowRawData[colFieldName])), rowRawData_SpecAvg[max_colFieldName], false))) + { + switch (Strings.Mid(colFieldName, 1, 3).ToUpper() ?? "") + { + case "ESD": // 計算ESD的Yield時IR必須也要是Pass + { + if ((colFieldName_IR ?? "") != defString) + { + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectGreaterEqual(decimal.Parse(Conversions.ToString(rowRawData[colFieldName_IR])), rowRawData_SpecAvg[min_colFieldName], false)) && Conversions.ToBoolean(Operators.ConditionalCompareObjectLessEqual(decimal.Parse(Conversions.ToString(rowRawData[colFieldName_IR])), rowRawData_SpecAvg[max_colFieldName], false))) + { + // //更新 + rowReslut.BeginEdit(); + // //Max + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(rowReslut["MaxValue"], decimal.Parse(Conversions.ToString(rowRawData[colFieldName])), false))) + { + rowReslut["MaxValue"] = decimal.Parse(Conversions.ToString(rowRawData[colFieldName])); + } + // //Min + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(rowReslut["MinValue"], -9999, false)) || Conversions.ToBoolean(Operators.ConditionalCompareObjectGreater(rowReslut["MinValue"], decimal.Parse(Conversions.ToString(rowRawData[colFieldName])), false))) + { + rowReslut["MinValue"] = decimal.Parse(Conversions.ToString(rowRawData[colFieldName])); + } + // //IR必須要過ESD才能算 + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectGreaterEqual(decimal.Parse(Conversions.ToString(rowRawData[colFieldName])), rowRawData_SpecEng[min_colFieldName], false)) && Conversions.ToBoolean(Operators.ConditionalCompareObjectLessEqual(decimal.Parse(Conversions.ToString(rowRawData[colFieldName])), rowRawData_SpecEng[max_colFieldName], false)) && Conversions.ToBoolean(Operators.ConditionalCompareObjectGreaterEqual(decimal.Parse(Conversions.ToString(rowRawData[colFieldName_IR])), rowRawData_SpecEng[min_colFieldName], false)) && Conversions.ToBoolean(Operators.ConditionalCompareObjectLessEqual(decimal.Parse(Conversions.ToString(rowRawData[colFieldName_IR])), rowRawData_SpecEng[max_colFieldName], false))) + + + { + // //Yield Die數加一 + rowReslut["GoodQty1"] = Convert.ToInt32(rowReslut["GoodQty1"]) + 1; + // Else + // blnGoodFlag_Yield = False + } + + // //不包含AOIBin欄位判斷Yield + if (colFieldName.ToString().ToUpper() != "AOIBIN") + { + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectGreaterEqual(decimal.Parse(Conversions.ToString(rowRawData[colFieldName])), rowRawData_SpecYield[min_colFieldName], false)) && Conversions.ToBoolean(Operators.ConditionalCompareObjectLessEqual(decimal.Parse(Conversions.ToString(rowRawData[colFieldName])), rowRawData_SpecYield[max_colFieldName], false))) + { + } + else + { + blnGoodFlag_AOI = false; + } + } + + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectGreaterEqual(decimal.Parse(Conversions.ToString(rowRawData[colFieldName])), rowRawData_SpecYield[min_colFieldName], false)) && Conversions.ToBoolean(Operators.ConditionalCompareObjectLessEqual(decimal.Parse(Conversions.ToString(rowRawData[colFieldName])), rowRawData_SpecYield[max_colFieldName], false))) + { + } + else + { + blnGoodFlag_Yield = false; + } + + // '計算IR符合ESD規格的顆數 + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectGreaterEqual(decimal.Parse(Conversions.ToString(rowRawData[colFieldName_IR])), rowRawData_SpecEng[min_colFieldName], false)) && Conversions.ToBoolean(Operators.ConditionalCompareObjectLessEqual(decimal.Parse(Conversions.ToString(rowRawData[colFieldName_IR])), rowRawData_SpecEng[max_colFieldName], false))) + { + rowReslut["IRFitESDSpecQty"] = Convert.ToInt32(rowReslut["IRFitESDSpecQty"]) + 1; + } + // //Sum + rowReslut["SumValue"] = Convert.ToDecimal(rowReslut["SumValue"]) + + decimal.Parse(rowRawData[colFieldName].ToString()); + // //SumSqr + rowReslut["SqrValue"] = Convert.ToDouble(rowReslut["SqrValue"]) + + Math.Pow((double)decimal.Parse(Conversions.ToString(rowRawData[colFieldName])), 2d); + // //Avg Die數加一 + rowReslut["GoodQty2"] = Convert.ToInt32(rowReslut["GoodQty2"]) + 1; + // //更新 + rowReslut.EndEdit(); + // // + funCalculateMinMaxSumSqrRet = true; // //此電性在規格內 + } + else + { + // '計算IR符合ESD規格的顆數 + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectGreaterEqual(decimal.Parse(Conversions.ToString(rowRawData[colFieldName_IR])), rowRawData_SpecEng[min_colFieldName], false)) && Conversions.ToBoolean(Operators.ConditionalCompareObjectLessEqual(decimal.Parse(Conversions.ToString(rowRawData[colFieldName_IR])), rowRawData_SpecEng[max_colFieldName], false))) + { + rowReslut["GoodQty1"] = Convert.ToInt32(rowReslut["GoodQty1"]) + 1; + rowReslut["IRFitESDSpecQty"] = Convert.ToInt32(rowReslut["IRFitESDSpecQty"]) + 1; + // Else + // blnGoodFlag_Yield = False + } + + // //不包含AOIBin欄位判斷Yield + if (colFieldName.ToString().ToUpper() != "AOIBIN") + { + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectGreaterEqual(decimal.Parse(Conversions.ToString(rowRawData[colFieldName])), rowRawData_SpecYield[min_colFieldName], false)) && Conversions.ToBoolean(Operators.ConditionalCompareObjectLessEqual(decimal.Parse(Conversions.ToString(rowRawData[colFieldName])), rowRawData_SpecYield[max_colFieldName], false))) + { + } + else + { + blnGoodFlag_AOI = false; + } + } + + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectGreaterEqual(decimal.Parse(Conversions.ToString(rowRawData[colFieldName])), rowRawData_SpecYield[min_colFieldName], false)) && Conversions.ToBoolean(Operators.ConditionalCompareObjectLessEqual(decimal.Parse(Conversions.ToString(rowRawData[colFieldName])), rowRawData_SpecYield[max_colFieldName], false))) + { + } + else + { + blnGoodFlag_Yield = false; + } + + funCalculateMinMaxSumSqrRet = false; // //回傳此電性在規格外 + blnGoodFlag_Avg = false; + } + } + else + { + throw new Exception("無法取得檔案中" + colFieldName_IR + "所對應的電性欄位!!"); + } + + break; + } + + default: + { + // //更新 + rowReslut.BeginEdit(); + // //Max + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(rowReslut["MaxValue"], decimal.Parse(Conversions.ToString(rowRawData[colFieldName])), false))) + { + rowReslut["MaxValue"] = decimal.Parse(Conversions.ToString(rowRawData[colFieldName])); + } + // //Min + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(rowReslut["MinValue"], -9999, false)) || Conversions.ToBoolean(Operators.ConditionalCompareObjectGreater(rowReslut["MinValue"], decimal.Parse(Conversions.ToString(rowRawData[colFieldName])), false))) + { + rowReslut["MinValue"] = decimal.Parse(Conversions.ToString(rowRawData[colFieldName])); + } + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectGreaterEqual(decimal.Parse(Conversions.ToString(rowRawData[colFieldName])), rowRawData_SpecEng[min_colFieldName], false)) && Conversions.ToBoolean(Operators.ConditionalCompareObjectLessEqual(decimal.Parse(Conversions.ToString(rowRawData[colFieldName])), rowRawData_SpecEng[max_colFieldName], false))) + { + // //Die數加一 + rowReslut["GoodQty1"] = Convert.ToInt32(rowReslut["GoodQty1"]) + 1; + // Else + // blnGoodFlag_Yield = False + } + // //不包含AOIBin欄位判斷Yield + if (colFieldName.ToString().ToUpper() != "AOIBIN") + { + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectGreaterEqual(decimal.Parse(Conversions.ToString(rowRawData[colFieldName])), rowRawData_SpecYield[min_colFieldName], false)) && Conversions.ToBoolean(Operators.ConditionalCompareObjectLessEqual(decimal.Parse(Conversions.ToString(rowRawData[colFieldName])), rowRawData_SpecYield[max_colFieldName], false))) + { + } + else + { + blnGoodFlag_AOI = false; + } + } + // // + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectGreaterEqual(decimal.Parse(Conversions.ToString(rowRawData[colFieldName])), rowRawData_SpecYield[min_colFieldName], false)) && Conversions.ToBoolean(Operators.ConditionalCompareObjectLessEqual(decimal.Parse(Conversions.ToString(rowRawData[colFieldName])), rowRawData_SpecYield[max_colFieldName], false))) + { + } + else + { + blnGoodFlag_Yield = false; + } + // //Sum + rowReslut["SumValue"] = Convert.ToDecimal(rowReslut["SumValue"]) + + decimal.Parse(Conversions.ToString(rowRawData[colFieldName])); + // //SumSqr + rowReslut["SqrValue"] = Convert.ToDouble(rowReslut["SqrValue"]) + + Math.Pow((double)decimal.Parse(Conversions.ToString(rowRawData[colFieldName])), 2d); + // //Avg Die數加一 + rowReslut["GoodQty2"] = Convert.ToInt32(rowReslut["GoodQty2"]) + 1; + // //更新 + rowReslut.EndEdit(); + // // + funCalculateMinMaxSumSqrRet = true; // //此電性在規格內 + break; + } + } + } + else + { + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectGreaterEqual(decimal.Parse(Conversions.ToString(rowRawData[colFieldName])), rowRawData_SpecEng[min_colFieldName], false)) && Conversions.ToBoolean(Operators.ConditionalCompareObjectLessEqual(decimal.Parse(Conversions.ToString(rowRawData[colFieldName])), rowRawData_SpecEng[max_colFieldName], false))) + { + // //Die數加一 + rowReslut["GoodQty1"] = Convert.ToInt32(rowReslut["GoodQty1"]) + 1; + // Else + // blnGoodFlag_Yield = False + } + // //不包含AOIBin欄位判斷Yield + if (colFieldName.ToString().ToUpper() != "AOIBIN") + { + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectGreaterEqual(decimal.Parse(Conversions.ToString(rowRawData[colFieldName])), rowRawData_SpecYield[min_colFieldName], false)) && Conversions.ToBoolean(Operators.ConditionalCompareObjectLessEqual(decimal.Parse(Conversions.ToString(rowRawData[colFieldName])), rowRawData_SpecYield[max_colFieldName], false))) + { + } + else + { + blnGoodFlag_AOI = false; + } + } + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectGreaterEqual(decimal.Parse(Conversions.ToString(rowRawData[colFieldName])), rowRawData_SpecYield[min_colFieldName], false)) && Conversions.ToBoolean(Operators.ConditionalCompareObjectLessEqual(decimal.Parse(Conversions.ToString(rowRawData[colFieldName])), rowRawData_SpecYield[max_colFieldName], false))) + { + } + else + { + blnGoodFlag_Yield = false; + } + // '計算IR符合ESD規格的顆數 + if (Strings.Mid(colFieldName, 1, 3).ToUpper() == "ESD" && Conversions.ToBoolean(Operators.ConditionalCompareObjectGreaterEqual(decimal.Parse(Conversions.ToString(rowRawData[colFieldName_IR])), rowRawData_SpecEng[min_colFieldName], false)) && Conversions.ToBoolean(Operators.ConditionalCompareObjectLessEqual(decimal.Parse(Conversions.ToString(rowRawData[colFieldName_IR])), rowRawData_SpecEng[max_colFieldName], false))) + + { + rowReslut["IRFitESDSpecQty"] = Convert.ToInt32(rowReslut["IRFitESDSpecQty"]) + 1; + } + funCalculateMinMaxSumSqrRet = false; // //回傳此電性在規格外 + blnGoodFlag_Avg = false; + } + + return funCalculateMinMaxSumSqrRet; + // End If + + } + + + public static bool funCalculateMinMaxSumSqr(DataRow rowRawData, string colFieldName, ref DataRow rowReslut, bool blnChkSpecFlag, DataRow rowRawData_Spec = null, DataRow rowRawData_Spec_AVG = null, string min_colFieldName = defString, string max_colFieldName = defString) + + { + bool funCalculateMinMaxSumSqrRet = default(bool); + + // //依傳入值判斷是否要判規格 + if (blnChkSpecFlag == true) + { + // //不可為Nothing + if (rowRawData_Spec == null) + { + throw new Exception("必須傳入規格定義資料(YIELD)!!"); + } + // //不可為Nothing + if (rowRawData_Spec_AVG == null) + { + throw new Exception("必須傳入規格定義資料(AVG)!!"); + } + // //不可為defString + if ((max_colFieldName ?? "") == defString) + { + throw new Exception("必須傳入規格電性最大欄位定義資料!!"); + } + // //不可為defString + if ((min_colFieldName ?? "") == defString) + { + throw new Exception("必須傳入規格電性最小欄位定義資料!!"); + } + } + // //更新 + rowReslut.BeginEdit(); + // //Max + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(rowReslut["MaxValue"], decimal.Parse(Conversions.ToString(rowRawData[colFieldName])), false))) + { + rowReslut["MaxValue"] = decimal.Parse(Conversions.ToString(rowRawData[colFieldName])); + } + // //Min + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(rowReslut["MinValue"], 0, false)) || Conversions.ToBoolean(Operators.ConditionalCompareObjectGreater(rowReslut["MinValue"], decimal.Parse(Conversions.ToString(rowRawData[colFieldName])), false))) + { + rowReslut["MinValue"] = decimal.Parse(Conversions.ToString(rowRawData[colFieldName])); + } + // //依傳入值判斷是否要判規格 + if (blnChkSpecFlag == true) + { + // //規格最大、最小都為零時不需要判(AVG) + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(rowRawData_Spec_AVG[min_colFieldName], 0, false)) && Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(rowRawData_Spec_AVG[max_colFieldName], 0, false))) + { + // //Sum + rowReslut["SumValue"] = Convert.ToDecimal(rowReslut["SumValue"]) + + decimal.Parse(Conversions.ToString(rowRawData[colFieldName])); + // //SumSqr + rowReslut["SqrValue"] = Convert.ToDouble(rowReslut["SqrValue"]) + + Math.Pow((double)decimal.Parse(Conversions.ToString(rowRawData[colFieldName])), 2d); + // //Die數加一 + rowReslut["GoodQty1"] = Convert.ToInt32(rowReslut["GoodQty1"]) + 1; + } + // //符合規格的顆數(良品數) + else if (Conversions.ToBoolean(Operators.ConditionalCompareObjectGreaterEqual(decimal.Parse(Conversions.ToString(rowRawData[colFieldName])), rowRawData_Spec_AVG[min_colFieldName], false)) && Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(decimal.Parse(Conversions.ToString(rowRawData[colFieldName])), rowRawData_Spec_AVG[max_colFieldName], false))) + { + // //Sum + rowReslut["SumValue"] = Convert.ToDecimal(rowReslut["SumValue"]) + + decimal.Parse(Conversions.ToString(rowRawData[colFieldName])); + // //SumSqr + rowReslut["SqrValue"] = Convert.ToDouble(rowReslut["SqrValue"]) + + Math.Pow((double)decimal.Parse(Conversions.ToString(rowRawData[colFieldName])), 2d); + // //Die數加一 + rowReslut["GoodQty1"] = Convert.ToInt32(rowReslut["GoodQty1"]) + 1; + } + // //規格最大、最小都為零時不需要判(YIELD) + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(rowRawData_Spec[min_colFieldName], 0, false)) && Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(rowRawData_Spec[max_colFieldName], 0, false))) + { + // //Pass數加一 + rowReslut["GoodQty2"] = Convert.ToInt32(rowReslut["GoodQty2"]) + 1; + funCalculateMinMaxSumSqrRet = true; // //此電性不需判斷規格(是) + } + // //符合規格的顆數(良品數) + else if (Conversions.ToBoolean(Operators.ConditionalCompareObjectGreaterEqual(decimal.Parse(Conversions.ToString(rowRawData[colFieldName])), rowRawData_Spec[min_colFieldName], false)) && Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(decimal.Parse(Conversions.ToString(rowRawData[colFieldName])), rowRawData_Spec[max_colFieldName], false))) + { + // //Pass數加一 + rowReslut["GoodQty2"] = Convert.ToInt32(rowReslut["GoodQty2"]) + 1; + funCalculateMinMaxSumSqrRet = true; // //回傳此電性是否在規格內(是) + } + else + { + funCalculateMinMaxSumSqrRet = false; + } // //回傳此電性是否在規格內(否) + } + else + { + // //Sum + rowReslut["SumValue"] = Convert.ToDecimal(rowReslut["SumValue"]) + + decimal.Parse(Conversions.ToString(rowRawData[colFieldName])); + // //SumSqr + rowReslut["SqrValue"] = Convert.ToDouble(rowReslut["SqrValue"]) + + Math.Pow((double)decimal.Parse(Conversions.ToString(rowRawData[colFieldName])), 2d); + // //Pass數加一 + rowReslut["GoodQty1"] = Convert.ToInt32(rowReslut["GoodQty1"]) + 1; + rowReslut["GoodQty2"] = Convert.ToInt32(rowReslut["GoodQty2"]) + 1; + funCalculateMinMaxSumSqrRet = true; + } // //此電性不需判斷規格(是) + // // + rowReslut.EndEdit(); + return funCalculateMinMaxSumSqrRet; + + } + + public static bool funCalculateMinMaxSumSqr(ref DataRow rowReslut, decimal valueQty, DataRow rowRawData_Spec, string min_colFieldName, string max_colFieldName) + { + bool funCalculateMinMaxSumSqrRet = default(bool); + + + rowReslut.BeginEdit(); + // //Max + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(rowReslut["MaxValue"], valueQty, false))) + { + rowReslut["MaxValue"] = valueQty; + } + + // //Min + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(rowReslut["MinValue"], 0, false)) || Conversions.ToBoolean(Operators.ConditionalCompareObjectGreater(rowReslut["MinValue"], valueQty, false))) + { + rowReslut["MinValue"] = valueQty; + } + + // //Sum + rowReslut["SumValue"] = Convert.ToDecimal(rowReslut["SumValue"]) + valueQty; + + // //SumSqr + rowReslut["SqrValue"] = Convert.ToDouble(rowReslut["SqrValue"]) + + Math.Pow((double)valueQty, 2d); + + // //符合規格的顆數(良品數) + // //規格最大、最小都為零時不需要判,都算是Good + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(rowRawData_Spec[min_colFieldName], 0, false)) && Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(rowRawData_Spec[max_colFieldName], 0, false))) + { + rowReslut["GoodQty1"] = Convert.ToInt32(rowReslut["GoodQty1"]) + 1; + rowReslut["GoodQty2"] = Convert.ToInt32(rowReslut["GoodQty2"]) + 1; + funCalculateMinMaxSumSqrRet = true; // //回傳此電性是否在規格內(是) + } + else if (Conversions.ToBoolean(Operators.ConditionalCompareObjectGreaterEqual(valueQty, rowRawData_Spec[min_colFieldName], false)) && Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(valueQty, rowRawData_Spec[max_colFieldName], false))) + { + rowReslut["GoodQty1"] = Convert.ToInt32(rowReslut["GoodQty1"]) + 1; + rowReslut["GoodQty2"] = Convert.ToInt32(rowReslut["GoodQty2"]) + 1; + funCalculateMinMaxSumSqrRet = true; // //回傳此電性是否在規格內(是) + } + else + { + funCalculateMinMaxSumSqrRet = false; + } // //回傳此電性是否在規格內(否) + // //更新 + rowReslut.EndEdit(); + return funCalculateMinMaxSumSqrRet; + + } + + public static bool funCalculateMinMaxSumSqr(DataRow rowRawData, string colFieldName, ref DataRow rowReslut) + { + bool funCalculateMinMaxSumSqrRet = default(bool); + + // //更新 + rowReslut.BeginEdit(); + // //Max + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(rowReslut["MaxValue"], decimal.Parse(Conversions.ToString(rowRawData[colFieldName])), false))) + { + rowReslut["MaxValue"] = decimal.Parse(Conversions.ToString(rowRawData[colFieldName])); + } + // //Min + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(rowReslut["MinValue"], 0, false)) || Conversions.ToBoolean(Operators.ConditionalCompareObjectGreater(rowReslut["MinValue"], decimal.Parse(Conversions.ToString(rowRawData[colFieldName])), false))) + { + rowReslut["MinValue"] = decimal.Parse(Conversions.ToString(rowRawData[colFieldName])); + } + // //更新 + rowReslut.EndEdit(); + // //Return + funCalculateMinMaxSumSqrRet = true; + return funCalculateMinMaxSumSqrRet; + + } + + // add by Lena, 2012/06/22 + public static bool funCalculateMinMaxSumSqr(string colFieldName, DataRow rowRawData, ref DataRow rowReslut, DataRow rowRawData_Spec, string min_colFieldName, string max_colFieldName) + { + bool funCalculateMinMaxSumSqrRet = default(bool); + + + // '//符合規格的顆數(良品數) + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectGreaterEqual(decimal.Parse(Conversions.ToString(rowRawData[colFieldName])), rowRawData_Spec[min_colFieldName], false)) && Conversions.ToBoolean(Operators.ConditionalCompareObjectLessEqual(decimal.Parse(Conversions.ToString(rowRawData[colFieldName])), rowRawData_Spec[max_colFieldName], false))) + { + + // //更新 + rowReslut.BeginEdit(); + // //Max + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(rowReslut["MaxValue"], decimal.Parse(Conversions.ToString(rowRawData[colFieldName])), false))) + { + rowReslut["MaxValue"] = decimal.Parse(Conversions.ToString(rowRawData[colFieldName])); + } + // //Min + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(rowReslut["MinValue"], -9999, false)) || Conversions.ToBoolean(Operators.ConditionalCompareObjectGreater(rowReslut["MinValue"], decimal.Parse(Conversions.ToString(rowRawData[colFieldName])), false))) + { + rowReslut["MinValue"] = decimal.Parse(Conversions.ToString(rowRawData[colFieldName])); + } + + // //Sum + rowReslut["SumValue"] = Convert.ToDecimal(rowReslut["SumValue"]) + + decimal.Parse(Conversions.ToString(rowRawData[colFieldName])); + + // //SumSqr + rowReslut["SqrValue"] = Convert.ToDouble(rowReslut["SqrValue"]) + + Math.Pow((double)decimal.Parse(Conversions.ToString(rowRawData[colFieldName])), 2d); + + // //Yield Die數加一 + rowReslut["GoodQty1"] = Convert.ToInt32(rowReslut["GoodQty1"]) + 1; + + // //Avg Die數加一 + rowReslut["GoodQty2"] = Convert.ToInt32(rowReslut["GoodQty2"]) + 1; + + // //更新 + rowReslut.EndEdit(); + funCalculateMinMaxSumSqrRet = true; // //回傳此電性是否在規格內(是) + } + + // '//規格最大、最小都為零時不需要判,都算是Good + else if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(rowRawData_Spec[min_colFieldName], 0, false)) && Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(rowRawData_Spec[max_colFieldName], 0, false))) + { + + // //更新 + rowReslut.BeginEdit(); + // //Max + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(rowReslut["MaxValue"], decimal.Parse(Conversions.ToString(rowRawData[colFieldName])), false))) + { + rowReslut["MaxValue"] = decimal.Parse(Conversions.ToString(rowRawData[colFieldName])); + } + // //Min + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(rowReslut["MinValue"], -9999, false)) || Conversions.ToBoolean(Operators.ConditionalCompareObjectGreater(rowReslut["MinValue"], decimal.Parse(Conversions.ToString(rowRawData[colFieldName])), false))) + { + rowReslut["MinValue"] = decimal.Parse(Conversions.ToString(rowRawData[colFieldName])); + } + + // //Sum + rowReslut["SumValue"] = Convert.ToDecimal(rowReslut["SumValue"]) + + decimal.Parse(Conversions.ToString(rowRawData[colFieldName])); + + // //SumSqr + rowReslut["SqrValue"] = Convert.ToDouble(rowReslut["SqrValue"]) + + Math.Pow((double)decimal.Parse(Conversions.ToString(rowRawData[colFieldName])), 2d); + + // //Yield Die數加一 + rowReslut["GoodQty1"] = Convert.ToInt32(rowReslut["GoodQty1"]) + 1; + + // //Avg Die數加一 + rowReslut["GoodQty2"] = Convert.ToInt32(rowReslut["GoodQty2"]) + 1; + + // //更新 + rowReslut.EndEdit(); + funCalculateMinMaxSumSqrRet = true; // //回傳此電性是否在規格內(是) + } + + else + { + funCalculateMinMaxSumSqrRet = false; + } // //回傳此電性是否在規格內(否) + + return funCalculateMinMaxSumSqrRet; + + } + + #endregion + + #region --- Transaction Output --- + + public static object OutputSQLNoneQuery(ref string strCommandText) + { + + bool blnTransactionLog = false; + + try + { + blnTransactionLog = Conversions.ToBoolean(System.Configuration.ConfigurationSettings.AppSettings["TransactionLog"]); + } + catch (Exception ex) + { + blnTransactionLog = false; + } + + if (blnTransactionLog == false) + return default(Object); + + var tfc = new System.CodeDom.Compiler.TempFileCollection(System.Configuration.ConfigurationSettings.AppSettings["OutputSQLPath"], true); + string FileName = tfc.AddExtension("SQL"); + string ErrorLogFile = System.Configuration.ConfigurationSettings.AppSettings["ErrorLogPath"] + Strings.Format(DateTime.Now, "yyyyMMdd").ToString() + "_Error.Log"; + FileName = FileName.Insert(FileName.LastIndexOf(@"\") + 1, "TX" + DateTime.Now.ToString("yyyyMMddHHmmssfff")); + + try + { + using (var sw = System.IO.File.AppendText(FileName)) + { + sw.WriteLine(strCommandText.Replace(Constants.vbCrLf, " ")); + sw.Flush(); + } + } + catch (Exception ex) + { + try + { + using (var sw = System.IO.File.AppendText(ErrorLogFile)) + { + sw.WriteLine(ex.Message + ex.StackTrace); + sw.Flush(); + } + } + catch (Exception e1) + { + } + } + finally + { + System.IO.File.Delete(tfc.BasePath + ".tmp"); + } + + return default(Object); + + } + + // Public Function OutputSQLNoneQuery_UPD(ByRef CollectionSQL As Collection) + + // Dim blnTransactionLog As Boolean = False + + // Try + // blnTransactionLog = CType(System.Configuration.ConfigurationSettings.AppSettings("TransactionLog"), Boolean) + // Catch ex As Exception + // blnTransactionLog = False + // End Try + + // If blnTransactionLog = False Then Exit Function + + // Dim tfc As New System.CodeDom.Compiler.TempFileCollection(System.Configuration.ConfigurationSettings.AppSettings("OutputSQLPath"), True) + // Dim FileName As String = tfc.AddExtension("SQL") + // Dim ErrorLogFile As String = System.Configuration.ConfigurationSettings.AppSettings("ErrorLogPath") & Format(Now, "yyyyMMdd").ToString & "_Error.Log" + // FileName = FileName.Insert(FileName.LastIndexOf("\") + 1, "TX" & Now.ToString("yyyyMMddHHmmssfff")) + // Dim strCommandText As String = String.Empty + + // Try + // Using sw As System.IO.StreamWriter = System.IO.File.AppendText(FileName) + // For Each strCommandText In CollectionSQL + // sw.WriteLine(strCommandText.Replace(vbCrLf, " ")) + // Next strCommandText + // sw.Flush() + // End Using + // Catch ex As Exception + // Try + // Using sw As System.IO.StreamWriter = System.IO.File.AppendText(ErrorLogFile) + // sw.WriteLine(ex.Message & ex.StackTrace) + // sw.Flush() + // End Using + // Catch e1 As Exception + // End Try + // Finally + // System.IO.File.Delete(tfc.BasePath & ".tmp") + // End Try + + // End Function + + public static object OutputSQLNoneQuery_AttachFile(ref string strCommandText, ref string AttachName, ref string aBody, object DataType) + { + + bool blnTransactionLog = false; + + try + { + blnTransactionLog = Conversions.ToBoolean(System.Configuration.ConfigurationSettings.AppSettings["TransactionLog"]); + } + catch (Exception ex) + { + blnTransactionLog = false; + } + + if (blnTransactionLog == false) + return default(Object); + + var tfc1 = new System.CodeDom.Compiler.TempFileCollection(System.Configuration.ConfigurationSettings.AppSettings["OutputSQLPath"], true); + var tfc2 = new System.CodeDom.Compiler.TempFileCollection(System.Configuration.ConfigurationSettings.AppSettings["AttachFilePath"], true); + string FileName = tfc1.AddExtension("SQL"); + string AttachFile = tfc2.AddExtension("TXT"); + string ErrorLogFile = System.Configuration.ConfigurationSettings.AppSettings["ErrorLogPath"] + Strings.Format(DateTime.Now, "yyyyMMdd").ToString() + "_Error.Log"; + FileName = FileName.Insert(FileName.LastIndexOf(@"\") + 1, "TX" + DateTime.Now.ToString("yyyyMMddHHmmssfff")); + AttachFile = AttachFile.Insert(AttachFile.LastIndexOf(@"\") + 1, AttachName); + + try + { + // //Output File + if (aBody != null) + { + string sFileSource = AttachFile; + if (System.IO.File.Exists(sFileSource)) + { + try + { + System.IO.File.Delete(sFileSource); + using (var sw = System.IO.File.AppendText(sFileSource)) + { + sw.WriteLine(aBody); + sw.Flush(); + } + } + catch (System.IO.IOException ex) + { + } + } + else + { + using (var sw = System.IO.File.AppendText(sFileSource)) + { + sw.WriteLine(aBody); + sw.Flush(); + } + } + } + // //輸出格式 = SQL Command;DataType;FilePath + strCommandText += ";" + DataType.ToString() + ";" + AttachFile; + using (var sw = System.IO.File.AppendText(FileName)) + { + sw.WriteLine(strCommandText.Replace(Constants.vbCrLf, " ")); + sw.Flush(); + } + } + catch (Exception ex) + { + try + { + using (var sw = System.IO.File.AppendText(ErrorLogFile)) + { + sw.WriteLine(ex.Message + ex.StackTrace); + sw.Flush(); + } + } + catch (Exception e1) + { + } + } + finally + { + System.IO.File.Delete(tfc1.BasePath + ".tmp"); + System.IO.File.Delete(tfc2.BasePath + ".tmp"); + } + + return default(Object); + + } + + public static object OutputSQLNoneQuery_AttachFile(ref string strCommandText, ref string AttachName, ref byte[] aBody, object DataType) + { + + bool blnTransactionLog = false; + + try + { + blnTransactionLog = Conversions.ToBoolean(System.Configuration.ConfigurationSettings.AppSettings["TransactionLog"]); + } + catch (Exception ex) + { + blnTransactionLog = false; + } + + if (blnTransactionLog == false) + return default(Object); + + var tfc1 = new System.CodeDom.Compiler.TempFileCollection(System.Configuration.ConfigurationSettings.AppSettings["OutputSQLPath"], true); + var tfc2 = new System.CodeDom.Compiler.TempFileCollection(System.Configuration.ConfigurationSettings.AppSettings["AttachFilePath"], true); + string FileName = tfc1.AddExtension("SQL"); + string AttachFile = tfc2.AddExtension(AttachName.Substring(AttachName.Length - 3, 3).ToUpper()); + string ErrorLogFile = System.Configuration.ConfigurationSettings.AppSettings["ErrorLogPath"] + Strings.Format(DateTime.Now, "yyyyMMdd").ToString() + "_Error.Log"; + FileName = FileName.Insert(FileName.LastIndexOf(@"\") + 1, "TX" + DateTime.Now.ToString("yyyyMMddHHmmssfff")); + AttachFile = AttachFile.Insert(AttachFile.LastIndexOf(@"\") + 1, AttachName.Substring(0, AttachName.Length - 4)); + + try + { + // //Output File + if (aBody != null) + { + string sFileSource = AttachFile; + if (System.IO.File.Exists(sFileSource)) + { + try + { + System.IO.File.Delete(sFileSource); + var fs = new System.IO.FileStream(sFileSource, System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.Write); + fs.Write(aBody, 0, aBody.Length); + fs.Close(); + } + catch (System.IO.IOException ex) + { + } + } + else + { + var fs = new System.IO.FileStream(sFileSource, System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.Write); + fs.Write(aBody, 0, aBody.Length); + fs.Close(); + } + } + // //輸出格式 = SQL Command;DataType;FilePath + strCommandText += ";" + DataType.ToString() + ";" + AttachFile; + using (var sw = System.IO.File.AppendText(FileName)) + { + sw.WriteLine(strCommandText.Replace(Constants.vbCrLf, " ")); + sw.Flush(); + } + } + catch (Exception ex) + { + try + { + using (var sw = System.IO.File.AppendText(ErrorLogFile)) + { + sw.WriteLine(ex.Message + ex.StackTrace); + sw.Flush(); + } + } + catch (Exception e1) + { + } + } + finally + { + System.IO.File.Delete(tfc1.BasePath + ".tmp"); + System.IO.File.Delete(tfc2.BasePath + ".tmp"); + } + + return default(Object); + + } + + #endregion + + #region Invoke + + /// + /// 叫用Web Service, 並回傳Response XML + /// + /// 要呼叫哪一個WebService的方法, ex: wsWIP.LoadLotBasis + /// InXml + /// 是否客製的WebService + /// + public static string InvokeSrv(string Method, string InXml, bool Customize = false) + { + + object result; + + try + { + + using (var ws = new wsInvoke.wsInvoke()) + { + ws.Url = modWIN.LocalizeWebService(ws.Url.ToString(), Customize); + ws.EnableDecompression = true; + result = ws.invokeSrv(Method, new object[] { InXml }); + } + } + + catch (Exception ex) + { + throw; + } + + return Conversions.ToString(result); + + } + + /// + /// 叫用Web Service, 回傳Response XML + /// + /// 要呼叫哪一個WebService的方法, ex: wsWIP.LoadLotBasis + /// InXml + /// 用來取回byte資料或傳入byte資料 + /// 是否客製的WebService + /// + public static string InvokeSrv(string Method, string InXml, byte[] buffer, bool Customize = false) + { + + object result; + + try + { + + using (var ws = new wsInvoke.wsInvoke()) + { + ws.Url = modWIN.LocalizeWebService(ws.Url.ToString(), Customize); + ws.EnableDecompression = true; + result = ws.invokeSrv(Method, new object[] { InXml, buffer }); + } + } + + catch (Exception ex) + { + throw; + } + + return Conversions.ToString(result); + + } + + /// + /// 叫用Web Service, 並回傳Response XML + /// + /// 要呼叫哪一個WebService的方法, ex: wsWIP.LoadLotBasis + /// InXml + /// 接收結果的DataSet + /// 是否客製的WebService + /// + public static string InvokeSrv(string Method, string InXml, ref DataSet pDataSet, bool Customize = false) + { + + object result; + + try + { + + using (var ws = new wsInvoke.wsInvoke()) + { + ws.Url = modWIN.LocalizeWebService(ws.Url.ToString(), Customize); + ws.EnableDecompression = true; + result = ws.invokeSrv_DataSet(Method, InXml, ref pDataSet); + } + } + + catch (Exception ex) + { + throw; + } + + return Conversions.ToString(result); + + } + + #endregion + + + // 發Mail功能 非群組與群組發送 + public static string SendMultiEmail(ref string FileName, ref string EmailSubject, string EmailBody = defString, string GroupNo = defString, byte[] AttachFile = null, GroupType GroupType = GroupType.UserGroup) + { + string SendMultiEmailRet = default(string); + // GroupType + // 0:User Group (使用者群組) + // 1:Issue Group (簽核群組) + // 2:Equipment Group(設備工程師群組) + // 3:Inventory Group(庫房工程師群組) + // 4:Report Group(報表使用群組) + // 5:ERF Disposition Group(異常處理群組) + // 6:ERF Mail ccGroup(附件收件人群組) + + try + { + + strIdentity = CombineXMLIdentity(modWIN.gComputerName, "AUTORUN", DateTime.Now.ToString()); + strParameter = CombineXMLParameter("groupno", "GroupNo", "String", CInput(GroupNo), ""); + strParameter = strParameter + CombineXMLParameter("emailsubject", "EmailSubject", "String", EmailSubject, ""); + strParameter = strParameter + CombineXMLParameter("emailbody", "EmailBody", "String", EmailBody, ""); + strParameter = strParameter + CombineXMLParameter("grouptype", "GroupType", "Integer", ((int)GroupType).ToString(), ""); + strParameter = strParameter + CombineXMLParameter("attachfilename", "AttachFileName", "String", FileName, ""); + var XmlDoc = new System.Xml.XmlDocument(); + + InXml = modWIN.CombineXMLRequest(ref strIdentity, ref strParameter); + + // OutXml = wsWIP.SendEmailAndAttachFileToGroup(InXml, AttachFile) + OutXml = InvokeSrv("wsWIP.SendEmailAndAttachFileToGroup", InXml, AttachFile); + + XmlDoc.LoadXml(OutXml); + + if (modWIN.chkExecutionSuccess(ref XmlDoc)) // 找出Exception訊並顯示出來 + { + SendMultiEmailRet = "success"; + } + else + { + SendMultiEmailRet = "fail"; + } + + XmlDoc = null; + } + + catch (Exception ex) + { + SendMultiEmailRet = "fail;" + ex.Message; + } + + return SendMultiEmailRet; + + } + } +} \ No newline at end of file diff --git a/SRC/MESAgent/MESAutoLoader/AutoLoaderLib/modWIN.cs b/SRC/MESAgent/MESAutoLoader/AutoLoaderLib/modWIN.cs new file mode 100644 index 0000000..168c6db --- /dev/null +++ b/SRC/MESAgent/MESAutoLoader/AutoLoaderLib/modWIN.cs @@ -0,0 +1,802 @@ +using System; +using System.Collections; +using static System.Configuration.ConfigurationSettings; +using System.Data; +using System.Runtime.InteropServices; +using Microsoft.VisualBasic; +using Microsoft.VisualBasic.CompilerServices; +using static iMESCore.Base.iMESConst; +using System.Diagnostics; +using System.Collections.Generic; +using System.Resources; +using System.IO; +using System.Linq; + +namespace AutoLoaderLib_Base +{ + + + static class modWIN + { + + // ReviseDate : 2003/08/07,修改處理AdditionalXML + // ReviseDate : 2003/08/05,新增Public gReturnArray + // ReviseDate : 2003/07/01,更改AddFlow產生的Error(CInput) + // ReviseDate : 2002/11/04,新增CUnInput function + + public static string gComputerName; + public static string gReturnKeyValue; + public static string gUserNo; + public static string gUserName; + public static string gUserLevel; + public static string gLanguageMode; + public static string gAppPath; + // **Add for Smart Client Architecture + public static string gMESWebServiceHost; + public static string gCUSWebServiceHost; + public static bool gEnableSSL = Convert.ToBoolean(GetAppSettings("EnableSSL")); + + // Add By Peter 2005/6/20 + public static string gSettingMode = ""; + + public static DataRow drSearch; + + public static ArrayList gReturnArray = new ArrayList(); + + public const string strAddTagLabel = "extrabase"; // Add by py for Combine Addition XML doc + public const string strAddTagName = "ExtraBase"; // Add by py for Combine Addition XML doc + public static string gSTDPath = GetAppSettings("STDPath"); + public static bool chkExecutionSuccess(ref System.Xml.XmlDocument Xmldoc) + { + bool chkExecutionSuccessRet = default(bool); + if (Xmldoc.DocumentElement["result"].InnerXml == "success") + { + chkExecutionSuccessRet = true; + } + else + { + chkExecutionSuccessRet = false; + } + + return chkExecutionSuccessRet; + } + + public static string GetExceptionSysMsg(ref System.Xml.XmlDocument Xmldoc) + { + string GetExceptionSysMsgRet = default(string); + string argstrInput = Xmldoc.DocumentElement.GetElementsByTagName("sysmsg").Item(0).InnerXml; + GetExceptionSysMsgRet = CUnInput(ref argstrInput); + Xmldoc.DocumentElement.GetElementsByTagName("sysmsg").Item(0).InnerXml = argstrInput; + return GetExceptionSysMsgRet; + } + + public static string GetExceptionMesMsg(ref System.Xml.XmlDocument Xmldoc) + { + string GetExceptionMesMsgRet = default(string); + string argstrInput = Xmldoc.DocumentElement.GetElementsByTagName("mesmsg").Item(0).InnerXml; + GetExceptionMesMsgRet = CUnInput(ref argstrInput); + Xmldoc.DocumentElement.GetElementsByTagName("mesmsg").Item(0).InnerXml = argstrInput; + return GetExceptionMesMsgRet; + } + + public static string CombineXMLIdentity(ref string ComputerName, ref string CurUserNo, ref string SendTime) + { + string CombineXMLIdentityRet = default(string); + CombineXMLIdentityRet = "" + ComputerName + "" + "" + CurUserNo + "" + "" + SendTime + ""; + + return CombineXMLIdentityRet; + } + + public static string CombineXMLParameter(ref string value_name, ref string name, ref string type, ref string value, ref string desc) + { + string CombineXMLParameterRet = default(string); + CombineXMLParameterRet = "<" + value_name.ToLower() + ">" + "" + name + "" + "" + type + "" + "" + value + "" + "" + desc + "" + ""; + + + + + return CombineXMLParameterRet; + } + + public static string CombineXMLRequest(ref string strIdentity, ref string strParameter) + { + string CombineXMLRequestRet = default(string); + CombineXMLRequestRet = "" + "" + strIdentity + ""; + if (!string.IsNullOrEmpty(strParameter)) + { + CombineXMLRequestRet = CombineXMLRequestRet + "" + strParameter + ""; + } + CombineXMLRequestRet = CombineXMLRequestRet + ""; + return CombineXMLRequestRet; + } + + public static string CombineXMLValue(ref string TagName, ref string Value) + { + string CombineXMLValueRet = default(string); + CombineXMLValueRet = "<" + TagName + ">" + Value + ""; + return CombineXMLValueRet; + } + + public static string CombineXMLValueTag(ref string Value) + { + string CombineXMLValueTagRet = default(string); + CombineXMLValueTagRet = "" + Value + ""; + return CombineXMLValueTagRet; + } + + public static string CombineXMLParameterMultiValue(ref string value_name, ref string name, ref string type, ref string value, ref string desc) + { + string CombineXMLParameterMultiValueRet = default(string); + // Value不用加上Tag + CombineXMLParameterMultiValueRet = "<" + value_name.ToLower() + ">" + "" + name + "" + "" + type + "" + value + "" + desc + "" + ""; + + + + return CombineXMLParameterMultiValueRet; + } + + public static int FindRecordPosition(ref DataView dvData, ref string strColumnName, ref string strFindValue) + { + int FindRecordPositionRet = default(int); + // //由Dataview的第一筆開始尋找符合的資料直到最後一筆 + // //傳出資料在資料表內的Index + int i; + bool Found; // //紀錄是否找到符合資料 + string strDataType; // //尋找資料欄的資料型態 + + try + { + if (!string.IsNullOrEmpty(strFindValue)) // 是否有傳入尋找的條件 + { + Found = false; + strDataType = dvData.Table.Columns[strColumnName].DataType.ToString(); + if (strDataType == "System.DateTime") // 日期型態的資料比對 + { + var loopTo = dvData.Count; + for (i = 0; i <= loopTo; i++) + { + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectGreaterEqual(dvData[i][strColumnName], "#" + Strings.Format(Conversions.ToDate(strFindValue), "yyyy/MM/dd") + "#", false))) + { + Found = true; + break; + } + } + } + else // 字串,數值資料型態的比對 + { + var loopTo1 = dvData.Count; + for (i = 0; i <= loopTo1; i++) + { + if ((Strings.UCase(dvData[i][strColumnName].ToString()) ?? "") == (Strings.UCase(strFindValue) ?? "")) + { + Found = true; + break; + } + } + } + if (Found == true) + { + FindRecordPositionRet = i; // 找到符合資料,傳出所在的RowIndex + } + else + { + FindRecordPositionRet = -1; + } // 沒有符合資料 + } + } + catch + { + FindRecordPositionRet = -1; + } // 沒有符合資料 + + return FindRecordPositionRet; + + // //使用Dataview的Find Method,日期無法使用 + // dvData.Sort = strColumnName + // FindRecordPosition = dvData.Find(strFindValue) + + } + + + public static string PasswordEncoding(ref string Password) + { + string PasswordEncodingRet = default(string); + // 此 Function 將傳入值加以編碼後傳出,編碼後長度不變 + // 傳入值: 密碼 + // 傳回值: 編碼後密碼 + + // Vernam密碼是由Gilbert Vernam在1918年發明的 + string g_Key = "xNDFz6LH67LOv7xKbWFpbMu1wejrM7SzvV4tLRvq3X47m708O1xMHLoaMNCqGhoaEN"; + string strChar, iCryptChar, strEncrypted = default(string); + int i, iKeyChar, iStringChar; + + var loopTo = Strings.Len(Password); + for (i = 1; i <= loopTo; i++) + { + iKeyChar = Strings.Asc(Strings.Mid(g_Key, i, 1)); + iStringChar = Strings.Asc(Strings.Mid(Password, i, 1)); + iCryptChar = (iKeyChar ^ iStringChar).ToString(); + strEncrypted = strEncrypted + Strings.Chr(Conversions.ToInteger(iCryptChar)); + } + + PasswordEncodingRet = Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes(strEncrypted)); + return PasswordEncodingRet; + + } + + public static string FilterByString(ref string strFilter, ref string strColumnName, ref string strColumnValue) + { + string FilterByStringRet = default(string); + // 對字串欄位做篩選 + if (string.IsNullOrEmpty(strFilter)) + { + strFilter = strColumnName + " = '" + Strings.Replace(strColumnValue, "'", "''") + "'"; + } + else + { + strFilter = strFilter + " And " + strColumnName + " = '" + Strings.Replace(strColumnValue, "'", "''") + "'"; + } + FilterByStringRet = strFilter; + return FilterByStringRet; + } + + + public static string FilterByInteger(ref string strFilter, ref string strColumnName, ref int strColumnValue) + { + string FilterByIntegerRet = default(string); + // 對數值欄位做篩選 + if (string.IsNullOrEmpty(strFilter)) + { + strFilter = strColumnName + " = " + strColumnValue; + } + else + { + strFilter = strFilter + " And " + strColumnName + " = " + strColumnValue; + } + FilterByIntegerRet = strFilter; + return FilterByIntegerRet; + } + + public static string FilterByDate(ref string strFilter, ref string strColumnName, ref DateTime datFromDate, ref DateTime datEndDate) + { + string FilterByDateRet = default(string); + // 對日期欄位做篩選 + if (string.IsNullOrEmpty(strFilter)) + { + strFilter = strColumnName + " >= #" + Strings.Format(Conversions.ToDate(datFromDate), "yyyy/MM/dd 00:00:00") + "# And " + strColumnName + " <= #" + Strings.Format(Conversions.ToDate(datEndDate), "yyyy/MM/dd 23:59:59") + "# "; + } + else + { + strFilter = strFilter + " And " + strColumnName + " >= #" + Strings.Format(Conversions.ToDate(datFromDate), "yyyy/MM/dd 00:00:00") + "# And " + strColumnName + " <= #" + Strings.Format(Conversions.ToDate(datEndDate), "yyyy/MM/dd 23:59:59") + "# "; + } + FilterByDateRet = strFilter; + return FilterByDateRet; + } + + public static bool IsBoolean(ref string strBoolean, string strBooleanValue = defString) + { + bool IsBooleanRet = default(bool); + // 此 Function 檢查傳入值是否為Boolean值 + // 傳入值: strBoolean欲檢查是否為Boolean值的字串 + // strBooleanValue將檢查值轉換為True或False的統一字串 + // 傳回值: True是Boolean值 ; False不是Boolean值 + + IsBooleanRet = false; + + if (string.IsNullOrEmpty(strBoolean)) + { + IsBooleanRet = false; + } + else if (Strings.Trim(Strings.UCase(strBoolean)) != "Y" & Strings.Trim(Strings.UCase(strBoolean)) != "N" & Strings.Trim(Strings.UCase(strBoolean)) != "T" & Strings.Trim(Strings.UCase(strBoolean)) != "F" & Strings.Trim(Strings.UCase(strBoolean)) != "YES" & Strings.Trim(Strings.UCase(strBoolean)) != "NO" & Strings.Trim(Strings.UCase(strBoolean)) != "TRUE" & Strings.Trim(Strings.UCase(strBoolean)) != "FALSE" & Strings.Trim(Strings.UCase(strBoolean)) != "是" & Strings.Trim(Strings.UCase(strBoolean)) != "否" & Strings.Trim(Strings.UCase(strBoolean)) != "ON" & Strings.Trim(Strings.UCase(strBoolean)) != "OFF") + + + + + { + + IsBooleanRet = false; + } + + else if (Strings.Trim(Strings.UCase(strBoolean)) == "Y" | Strings.Trim(Strings.UCase(strBoolean)) == "T" | Strings.Trim(Strings.UCase(strBoolean)) == "YES" | Strings.Trim(Strings.UCase(strBoolean)) == "TRUE" | Strings.Trim(Strings.UCase(strBoolean)) == "是" | Strings.Trim(Strings.UCase(strBoolean)) == "ON") + + { + IsBooleanRet = true; + strBooleanValue = "True"; + } + else + { + IsBooleanRet = true; + strBooleanValue = "False"; + } + + return IsBooleanRet; + } + + + public static string CInput(ref string strInput) + { + string CInputRet = default(string); + // 將傳入值內的單引號轉換為可存入資料庫的格式 + // 2. 將傳入值內的 &, >, < 三個特殊字元轉換為XmlDocument可解譯之代替符號 + // 傳入值: strInput包含特殊字元的字串 + // 傳回值: 將特殊字元變更為代替符號的字串 + + // 轉換 ' 為 '' (單引號轉為兩個單引號) + CInputRet = Strings.Replace(strInput, "'", "''"); + + // 轉換 & 為 & + CInputRet = Strings.Replace(CInputRet, "&", "&"); + + // CInput = Replace(CInput, """", "''") 'AddFlow的Xml字串不可將雙引號轉為兩個單引號,XMLToFlow會Error + + // 轉換 > 為 > + CInputRet = Strings.Replace(CInputRet, ">", ">"); + + // 轉換 < 為 < + CInputRet = Strings.Replace(CInputRet, "<", "<"); + return CInputRet; + + } + + public static string CUnInput(ref string strInput) + { + string CUnInputRet = default(string); + // 將傳入值內的單引號轉換為可存入資料庫的格式 + // 傳入值: strInput包含特殊字元的字串 + // 傳回值: 將代替符號變更為特殊字元的字串 + + // 轉換 ' 為 '' (單引號轉為兩個單引號) + // CUnInput = Replace(strInput, "'", "''") + CUnInputRet = Strings.Replace(strInput, "\"", "'"); + + // 轉換 & 為 & + CUnInputRet = Strings.Replace(CUnInputRet, "&", "&"); + + // 轉換 > 為 > + CUnInputRet = Strings.Replace(CUnInputRet, ">", ">"); + + // 轉換 < 為 < + CUnInputRet = Strings.Replace(CUnInputRet, "<", "<"); + return CUnInputRet; + + } + + + // ***Add by PY 2003/07/31**** + public static string CombineXMLAdditional(ref string strAdditional) + { + string CombineXMLAdditionalRet = default(string); + CombineXMLAdditionalRet = "" + strAdditional; + CombineXMLAdditionalRet = CombineXMLAdditionalRet + ""; + return CombineXMLAdditionalRet; + } + + public static string CombineAddXML_Add(ref string name, ref string type, ref string value) + { + string CombineAddXML_AddRet = default(string); + CombineAddXML_AddRet = "" + "" + name + "" + "" + type + "" + "" + value + "" + ""; + + + + return CombineAddXML_AddRet; + } + public static string CombineAddXML_Edit(ref string name, ref string type, ref string value) + { + string CombineAddXML_EditRet = default(string); + CombineAddXML_EditRet = "" + "" + name + "" + "" + type + "" + "" + value + "" + ""; + + + + return CombineAddXML_EditRet; + } + public static string CombineAddXML_Field(ref string name) + { + string CombineAddXML_FieldRet = default(string); + CombineAddXML_FieldRet = "" + "" + name + "" + ""; + + return CombineAddXML_FieldRet; + } + + public static string CombineAddXML_Condition(string condition) + { + string CombineAddXML_ConditionRet = default(string); + CombineAddXML_ConditionRet = "" + Strings.Replace(condition, "''", "'") + ""; + return CombineAddXML_ConditionRet; + } + + // **Add by py 2003/12/04,Gary Lu 20120911:以MESWin1~Win4的版本進行替換 + public static string LocalizeWebService(string wsUrl, bool Customize = false) + { + + string[] tmpString; + int i; + tmpString = wsUrl.Split('/'); + if (Customize == true) + { + if (!string.IsNullOrEmpty(Strings.Trim(gCUSWebServiceHost))) + { + if (tmpString.Length == 6) + { + wsUrl = tmpString[0].ToString() + "/" + tmpString[1].ToString() + "/" + gCUSWebServiceHost + "/" + tmpString[4].ToString() + "/" + tmpString[5].ToString(); + } + else if (tmpString.Length == 5) + { + wsUrl = "http://" + gCUSWebServiceHost + "/" + tmpString[tmpString.Length - 1].ToString(); + } + } + } + else if (!string.IsNullOrEmpty(Strings.Trim(gMESWebServiceHost))) + { + if (tmpString.Length == 6) + { + // wsUrl = "http://" & gMESWebServiceHost & "/" & tmpString(tmpString.Length - 2).ToString & "/" & tmpString(tmpString.Length - 1).ToString + wsUrl = tmpString[0].ToString() + "/" + tmpString[1].ToString() + "/" + gMESWebServiceHost + "/" + tmpString[4].ToString() + "/" + tmpString[5].ToString(); + } + else if (tmpString.Length == 5) + { + // wsUrl = "http://" & gMESWebServiceHost & "/" & tmpString(tmpString.Length - 1).ToString + wsUrl = tmpString[0].ToString() + "/" + tmpString[1].ToString() + "/" + gMESWebServiceHost + "/" + tmpString[4].ToString(); + } + } + if (gEnableSSL) + { + wsUrl = wsUrl.Replace("http://", "https://"); + } + return wsUrl; + // Have to assume the web service is on the machine that this application came from + } // LocalizeWebService + + // Add By Peter 2005/6/20 + public static string GetAppSettings(string key, string section = "") + { + string result = string.Empty; + + try + { + if (!string.IsNullOrEmpty(section)) + { + result = Conversions.ToString(((Hashtable)GetConfig(section))[key]); + } + else if (string.IsNullOrEmpty(gSettingMode) || string.IsNullOrEmpty(gSettingMode) || gSettingMode.Length == 0) + { + result = AppSettings[key]; + } + else + { + Hashtable ht = (Hashtable)GetConfig(gSettingMode); + if (ht != null) + { + result = Conversions.ToString(ht[key]); + } + } + } + + catch (Exception ex) + { + throw ex; + } + + return result; + } + + + public static string GetExceptionStack(ref System.Xml.XmlDocument Xmldoc) + { + string GetExceptionStackRet = default(string); + if (Xmldoc.DocumentElement.GetElementsByTagName("stack").Count > 0) + { + string argstrInput = Xmldoc.DocumentElement.GetElementsByTagName("stack").Item(0).InnerXml; + GetExceptionStackRet = CUnInput(ref argstrInput); + Xmldoc.DocumentElement.GetElementsByTagName("stack").Item(0).InnerXml = argstrInput; + } + else + { + GetExceptionStackRet = ""; + } + + return GetExceptionStackRet; + } + + public static void WriteLog(string msg, iMESLog.iMESLogLevel level, Exception e = null) + { + string MethodInfo = ""; + var ss = new StackTrace(true); + var mb = ss.GetFrame(1).GetMethod(); + MethodInfo = mb.DeclaringType.Namespace + "." + mb.DeclaringType.Name + "." + mb.Name; + + var log = new iMESLog.MESLog(mb.DeclaringType.Namespace); + log.WriteLog(msg, level, e, MethodInfo); + } + #region 語系 + public static string TranslateMsg(string Message) + { + string TranslateMsgRet = default(string); + gLanguageMode = GetAppSettings("LanguageMode"); + // 1.Check LanguageMode + string strFileName, strGenFile; + if (string.IsNullOrEmpty(gLanguageMode)) + { + strFileName = "mesresource.en"; + strGenFile = "mesresource.en"; + } + else + { + strFileName = "mesresource." + gLanguageMode; + strGenFile = "mesresource." + gLanguageMode; + } + + // 2.Get File Path + string strResourcePath = gSTDPath + "Resources"; + + string strErrName_Rep = ""; + + // 檢查檔案是否存在 + if (File.Exists(strResourcePath + "/" + strFileName + ".resources") == true) + { + // 4.Replace原始訊息. + if (Strings.InStr(Message, "[%", CompareMethod.Text) > 0) + { + // Replace[%%] + // Dim rmGen As Resources.ResourceManager = Resources.ResourceManager.CreateFileBasedResourceManager(strGenFile, strResourcePath, Nothing) + + // 2020/05/20 OwenLiu, Mantis:0071895, 增加多語系檔案的語系轉換機制 + ResourceManager ResourceMgr = null; + Dictionary[] ResourceDictionary = null; + funGetMultiResourceManager(strResourcePath, gLanguageMode, ref ResourceMgr, ref ResourceDictionary); + + string strKey, strKeyValue; + int intStart, j, k, l; + + intStart = 1; + j = 1; + + while (j != 0) + { + j = Strings.InStr(intStart, Message, "[%", CompareMethod.Text); + if (j == 0) + { + strErrName_Rep += Strings.Mid(Message, intStart); + } + else + { + k = Strings.InStr(j + 2, Message, "%]", CompareMethod.Text); + if (k == 0) + { + // 找不到對應的結束字元. + strErrName_Rep += Strings.Mid(Message, intStart); + j = 0; + } + else + { + // 檢查是否有不對稱的情況. + l = Strings.InStr(j + 2, Message, "[%", CompareMethod.Text); + if (l == 0 || l > k) + { + strErrName_Rep += Strings.Mid(Message, intStart, j - intStart); + strKey = Strings.Mid(Message, j + 2, k - j - 2); + // 將Key執行語系轉換 + try + { + // 2020/05/20 OwenLiu, Mantis:0071895, 增加多語系檔案的語系轉換機制 + strKeyValue = funGetResourceManager_Text(strKey.ToUpper(), oResourceManager: ref ResourceMgr, oResourceDictionary: ref ResourceDictionary); + } + catch (Exception ex) + { + strKeyValue = strKey; + } + if (string.IsNullOrEmpty(strKeyValue)) + { + strErrName_Rep += strKey; + } + else + { + strErrName_Rep += strKeyValue; + } + // 下次截取字串的起始位置 + intStart = k + 2; + } + else + { + // 不對稱,找到最內層的[%%] + int m; + // 在前面的條件下,一定找得到. + m = Strings.InStrRev(Message, "[%", k, CompareMethod.Text); + // 擷出不轉換的字串. + strErrName_Rep += Strings.Mid(Message, intStart, m - intStart); + strKey = Strings.Mid(Message, m + 2, k - m - 2); + // 將Key執行語系轉換 + try + { + // 2020/05/20 OwenLiu, Mantis:0071895, 增加多語系檔案的語系轉換機制 + strKeyValue = funGetResourceManager_Text(strKey.ToUpper(), oResourceManager: ref ResourceMgr, oResourceDictionary: ref ResourceDictionary); + } + catch (Exception ex) + { + strKeyValue = strKey; + } + if (string.IsNullOrEmpty(strKeyValue)) + { + strErrName_Rep += strKey; + } + else + { + strErrName_Rep += strKeyValue; + } + // 下次截取字串的起始位置 + intStart = k + 2; + } + } + } + } + + ResourceMgr = null; + ResourceDictionary = null; + } + else + { + strErrName_Rep = Message; + } + } + else + { + strErrName_Rep = Message.Replace("[%", "").Replace("%]", ""); + } + + TranslateMsgRet = strErrName_Rep; + return TranslateMsgRet; + + } + + /// + /// 2020/05/15 OwenLiu, Mantis:0071895, 取回所有語系檔案的 ResourceManager Array + /// + /// + /// + /// + /// + private static bool funGetMultiResourceManager(string pResourcePath, string pLanguageMode, ref ResourceManager oResourceManager, ref Dictionary[] oResourceDictionary) + { + + bool blnResult = false; + string strResourceFile = "mesresource"; + + try + { + + if (!string.IsNullOrEmpty(pLanguageMode)) + { + strResourceFile += "." + pLanguageMode; + } + else + { + strResourceFile += ".en"; + } + + if (new DirectoryInfo(pResourcePath).Exists == false) + { + oResourceManager = null; + return blnResult; + } + + // 一次性建立多個ResourceManager, 以節省控制項的語系轉換須多次開檔的時間(控制項一定會有多個) + int intIndex = 0; + short intResouceFileQty = (short)new DirectoryInfo(pResourcePath).GetFiles(strResourceFile + ".resources*", SearchOption.TopDirectoryOnly).Count(); + + if (intResouceFileQty == 1) + { + oResourceDictionary = null; + } + else if (intResouceFileQty > 1) + { + oResourceDictionary = new Dictionary[intResouceFileQty - 2 + 1]; + } + foreach (string f in Directory.GetFiles(pResourcePath, strResourceFile + ".resources*", SearchOption.TopDirectoryOnly).OrderByDescending(x => x)) + { + string ResourceBaseName = f.Substring(f.LastIndexOf(@"\") + 1); + if (intIndex == intResouceFileQty - 1) + { + oResourceManager = ResourceManager.CreateFileBasedResourceManager(strResourceFile, pResourcePath, null); + } + else + { + // 其他資源檔案 讀取到 Dictionary + oResourceDictionary[intIndex] = funReadResourceFile_Dictionary(f); + } + + intIndex += 1; + } + blnResult = true; + } + + catch (Exception ex) + { + throw; + } + + return blnResult; + + } + + /// + /// 2020/05/15 OwenLiu, Mantis:0071895, 從所有語系檔案的 ResourceManager Array 取出對應的語系值 + /// + /// + /// + /// + private static string funGetResourceManager_Text(string pKey, ref ResourceManager oResourceManager, ref Dictionary[] oResourceDictionary) + { + string strResult = ""; + bool blnKeyExists = false; + + do + { + try + { + + // 先搜尋Dictionary 是否有對應的Key + if (oResourceDictionary != null) + { + foreach (Dictionary ResourceDic in oResourceDictionary) + { + if (ResourceDic.ContainsKey(pKey)) + { + strResult = ResourceDic[pKey]; + blnKeyExists = true; + break; + } + } + } + + + if (!blnKeyExists) + { + // 未找到Key, 搜尋ResourceManager + strResult = oResourceManager.GetString(pKey); + if (!string.IsNullOrEmpty(strResult)) + break; + } + } + + catch (Exception ex) + { + } + } + // Throw + while (false); + + return strResult; + + } + + + /// + /// 2020/05/17 OwenLiu, Mantis:0071895, 讀取語系檔案到 Dictionary + /// + /// + /// + private static Dictionary funReadResourceFile_Dictionary(string ResourceFilePath) + { + + var oReturnResource = new Dictionary(); + + try + { + var reader = new ResourceReader(ResourceFilePath); + var en = reader.GetEnumerator(); + + while (en.MoveNext()) + oReturnResource.Add(Conversions.ToString(en.Key), Conversions.ToString(en.Value)); + reader.Close(); + } + catch (Exception ex) + { + throw; + } + + return oReturnResource; + + } + + #endregion + } +} \ No newline at end of file diff --git a/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/AssemblyInfo.cs b/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/AssemblyInfo.cs new file mode 100644 index 0000000..89b2395 --- /dev/null +++ b/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/AssemblyInfo.cs @@ -0,0 +1,31 @@ +using System; +using System.Reflection; +using System.Runtime.InteropServices; + +// 一般的組件資訊是由下列這組屬性所控制。 +// 變更這些屬性的值即可修改組件的相關資訊。 +// 檢閱組件屬性的值 + +[assembly: AssemblyTitle("AutoLoaderService_Base")] +[assembly: AssemblyDescription("AutoLoaderService_Base for MESSeries")] +[assembly: AssemblyCompany("iMES Technology Inc.")] +[assembly: AssemblyProduct("MESSeries 6")] +[assembly: AssemblyCopyright("Copyright © iMES Technology Inc.")] +[assembly: AssemblyTrademark("")] +[assembly: ComVisible(true)] + +// 下列 GUID 為專案公開 (Expose) 至 COM 時所要使用的 typelib ID +[assembly: Guid("35551C58-0A78-4A28-AEAF-1ABCE96E869A")] + +// 組件的版本資訊由下列四個值所組成: +// +// 主要版本 +// 次要版本 +// 組建編號 +// 修訂 +// +// 您可以自行指定所有的值,也可以依照以下的方式,使用 '*' 將修訂和組建編號 +// 指定為預設值: + +[assembly: AssemblyVersion("4.20.0.0")] +[assembly: AssemblyFileVersion("4.20.0.0")] diff --git a/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/AutoLoaderService.cs b/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/AutoLoaderService.cs new file mode 100644 index 0000000..cb566c6 --- /dev/null +++ b/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/AutoLoaderService.cs @@ -0,0 +1,661 @@ +using System; +using System.Data; +using System.Diagnostics; +using System.IO; +using System.Runtime.CompilerServices; +using System.ServiceProcess; +using System.Xml; +using Microsoft.VisualBasic; +using Microsoft.VisualBasic.CompilerServices; + +namespace AutoLoaderService_Base +{ + + public class Service1 : ServiceBase + { + + // //建立AutoLoaderJob所使用的DataTable + private DataTable dtAutoLoaderJob; + + // //Trace & Log + private bool blnLogFile = false; + private bool blnTraceFile = false; + private string strLogFilePath = string.Empty; + private string strTraceFilePath = string.Empty; + + // //取出Job檔案路徑 + private string strJobFilePath = ""; + + // 取回JOB LIST 到 JOB QUEUE的時間間隔(單位:分鐘) '20211015 13871,修正為*1000是秒, *60才是分鐘 + private int MonitorjoblistDuration = (int)Math.Round(Conversions.ToDouble(modWIN.GetAppSettings("MonitorjoblistDuration")) * 1000d *60d ); + // 到JOB QUEUE 檢查是否有要執行的job的時間間隔(單位:分鐘) '20211015 13871,修正為*1000是秒, , *60才是分鐘 + private int MonitorQueueDuration = (int)Math.Round(Conversions.ToDouble(modWIN.GetAppSettings("MonitorQueueDuration")) * 1000d * 60d); + + private const string JOB_FILE_NAME = "AutoLoaderJob_Base.xml"; + + #region 元件設計工具產生的程式碼 + + public Service1() : base() + { + // 此為元件設計工具所需的呼叫。 + InitializeComponent(); + + // 在 InitializeComponent() 呼叫之後加入所有的初始化作業 + + } + + // UserService 覆寫 Dispose 以清除元件清單。 + protected override void Dispose(bool disposing) + { + if (disposing) + { + if (components != null) + { + components.Dispose(); + } + } + base.Dispose(disposing); + } + + // 處理序的主進入點 + [MTAThread()] + public static void Main() + { + ServiceBase[] ServicesToRun; + + // 在同一個處理序中可以執行多個 NT 服務; 若要在這個處理序中 + // 加入另一項服務,請修改以下各行 + // 以建立第二個服務物件。例如, + // + // ServicesToRun = New System.ServiceProcess.ServiceBase () {New Service1, New MySecondUserService} + // + ServicesToRun = new ServiceBase[] { new Service1() }; + + //RunInteractive(ServicesToRun); //for debug + Run(ServicesToRun); + } + private static void RunInteractive(ServiceBase[] servicesToRun) + { + var onStartMethod = typeof(ServiceBase).GetMethod("OnStart", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); + + foreach (ServiceBase service in servicesToRun) + { + Console.Write("Starting {0}...", service.ServiceName); + onStartMethod.Invoke(service, new object[] { new string[] { } }); + Console.Write("Started"); + } + + Console.WriteLine("Press any key to stop the services"); + Console.ReadKey(); + var onStopMethod = typeof(ServiceBase).GetMethod("OnStop", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); + + foreach (ServiceBase service in servicesToRun) + { + Console.Write("Stopping {0}...", service.ServiceName); + onStopMethod.Invoke(service, null); + Console.WriteLine("Stopped"); + } + } + + + // 為元件設計工具的必要項 + private System.ComponentModel.IContainer components; + + // 注意: 以下為元件設計工具所需的程序 + // 您可以使用元件設計工具進行修改, + // 請勿使用程式碼編輯器進行修改。 + private System.Timers.Timer _TimerCheckJobList; + + internal virtual System.Timers.Timer TimerCheckJobList + { + [MethodImpl(MethodImplOptions.Synchronized)] + get + { + return _TimerCheckJobList; + } + + [MethodImpl(MethodImplOptions.Synchronized)] + set + { + if (_TimerCheckJobList != null) + { + _TimerCheckJobList.Elapsed -= TimerCheckJobList_Elapsed; + } + + _TimerCheckJobList = value; + if (_TimerCheckJobList != null) + { + _TimerCheckJobList.Elapsed += TimerCheckJobList_Elapsed; + } + } + } + private System.Timers.Timer _TimerCheckQueue; + + internal virtual System.Timers.Timer TimerCheckQueue + { + [MethodImpl(MethodImplOptions.Synchronized)] + get + { + return _TimerCheckQueue; + } + + [MethodImpl(MethodImplOptions.Synchronized)] + set + { + if (_TimerCheckQueue != null) + { + _TimerCheckQueue.Elapsed -= TimerCheckQueue_Elapsed; + } + + _TimerCheckQueue = value; + if (_TimerCheckQueue != null) + { + _TimerCheckQueue.Elapsed += TimerCheckQueue_Elapsed; + } + } + } + [DebuggerStepThrough()] + private void InitializeComponent() + { + this._TimerCheckJobList = new System.Timers.Timer(); + this._TimerCheckQueue = new System.Timers.Timer(); + ((System.ComponentModel.ISupportInitialize)(this._TimerCheckJobList)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this._TimerCheckQueue)).BeginInit(); + // + // _TimerCheckJobList + // + this._TimerCheckJobList.Interval = 2000D; + this._TimerCheckJobList.Elapsed += new System.Timers.ElapsedEventHandler(this.TimerCheckJobList_Elapsed); + // + // _TimerCheckQueue + // + this._TimerCheckQueue.Interval = 3000D; + this._TimerCheckQueue.Elapsed += new System.Timers.ElapsedEventHandler(this.TimerCheckQueue_Elapsed); + // + // Service1 + // + this.ServiceName = "MES AutoLoader Service (Production)"; + ((System.ComponentModel.ISupportInitialize)(this._TimerCheckJobList)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this._TimerCheckQueue)).EndInit(); + + } + + #endregion + + protected override void OnStart(string[] args) + { + + // // 在此加入啟動服務的程式碼,這個方法必須設定已啟動的 + // // 事項,否則可能導致服務無法工作。 + + // //取出是否需要將Trace的Log產生檔案 + try + { + string strTemp = modWIN.GetAppSettings("JobFilePath") == null ? "" : modWIN.GetAppSettings("JobFilePath"); + if (strTemp.Contains(":")) + strJobFilePath = Path.Combine(strTemp, JOB_FILE_NAME); + else + strJobFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, strTemp, JOB_FILE_NAME); + } + catch (Exception) + { + strJobFilePath = JOB_FILE_NAME; + modWIN.WriteLog("defaultPath:" + strJobFilePath, iMESLog.iMESLogLevel.Trace); + } + try + { + blnTraceFile = bool.Parse(modWIN.GetAppSettings("TraceFile")); + } + catch (Exception ex) + { + blnTraceFile = false; + } + + // //取出是否需要將Fail的Log產生檔案 + try + { + blnLogFile = bool.Parse(modWIN.GetAppSettings("LogFile")); + } + catch (Exception ex) + { + blnLogFile = false; + } + + // //取出是Trace產生檔案路徑 + try + { + if (blnTraceFile == true) + { + string strTemp = modWIN.GetAppSettings("TraceFilePath") == null ? "" : modWIN.GetAppSettings("TraceFilePath"); + if (strTemp.Contains(":")) + strTraceFilePath = strTemp; + else + strTraceFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, strTemp); + } + } + catch (Exception ex) + { + // 暫時 + strTraceFilePath = @"C:\Temp\"; + } + + // //取出是Log產生檔案路徑 + try + { + if (blnLogFile == true) + { + string strTemp = modWIN.GetAppSettings("LogFilePath") == null ? "" : modWIN.GetAppSettings("LogFilePath"); + if (strTemp.Contains(":")) + strLogFilePath = strTemp; + else + strLogFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, strTemp); + } + } + catch (Exception ex) + { + // 暫時 + strLogFilePath = string.Empty; + } + + + if (blnTraceFile == true) + { + //funWriteTxtFile("Service Starting..."); + modWIN.WriteLog("Service Starting...", iMESLog.iMESLogLevel.Trace); + } + + dtAutoLoaderJob = new DataTable("AutoLoaderJob"); + // 2021/8/10 Steven Mantis: 0097110: AuoLoader Service 錯誤攔截優化 + try + { + //改成用读取节点的方式获取xml值 + XmlDocument xmlDoc = new XmlDocument(); + xmlDoc.Load(strJobFilePath); + XmlNodeList autoLoaderJobList = xmlDoc.GetElementsByTagName("AutoLoaderJob"); + foreach (XmlNode autoLoaderJobNode in autoLoaderJobList) + { + DataRow drAdd; + drAdd = dtAutoLoaderJob.NewRow(); + foreach (XmlNode item in autoLoaderJobNode.ChildNodes) + { + if (!dtAutoLoaderJob.Columns.Contains(item.Name)) + { + dtAutoLoaderJob.Columns.Add(item.Name); + } + drAdd[item.Name] = funLoadXml(autoLoaderJobNode, item.Name); + } + dtAutoLoaderJob.Rows.Add(drAdd); + } + //dtAutoLoaderJob.ReadXmlSchema(strJobFilePath); + //dtAutoLoaderJob.ReadXml(strJobFilePath); + } + catch (Exception ex) + { + modWIN.WriteLog("[" + Strings.Format(DateTime.Now, "yyyy/MM/dd HH:mm:ss") + "]" + "AutoLoaderJob_Base.xml不存在或格式不正確,請確認" + Constants.vbCrLf, iMESLog.iMESLogLevel.Error ); + //modAutoLoader.WriteLogFile(strLogFilePath, "[" + Strings.Format(DateTime.Now, "yyyy/MM/dd HH:mm:ss") + "]" + "AutoLoaderJob_Base.xml不存在或格式不正確,請確認" + Constants.vbCrLf); + } + + // //Init Status = 0 + int i = 0; + var loopTo = dtAutoLoaderJob.Rows.Count - 1; + for (i = 0; i <= loopTo; i++) + { + dtAutoLoaderJob.Rows[i].BeginEdit(); + dtAutoLoaderJob.Rows[i]["Status"] = 0; + dtAutoLoaderJob.Rows[i].EndEdit(); + } + + // '//Init Process + // Call InitProcess() + // 每隔n分鐘, 取回一次JOB LIST 到 JOB QUEUE + TimerCheckJobList.Interval = MonitorjoblistDuration; + TimerCheckJobList.Enabled = true; + + // 每隔n分鐘,到 JOB QUEUE 檢查是否有要執行的 + TimerCheckQueue.Interval = MonitorQueueDuration; + TimerCheckQueue.Enabled = true; + + } + + protected override void OnStop() + { + + // //在此加入停止服務所需執行的終止程式碼。 + dtAutoLoaderJob.WriteXml(strJobFilePath); + dtAutoLoaderJob.Dispose(); + TimerCheckJobList.Enabled = false; + TimerCheckQueue.Enabled = false; + if (blnTraceFile == true) + { + modWIN.WriteLog("Service Stopping...", iMESLog.iMESLogLevel.Trace); + //funWriteTxtFile("Service Stopping..."); + } + + } + + private void TimerCheckJobList_Elapsed(object sender, System.Timers.ElapsedEventArgs e) + { + + try + { + // //............................ + // //每一秒鐘檢查是否有Job要執行 + // //............................ + // Me.TimerCheckJobList.Enabled = False + if (blnTraceFile == true) + { + //funJobFile("Start CheckJobList"); + modWIN.WriteLog("Start CheckJobList", iMESLog.iMESLogLevel.Trace); + } + // //變更需要執行的Job Status + funGetJob2Queue(); + if (blnTraceFile == true) + { + modWIN.WriteLog("End CheckJobList", iMESLog.iMESLogLevel.Trace); + //funJobFile("End CheckJobList"); + } + + TimerCheckJobList.Enabled = true; + } + + catch (Exception ex) + { + modWIN.WriteLog("CheckJobList fail"+ex.Message , iMESLog.iMESLogLevel.Error ); + TimerCheckJobList.Enabled = true; + } + } + + private void TimerCheckQueue_Elapsed(object sender, System.Timers.ElapsedEventArgs e) + { + + try + { + // //............................ + // //每一秒鐘取出需要執行的Job + // //............................ + // Me.TimerCheckQueue.Enabled = False + if (blnTraceFile == true) + { + modWIN.WriteLog("Start CheckQueue",iMESLog.iMESLogLevel.Trace ); + // funQueueFile("Start CheckQueue"); + } + + // //執行Job + funRunJob(); + + if (blnTraceFile == true) + { + modWIN.WriteLog("End CheckQueue", iMESLog.iMESLogLevel.Trace); + //funQueueFile("End CheckQueue"); + } + + TimerCheckQueue.Enabled = true; + } + + catch (Exception ex) + { + modWIN.WriteLog("CheckQueue fail:"+ ex.Message , iMESLog.iMESLogLevel.Error ); + TimerCheckQueue.Enabled = true; + + } + + + } + + #region Private Function + /// + /// 将status 改为1 待执行 + /// + public void funGetJob2Queue() + { + + lock (this) + { + + // //判斷目前的Job中是否需要排入執行 + DataRow[] drSel; + int idx = 0; + var ArriveTime = DateTime.Now; + + try + { + // // + drSel = dtAutoLoaderJob.Select("Status = 0"); // 未執行Job + var loopTo = drSel.Length - 1; + for (idx = 0; idx <= loopTo; idx++) + { + // 2023/4/21,Ning,129075: [博升] AutoLoader 日志报错, 執行頻率(Frequency)單位改為分鐘, 即秒*60 + //if (Conversions.ToBoolean(Operators.ConditionalCompareObjectGreater(DateAndTime.DateDiff(DateInterval.Second, Conversions.ToDate(drSel[idx]["LastRunTime"]), ArriveTime), Conversions.ToInteger(drSel[idx]["Frequency"]) * 60, false))) + //If DateDiff(DateInterval.Second, drSel(idx)("LastRunTime"), ArriveTime) > (drSel(idx)("Frequency") * 60) Then + //检查上一次的时间与当配置的时间差 + if (DateAndTime.DateDiff(DateInterval.Second, Convert.ToDateTime(drSel[idx]["LastRunTime"]), ArriveTime) > Convert.ToInt32(drSel[idx]["Frequency"]) * 60) + { + drSel[idx].BeginEdit(); + drSel[idx]["Status"] = 1; // 待執行Job + drSel[idx].EndEdit(); + if (blnTraceFile == true) + { + //funJobFile(Conversions.ToString("JobNo:" + + // drSel[idx]["JobNo"] + " -- " + drSel[idx]["LastRunTime"] + " ~ " + ArriveTime + " = " + DateAndTime.DateDiff(DateInterval.Second, Conversions.ToDate(drSel[idx]["LastRunTime"]), ArriveTime))); + modWIN.WriteLog(Conversions.ToString("JobNo:" + + drSel[idx]["JobNo"] + " -- " + drSel[idx]["LastRunTime"] + " ~ " + ArriveTime + " = " + DateAndTime.DateDiff(DateInterval.Second, Conversions.ToDate(drSel[idx]["LastRunTime"]), ArriveTime)), iMESLog.iMESLogLevel.Trace); + } + } + } + } + + catch (Exception ex) + { + //modAutoLoader.WriteLogFile(strLogFilePath, ex.Message + Constants.vbCrLf); + modWIN.WriteLog("funGetJob2Queue fail :" +strLogFilePath + ex.Message, iMESLog.iMESLogLevel.Error ); + } + finally + { + // // + drSel = null; + } + + } + + } + + public void funRunJob() + { + + lock (this) + { + + DataRow[] drSel; + int idx = 0; + var ArriveTime = DateTime.Now; + + try + { + + drSel = dtAutoLoaderJob.Select("Status = 1"); // 待執行Job + if (blnTraceFile == true) + { + // funQueueFile("Queue Count:" + drSel.Length); + modWIN.WriteLog("Queue Count:" + drSel.Length, iMESLog.iMESLogLevel.Trace); + } + var loopTo = drSel.Length - 1; + for (idx = 0; idx <= loopTo; idx++) + { + + if (blnTraceFile == true) + { + // funWriteTxtFile("Start Job..." + drSel[idx]["JobNo"].ToString()); + modWIN.WriteLog("Start Job..." + drSel[idx]["JobNo"].ToString(), iMESLog.iMESLogLevel.Trace); + } + // //將Job改成執行中 + drSel[idx].BeginEdit(); + drSel[idx]["Status"] = 2; // 執行中 + drSel[idx].EndEdit(); + + if (blnTraceFile == true) + { + // funWriteTxtFile("Status:Running"); + modWIN.WriteLog("Status:Running", iMESLog.iMESLogLevel.Trace); + } + + // //建立傳入執行緒之參數物件 + var objJobData = new modAutoLoader.SomeStateType(); + objJobData.SomeState(drSel[idx]["JobExecutionFile"].ToString(), drSel[idx]["JobNo"].ToString(), drSel[idx]["Jobfunction"].ToString(), drSel[idx]["SourcePath"].ToString(), drSel[idx]["DestinationPath"].ToString(), drSel[idx]["QueuePath"].ToString(), drSel[idx]["FailPath"].ToString(), strLogFilePath, Conversions.ToLong(drSel[idx]["SplitFileSize"].ToString()), Conversions.ToLong(drSel[idx]["SplitRecordsLimit"].ToString()), drSel[idx]["JobName"].ToString(), drSel[idx]["JobFunction"].ToString(), drSel[idx]["Parameter1"].ToString(), drSel[idx]["Parameter2"].ToString(), drSel[idx]["Parameter3"].ToString(), drSel[idx]["Parameter4"].ToString(), drSel[idx]["Parameter5"].ToString(), drSel[idx]["Parameter6"].ToString(), drSel[idx]["Parameter7"].ToString(), drSel[idx]["Parameter8"].ToString(), drSel[idx]["Parameter9"].ToString(), drSel[idx]["Parameter10"].ToString()); + // //開始執行 + if (System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(modAutoLoader.funProcessJob), objJobData) == false) + { + modWIN.WriteLog("Job Fail:" + drSel[idx]["JobNo"].ToString(), iMESLog.iMESLogLevel.Trace); + // //funWriteTxtFile("Job Fail:" & drSel(idx)("JobNo").ToString) + } + + // //將Job改成Queue + drSel[idx].BeginEdit(); + drSel[idx]["Status"] = 0; // Queue + drSel[idx]["LastRunTime"] = Strings.Format(ArriveTime, "yyyy/MM/dd HH:mm:ss"); // 執行時間 + drSel[idx].EndEdit(); + + if (blnTraceFile == true) + { + modWIN.WriteLog("Status:Complete," +"End Job..." + drSel[idx]["JobNo"].ToString(), iMESLog.iMESLogLevel.Trace); + //funWriteTxtFile("Status:Complete"); + //funWriteTxtFile("End Job..." + drSel[idx]["JobNo"].ToString()); + } + + } + } + + catch (Exception ex) + { + // // + drSel = dtAutoLoaderJob.Select("Status = 2"); // 執行中 + var loopTo = drSel.Length - 1; + for (idx = 0; idx <= loopTo; idx++) + { + // //將Job改成待執行 + drSel[idx].BeginEdit(); + drSel[idx]["Status"] = 0; // Queue + drSel[idx]["LastRunTime"] = Strings.Format(ArriveTime, "yyyy/MM/dd HH:mm:ss"); // 執行時間 + drSel[idx].EndEdit(); + } + modWIN.WriteLog(ex.Message + Constants.vbCrLf, iMESLog.iMESLogLevel.Error ); + //modAutoLoader.WriteLogFile(strLogFilePath, ex.Message + Constants.vbCrLf); + } + + finally + { + drSel = null; + } + + } + + } + + public void InitProcess() + { + + try + { + // //開始執行 + System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(modAutoLoader.funInitProcess)); + } + + catch (Exception ex) + { + + } + + } + + private string funWriteTxtFile(string WriteTxt) + { + + try + { + string path = Path.Combine(strTraceFilePath, Strings.Format(DateTime.Now, "yyyyMMdd").ToString() + "_T3.Log"); + if (!string.IsNullOrEmpty(strTraceFilePath) && !Directory.Exists(strTraceFilePath)) + Directory.CreateDirectory(strTraceFilePath); + lock (this) + { + var fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite); + var w = new StreamWriter(fs); + w.BaseStream.Seek(0L, SeekOrigin.End); + w.WriteLine("日期時間:" + Strings.Format(DateTime.Now, "yyyy/MM/dd HH:mm:ss") + "--" + WriteTxt); + w.Close(); + fs.Close(); + } + } + catch (Exception ex) + { + } + + return default(string); + + } + + private string funQueueFile(string WriteTxt) + { + + try + { + string path = Path.Combine(strTraceFilePath, Strings.Format(DateTime.Now, "yyyyMMdd").ToString() + "_T1.Log"); + if (!string.IsNullOrEmpty(strTraceFilePath) && !Directory.Exists(strTraceFilePath)) + Directory.CreateDirectory(strTraceFilePath); + lock (this) + { + var fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite); + var w = new StreamWriter(fs); + w.BaseStream.Seek(0L, SeekOrigin.End); + w.WriteLine("日期時間:" + Strings.Format(DateTime.Now, "yyyy/MM/dd HH:mm:ss") + "--" + WriteTxt); + w.Close(); + fs.Close(); + } + } + catch (Exception ex) + { + } + + return default(string); + + } + + private string funJobFile(string WriteTxt) + { + + try + { + string path = Path.Combine(strTraceFilePath, Strings.Format(DateTime.Now, "yyyyMMdd").ToString() + "_T2.Log"); + if (!string.IsNullOrEmpty(strTraceFilePath) && !Directory.Exists(strTraceFilePath)) + Directory.CreateDirectory(strTraceFilePath); + lock (this) + { + var fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite); + var w = new StreamWriter(fs); + w.BaseStream.Seek(0L, SeekOrigin.End); + w.WriteLine("日期時間:" + Strings.Format(DateTime.Now, "yyyy/MM/dd HH:mm:ss") + "--" + WriteTxt); + w.Close(); + fs.Close(); + } + } + catch (Exception ex) + { + } + + return default(string); + + } + + #endregion + private string funLoadXml(XmlNode autoLoaderJobNode, string tag) + { + if (autoLoaderJobNode.SelectNodes(tag).Count > 0) + { + return autoLoaderJobNode.SelectSingleNode(tag).InnerText; + } + else + { + return ""; + } + } + + } +} diff --git a/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/AutoLoaderService.resx b/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/AutoLoaderService.resx new file mode 100644 index 0000000..7bc8b52 --- /dev/null +++ b/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/AutoLoaderService.resx @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 183, 17 + + + 17, 17 + + + False + + \ No newline at end of file diff --git a/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/AutoLoaderService_Base.csproj b/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/AutoLoaderService_Base.csproj new file mode 100644 index 0000000..1d7bd7a --- /dev/null +++ b/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/AutoLoaderService_Base.csproj @@ -0,0 +1,293 @@ + + + + Local + 8.0.50727 + 2.0 + {76CCB2C1-5347-075C-192E-C939BAFBC971} + SAK + SAK + SAK + SAK + Debug + AnyCPU + + + + + AutoLoaderService_Base + + + None + JScript + Grid + IE50 + false + WinExe + Binary + On + Off + AutoLoaderService_Base + AutoLoaderService_Base.Service1 + true + false + true + + + Console + + + false + v4.6.2 + 2.0 + false + + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + true + $(DefaultItemExcludes);$(ProjectDir)**\*.vb + + + ..\..\..\MESClient\AutoLoaderServiceInstall_Base\ + ..\..\..\MESClient\AutoLoaderServiceInstall_Base\AutoLoaderService_Base.xml + 285212672 + + + + + true + true + true + false + false + false + false + 0 + 41999,42016,42017,42018,42019,42020,42021,42022,42032,42036,42353,42354,42355 + full + AnyCPU + false + + + ..\..\..\MESClient\AutoLoaderServiceInstall\ + ..\..\..\MESClient\AutoLoaderServiceInstall\ + + 285212672 + + + + + false + true + false + true + false + false + false + 0 + 41999,42016,42017,42018,42019,42020,42021,42022,42032,42036,42353,42354,42355 + none + false + + + + + + False + ..\..\..\MES_S_DLL\AutoLoaderLib_Base.dll + + + False + ..\..\..\MES_S_DLL\data_access_service.dll + + + False + ..\..\..\MES_S_DLL\iMESAppSetting.dll + + + ..\..\..\MES_S_DLL\iMESComSubroutine.dll + + + ..\..\..\MES_S_DLL\iMESComXML.dll + + + False + ..\..\..\MES_S_DLL\iMESConst.dll + + + ..\..\..\MES_S_DLL\iMESLog.dll + + + + False + ..\..\..\MES_C_DLL\ICSharpCode.SharpZipLib.dll + + + False + ..\..\..\MES_C_DLL\NPOI.dll + + + False + ..\..\..\MES_C_DLL\NPOI.OOXML.dll + + + False + ..\..\..\MES_C_DLL\NPOI.OpenXml4Net.dll + + + False + ..\..\..\MES_C_DLL\NPOI.OpenXmlFormats.dll + + + False + ..\..\..\MES_S_DLL\Oracle.ManagedDataAccess.dll + + + System + + + + System.Configuration.Install + + + System.Data + + + + + System.ServiceProcess + + + + System.Web.Services + + + + System.XML + + + + + + + + + + + + True + True + Reference.map + + + Designer + + + Code + + + Component + + + Code + + + Code + + + True + True + Settings.settings + + + Component + + + AutoLoaderService.cs + Designer + + + ProjectInstaller.cs + Designer + + + Always + + + Always + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + Always + + + Always + + + MSDiscoCodeGenerator + Reference.cs + + + + + + + Always + + + + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 3.5 SP1 + true + + + False + Windows Installer 3.1 + true + + + + + + + + Dynamic + Web References\localhost\ + http://localhost/MESws_Industry_Base/wsInvoke.asmx%3fop=invokeSrv + + + + + Settings + AutoLoaderService_Base_localhost_wsInvoke + + + + + + + + + + \ No newline at end of file diff --git a/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/AutoLoaderService_Base.csproj.vspscc b/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/AutoLoaderService_Base.csproj.vspscc new file mode 100644 index 0000000..b6d3289 --- /dev/null +++ b/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/AutoLoaderService_Base.csproj.vspscc @@ -0,0 +1,10 @@ +"" +{ +"FILE_VERSION" = "9237" +"ENLISTMENT_CHOICE" = "NEVER" +"PROJECT_FILE_RELATIVE_PATH" = "" +"NUMBER_OF_EXCLUDED_FILES" = "0" +"ORIGINAL_PROJECT_FILE_PATH" = "" +"NUMBER_OF_NESTED_PROJECTS" = "0" +"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER" +} diff --git a/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/Install_x32.bat b/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/Install_x32.bat new file mode 100644 index 0000000..034be45 --- /dev/null +++ b/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/Install_x32.bat @@ -0,0 +1,3 @@ +%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe "%~dp0AutoLoaderService_Base.exe" + +Pause \ No newline at end of file diff --git a/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/Install_x64.bat b/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/Install_x64.bat new file mode 100644 index 0000000..6a4f0e8 --- /dev/null +++ b/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/Install_x64.bat @@ -0,0 +1,3 @@ +%SystemRoot%\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe "%~dp0AutoLoaderService_Base.exe" + +Pause \ No newline at end of file diff --git a/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/My Project/Settings.Designer.cs b/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/My Project/Settings.Designer.cs new file mode 100644 index 0000000..0e6a356 --- /dev/null +++ b/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/My Project/Settings.Designer.cs @@ -0,0 +1,102 @@ +// ------------------------------------------------------------------------------ +// +// 這段程式碼是由工具產生的。 +// 執行階段版本:4.0.30319.42000 +// +// 對這個檔案所做的變更可能會造成錯誤的行為,而且如果重新產生程式碼, +// 變更將會遺失。 +// +// ------------------------------------------------------------------------------ + +using System.Diagnostics; +using Microsoft.VisualBasic; +using Microsoft.VisualBasic.CompilerServices; + +namespace AutoLoaderService_Base +{ + + + + [System.Runtime.CompilerServices.CompilerGenerated()] + [System.CodeDom.Compiler.GeneratedCode("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.9.0.0")] + [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Advanced)] + internal sealed partial class Settings : System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = (Settings)Synchronized(new Settings()); + + #region My.Settings 自動儲存功能 + /* TODO ERROR: Skipped IfDirectiveTrivia + #If _MyType = "WindowsForms" Then + *//* TODO ERROR: Skipped DisabledTextTrivia + Private Shared addedHandler As Boolean + + Private Shared addedHandlerLockObject As New Object + + _ + Private Shared Sub AutoSaveSettings(sender As Global.System.Object, e As Global.System.EventArgs) + If My.Application.SaveMySettingsOnExit Then + My.Settings.Save() + End If + End Sub + *//* TODO ERROR: Skipped EndIfDirectiveTrivia + #End If + */ + #endregion + + public static Settings Default + { + get + { + + /* TODO ERROR: Skipped IfDirectiveTrivia + #If _MyType = "WindowsForms" Then + *//* TODO ERROR: Skipped DisabledTextTrivia + If Not addedHandler Then + SyncLock addedHandlerLockObject + If Not addedHandler Then + AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings + addedHandler = True + End If + End SyncLock + End If + *//* TODO ERROR: Skipped EndIfDirectiveTrivia + #End If + */ + return defaultInstance; + } + } + + [System.Configuration.ApplicationScopedSetting()] + [DebuggerNonUserCode()] + [System.Configuration.SpecialSetting(System.Configuration.SpecialSetting.WebServiceUrl)] + [System.Configuration.DefaultSettingValue("http://localhost/MESws_Industry_Base/wsInvoke.asmx")] + public string AutoLoaderService_Base_localhost_wsInvoke + { + get + { + return Conversions.ToString(this["AutoLoaderService_Base_localhost_wsInvoke"]); + } + } + } + + namespace My + { + + [HideModuleName()] + [DebuggerNonUserCode()] + [System.Runtime.CompilerServices.CompilerGenerated()] + internal static class MySettingsProperty + { + + [System.ComponentModel.Design.HelpKeyword("My.Settings")] + internal static Settings Settings + { + get + { + return Settings.Default; + } + } + } + } +} \ No newline at end of file diff --git a/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/My Project/Settings.settings b/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/My Project/Settings.settings new file mode 100644 index 0000000..5e2470f --- /dev/null +++ b/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/My Project/Settings.settings @@ -0,0 +1,9 @@ + + + + + + http://localhost/MESws_Industry_Base/wsInvoke.asmx + + + \ No newline at end of file diff --git a/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/ProjectInstaller.cs b/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/ProjectInstaller.cs new file mode 100644 index 0000000..71a88e2 --- /dev/null +++ b/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/ProjectInstaller.cs @@ -0,0 +1,102 @@ +using System.ComponentModel; +using System.Configuration.Install; +using System.Diagnostics; +using System.Runtime.CompilerServices; + +namespace AutoLoaderService_Base +{ + + [RunInstaller(true)] + public class ProjectInstaller : Installer + { + + #region 元件設計工具產生的程式碼 + + public ProjectInstaller() : base() + { + + // 此為元件設計工具所需的呼叫。 + InitializeComponent(); + + // 在 InitializeComponent() 呼叫之後加入所有的初始設定 + + } + + // Installer 覆寫 Dispose 以清除元件清單。 + protected override void Dispose(bool disposing) + { + if (disposing) + { + if (components != null) + { + components.Dispose(); + } + } + base.Dispose(disposing); + } + + // 為元件設計工具的必要項 + private IContainer components; + + // 注意: 以下為元件設計工具所需的程序 + // 您可以使用元件設計工具進行修改, + // 請勿使用程式碼編輯器進行修改。 + private System.ServiceProcess.ServiceProcessInstaller _ServiceProcessInstaller1; + + internal virtual System.ServiceProcess.ServiceProcessInstaller ServiceProcessInstaller1 + { + [MethodImpl(MethodImplOptions.Synchronized)] + get + { + return _ServiceProcessInstaller1; + } + + [MethodImpl(MethodImplOptions.Synchronized)] + set + { + _ServiceProcessInstaller1 = value; + } + } + private System.ServiceProcess.ServiceInstaller _ServiceInstaller1; + + internal virtual System.ServiceProcess.ServiceInstaller ServiceInstaller1 + { + [MethodImpl(MethodImplOptions.Synchronized)] + get + { + return _ServiceInstaller1; + } + + [MethodImpl(MethodImplOptions.Synchronized)] + set + { + _ServiceInstaller1 = value; + } + } + [DebuggerStepThrough()] + private void InitializeComponent() + { + _ServiceProcessInstaller1 = new System.ServiceProcess.ServiceProcessInstaller(); + _ServiceInstaller1 = new System.ServiceProcess.ServiceInstaller(); + // + // ServiceProcessInstaller1 + // + _ServiceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.LocalSystem; + _ServiceProcessInstaller1.Password = null; + _ServiceProcessInstaller1.Username = null; + // + // ServiceInstaller1 + // + _ServiceInstaller1.DisplayName = "MES AutoLoader Service (Production)"; + _ServiceInstaller1.ServiceName = "MES AutoLoader Service (Production)"; + // + // ProjectInstaller + // + Installers.AddRange(new Installer[] { _ServiceProcessInstaller1, _ServiceInstaller1 }); + + } + + #endregion + + } +} \ No newline at end of file diff --git a/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/ProjectInstaller.resx b/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/ProjectInstaller.resx new file mode 100644 index 0000000..3ba57eb --- /dev/null +++ b/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/ProjectInstaller.resx @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 56 + + + 17, 17 + + + False + + \ No newline at end of file diff --git a/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/Uninstall_x32.bat b/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/Uninstall_x32.bat new file mode 100644 index 0000000..5ab578b --- /dev/null +++ b/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/Uninstall_x32.bat @@ -0,0 +1,3 @@ +%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe "%~dp0AutoLoaderService_Base.exe" -u + +Pause \ No newline at end of file diff --git a/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/Uninstall_x64.bat b/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/Uninstall_x64.bat new file mode 100644 index 0000000..0af99c6 --- /dev/null +++ b/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/Uninstall_x64.bat @@ -0,0 +1,3 @@ +%SystemRoot%\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe "%~dp0AutoLoaderService_Base.exe" -u + +Pause \ No newline at end of file diff --git a/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/Web References/localhost/Reference.cs b/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/Web References/localhost/Reference.cs new file mode 100644 index 0000000..84db6ab --- /dev/null +++ b/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/Web References/localhost/Reference.cs @@ -0,0 +1,1855 @@ +// ------------------------------------------------------------------------------ +// +// 這段程式碼是由工具產生的。 +// 執行階段版本:4.0.30319.42000 +// +// 對這個檔案所做的變更可能會造成錯誤的行為,而且如果重新產生程式碼, +// 變更將會遺失。 +// +// ------------------------------------------------------------------------------ + + +using System; +using System.ComponentModel; +using System.Data; +using System.Diagnostics; +using System.Web.Services; +using System.Web.Services.Protocols; +using System.Xml.Serialization; +using Microsoft.VisualBasic.CompilerServices; + +// +// 原始程式碼已由 Microsoft.VSDesigner 自動產生,版本 4.0.30319.42000。 +// +namespace AutoLoaderService_Base.localhost +{ + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.4084.0")] + [DebuggerStepThrough()] + [DesignerCategory("code")] + [WebServiceBinding(Name = "wsInvokeSoap", Namespace = "http://www.imestech.com/wsInvoke")] + [XmlInclude(typeof(object[]))] + public partial class wsInvoke : SoapHttpClientProtocol + { + + private System.Threading.SendOrPostCallback invokeSrvOperationCompleted; + + private System.Threading.SendOrPostCallback invokeSrv_EnableLogOperationCompleted; + + private System.Threading.SendOrPostCallback invokeSrv_XmlOperationCompleted; + + private System.Threading.SendOrPostCallback invokeSrv_Xml_SessionOperationCompleted; + + private System.Threading.SendOrPostCallback invokeSrv_DataTableParameterOperationCompleted; + + private System.Threading.SendOrPostCallback invokeSrv_DataTableOperationCompleted; + + private System.Threading.SendOrPostCallback invokeSrv_DataSetOperationCompleted; + + private System.Threading.SendOrPostCallback invokeSrv_SessionOperationCompleted; + + private System.Threading.SendOrPostCallback invokeSrv_Session_jsonOperationCompleted; + + private System.Threading.SendOrPostCallback invokeSrv_iMES_jsonOperationCompleted; + + private System.Threading.SendOrPostCallback TestOperationCompleted; + + private System.Threading.SendOrPostCallback invoke_SignalROperationCompleted; + + private System.Threading.SendOrPostCallback invokeSrv_ModuleOperationCompleted; + + private System.Threading.SendOrPostCallback invokeSrv_Module_DataSetOperationCompleted; + + private System.Threading.SendOrPostCallback InvokeSrv_PDAOperationCompleted; + + private System.Threading.SendOrPostCallback InvokeSrv_PADOperationCompleted; + + private System.Threading.SendOrPostCallback invokeSrv_jsonOperationCompleted; + + private System.Threading.SendOrPostCallback InvokeSrv_Json_MultiOperationCompleted; + + private System.Threading.SendOrPostCallback invokeSrv_Session_plainjsonOperationCompleted; + + private System.Threading.SendOrPostCallback invokeSrv_plainjsonOperationCompleted; + + private System.Threading.SendOrPostCallback Invoke_GuardServer_ProcessOperationCompleted; + + private bool useDefaultCredentialsSetExplicitly; + + /// + public wsInvoke() : base() + { + Url = Settings.Default.AutoLoaderService_Base_localhost_wsInvoke; + if (IsLocalFileSystemWebService(Url) == true) + { + UseDefaultCredentials = true; + useDefaultCredentialsSetExplicitly = false; + } + else + { + useDefaultCredentialsSetExplicitly = true; + } + } + + public new string Url + { + get + { + return base.Url; + } + set + { + if (IsLocalFileSystemWebService(base.Url) == true && useDefaultCredentialsSetExplicitly == false && IsLocalFileSystemWebService(value) == false) + + { + base.UseDefaultCredentials = false; + } + base.Url = value; + } + } + + public new bool UseDefaultCredentials + { + get + { + return base.UseDefaultCredentials; + } + set + { + base.UseDefaultCredentials = value; + useDefaultCredentialsSetExplicitly = true; + } + } + + /// + public event invokeSrvCompletedEventHandler invokeSrvCompleted; + + /// + public event invokeSrv_EnableLogCompletedEventHandler invokeSrv_EnableLogCompleted; + + /// + public event invokeSrv_XmlCompletedEventHandler invokeSrv_XmlCompleted; + + /// + public event invokeSrv_Xml_SessionCompletedEventHandler invokeSrv_Xml_SessionCompleted; + + /// + public event invokeSrv_DataTableParameterCompletedEventHandler invokeSrv_DataTableParameterCompleted; + + /// + public event invokeSrv_DataTableCompletedEventHandler invokeSrv_DataTableCompleted; + + /// + public event invokeSrv_DataSetCompletedEventHandler invokeSrv_DataSetCompleted; + + /// + public event invokeSrv_SessionCompletedEventHandler invokeSrv_SessionCompleted; + + /// + public event invokeSrv_Session_jsonCompletedEventHandler invokeSrv_Session_jsonCompleted; + + /// + public event invokeSrv_iMES_jsonCompletedEventHandler invokeSrv_iMES_jsonCompleted; + + /// + public event TestCompletedEventHandler TestCompleted; + + /// + public event invoke_SignalRCompletedEventHandler invoke_SignalRCompleted; + + /// + public event invokeSrv_ModuleCompletedEventHandler invokeSrv_ModuleCompleted; + + /// + public event invokeSrv_Module_DataSetCompletedEventHandler invokeSrv_Module_DataSetCompleted; + + /// + public event InvokeSrv_PDACompletedEventHandler InvokeSrv_PDACompleted; + + /// + public event InvokeSrv_PADCompletedEventHandler InvokeSrv_PADCompleted; + + /// + public event invokeSrv_jsonCompletedEventHandler invokeSrv_jsonCompleted; + + /// + public event InvokeSrv_Json_MultiCompletedEventHandler InvokeSrv_Json_MultiCompleted; + + /// + public event invokeSrv_Session_plainjsonCompletedEventHandler invokeSrv_Session_plainjsonCompleted; + + /// + public event invokeSrv_plainjsonCompletedEventHandler invokeSrv_plainjsonCompleted; + + /// + public event Invoke_GuardServer_ProcessCompletedEventHandler Invoke_GuardServer_ProcessCompleted; + + /// + [SoapDocumentMethod("http://www.imestech.com/wsInvoke/invokeSrv", RequestNamespace = "http://www.imestech.com/wsInvoke", ResponseNamespace = "http://www.imestech.com/wsInvoke", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = SoapParameterStyle.Wrapped)] + public object invokeSrv(string method, object[] parameters) + { + object[] results = Invoke("invokeSrv", new object[] { method, parameters }); + return results[0]; + } + + /// + public IAsyncResult BegininvokeSrv(string method, object[] parameters, AsyncCallback callback, object asyncState) + { + return BeginInvoke("invokeSrv", new object[] { method, parameters }, callback, asyncState); + } + + /// + public object EndinvokeSrv(IAsyncResult asyncResult) + { + object[] results = EndInvoke(asyncResult); + return results[0]; + } + + /// + public void invokeSrvAsync(string method, object[] parameters) + { + invokeSrvAsync(method, parameters, null); + } + + /// + public void invokeSrvAsync(string method, object[] parameters, object userState) + { + if (invokeSrvOperationCompleted == null) + { + invokeSrvOperationCompleted = OninvokeSrvOperationCompleted; + } + InvokeAsync("invokeSrv", new object[] { method, parameters }, invokeSrvOperationCompleted, userState); + } + + private void OninvokeSrvOperationCompleted(object arg) + { + if (invokeSrvCompleted != null) + { + InvokeCompletedEventArgs invokeArgs = (InvokeCompletedEventArgs)arg; + invokeSrvCompleted?.Invoke(this, new invokeSrvCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [SoapDocumentMethod("http://www.imestech.com/wsInvoke/invokeSrv_EnableLog", RequestNamespace = "http://www.imestech.com/wsInvoke", ResponseNamespace = "http://www.imestech.com/wsInvoke", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = SoapParameterStyle.Wrapped)] + public object invokeSrv_EnableLog(string method, object[] parameters, bool LogOn) + { + object[] results = Invoke("invokeSrv_EnableLog", new object[] { method, parameters, LogOn }); + return results[0]; + } + + /// + public IAsyncResult BegininvokeSrv_EnableLog(string method, object[] parameters, bool LogOn, AsyncCallback callback, object asyncState) + { + return BeginInvoke("invokeSrv_EnableLog", new object[] { method, parameters, LogOn }, callback, asyncState); + } + + /// + public object EndinvokeSrv_EnableLog(IAsyncResult asyncResult) + { + object[] results = EndInvoke(asyncResult); + return results[0]; + } + + /// + public void invokeSrv_EnableLogAsync(string method, object[] parameters, bool LogOn) + { + invokeSrv_EnableLogAsync(method, parameters, LogOn, null); + } + + /// + public void invokeSrv_EnableLogAsync(string method, object[] parameters, bool LogOn, object userState) + { + if (invokeSrv_EnableLogOperationCompleted == null) + { + invokeSrv_EnableLogOperationCompleted = OninvokeSrv_EnableLogOperationCompleted; + } + InvokeAsync("invokeSrv_EnableLog", new object[] { method, parameters, LogOn }, invokeSrv_EnableLogOperationCompleted, userState); + } + + private void OninvokeSrv_EnableLogOperationCompleted(object arg) + { + if (invokeSrv_EnableLogCompleted != null) + { + InvokeCompletedEventArgs invokeArgs = (InvokeCompletedEventArgs)arg; + invokeSrv_EnableLogCompleted?.Invoke(this, new invokeSrv_EnableLogCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [SoapDocumentMethod("http://www.imestech.com/wsInvoke/invokeSrv_Xml", RequestNamespace = "http://www.imestech.com/wsInvoke", ResponseNamespace = "http://www.imestech.com/wsInvoke", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = SoapParameterStyle.Wrapped)] + public object invokeSrv_Xml(string method, string inXMl) + { + object[] results = Invoke("invokeSrv_Xml", new object[] { method, inXMl }); + return results[0]; + } + + /// + public IAsyncResult BegininvokeSrv_Xml(string method, string inXMl, AsyncCallback callback, object asyncState) + { + return BeginInvoke("invokeSrv_Xml", new object[] { method, inXMl }, callback, asyncState); + } + + /// + public object EndinvokeSrv_Xml(IAsyncResult asyncResult) + { + object[] results = EndInvoke(asyncResult); + return results[0]; + } + + /// + public void invokeSrv_XmlAsync(string method, string inXMl) + { + invokeSrv_XmlAsync(method, inXMl, null); + } + + /// + public void invokeSrv_XmlAsync(string method, string inXMl, object userState) + { + if (invokeSrv_XmlOperationCompleted == null) + { + invokeSrv_XmlOperationCompleted = OninvokeSrv_XmlOperationCompleted; + } + InvokeAsync("invokeSrv_Xml", new object[] { method, inXMl }, invokeSrv_XmlOperationCompleted, userState); + } + + private void OninvokeSrv_XmlOperationCompleted(object arg) + { + if (invokeSrv_XmlCompleted != null) + { + InvokeCompletedEventArgs invokeArgs = (InvokeCompletedEventArgs)arg; + invokeSrv_XmlCompleted?.Invoke(this, new invokeSrv_XmlCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [SoapDocumentMethod("http://www.imestech.com/wsInvoke/invokeSrv_Xml_Session", RequestNamespace = "http://www.imestech.com/wsInvoke", ResponseNamespace = "http://www.imestech.com/wsInvoke", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = SoapParameterStyle.Wrapped)] + public object invokeSrv_Xml_Session(string method, string inXMl) + { + object[] results = Invoke("invokeSrv_Xml_Session", new object[] { method, inXMl }); + return results[0]; + } + + /// + public IAsyncResult BegininvokeSrv_Xml_Session(string method, string inXMl, AsyncCallback callback, object asyncState) + { + return BeginInvoke("invokeSrv_Xml_Session", new object[] { method, inXMl }, callback, asyncState); + } + + /// + public object EndinvokeSrv_Xml_Session(IAsyncResult asyncResult) + { + object[] results = EndInvoke(asyncResult); + return results[0]; + } + + /// + public void invokeSrv_Xml_SessionAsync(string method, string inXMl) + { + invokeSrv_Xml_SessionAsync(method, inXMl, null); + } + + /// + public void invokeSrv_Xml_SessionAsync(string method, string inXMl, object userState) + { + if (invokeSrv_Xml_SessionOperationCompleted == null) + { + invokeSrv_Xml_SessionOperationCompleted = OninvokeSrv_Xml_SessionOperationCompleted; + } + InvokeAsync("invokeSrv_Xml_Session", new object[] { method, inXMl }, invokeSrv_Xml_SessionOperationCompleted, userState); + } + + private void OninvokeSrv_Xml_SessionOperationCompleted(object arg) + { + if (invokeSrv_Xml_SessionCompleted != null) + { + InvokeCompletedEventArgs invokeArgs = (InvokeCompletedEventArgs)arg; + invokeSrv_Xml_SessionCompleted?.Invoke(this, new invokeSrv_Xml_SessionCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [SoapDocumentMethod("http://www.imestech.com/wsInvoke/invokeSrv_DataTableParameter", RequestNamespace = "http://www.imestech.com/wsInvoke", ResponseNamespace = "http://www.imestech.com/wsInvoke", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = SoapParameterStyle.Wrapped)] + public object invokeSrv_DataTableParameter(string method, object[] parameters, ref DataTable pDataTable) + { + object[] results = Invoke("invokeSrv_DataTableParameter", new object[] { method, parameters, pDataTable }); + pDataTable = (DataTable)results[1]; + return results[0]; + } + + /// + public IAsyncResult BegininvokeSrv_DataTableParameter(string method, object[] parameters, DataTable pDataTable, AsyncCallback callback, object asyncState) + { + return BeginInvoke("invokeSrv_DataTableParameter", new object[] { method, parameters, pDataTable }, callback, asyncState); + } + + /// + public object EndinvokeSrv_DataTableParameter(IAsyncResult asyncResult, ref DataTable pDataTable) + { + object[] results = EndInvoke(asyncResult); + pDataTable = (DataTable)results[1]; + return results[0]; + } + + /// + public void invokeSrv_DataTableParameterAsync(string method, object[] parameters, DataTable pDataTable) + { + invokeSrv_DataTableParameterAsync(method, parameters, pDataTable, null); + } + + /// + public void invokeSrv_DataTableParameterAsync(string method, object[] parameters, DataTable pDataTable, object userState) + { + if (invokeSrv_DataTableParameterOperationCompleted == null) + { + invokeSrv_DataTableParameterOperationCompleted = OninvokeSrv_DataTableParameterOperationCompleted; + } + InvokeAsync("invokeSrv_DataTableParameter", new object[] { method, parameters, pDataTable }, invokeSrv_DataTableParameterOperationCompleted, userState); + } + + private void OninvokeSrv_DataTableParameterOperationCompleted(object arg) + { + if (invokeSrv_DataTableParameterCompleted != null) + { + InvokeCompletedEventArgs invokeArgs = (InvokeCompletedEventArgs)arg; + invokeSrv_DataTableParameterCompleted?.Invoke(this, new invokeSrv_DataTableParameterCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [SoapDocumentMethod("http://www.imestech.com/wsInvoke/invokeSrv_DataTable", RequestNamespace = "http://www.imestech.com/wsInvoke", ResponseNamespace = "http://www.imestech.com/wsInvoke", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = SoapParameterStyle.Wrapped)] + public object invokeSrv_DataTable(string method, string InXml, ref DataTable pDataTable) + { + object[] results = Invoke("invokeSrv_DataTable", new object[] { method, InXml, pDataTable }); + pDataTable = (DataTable)results[1]; + return results[0]; + } + + /// + public IAsyncResult BegininvokeSrv_DataTable(string method, string InXml, DataTable pDataTable, AsyncCallback callback, object asyncState) + { + return BeginInvoke("invokeSrv_DataTable", new object[] { method, InXml, pDataTable }, callback, asyncState); + } + + /// + public object EndinvokeSrv_DataTable(IAsyncResult asyncResult, ref DataTable pDataTable) + { + object[] results = EndInvoke(asyncResult); + pDataTable = (DataTable)results[1]; + return results[0]; + } + + /// + public void invokeSrv_DataTableAsync(string method, string InXml, DataTable pDataTable) + { + invokeSrv_DataTableAsync(method, InXml, pDataTable, null); + } + + /// + public void invokeSrv_DataTableAsync(string method, string InXml, DataTable pDataTable, object userState) + { + if (invokeSrv_DataTableOperationCompleted == null) + { + invokeSrv_DataTableOperationCompleted = OninvokeSrv_DataTableOperationCompleted; + } + InvokeAsync("invokeSrv_DataTable", new object[] { method, InXml, pDataTable }, invokeSrv_DataTableOperationCompleted, userState); + } + + private void OninvokeSrv_DataTableOperationCompleted(object arg) + { + if (invokeSrv_DataTableCompleted != null) + { + InvokeCompletedEventArgs invokeArgs = (InvokeCompletedEventArgs)arg; + invokeSrv_DataTableCompleted?.Invoke(this, new invokeSrv_DataTableCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [SoapDocumentMethod("http://www.imestech.com/wsInvoke/invokeSrv_DataSet", RequestNamespace = "http://www.imestech.com/wsInvoke", ResponseNamespace = "http://www.imestech.com/wsInvoke", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = SoapParameterStyle.Wrapped)] + public object invokeSrv_DataSet(string method, string InXml, ref DataSet pDataSet) + { + object[] results = Invoke("invokeSrv_DataSet", new object[] { method, InXml, pDataSet }); + pDataSet = (DataSet)results[1]; + return results[0]; + } + + /// + public IAsyncResult BegininvokeSrv_DataSet(string method, string InXml, DataSet pDataSet, AsyncCallback callback, object asyncState) + { + return BeginInvoke("invokeSrv_DataSet", new object[] { method, InXml, pDataSet }, callback, asyncState); + } + + /// + public object EndinvokeSrv_DataSet(IAsyncResult asyncResult, ref DataSet pDataSet) + { + object[] results = EndInvoke(asyncResult); + pDataSet = (DataSet)results[1]; + return results[0]; + } + + /// + public void invokeSrv_DataSetAsync(string method, string InXml, DataSet pDataSet) + { + invokeSrv_DataSetAsync(method, InXml, pDataSet, null); + } + + /// + public void invokeSrv_DataSetAsync(string method, string InXml, DataSet pDataSet, object userState) + { + if (invokeSrv_DataSetOperationCompleted == null) + { + invokeSrv_DataSetOperationCompleted = OninvokeSrv_DataSetOperationCompleted; + } + InvokeAsync("invokeSrv_DataSet", new object[] { method, InXml, pDataSet }, invokeSrv_DataSetOperationCompleted, userState); + } + + private void OninvokeSrv_DataSetOperationCompleted(object arg) + { + if (invokeSrv_DataSetCompleted != null) + { + InvokeCompletedEventArgs invokeArgs = (InvokeCompletedEventArgs)arg; + invokeSrv_DataSetCompleted?.Invoke(this, new invokeSrv_DataSetCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [SoapDocumentMethod("http://www.imestech.com/wsInvoke/invokeSrv_Session", RequestNamespace = "http://www.imestech.com/wsInvoke", ResponseNamespace = "http://www.imestech.com/wsInvoke", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = SoapParameterStyle.Wrapped)] + public object invokeSrv_Session(string method, object[] parameters) + { + object[] results = Invoke("invokeSrv_Session", new object[] { method, parameters }); + return results[0]; + } + + /// + public IAsyncResult BegininvokeSrv_Session(string method, object[] parameters, AsyncCallback callback, object asyncState) + { + return BeginInvoke("invokeSrv_Session", new object[] { method, parameters }, callback, asyncState); + } + + /// + public object EndinvokeSrv_Session(IAsyncResult asyncResult) + { + object[] results = EndInvoke(asyncResult); + return results[0]; + } + + /// + public void invokeSrv_SessionAsync(string method, object[] parameters) + { + invokeSrv_SessionAsync(method, parameters, null); + } + + /// + public void invokeSrv_SessionAsync(string method, object[] parameters, object userState) + { + if (invokeSrv_SessionOperationCompleted == null) + { + invokeSrv_SessionOperationCompleted = OninvokeSrv_SessionOperationCompleted; + } + InvokeAsync("invokeSrv_Session", new object[] { method, parameters }, invokeSrv_SessionOperationCompleted, userState); + } + + private void OninvokeSrv_SessionOperationCompleted(object arg) + { + if (invokeSrv_SessionCompleted != null) + { + InvokeCompletedEventArgs invokeArgs = (InvokeCompletedEventArgs)arg; + invokeSrv_SessionCompleted?.Invoke(this, new invokeSrv_SessionCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [SoapDocumentMethod("http://www.imestech.com/wsInvoke/invokeSrv_Session_json", RequestNamespace = "http://www.imestech.com/wsInvoke", ResponseNamespace = "http://www.imestech.com/wsInvoke", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = SoapParameterStyle.Wrapped)] + public string invokeSrv_Session_json(string metadata, string parameter) + { + object[] results = Invoke("invokeSrv_Session_json", new object[] { metadata, parameter }); + return Conversions.ToString(results[0]); + } + + /// + public IAsyncResult BegininvokeSrv_Session_json(string metadata, string parameter, AsyncCallback callback, object asyncState) + { + return BeginInvoke("invokeSrv_Session_json", new object[] { metadata, parameter }, callback, asyncState); + } + + /// + public string EndinvokeSrv_Session_json(IAsyncResult asyncResult) + { + object[] results = EndInvoke(asyncResult); + return Conversions.ToString(results[0]); + } + + /// + public void invokeSrv_Session_jsonAsync(string metadata, string parameter) + { + invokeSrv_Session_jsonAsync(metadata, parameter, null); + } + + /// + public void invokeSrv_Session_jsonAsync(string metadata, string parameter, object userState) + { + if (invokeSrv_Session_jsonOperationCompleted == null) + { + invokeSrv_Session_jsonOperationCompleted = OninvokeSrv_Session_jsonOperationCompleted; + } + InvokeAsync("invokeSrv_Session_json", new object[] { metadata, parameter }, invokeSrv_Session_jsonOperationCompleted, userState); + } + + private void OninvokeSrv_Session_jsonOperationCompleted(object arg) + { + if (invokeSrv_Session_jsonCompleted != null) + { + InvokeCompletedEventArgs invokeArgs = (InvokeCompletedEventArgs)arg; + invokeSrv_Session_jsonCompleted?.Invoke(this, new invokeSrv_Session_jsonCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [SoapDocumentMethod("http://www.imestech.com/wsInvoke/invokeSrv_iMES_json", RequestNamespace = "http://www.imestech.com/wsInvoke", ResponseNamespace = "http://www.imestech.com/wsInvoke", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = SoapParameterStyle.Wrapped)] + public string invokeSrv_iMES_json(string uri, string content) + { + object[] results = Invoke("invokeSrv_iMES_json", new object[] { uri, content }); + return Conversions.ToString(results[0]); + } + + /// + public IAsyncResult BegininvokeSrv_iMES_json(string uri, string content, AsyncCallback callback, object asyncState) + { + return BeginInvoke("invokeSrv_iMES_json", new object[] { uri, content }, callback, asyncState); + } + + /// + public string EndinvokeSrv_iMES_json(IAsyncResult asyncResult) + { + object[] results = EndInvoke(asyncResult); + return Conversions.ToString(results[0]); + } + + /// + public void invokeSrv_iMES_jsonAsync(string uri, string content) + { + invokeSrv_iMES_jsonAsync(uri, content, null); + } + + /// + public void invokeSrv_iMES_jsonAsync(string uri, string content, object userState) + { + if (invokeSrv_iMES_jsonOperationCompleted == null) + { + invokeSrv_iMES_jsonOperationCompleted = OninvokeSrv_iMES_jsonOperationCompleted; + } + InvokeAsync("invokeSrv_iMES_json", new object[] { uri, content }, invokeSrv_iMES_jsonOperationCompleted, userState); + } + + private void OninvokeSrv_iMES_jsonOperationCompleted(object arg) + { + if (invokeSrv_iMES_jsonCompleted != null) + { + InvokeCompletedEventArgs invokeArgs = (InvokeCompletedEventArgs)arg; + invokeSrv_iMES_jsonCompleted?.Invoke(this, new invokeSrv_iMES_jsonCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [SoapDocumentMethod("http://www.imestech.com/wsInvoke/Test", RequestNamespace = "http://www.imestech.com/wsInvoke", ResponseNamespace = "http://www.imestech.com/wsInvoke", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = SoapParameterStyle.Wrapped)] + public string Test(string UserNo) + { + object[] results = Invoke("Test", new object[] { UserNo }); + return Conversions.ToString(results[0]); + } + + /// + public IAsyncResult BeginTest(string UserNo, AsyncCallback callback, object asyncState) + { + return BeginInvoke("Test", new object[] { UserNo }, callback, asyncState); + } + + /// + public string EndTest(IAsyncResult asyncResult) + { + object[] results = EndInvoke(asyncResult); + return Conversions.ToString(results[0]); + } + + /// + public void TestAsync(string UserNo) + { + TestAsync(UserNo, null); + } + + /// + public void TestAsync(string UserNo, object userState) + { + if (TestOperationCompleted == null) + { + TestOperationCompleted = OnTestOperationCompleted; + } + InvokeAsync("Test", new object[] { UserNo }, TestOperationCompleted, userState); + } + + private void OnTestOperationCompleted(object arg) + { + if (TestCompleted != null) + { + InvokeCompletedEventArgs invokeArgs = (InvokeCompletedEventArgs)arg; + TestCompleted?.Invoke(this, new TestCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [SoapDocumentMethod("http://www.imestech.com/wsInvoke/invoke_SignalR", RequestNamespace = "http://www.imestech.com/wsInvoke", ResponseNamespace = "http://www.imestech.com/wsInvoke", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = SoapParameterStyle.Wrapped)] + public object invoke_SignalR(string mseContent) + { + object[] results = Invoke("invoke_SignalR", new object[] { mseContent }); + return results[0]; + } + + /// + public IAsyncResult Begininvoke_SignalR(string mseContent, AsyncCallback callback, object asyncState) + { + return BeginInvoke("invoke_SignalR", new object[] { mseContent }, callback, asyncState); + } + + /// + public object Endinvoke_SignalR(IAsyncResult asyncResult) + { + object[] results = EndInvoke(asyncResult); + return results[0]; + } + + /// + public void invoke_SignalRAsync(string mseContent) + { + invoke_SignalRAsync(mseContent, null); + } + + /// + public void invoke_SignalRAsync(string mseContent, object userState) + { + if (invoke_SignalROperationCompleted == null) + { + invoke_SignalROperationCompleted = Oninvoke_SignalROperationCompleted; + } + InvokeAsync("invoke_SignalR", new object[] { mseContent }, invoke_SignalROperationCompleted, userState); + } + + private void Oninvoke_SignalROperationCompleted(object arg) + { + if (invoke_SignalRCompleted != null) + { + InvokeCompletedEventArgs invokeArgs = (InvokeCompletedEventArgs)arg; + invoke_SignalRCompleted?.Invoke(this, new invoke_SignalRCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [SoapDocumentMethod("http://www.imestech.com/wsInvoke/invokeSrv_Module", RequestNamespace = "http://www.imestech.com/wsInvoke", ResponseNamespace = "http://www.imestech.com/wsInvoke", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = SoapParameterStyle.Wrapped)] + public object invokeSrv_Module(string method, ref object[] parameters, object pInvokeType, string[] pLogKeyFields, bool blnLogOn) + { + object[] results = Invoke("invokeSrv_Module", new object[] { method, parameters, pInvokeType, pLogKeyFields, blnLogOn }); + parameters = (object[])results[1]; + return results[0]; + } + + /// + public IAsyncResult BegininvokeSrv_Module(string method, object[] parameters, object pInvokeType, string[] pLogKeyFields, bool blnLogOn, AsyncCallback callback, object asyncState) + { + return BeginInvoke("invokeSrv_Module", new object[] { method, parameters, pInvokeType, pLogKeyFields, blnLogOn }, callback, asyncState); + } + + /// + public object EndinvokeSrv_Module(IAsyncResult asyncResult, ref object[] parameters) + { + object[] results = EndInvoke(asyncResult); + parameters = (object[])results[1]; + return results[0]; + } + + /// + public void invokeSrv_ModuleAsync(string method, object[] parameters, object pInvokeType, string[] pLogKeyFields, bool blnLogOn) + { + invokeSrv_ModuleAsync(method, parameters, pInvokeType, pLogKeyFields, blnLogOn, null); + } + + /// + public void invokeSrv_ModuleAsync(string method, object[] parameters, object pInvokeType, string[] pLogKeyFields, bool blnLogOn, object userState) + { + if (invokeSrv_ModuleOperationCompleted == null) + { + invokeSrv_ModuleOperationCompleted = OninvokeSrv_ModuleOperationCompleted; + } + InvokeAsync("invokeSrv_Module", new object[] { method, parameters, pInvokeType, pLogKeyFields, blnLogOn }, invokeSrv_ModuleOperationCompleted, userState); + } + + private void OninvokeSrv_ModuleOperationCompleted(object arg) + { + if (invokeSrv_ModuleCompleted != null) + { + InvokeCompletedEventArgs invokeArgs = (InvokeCompletedEventArgs)arg; + invokeSrv_ModuleCompleted?.Invoke(this, new invokeSrv_ModuleCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [SoapDocumentMethod("http://www.imestech.com/wsInvoke/invokeSrv_Module_DataSet", RequestNamespace = "http://www.imestech.com/wsInvoke", ResponseNamespace = "http://www.imestech.com/wsInvoke", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = SoapParameterStyle.Wrapped)] + public object invokeSrv_Module_DataSet(string method, ref object[] parameters, object pInvokeType, string[] pLogKeyFields, bool blnLogOn, ref DataSet pDataSet) + { + object[] results = Invoke("invokeSrv_Module_DataSet", new object[] { method, parameters, pInvokeType, pLogKeyFields, blnLogOn, pDataSet }); + parameters = (object[])results[1]; + pDataSet = (DataSet)results[2]; + return results[0]; + } + + /// + public IAsyncResult BegininvokeSrv_Module_DataSet(string method, object[] parameters, object pInvokeType, string[] pLogKeyFields, bool blnLogOn, DataSet pDataSet, AsyncCallback callback, object asyncState) + { + return BeginInvoke("invokeSrv_Module_DataSet", new object[] { method, parameters, pInvokeType, pLogKeyFields, blnLogOn, pDataSet }, callback, asyncState); + } + + /// + public object EndinvokeSrv_Module_DataSet(IAsyncResult asyncResult, ref object[] parameters, ref DataSet pDataSet) + { + object[] results = EndInvoke(asyncResult); + parameters = (object[])results[1]; + pDataSet = (DataSet)results[2]; + return results[0]; + } + + /// + public void invokeSrv_Module_DataSetAsync(string method, object[] parameters, object pInvokeType, string[] pLogKeyFields, bool blnLogOn, DataSet pDataSet) + { + invokeSrv_Module_DataSetAsync(method, parameters, pInvokeType, pLogKeyFields, blnLogOn, pDataSet, null); + } + + /// + public void invokeSrv_Module_DataSetAsync(string method, object[] parameters, object pInvokeType, string[] pLogKeyFields, bool blnLogOn, DataSet pDataSet, object userState) + { + if (invokeSrv_Module_DataSetOperationCompleted == null) + { + invokeSrv_Module_DataSetOperationCompleted = OninvokeSrv_Module_DataSetOperationCompleted; + } + InvokeAsync("invokeSrv_Module_DataSet", new object[] { method, parameters, pInvokeType, pLogKeyFields, blnLogOn, pDataSet }, invokeSrv_Module_DataSetOperationCompleted, userState); + } + + private void OninvokeSrv_Module_DataSetOperationCompleted(object arg) + { + if (invokeSrv_Module_DataSetCompleted != null) + { + InvokeCompletedEventArgs invokeArgs = (InvokeCompletedEventArgs)arg; + invokeSrv_Module_DataSetCompleted?.Invoke(this, new invokeSrv_Module_DataSetCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [SoapDocumentMethod("http://www.imestech.com/wsInvoke/InvokeSrv_PDA", RequestNamespace = "http://www.imestech.com/wsInvoke", ResponseNamespace = "http://www.imestech.com/wsInvoke", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = SoapParameterStyle.Wrapped)] + public string InvokeSrv_PDA(string uri, string content) + { + object[] results = Invoke("InvokeSrv_PDA", new object[] { uri, content }); + return Conversions.ToString(results[0]); + } + + /// + public IAsyncResult BeginInvokeSrv_PDA(string uri, string content, AsyncCallback callback, object asyncState) + { + return BeginInvoke("InvokeSrv_PDA", new object[] { uri, content }, callback, asyncState); + } + + /// + public string EndInvokeSrv_PDA(IAsyncResult asyncResult) + { + object[] results = EndInvoke(asyncResult); + return Conversions.ToString(results[0]); + } + + /// + public void InvokeSrv_PDAAsync(string uri, string content) + { + InvokeSrv_PDAAsync(uri, content, null); + } + + /// + public void InvokeSrv_PDAAsync(string uri, string content, object userState) + { + if (InvokeSrv_PDAOperationCompleted == null) + { + InvokeSrv_PDAOperationCompleted = OnInvokeSrv_PDAOperationCompleted; + } + InvokeAsync("InvokeSrv_PDA", new object[] { uri, content }, InvokeSrv_PDAOperationCompleted, userState); + } + + private void OnInvokeSrv_PDAOperationCompleted(object arg) + { + if (InvokeSrv_PDACompleted != null) + { + InvokeCompletedEventArgs invokeArgs = (InvokeCompletedEventArgs)arg; + InvokeSrv_PDACompleted?.Invoke(this, new InvokeSrv_PDACompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [SoapDocumentMethod("http://www.imestech.com/wsInvoke/InvokeSrv_PAD", RequestNamespace = "http://www.imestech.com/wsInvoke", ResponseNamespace = "http://www.imestech.com/wsInvoke", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = SoapParameterStyle.Wrapped)] + public string InvokeSrv_PAD(string uri, string content) + { + object[] results = Invoke("InvokeSrv_PAD", new object[] { uri, content }); + return Conversions.ToString(results[0]); + } + + /// + public IAsyncResult BeginInvokeSrv_PAD(string uri, string content, AsyncCallback callback, object asyncState) + { + return BeginInvoke("InvokeSrv_PAD", new object[] { uri, content }, callback, asyncState); + } + + /// + public string EndInvokeSrv_PAD(IAsyncResult asyncResult) + { + object[] results = EndInvoke(asyncResult); + return Conversions.ToString(results[0]); + } + + /// + public void InvokeSrv_PADAsync(string uri, string content) + { + InvokeSrv_PADAsync(uri, content, null); + } + + /// + public void InvokeSrv_PADAsync(string uri, string content, object userState) + { + if (InvokeSrv_PADOperationCompleted == null) + { + InvokeSrv_PADOperationCompleted = OnInvokeSrv_PADOperationCompleted; + } + InvokeAsync("InvokeSrv_PAD", new object[] { uri, content }, InvokeSrv_PADOperationCompleted, userState); + } + + private void OnInvokeSrv_PADOperationCompleted(object arg) + { + if (InvokeSrv_PADCompleted != null) + { + InvokeCompletedEventArgs invokeArgs = (InvokeCompletedEventArgs)arg; + InvokeSrv_PADCompleted?.Invoke(this, new InvokeSrv_PADCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [SoapDocumentMethod("http://www.imestech.com/wsInvoke/invokeSrv_json", RequestNamespace = "http://www.imestech.com/wsInvoke", ResponseNamespace = "http://www.imestech.com/wsInvoke", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = SoapParameterStyle.Wrapped)] + public string invokeSrv_json(string uri, string content) + { + object[] results = Invoke("invokeSrv_json", new object[] { uri, content }); + return Conversions.ToString(results[0]); + } + + /// + public IAsyncResult BegininvokeSrv_json(string uri, string content, AsyncCallback callback, object asyncState) + { + return BeginInvoke("invokeSrv_json", new object[] { uri, content }, callback, asyncState); + } + + /// + public string EndinvokeSrv_json(IAsyncResult asyncResult) + { + object[] results = EndInvoke(asyncResult); + return Conversions.ToString(results[0]); + } + + /// + public void invokeSrv_jsonAsync(string uri, string content) + { + invokeSrv_jsonAsync(uri, content, null); + } + + /// + public void invokeSrv_jsonAsync(string uri, string content, object userState) + { + if (invokeSrv_jsonOperationCompleted == null) + { + invokeSrv_jsonOperationCompleted = OninvokeSrv_jsonOperationCompleted; + } + InvokeAsync("invokeSrv_json", new object[] { uri, content }, invokeSrv_jsonOperationCompleted, userState); + } + + private void OninvokeSrv_jsonOperationCompleted(object arg) + { + if (invokeSrv_jsonCompleted != null) + { + InvokeCompletedEventArgs invokeArgs = (InvokeCompletedEventArgs)arg; + invokeSrv_jsonCompleted?.Invoke(this, new invokeSrv_jsonCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [SoapDocumentMethod("http://www.imestech.com/wsInvoke/InvokeSrv_Json_Multi", RequestNamespace = "http://www.imestech.com/wsInvoke", ResponseNamespace = "http://www.imestech.com/wsInvoke", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = SoapParameterStyle.Wrapped)] + public string InvokeSrv_Json_Multi(string uri, string content) + { + object[] results = Invoke("InvokeSrv_Json_Multi", new object[] { uri, content }); + return Conversions.ToString(results[0]); + } + + /// + public IAsyncResult BeginInvokeSrv_Json_Multi(string uri, string content, AsyncCallback callback, object asyncState) + { + return BeginInvoke("InvokeSrv_Json_Multi", new object[] { uri, content }, callback, asyncState); + } + + /// + public string EndInvokeSrv_Json_Multi(IAsyncResult asyncResult) + { + object[] results = EndInvoke(asyncResult); + return Conversions.ToString(results[0]); + } + + /// + public void InvokeSrv_Json_MultiAsync(string uri, string content) + { + InvokeSrv_Json_MultiAsync(uri, content, null); + } + + /// + public void InvokeSrv_Json_MultiAsync(string uri, string content, object userState) + { + if (InvokeSrv_Json_MultiOperationCompleted == null) + { + InvokeSrv_Json_MultiOperationCompleted = OnInvokeSrv_Json_MultiOperationCompleted; + } + InvokeAsync("InvokeSrv_Json_Multi", new object[] { uri, content }, InvokeSrv_Json_MultiOperationCompleted, userState); + } + + private void OnInvokeSrv_Json_MultiOperationCompleted(object arg) + { + if (InvokeSrv_Json_MultiCompleted != null) + { + InvokeCompletedEventArgs invokeArgs = (InvokeCompletedEventArgs)arg; + InvokeSrv_Json_MultiCompleted?.Invoke(this, new InvokeSrv_Json_MultiCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [SoapDocumentMethod("http://www.imestech.com/wsInvoke/invokeSrv_Session_plainjson", RequestNamespace = "http://www.imestech.com/wsInvoke", ResponseNamespace = "http://www.imestech.com/wsInvoke", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = SoapParameterStyle.Wrapped)] + public string invokeSrv_Session_plainjson(string uri, string content) + { + object[] results = Invoke("invokeSrv_Session_plainjson", new object[] { uri, content }); + return Conversions.ToString(results[0]); + } + + /// + public IAsyncResult BegininvokeSrv_Session_plainjson(string uri, string content, AsyncCallback callback, object asyncState) + { + return BeginInvoke("invokeSrv_Session_plainjson", new object[] { uri, content }, callback, asyncState); + } + + /// + public string EndinvokeSrv_Session_plainjson(IAsyncResult asyncResult) + { + object[] results = EndInvoke(asyncResult); + return Conversions.ToString(results[0]); + } + + /// + public void invokeSrv_Session_plainjsonAsync(string uri, string content) + { + invokeSrv_Session_plainjsonAsync(uri, content, null); + } + + /// + public void invokeSrv_Session_plainjsonAsync(string uri, string content, object userState) + { + if (invokeSrv_Session_plainjsonOperationCompleted == null) + { + invokeSrv_Session_plainjsonOperationCompleted = OninvokeSrv_Session_plainjsonOperationCompleted; + } + InvokeAsync("invokeSrv_Session_plainjson", new object[] { uri, content }, invokeSrv_Session_plainjsonOperationCompleted, userState); + } + + private void OninvokeSrv_Session_plainjsonOperationCompleted(object arg) + { + if (invokeSrv_Session_plainjsonCompleted != null) + { + InvokeCompletedEventArgs invokeArgs = (InvokeCompletedEventArgs)arg; + invokeSrv_Session_plainjsonCompleted?.Invoke(this, new invokeSrv_Session_plainjsonCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [SoapDocumentMethod("http://www.imestech.com/wsInvoke/invokeSrv_plainjson", RequestNamespace = "http://www.imestech.com/wsInvoke", ResponseNamespace = "http://www.imestech.com/wsInvoke", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = SoapParameterStyle.Wrapped)] + public string invokeSrv_plainjson(string uri, string content) + { + object[] results = Invoke("invokeSrv_plainjson", new object[] { uri, content }); + return Conversions.ToString(results[0]); + } + + /// + public IAsyncResult BegininvokeSrv_plainjson(string uri, string content, AsyncCallback callback, object asyncState) + { + return BeginInvoke("invokeSrv_plainjson", new object[] { uri, content }, callback, asyncState); + } + + /// + public string EndinvokeSrv_plainjson(IAsyncResult asyncResult) + { + object[] results = EndInvoke(asyncResult); + return Conversions.ToString(results[0]); + } + + /// + public void invokeSrv_plainjsonAsync(string uri, string content) + { + invokeSrv_plainjsonAsync(uri, content, null); + } + + /// + public void invokeSrv_plainjsonAsync(string uri, string content, object userState) + { + if (invokeSrv_plainjsonOperationCompleted == null) + { + invokeSrv_plainjsonOperationCompleted = OninvokeSrv_plainjsonOperationCompleted; + } + InvokeAsync("invokeSrv_plainjson", new object[] { uri, content }, invokeSrv_plainjsonOperationCompleted, userState); + } + + private void OninvokeSrv_plainjsonOperationCompleted(object arg) + { + if (invokeSrv_plainjsonCompleted != null) + { + InvokeCompletedEventArgs invokeArgs = (InvokeCompletedEventArgs)arg; + invokeSrv_plainjsonCompleted?.Invoke(this, new invokeSrv_plainjsonCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [SoapDocumentMethod("http://www.imestech.com/wsInvoke/Invoke_GuardServer_Process", RequestNamespace = "http://www.imestech.com/wsInvoke", ResponseNamespace = "http://www.imestech.com/wsInvoke", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = SoapParameterStyle.Wrapped)] + public object Invoke_GuardServer_Process() + { + object[] results = Invoke("Invoke_GuardServer_Process", new object[0]); + return results[0]; + } + + /// + public IAsyncResult BeginInvoke_GuardServer_Process(AsyncCallback callback, object asyncState) + { + return BeginInvoke("Invoke_GuardServer_Process", new object[0], callback, asyncState); + } + + /// + public object EndInvoke_GuardServer_Process(IAsyncResult asyncResult) + { + object[] results = EndInvoke(asyncResult); + return results[0]; + } + + /// + public void Invoke_GuardServer_ProcessAsync() + { + Invoke_GuardServer_ProcessAsync(null); + } + + /// + public void Invoke_GuardServer_ProcessAsync(object userState) + { + if (Invoke_GuardServer_ProcessOperationCompleted == null) + { + Invoke_GuardServer_ProcessOperationCompleted = OnInvoke_GuardServer_ProcessOperationCompleted; + } + InvokeAsync("Invoke_GuardServer_Process", new object[0], Invoke_GuardServer_ProcessOperationCompleted, userState); + } + + private void OnInvoke_GuardServer_ProcessOperationCompleted(object arg) + { + if (Invoke_GuardServer_ProcessCompleted != null) + { + InvokeCompletedEventArgs invokeArgs = (InvokeCompletedEventArgs)arg; + Invoke_GuardServer_ProcessCompleted?.Invoke(this, new Invoke_GuardServer_ProcessCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + public new void CancelAsync(object userState) + { + base.CancelAsync(userState); + } + + private bool IsLocalFileSystemWebService(string url) + { + if (url == null || ReferenceEquals(url, string.Empty)) + { + return false; + } + var wsUri = new Uri(url); + if (wsUri.Port >= 1024 && string.Compare(wsUri.Host, "localHost", StringComparison.OrdinalIgnoreCase) == 0) + { + return true; + } + return false; + } + } + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.4084.0")] + public delegate void invokeSrvCompletedEventHandler(object sender, invokeSrvCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.4084.0")] + [DebuggerStepThrough()] + [DesignerCategory("code")] + public partial class invokeSrvCompletedEventArgs : AsyncCompletedEventArgs + { + + private object[] results; + + internal invokeSrvCompletedEventArgs(object[] results, Exception exception, bool cancelled, object userState) : base(exception, cancelled, userState) + { + this.results = results; + } + + /// + public object Result + { + get + { + RaiseExceptionIfNecessary(); + return results[0]; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.4084.0")] + public delegate void invokeSrv_EnableLogCompletedEventHandler(object sender, invokeSrv_EnableLogCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.4084.0")] + [DebuggerStepThrough()] + [DesignerCategory("code")] + public partial class invokeSrv_EnableLogCompletedEventArgs : AsyncCompletedEventArgs + { + + private object[] results; + + internal invokeSrv_EnableLogCompletedEventArgs(object[] results, Exception exception, bool cancelled, object userState) : base(exception, cancelled, userState) + { + this.results = results; + } + + /// + public object Result + { + get + { + RaiseExceptionIfNecessary(); + return results[0]; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.4084.0")] + public delegate void invokeSrv_XmlCompletedEventHandler(object sender, invokeSrv_XmlCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.4084.0")] + [DebuggerStepThrough()] + [DesignerCategory("code")] + public partial class invokeSrv_XmlCompletedEventArgs : AsyncCompletedEventArgs + { + + private object[] results; + + internal invokeSrv_XmlCompletedEventArgs(object[] results, Exception exception, bool cancelled, object userState) : base(exception, cancelled, userState) + { + this.results = results; + } + + /// + public object Result + { + get + { + RaiseExceptionIfNecessary(); + return results[0]; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.4084.0")] + public delegate void invokeSrv_Xml_SessionCompletedEventHandler(object sender, invokeSrv_Xml_SessionCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.4084.0")] + [DebuggerStepThrough()] + [DesignerCategory("code")] + public partial class invokeSrv_Xml_SessionCompletedEventArgs : AsyncCompletedEventArgs + { + + private object[] results; + + internal invokeSrv_Xml_SessionCompletedEventArgs(object[] results, Exception exception, bool cancelled, object userState) : base(exception, cancelled, userState) + { + this.results = results; + } + + /// + public object Result + { + get + { + RaiseExceptionIfNecessary(); + return results[0]; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.4084.0")] + public delegate void invokeSrv_DataTableParameterCompletedEventHandler(object sender, invokeSrv_DataTableParameterCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.4084.0")] + [DebuggerStepThrough()] + [DesignerCategory("code")] + public partial class invokeSrv_DataTableParameterCompletedEventArgs : AsyncCompletedEventArgs + { + + private object[] results; + + internal invokeSrv_DataTableParameterCompletedEventArgs(object[] results, Exception exception, bool cancelled, object userState) : base(exception, cancelled, userState) + { + this.results = results; + } + + /// + public object Result + { + get + { + RaiseExceptionIfNecessary(); + return results[0]; + } + } + + /// + public DataTable pDataTable + { + get + { + RaiseExceptionIfNecessary(); + return (DataTable)results[1]; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.4084.0")] + public delegate void invokeSrv_DataTableCompletedEventHandler(object sender, invokeSrv_DataTableCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.4084.0")] + [DebuggerStepThrough()] + [DesignerCategory("code")] + public partial class invokeSrv_DataTableCompletedEventArgs : AsyncCompletedEventArgs + { + + private object[] results; + + internal invokeSrv_DataTableCompletedEventArgs(object[] results, Exception exception, bool cancelled, object userState) : base(exception, cancelled, userState) + { + this.results = results; + } + + /// + public object Result + { + get + { + RaiseExceptionIfNecessary(); + return results[0]; + } + } + + /// + public DataTable pDataTable + { + get + { + RaiseExceptionIfNecessary(); + return (DataTable)results[1]; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.4084.0")] + public delegate void invokeSrv_DataSetCompletedEventHandler(object sender, invokeSrv_DataSetCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.4084.0")] + [DebuggerStepThrough()] + [DesignerCategory("code")] + public partial class invokeSrv_DataSetCompletedEventArgs : AsyncCompletedEventArgs + { + + private object[] results; + + internal invokeSrv_DataSetCompletedEventArgs(object[] results, Exception exception, bool cancelled, object userState) : base(exception, cancelled, userState) + { + this.results = results; + } + + /// + public object Result + { + get + { + RaiseExceptionIfNecessary(); + return results[0]; + } + } + + /// + public DataSet pDataSet + { + get + { + RaiseExceptionIfNecessary(); + return (DataSet)results[1]; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.4084.0")] + public delegate void invokeSrv_SessionCompletedEventHandler(object sender, invokeSrv_SessionCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.4084.0")] + [DebuggerStepThrough()] + [DesignerCategory("code")] + public partial class invokeSrv_SessionCompletedEventArgs : AsyncCompletedEventArgs + { + + private object[] results; + + internal invokeSrv_SessionCompletedEventArgs(object[] results, Exception exception, bool cancelled, object userState) : base(exception, cancelled, userState) + { + this.results = results; + } + + /// + public object Result + { + get + { + RaiseExceptionIfNecessary(); + return results[0]; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.4084.0")] + public delegate void invokeSrv_Session_jsonCompletedEventHandler(object sender, invokeSrv_Session_jsonCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.4084.0")] + [DebuggerStepThrough()] + [DesignerCategory("code")] + public partial class invokeSrv_Session_jsonCompletedEventArgs : AsyncCompletedEventArgs + { + + private object[] results; + + internal invokeSrv_Session_jsonCompletedEventArgs(object[] results, Exception exception, bool cancelled, object userState) : base(exception, cancelled, userState) + { + this.results = results; + } + + /// + public string Result + { + get + { + RaiseExceptionIfNecessary(); + return Conversions.ToString(results[0]); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.4084.0")] + public delegate void invokeSrv_iMES_jsonCompletedEventHandler(object sender, invokeSrv_iMES_jsonCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.4084.0")] + [DebuggerStepThrough()] + [DesignerCategory("code")] + public partial class invokeSrv_iMES_jsonCompletedEventArgs : AsyncCompletedEventArgs + { + + private object[] results; + + internal invokeSrv_iMES_jsonCompletedEventArgs(object[] results, Exception exception, bool cancelled, object userState) : base(exception, cancelled, userState) + { + this.results = results; + } + + /// + public string Result + { + get + { + RaiseExceptionIfNecessary(); + return Conversions.ToString(results[0]); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.4084.0")] + public delegate void TestCompletedEventHandler(object sender, TestCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.4084.0")] + [DebuggerStepThrough()] + [DesignerCategory("code")] + public partial class TestCompletedEventArgs : AsyncCompletedEventArgs + { + + private object[] results; + + internal TestCompletedEventArgs(object[] results, Exception exception, bool cancelled, object userState) : base(exception, cancelled, userState) + { + this.results = results; + } + + /// + public string Result + { + get + { + RaiseExceptionIfNecessary(); + return Conversions.ToString(results[0]); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.4084.0")] + public delegate void invoke_SignalRCompletedEventHandler(object sender, invoke_SignalRCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.4084.0")] + [DebuggerStepThrough()] + [DesignerCategory("code")] + public partial class invoke_SignalRCompletedEventArgs : AsyncCompletedEventArgs + { + + private object[] results; + + internal invoke_SignalRCompletedEventArgs(object[] results, Exception exception, bool cancelled, object userState) : base(exception, cancelled, userState) + { + this.results = results; + } + + /// + public object Result + { + get + { + RaiseExceptionIfNecessary(); + return results[0]; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.4084.0")] + public delegate void invokeSrv_ModuleCompletedEventHandler(object sender, invokeSrv_ModuleCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.4084.0")] + [DebuggerStepThrough()] + [DesignerCategory("code")] + public partial class invokeSrv_ModuleCompletedEventArgs : AsyncCompletedEventArgs + { + + private object[] results; + + internal invokeSrv_ModuleCompletedEventArgs(object[] results, Exception exception, bool cancelled, object userState) : base(exception, cancelled, userState) + { + this.results = results; + } + + /// + public object Result + { + get + { + RaiseExceptionIfNecessary(); + return results[0]; + } + } + + /// + public object[] parameters + { + get + { + RaiseExceptionIfNecessary(); + return (object[])results[1]; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.4084.0")] + public delegate void invokeSrv_Module_DataSetCompletedEventHandler(object sender, invokeSrv_Module_DataSetCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.4084.0")] + [DebuggerStepThrough()] + [DesignerCategory("code")] + public partial class invokeSrv_Module_DataSetCompletedEventArgs : AsyncCompletedEventArgs + { + + private object[] results; + + internal invokeSrv_Module_DataSetCompletedEventArgs(object[] results, Exception exception, bool cancelled, object userState) : base(exception, cancelled, userState) + { + this.results = results; + } + + /// + public object Result + { + get + { + RaiseExceptionIfNecessary(); + return results[0]; + } + } + + /// + public object[] parameters + { + get + { + RaiseExceptionIfNecessary(); + return (object[])results[1]; + } + } + + /// + public DataSet pDataSet + { + get + { + RaiseExceptionIfNecessary(); + return (DataSet)results[2]; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.4084.0")] + public delegate void InvokeSrv_PDACompletedEventHandler(object sender, InvokeSrv_PDACompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.4084.0")] + [DebuggerStepThrough()] + [DesignerCategory("code")] + public partial class InvokeSrv_PDACompletedEventArgs : AsyncCompletedEventArgs + { + + private object[] results; + + internal InvokeSrv_PDACompletedEventArgs(object[] results, Exception exception, bool cancelled, object userState) : base(exception, cancelled, userState) + { + this.results = results; + } + + /// + public string Result + { + get + { + RaiseExceptionIfNecessary(); + return Conversions.ToString(results[0]); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.4084.0")] + public delegate void InvokeSrv_PADCompletedEventHandler(object sender, InvokeSrv_PADCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.4084.0")] + [DebuggerStepThrough()] + [DesignerCategory("code")] + public partial class InvokeSrv_PADCompletedEventArgs : AsyncCompletedEventArgs + { + + private object[] results; + + internal InvokeSrv_PADCompletedEventArgs(object[] results, Exception exception, bool cancelled, object userState) : base(exception, cancelled, userState) + { + this.results = results; + } + + /// + public string Result + { + get + { + RaiseExceptionIfNecessary(); + return Conversions.ToString(results[0]); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.4084.0")] + public delegate void invokeSrv_jsonCompletedEventHandler(object sender, invokeSrv_jsonCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.4084.0")] + [DebuggerStepThrough()] + [DesignerCategory("code")] + public partial class invokeSrv_jsonCompletedEventArgs : AsyncCompletedEventArgs + { + + private object[] results; + + internal invokeSrv_jsonCompletedEventArgs(object[] results, Exception exception, bool cancelled, object userState) : base(exception, cancelled, userState) + { + this.results = results; + } + + /// + public string Result + { + get + { + RaiseExceptionIfNecessary(); + return Conversions.ToString(results[0]); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.4084.0")] + public delegate void InvokeSrv_Json_MultiCompletedEventHandler(object sender, InvokeSrv_Json_MultiCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.4084.0")] + [DebuggerStepThrough()] + [DesignerCategory("code")] + public partial class InvokeSrv_Json_MultiCompletedEventArgs : AsyncCompletedEventArgs + { + + private object[] results; + + internal InvokeSrv_Json_MultiCompletedEventArgs(object[] results, Exception exception, bool cancelled, object userState) : base(exception, cancelled, userState) + { + this.results = results; + } + + /// + public string Result + { + get + { + RaiseExceptionIfNecessary(); + return Conversions.ToString(results[0]); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.4084.0")] + public delegate void invokeSrv_Session_plainjsonCompletedEventHandler(object sender, invokeSrv_Session_plainjsonCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.4084.0")] + [DebuggerStepThrough()] + [DesignerCategory("code")] + public partial class invokeSrv_Session_plainjsonCompletedEventArgs : AsyncCompletedEventArgs + { + + private object[] results; + + internal invokeSrv_Session_plainjsonCompletedEventArgs(object[] results, Exception exception, bool cancelled, object userState) : base(exception, cancelled, userState) + { + this.results = results; + } + + /// + public string Result + { + get + { + RaiseExceptionIfNecessary(); + return Conversions.ToString(results[0]); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.4084.0")] + public delegate void invokeSrv_plainjsonCompletedEventHandler(object sender, invokeSrv_plainjsonCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.4084.0")] + [DebuggerStepThrough()] + [DesignerCategory("code")] + public partial class invokeSrv_plainjsonCompletedEventArgs : AsyncCompletedEventArgs + { + + private object[] results; + + internal invokeSrv_plainjsonCompletedEventArgs(object[] results, Exception exception, bool cancelled, object userState) : base(exception, cancelled, userState) + { + this.results = results; + } + + /// + public string Result + { + get + { + RaiseExceptionIfNecessary(); + return Conversions.ToString(results[0]); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.4084.0")] + public delegate void Invoke_GuardServer_ProcessCompletedEventHandler(object sender, Invoke_GuardServer_ProcessCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCode("System.Web.Services", "4.8.4084.0")] + [DebuggerStepThrough()] + [DesignerCategory("code")] + public partial class Invoke_GuardServer_ProcessCompletedEventArgs : AsyncCompletedEventArgs + { + + private object[] results; + + internal Invoke_GuardServer_ProcessCompletedEventArgs(object[] results, Exception exception, bool cancelled, object userState) : base(exception, cancelled, userState) + { + this.results = results; + } + + /// + public object Result + { + get + { + RaiseExceptionIfNecessary(); + return results[0]; + } + } + } +} \ No newline at end of file diff --git a/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/Web References/localhost/Reference.map b/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/Web References/localhost/Reference.map new file mode 100644 index 0000000..3c088c5 --- /dev/null +++ b/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/Web References/localhost/Reference.map @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/Web References/localhost/wsInvoke.disco b/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/Web References/localhost/wsInvoke.disco new file mode 100644 index 0000000..71e3958 --- /dev/null +++ b/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/Web References/localhost/wsInvoke.disco @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/Web References/localhost/wsInvoke.wsdl b/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/Web References/localhost/wsInvoke.wsdl new file mode 100644 index 0000000..eeab104 --- /dev/null +++ b/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/Web References/localhost/wsInvoke.wsdl @@ -0,0 +1,1023 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Invoke with objects and Return XML + + + + + Invoke with objects and Return XML, And Enable Performance Log + + + + + Invoke with Xml String and Return XML + + + + + EnableSession, Invoke with Xml String and Return XML + + + + + Invoke with DataTable and Object Return XML + + + + + Invoke with DataTable and Return XML + + + + + Invoke with DataSet and Return XML + + + + + EnableSession, Invoke and Return XML + + + + + EnableSession, Invoke Web Service Resolved json + + + + + Invoke Web Service Resolved json + + + + + Web service and database connection test + + + + + Call SignalR, Invoke and Return XML + + + + + Invoke Module with InXml + + + + + Invoke Module with InXml and DataSet Parameter + + + + + Invoke Web Service Resolved json , Available for PDA + + + + + Invoke Web Service Resolved json , Available for PAD + + + + + Invoke Web Service Resolved json + + + + + Invoke any library , Available for PAD , Method allows multiple ',' to separate + + + + + EnableSession, Invoke Web Service Resolved json + + + + + Invoke Web Service Resolved json + + + + + return hysical directory + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/app.config b/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/app.config new file mode 100644 index 0000000..4d62146 --- /dev/null +++ b/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/app.config @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/modAutoLoader.cs b/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/modAutoLoader.cs new file mode 100644 index 0000000..53a8c54 --- /dev/null +++ b/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/modAutoLoader.cs @@ -0,0 +1,457 @@ +using System; +using System.Diagnostics; +using System.IO; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using Microsoft.VisualBasic; +using Microsoft.VisualBasic.CompilerServices; +using iMESCore.Settings; +using static iMESCore.DataBase.iMESSql; +using static iMESCore.Base.iMESComXML; + +namespace AutoLoaderService_Base +{ + + static class modAutoLoader + { + + private static AppSettings objSetting = new AppSettings(); + + public const int defInteger = -999; // 宣告整數使用的常數,用以辨識參數是否有傳入Function中。 + public const string defString = "Null"; // 宣告字串使用的常數,用以辨識參數是否有傳入Function中。 + public static DateTime defDateTime = DateTime.Parse("1900-12-31"); // 宣告日期使用的常數,用以辨識參數是否有傳入Function中。 + + static string GetConnectionString_ConnectionString() + { + var argstrDataBaseType = "Null"; + return objSetting.GetConnectionString(strDataBaseType: argstrDataBaseType); + } + + public static string ConnectionString = GetConnectionString_ConnectionString(); + + + public static void funProcessJob(object State) + { + + SomeStateType strJob = (SomeStateType)State; + string strJobExecutionFile = strJob.strJobExecutionFile; // 來源DLL + string strJobNo = strJob.strJobNo; + string strJobName = strJob.strCommandName; + string strSourcePath = strJob.strSourcePath; // 來源路徑 + string strDestinationPath = strJob.strDestinationPath; // 目的路徑 + string strQueuePath = strJob.strQueuePath; // Queue + string strFailPath = strJob.strFailPath; // Fail + string strLogFilePath = strJob.strLogFilePath; + long lngSplitFileSize = 10485760L; + long lbgSplitRecordsLimit = 5000L; + string strJobFunction = strJob.strJobFunction; + string strParameter1 = strJob.strParameter1; // 輸入參數1 + string strParameter2 = strJob.strParameter2; // 輸入參數2 + string strParameter3 = strJob.strParameter3; // 輸入參數3 + string strParameter4 = strJob.strParameter4; // 輸入參數4 + string strParameter5 = strJob.strParameter5; // 輸入參數5 + string strParameter6 = strJob.strParameter6; // 輸入參數5 + string strParameter7 = strJob.strParameter7; // 輸入參數5 + string strParameter8 = strJob.strParameter8; // 輸入參數5 + string strParameter9 = strJob.strParameter9; // 輸入參數5 + string strParameter10 = strJob.strParameter10; // 輸入參數5 + + var StartTime = DateTime.Now; + string strStatus = "Fail"; // 回傳狀況先設定為Fail + string strReturnMsg = string.Empty; + string strMemo = ""; + string errorCode = "0000-999999"; + + // 2019/12/10 yenru, 建立AutoLoader Base 可動態呼叫行業包AutoLoader特定DLL + + // Dim objAutoRun As New AutoLoaderLib.clsAutoLoaderLibrary + + try + { + + var colParameters = new Collection(); + + colParameters.Add(strJobNo, "JobNo"); + colParameters.Add(strSourcePath, "SourcePath"); + colParameters.Add(strDestinationPath, "DestinationPath"); + colParameters.Add(strQueuePath, "QueuePath"); + colParameters.Add(strFailPath, "FailPath"); + colParameters.Add(lngSplitFileSize, "SplitFileSize"); + colParameters.Add(lbgSplitRecordsLimit, "SplitRecordsLimit"); + colParameters.Add(strJobName, "JobName"); + colParameters.Add(strJobFunction, "JobFunction"); + colParameters.Add(strParameter1, "Parameter1"); + colParameters.Add(strParameter2, "Parameter2"); + colParameters.Add(strParameter3, "Parameter3"); + colParameters.Add(strParameter4, "Parameter4"); + colParameters.Add(strParameter5, "Parameter5"); + colParameters.Add(strParameter6, "Parameter6"); + colParameters.Add(strParameter7, "Parameter7"); + colParameters.Add(strParameter8, "Parameter8"); + colParameters.Add(strParameter9, "Parameter9"); + colParameters.Add(strParameter10, "Parameter10"); + + // strReturnMsg = objAutoRun.ExecuteFunction(strJobName, colParameters) + string strBasePath = AppDomain.CurrentDomain.BaseDirectory; + string strFilePath = strBasePath + "/" + strJobExecutionFile + ".dll"; + + // Dll CreateInstance + var mainAssembly = System.Reflection.Assembly.LoadFrom(strFilePath); + var objBRClass = new object(); + + object objArgs = new object[] { strJobName, colParameters }; + + objBRClass = mainAssembly.CreateInstance(strJobExecutionFile + ".clsAutoLoaderLibrary"); + strReturnMsg = objBRClass.GetType().InvokeMember("ExecuteFunction", System.Reflection.BindingFlags.InvokeMethod, null, objBRClass, (object[])objArgs).ToString(); + } + + catch (Exception ex) + { + // // Error Message + strReturnMsg = ex.Message; + strMemo = "funProcessJob Error : " + ex.Message; + } + finally + { + // //Return Fail + if (strReturnMsg != "success") + { + modWIN.WriteLog("JobNo:"+ strJobNo + "fail"+ strMemo, iMESLog.iMESLogLevel.Trace); + // 取得ErrorCode + if (strReturnMsg.Substring(0, 10) == "ErrorCode:") + { + strReturnMsg = strReturnMsg.Remove(0, 10); // 移除"ErrorCode:" + string[] temp = Strings.Split(strReturnMsg, ";"); + if (temp[0].Length == 11) + { + errorCode = temp[0]; + } + } + + // Job完成後的後續動作: + // 刪除已經執行完畢之工作 (最先做, 減少執行完畢而未刪的情形) + // 註記最後執行時間 + // 增加log + string computerNameTmp = System.Windows.Forms.SystemInformation.ComputerName; + funEndProcessJob(strJobNo, strStatus, CInput(ref strReturnMsg), + CInput(ref computerNameTmp), StartTime, DateTime.Now, + Convert.ToInt32(DateAndTime.DateDiff(DateInterval.Second, StartTime, DateTime.Now)), + strMemo, errorCode, "AutoLoader"); + + // //發生錯誤將Log記錄下來 + // Call objAutoRun.AddErrorLog("MESAutoLoader", "AutoLoader", "JobNo(JobName)", strJobNo & "(" & strJobName & ")", , strReturnMsg, My.Computer.Name) + // //將Error Log存入檔案 + // WriteLogFile(strLogFilePath, "[" + Strings.Format(DateTime.Now, "yyyy/MM/dd HH:mm:ss") + "]" + strReturnMsg + Constants.vbCrLf); + } + + } + + } + /// + /// 執行Job完成後的後續動作 + /// + private static int funEndProcessJob(string JobNo, string Status = defString, string ReturnMsg = defString, string ServerName = defString, DateTime StartTime = default(DateTime), DateTime EndTime = default(DateTime), int RunTime = defInteger, string Memo = defString, string ErrorCode = "0000-999999", string LogClass = defString) + { + int funEndProcessJobRet = default(int); + // 刪除已經執行完畢之工作 (最先做, 減少執行完畢而未刪的情形) + // 註記最後執行時間 + // 增加log + + funEndProcessJobRet = -1; + + // //Web Service相關變數 + var XmlDoc = new System.Xml.XmlDocument(); + string InXml, OutXml, strIdentity, strParameter; + + try + { + + // 將傳入參數組成XML字串 + // 定義Identity + string argSendTime = Conversions.ToString(DateTime.Now); + strIdentity = modWIN.CombineXMLIdentity(ref modWIN.gComputerName, ref modWIN.gUserNo, ref argSendTime); + + // 定義Parameter + strParameter = string.Empty; + string argvalue_name = "jobno"; + string argname = "JobNo"; + string argtype = "String"; + string argdesc = ""; + strParameter = modWIN.CombineXMLParameter(ref argvalue_name, ref argname, ref argtype, ref JobNo, ref argdesc); + if ((Status ?? "") != defString) + { + string argvalue_name1 = "status"; + string argname1 = "Status"; + string argtype1 = "String"; + string argdesc1 = ""; + strParameter += modWIN.CombineXMLParameter(ref argvalue_name1, ref argname1, ref argtype1, ref Status, ref argdesc1); + } + if ((ReturnMsg ?? "") != defString) + { + string argvalue_name2 = "returnmsg"; + string argname2 = "ReturnMsg"; + string argtype2 = "String"; + string argdesc2 = ""; + strParameter += modWIN.CombineXMLParameter(ref argvalue_name2, ref argname2, ref argtype2, ref ReturnMsg, ref argdesc2); + } + if ((ServerName ?? "") != defString) + { + string argvalue_name3 = "servername"; + string argname3 = "ServerName"; + string argtype3 = "String"; + string argdesc3 = ""; + strParameter += modWIN.CombineXMLParameter(ref argvalue_name3, ref argname3, ref argtype3, ref ServerName, ref argdesc3); + } + if (StartTime != defDateTime) + { + string argvalue_name4 = "starttime"; + string argname4 = "StartTime"; + string argtype4 = "DateTime"; + string argvalue = Strings.Format(StartTime, "yyyy/MM/dd HH:mm:ss"); + string argdesc4 = ""; + strParameter += modWIN.CombineXMLParameter(ref argvalue_name4, ref argname4, ref argtype4, ref argvalue, ref argdesc4); + } // 2016-11-09, Joe, Format日期格式 + if (EndTime != defDateTime) + { + string argvalue_name5 = "endtime"; + string argname5 = "EndTime"; + string argtype5 = "DateTime"; + string argvalue1 = Strings.Format(EndTime, "yyyy/MM/dd HH:mm:ss"); + string argdesc5 = ""; + strParameter += modWIN.CombineXMLParameter(ref argvalue_name5, ref argname5, ref argtype5, ref argvalue1, ref argdesc5); + } // 2016-11-09, Joe, Format日期格式 + if (RunTime != defInteger) + { + string argvalue_name6 = "runtime"; + string argname6 = "RunTime"; + string argtype6 = "Integer"; + string argvalue2 = RunTime.ToString(); + string argdesc6 = ""; + strParameter += modWIN.CombineXMLParameter(ref argvalue_name6, ref argname6, ref argtype6, ref argvalue2, ref argdesc6); + RunTime = Conversions.ToInteger(argvalue2); + } + if ((Memo ?? "") != defString) + { + string argvalue_name7 = "memo"; + string argname7 = "Memo"; + string argtype7 = "String"; + string argdesc7 = ""; + strParameter += modWIN.CombineXMLParameter(ref argvalue_name7, ref argname7, ref argtype7, ref Memo, ref argdesc7); + } + if ((LogClass ?? "") != defString) + { + string argvalue_name8 = "logclass"; + string argname8 = "LogClass"; + string argtype8 = "String"; + string argdesc8 = ""; + strParameter += modWIN.CombineXMLParameter(ref argvalue_name8, ref argname8, ref argtype8, ref LogClass, ref argdesc8); + } + string argvalue_name9 = "errorcode"; + string argname9 = "ErrorCode"; + string argtype9 = "String"; + string argdesc9 = ""; + strParameter += modWIN.CombineXMLParameter(ref argvalue_name9, ref argname9, ref argtype9, ref ErrorCode, ref argdesc9); + + // request XML字串 + InXml = modWIN.CombineXMLRequest(ref strIdentity, ref strParameter); + + OutXml = InvokeSrv("wsAUT.funEndProcessJob_ErrorCode", InXml); + + XmlDoc.LoadXml(OutXml); + if (!modWIN.chkExecutionSuccess(ref XmlDoc)) + { + throw new Exception(modWIN.GetExceptionSysMsg(ref XmlDoc) + '\r' + modWIN.GetExceptionMesMsg(ref XmlDoc)); + } + + funEndProcessJobRet = 0; + } + + catch (Exception e1) + { + // funWriteTxtFile("funEndProcessJob (JobNo : " & JobNo & ") Error : " & e1.Message) + // funWriteToAnEventLog("funEndProcessJob (JobNo : " & JobNo & ") Error : " & e1.Message, EventLogEntryType.Error, 9000) + } + + return funEndProcessJobRet; + + } + /// + /// 叫用Web Service, 並回傳Response XML + /// + /// 要呼叫哪一個WebService的方法, ex: wsWIP.LoadLotBasis + /// InXml + /// 是否客製的WebService + /// + public static string InvokeSrv(string Method, string InXml, bool Customize = false) + { + + object result; + + try + { + + using (var ws = new AutoLoaderLib_Base.wsInvoke.wsInvoke()) + { + ws.Url = modWIN.LocalizeWebService(ws.Url.ToString()); + ws.EnableDecompression = true; + result = ws.invokeSrv(Method, new object[] { InXml }); + } + } + + catch (Exception ex) + { + throw; + } + + return Conversions.ToString(result); + + } + + public static void funInitProcess(object State) + { + + string strReturnMsg = string.Empty; + // Dim objAutoRun As New AutoLoaderLib.clsAutoLoaderLibrary + + try + { + // // + var colParameters = new Collection(); + colParameters.Add(Environment.MachineName, "ComputerName"); + } + // //Init Binning + // strReturnMsg = objAutoRun.ExecuteFunction("funInitBinning", colParameters) + + catch (Exception ex) + { + // // Error Message + strReturnMsg = ex.Message; + } + + finally + { + // // Release Object + // objAutoRun = Nothing + + } + + } + + + public class SomeStateType + { + + public string strJobExecutionFile; + public string strJobNo; + public string strCommandName; + public string strSourcePath; + public string strDestinationPath; + public string strQueuePath; + public string strFailPath; + public string strLogFilePath; + public long SplitFileSize; + public long SplitRecordsLimit; + public string strJobName; + public string strJobFunction; + public string strParameter1; + public string strParameter2; + public string strParameter3; + public string strParameter4; + public string strParameter5; + public string strParameter6; + public string strParameter7; + public string strParameter8; + public string strParameter9; + public string strParameter10; + + + public void SomeState(string strJE, string strJN, string strCN, string strSP, string strDP, string strQP, string strFP, string strLF, long lngSplitFileSize, long lngSplitRecordsLimit, string str_JobName, string strJob_Function, string strPara1, string strPara2, string strPara3, string strPara4, string strPara5, string strPara6, string strPara7, string strPara8, string strPara9, string strPara10) + { + + strJobExecutionFile = strJE; + strJobNo = strJN; + strCommandName = strCN; + strSourcePath = strSP; + strDestinationPath = strDP; + strQueuePath = strQP; + strFailPath = strFP; + strLogFilePath = strLF; + SplitFileSize = lngSplitFileSize; + SplitRecordsLimit = lngSplitRecordsLimit; + strJobName = str_JobName; + strJobFunction = strJob_Function; + strParameter1 = strPara1; + strParameter2 = strPara2; + strParameter3 = strPara3; + strParameter4 = strPara4; + strParameter5 = strPara5; + strParameter6 = strPara6; + strParameter7 = strPara7; + strParameter8 = strPara8; + strParameter9 = strPara9; + strParameter10 = strPara10; + + } + + } + + public static bool PrevInstance() + { + + if (Information.UBound(Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName)) > 0) + { + return true; + } + else + { + return false; + } + + } + + + public static string CInput(ref string strInput) + { + string CInputRet = default(string); + // 將傳入值內的單引號轉換為可存入資料庫的格式 + // 2. 將傳入值內的 &, >, < 三個特殊字元轉換為XmlDocument可解譯之代替符號 + // 傳入值: strInput包含特殊字元的字串 + // 傳回值: 將特殊字元變更為代替符號的字串 + + // 轉換 ' 為 '' (單引號轉為兩個單引號) + CInputRet = Strings.Replace(strInput, "'", "''"); + + // 轉換 & 為 & + CInputRet = Strings.Replace(CInputRet, "&", "&"); + + // CInput = Replace(CInput, """", "''") 'AddFlow的Xml字串不可將雙引號轉為兩個單引號,XMLToFlow會Error + + // 轉換 > 為 > + CInputRet = Strings.Replace(CInputRet, ">", ">"); + + // 轉換 < 為 < + CInputRet = Strings.Replace(CInputRet, "<", "<"); + return CInputRet; + + } + + public static void WriteLogFile(string dir, string WriteTxt) + { + try + { + string path = Path.Combine(dir, Strings.Format(DateTime.Now, "yyyyMMdd").ToString() + ".log"); + if (!string.IsNullOrEmpty(dir) && !Directory.Exists(dir)) + Directory.CreateDirectory(dir); + + using (StreamWriter sw = new StreamWriter(path, true)) + { + sw.WriteLine(WriteTxt); + } + } + catch (Exception ex2) + { + + } + } + } +} \ No newline at end of file diff --git a/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/modWIN.cs b/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/modWIN.cs new file mode 100644 index 0000000..9a9f249 --- /dev/null +++ b/SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/modWIN.cs @@ -0,0 +1,473 @@ +using System; +using System.Collections; +using static System.Configuration.ConfigurationSettings; +using System.Data; +using System.Runtime.InteropServices; +using Microsoft.VisualBasic; +using Microsoft.VisualBasic.CompilerServices; +using System.Diagnostics; + +namespace AutoLoaderService_Base +{ + + static class modWIN + { + // ReviseDate : 2003/08/07,修改處理AdditionalXML + // ReviseDate : 2003/08/05,新增Public gReturnArray + // ReviseDate : 2003/07/01,更改AddFlow產生的Error(CInput) + // ReviseDate : 2002/11/04,新增CUnInput function + + public static string gComputerName = Environment.MachineName; + public static string gReturnKeyValue; + public static string gUserNo = "AutoLoader"; + public static string gUserName; + public static string gUserLevel; + public static string gLanguageMode; + public static string gAppPath; + // **Add for Smart Client Architecture + public static string gMESWebServiceHost; + public static string gCUSWebServiceHost; + public static bool gEnableSSL = Convert.ToBoolean(GetAppSettings("EnableSSL")); + + // Add By Peter 2005/6/20 + public static string gSettingMode = ""; + + public static DataRow drSearch; + + public static ArrayList gReturnArray = new ArrayList(); + + public const int defInteger = -999; // 宣告整數使用的常數,用以辨識參數是否有傳入Function中。 + public const string defString = "Null"; // 宣告字串使用的常數,用以辨識參數是否有傳入Function中。 + public static DateTime defDateTime = DateTime.Parse("1900-12-31"); // 宣告日期使用的常數,用以辨識參數是否有傳入Function中。 + + public const string strAddTagLabel = "extrabase"; // Add by py for Combine Addition XML doc + public const string strAddTagName = "ExtraBase"; // Add by py for Combine Addition XML doc + + public static bool chkExecutionSuccess(ref System.Xml.XmlDocument Xmldoc) + { + bool chkExecutionSuccessRet = default(bool); + if (Xmldoc.DocumentElement["result"].InnerXml == "success") + { + chkExecutionSuccessRet = true; + } + else + { + chkExecutionSuccessRet = false; + } + + return chkExecutionSuccessRet; + } + + public static string GetExceptionSysMsg(ref System.Xml.XmlDocument Xmldoc) + { + string GetExceptionSysMsgRet = default(string); + string argstrInput = Xmldoc.DocumentElement.GetElementsByTagName("sysmsg").Item(0).InnerXml; + GetExceptionSysMsgRet = CUnInput(ref argstrInput); + Xmldoc.DocumentElement.GetElementsByTagName("sysmsg").Item(0).InnerXml = argstrInput; + return GetExceptionSysMsgRet; + } + + public static string GetExceptionMesMsg(ref System.Xml.XmlDocument Xmldoc) + { + string GetExceptionMesMsgRet = default(string); + string argstrInput = Xmldoc.DocumentElement.GetElementsByTagName("mesmsg").Item(0).InnerXml; + GetExceptionMesMsgRet = CUnInput(ref argstrInput); + Xmldoc.DocumentElement.GetElementsByTagName("mesmsg").Item(0).InnerXml = argstrInput; + return GetExceptionMesMsgRet; + } + + public static string CombineXMLIdentity(ref string ComputerName, ref string CurUserNo, ref string SendTime) + { + string CombineXMLIdentityRet = default(string); + CombineXMLIdentityRet = "" + ComputerName + "" + "" + CurUserNo + "" + "" + SendTime + ""; + + return CombineXMLIdentityRet; + } + + public static string CombineXMLParameter(ref string value_name, ref string name, ref string type, ref string value, ref string desc) + { + string CombineXMLParameterRet = default(string); + CombineXMLParameterRet = "<" + value_name.ToLower() + ">" + "" + name + "" + "" + type + "" + "" + value + "" + "" + desc + "" + ""; + + + + + return CombineXMLParameterRet; + } + + public static string CombineXMLRequest(ref string strIdentity, ref string strParameter) + { + string CombineXMLRequestRet = default(string); + CombineXMLRequestRet = "" + "" + strIdentity + ""; + if (!string.IsNullOrEmpty(strParameter)) + { + CombineXMLRequestRet = CombineXMLRequestRet + "" + strParameter + ""; + } + CombineXMLRequestRet = CombineXMLRequestRet + ""; + return CombineXMLRequestRet; + } + + public static string CombineXMLValue(ref string TagName, ref string Value) + { + string CombineXMLValueRet = default(string); + CombineXMLValueRet = "<" + TagName + ">" + Value + ""; + return CombineXMLValueRet; + } + + public static string CombineXMLValueTag(ref string Value) + { + string CombineXMLValueTagRet = default(string); + CombineXMLValueTagRet = "" + Value + ""; + return CombineXMLValueTagRet; + } + + public static string CombineXMLParameterMultiValue(ref string value_name, ref string name, ref string type, ref string value, ref string desc) + { + string CombineXMLParameterMultiValueRet = default(string); + // Value不用加上Tag + CombineXMLParameterMultiValueRet = "<" + value_name.ToLower() + ">" + "" + name + "" + "" + type + "" + value + "" + desc + "" + ""; + + + + return CombineXMLParameterMultiValueRet; + } + + public static int FindRecordPosition(ref DataView dvData, ref string strColumnName, ref string strFindValue) + { + int FindRecordPositionRet = default(int); + // //由Dataview的第一筆開始尋找符合的資料直到最後一筆 + // //傳出資料在資料表內的Index + int i; + bool Found; // //紀錄是否找到符合資料 + string strDataType; // //尋找資料欄的資料型態 + + try + { + if (!string.IsNullOrEmpty(strFindValue)) // 是否有傳入尋找的條件 + { + Found = false; + strDataType = dvData.Table.Columns[strColumnName].DataType.ToString(); + if (strDataType == "System.DateTime") // 日期型態的資料比對 + { + var loopTo = dvData.Count; + for (i = 0; i <= loopTo; i++) + { + if (Conversions.ToBoolean(Operators.ConditionalCompareObjectGreaterEqual(dvData[i][strColumnName], "#" + Strings.Format(Conversions.ToDate(strFindValue), "yyyy/MM/dd") + "#", false))) + { + Found = true; + break; + } + } + } + else // 字串,數值資料型態的比對 + { + var loopTo1 = dvData.Count; + for (i = 0; i <= loopTo1; i++) + { + if ((Strings.UCase(dvData[i][strColumnName].ToString()) ?? "") == (Strings.UCase(strFindValue) ?? "")) + { + Found = true; + break; + } + } + } + if (Found == true) + { + FindRecordPositionRet = i; // 找到符合資料,傳出所在的RowIndex + } + else + { + FindRecordPositionRet = -1; + } // 沒有符合資料 + } + } + catch + { + FindRecordPositionRet = -1; + } // 沒有符合資料 + + return FindRecordPositionRet; + + // //使用Dataview的Find Method,日期無法使用 + // dvData.Sort = strColumnName + // FindRecordPosition = dvData.Find(strFindValue) + + } + + + public static string PasswordEncoding(ref string Password) + { + string PasswordEncodingRet = default(string); + // 此 Function 將傳入值加以編碼後傳出,編碼後長度不變 + // 傳入值: 密碼 + // 傳回值: 編碼後密碼 + + // Vernam密碼是由Gilbert Vernam在1918年發明的 + string g_Key = "xNDFz6LH67LOv7xKbWFpbMu1wejrM7SzvV4tLRvq3X47m708O1xMHLoaMNCqGhoaEN"; + string strChar, iCryptChar, strEncrypted = default(string); + int i, iKeyChar, iStringChar; + + var loopTo = Strings.Len(Password); + for (i = 1; i <= loopTo; i++) + { + iKeyChar = Strings.Asc(Strings.Mid(g_Key, i, 1)); + iStringChar = Strings.Asc(Strings.Mid(Password, i, 1)); + iCryptChar = (iKeyChar ^ iStringChar).ToString(); + strEncrypted = strEncrypted + Strings.Chr(Conversions.ToInteger(iCryptChar)); + } + + PasswordEncodingRet = Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes(strEncrypted)); + return PasswordEncodingRet; + + } + + public static string FilterByString(ref string strFilter, ref string strColumnName, ref string strColumnValue) + { + string FilterByStringRet = default(string); + // 對字串欄位做篩選 + if (string.IsNullOrEmpty(strFilter)) + { + strFilter = strColumnName + " = '" + Strings.Replace(strColumnValue, "'", "''") + "'"; + } + else + { + strFilter = strFilter + " And " + strColumnName + " = '" + Strings.Replace(strColumnValue, "'", "''") + "'"; + } + FilterByStringRet = strFilter; + return FilterByStringRet; + } + + + public static string FilterByInteger(ref string strFilter, ref string strColumnName, ref int strColumnValue) + { + string FilterByIntegerRet = default(string); + // 對數值欄位做篩選 + if (string.IsNullOrEmpty(strFilter)) + { + strFilter = strColumnName + " = " + strColumnValue; + } + else + { + strFilter = strFilter + " And " + strColumnName + " = " + strColumnValue; + } + FilterByIntegerRet = strFilter; + return FilterByIntegerRet; + } + + public static string FilterByDate(ref string strFilter, ref string strColumnName, ref DateTime datFromDate, ref DateTime datEndDate) + { + string FilterByDateRet = default(string); + // 對日期欄位做篩選 + if (string.IsNullOrEmpty(strFilter)) + { + strFilter = strColumnName + " >= #" + Strings.Format(Conversions.ToDate(datFromDate), "yyyy/MM/dd 00:00:00") + "# And " + strColumnName + " <= #" + Strings.Format(Conversions.ToDate(datEndDate), "yyyy/MM/dd 23:59:59") + "# "; + } + else + { + strFilter = strFilter + " And " + strColumnName + " >= #" + Strings.Format(Conversions.ToDate(datFromDate), "yyyy/MM/dd 00:00:00") + "# And " + strColumnName + " <= #" + Strings.Format(Conversions.ToDate(datEndDate), "yyyy/MM/dd 23:59:59") + "# "; + } + FilterByDateRet = strFilter; + return FilterByDateRet; + } + + public static bool IsBoolean(ref string strBoolean, string strBooleanValue = defString) + { + bool IsBooleanRet = default(bool); + // 此 Function 檢查傳入值是否為Boolean值 + // 傳入值: strBoolean欲檢查是否為Boolean值的字串 + // strBooleanValue將檢查值轉換為True或False的統一字串 + // 傳回值: True是Boolean值 ; False不是Boolean值 + + IsBooleanRet = false; + + if (string.IsNullOrEmpty(strBoolean)) + { + IsBooleanRet = false; + } + else if (Strings.Trim(Strings.UCase(strBoolean)) != "Y" & Strings.Trim(Strings.UCase(strBoolean)) != "N" & Strings.Trim(Strings.UCase(strBoolean)) != "T" & Strings.Trim(Strings.UCase(strBoolean)) != "F" & Strings.Trim(Strings.UCase(strBoolean)) != "YES" & Strings.Trim(Strings.UCase(strBoolean)) != "NO" & Strings.Trim(Strings.UCase(strBoolean)) != "TRUE" & Strings.Trim(Strings.UCase(strBoolean)) != "FALSE" & Strings.Trim(Strings.UCase(strBoolean)) != "是" & Strings.Trim(Strings.UCase(strBoolean)) != "否" & Strings.Trim(Strings.UCase(strBoolean)) != "ON" & Strings.Trim(Strings.UCase(strBoolean)) != "OFF") + + + + + { + + IsBooleanRet = false; + } + + else if (Strings.Trim(Strings.UCase(strBoolean)) == "Y" | Strings.Trim(Strings.UCase(strBoolean)) == "T" | Strings.Trim(Strings.UCase(strBoolean)) == "YES" | Strings.Trim(Strings.UCase(strBoolean)) == "TRUE" | Strings.Trim(Strings.UCase(strBoolean)) == "是" | Strings.Trim(Strings.UCase(strBoolean)) == "ON") + + { + IsBooleanRet = true; + strBooleanValue = "True"; + } + else + { + IsBooleanRet = true; + strBooleanValue = "False"; + } + + return IsBooleanRet; + } + + + public static string CInput(ref string strInput) + { + string CInputRet = default(string); + // 將傳入值內的單引號轉換為可存入資料庫的格式 + // 2. 將傳入值內的 &, >, < 三個特殊字元轉換為XmlDocument可解譯之代替符號 + // 傳入值: strInput包含特殊字元的字串 + // 傳回值: 將特殊字元變更為代替符號的字串 + + // 轉換 ' 為 '' (單引號轉為兩個單引號) + CInputRet = Strings.Replace(strInput, "'", "''"); + + // 轉換 & 為 & + CInputRet = Strings.Replace(CInputRet, "&", "&"); + + // CInput = Replace(CInput, """", "''") 'AddFlow的Xml字串不可將雙引號轉為兩個單引號,XMLToFlow會Error + + // 轉換 > 為 > + CInputRet = Strings.Replace(CInputRet, ">", ">"); + + // 轉換 < 為 < + CInputRet = Strings.Replace(CInputRet, "<", "<"); + return CInputRet; + + } + + public static string CUnInput(ref string strInput) + { + string CUnInputRet = default(string); + // 將傳入值內的單引號轉換為可存入資料庫的格式 + // 傳入值: strInput包含特殊字元的字串 + // 傳回值: 將代替符號變更為特殊字元的字串 + + // 轉換 ' 為 '' (單引號轉為兩個單引號) + // CUnInput = Replace(strInput, "'", "''") + CUnInputRet = Strings.Replace(strInput, "\"", "'"); + + // 轉換 & 為 & + CUnInputRet = Strings.Replace(CUnInputRet, "&", "&"); + + // 轉換 > 為 > + CUnInputRet = Strings.Replace(CUnInputRet, ">", ">"); + + // 轉換 < 為 < + CUnInputRet = Strings.Replace(CUnInputRet, "<", "<"); + return CUnInputRet; + + } + + + // ***Add by PY 2003/07/31**** + public static string CombineXMLAdditional(ref string strAdditional) + { + string CombineXMLAdditionalRet = default(string); + CombineXMLAdditionalRet = "" + strAdditional; + CombineXMLAdditionalRet = CombineXMLAdditionalRet + ""; + return CombineXMLAdditionalRet; + } + + public static string CombineAddXML_Add(ref string name, ref string type, ref string value) + { + string CombineAddXML_AddRet = default(string); + CombineAddXML_AddRet = "" + "" + name + "" + "" + type + "" + "" + value + "" + ""; + + + + return CombineAddXML_AddRet; + } + public static string CombineAddXML_Edit(ref string name, ref string type, ref string value) + { + string CombineAddXML_EditRet = default(string); + CombineAddXML_EditRet = "" + "" + name + "" + "" + type + "" + "" + value + "" + ""; + + + + return CombineAddXML_EditRet; + } + public static string CombineAddXML_Field(ref string name) + { + string CombineAddXML_FieldRet = default(string); + CombineAddXML_FieldRet = "" + "" + name + "" + ""; + + return CombineAddXML_FieldRet; + } + + public static string CombineAddXML_Condition(string condition) + { + string CombineAddXML_ConditionRet = default(string); + CombineAddXML_ConditionRet = "" + Strings.Replace(condition, "''", "'") + ""; + return CombineAddXML_ConditionRet; + } + + // **Add by py 2003/12/04 + public static string LocalizeWebService(string wsUrl) + { + string strAppBase = AppDomain.CurrentDomain.BaseDirectory; + string[] tmpString; + int i; + tmpString = wsUrl.Split('/'); + // Modify By Peter 2005/06/21 << automatic change ws url for all cases + // If Mid(strAppBase, 1, 4) = "http" And Trim(gMESWebServiceHost) <> "" Then + if (!string.IsNullOrEmpty(Strings.Trim(gMESWebServiceHost))) + { + // Return wsUrl.Replace("//localhost/", "//" + gMESWebServiceHost + "/") + if (tmpString.Length > 2) + { + wsUrl = "http://" + gMESWebServiceHost + "/" + tmpString[tmpString.Length - 2].ToString() + "/" + tmpString[tmpString.Length - 1].ToString(); + } + } + if (gEnableSSL) + { + wsUrl = wsUrl.Replace("http://", "https://"); + } + return wsUrl; + // Have to assume the web service is on the machine that this application came from + } // LocalizeWebService + + // Add By Peter 2005/6/20 + public static string GetAppSettings(string key, string section = "") + { + string result = string.Empty; + + try + { + if (!string.IsNullOrEmpty(section)) + { + result = Conversions.ToString(((Hashtable)GetConfig(section))[key]); + } + else if (string.IsNullOrEmpty(gSettingMode) || string.IsNullOrEmpty(gSettingMode) || gSettingMode.Length == 0) + { + result = AppSettings[key]; + } + else + { + Hashtable ht = (Hashtable)GetConfig(gSettingMode); + if (ht != null) + { + result = Conversions.ToString(ht[key]); + } + } + } + + catch (Exception ex) + { + throw ex; + } + + return result; + } + // + public static void WriteLog(string msg, iMESLog.iMESLogLevel level, Exception e = null) + { + string MethodInfo = ""; + var ss = new StackTrace(true); + var mb = ss.GetFrame(1).GetMethod(); + MethodInfo = mb.DeclaringType.Namespace + "." + mb.DeclaringType.Name + "." + mb.Name; + + var log = new iMESLog.MESLog(mb.DeclaringType.Namespace); + log.WriteLog(msg, level, e, MethodInfo); + } + } +} \ No newline at end of file diff --git a/SRC/MESAgent/MESAutoLoader/MESAutoLoader.sln b/SRC/MESAgent/MESAutoLoader/MESAutoLoader.sln new file mode 100644 index 0000000..918b83a --- /dev/null +++ b/SRC/MESAgent/MESAutoLoader/MESAutoLoader.sln @@ -0,0 +1,45 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +VisualStudioVersion = 14.0.25420.1 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AutoLoaderLib_Base", "AutoLoaderLib\AutoLoaderLib_Base.csproj", "{7C0468A8-E807-0FF4-0C04-C1AD9B3D7D2A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AutoLoaderService_Base", "AutoLoaderService_Base\AutoLoaderService_Base.csproj", "{76CCB2C1-5347-075C-192E-C939BAFBC971}" + ProjectSection(ProjectDependencies) = postProject + {7C0468A8-E807-0FF4-0C04-C1AD9B3D7D2A} = {7C0468A8-E807-0FF4-0C04-C1AD9B3D7D2A} + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {7C0468A8-E807-0FF4-0C04-C1AD9B3D7D2A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7C0468A8-E807-0FF4-0C04-C1AD9B3D7D2A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7C0468A8-E807-0FF4-0C04-C1AD9B3D7D2A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7C0468A8-E807-0FF4-0C04-C1AD9B3D7D2A}.Release|Any CPU.Build.0 = Release|Any CPU + {76CCB2C1-5347-075C-192E-C939BAFBC971}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {76CCB2C1-5347-075C-192E-C939BAFBC971}.Debug|Any CPU.Build.0 = Debug|Any CPU + {76CCB2C1-5347-075C-192E-C939BAFBC971}.Release|Any CPU.ActiveCfg = Release|Any CPU + {76CCB2C1-5347-075C-192E-C939BAFBC971}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {069D87BD-CB47-4955-9AB8-F58989DE86CC} + EndGlobalSection + GlobalSection(TeamFoundationVersionControl) = preSolution + SccNumberOfProjects = 3 + SccEnterpriseProvider = {4CA58AB2-18FA-4F8D-95D4-32DDF27D184C} + SccTeamFoundationServer = http://tfs.imestech.com:8080/tfs/messeries6 + SccLocalPath0 = . + SccProjectUniqueName1 = AutoLoaderLib\\AutoLoaderLib_Base.csproj + SccProjectName1 = AutoLoaderLib + SccLocalPath1 = AutoLoaderLib + SccProjectUniqueName2 = AutoLoaderService_Base\\AutoLoaderService_Base.csproj + SccProjectName2 = AutoLoaderService_Base + SccLocalPath2 = AutoLoaderService_Base + EndGlobalSection +EndGlobal