From 8defb91e77c60b51f18c4ee36e897ac7c992e5f0 Mon Sep 17 00:00:00 2001
From: 14278/caihao <572156462@qq.com>
Date: Tue, 23 Jan 2024 14:01:04 +0800
Subject: [PATCH] =?UTF-8?q?=E3=80=90=E6=BA=90=E7=A0=81=E4=B8=8A=E4=BC=A0?=
=?UTF-8?q?=E3=80=91?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../AutoLoaderLib/AssemblyInfo.cs | 31 +
.../AutoLoaderLib/AutoLoaderLib_Base.csproj | 273 +
.../AutoLoaderLib_Base.csproj.vspscc | 10 +
.../AutoLoaderLib/EPIParseTemplate.cs | 236 +
.../My Project/Settings.Designer.cs | 101 +
.../My Project/Settings.settings | 9 +
.../MESAutoLoader/AutoLoaderLib/NLog.config | 123 +
.../MESAutoLoader/AutoLoaderLib/ParseNEL.cs | 248 +
.../MESAutoLoader/AutoLoaderLib/ParsePL.cs | 245 +
.../MESAutoLoader/AutoLoaderLib/ParsePR.cs | 385 +
.../MESAutoLoader/AutoLoaderLib/ParseQEL.cs | 259 +
.../Web References/wsInvoke/Reference.cs | 779 +
.../Web References/wsInvoke/Reference.map | 7 +
.../Web References/wsInvoke/wsInvoke.disco | 6 +
.../Web References/wsInvoke/wsInvoke.wsdl | 427 +
.../MESAutoLoader/AutoLoaderLib/app.config | 35 +
.../AutoLoaderLib/clsAutoLoaderLibrary.cs | 23914 ++++++++++++++++
.../AutoLoaderLib/modAutoLoaderLibrary.cs | 948 +
.../MESAutoLoader/AutoLoaderLib/modWIN.cs | 802 +
.../AutoLoaderService_Base/AssemblyInfo.cs | 31 +
.../AutoLoaderService.cs | 661 +
.../AutoLoaderService.resx | 129 +
.../AutoLoaderService_Base.csproj | 293 +
.../AutoLoaderService_Base.csproj.vspscc | 10 +
.../AutoLoaderService_Base/Install_x32.bat | 3 +
.../AutoLoaderService_Base/Install_x64.bat | 3 +
.../My Project/Settings.Designer.cs | 102 +
.../My Project/Settings.settings | 9 +
.../ProjectInstaller.cs | 102 +
.../ProjectInstaller.resx | 129 +
.../AutoLoaderService_Base/Uninstall_x32.bat | 3 +
.../AutoLoaderService_Base/Uninstall_x64.bat | 3 +
.../Web References/localhost/Reference.cs | 1855 ++
.../Web References/localhost/Reference.map | 7 +
.../Web References/localhost/wsInvoke.disco | 6 +
.../Web References/localhost/wsInvoke.wsdl | 1023 +
.../AutoLoaderService_Base/app.config | 59 +
.../AutoLoaderService_Base/modAutoLoader.cs | 457 +
.../AutoLoaderService_Base/modWIN.cs | 473 +
SRC/MESAgent/MESAutoLoader/MESAutoLoader.sln | 45 +
40 files changed, 34241 insertions(+)
create mode 100644 SRC/MESAgent/MESAutoLoader/AutoLoaderLib/AssemblyInfo.cs
create mode 100644 SRC/MESAgent/MESAutoLoader/AutoLoaderLib/AutoLoaderLib_Base.csproj
create mode 100644 SRC/MESAgent/MESAutoLoader/AutoLoaderLib/AutoLoaderLib_Base.csproj.vspscc
create mode 100644 SRC/MESAgent/MESAutoLoader/AutoLoaderLib/EPIParseTemplate.cs
create mode 100644 SRC/MESAgent/MESAutoLoader/AutoLoaderLib/My Project/Settings.Designer.cs
create mode 100644 SRC/MESAgent/MESAutoLoader/AutoLoaderLib/My Project/Settings.settings
create mode 100644 SRC/MESAgent/MESAutoLoader/AutoLoaderLib/NLog.config
create mode 100644 SRC/MESAgent/MESAutoLoader/AutoLoaderLib/ParseNEL.cs
create mode 100644 SRC/MESAgent/MESAutoLoader/AutoLoaderLib/ParsePL.cs
create mode 100644 SRC/MESAgent/MESAutoLoader/AutoLoaderLib/ParsePR.cs
create mode 100644 SRC/MESAgent/MESAutoLoader/AutoLoaderLib/ParseQEL.cs
create mode 100644 SRC/MESAgent/MESAutoLoader/AutoLoaderLib/Web References/wsInvoke/Reference.cs
create mode 100644 SRC/MESAgent/MESAutoLoader/AutoLoaderLib/Web References/wsInvoke/Reference.map
create mode 100644 SRC/MESAgent/MESAutoLoader/AutoLoaderLib/Web References/wsInvoke/wsInvoke.disco
create mode 100644 SRC/MESAgent/MESAutoLoader/AutoLoaderLib/Web References/wsInvoke/wsInvoke.wsdl
create mode 100644 SRC/MESAgent/MESAutoLoader/AutoLoaderLib/app.config
create mode 100644 SRC/MESAgent/MESAutoLoader/AutoLoaderLib/clsAutoLoaderLibrary.cs
create mode 100644 SRC/MESAgent/MESAutoLoader/AutoLoaderLib/modAutoLoaderLibrary.cs
create mode 100644 SRC/MESAgent/MESAutoLoader/AutoLoaderLib/modWIN.cs
create mode 100644 SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/AssemblyInfo.cs
create mode 100644 SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/AutoLoaderService.cs
create mode 100644 SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/AutoLoaderService.resx
create mode 100644 SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/AutoLoaderService_Base.csproj
create mode 100644 SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/AutoLoaderService_Base.csproj.vspscc
create mode 100644 SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/Install_x32.bat
create mode 100644 SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/Install_x64.bat
create mode 100644 SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/My Project/Settings.Designer.cs
create mode 100644 SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/My Project/Settings.settings
create mode 100644 SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/ProjectInstaller.cs
create mode 100644 SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/ProjectInstaller.resx
create mode 100644 SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/Uninstall_x32.bat
create mode 100644 SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/Uninstall_x64.bat
create mode 100644 SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/Web References/localhost/Reference.cs
create mode 100644 SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/Web References/localhost/Reference.map
create mode 100644 SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/Web References/localhost/wsInvoke.disco
create mode 100644 SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/Web References/localhost/wsInvoke.wsdl
create mode 100644 SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/app.config
create mode 100644 SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/modAutoLoader.cs
create mode 100644 SRC/MESAgent/MESAutoLoader/AutoLoaderService_Base/modWIN.cs
create mode 100644 SRC/MESAgent/MESAutoLoader/MESAutoLoader.sln
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 + "" + "" + value_name.ToLower() + ">";
+
+
+
+
+ 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 + "" + TagName + ">";
+ 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 + "" + "" + value_name.ToLower() + ">";
+
+
+
+ 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 + "" + "" + value_name.ToLower() + ">";
+
+
+
+
+ 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 + "" + TagName + ">";
+ 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 + "" + "" + value_name.ToLower() + ">";
+
+
+
+ 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