This repo is archived. You can view files and clone it, but cannot push or open issues or pull requests.
SXS20240115/SRC/MESAgent/MESAutoLoader/AutoLoaderLib/clsAutoLoaderLibrary.cs

23915 lines
1.3 MiB
C#
Raw Normal View History

2024-01-23 14:01:04 +08:00
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
/// <summary>
///
/// </summary>
/// <param name="colParameters"></param>
/// <returns></returns>
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;
}
/// <summary>
///
/// </summary>
/// <param name="blnSplitPartialSuccess">原vb預設值false</param>
/// <param name="TotalRows">原vb預設值0</param>
/// <returns></returns>
/// <exception cref="Exception"></exception>
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, _SQLContent>();
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<columnstart 會錯,應該是開始行數+上欄位行數
if (intDataStart <= intColumnStart)
{
intDataStart = intDataStart + intColumnStart;
}
}
int x = 0;
try
{
bool blnD_EquipmentNo = default(bool);
bool blnD_WaferSize = default(bool);
bool blnD_Thickness = default(bool);
while (!objReader.EndOfStream)
{
x = x + 1;
TotalRows = x;
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/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<string, string>();
var VarcharParameter_Del = new Dictionary<string, string[]>();
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<string, int[]> argInt32Parameter = null;
Dictionary<string, decimal[]> argDecimalParameter = null;
Dictionary<string, DateTime[]> 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<uint, _SQLContent>();
var oParameterNames = new Dictionary<string, string>();
var Int32Parameter = new Dictionary<string, int[]>();
var DecimalParameter = new Dictionary<string, decimal[]>();
var VarcharParameter = new Dictionary<string, string[]>();
var DateParameter = new Dictionary<string, DateTime[]>();
// //新增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<uint, _SQLContent>();
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<uint, _SQLContent>();
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<string, string>();
var VarcharParameter_Del = new Dictionary<string, string[]>();
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<string, int[]> argInt32Parameter1 = null;
Dictionary<string, decimal[]> argDecimalParameter1 = null;
Dictionary<string, DateTime[]> 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<uint, _SQLContent>();
var oParameterNames = new Dictionary<string, string>();
var Int32Parameter = new Dictionary<string, int[]>();
var DecimalParameter = new Dictionary<string, decimal[]>();
var VarcharParameter = new Dictionary<string, string[]>();
var DateParameter = new Dictionary<string, DateTime[]>();
// //新增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<string, byte[]> 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<uint, _SQLContent>();
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<uint, _SQLContent>();
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;
}
/// <summary>
///
/// </summary>
/// <param name="blnSplitPartialSuccess">原vb預設值false</param>
/// <param name="TotalRows">原vb預設值0</param>
/// <returns></returns>
/// <exception cref="Exception"></exception>
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, _SQLContent>();
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<columnstart 會錯,應該是開始行數+上欄位行數
if (intDataStart <= intColumnStart)
{
intDataStart = intDataStart + intColumnStart;
}
}
int x = 0;
try
{
if (excelRow != null)
{
bool blnD_EquipmentNo = default(bool);
bool blnD_WaferSize = default(bool);
bool blnD_Thickness = default(bool);
while (x <= sheet.LastRowNum)
{
excelRow = sheet.GetRow(x);
x += 1;
if (excelRow == null)
{
continue;
}
bool continueWhile = false;
var loopTo = excelRow.LastCellNum - 1;
for (colIndex = 0; colIndex <= loopTo; colIndex++)
{
excelCell = excelRow.GetCell(colIndex);
string strCellString = "";
funGetCellValue(excelCell, sheet, workbook, ref strCellString);
if (string.IsNullOrEmpty(strCellString))
{
continueWhile = true;
break;
}
}
if (continueWhile)
{
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 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<string, string>();
var VarcharParameter_Del = new Dictionary<string, string[]>();
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<string, int[]> argInt32Parameter = null;
Dictionary<string, decimal[]> argDecimalParameter = null;
Dictionary<string, DateTime[]> argDateParameter = null;
Dictionary<string, byte[]> 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<uint, _SQLContent>();
var oParameterNames = new Dictionary<string, string>();
var Int32Parameter = new Dictionary<string, int[]>();
var DecimalParameter = new Dictionary<string, decimal[]>();
var VarcharParameter = new Dictionary<string, string[]>();
var DateParameter = new Dictionary<string, DateTime[]>();
// //新增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<uint, _SQLContent>();
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<uint, _SQLContent>();
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<string, string>();
var VarcharParameter_Del = new Dictionary<string, string[]>();
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<string, int[]> argInt32Parameter1 = null;
Dictionary<string, decimal[]> argDecimalParameter1 = null;
Dictionary<string, DateTime[]> 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<uint, _SQLContent>();
var oParameterNames = new Dictionary<string, string>();
var Int32Parameter = new Dictionary<string, int[]>();
var DecimalParameter = new Dictionary<string, decimal[]>();
var VarcharParameter = new Dictionary<string, string[]>();
var DateParameter = new Dictionary<string, DateTime[]>();
// //新增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<uint, _SQLContent>();
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<uint, _SQLContent>();
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, _SQLContent>();
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<string, string>();
var Int32Parameter = new Dictionary<string, int[]>();
var VarcharParameter = new Dictionary<string, string[]>();
var DateParameter = new Dictionary<string, DateTime[]>();
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<string, decimal[]> 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<uint, _SQLContent>();
}
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<string> 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<string, string>();
var Int32Parameter = new Dictionary<string, int[]>();
var VarcharParameter = new Dictionary<string, string[]>();
var DateParameter = new Dictionary<string, DateTime[]>();
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<string, decimal[]> 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<uint, _SQLContent>();
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<string, string>();
var Int32Parameter = new Dictionary<string, int[]>();
var VarcharParameter = new Dictionary<string, string[]>();
var DateParameter = new Dictionary<string, DateTime[]>();
// 將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<string, decimal[]> 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<uint, _SQLContent>();
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<string> 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;
}
/// <summary>
///
/// </summary>
/// <param name="TotalRows">原vb預設值0</param>
/// <returns></returns>
/// <exception cref="Exception"></exception>
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<string> 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;
}
/// <summary>
///
/// </summary>
/// <param name="blnSplitPartialSuccess">原vb預設值false</param>
/// <param name="TotalRows">原vb預設值0</param>
/// <returns></returns>
/// <exception cref="Exception"></exception>
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, _SQLContent>();
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<columnstart 會錯,應該是開始行數+上欄位行數
if (intDataStart <= intColumnStart)
{
intDataStart = intDataStart + intColumnStart;
}
}
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 = x;
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);
}
// 找出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<string> 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<string, string>();
var Int32Parameter = new Dictionary<string, int[]>();
var DecimalParameter = new Dictionary<string, decimal[]>();
var VarcharParameter = new Dictionary<string, string[]>();
var DateParameter = new Dictionary<string, DateTime[]>();
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<string, byte[]> 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<uint, _SQLContent>();
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<string, string>();
var Int32Parameter = new Dictionary<string, int[]>();
var DecimalParameter = new Dictionary<string, decimal[]>();
var VarcharParameter = new Dictionary<string, string[]>();
var DateParameter = new Dictionary<string, DateTime[]>();
// 將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<uint, _SQLContent>();
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, _SQLContent>();
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);
}
/// <summary>
///
/// </summary>
/// <param name="TotalRows">原vb預設值0</param>
/// <returns></returns>
/// <exception cref="Exception"></exception>
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;
}
/// <summary>
///
/// </summary>
/// <param name="blnSplitPartialSuccess">原vb預設值false</param>
/// <param name="TotalRows">原vb預設值0</param>
/// <returns></returns>
/// <exception cref="Exception"></exception>
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, _SQLContent>();
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<columnstart 會錯,應該是開始行數+上欄位行數
if (intDataStart <= intColumnStart)
{
intDataStart = intDataStart + intColumnStart;
}
}
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;
}
// 找出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<string, string>();
var Int32Parameter = new Dictionary<string, int[]>();
var DecimalParameter = new Dictionary<string, decimal[]>();
var VarcharParameter = new Dictionary<string, string[]>();
var DateParameter = new Dictionary<string, DateTime[]>();
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<uint, _SQLContent>();
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<string, string>();
var Int32Parameter = new Dictionary<string, int[]>();
var DecimalParameter = new Dictionary<string, decimal[]>();
var VarcharParameter = new Dictionary<string, string[]>();
var DateParameter = new Dictionary<string, DateTime[]>();
// 將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<uint, _SQLContent>();
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<string> uniqueCombinations = new HashSet<string>();
// 步驟 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
}
}