using System; using System.Collections; using System.Collections.Generic; using System.Data; using Oracle.ManagedDataAccess.Client; using System.Data.SqlClient; using System.Diagnostics; using System.IO; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading; using System.Xml; using iMESCIO.SCI.ERP.Request; using iMESCIO.SCI.ERP.Response; using iMESCIO.SCI.ERP.Request_E10ICD; using iMESCIO.SCI.ERP.Response_E10ICD; using iMESCIO.SCI.Base; using Microsoft.VisualBasic; using Microsoft.VisualBasic.CompilerServices; using iMESCore.Settings; using static iMESCore.DataBase.iMESSql; using static iMESCore.Base.iMESComXML; using static iMESCore.Base.iMESConst; using static iMESCore.Base.iMESComSubroutine; using System.Data.Common; using System.Drawing; using Ionic.Zip; using System.EnterpriseServices.CompensatingResourceManager; using static System.Windows.Forms.AxHost; using System.Runtime.Remoting.Messaging; using System.Collections.ObjectModel; namespace AutoRunLib { public class clsAutoRunLibrary { // 2016/06/23 YF, 原呼叫標準各模組的WebService, 改統一呼叫wsInvoke public enum ERPName { TIPTOP = 0, Workflow = 1, T100 = 2, HMI = 3, APS = 4 } private DataTable dtERPSetting = null; //private IDbCommand cmmTemp; private string strDataBaseType; // DataBase Type:oracle, mysql, access private string strConnectionString; // Connection string private string strReportDataBaseType; private string strReportConnectionString; // Report DB Connection string private string strMQType; // MessageQueue Type:TIBCO, MQSeries, MSMQ //private IDbCommand cmmTempERP; private string strERPconnectionString; private string strERPDataBaseType; private string strERPReportConnectionString; private string strERPCreator = "ERP"; // 取得Config設定之defCreator. private string strDefLanguage; // 取得Config設定之LanguageMode. private string strLanguage_T100; // MES對應ERP T100語系 private AppSettings objSetting = new AppSettings(); private clsDBCom objDBcom = new clsDBCom(); public string strComputerName, strERPUnitNo; public string strAppPath; public string gERPUser; // ERP使用者名稱 public string gERPPassword; // ERP密碼 public string gERPWSURL; // ERP Web服務網址 public string gERPOraganization; // ERP營運中心代碼 public string gERPLanguage; // ERP語系 public string gERPVersion; // ERP版本 // //Web Service相關變數 private XmlDocument XmlDoc = new XmlDocument(); private StringReader tmpStringReader; private string InXml, OutXml, strIdentity, strParameter, XmlData, XmlSchema; private string ExceptionXML; // ===== private string ERP_EntID; private string ERP_Site; private string ERP_URL; private string results; private string strLanguageMode = "zh-cht"; private string strResourceDir = "Resources"; // Dim objkcWIP As New kcWIP.clsOperatorState '宣告Sys的物件 // //Initial Object-------------------------------------------------------------------------------------------------------------------------------- public clsAutoRunLibrary() { // //Get database type strDataBaseType = objSetting.GetDataBaseType(); // //Get connection string strConnectionString = objSetting.GetConnectionString(strDataBaseType); // //Get Message Queue Type strMQType = objSetting.GetMQType(); strReportDataBaseType = objSetting.GetReportDataBaseType(); // //Get connection string strReportConnectionString = objSetting.GetReportConnectionString(strReportDataBaseType); // ERP // //Get ERP database type strERPDataBaseType = objSetting.GetDataBaseType_ERP(); // //Get ERP connection string strERPconnectionString = objSetting.GetConnectionString_ERP(strERPDataBaseType); try { strResourceDir = objSetting["ResourceDir"].ToString(); } catch (Exception) { } try { strLanguageMode = objSetting["LanguageMode"].ToString(); } catch (Exception) { } // T100 整合項目增加, 取得 Web.Config 設定項目, 2015/12/15 Add. try { // 從Web.config取出目前的DatabaseType strERPCreator = System.Configuration.ConfigurationSettings.AppSettings.Get("defCreator"); // 2016-03-09, Joe, 取出預設ERP單位屬性編號 strERPUnitNo = System.Configuration.ConfigurationSettings.AppSettings.Get("defERPUnitNoProperty"); // 2016-03-02, Joe, 取出預設語系並轉換成ERP對應語系,後續T100多語系資料需用到 strDefLanguage = System.Configuration.ConfigurationSettings.AppSettings.Get("LanguageMode"); switch (strDefLanguage.ToUpper() ?? "") { case "ZH-CHS": { strLanguage_T100 = "zh_CN"; break; } case "EN": { strLanguage_T100 = "en_US"; break; } default: { strLanguage_T100 = "zh_TW"; break; } } } catch (Exception ex) { // 發生錯誤時丟回本身的Function Name及系統錯誤訊息 } } // //Property-------------------------------------------------------------------------------------------------------------------------------- public object ConnectionString { get { return strConnectionString; } } public object DataBaseType { get { return strDataBaseType; } } // Public ReadOnly Property ERPConnectionString() // Get // ERPConnectionString = strERPconnectionString // End Get // End Property // Public ReadOnly Property ERPDataBaseType() // Get // ERPDataBaseType = strERPDataBaseType // End Get // End Property public object MQType { get { return strMQType; } } // //Function-------------------------------------------------------------------------------------------------------------------------------- #region 共用的function (不可刪除) // //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 { // 2019/07/26 OwenLiu, Mantis:0060463, AutoRunService 支持行業包共用架構 // -------------------------------------------------------------------------------------------------- // 半導體芯片製造行業包(SEMI_WAFER):S, AutoRunLib_SEMI_WAFER.dll, Job Function固定以 fun_S_ 開頭 // 半導體芯片測試行業包(IC_CP_PKG):P, AutoRunLib_IC_CP_PKG.dll, Job Function固定以 fun_P_ 開頭 // 集成電路封測行業包(IC_FT_PKG):I, AutoRunLib_IC_FT_PKG.dll, Job Function固定以 fun_I_ 開頭 // 分立器件封測行業包(DISCRETE_PKG):D, AutoRunLib_DISCRETE_PKG.dll, Job Function固定以 fun_D_ 開頭 // LED封測行業包(LED_PKG):L, AutoRunLib_LED_PKG.dll, Job Function固定以 fun_L_ 開頭 // 序號組裝行業包(ASM):A, AutoRunLib_ASM.dll, Job Function固定以 fun_A_ 開頭 // 行業包基底(Industry_Base):B, AutoRunLib_Base.dll, Job Function固定以 fun_B_ 開頭 // -------------------------------------------------------------------------------------------------- // 1.處理 FunctionName 大小寫問題 // 本機執行:將DLL放在執行檔編譯後的位置底下(AutoRunService) string strFilePath = AppDomain.CurrentDomain.BaseDirectory + @"\"; string strLibFileName = ""; string strLibraryName = ""; if (FunctionName.ToUpper().StartsWith("FUN_S_")) // SEMI_WAFER { strLibFileName = "AutoRunLib_SEMI_WAFER.dll"; } else if (FunctionName.ToUpper().StartsWith("FUN_P_")) // IC_CP_PKG { strLibFileName = "AutoRunLib_IC_CP_PKG.dll"; } else if (FunctionName.ToUpper().StartsWith("FUN_I_")) // IC_FT_PKG { strLibFileName = "AutoRunLib_IC_FT_PKG.dll"; } else if (FunctionName.ToUpper().StartsWith("FUN_D_")) // DISCRETE_PKG { strLibFileName = "AutoRunLib_DISCRETE_PKG.dll"; } else if (FunctionName.ToUpper().StartsWith("FUN_L_")) // LED_PKG { strLibFileName = "AutoRunLib_LED_PKG.dll"; } else if (FunctionName.ToUpper().StartsWith("FUN_A_")) // ASM { strLibFileName = "AutoRunLib_ASM.dll"; } else if (FunctionName.ToUpper().StartsWith("FUN_C_")) // 個案 { strLibFileName = "AutoRunLib_C.dll"; } else if (FunctionName.ToUpper().StartsWith("FUN_B_")) // Industry_Base { strLibFileName = "AutoRunLib_Base.dll"; } else { strLibFileName = "AutoRunLib.dll"; } strLibraryName = strLibFileName.Substring(0, strLibFileName.LastIndexOf(".dll")) + ".clsAutoRunLibrary"; strFilePath += strLibFileName; var mainAssembly = System.Reflection.Assembly.LoadFrom(strFilePath); System.Reflection.MethodInfo[] MyMethodInfos = mainAssembly.GetType(strLibraryName).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 }; string strClassName = "clsAutoRunLibrary"; Type t; System.Reflection.MethodInfo mi; Type[] argumentTypes; System.Reflection.ConstructorInfo ctor; object obj; try { t = mainAssembly.GetType(mainAssembly.GetName().Name + "." + strClassName, true, true); } catch (Exception ex) { throw; } argumentTypes = Type.EmptyTypes; ctor = t.GetConstructor(argumentTypes); obj = ctor.Invoke(new object[] { }); mi = t.GetMethod(FunctionName, System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); ExecuteFunctionRet = Conversions.ToString(mi.Invoke(obj, (object[])objArgs)); } catch (Exception e1) { // 2016-08-25, Joe, 加.InnerException將exception傳出 if (e1.InnerException == null) { ExecuteFunctionRet = "fail;" + e1.Message; } else { ExecuteFunctionRet = "fail;" + e1.InnerException.Message; } } finally { } return ExecuteFunctionRet; } // 0125796: [6.0.7] SDD230104_01-01_訂閱報表新增輸出圖表 2023/3/10 private string SendMultiEmailNonGroup(ref string EmailSubject, string EmailBody = defString, string EmailAddress = defString, string AttachFileName = defString, byte[] AttachFile = null, string EmailAddressCC = defString, DataTable AttachFiles = null) { string SendMultiEmailNonGroupRet = default(string); // 將發Mail給非群組收件者 多人可用 , 隔開 string[] aryAddress, aryAddressCC; string tmpXML = default(string), tmpXMLCC = default(string); aryAddress = Strings.Split(EmailAddress, ","); // 子收件者包幾個child tag foreach (string StrTemp in aryAddress) { tmpXML += CombineXMLValueTag(CombineXMLValue("address", StrTemp)); } if (EmailAddressCC != defString && !string.IsNullOrEmpty(EmailAddressCC)) { aryAddressCC = Strings.Split(EmailAddressCC, ","); foreach (string StrTemp in aryAddressCC) { tmpXMLCC += CombineXMLValueTag(CombineXMLValue("address", StrTemp)); } } try { if (AttachFiles == null) { AttachFiles = new DataTable(); AttachFiles.Columns.Add(new DataColumn("Name", typeof(string))); AttachFiles.Columns.Add(new DataColumn("Content", typeof(byte[]))); } strIdentity = CombineXMLIdentity(modWIN.gComputerName, "AUTORUN", Conversions.ToString(DateTime.Now)); strParameter = CombineXMLParameterMultiValue("emailaddress", "EmailAddress", "String", tmpXML, ""); strParameter += CombineXMLParameter("emailsubject", "EmailSubject", "String", EmailSubject, ""); strParameter += CombineXMLParameter("emailbody", "EmailBody", "String", CInput(EmailBody), ""); if (!string.IsNullOrEmpty(tmpXMLCC)) { strParameter += CombineXMLParameterMultiValue("emailaddresscc", "EmailAddressCC", "String", tmpXMLCC, ""); } if (AttachFileName != defString) { DataRow row = AttachFiles.NewRow(); row["Name"] = AttachFileName; row["Content"] = AttachFile; AttachFiles.Rows.InsertAt(row, 0); } string strFileItem = ""; for (int i = 0, loopTo = AttachFiles.Rows.Count - 1; i <= loopTo; i++) { strFileItem += CombineXMLValueTag( CombineXMLValue("name", AttachFiles.Rows[i]["Name"].ToString()) + CombineXMLValue("content", BitConverter.ToString((byte[])AttachFiles.Rows[i]["Content"]).Replace("-", string.Empty))); } strParameter += CombineXMLParameterMultiValue("fileitem", "FileItem", "String", strFileItem, ""); var XmlDoc = new XmlDocument(); InXml = CombineXMLRequest(strIdentity, strParameter); OutXml = modAutoRunLibrary.InvokeSrv("wsSYS.SendMultiEmailAndAttachReportFile", InXml); XmlDoc.LoadXml(OutXml); if (chkExecutionSuccess(XmlDoc)) // 找出Exception訊並顯示出來 { SendMultiEmailNonGroupRet = "success"; } else { // 20220901,13871,0118251: 【度亘】描述性语言报表,排程执行失败,調整錯誤訊息 SendMultiEmailNonGroupRet = "fail;" + GetExceptionMesMsg(XmlDoc) + ";" + GetExceptionSysMsg(XmlDoc); } XmlDoc = null; } catch (Exception ex) { SendMultiEmailNonGroupRet = "fail;" + ex.Message; } return SendMultiEmailNonGroupRet; } private void SendJobFailEmail(Collection colParameters) { // 發送Email前置作業, 可判別群組與非群組寄送 var dsGroup = new DataSet(); var strGroupBasis = default(string); string[] aryEmailAddress; string strEmailAddress, strNonGroup = default(string), strGroup = default(string), strEmailBody, strEmailTitle; // EmailInfo // 取出參數EmailAddress 取不到則不發送 // 2013/10/18, Hank, 修改若無EmailAddress欄位會crash if (colParameters.Contains("EmailAddress") == false || colParameters["EmailAddress"] == null || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["EmailAddress"])))) { return; } else { strEmailAddress = Strings.Trim(Conversions.ToString(colParameters["EmailAddress"])); } strEmailTitle = "MES AutoRun-" + Strings.Trim(Conversions.ToString(colParameters["JobNo"])) + " Fail"; strEmailBody = Strings.Trim(Conversions.ToString(colParameters["EmailBody"])); LoadGroupBasis(ref dsGroup); // 切出 有效群組與非群組 aryEmailAddress = Strings.Split(strEmailAddress, ","); for (int i = 0, loopTo = aryEmailAddress.Length - 1; i <= loopTo; i++) { if (System.Text.RegularExpressions.Regex.Matches(aryEmailAddress[i], "@").Count == 1) // Non Group { strNonGroup += Strings.Trim(aryEmailAddress[i]) + ","; } else if (dsGroup.Tables[strGroupBasis].Select("GroupNo ='" + Strings.Trim(aryEmailAddress[i]) + "'").Length > 0) // Group { strGroup += Strings.Trim(aryEmailAddress[i]) + ","; } } // 去掉最後字元為 , if (Strings.Right(strGroup, 1) == ",") strGroup = Strings.Mid(strGroup, 1, Strings.Len(strGroup) - 1); if (Strings.Right(strNonGroup, 1) == ",") strNonGroup = Strings.Mid(strNonGroup, 1, Strings.Len(strNonGroup) - 1); // 群組寄送 if (!string.IsNullOrEmpty(strGroup)) { string argFileName = "N/A"; modAutoRunLibrary.SendMultiEmail(ref argFileName, ref strEmailTitle, strEmailBody, strGroup); } // 非群組寄送 if (!string.IsNullOrEmpty(strNonGroup)) { SendMultiEmailNonGroup(ref strEmailTitle, strEmailBody, strNonGroup); } } ~clsAutoRunLibrary() { if (objSetting != null) objSetting = null; } /// /// 向資料庫取得使用TipTop時的ERP整合設定資訊。 /// /// /// public void funGetERPSetting(string pERPName) { // Gary Lu 20120614:ERP整合設定統一由此函數取得 StringReader tmpStringReader; // 將字串轉換成可讀入DataSet的物件 string strERPSettingTableName; string InXml, OutXml, strIdentity, strParameter, XmlData, XmlSchema; // 呼叫WS的字串參數 var XmlDoc = new XmlDocument(); try { var dsERPSetting_TP = new DataSet(); // 組InXml string argSendTime = Conversions.ToString(DateTime.Now); strIdentity = CombineXMLIdentity(modWIN.gComputerName, modWIN.gUserNo, argSendTime); string argvalue_name = "erpname"; string argname = "ERPName"; string argtype = "String"; string argdesc = ""; strParameter = CombineXMLParameter(argvalue_name, argname, argtype, pERPName, argdesc); if (pERPName == "TIPTOPICD") { strParameter += CombineXMLParameter("activeerp", "ActiveERP", "Integer", "1", ""); } InXml = CombineXMLRequest(strIdentity, strParameter); // 呼叫Web服務執行 OutXml = modAutoRunLibrary.InvokeSrv("wsSYS.LoadERPSetting", InXml); // 解讀Web服務的執行結果 XmlDoc.LoadXml(OutXml); if (chkExecutionSuccess(XmlDoc)) { // 讀取取出資料表的名稱 strERPSettingTableName = XmlDoc.GetElementsByTagName("returnvalue").Item(0).SelectNodes("loaderpsetting").Item(0).SelectNodes("name").Item(0).InnerXml; // 取出Schema,dataset讀取Schema可防止Null Field及DateTime的問題 XmlSchema = XmlDoc.DocumentElement.GetElementsByTagName("loaderpsetting").Item(0).SelectNodes("schema").Item(0).InnerXml; if (!string.IsNullOrEmpty(XmlSchema)) { // 將XML讀入String Reader object中,因為Dataset讀入XML時必須透過String Reader物件 tmpStringReader = new StringReader(XmlSchema); dsERPSetting_TP.ReadXmlSchema(tmpStringReader); tmpStringReader.Close(); } // 取出Data XmlData = XmlDoc.DocumentElement.GetElementsByTagName("loaderpsetting").Item(0).SelectNodes("value").Item(0).InnerXml; if (!string.IsNullOrEmpty(XmlData)) { tmpStringReader = new StringReader(XmlData); dsERPSetting_TP.ReadXml(tmpStringReader, XmlReadMode.InferSchema); tmpStringReader.Close(); } if (dsERPSetting_TP.Tables[strERPSettingTableName].Rows.Count > 0) { gERPUser = dsERPSetting_TP.Tables[strERPSettingTableName].Rows[0]["ERP_USER"].ToString(); gERPPassword = dsERPSetting_TP.Tables[strERPSettingTableName].Rows[0]["ERP_PWD"].ToString(); gERPWSURL = dsERPSetting_TP.Tables[strERPSettingTableName].Rows[0]["ERP_WSURL"].ToString(); gERPOraganization = dsERPSetting_TP.Tables[strERPSettingTableName].Rows[0]["ERP_ORG"].ToString(); gERPLanguage = dsERPSetting_TP.Tables[strERPSettingTableName].Rows[0]["ERP_LANG"].ToString(); gERPVersion = dsERPSetting_TP.Tables[strERPSettingTableName].Rows[0]["ERP_VERSION"].ToString(); } else { throw new Exception(TranslateMsg("[%ERPWSURL%][%not found%]!", strLanguageMode, strResourceDir)); } } else { throw new Exception(TranslateMsg("[%ERPWSURL%][%not found%]!", strLanguageMode, strResourceDir)); } } catch (Exception ex) { throw; } } /// /// 取得ERP整合的設定資料 /// /// /// /// private bool GetERPSetting(ref DataTable pTable, string pERPName = defString, int pEAIType = 0, int pActiveERP = 0) { bool blnResult = false; var XmlDoc = new XmlDocument(); var dsTemp = new DataSet(); try { // 組InXml string argSendTime = Conversions.ToString(DateTime.Now); strIdentity = CombineXMLIdentity(modWIN.gComputerName, modWIN.gUserNo, argSendTime); strParameter = ""; if ((pERPName ?? "") != defString) { string argvalue_name = "erpname"; string argname = "ERPName"; string argtype = "String"; string argdesc = ""; strParameter += CombineXMLParameter(argvalue_name, argname, argtype, pERPName, argdesc); } if (pEAIType != 0) { string argstrAdditional = CombineAddXML_Condition("EAI_Type = " + pEAIType); strParameter += CombineXMLAdditional(argstrAdditional); } if (pActiveERP != 0) { strParameter += CombineXMLParameter("activeerp", "ActiveERP", "Integer", Conversions.ToString(pActiveERP), ""); } InXml = CombineXMLRequest(strIdentity, strParameter); // 呼叫Web服務執行 OutXml = modAutoRunLibrary.InvokeSrv("wsSYS.LoadERPSetting", InXml); // 解讀Web服務的執行結果 XmlDoc.LoadXml(OutXml); if (chkExecutionSuccess(XmlDoc)) { XmlSchema = XmlDoc.DocumentElement.GetElementsByTagName("loaderpsetting").Item(0).SelectNodes("schema").Item(0).InnerXml; if (!string.IsNullOrEmpty(XmlSchema)) { // 將XML讀入String Reader object中,因為Dataset讀入XML時必須透過String Reader物件 tmpStringReader = new StringReader(XmlSchema); dsTemp.ReadXmlSchema(tmpStringReader); tmpStringReader.Close(); } XmlData = XmlDoc.DocumentElement.GetElementsByTagName("loaderpsetting").Item(0).SelectNodes("value").Item(0).InnerXml; if (!string.IsNullOrEmpty(XmlData)) { tmpStringReader = new StringReader(XmlData); dsTemp.ReadXml(tmpStringReader, XmlReadMode.InferSchema); tmpStringReader.Close(); } if (dsTemp.Tables.Count > 0 && dsTemp.Tables[0].Rows.Count > 0) { pTable = dsTemp.Tables[0].Copy(); blnResult = true; } else { throw new Exception(TranslateMsg("[%ERPWSURL%][%not found%]!", strLanguageMode, strResourceDir)); } dtERPSetting = dsTemp.Tables[0]; var row = dtERPSetting.Rows[0]; ERP_EntID = row["ERP_ENTID"].ToString(); ERP_Site = row["ERP_ORG"].ToString(); ERP_URL = row["ERP_WSURL"].ToString(); } else { throw new Exception(TranslateMsg("[%ERPWSURL%][%not found%]!", strLanguageMode, strResourceDir)); } } catch (Exception ex) { throw; } finally { XmlDoc = null; dsTemp = null; } return blnResult; } #region ProcessAbout private int[] GetProcessID(string Str_ProcessName) { int[] GetProcessIDRet = default(int[]); int[] IntArray; int i; Process[] allRelationalProcs = Process.GetProcessesByName(Str_ProcessName); i = 0; IntArray = new int[1]; foreach (var thisProcess in allRelationalProcs) { try { Array.Resize(ref IntArray, i + 1); IntArray[i] = thisProcess.Id; i += 1; } catch (Exception ex) { // MessageBox.Show(ex.GetBaseException.ToString, "GetProcessID Error", MessageBoxButtons.OK, MessageBoxIcon.Error) } } GetProcessIDRet = IntArray; return GetProcessIDRet; } private int[] GetNewPID(int[] OldPID, int[] AllPID) { int[] GetNewPIDRet = default(int[]); int i, j, k; int[] IntArray; j = 0; IntArray = new int[1]; var loopTo = Information.UBound(AllPID); for (i = 0; i <= loopTo; i++) { k = Array.IndexOf(OldPID, AllPID[i]); if (k == -1) { Array.Resize(ref IntArray, j + 1); IntArray[j] = AllPID[i]; j += 1; } } GetNewPIDRet = IntArray; return GetNewPIDRet; } private bool KillProcess(int Str_ProcessID) { try { var Process = System.Diagnostics.Process.GetProcessById(Str_ProcessID); if (Conversions.ToBoolean(!Process.CloseMainWindow())) { Process.Kill(); } } catch (Exception ex) { // MessageBox.Show(ex.GetBaseException.ToString, "Close Process Error", MessageBoxButtons.OK, MessageBoxIcon.Error) } return default(Boolean); } #endregion private void LoadGroupBasis(ref DataSet dsGroup) { // 讀取使用者群組主檔 var strGroupBasis = default(string); // 先判斷是否dataset中已有equipmenttype之datatable,若有,需先remove否則會有錯誤 if (!(dsGroup.Tables[strGroupBasis] == null)) { dsGroup.Tables.Remove(strGroupBasis); } // 組InXml的字串 string argSendTime = Conversions.ToString(DateTime.Now); strIdentity = CombineXMLIdentity(modWIN.gComputerName, modWIN.gUserNo, argSendTime); // 加上IssueState要求取出所有資料 string argvalue_name = "issuestate"; string argname = "issuestate"; string argtype = "Integer"; string argvalue = defInteger.ToString(); string argdesc = ""; strParameter = CombineXMLParameter(argvalue_name, argname, argtype, argvalue, argdesc); int modAutoRundefTmp = defInteger; modAutoRundefTmp = Conversions.ToInteger(argvalue); InXml = CombineXMLRequest(strIdentity, strParameter); try { // OutXml = wsUSR.LoadGroupBasis(InXml) OutXml = modAutoRunLibrary.InvokeSrv("wsUSR.LoadGroupBasis", InXml); // 利用XmlDoc物件處理ReturnValue XmlDoc.LoadXml(OutXml); if (chkExecutionSuccess(XmlDoc)) { strGroupBasis = XmlDoc.GetElementsByTagName("returnvalue").Item(0).SelectNodes("loadgroupbasis").Item(0).SelectNodes("name").Item(0).InnerXml; // 取出Schema,dataset讀取Schema可防止Null Field及DateTime的問題 XmlSchema = XmlDoc.DocumentElement.GetElementsByTagName("loadgroupbasis").Item(0).SelectNodes("schema").Item(0).InnerXml; if (!string.IsNullOrEmpty(XmlSchema)) { // 將XML讀入String Reader object中,因為Dataset讀入XML時必須透過String Reader物件 tmpStringReader = new StringReader(XmlSchema); dsGroup.ReadXmlSchema(tmpStringReader); tmpStringReader.Close(); } // 取出Data XmlData = XmlDoc.DocumentElement.GetElementsByTagName("loadgroupbasis").Item(0).SelectNodes("value").Item(0).InnerXml; if (!string.IsNullOrEmpty(XmlData)) { tmpStringReader = new StringReader(XmlData); dsGroup.ReadXml(tmpStringReader); tmpStringReader.Close(); } else { throw new Exception(GetExceptionSysMsg(XmlDoc)); } } } catch (Exception ex) { throw; } } public string CombineRequestXMLbyCDO(ref object SCI_Object, string pService, string pUserNo, string pServiceName, string pCalledID = defString, string pRequestKey = defString) { string CombineRequestXMLbyCDORet = default(string); DataRow[] drERPSetting; string strFilter = ""; do { try { strFilter = "ERP_Name ='" + pService + "' "; if ((pCalledID ?? "") != defString && string.IsNullOrEmpty(pCalledID) == false) strFilter += " And CalledID ='" + pCalledID + "' "; // 取得服務資訊 drERPSetting = dtERPSetting.Select(strFilter); if (drERPSetting == null) break; if (drERPSetting.Length != 1) break; if ((pCalledID ?? "") == defString) { pCalledID = drERPSetting[0]["CalledID"].ToString(); } // 2017-03-17, Joe, 加Parameter for E10 (SCI_Object as iMESCIO.SCI.ERP.ERPRequestBase).enterprise_no = drERPSetting[0]["ERP_ENTID"].ToString(); (SCI_Object as iMESCIO.SCI.ERP.ERPRequestBase).site_no = drERPSetting[0]["ERP_ORG"].ToString(); // 轉XML string RequestHead = ""; RequestHead += ""; string RequestDataKey = "" + drERPSetting[0]["ERP_ENTID"].ToString() + "" + drERPSetting[0]["ERP_ORG"].ToString() + ""; string RequestXML_Body = Conversions.ToString((SCI_Object as iMESCIO.SCI.ERP.ERPRequestBase).ParseXml()); pRequestKey = modAutoRunLibrary.GetRequestKey(RequestHead); string RequestHeader = "" + RequestHead + RequestDataKey + "" + RequestXML_Body + ""; // CDO to XML CombineRequestXMLbyCDORet = RequestHeader; } catch (Exception ex) { throw; } } while (false); return CombineRequestXMLbyCDORet; } /// /// EAI 檢核編碼(MD5) /// /// /// // Private Function GetRequestKey(ByVal input As String) As String // Const ID As String = "28682266" ' 鼎新統編 // Dim key As String = "" // Dim md5Hasher As MD5 = MD5.Create() ' 建立MD5物件 // Try // input += ID // ' 將input轉換成MD5,並且以Bytes傳回,由於ComputeHash只接受Bytes型別參數,所以要先轉型別為Bytes // Dim data As Byte() = md5Hasher.ComputeHash(Encoding.UTF8.GetBytes(input)) // ' 建立StringBuilder物件 // Dim sb As New StringBuilder() // ' 將Bytes轉型別為String,並且以16進位存放 // For i As Integer = 0 To data.Length - 1 // sb.Append(data(i).ToString("x2")) // Next i // key = sb.ToString // Catch ex As Exception // Throw // Finally // md5Hasher = Nothing // End Try // Return key // End Function #endregion #region 標準版JobName #region Tip Top ERP & MES 標準整合 #region --- TP ERP Request --- public string cbXMLRequest_TP(string strAccess, string strParameter, string strMaster, string strDetail) { string cbXMLRequest_TPRet = default(string); cbXMLRequest_TPRet = "" + '\n'; cbXMLRequest_TPRet += strAccess + '\n'; cbXMLRequest_TPRet += "" + '\n'; cbXMLRequest_TPRet += strParameter + '\n'; cbXMLRequest_TPRet += "" + '\n'; cbXMLRequest_TPRet += "" + '\n'; cbXMLRequest_TPRet += strMaster + '\n'; cbXMLRequest_TPRet += strDetail + '\n'; cbXMLRequest_TPRet += "" + '\n'; cbXMLRequest_TPRet += "" + '\n'; cbXMLRequest_TPRet += "" + '\n'; cbXMLRequest_TPRet += ""; return cbXMLRequest_TPRet; } public string cbXMLAccess_TP(string User = null, string Password = null, string ApplicationName = null, string Source = null, string Oraganization = null, string Language = null, string ERPName = "TIPTOP") { string cbXMLAccess_TPRet = default(string); try { // Authentication User; Password; Connection Application; Source; Organization Name; Local Language // Dim ary As Array = Split(GetAppSettings("ERPSignIn"), ";") // If String.IsNullOrEmpty(ary(0)) = False Then User = ary(0) // If String.IsNullOrEmpty(ary(1)) = False Then Password = ary(1) // If String.IsNullOrEmpty(ary(2)) = False Then ApplicationName = ary(2) // If String.IsNullOrEmpty(ary(3)) = False Then Source = ary(3) // If String.IsNullOrEmpty(ary(4)) = False Then Oraganization = ary(4) // If String.IsNullOrEmpty(ary(5)) = False Then Language = ary(5) // Garu Lu 20120618:自tblSysERPSetting表取得ERP設定 funGetERPSetting(ERPName); if (User == null) User = gERPUser; if (Password == null) Password = gERPPassword; if (ApplicationName == null) ApplicationName = "MES"; if (Source == null) Source = Environment.MachineName; if (Oraganization == null) Oraganization = gERPOraganization; if (Language == null) Language = gERPLanguage; } catch (Exception ex) { throw ex; } // Gary Lu 20120618:Source的IP在此取得,並加上過濾假IP // Dim heserver As Net.IPHostEntry = System.Net.Dns.Resolve(My.Computer.Name) // Dim curAdd As Net.IPAddress // For Each curAdd In heserver.AddressList // If curAdd.ToString.Substring(0, 7) <> "169.254" Then // Source = curAdd.ToString // Exit For // End If // Next cbXMLAccess_TPRet = "" + '\n'; cbXMLAccess_TPRet += "" + '\n'; cbXMLAccess_TPRet += "" + '\n'; cbXMLAccess_TPRet += "" + '\n'; cbXMLAccess_TPRet += "" + '\n'; cbXMLAccess_TPRet += ""; return cbXMLAccess_TPRet; } public string cbXMLParameter_TP(string strRecord) { string cbXMLParameter_TPRet = default(string); cbXMLParameter_TPRet = "" + '\n'; cbXMLParameter_TPRet += strRecord + '\n'; cbXMLParameter_TPRet += ""; return cbXMLParameter_TPRet; } public string cbXMLMaster_TP(string MasterName, string strRecord) { string cbXMLMaster_TPRet = default(string); cbXMLMaster_TPRet = "" + '\n'; cbXMLMaster_TPRet += strRecord + '\n'; cbXMLMaster_TPRet += ""; return cbXMLMaster_TPRet; } public string cbXMLDetail_TP(string DetailName, string strRecord) { string cbXMLDetail_TPRet = default(string); cbXMLDetail_TPRet = "" + '\n'; cbXMLDetail_TPRet += strRecord; cbXMLDetail_TPRet += ""; return cbXMLDetail_TPRet; } public string cbXMLRecord_TP(string strField) { string cbXMLRecord_TPRet = default(string); cbXMLRecord_TPRet = "" + '\n'; cbXMLRecord_TPRet += strField; cbXMLRecord_TPRet += ""; return cbXMLRecord_TPRet; } public string cbXMLField_TP(string name, string value) { string cbXMLField_TPRet = default(string); cbXMLField_TPRet = "" + '\n'; return cbXMLField_TPRet; } #endregion #region --- TP ERP Response --- /// /// 檢查ERP處理後結果: ERP執行狀態 /// /// /// /// public bool chkExecutionStatus_TP(XmlDocument Xmldoc, ref string code, ref string sqlcode, ref string description) { bool chkExecutionStatus_TPRet = default(bool); // xmldoc.DocumentElement("Execution").ChildNodes(0).Attributes("code").Value chkExecutionStatus_TPRet = false; var de = Xmldoc.DocumentElement["Execution"]; if (de == null == true) return chkExecutionStatus_TPRet; for (int i = 0, loopTo = de.ChildNodes.Count - 1; i <= loopTo; i++) { if (de.ChildNodes[i].Name == "Status") { var cn = de.ChildNodes[i]; code = de.ChildNodes[i].Attributes["code"].Value; sqlcode = de.ChildNodes[i].Attributes["sqlcode"].Value; description = de.ChildNodes[i].Attributes["description"].Value; chkExecutionStatus_TPRet = true; } } return chkExecutionStatus_TPRet; } public bool chkResponseContent_TP(XmlDocument Xmldoc, string responseName, ref string responseValue) { bool chkResponseContent_TPRet = default(bool); // xmldoc.DocumentElement("ResponseContent").ChildNodes.Item(0).ChildNodes(0).ChildNodes(0).Attributes("value").Value try { chkResponseContent_TPRet = false; var de = Xmldoc.DocumentElement["ResponseContent"]; if (de == null == true) return chkResponseContent_TPRet; for (int i = 0, loopTo = de.ChildNodes.Count - 1; i <= loopTo; i++) { if (de.ChildNodes.Item(i).Name == "Parameter") { for (int j = 0, loopTo1 = de.ChildNodes.Item(i).ChildNodes.Count - 1; j <= loopTo1; j++) { if (de.ChildNodes.Item(i).ChildNodes[j].Name == "Record") { for (int k = 0, loopTo2 = de.ChildNodes.Item(i).ChildNodes[j].ChildNodes.Count - 1; k <= loopTo2; k++) { if (de.ChildNodes.Item(i).ChildNodes[j].ChildNodes[k].Attributes.Count > 0) { if ((de.ChildNodes.Item(i).ChildNodes[j].ChildNodes[k].Attributes["name"].Value ?? "") == (responseName ?? "")) { responseValue = de.ChildNodes.Item(i).ChildNodes[j].ChildNodes[k].Attributes["value"].Value; } } } } } } } chkResponseContent_TPRet = true; } catch (Exception ex) { chkResponseContent_TPRet = false; } return chkResponseContent_TPRet; } public bool chkResponseContentDocument_TP(XmlDocument Xmldoc, string responseName, ref string[] responseValue) { bool chkResponseContentDocument_TPRet = default(bool); // xmldoc.DocumentElement("ResponseContent").ChildNodes.Item(0).ChildNodes(0).ChildNodes(0).Attributes("value").Value try { chkResponseContentDocument_TPRet = false; var de = Xmldoc.DocumentElement["ResponseContent"]; if (de == null == true) return chkResponseContentDocument_TPRet; for (int i = 0, loopTo = de.ChildNodes.Count - 1; i <= loopTo; i++) { if (de.ChildNodes.Item(i).Name == "Document") { for (int j = 0, loopTo1 = de.ChildNodes.Item(i).ChildNodes.Count - 1; j <= loopTo1; j++) { if (de.ChildNodes.Item(i).ChildNodes[j].Name == "RecordSet") { for (int k = 0, loopTo2 = de.ChildNodes.Item(i).ChildNodes[j].ChildNodes.Count - 1; k <= loopTo2; k++) { if (de.ChildNodes.Item(i).ChildNodes[j].ChildNodes[k].Name == "Master") { for (int l = 0, loopTo3 = de.ChildNodes.Item(i).ChildNodes[j].ChildNodes[k].ChildNodes.Count - 1; l <= loopTo3; l++) { if (de.ChildNodes.Item(i).ChildNodes[j].ChildNodes[k].ChildNodes[l].Name == "Record") { for (int m = 0, loopTo4 = de.ChildNodes.Item(i).ChildNodes[j].ChildNodes[k].ChildNodes[l].ChildNodes.Count - 1; m <= loopTo4; m++) { if (de.ChildNodes.Item(i).ChildNodes[j].ChildNodes[k].ChildNodes[l].ChildNodes[m].Attributes.Count > 0) { if ((de.ChildNodes.Item(i).ChildNodes[j].ChildNodes[k].ChildNodes[l].ChildNodes[m].Attributes["name"].Value ?? "") == (responseName ?? "")) { responseValue[j] = de.ChildNodes.Item(i).ChildNodes[j].ChildNodes[k].ChildNodes[l].ChildNodes[m].Attributes["value"].Value; } } } } } } } } } } } chkResponseContentDocument_TPRet = true; } catch (Exception ex) { chkResponseContentDocument_TPRet = false; } return chkResponseContentDocument_TPRet; } public bool chkResponseContentDocument_TP_Multi(XmlDocument Xmldoc, string[] responseName, ref string[][] responseValue) { bool chkResponseContentDocument_TP_MultiRet = default(bool); // xmldoc.DocumentElement("ResponseContent").ChildNodes.Item(0).ChildNodes(0).ChildNodes(0).Attributes("value").Value int intIndex; try { chkResponseContentDocument_TP_MultiRet = false; var de = Xmldoc.DocumentElement["ResponseContent"]; if (de == null == true) return chkResponseContentDocument_TP_MultiRet; for (int i = 0, loopTo = de.ChildNodes.Count - 1; i <= loopTo; i++) { if (de.ChildNodes.Item(i).Name == "Document") { for (int j = 0, loopTo1 = de.ChildNodes.Item(i).ChildNodes.Count - 1; j <= loopTo1; j++) { if (de.ChildNodes.Item(i).ChildNodes[j].Name == "RecordSet") { for (int k = 0, loopTo2 = de.ChildNodes.Item(i).ChildNodes[j].ChildNodes.Count - 1; k <= loopTo2; k++) { if (de.ChildNodes.Item(i).ChildNodes[j].ChildNodes[k].Name == "Master") { for (int l = 0, loopTo3 = de.ChildNodes.Item(i).ChildNodes[j].ChildNodes[k].ChildNodes.Count - 1; l <= loopTo3; l++) { if (de.ChildNodes.Item(i).ChildNodes[j].ChildNodes[k].ChildNodes[l].Name == "Record") { for (int m = 0, loopTo4 = de.ChildNodes.Item(i).ChildNodes[j].ChildNodes[k].ChildNodes[l].ChildNodes.Count - 1; m <= loopTo4; m++) { if (de.ChildNodes.Item(i).ChildNodes[j].ChildNodes[k].ChildNodes[l].ChildNodes[m].Attributes.Count > 0) { intIndex = Array.IndexOf(responseName, de.ChildNodes.Item(i).ChildNodes[j].ChildNodes[k].ChildNodes[l].ChildNodes[m].Attributes["name"].Value); if (intIndex >= 0) { responseValue[intIndex][j] = de.ChildNodes.Item(i).ChildNodes[j].ChildNodes[k].ChildNodes[l].ChildNodes[m].Attributes["value"].Value; } } } } } } } } } } } chkResponseContentDocument_TP_MultiRet = true; } catch (Exception ex) { chkResponseContentDocument_TP_MultiRet = false; } return chkResponseContentDocument_TP_MultiRet; } #endregion // ======================================================================================================================== // 程式名稱:funCreateWOWorkReportData_TP // 傳入參數:colParameters // 傳回參數:success(成功), fail(失敗) // 用 途:建立工單生產報工單資料 // 撰寫人員:Acer.Wei // 撰寫日期:2011/01/31 // ======================================================================================================================== private object funCreateWOWorkReportData_TP(Collection colParameters = null) { object funCreateWOWorkReportData_TPRet = default(object); var cnnTemp = default(IDbConnection); DbDataReader drTemp; string strSQL; var XmlDoc = new XmlDocument(); //System.Data.OleDb.OleDbDataAdapter daTemp; var CollectionSQL = new Collection(); var colSQL_T2 = new Collection(); var colSQL_T3 = new Collection(); string strAccess = string.Empty; string strParameter = string.Empty; string strMaster = string.Empty; string strDetail = string.Empty; string strTempField = string.Empty; string strTempRecord = string.Empty; var arriveTime = DateTime.Now; string strSheetType = string.Empty; // 報工單別 string strGroupNo = string.Empty; // 異常處理群組 // 2012/09/25, Aaron, 將生產日期改用起訖方式 string strProductionDateFrom = string.Empty; // 生產日期起(如無指定則帶昨天) string strProductionDateEnd = string.Empty; // 生產日期迄(如無指定則帶今天) string strEquipmentNo = string.Empty; // 設備 string strShiftNo = string.Empty; // 班別 string strMONo = string.Empty; // 工單 string auto = "N"; // Request... Y: 建立入庫單後自動確認+過帳, N:建立入庫單後不自動確認過帳 string code = string.Empty; // Response... code:錯誤碼;非0則為錯誤 (function回傳 success 或 fail) string sqlcode = string.Empty; string description = string.Empty; // Response... 錯誤訊息 string responseName = "srf01"; // Request/Response... 報工單單號ERP欄位名稱 string responseValue = string.Empty; // Request/Response... 報工單單號, 成功回傳ERP單號 string costCenter = "N"; // Request... Y:表示整合成本中心;N:表示未整合成本中心 string VirtualEQP = ""; // Request... 整合成本中心時,沒有機台編號的人工作業站帶入的ERP虛擬機台編號 // 2021/03/30 Elvis 0087678: [瑞賢] AUTORUN報工--報工失敗,發送郵件新增提供失敗清單 //var ExcelExp = new Infragistics.Win.UltraWinGrid.ExcelExport.UltraGridExcelExporter(); //var workbook = new Infragistics.Documents.Excel.Workbook(); string ReturnMSG = string.Empty; string strSQL_Field, strSQL_Value; var datNow = DateTime.Now; // 2019/3/20 YuWen SequenceNo增加亂數3碼 string strSequenceNo = Strings.Format(datNow, "yyyyMMddHHmmssffffff") + "_" + Convert.ToInt16(Math.Floor((1 - 999 + 1) * VBMath.Rnd()) + 999d).ToString("000"); // 2019/6/11,Ning, WorkReportID string strWorkReportID = Strings.Format(datNow, "yyyyMMddHHmmssfff"); do { try { // ParameterXX參數說明 // 01 報工單單別 // 02 使用者群組 // 03 生產日期[yyyy/MM/dd](如無指定則用昨天) // 04 ERP自動確認(如無指定則用N) // 2012/09/25, Aaron // 05 整合成本中心 Y:表示整合成本中心;N:表示未整合成本中心;未設定預設值為N // 06 整合成本中心時,純人工作業站沒有機台,回報人時需所指定ERP虛擬機台編號,如果未設定,ERP將抓取ERP工單上的成本中心欄位作為歸屬機台。 // Parameter01為傳入參數,作為SheetType,若無此值則不進行下面的程式 if (colParameters["Parameter01"] == null || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter01"])))) { funCreateWOWorkReportData_TPRet = "SheetType not found!!!(Parameter 01)"; break; } else { strSheetType = Strings.Trim(Conversions.ToString(colParameters["Parameter01"])); } // Parameter02為傳入參數,作為GroupNo,若無此值則不進行下面的程式 if (colParameters["Parameter02"] == null || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter02"])))) { funCreateWOWorkReportData_TPRet = "User GroupNo not found!!!(Parameter 02)"; break; } else { strGroupNo = Strings.Trim(Conversions.ToString(colParameters["Parameter02"])); } // Parameter03為傳入參數,作為ProductionDate,若無此值則用昨天當日期 if (colParameters["Parameter03"] == null || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter03"])))) { strProductionDateFrom = Strings.Format(datNow.AddDays(-1), "yyyy/MM/dd"); strProductionDateEnd = Strings.Format(datNow, "yyyy/MM/dd"); } else { do { try { strProductionDateFrom = Strings.Format(DateTime.Parse(colParameters["Parameter03"].ToString().Trim()), "yyyy/MM/dd"); strProductionDateEnd = Strings.Format(DateTime.Parse(colParameters["Parameter03"].ToString().Trim()).AddDays(1d), "yyyy/MM/dd"); } catch (Exception ex) { funCreateWOWorkReportData_TPRet = "Parse ProductionDate fail(yyyy/MM/dd)!!!(Parameter 03)"; break; } } while (false); } // Parameter04為傳入參數,作為自動確認,若無此值則用N if (colParameters["Parameter04"] == null || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter04"])))) { auto = "N"; } else if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(colParameters["Parameter04"].ToString().ToUpper(), "Y", false)) || Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(colParameters["Parameter04"].ToString().ToUpper(), "N", false))) { auto = colParameters["Parameter04"].ToString().ToUpper(); } else { funCreateWOWorkReportData_TPRet = "Parameter 04 not Y or N"; break; } // 2012/09/25, Aaron // Parameter05為傳入參數,作為整合成本中心,若無此值則用N if (colParameters["Parameter05"] == null || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter05"])))) { costCenter = "N"; } else if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(colParameters["Parameter05"].ToString().ToUpper(), "Y", false)) || Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(colParameters["Parameter05"].ToString().ToUpper(), "N", false))) { costCenter = colParameters["Parameter05"].ToString().ToUpper(); } else { funCreateWOWorkReportData_TPRet = "Parameter 05 not Y or N"; break; } // Parameter06為傳入參數,作為defVirtualEQP if (colParameters["Parameter06"] == null || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter06"])))) { VirtualEQP = ""; } else { VirtualEQP = colParameters["Parameter06"].ToString().Trim().ToUpper(); } cnnTemp = CreateConnection(strConnectionString); // 取得設備第1筆資料 strSQL = "Select * From tblEQPEquipmentBasis"; //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (drTemp.Read()) { strEquipmentNo = Conversions.ToString(drTemp["EquipmentNo"]); } drTemp.Close(); //cmmTemp.Dispose(); if (string.IsNullOrEmpty(strEquipmentNo) || string.IsNullOrEmpty(strEquipmentNo)) { funCreateWOWorkReportData_TPRet = "EquipmentNo not found!!!"; break; } // 取得班別第1筆資料 strSQL = "Select * From tblUSRShiftBasis"; //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (drTemp.Read()) { strShiftNo = Conversions.ToString(drTemp["ShiftNo"]); } drTemp.Close(); //cmmTemp.Dispose(); if (string.IsNullOrEmpty(strShiftNo) || string.IsNullOrEmpty(strShiftNo)) { funCreateWOWorkReportData_TPRet = "ShiftNo not found!!!"; break; } // 2017/12/27,sammi.MEStoERP生產報工抛轉資料,1:平攤(tblWIPCont_Resource_Share),2:原始(未平攤,tblWIPCont_Resource) string tblCont_Resource = "tblWIPCont_Resource_Share "; bool blnReCalResource = true; bool blnShare = true; strSQL = "Select ParameterValue From tblSYSParameter " + " Where ParameterType='SysInfo' " + " And ParameterNo='ERPWOWORKREPORTDATA' "; //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (drTemp.Read()) { if (drTemp["ParameterValue"].ToString() == "2") { tblCont_Resource = "tblWIPCont_Resource"; blnReCalResource = false; blnShare = false; } } drTemp.Close(); //cmmTemp.Dispose(); // 2018/07/19 Lena, 增加系統參數,判定是否需要重匯機時、人時, 0:No、1:Yes. // 當為平攤時, 必須再參考系統參數中是否有設定要重匯機時 if (blnReCalResource) { strSQL = "Select ParameterValue From tblSYSParameter " + " Where ParameterType='SysInfo' " + " And ParameterNo='ERPWOWorkReportReCalResource' "; //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (drTemp.Read()) { if (drTemp["ParameterValue"].ToString() == "0") { blnReCalResource = false; } } drTemp.Close(); //cmmTemp.Dispose(); } if (blnReCalResource) { // 機時,人時 var colParameters_Resource = new Collection(); colParameters_Resource.Add(strProductionDateFrom, "Parameter01"); // funCreateWOWorkReportData_T100,TP,WF,call funShareEQPTime/funShareEMPTime,發Mail通知,統一由主funciton發出. // colParameters_Resource.Add(strGroupNo, "Parameter02") colParameters_Resource.Add("", "Parameter02"); string strResult_EQP; strResult_EQP = Conversions.ToString(funShareEQPTime(colParameters_Resource)); if (strResult_EQP != "success") { funCreateWOWorkReportData_TPRet = "funShareEQPTime:" + strResult_EQP; break; } string strResult_EMP; strResult_EMP = Conversions.ToString(funShareEMPTime(colParameters_Resource)); if (strResult_EMP != "success") { funCreateWOWorkReportData_TPRet = "funShareEMPTime:" + strResult_EMP; break; } } // ---- InXml ----- // strAccess = cbXMLAccess_TP(); // strTempField = cbXMLField_TP("status", auto); strTempField += cbXMLField_TP("costcenter", costCenter); strTempRecord = cbXMLRecord_TP(strTempField); strParameter = cbXMLParameter_TP(strTempRecord); int intItemNo = 1; decimal decT_EQP, decT_EMP; // 各機台的人時工時 if (costCenter == "N") // 2012/09/25, Aaron, 依工單報工,機台生產線欄位為設備主檔第一筆資料,僅為了填入值讓ERP接受。 { // strTempField = cbXMLField_TP(responseName, strSheetType); // 報工單別 strTempField += cbXMLField_TP("srf02", Strings.Format(datNow, "yyyy/MM/dd")); // 報工日期 strTempField += cbXMLField_TP("srf03", strEquipmentNo); // 機台生產線 strTempField += cbXMLField_TP("srf04", strShiftNo); // 班別 strTempField += cbXMLField_TP("srf05", strProductionDateFrom); // 生產日期 strTempField += cbXMLField_TP("srf07", "2"); // 報工類別(1:重複性生產報工;2:工單生產報工) strTempRecord = cbXMLRecord_TP(strTempField); strMaster = cbXMLMaster_TP("srf_file", strTempRecord); // strTempRecord = string.Empty; // 2012/09/25, Aaron, 修正原本只能在Oracle上Run的語法以及Where日期條件修正支援Index作法。 // 2019/6/11,Ning,加上ERPFlag=0的條件 if (strDataBaseType != "oracle") { strSQL = " Select distinct CONVERT(char(10), EventTime, 111) EventTime, MONo, "; strSQL += "ISNULL((Select Sum(ResValue) From " + tblCont_Resource + " Where ResClass=0 And EventTime >= '" + strProductionDateFrom + "' And EventTime < '" + strProductionDateEnd + "' And MONo=A.MONo),0) EMP, "; strSQL += "ISNULL((Select Sum(ResValue) From " + tblCont_Resource + " Where ResClass=1 And EventTime >= '" + strProductionDateFrom + "' And EventTime < '" + strProductionDateEnd + "' And MONo=A.MONo),0) EQP "; strSQL += "From " + tblCont_Resource + " A "; strSQL += "Where EventTime >= '" + strProductionDateFrom + "' And EventTime < '" + strProductionDateEnd + "'"; strSQL += " And IsNull(A.ERPFlag,0) = 0"; } else { strSQL = " Select distinct To_Char(EventTime,'YYYY/MM/DD') EventTime, MONo, "; strSQL += "NVL((Select Sum(ResValue) From " + tblCont_Resource + " Where ResClass=0 And EventTime >= To_Date('" + strProductionDateFrom + "','YYYY/MM/DD') AND EventTime < To_Date('" + strProductionDateEnd + "','YYYY/MM/DD') And MONo=A.MONo),0) EMP, "; strSQL += "NVL((Select Sum(ResValue) From " + tblCont_Resource + " Where ResClass=1 And EventTime >= To_Date('" + strProductionDateFrom + "','YYYY/MM/DD') AND EventTime < To_Date('" + strProductionDateEnd + "','YYYY/MM/DD') And MONo=A.MONo),0) EQP "; strSQL += "From " + tblCont_Resource + " A "; strSQL += "Where EventTime >= To_Date('" + strProductionDateFrom + "','YYYY/MM/DD') AND EventTime < To_Date('" + strProductionDateEnd + "','YYYY/MM/DD') "; strSQL += " And Nvl(A.ERPFlag,0) = 0"; } //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); strTempField = ""; var colSQL_Log = new Collection(); decT_EMP = 0m; decT_EQP = 0m; while (drTemp.Read()) { strTempField = cbXMLField_TP("srg01", strSheetType); // 報工單別 strTempField += cbXMLField_TP("srg05", "0"); // 良品數 strTempField += cbXMLField_TP("srg06", "0"); // 不良品數 strTempField += cbXMLField_TP("srg07", "0"); // 報廢數量 strTempField += cbXMLField_TP("srg10", Conversions.ToString(drTemp["EMP"])); // 工時(分) strTempField += cbXMLField_TP("srg13", "1"); // 1:主產品 ; 2:聯產品 ; 3:副產品 ; 4:再生產品 strTempField += cbXMLField_TP("srg15", "Y"); // 檢驗否(y/n) strTempField += cbXMLField_TP("srg16", Conversions.ToString(drTemp["MONo"])); // 工單編號 strTempField += cbXMLField_TP("srg19", Conversions.ToString(drTemp["EQP"])); // 機時(分) strTempRecord += cbXMLRecord_TP(strTempField) + '\n'; strMONo = Conversions.ToString(strMONo + Operators.AddObject(Constants.vbCrLf, drTemp["MONo"])); // 2017/12/29,sammi.紀錄抛轉資料. // tblERPWorkReportDetail_TP strSQL_Field = "Insert into tblERPWorkReportDetail_TP " + " (SequenceNo,ItemNo,srg01,srg05,srg06,srg07,srg10,srg13,srg15,srg16,srg19 "; strSQL_Value = Conversions.ToString(" Values ('" + strSequenceNo + "'," + intItemNo + ",'" + strSheetType + "',0,0,0," + drTemp["EMP"] + ",1,'Y','" + drTemp["MONo"] + "','" + drTemp["EQP"] + "'"); strSQL = strSQL_Field + ")" + strSQL_Value + ")"; colSQL_Log.Add(strSQL); // 2019/6/11, Ning, 紀錄報工單拋轉明細資料(T3) strSQL = Conversions.ToString("Insert Into tblERPWorkRPT_Detail (WorkReportID, ItemNo, EquipmentNo, MONo, EQP_ResValue, EMP_ResValue, SequenceNo)" + " Values ('" + strWorkReportID + "'," + intItemNo + ",'" + strEquipmentNo + "','" + drTemp["MONo"] + "'," + drTemp["EQP"] + "," + drTemp["EMP"] + ",'" + strSequenceNo + "')"); colSQL_T3.Add(strSQL); // 2019/6/13, Ning, 加總人時機時, 以紀錄報工單拋轉設備彙整資料表(T2) decT_EMP = Conversions.ToDecimal(Operators.AddObject(decT_EMP, drTemp["EMP"])); decT_EQP = Conversions.ToDecimal(Operators.AddObject(decT_EQP, drTemp["EQP"])); intItemNo += 1; } drTemp.Close(); if (string.IsNullOrEmpty(strTempField)) { funCreateWOWorkReportData_TPRet = strProductionDateFrom + " Warning!!! No transaction data found!!!"; return funCreateWOWorkReportData_TPRet; } strDetail = cbXMLDetail_TP("srg_file", strTempRecord); InXml = ""; InXml = cbXMLRequest_TP(strAccess, strParameter, strMaster, strDetail); // ----- Call ERP Web Service ----- OutXml = ""; // Kevin 15/05/12,依照ERP整合設定,如ERP版本是設定GP3.X則要使用RPC格式的參考 if (gERPVersion == "GP 3.X") { using (var ws = new wsERP_TP_RPC.TIPTOPServiceGateWay()) { ws.Url = gERPWSURL; OutXml = ws.CreateWOWorkReportData(InXml); } } else { using (var ws = new wsERP_TP.TIPTOPServiceGateWay()) { ws.Url = gERPWSURL; OutXml = ws.CreateWOWorkReportData(InXml); } } XmlDoc.LoadXml(OutXml); // ----- 取得ERP執行結果 code, sqlcode, description ----- chkExecutionStatus_TP(XmlDoc, ref code, ref sqlcode, ref description); // ----- 取得ERP入庫單號 ----- chkResponseContent_TP(XmlDoc, responseName, ref responseValue); // 2013/03/08, Aaron, 執行ERP交易完畢寫入Log // 紀錄TransactionLog() // addTransactionLog(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "MES", "WorkReportData_TP", My.Computer.Name, "AutoRun", arriveTime.ToString("yyyy/MM/dd HH:mm:ss"), code, responseValue, "CreateWOWorkReportData") if (string.IsNullOrEmpty(code) == true) { code = "fail"; } else if (code == "0") code = "success"; else code = "fail"; // Edison 2019/03/22 修正log紀錄位置 string argstrException = null; modAutoRunLibrary.addTransactionLog(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "MES", "WorkReportData_TP", Environment.MachineName, "AutoRun", arriveTime.ToString("yyyy/MM/dd HH:mm:ss"), code, responseValue, "CreateWOWorkReportData", strException: argstrException); if (code == "success") { // 2017/12/29,sammi.紀錄抛轉資料. // tblERPWorkReport_TP strSQL_Field = "Insert into tblERPWorkReport_TP " + " (SequenceNo,srf01,srf02,srf03,srf04,srf05,srf07,ERPNo,CreateDate,StartDate,EndDate "; strSQL_Value = " Values ('" + strSequenceNo + "','" + strSheetType + "','" + Strings.Format(datNow, "yyyy/MM/dd") + "','" + strEquipmentNo + "','" + strShiftNo + "','" + strProductionDateFrom + "','2','" + responseValue + "', To_Date('" + Strings.Format(datNow, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')," + " To_Date('" + Strings.Format(Conversions.ToDate(strProductionDateFrom), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')," + " To_Date('" + Strings.Format(Conversions.ToDate(strProductionDateEnd), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; strSQL = strSQL_Field + ")" + strSQL_Value + ")"; colSQL_Log.Add(strSQL); // 以一次抛轉為單位,直接先寫入. ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, colSQL_Log); // 2019/6/13, Ning, 記錄T2 strSQL = "Insert Into tblERPWorkRPT_EQPSummary (WorkReportID, EquipmentNo, EQP_ResValue, EMP_ResValue, ERPFlag, ERPNo)" + " Values('" + strWorkReportID + "','" + strEquipmentNo + "'," + decT_EQP + "," + decT_EMP + ",1,'" + responseValue + "')"; colSQL_T2.Add(strSQL); } else { funCreateWOWorkReportData_TPRet = "fail;ERP Return Message:" + description + ""; break; } } else // 2012/09/25, Aaron, 整合成本中心,依設備、工單報工。 { // 2012/09/25, Aaron, SQL語法說明:先依日期取出人時部分,同一作業加工紀錄的人時必須先Group By,因為有可能有多人加工 // 人時彙總完後,再判斷是否為多機台加工,如果是1台以上機台,人時必須均分到各機台上 // 如果是沒有機台純人工, ERP收到資料後會以ERP工單單頭的成本中心欄位作為成本中心歸屬,後再取出機時Join, // 2017/11/23 KunYuan:若為虛擬機,可能有工時/機時皆為0之狀況,故需加判工時、機時其中一者>0才拋轉ERP,否則會違反ERP規則導致報錯 ↓ // If strDataBaseType <> "oracle" Then // strSQL = " SELECT F.EVENTTIME, F.EQUIPMENTNO, F.MONO, SUM(F.EQP) EQP, ROUND(SUM(F.EMP), 2) EMP FROM " // strSQL += "( " // strSQL += "SELECT A.EVENTTIME, ISNULL(B.RESITEM,'" & VirtualEQP & "') EQUIPMENTNO, A.MONO, SUM(ISNULL(B.RESVALUE,0)) EQP, " // strSQL += "(SUM(ISNULL(A.RESVALUE,0)) / IIF((SELECT COUNT(*) FROM TBLWIPCONT_RESOURCE C WHERE C.LOGGROUPSERIAL = A.LOGGROUPSERIAL AND C.RESCLASS = 1) = 0, 1, (SELECT COUNT(*) FROM TBLWIPCONT_RESOURCE C WHERE C.LOGGROUPSERIAL = A.LOGGROUPSERIAL AND C.RESCLASS = 1))) EMP " // strSQL += "FROM (SELECT CONVERT(CHAR(10), EVENTTIME, 111) EVENTTIME, A.MONO, A.LOGGROUPSERIAL, SUM(A.RESVALUE) RESVALUE FROM TBLWIPCONT_RESOURCE A WHERE A.RESCLASS = 0 AND A.EVENTTIME >= '" & strProductionDateFrom & "' AND A.EVENTTIME < '" & strProductionDateEnd & "' GROUP BY CONVERT(CHAR(10), EVENTTIME, 111), A.MONO, A.LOGGROUPSERIAL) A " // strSQL += "LEFT JOIN TBLWIPCONT_RESOURCE B ON A.LOGGROUPSERIAL = B.LOGGROUPSERIAL AND B.RESCLASS = 1 " // strSQL += "GROUP BY A.EVENTTIME, B.RESITEM, A.MONO, A.LOGGROUPSERIAL " // strSQL += ") F " // strSQL += "GROUP BY F.EVENTTIME, F.EQUIPMENTNO, F.MONO " // strSQL += "ORDER BY F.EVENTTIME, F.EQUIPMENTNO, F.MONO " // Else // strSQL = " SELECT A.EVENTTIME, NVL(B.RESITEM, '" & VirtualEQP & "') AS EQUIPMENTNO, A.MONO, " // strSQL += "SUM(NVL(B.RESVALUE,0)) EQP, " // strSQL += "ROUND(SUM(CASE WHEN (SELECT COUNT(*) FROM TBLWIPCONT_RESOURCE C WHERE C.LOGGROUPSERIAL = A.LOGGROUPSERIAL AND C.RESCLASS = 1) > 1 THEN A.RESVALUE / (SELECT COUNT(*) FROM TBLWIPCONT_RESOURCE C WHERE C.LOGGROUPSERIAL = A.LOGGROUPSERIAL AND C.RESCLASS = 1) ELSE A.RESVALUE END),2) AS EMP " // strSQL += "FROM (SELECT TO_CHAR(A.EVENTTIME,'YYYY/MM/DD') EVENTTIME, A.MONO, A.LOGGROUPSERIAL, SUM(A.RESVALUE) RESVALUE FROM TBLWIPCONT_RESOURCE A WHERE A.RESCLASS = 0 AND A.EVENTTIME >= TO_DATE('" & strProductionDateFrom & "','YYYY/MM/DD') AND A.EVENTTIME < TO_DATE('" & strProductionDateEnd & "','YYYY/MM/DD') GROUP BY TO_CHAR(A.EVENTTIME,'YYYY/MM/DD'), A.MONO, A.LOGGROUPSERIAL) A " // strSQL += "LEFT JOIN TBLWIPCONT_RESOURCE B ON A.LOGGROUPSERIAL = B.LOGGROUPSERIAL AND B.RESCLASS = 1 " // strSQL += "GROUP BY A.EVENTTIME, B.RESITEM, A.MONO " // strSQL += "ORDER BY A.EVENTTIME, B.RESITEM, A.MONO " // End If // 2021/01/12 Grace Mantis 85731: 須排除已拋轉資料, 否則會重複拋送 if (strDataBaseType != "oracle") { strSQL = " SELECT F.EVENTTIME, F.EQUIPMENTNO, F.MONO, SUM(F.EQP) EQP, ROUND(SUM(F.EMP), 2) EMP FROM "; strSQL += "( "; strSQL += "SELECT A.EVENTTIME, ISNULL(B.RESITEM,'" + VirtualEQP + "') EQUIPMENTNO, A.MONO, SUM(ISNULL(B.RESVALUE,0)) EQP, "; strSQL += "(SUM(ISNULL(A.RESVALUE,0)) / IIF((SELECT COUNT(*) FROM " + tblCont_Resource + " C WHERE C.LOGGROUPSERIAL = A.LOGGROUPSERIAL AND C.RESCLASS = 1) = 0, 1, (SELECT COUNT(*) FROM " + tblCont_Resource + " C WHERE C.LOGGROUPSERIAL = A.LOGGROUPSERIAL AND C.RESCLASS = 1))) EMP "; strSQL += "FROM (SELECT CONVERT(CHAR(10), EVENTTIME, 111) EVENTTIME, A.MONO, A.LOGGROUPSERIAL, SUM(A.RESVALUE) RESVALUE FROM " + tblCont_Resource + " A WHERE A.RESCLASS = 0 And NVL (ERPFlag, 0) = 0 AND A.EVENTTIME >= '" + strProductionDateFrom + "' AND A.EVENTTIME < '" + strProductionDateEnd + "' GROUP BY CONVERT(CHAR(10), EVENTTIME, 111), A.MONO, A.LOGGROUPSERIAL) A "; strSQL += "LEFT JOIN " + tblCont_Resource + " B ON A.LOGGROUPSERIAL = B.LOGGROUPSERIAL AND B.RESCLASS = 1 "; strSQL += " Where IsNull(B.ERPFlag,0) = 0 "; strSQL += "GROUP BY A.EVENTTIME, B.RESITEM, A.MONO, A.LOGGROUPSERIAL "; strSQL += ") F WHERE (EQP > 0 OR EMP > 0) "; strSQL += "GROUP BY F.EVENTTIME, F.EQUIPMENTNO, F.MONO "; strSQL += "ORDER BY F.EVENTTIME, F.EQUIPMENTNO, F.MONO "; } else { strSQL = "SELECT Z.* FROM ( "; strSQL += " SELECT A.EVENTTIME, NVL(B.RESITEM, '" + VirtualEQP + "') AS EQUIPMENTNO, A.MONO, "; strSQL += "SUM(NVL(B.RESVALUE,0)) EQP, "; strSQL += "ROUND(SUM(CASE WHEN (SELECT COUNT(*) FROM " + tblCont_Resource + " C WHERE C.LOGGROUPSERIAL = A.LOGGROUPSERIAL AND C.RESCLASS = 1) > 1 THEN A.RESVALUE / (SELECT COUNT(*) FROM " + tblCont_Resource + " C WHERE C.LOGGROUPSERIAL = A.LOGGROUPSERIAL AND C.RESCLASS = 1) ELSE A.RESVALUE END),2) AS EMP "; strSQL += "FROM (SELECT TO_CHAR(A.EVENTTIME,'YYYY/MM/DD') EVENTTIME, A.MONO, A.LOGGROUPSERIAL, SUM(A.RESVALUE) RESVALUE FROM " + tblCont_Resource + " A WHERE A.RESCLASS = 0 And NVL (ERPFlag, 0) = 0 AND A.EVENTTIME >= TO_DATE('" + strProductionDateFrom + "','YYYY/MM/DD') AND A.EVENTTIME < TO_DATE('" + strProductionDateEnd + "','YYYY/MM/DD') GROUP BY TO_CHAR(A.EVENTTIME,'YYYY/MM/DD'), A.MONO, A.LOGGROUPSERIAL) A "; strSQL += "LEFT JOIN " + tblCont_Resource + " B ON A.LOGGROUPSERIAL = B.LOGGROUPSERIAL AND B.RESCLASS = 1 "; strSQL += " Where Nvl(B.ERPFlag,0) = 0 "; strSQL += "GROUP BY A.EVENTTIME, B.RESITEM, A.MONO "; strSQL += "ORDER BY A.EVENTTIME, B.RESITEM, A.MONO "; strSQL += ") Z WHERE (Z.EQP > 0 OR Z.EMP > 0) "; } // 2017/11/23 KunYuan:若為虛擬機,可能有工時/機時皆為0之狀況,故需加判工時、機時其中一者>0才拋轉ERP,否則會違反ERP規則導致報錯 ↑ //cmmTemp = new IDbCommand(strSQL, cnnTemp); //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp); var dsTemp = new DataSet(); //daTemp.Fill(dsTemp, "costCenter"); //daTemp.Dispose(); //cmmTemp.Dispose(); ExecuteSQLQuery_Adapter(strSQL, dsTemp, "costCenter", cnnTemp); strEquipmentNo = ""; if (dsTemp.Tables["costCenter"].Rows.Count > 0) { var aryEquipmentNo = new ArrayList(); // 2020/12/31 Grace 若參數6有設定虛擬機, 設備資料會包含 var aryMONo = new ArrayList(); // strMONo = dsTemp.Tables("MONO").ToString '2021/03/30 Elvis 0087678: [瑞賢] AUTORUN報工--報工失敗,發送郵件新增提供失敗清單 STAR for (int i = 0, loopTo = dsTemp.Tables["costCenter"].Rows.Count - 1; i <= loopTo; i++) { if (aryEquipmentNo.IndexOf(dsTemp.Tables["costCenter"].Rows[i]["EQUIPMENTNO"].ToString()) == -1) { aryEquipmentNo.Add(dsTemp.Tables["costCenter"].Rows[i]["EQUIPMENTNO"].ToString()); } if (aryMONo.IndexOf(dsTemp.Tables["costCenter"].Rows[i]["MONo"].ToString()) == -1) { if (string.IsNullOrEmpty(strMONo)) { strMONo = dsTemp.Tables["costCenter"].Rows[i]["MONo"].ToString(); } else { strMONo = strMONo + "," + dsTemp.Tables["costCenter"].Rows[i]["MONo"].ToString(); } aryMONo.Add(dsTemp.Tables["costCenter"].Rows[i]["MONo"].ToString()); } } // 進行拋轉之前,先呼叫EEP,檢查預計要拋轉的設備編號是否存在於ERP,不存在就中止拋轉 var eci = new string[1]; bool exitTry = false; for (int i = 0, loopTo1 = aryEquipmentNo.Count - 1; i <= loopTo1; i++) { if (!string.IsNullOrEmpty(aryEquipmentNo[i].ToString())) { InXml = ""; InXml = cbXMLRequest_TP(strAccess, cbXMLParameter_TP(cbXMLRecord_TP(cbXMLField_TP("condition", "eci01 = '" + aryEquipmentNo[i].ToString() + "'"))), "", ""); // ----- Call ERP Web Service ----- OutXml = ""; // Kevin 15/05/12,依照ERP整合設定,如ERP版本是設定GP3.X則要使用RPC格式的參考 if (gERPVersion == "GP 3.X") { using (var ws = new wsERP_TP_RPC.TIPTOPServiceGateWay()) { ws.Url = gERPWSURL; OutXml = ws.GetMachineData(InXml); } } else { using (var ws = new wsERP_TP.TIPTOPServiceGateWay()) { ws.Url = gERPWSURL; OutXml = ws.GetMachineData(InXml); } } XmlDoc.LoadXml(OutXml); eci[0] = ""; if (chkResponseContentDocument_TP(XmlDoc, "eci01", ref eci) == false || string.IsNullOrEmpty(eci[0])) { funCreateWOWorkReportData_TPRet = "ERP Equipment Not Found! (" + aryEquipmentNo[i].ToString() + ")"; exitTry = true; break; } } } if (exitTry) { break; } bool exitTry1 = false; for (int i = 0, loopTo2 = aryEquipmentNo.Count - 1; i <= loopTo2; i++) { // Reset var colSQL_Log = new Collection(); colSQL_T2 = new Collection(); colSQL_T3 = new Collection(); CollectionSQL = new Collection(); datNow = DateTime.Now; intItemNo = 1; decT_EMP = 0m; decT_EQP = 0m; // 2019/3/20 YuWen SequenceNo增加亂數3碼 strSequenceNo = Strings.Format(datNow, "yyyyMMddHHmmssffffff") + "_" + Convert.ToInt16(Math.Floor((1 - 999 + 1) * VBMath.Rnd()) + 999d).ToString("000"); // strTempField = cbXMLField_TP(responseName, strSheetType); // 報工單別 strTempField += cbXMLField_TP("srf02", Strings.Format(datNow, "yyyy/MM/dd")); // 報工日期 strTempField += cbXMLField_TP("srf03", Conversions.ToString(aryEquipmentNo[i])); // 機台生產線 strTempField += cbXMLField_TP("srf04", strShiftNo); // 班別 strTempField += cbXMLField_TP("srf05", strProductionDateFrom); // 生產日期 strTempField += cbXMLField_TP("srf07", "2"); // 報工類別(1:重複性生產報工;2:工單生產報工) strTempRecord = cbXMLRecord_TP(strTempField); strMaster = cbXMLMaster_TP("srf_file", strTempRecord); // strTempRecord = string.Empty; if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(aryEquipmentNo[i], "", false))) { dsTemp.Tables["costCenter"].DefaultView.RowFilter = "EquipmentNo is Null "; } else { dsTemp.Tables["costCenter"].DefaultView.RowFilter = Conversions.ToString("EquipmentNo = '" + aryEquipmentNo[i] + "'"); } strEquipmentNo = Conversions.ToString(strEquipmentNo + Operators.AddObject(Constants.vbCrLf, aryEquipmentNo[i])); for (int j = 0, loopTo3 = dsTemp.Tables["costCenter"].DefaultView.Count - 1; j <= loopTo3; j++) { // 2017/11/23 KunYuan:加判工時、機時其中一者>0才拋轉ERP,否則會違反ERP規則導致報錯 if (Conversions.ToDecimal(dsTemp.Tables["costCenter"].DefaultView[j]["EMP"]) == 0m & Conversions.ToDecimal(dsTemp.Tables["costCenter"].DefaultView[j]["EQP"]) == 0m) { continue; } strTempField = cbXMLField_TP("srg01", strSheetType); // 報工單別 strTempField += cbXMLField_TP("srg05", "0"); // 良品數 strTempField += cbXMLField_TP("srg06", "0"); // 不良品數 strTempField += cbXMLField_TP("srg07", "0"); // 報廢數量 strTempField += cbXMLField_TP("srg10", Conversions.ToString(dsTemp.Tables["costCenter"].DefaultView[j]["EMP"])); // 工時(分) strTempField += cbXMLField_TP("srg13", "1"); // 1:主產品 ; 2:聯產品 ; 3:副產品 ; 4:再生產品 strTempField += cbXMLField_TP("srg15", "Y"); // 檢驗否(y/n) strTempField += cbXMLField_TP("srg16", Conversions.ToString(dsTemp.Tables["costCenter"].DefaultView[j]["MONo"])); // 工單編號 strTempField += cbXMLField_TP("srg19", Conversions.ToString(dsTemp.Tables["costCenter"].DefaultView[j]["EQP"])); // 機時(分) strTempRecord += cbXMLRecord_TP(strTempField) + '\n'; // 2017/12/29,sammi.紀錄抛轉資料. // tblERPWorkReportDetail_TP strSQL_Field = "Insert into tblERPWorkReportDetail_TP " + " (SequenceNo,ItemNo,srg01,srg05,srg06,srg07,srg10,srg13,srg15,srg16,srg19 "; strSQL_Value = Conversions.ToString(" Values ('" + strSequenceNo + "'," + intItemNo + ",'" + strSheetType + "',0,0,0," + dsTemp.Tables["costCenter"].DefaultView[j]["EMP"] + ",1,'Y','" + dsTemp.Tables["costCenter"].DefaultView[j]["MONo"] + "','" + dsTemp.Tables["costCenter"].DefaultView[j]["EQP"] + "'"); strSQL = strSQL_Field + ")" + strSQL_Value + ")"; colSQL_Log.Add(strSQL); if (Conversions.ToBoolean(Operators.ConditionalCompareObjectNotEqual(aryEquipmentNo[i], "", false))) { // 2019/6/11, Ning, 紀錄報工單拋轉明細資料 strSQL = Conversions.ToString("Insert Into tblERPWorkRPT_Detail (WorkReportID, ItemNo, EquipmentNo, MONo, EQP_ResValue, EMP_ResValue, SequenceNo)" + " Values ('" + strWorkReportID + "'," + intItemNo + ",'" + aryEquipmentNo[i] + "','" + dsTemp.Tables["costCenter"].DefaultView[j]["MONo"] + "'," + dsTemp.Tables["costCenter"].DefaultView[j]["EQP"] + "," + dsTemp.Tables["costCenter"].DefaultView[j]["EMP"] + ",'" + strSequenceNo + "')"); colSQL_T3.Add(strSQL); } // 2019/6/13, Ning, 加總人時機時, 以紀錄報工單拋轉設備彙整資料表 decT_EMP = Conversions.ToDecimal(Operators.AddObject(decT_EMP, dsTemp.Tables["costCenter"].DefaultView[j]["EMP"])); decT_EQP = Conversions.ToDecimal(Operators.AddObject(decT_EQP, dsTemp.Tables["costCenter"].DefaultView[j]["EQP"])); intItemNo += 1; } if (string.IsNullOrEmpty(strTempField)) { funCreateWOWorkReportData_TPRet = strProductionDateFrom + " Warning!!! No transaction data found!!!"; return funCreateWOWorkReportData_TPRet; } strDetail = cbXMLDetail_TP("srg_file", strTempRecord); InXml = ""; InXml = cbXMLRequest_TP(strAccess, strParameter, strMaster, strDetail); // ----- Call ERP Web Service ----- OutXml = ""; // Kevin 15/05/12,依照ERP整合設定,如ERP版本是設定GP3.X則要使用RPC格式的參考 // 一個機台拋一筆單頭, 一工單一筆單身 if (gERPVersion == "GP 3.X") { using (var ws = new wsERP_TP_RPC.TIPTOPServiceGateWay()) { ws.Url = gERPWSURL; OutXml = ws.CreateWOWorkReportData(InXml); } } else { using (var ws = new wsERP_TP.TIPTOPServiceGateWay()) { ws.Url = gERPWSURL; OutXml = ws.CreateWOWorkReportData(InXml); } } XmlDoc.LoadXml(OutXml); // ----- 取得ERP執行結果 code, sqlcode, description ----- chkExecutionStatus_TP(XmlDoc, ref code, ref sqlcode, ref description); // ----- 取得ERP入庫單號 ----- chkResponseContent_TP(XmlDoc, responseName, ref responseValue); // 2013/03/08, Aaron, 執行ERP交易完畢寫入Log // 紀錄TransactionLog() // addTransactionLog(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "MES", "WorkReportData_TP", My.Computer.Name, "AutoRun", arriveTime.ToString("yyyy/MM/dd HH:mm:ss"), code, responseValue, "CreateWOWorkReportData") if (string.IsNullOrEmpty(code) == true) { code = "fail"; } else if (code == "0") code = "success"; else code = "fail"; // Edison 2019/03/22 修正log紀錄位置 string argstrException1 = null; modAutoRunLibrary.addTransactionLog(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "MES", "WorkReportData_TP", Environment.MachineName, "AutoRun", arriveTime.ToString("yyyy/MM/dd HH:mm:ss"), code, responseValue, "CreateWOWorkReportData", strException: argstrException1); if (code == "success") { // 2017/12/29,sammi.紀錄抛轉資料. // tblERPWorkReport_TP strSQL_Field = "Insert into tblERPWorkReport_TP " + " (SequenceNo,srf01,srf02,srf03,srf04,srf05,srf07,ERPNo,CreateDate,StartDate,EndDate "; strSQL_Value = Conversions.ToString(" Values ('" + strSequenceNo + "','" + strSheetType + "','" + Strings.Format(datNow, "yyyy/MM/dd") + "','" + aryEquipmentNo[i] + "','" + strShiftNo + "','" + strProductionDateFrom + "','2','" + responseValue + "', To_Date('" + Strings.Format(datNow, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')," + " To_Date('" + Strings.Format(Conversions.ToDate(strProductionDateFrom), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')," + " To_Date('" + Strings.Format(Conversions.ToDate(strProductionDateEnd), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "); strSQL = strSQL_Field + ")" + strSQL_Value + ")"; colSQL_Log.Add(strSQL); // 以一次抛轉為單位,直接先寫入. ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, colSQL_Log); // 2020/12/30 Grace 因為tblERPWorkRPT_EQPSummary為設備彙整資料, 因此若為純人時無機台且無設定虛擬機, 不寫入 if (Conversions.ToBoolean(Operators.ConditionalCompareObjectNotEqual(aryEquipmentNo[i], "", false))) { // 2019/6/13, Ning, 紀錄T2 strSQL = Conversions.ToString("Insert Into tblERPWorkRPT_EQPSummary (WorkReportID, EquipmentNo, EQP_ResValue, EMP_ResValue, ERPFlag, ERPNo)" + " Values('" + strWorkReportID + "','" + aryEquipmentNo[i] + "'," + decT_EQP + "," + decT_EMP + ",1,'" + responseValue + "')"); colSQL_T2.Add(strSQL); } // 2020/12/29 Grace Mantis 84927: [瑞賢] AUTORUN報工資料重複, 修改為每拋轉一筆報工單資料, 就更新一次MES資料, 避免ERP回復失敗後, 失敗前已拋轉的資料未記錄到, 造成重複拋送 // ----- 將UNDO鎖住 ----- string strCond; string strCond2; if (strDataBaseType != "oracle") { strCond = " Select distinct B.LotSerial "; strCond += "From " + tblCont_Resource + " A, tblWIPLotLog B "; strCond += "Where A.LogGroupSerial = B.LogGroupSerial "; strCond += "And A.EventTime >= '" + strProductionDateFrom + "' AND A.EventTime < '" + strProductionDateEnd + "' "; strCond2 = ""; // 2020/12/31 Grace 若參數6有設定虛擬機, aryEquipmentNo會包含虛擬機資料, 但MES實際報工為人時的資料, 造成後續更新已拋轉資料時, 查詢條件不正確 // 2020/12/29 Grace Mantis 84927 因一台設備拋一筆報工資料, 因此增加設備查詢條件; 若為純人時資料, 改為排除Equipment為查詢條件 if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(aryEquipmentNo[i], "", false)) || Operators.ConditionalCompareObjectEqual(aryEquipmentNo[i], VirtualEQP, false)) { strCond += " And A.RESITEM Not in (Select EquipmentNo from tblEQPEquipmentBasis ) "; strCond2 = " And RESITEM Not in (Select EquipmentNo from tblEQPEquipmentBasis ) "; } else { strCond = Conversions.ToString(strCond + " And A.RESITEM = '" + aryEquipmentNo[i] + "' "); // 2020/12/31 Grace 更新機時之外也需更新到人時 strCond2 = " Select distinct B.LogGroupSerial "; strCond2 += " From " + tblCont_Resource + " A, tblWIPLotLog B "; strCond2 += " Where A.LogGroupSerial = B.LogGroupSerial "; strCond2 += " And A.EventTime >= To_Date('" + strProductionDateFrom + "','YYYY/MM/DD') AND A.EventTime < To_Date('" + strProductionDateEnd + "','YYYY/MM/DD') "; strCond2 = Conversions.ToString(strCond2 + " And RESITEM = '" + aryEquipmentNo[i] + "' "); strCond2 = " And LogGroupSerial in (" + strCond2 + ") "; } } else { strCond = " Select distinct B.LotSerial "; strCond += "From " + tblCont_Resource + " A, tblWIPLotLog B "; strCond += "Where A.LogGroupSerial = B.LogGroupSerial "; strCond += "And A.EventTime >= To_Date('" + strProductionDateFrom + "','YYYY/MM/DD') AND A.EventTime < To_Date('" + strProductionDateEnd + "','YYYY/MM/DD') "; // 2020/12/29 Grace Mantis 84927 因一台設備拋一筆報工資料, 因此增加設備查詢條件; 若為純人時資料, 改為排除RESITEM為設備編號的查詢條件 if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(aryEquipmentNo[i], "", false)) || Operators.ConditionalCompareObjectEqual(aryEquipmentNo[i], VirtualEQP, false)) { strCond += " And A.RESITEM Not in (Select EquipmentNo from tblEQPEquipmentBasis ) "; strCond2 = " And RESITEM Not in (Select EquipmentNo from tblEQPEquipmentBasis ) "; } else { strCond = Conversions.ToString(strCond + " And A.RESITEM = '" + aryEquipmentNo[i] + "' "); // 2020/12/31 Grace 更新機時之外也需更新到人時 strCond2 = " Select distinct B.LogGroupSerial "; strCond2 += "From " + tblCont_Resource + " A, tblWIPLotLog B "; strCond2 += "Where A.LogGroupSerial = B.LogGroupSerial "; strCond2 += " And A.EventTime >= To_Date('" + strProductionDateFrom + "','YYYY/MM/DD') AND A.EventTime < To_Date('" + strProductionDateEnd + "','YYYY/MM/DD') "; strCond2 = Conversions.ToString(strCond2 + " And RESITEM = '" + aryEquipmentNo[i] + "' "); strCond2 = " And LogGroupSerial in (" + strCond2 + ") "; } } strSQL = " Update tblWIPReverseHistory Set CommitState=1, CommitDesc='AutoRun CreateWOWorkReportData_TP' Where LotSerial In (" + strCond + ")"; CollectionSQL.Add(strSQL); // 平攤的計算方式才需要回填tblWIPCont_Equipment與tblWIPCont_Employee_MultiUser if (blnShare) { strSQL = "Update tblWIPCont_Equipment Set ERPFlag = 1, WorkReportID = '" + strWorkReportID + "' Where LotSerial In (" + strCond + ")"; CollectionSQL.Add(strSQL); strSQL = "Update tblWIPCont_Employee_MultiUser Set ERPFlag = 1, WorkReportID = '" + strWorkReportID + "' Where LotSerial In (" + strCond + ")"; CollectionSQL.Add(strSQL); } // 2020/12/29 Grace Mantis 84927 因一台設備拋一筆報工資料, 因此增加設備查詢條件; 若為純人時資料, 改為排除Equipment為查詢條件 // tblCont_Resource壓上ERPFlag與WorkReportID strSQL = "Update " + tblCont_Resource + " Set ERPFlag = 1, WorkReportID = '" + strWorkReportID + "'" + " Where EventTime >= To_Date('" + strProductionDateFrom + "','YYYY/MM/DD') AND EventTime < To_Date('" + strProductionDateEnd + "','YYYY/MM/DD') " + strCond2; SQLCommandTuning(strDataBaseType, ref strSQL); CollectionSQL.Add(strSQL); // '報工單拋轉彙整資料表(T1) // strSQL = "Insert Into tblERPWorkRPT_Summary (WorkReportID, DataStartTime, DataEndTime, ERPFlag)" & // " Values('" & strWorkReportID & "', To_Date('" & strProductionDateFrom & "','YYYY/MM/DD'), To_Date('" & strProductionDateEnd & "','YYYY/MM/DD'), 1)" // CollectionSQL.Add(strSQL) // 報工單拋轉設備彙整資料表(T2) for (int j = 1, loopTo4 = colSQL_T2.Count; j <= loopTo4; j++) CollectionSQL.Add(colSQL_T2[j]); // 報工單拋轉明細資料表(T3) for (int j = 1, loopTo5 = colSQL_T3.Count; j <= loopTo5; j++) CollectionSQL.Add(colSQL_T3[j]); ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, CollectionSQL); } else { funCreateWOWorkReportData_TPRet = "fail;ERP Return Message:" + description + ""; exitTry1 = true; break; } } if (exitTry1) { break; } } dsTemp.Dispose(); } // '----- 將UNDO鎖住 ----- // Dim strCond As String // If strDataBaseType <> "oracle" Then // strCond = " Select distinct B.LotSerial " // strCond += "From " & tblCont_Resource & " A, tblWIPLotLog B " // strCond += "Where A.LogGroupSerial = B.LogGroupSerial " // strCond += "And A.EventTime >= '" & strProductionDateFrom & "' AND A.EventTime < '" & strProductionDateEnd & "' " // Else // strCond = " Select distinct B.LotSerial " // strCond += "From " & tblCont_Resource & " A, tblWIPLotLog B " // strCond += "Where A.LogGroupSerial = B.LogGroupSerial " // strCond += "And A.EventTime >= To_Date('" & strProductionDateFrom & "','YYYY/MM/DD') AND A.EventTime < To_Date('" & strProductionDateEnd & "','YYYY/MM/DD') " // End If // strSQL = " Update tblWIPReverseHistory Set CommitState=1, CommitDesc='AutoRun CreateWOWorkReportData_TP' Where LotSerial In (" & strCond & ")" // CollectionSQL.Add(strSQL) // '平攤的計算方式才需要回填tblWIPCont_Equipment與tblWIPCont_Employee_MultiUser // If blnShare Then // strSQL = "Update tblWIPCont_Equipment Set ERPFlag = 1, WorkReportID = '" & strWorkReportID & "' Where LotSerial In (" & strCond & ")" // CollectionSQL.Add(strSQL) // strSQL = "Update tblWIPCont_Employee_MultiUser Set ERPFlag = 1, WorkReportID = '" & strWorkReportID & "' Where LotSerial In (" & strCond & ")" // CollectionSQL.Add(strSQL) // End If // 'tblCont_Resource壓上ERPFlag與WorkReportID // strSQL = "Update " & tblCont_Resource & " Set ERPFlag = 1, WorkReportID = '" & strWorkReportID & "'" & // " Where EventTime >= To_Date('" & strProductionDateFrom & "','YYYY/MM/DD') AND EventTime < To_Date('" & strProductionDateEnd & "','YYYY/MM/DD') " // CollectionSQL.Add(strSQL) // 報工單拋轉彙整資料表(T1) strSQL = "Insert Into tblERPWorkRPT_Summary (WorkReportID, DataStartTime, DataEndTime, ERPFlag)" + " Values('" + strWorkReportID + "', To_Date('" + strProductionDateFrom + "','YYYY/MM/DD'), To_Date('" + strProductionDateEnd + "','YYYY/MM/DD'), 1)"; SQLCommandTuning(strDataBaseType, ref strSQL); CollectionSQL = new Collection(); CollectionSQL.Add(strSQL); // '報工單拋轉設備彙整資料表(T2) // For i As Integer = 1 To colSQL_T2.Count // CollectionSQL.Add(colSQL_T2(i)) // Next // '報工單拋轉明細資料表(T3) // For i As Integer = 1 To colSQL_T3.Count // CollectionSQL.Add(colSQL_T3(i)) // Next ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, CollectionSQL); // //Return success if (costCenter == "N") { funCreateWOWorkReportData_TPRet = "success;" + responseValue + ";" + strMONo; } else { funCreateWOWorkReportData_TPRet = "success;" + responseValue + ";" + strEquipmentNo; } } catch (Exception ex) { funCreateWOWorkReportData_TPRet = CombineFailMsg("0000-999999", ex.Message); // 2013/02/05, Hank, Send Email colParameters.Add(funCreateWOWorkReportData_TPRet, "EmailBody"); SendJobFailEmail(colParameters); } finally { try { CloseConnection(cnnTemp); // =================================2021/03/30 Elvis 0087678: [瑞賢] AUTORUN報工--報工失敗,發送郵件新增提供失敗清單 STAR var dsResult = new DataTable("dsResult"); // 拋轉日期、報工日期、工單編號、失敗原因 // strProductionDateFrom 報工日期CreateConnection // drResource("MONo").ToString 工單編號 // funCreateWOWorkReportData_TP 失敗原因CreateConnection dsResult.Columns.Add("WOWorkDate", Type.GetType("System.String")); // 拋轉日期 dsResult.Columns.Add("ProductionDate", Type.GetType("System.String")); // 報工日期 dsResult.Columns.Add("MONo", Type.GetType("System.String")); // 工單單號 dsResult.Columns.Add("FailReason", Type.GetType("System.String")); // 失敗原因 string strFillType = "XLS"; dsResult.Rows.Add(strProductionDateEnd, strProductionDateFrom, strMONo, funCreateWOWorkReportData_TPRet); //var iugTemp = new iMESUltraGrid.iMESUltraGridControl(); //iugTemp.iMESUltraGrid_InitializeLayOut += iMESUltraGrid_InitializeLayOut; // Dim iugTemp As New iMESUltraGrid.iMESUltraGridControl // AddHandler iugTemp.iMESUltraGrid_InitializeLayOut, AddressOf iMESUltraGrid_InitializeLayOut //iugTemp.Identity = "iMES"; //iugTemp.UserNo = "iMES"; //var memStream = new MemoryStream(); //讓最後一列style生效,新增空列 DataRow drEnd = dsResult.NewRow(); dsResult.Rows.Add(drEnd); var dtResult = new DataSet(); dtResult.Tables.Add(dsResult); //iugTemp.iMESUltraGrid.DataSource = dtResult.Tables[0]; // 0133391: [跨平台]AutoRunLib移除iMESUltraGrid的使用, 2023/4/21 String ExcelMode = strFillType.ToString().ToUpper(); //"XLSX" , "XLS" byte[] membyte = modAutoRunLibrary.funExcelToByte(dtResult, ExcelMode, strLanguageMode, strResourceDir); //var memStream = new MemoryStream(membyte); //memStream.Seek(0L, SeekOrigin.Begin); //// 將欄位翻譯 //if (!string.IsNullOrEmpty(modWIN.gLanguageMode)) //{ // var ColSaveControl = new Collection(); // ColSaveControl.Add(iugTemp.iMESUltraGrid); // ChgTranslateName(ColSaveControl, modWIN.gLanguageMode); //} //foreach (DataRow drResource in dsResult.Rows) //{ // switch (strFillType.ToString().ToUpper() ?? "") // { // // Case "XLSX" // // '匯出Excel再轉Stream // // workbook = ExcelExp.Export(iugTemp.iMESUltraGrid, Infragistics.Documents.Excel.WorkbookFormat.Excel2007) // // workbook.Save(memStream) // // memStream.Seek(0, SeekOrigin.Begin) // case "XLS": // { // // 匯出Excel再轉Stream // //workbook = ExcelExp.Export(iugTemp.iMESUltraGrid); // iugTemp.iMESUltraGrid, Infragistics.Documents.Excel.WorkbookFormat.Excel97To2003 // //workbook.Save(memStream); // //memStream.Seek(0L, SeekOrigin.Begin); // break; // } // } //} // Stream轉成附件檔 //var AttachFile = new byte[(int)(memStream.Length - 1L + 1)]; //double count = 0d; //while (count < memStream.Length) //{ // AttachFile[(int)Math.Round(count)] = Convert.ToByte(memStream.ReadByte()); // count += 1d; //} try { dtResult.Dispose(); } catch (Exception ex) { } // =================================2021/03/30 Elvis 0087678: [瑞賢] AUTORUN報工--報工失敗,發送郵件新增提供失敗清單 END // 寄送Mail string argFileName = "ErrorList.xls"; string argEmailSubject = "WO Work Report Data [" + strProductionDateFrom + "]"; string argEmailBody = Conversions.ToString(funCreateWOWorkReportData_TPRet); modAutoRunLibrary.SendMultiEmail(ref argFileName, ref argEmailSubject, argEmailBody, strGroupNo, membyte); funCreateWOWorkReportData_TPRet = argEmailBody; } catch (Exception ex) { funCreateWOWorkReportData_TPRet = "fail_Finally;" + ex.Message; } } } while (false); return funCreateWOWorkReportData_TPRet; } #endregion #region Tip Top ICD ERP & MES 標準整合 // ======================================================================================================================== // 程式名稱:funCreateWOWorkReportData_TTICD // 傳入參數:colParameters // 傳回參數:success(成功), fail(失敗) // 用 途:建立工單生產報工單資料 // ======================================================================================================================== private object funCreateWOWorkReportData_TTICD(Collection colParameters = null) { object funCreateWOWorkReportData_TTICDRet = default(object); var cnnTemp = default(IDbConnection); DbDataReader drTemp; string strSQL; var XmlDoc = new XmlDocument(); //System.Data.OleDb.OleDbDataAdapter daTemp; var CollectionSQL = new Collection(); var colSQL_T2 = new Collection(); var colSQL_T3 = new Collection(); string strAccess = string.Empty; string strParameter = string.Empty; string strMaster = string.Empty; string strDetail = string.Empty; string strTempField = string.Empty; string strTempRecord = string.Empty; var arriveTime = DateTime.Now; string strSheetType = string.Empty; // 報工單別 string strGroupNo = string.Empty; // 異常處理群組 // 2012/09/25, Aaron, 將生產日期改用起訖方式 string strProductionDateFrom = string.Empty; // 生產日期起(如無指定則帶昨天) string strProductionDateEnd = string.Empty; // 生產日期迄(如無指定則帶今天) string strEquipmentNo = string.Empty; // 設備 string strShiftNo = string.Empty; // 班別 string strMONo = string.Empty; // 工單 string auto = "N"; // Request... Y: 建立入庫單後自動確認+過帳, N:建立入庫單後不自動確認過帳 string code = string.Empty; // Response... code:錯誤碼;非0則為錯誤 (function回傳 success 或 fail) string sqlcode = string.Empty; string description = string.Empty; // Response... 錯誤訊息 string responseName = "srf01"; // Request/Response... 報工單單號ERP欄位名稱 string responseValue = string.Empty; // Request/Response... 報工單單號, 成功回傳ERP單號 string costCenter = "N"; // Request... Y:表示整合成本中心;N:表示未整合成本中心 string VirtualEQP = ""; // Request... 整合成本中心時,沒有機台編號的人工作業站帶入的ERP虛擬機台編號 // 2021/03/30 Elvis 0087678: [瑞賢] AUTORUN報工--報工失敗,發送郵件新增提供失敗清單 //var ExcelExp = new Infragistics.Win.UltraWinGrid.ExcelExport.UltraGridExcelExporter(); //var workbook = new Infragistics.Documents.Excel.Workbook(); string ReturnMSG = string.Empty; string strSQL_Field, strSQL_Value; var datNow = DateTime.Now; // 2019/3/20 YuWen SequenceNo增加亂數3碼 string strSequenceNo = Strings.Format(datNow, "yyyyMMddHHmmssffffff") + "_" + Convert.ToInt16(Math.Floor((1 - 999 + 1) * VBMath.Rnd()) + 999d).ToString("000"); // 2019/6/11,Ning, WorkReportID string strWorkReportID = Strings.Format(datNow, "yyyyMMddHHmmssfff"); do { try { // ParameterXX參數說明 // 01 報工單單別 // 02 使用者群組 // 03 生產日期[yyyy/MM/dd](如無指定則用昨天) // 04 ERP自動確認(如無指定則用N) // 2012/09/25, Aaron // 05 整合成本中心 Y:表示整合成本中心;N:表示未整合成本中心;未設定預設值為N // 06 整合成本中心時,純人工作業站沒有機台,回報人時需所指定ERP虛擬機台編號,如果未設定,ERP將抓取ERP工單上的成本中心欄位作為歸屬機台。 // Parameter01為傳入參數,作為SheetType,若無此值則不進行下面的程式 if (colParameters["Parameter01"] == null || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter01"])))) { funCreateWOWorkReportData_TTICDRet = TranslateMsg("[%SheetType%][%not found%]!!!([%Parameter%]01)", strLanguageMode, strResourceDir); break; } else { strSheetType = Strings.Trim(Conversions.ToString(colParameters["Parameter01"])); } // Parameter02為傳入參數,作為GroupNo,若無此值則不進行下面的程式 if (colParameters["Parameter02"] == null || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter02"])))) { funCreateWOWorkReportData_TTICDRet = TranslateMsg("[%User%][%GroupNo%][%not found%]!!!([%Parameter%]02)", strLanguageMode, strResourceDir); break; } else { strGroupNo = Strings.Trim(Conversions.ToString(colParameters["Parameter02"])); } // Parameter03為傳入參數,作為ProductionDate,若無此值則用昨天當日期 if (colParameters["Parameter03"] == null || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter03"])))) { strProductionDateFrom = Strings.Format(datNow.AddDays(-1), "yyyy/MM/dd"); strProductionDateEnd = Strings.Format(datNow, "yyyy/MM/dd"); } else { do { try { strProductionDateFrom = Strings.Format(DateTime.Parse(colParameters["Parameter03"].ToString().Trim()), "yyyy/MM/dd"); strProductionDateEnd = Strings.Format(DateTime.Parse(colParameters["Parameter03"].ToString().Trim()).AddDays(1d), "yyyy/MM/dd"); } catch (Exception ex) { funCreateWOWorkReportData_TTICDRet = TranslateMsg("[%PDDATE%][%fail%](yyyy/MM/dd)!!!([%Parameter%]03)", strLanguageMode, strResourceDir); break; } } while (false); } // Parameter04為傳入參數,作為自動確認,若無此值則用N if (colParameters["Parameter04"] == null || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter04"])))) { auto = "N"; } else if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(colParameters["Parameter04"].ToString().ToUpper(), "Y", false)) || Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(colParameters["Parameter04"].ToString().ToUpper(), "N", false))) { auto = colParameters["Parameter04"].ToString().ToUpper(); } else { funCreateWOWorkReportData_TTICDRet = TranslateMsg("[%Parameter%]04 [%SELECTITEM%] Y [%or%] N", strLanguageMode, strResourceDir); break; } // 2012/09/25, Aaron // Parameter05為傳入參數,作為整合成本中心,若無此值則用N if (colParameters["Parameter05"] == null || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter05"])))) { costCenter = "N"; } else if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(colParameters["Parameter05"].ToString().ToUpper(), "Y", false)) || Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(colParameters["Parameter05"].ToString().ToUpper(), "N", false))) { costCenter = colParameters["Parameter05"].ToString().ToUpper(); } else { funCreateWOWorkReportData_TTICDRet = TranslateMsg("[%Parameter%]05 [%SELECTITEM%] Y [%or%] N", strLanguageMode, strResourceDir); break; } // Parameter06為傳入參數,作為defVirtualEQP if (colParameters["Parameter06"] == null || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter06"])))) { VirtualEQP = ""; } else { VirtualEQP = colParameters["Parameter06"].ToString().Trim().ToUpper(); } cnnTemp = CreateConnection(strConnectionString); // 取得設備第1筆資料 strSQL = "Select * From tblEQPEquipmentBasis"; //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (drTemp.Read()) { strEquipmentNo = Conversions.ToString(drTemp["EquipmentNo"]); } drTemp.Close(); //cmmTemp.Dispose(); if (string.IsNullOrEmpty(strEquipmentNo) || string.IsNullOrEmpty(strEquipmentNo)) { funCreateWOWorkReportData_TTICDRet = TranslateMsg("[%EquipmentNo%][%not found%]!!!", strLanguageMode, strResourceDir); break; } // 取得班別第1筆資料 strSQL = "Select * From tblUSRShiftBasis"; //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (drTemp.Read()) { strShiftNo = Conversions.ToString(drTemp["ShiftNo"]); } drTemp.Close(); //cmmTemp.Dispose(); if (string.IsNullOrEmpty(strShiftNo) || string.IsNullOrEmpty(strShiftNo)) { funCreateWOWorkReportData_TTICDRet = TranslateMsg("[%ShiftNo%][%not found%]!!!", strLanguageMode, strResourceDir); break; } // 2017/12/27,sammi.MEStoERP生產報工抛轉資料,1:平攤(tblWIPCont_Resource_Share),2:原始(未平攤,tblWIPCont_Resource) string tblCont_Resource = "tblWIPCont_Resource_Share "; bool blnReCalResource = true; bool blnShare = true; strSQL = "Select ParameterValue From tblSYSParameter " + " Where ParameterType='SysInfo' " + " And ParameterNo='ERPWOWORKREPORTDATA' "; //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (drTemp.Read()) { if (drTemp["ParameterValue"].ToString() == "2") { tblCont_Resource = "tblWIPCont_Resource"; blnReCalResource = false; blnShare = false; } } drTemp.Close(); //cmmTemp.Dispose(); // 2018/07/19 Lena, 增加系統參數,判定是否需要重匯機時、人時, 0:No、1:Yes. // 當為平攤時, 必須再參考系統參數中是否有設定要重匯機時 if (blnReCalResource) { strSQL = "Select ParameterValue From tblSYSParameter " + " Where ParameterType='SysInfo' " + " And ParameterNo='ERPWOWorkReportReCalResource' "; //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (drTemp.Read()) { if (drTemp["ParameterValue"].ToString() == "0") { blnReCalResource = false; } } drTemp.Close(); //cmmTemp.Dispose(); } if (blnReCalResource) { // 機時,人時 var colParameters_Resource = new Collection(); colParameters_Resource.Add(strProductionDateFrom, "Parameter01"); // funCreateWOWorkReportData_T100,TP,WF,call funShareEQPTime/funShareEMPTime,發Mail通知,統一由主funciton發出. // colParameters_Resource.Add(strGroupNo, "Parameter02") colParameters_Resource.Add("", "Parameter02"); string strResult_EQP; strResult_EQP = Conversions.ToString(funShareEQPTime(colParameters_Resource)); if (strResult_EQP != "success") { funCreateWOWorkReportData_TTICDRet = "funShareEQPTime:" + strResult_EQP; break; } string strResult_EMP; strResult_EMP = Conversions.ToString(funShareEMPTime(colParameters_Resource)); if (strResult_EMP != "success") { funCreateWOWorkReportData_TTICDRet = "funShareEMPTime:" + strResult_EMP; break; } } // ---- InXml ----- // strAccess = cbXMLAccess_TP(ERPName: "TIPTOPICD"); // strTempField = cbXMLField_TP("status", auto); strTempField += cbXMLField_TP("costcenter", costCenter); strTempRecord = cbXMLRecord_TP(strTempField); strParameter = cbXMLParameter_TP(strTempRecord); int intItemNo = 1; decimal decT_EQP, decT_EMP; // 各機台的人時工時 if (costCenter == "N") // 2012/09/25, Aaron, 依工單報工,機台生產線欄位為設備主檔第一筆資料,僅為了填入值讓ERP接受。 { // strTempField = cbXMLField_TP(responseName, strSheetType); // 報工單別 strTempField += cbXMLField_TP("srf02", Strings.Format(datNow, "yyyy/MM/dd")); // 報工日期 strTempField += cbXMLField_TP("srf03", strEquipmentNo); // 機台生產線 strTempField += cbXMLField_TP("srf04", strShiftNo); // 班別 strTempField += cbXMLField_TP("srf05", strProductionDateFrom); // 生產日期 strTempField += cbXMLField_TP("srf07", "2"); // 報工類別(1:重複性生產報工;2:工單生產報工) strTempRecord = cbXMLRecord_TP(strTempField); strMaster = cbXMLMaster_TP("srf_file", strTempRecord); // strTempRecord = string.Empty; // 2012/09/25, Aaron, 修正原本只能在Oracle上Run的語法以及Where日期條件修正支援Index作法。 // 2019/6/11,Ning,加上ERPFlag=0的條件 if (strDataBaseType != "oracle") { strSQL = " Select distinct CONVERT(char(10), EventTime, 111) EventTime, MONo, "; strSQL += "ISNULL((Select Sum(ResValue) From " + tblCont_Resource + " Where ResClass=0 And EventTime >= '" + strProductionDateFrom + "' And EventTime < '" + strProductionDateEnd + "' And MONo=A.MONo),0) EMP, "; strSQL += "ISNULL((Select Sum(ResValue) From " + tblCont_Resource + " Where ResClass=1 And EventTime >= '" + strProductionDateFrom + "' And EventTime < '" + strProductionDateEnd + "' And MONo=A.MONo),0) EQP "; strSQL += "From " + tblCont_Resource + " A "; strSQL += "Where EventTime >= '" + strProductionDateFrom + "' And EventTime < '" + strProductionDateEnd + "'"; strSQL += " And IsNull(A.ERPFlag,0) = 0"; } else { strSQL = " Select distinct To_Char(EventTime,'YYYY/MM/DD') EventTime, MONo, "; strSQL += "NVL((Select Sum(ResValue) From " + tblCont_Resource + " Where ResClass=0 And EventTime >= To_Date('" + strProductionDateFrom + "','YYYY/MM/DD') AND EventTime < To_Date('" + strProductionDateEnd + "','YYYY/MM/DD') And MONo=A.MONo),0) EMP, "; strSQL += "NVL((Select Sum(ResValue) From " + tblCont_Resource + " Where ResClass=1 And EventTime >= To_Date('" + strProductionDateFrom + "','YYYY/MM/DD') AND EventTime < To_Date('" + strProductionDateEnd + "','YYYY/MM/DD') And MONo=A.MONo),0) EQP "; strSQL += "From " + tblCont_Resource + " A "; strSQL += "Where EventTime >= To_Date('" + strProductionDateFrom + "','YYYY/MM/DD') AND EventTime < To_Date('" + strProductionDateEnd + "','YYYY/MM/DD') "; strSQL += " And Nvl(A.ERPFlag,0) = 0"; } //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); strTempField = ""; var colSQL_Log = new Collection(); decT_EMP = 0m; decT_EQP = 0m; while (drTemp.Read()) { strTempField = cbXMLField_TP("srg01", strSheetType); // 報工單別 strTempField += cbXMLField_TP("srg05", "0"); // 良品數 strTempField += cbXMLField_TP("srg06", "0"); // 不良品數 strTempField += cbXMLField_TP("srg07", "0"); // 報廢數量 strTempField += cbXMLField_TP("srg10", Conversions.ToString(drTemp["EMP"])); // 工時(分) strTempField += cbXMLField_TP("srg13", "1"); // 1:主產品 ; 2:聯產品 ; 3:副產品 ; 4:再生產品 strTempField += cbXMLField_TP("srg15", "Y"); // 檢驗否(y/n) strTempField += cbXMLField_TP("srg16", Conversions.ToString(drTemp["MONo"])); // 工單編號 strTempField += cbXMLField_TP("srg19", Conversions.ToString(drTemp["EQP"])); // 機時(分) strTempRecord += cbXMLRecord_TP(strTempField) + '\n'; strMONo = Conversions.ToString(strMONo + Operators.AddObject(Constants.vbCrLf, drTemp["MONo"])); // 2017/12/29,sammi.紀錄抛轉資料. // tblERPWorkRPTDetail_TTICD strSQL_Field = "Insert into tblERPWorkRPTDetail_TTICD " + " (SequenceNo,ItemNo,srg01,srg05,srg06,srg07,srg10,srg13,srg15,srg16,srg19 "; strSQL_Value = Conversions.ToString(" Values ('" + strSequenceNo + "'," + intItemNo + ",'" + strSheetType + "',0,0,0," + drTemp["EMP"] + ",1,'Y','" + drTemp["MONo"] + "','" + drTemp["EQP"] + "'"); strSQL = strSQL_Field + ")" + strSQL_Value + ")"; colSQL_Log.Add(strSQL); // 2019/6/11, Ning, 紀錄報工單拋轉明細資料(T3) strSQL = Conversions.ToString("Insert Into tblERPWorkRPT_Detail (WorkReportID, ItemNo, EquipmentNo, MONo, EQP_ResValue, EMP_ResValue, SequenceNo)" + " Values ('" + strWorkReportID + "'," + intItemNo + ",'" + strEquipmentNo + "','" + drTemp["MONo"] + "'," + drTemp["EQP"] + "," + drTemp["EMP"] + ",'" + strSequenceNo + "')"); colSQL_T3.Add(strSQL); // 2019/6/13, Ning, 加總人時機時, 以紀錄報工單拋轉設備彙整資料表(T2) decT_EMP = Conversions.ToDecimal(Operators.AddObject(decT_EMP, drTemp["EMP"])); decT_EQP = Conversions.ToDecimal(Operators.AddObject(decT_EQP, drTemp["EQP"])); intItemNo += 1; } drTemp.Close(); if (string.IsNullOrEmpty(strTempField)) { funCreateWOWorkReportData_TTICDRet = strProductionDateFrom + TranslateMsg(" [%Warning%]!!! [%No transaction data found%]!!!", strLanguageMode, strResourceDir); return funCreateWOWorkReportData_TTICDRet; } strDetail = cbXMLDetail_TP("srg_file", strTempRecord); InXml = ""; InXml = cbXMLRequest_TP(strAccess, strParameter, strMaster, strDetail); // ----- Call ERP Web Service ----- OutXml = ""; // Kevin 15/05/12,依照ERP整合設定,如ERP版本是設定GP3.X則要使用RPC格式的參考 if (gERPVersion == "GP 3.X") { using (var ws = new wsERP_TP_RPC.TIPTOPServiceGateWay()) { ws.Url = gERPWSURL; OutXml = ws.CreateWOWorkReportData(InXml); } } else { using (var ws = new wsERP_TP.TIPTOPServiceGateWay()) { ws.Url = gERPWSURL; OutXml = ws.CreateWOWorkReportData(InXml); } } XmlDoc.LoadXml(OutXml); // ----- 取得ERP執行結果 code, sqlcode, description ----- chkExecutionStatus_TP(XmlDoc, ref code, ref sqlcode, ref description); // ----- 取得ERP入庫單號 ----- chkResponseContent_TP(XmlDoc, responseName, ref responseValue); // 2013/03/08, Aaron, 執行ERP交易完畢寫入Log // 紀錄TransactionLog() // addTransactionLog(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "MES", "WorkReportData_TTICD", My.Computer.Name, "AutoRun", arriveTime.ToString("yyyy/MM/dd HH:mm:ss"), code, responseValue, "CreateWOWorkReportData") if (string.IsNullOrEmpty(code) == true) { code = "fail"; } else if (code == "0") code = "success"; else code = "fail"; // Edison 2019/03/22 修正log紀錄位置 string argstrException = null; modAutoRunLibrary.addTransactionLog(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "MES", "WorkReportData_TTICD", Environment.MachineName, "AutoRun", arriveTime.ToString("yyyy/MM/dd HH:mm:ss"), code, responseValue, "CreateWOWorkReportData", strException: argstrException); if (code == "success") { // 2017/12/29,sammi.紀錄抛轉資料. // tblERPWorkReport_TTICD strSQL_Field = "Insert into tblERPWorkReport_TTICD " + " (SequenceNo,srf01,srf02,srf03,srf04,srf05,srf07,ERPNo,CreateDate,StartDate,EndDate "; strSQL_Value = " Values ('" + strSequenceNo + "','" + strSheetType + "','" + Strings.Format(datNow, "yyyy/MM/dd") + "','" + strEquipmentNo + "','" + strShiftNo + "','" + strProductionDateFrom + "','2','" + responseValue + "', To_Date('" + Strings.Format(datNow, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')," + " To_Date('" + Strings.Format(Conversions.ToDate(strProductionDateFrom), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')," + " To_Date('" + Strings.Format(Conversions.ToDate(strProductionDateEnd), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; strSQL = strSQL_Field + ")" + strSQL_Value + ")"; colSQL_Log.Add(strSQL); // 以一次抛轉為單位,直接先寫入. ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, colSQL_Log); // 2019/6/13, Ning, 記錄T2 strSQL = "Insert Into tblERPWorkRPT_EQPSummary (WorkReportID, EquipmentNo, EQP_ResValue, EMP_ResValue, ERPFlag, ERPNo)" + " Values('" + strWorkReportID + "','" + strEquipmentNo + "'," + decT_EQP + "," + decT_EMP + ",1,'" + responseValue + "')"; colSQL_T2.Add(strSQL); } else { funCreateWOWorkReportData_TTICDRet = "fail;" + TranslateMsg("[%ERP Return Message%]:", strLanguageMode, strResourceDir) + description + ""; break; } } else // 2012/09/25, Aaron, 整合成本中心,依設備、工單報工。 { // 2012/09/25, Aaron, SQL語法說明:先依日期取出人時部分,同一作業加工紀錄的人時必須先Group By,因為有可能有多人加工 // 人時彙總完後,再判斷是否為多機台加工,如果是1台以上機台,人時必須均分到各機台上 // 如果是沒有機台純人工, ERP收到資料後會以ERP工單單頭的成本中心欄位作為成本中心歸屬,後再取出機時Join, // 2017/11/23 KunYuan:若為虛擬機,可能有工時/機時皆為0之狀況,故需加判工時、機時其中一者>0才拋轉ERP,否則會違反ERP規則導致報錯 ↓ // If strDataBaseType <> "oracle" Then // strSQL = " SELECT F.EVENTTIME, F.EQUIPMENTNO, F.MONO, SUM(F.EQP) EQP, ROUND(SUM(F.EMP), 2) EMP FROM " // strSQL += "( " // strSQL += "SELECT A.EVENTTIME, ISNULL(B.RESITEM,'" & VirtualEQP & "') EQUIPMENTNO, A.MONO, SUM(ISNULL(B.RESVALUE,0)) EQP, " // strSQL += "(SUM(ISNULL(A.RESVALUE,0)) / IIF((SELECT COUNT(*) FROM TBLWIPCONT_RESOURCE C WHERE C.LOGGROUPSERIAL = A.LOGGROUPSERIAL AND C.RESCLASS = 1) = 0, 1, (SELECT COUNT(*) FROM TBLWIPCONT_RESOURCE C WHERE C.LOGGROUPSERIAL = A.LOGGROUPSERIAL AND C.RESCLASS = 1))) EMP " // strSQL += "FROM (SELECT CONVERT(CHAR(10), EVENTTIME, 111) EVENTTIME, A.MONO, A.LOGGROUPSERIAL, SUM(A.RESVALUE) RESVALUE FROM TBLWIPCONT_RESOURCE A WHERE A.RESCLASS = 0 AND A.EVENTTIME >= '" & strProductionDateFrom & "' AND A.EVENTTIME < '" & strProductionDateEnd & "' GROUP BY CONVERT(CHAR(10), EVENTTIME, 111), A.MONO, A.LOGGROUPSERIAL) A " // strSQL += "LEFT JOIN TBLWIPCONT_RESOURCE B ON A.LOGGROUPSERIAL = B.LOGGROUPSERIAL AND B.RESCLASS = 1 " // strSQL += "GROUP BY A.EVENTTIME, B.RESITEM, A.MONO, A.LOGGROUPSERIAL " // strSQL += ") F " // strSQL += "GROUP BY F.EVENTTIME, F.EQUIPMENTNO, F.MONO " // strSQL += "ORDER BY F.EVENTTIME, F.EQUIPMENTNO, F.MONO " // Else // strSQL = " SELECT A.EVENTTIME, NVL(B.RESITEM, '" & VirtualEQP & "') AS EQUIPMENTNO, A.MONO, " // strSQL += "SUM(NVL(B.RESVALUE,0)) EQP, " // strSQL += "ROUND(SUM(CASE WHEN (SELECT COUNT(*) FROM TBLWIPCONT_RESOURCE C WHERE C.LOGGROUPSERIAL = A.LOGGROUPSERIAL AND C.RESCLASS = 1) > 1 THEN A.RESVALUE / (SELECT COUNT(*) FROM TBLWIPCONT_RESOURCE C WHERE C.LOGGROUPSERIAL = A.LOGGROUPSERIAL AND C.RESCLASS = 1) ELSE A.RESVALUE END),2) AS EMP " // strSQL += "FROM (SELECT TO_CHAR(A.EVENTTIME,'YYYY/MM/DD') EVENTTIME, A.MONO, A.LOGGROUPSERIAL, SUM(A.RESVALUE) RESVALUE FROM TBLWIPCONT_RESOURCE A WHERE A.RESCLASS = 0 AND A.EVENTTIME >= TO_DATE('" & strProductionDateFrom & "','YYYY/MM/DD') AND A.EVENTTIME < TO_DATE('" & strProductionDateEnd & "','YYYY/MM/DD') GROUP BY TO_CHAR(A.EVENTTIME,'YYYY/MM/DD'), A.MONO, A.LOGGROUPSERIAL) A " // strSQL += "LEFT JOIN TBLWIPCONT_RESOURCE B ON A.LOGGROUPSERIAL = B.LOGGROUPSERIAL AND B.RESCLASS = 1 " // strSQL += "GROUP BY A.EVENTTIME, B.RESITEM, A.MONO " // strSQL += "ORDER BY A.EVENTTIME, B.RESITEM, A.MONO " // End If // 2021/01/12 Grace Mantis 85731: 須排除已拋轉資料, 否則會重複拋送 if (strDataBaseType != "oracle") { strSQL = " SELECT F.EVENTTIME, F.EQUIPMENTNO, F.MONO, SUM(F.EQP) EQP, ROUND(SUM(F.EMP), 2) EMP FROM "; strSQL += "( "; strSQL += "SELECT A.EVENTTIME, ISNULL(B.RESITEM,'" + VirtualEQP + "') EQUIPMENTNO, A.MONO, SUM(ISNULL(B.RESVALUE,0)) EQP, "; strSQL += "(SUM(ISNULL(A.RESVALUE,0)) / IIF((SELECT COUNT(*) FROM " + tblCont_Resource + " C WHERE C.LOGGROUPSERIAL = A.LOGGROUPSERIAL AND C.RESCLASS = 1) = 0, 1, (SELECT COUNT(*) FROM " + tblCont_Resource + " C WHERE C.LOGGROUPSERIAL = A.LOGGROUPSERIAL AND C.RESCLASS = 1))) EMP "; strSQL += "FROM (SELECT CONVERT(CHAR(10), EVENTTIME, 111) EVENTTIME, A.MONO, A.LOGGROUPSERIAL, SUM(A.RESVALUE) RESVALUE FROM " + tblCont_Resource + " A WHERE A.RESCLASS = 0 And NVL (ERPFlag, 0) = 0 AND A.EVENTTIME >= '" + strProductionDateFrom + "' AND A.EVENTTIME < '" + strProductionDateEnd + "' GROUP BY CONVERT(CHAR(10), EVENTTIME, 111), A.MONO, A.LOGGROUPSERIAL) A "; strSQL += "LEFT JOIN " + tblCont_Resource + " B ON A.LOGGROUPSERIAL = B.LOGGROUPSERIAL AND B.RESCLASS = 1 "; strSQL += " Where IsNull(B.ERPFlag,0) = 0 "; strSQL += "GROUP BY A.EVENTTIME, B.RESITEM, A.MONO, A.LOGGROUPSERIAL "; strSQL += ") F WHERE (EQP > 0 OR EMP > 0) "; strSQL += "GROUP BY F.EVENTTIME, F.EQUIPMENTNO, F.MONO "; strSQL += "ORDER BY F.EVENTTIME, F.EQUIPMENTNO, F.MONO "; } else { strSQL = "SELECT Z.* FROM ( "; strSQL += " SELECT A.EVENTTIME, NVL(B.RESITEM, '" + VirtualEQP + "') AS EQUIPMENTNO, A.MONO, "; strSQL += "SUM(NVL(B.RESVALUE,0)) EQP, "; strSQL += "ROUND(SUM(CASE WHEN (SELECT COUNT(*) FROM " + tblCont_Resource + " C WHERE C.LOGGROUPSERIAL = A.LOGGROUPSERIAL AND C.RESCLASS = 1) > 1 THEN A.RESVALUE / (SELECT COUNT(*) FROM " + tblCont_Resource + " C WHERE C.LOGGROUPSERIAL = A.LOGGROUPSERIAL AND C.RESCLASS = 1) ELSE A.RESVALUE END),2) AS EMP "; strSQL += "FROM (SELECT TO_CHAR(A.EVENTTIME,'YYYY/MM/DD') EVENTTIME, A.MONO, A.LOGGROUPSERIAL, SUM(A.RESVALUE) RESVALUE FROM " + tblCont_Resource + " A WHERE A.RESCLASS = 0 And NVL (ERPFlag, 0) = 0 AND A.EVENTTIME >= TO_DATE('" + strProductionDateFrom + "','YYYY/MM/DD') AND A.EVENTTIME < TO_DATE('" + strProductionDateEnd + "','YYYY/MM/DD') GROUP BY TO_CHAR(A.EVENTTIME,'YYYY/MM/DD'), A.MONO, A.LOGGROUPSERIAL) A "; strSQL += "LEFT JOIN " + tblCont_Resource + " B ON A.LOGGROUPSERIAL = B.LOGGROUPSERIAL AND B.RESCLASS = 1 "; strSQL += " Where Nvl(B.ERPFlag,0) = 0 "; strSQL += "GROUP BY A.EVENTTIME, B.RESITEM, A.MONO "; strSQL += "ORDER BY A.EVENTTIME, B.RESITEM, A.MONO "; strSQL += ") Z WHERE (Z.EQP > 0 OR Z.EMP > 0) "; } // 2017/11/23 KunYuan:若為虛擬機,可能有工時/機時皆為0之狀況,故需加判工時、機時其中一者>0才拋轉ERP,否則會違反ERP規則導致報錯 ↑ //cmmTemp = new IDbCommand(strSQL, cnnTemp); //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp); var dsTemp = new DataSet(); //daTemp.Fill(dsTemp, "costCenter"); //daTemp.Dispose(); //cmmTemp.Dispose(); ExecuteSQLQuery_Adapter(strSQL, dsTemp, "costCenter", cnnTemp); strEquipmentNo = ""; if (dsTemp.Tables["costCenter"].Rows.Count > 0) { var aryEquipmentNo = new ArrayList(); // 2020/12/31 Grace 若參數6有設定虛擬機, 設備資料會包含 var aryMONo = new ArrayList(); // strMONo = dsTemp.Tables("MONO").ToString '2021/03/30 Elvis 0087678: [瑞賢] AUTORUN報工--報工失敗,發送郵件新增提供失敗清單 STAR for (int i = 0, loopTo = dsTemp.Tables["costCenter"].Rows.Count - 1; i <= loopTo; i++) { if (aryEquipmentNo.IndexOf(dsTemp.Tables["costCenter"].Rows[i]["EQUIPMENTNO"].ToString()) == -1) { aryEquipmentNo.Add(dsTemp.Tables["costCenter"].Rows[i]["EQUIPMENTNO"].ToString()); } if (aryMONo.IndexOf(dsTemp.Tables["costCenter"].Rows[i]["MONo"].ToString()) == -1) { if (string.IsNullOrEmpty(strMONo)) { strMONo = dsTemp.Tables["costCenter"].Rows[i]["MONo"].ToString(); } else { strMONo = strMONo + "," + dsTemp.Tables["costCenter"].Rows[i]["MONo"].ToString(); } aryMONo.Add(dsTemp.Tables["costCenter"].Rows[i]["MONo"].ToString()); } } // 進行拋轉之前,先呼叫EEP,檢查預計要拋轉的設備編號是否存在於ERP,不存在就中止拋轉 var eci = new string[1]; bool exitTry = false; for (int i = 0, loopTo1 = aryEquipmentNo.Count - 1; i <= loopTo1; i++) { if (!string.IsNullOrEmpty(aryEquipmentNo[i].ToString())) { InXml = ""; InXml = cbXMLRequest_TP(strAccess, cbXMLParameter_TP(cbXMLRecord_TP(cbXMLField_TP("condition", "eci01 = '" + aryEquipmentNo[i].ToString() + "'"))), "", ""); // ----- Call ERP Web Service ----- OutXml = ""; // Kevin 15/05/12,依照ERP整合設定,如ERP版本是設定GP3.X則要使用RPC格式的參考 if (gERPVersion == "GP 3.X") { using (var ws = new wsERP_TP_RPC.TIPTOPServiceGateWay()) { ws.Url = gERPWSURL; OutXml = ws.GetMachineData(InXml); } } else { using (var ws = new wsERP_TP.TIPTOPServiceGateWay()) { ws.Url = gERPWSURL; OutXml = ws.GetMachineData(InXml); } } XmlDoc.LoadXml(OutXml); eci[0] = ""; if (chkResponseContentDocument_TP(XmlDoc, "eci01", ref eci) == false || string.IsNullOrEmpty(eci[0])) { funCreateWOWorkReportData_TTICDRet = TranslateMsg("ERP[%Equipment%][%Not Found%]! (", strLanguageMode, strResourceDir) + aryEquipmentNo[i].ToString() + ")"; exitTry = true; break; } } } if (exitTry) { break; } bool exitTry1 = false; for (int i = 0, loopTo2 = aryEquipmentNo.Count - 1; i <= loopTo2; i++) { // Reset var colSQL_Log = new Collection(); colSQL_T2 = new Collection(); colSQL_T3 = new Collection(); CollectionSQL = new Collection(); datNow = DateTime.Now; intItemNo = 1; decT_EMP = 0m; decT_EQP = 0m; // 2019/3/20 YuWen SequenceNo增加亂數3碼 strSequenceNo = Strings.Format(datNow, "yyyyMMddHHmmssffffff") + "_" + Convert.ToInt16(Math.Floor((1 - 999 + 1) * VBMath.Rnd()) + 999d).ToString("000"); // strTempField = cbXMLField_TP(responseName, strSheetType); // 報工單別 strTempField += cbXMLField_TP("srf02", Strings.Format(datNow, "yyyy/MM/dd")); // 報工日期 strTempField += cbXMLField_TP("srf03", Conversions.ToString(aryEquipmentNo[i])); // 機台生產線 strTempField += cbXMLField_TP("srf04", strShiftNo); // 班別 strTempField += cbXMLField_TP("srf05", strProductionDateFrom); // 生產日期 strTempField += cbXMLField_TP("srf07", "2"); // 報工類別(1:重複性生產報工;2:工單生產報工) strTempRecord = cbXMLRecord_TP(strTempField); strMaster = cbXMLMaster_TP("srf_file", strTempRecord); // strTempRecord = string.Empty; if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(aryEquipmentNo[i], "", false))) { dsTemp.Tables["costCenter"].DefaultView.RowFilter = "EquipmentNo is Null "; } else { dsTemp.Tables["costCenter"].DefaultView.RowFilter = Conversions.ToString("EquipmentNo = '" + aryEquipmentNo[i] + "'"); } strEquipmentNo = Conversions.ToString(strEquipmentNo + Operators.AddObject(Constants.vbCrLf, aryEquipmentNo[i])); for (int j = 0, loopTo3 = dsTemp.Tables["costCenter"].DefaultView.Count - 1; j <= loopTo3; j++) { // 2017/11/23 KunYuan:加判工時、機時其中一者>0才拋轉ERP,否則會違反ERP規則導致報錯 if (Conversions.ToDecimal(dsTemp.Tables["costCenter"].DefaultView[j]["EMP"]) == 0m & Conversions.ToDecimal(dsTemp.Tables["costCenter"].DefaultView[j]["EQP"]) == 0m) { continue; } strTempField = cbXMLField_TP("srg01", strSheetType); // 報工單別 strTempField += cbXMLField_TP("srg05", "0"); // 良品數 strTempField += cbXMLField_TP("srg06", "0"); // 不良品數 strTempField += cbXMLField_TP("srg07", "0"); // 報廢數量 strTempField += cbXMLField_TP("srg10", Conversions.ToString(dsTemp.Tables["costCenter"].DefaultView[j]["EMP"])); // 工時(分) strTempField += cbXMLField_TP("srg13", "1"); // 1:主產品 ; 2:聯產品 ; 3:副產品 ; 4:再生產品 strTempField += cbXMLField_TP("srg15", "Y"); // 檢驗否(y/n) strTempField += cbXMLField_TP("srg16", Conversions.ToString(dsTemp.Tables["costCenter"].DefaultView[j]["MONo"])); // 工單編號 strTempField += cbXMLField_TP("srg19", Conversions.ToString(dsTemp.Tables["costCenter"].DefaultView[j]["EQP"])); // 機時(分) strTempRecord += cbXMLRecord_TP(strTempField) + '\n'; // 2017/12/29,sammi.紀錄抛轉資料. // tblERPWorkRPTDetail_TTICD strSQL_Field = "Insert into tblERPWorkRPTDetail_TTICD " + " (SequenceNo,ItemNo,srg01,srg05,srg06,srg07,srg10,srg13,srg15,srg16,srg19 "; strSQL_Value = Conversions.ToString(" Values ('" + strSequenceNo + "'," + intItemNo + ",'" + strSheetType + "',0,0,0," + dsTemp.Tables["costCenter"].DefaultView[j]["EMP"] + ",1,'Y','" + dsTemp.Tables["costCenter"].DefaultView[j]["MONo"] + "','" + dsTemp.Tables["costCenter"].DefaultView[j]["EQP"] + "'"); strSQL = strSQL_Field + ")" + strSQL_Value + ")"; colSQL_Log.Add(strSQL); if (Conversions.ToBoolean(Operators.ConditionalCompareObjectNotEqual(aryEquipmentNo[i], "", false))) { // 2019/6/11, Ning, 紀錄報工單拋轉明細資料 strSQL = Conversions.ToString("Insert Into tblERPWorkRPT_Detail (WorkReportID, ItemNo, EquipmentNo, MONo, EQP_ResValue, EMP_ResValue, SequenceNo)" + " Values ('" + strWorkReportID + "'," + intItemNo + ",'" + aryEquipmentNo[i] + "','" + dsTemp.Tables["costCenter"].DefaultView[j]["MONo"] + "'," + dsTemp.Tables["costCenter"].DefaultView[j]["EQP"] + "," + dsTemp.Tables["costCenter"].DefaultView[j]["EMP"] + ",'" + strSequenceNo + "')"); colSQL_T3.Add(strSQL); } // 2019/6/13, Ning, 加總人時機時, 以紀錄報工單拋轉設備彙整資料表 decT_EMP = Conversions.ToDecimal(Operators.AddObject(decT_EMP, dsTemp.Tables["costCenter"].DefaultView[j]["EMP"])); decT_EQP = Conversions.ToDecimal(Operators.AddObject(decT_EQP, dsTemp.Tables["costCenter"].DefaultView[j]["EQP"])); intItemNo += 1; } if (string.IsNullOrEmpty(strTempField)) { funCreateWOWorkReportData_TTICDRet = strProductionDateFrom + TranslateMsg(" [%Warning%]!!! [%No transaction data found%]!!!", strLanguageMode, strResourceDir); return funCreateWOWorkReportData_TTICDRet; } strDetail = cbXMLDetail_TP("srg_file", strTempRecord); InXml = ""; InXml = cbXMLRequest_TP(strAccess, strParameter, strMaster, strDetail); // ----- Call ERP Web Service ----- OutXml = ""; // Kevin 15/05/12,依照ERP整合設定,如ERP版本是設定GP3.X則要使用RPC格式的參考 // 一個機台拋一筆單頭, 一工單一筆單身 if (gERPVersion == "GP 3.X") { using (var ws = new wsERP_TP_RPC.TIPTOPServiceGateWay()) { ws.Url = gERPWSURL; OutXml = ws.CreateWOWorkReportData(InXml); } } else { using (var ws = new wsERP_TP.TIPTOPServiceGateWay()) { ws.Url = gERPWSURL; OutXml = ws.CreateWOWorkReportData(InXml); } } XmlDoc.LoadXml(OutXml); // ----- 取得ERP執行結果 code, sqlcode, description ----- chkExecutionStatus_TP(XmlDoc, ref code, ref sqlcode, ref description); // ----- 取得ERP入庫單號 ----- chkResponseContent_TP(XmlDoc, responseName, ref responseValue); // 2013/03/08, Aaron, 執行ERP交易完畢寫入Log // 紀錄TransactionLog() // addTransactionLog(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "MES", "WorkReportData_TTICD", My.Computer.Name, "AutoRun", arriveTime.ToString("yyyy/MM/dd HH:mm:ss"), code, responseValue, "CreateWOWorkReportData") if (string.IsNullOrEmpty(code) == true) { code = "fail"; } else if (code == "0") code = "success"; else code = "fail"; // Edison 2019/03/22 修正log紀錄位置 string argstrException1 = null; modAutoRunLibrary.addTransactionLog(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "MES", "WorkReportData_TTICD", Environment.MachineName, "AutoRun", arriveTime.ToString("yyyy/MM/dd HH:mm:ss"), code, responseValue, "CreateWOWorkReportData", strException: argstrException1); if (code == "success") { // 2017/12/29,sammi.紀錄抛轉資料. // tblERPWorkReport_TTICD strSQL_Field = "Insert into tblERPWorkReport_TTICD " + " (SequenceNo,srf01,srf02,srf03,srf04,srf05,srf07,ERPNo,CreateDate,StartDate,EndDate "; strSQL_Value = Conversions.ToString(" Values ('" + strSequenceNo + "','" + strSheetType + "','" + Strings.Format(datNow, "yyyy/MM/dd") + "','" + aryEquipmentNo[i] + "','" + strShiftNo + "','" + strProductionDateFrom + "','2','" + responseValue + "', To_Date('" + Strings.Format(datNow, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')," + " To_Date('" + Strings.Format(Conversions.ToDate(strProductionDateFrom), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')," + " To_Date('" + Strings.Format(Conversions.ToDate(strProductionDateEnd), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "); strSQL = strSQL_Field + ")" + strSQL_Value + ")"; colSQL_Log.Add(strSQL); // 以一次抛轉為單位,直接先寫入. ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, colSQL_Log); // 2020/12/30 Grace 因為tblERPWorkRPT_EQPSummary為設備彙整資料, 因此若為純人時無機台且無設定虛擬機, 不寫入 if (Conversions.ToBoolean(Operators.ConditionalCompareObjectNotEqual(aryEquipmentNo[i], "", false))) { // 2019/6/13, Ning, 紀錄T2 strSQL = Conversions.ToString("Insert Into tblERPWorkRPT_EQPSummary (WorkReportID, EquipmentNo, EQP_ResValue, EMP_ResValue, ERPFlag, ERPNo)" + " Values('" + strWorkReportID + "','" + aryEquipmentNo[i] + "'," + decT_EQP + "," + decT_EMP + ",1,'" + responseValue + "')"); colSQL_T2.Add(strSQL); } // 2020/12/29 Grace Mantis 84927: [瑞賢] AUTORUN報工資料重複, 修改為每拋轉一筆報工單資料, 就更新一次MES資料, 避免ERP回復失敗後, 失敗前已拋轉的資料未記錄到, 造成重複拋送 // ----- 將UNDO鎖住 ----- string strCond; string strCond2; if (strDataBaseType != "oracle") { strCond = " Select distinct B.LotSerial "; strCond += "From " + tblCont_Resource + " A, tblWIPLotLog B "; strCond += "Where A.LogGroupSerial = B.LogGroupSerial "; strCond += "And A.EventTime >= '" + strProductionDateFrom + "' AND A.EventTime < '" + strProductionDateEnd + "' "; strCond2 = ""; // 2020/12/31 Grace 若參數6有設定虛擬機, aryEquipmentNo會包含虛擬機資料, 但MES實際報工為人時的資料, 造成後續更新已拋轉資料時, 查詢條件不正確 // 2020/12/29 Grace Mantis 84927 因一台設備拋一筆報工資料, 因此增加設備查詢條件; 若為純人時資料, 改為排除Equipment為查詢條件 if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(aryEquipmentNo[i], "", false)) || Operators.ConditionalCompareObjectEqual(aryEquipmentNo[i], VirtualEQP, false)) { strCond += " And A.RESITEM Not in (Select EquipmentNo from tblEQPEquipmentBasis ) "; strCond2 = " And RESITEM Not in (Select EquipmentNo from tblEQPEquipmentBasis ) "; } else { strCond = Conversions.ToString(strCond + " And A.RESITEM = '" + aryEquipmentNo[i] + "' "); // 2020/12/31 Grace 更新機時之外也需更新到人時 strCond2 = " Select distinct B.LogGroupSerial "; strCond2 += " From " + tblCont_Resource + " A, tblWIPLotLog B "; strCond2 += " Where A.LogGroupSerial = B.LogGroupSerial "; strCond2 += " And A.EventTime >= To_Date('" + strProductionDateFrom + "','YYYY/MM/DD') AND A.EventTime < To_Date('" + strProductionDateEnd + "','YYYY/MM/DD') "; strCond2 = Conversions.ToString(strCond2 + " And RESITEM = '" + aryEquipmentNo[i] + "' "); strCond2 = " And LogGroupSerial in (" + strCond2 + ") "; } } else { strCond = " Select distinct B.LotSerial "; strCond += "From " + tblCont_Resource + " A, tblWIPLotLog B "; strCond += "Where A.LogGroupSerial = B.LogGroupSerial "; strCond += "And A.EventTime >= To_Date('" + strProductionDateFrom + "','YYYY/MM/DD') AND A.EventTime < To_Date('" + strProductionDateEnd + "','YYYY/MM/DD') "; // 2020/12/29 Grace Mantis 84927 因一台設備拋一筆報工資料, 因此增加設備查詢條件; 若為純人時資料, 改為排除RESITEM為設備編號的查詢條件 if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(aryEquipmentNo[i], "", false)) || Operators.ConditionalCompareObjectEqual(aryEquipmentNo[i], VirtualEQP, false)) { strCond += " And A.RESITEM Not in (Select EquipmentNo from tblEQPEquipmentBasis ) "; strCond2 = " And RESITEM Not in (Select EquipmentNo from tblEQPEquipmentBasis ) "; } else { strCond = Conversions.ToString(strCond + " And A.RESITEM = '" + aryEquipmentNo[i] + "' "); // 2020/12/31 Grace 更新機時之外也需更新到人時 strCond2 = " Select distinct B.LogGroupSerial "; strCond2 += "From " + tblCont_Resource + " A, tblWIPLotLog B "; strCond2 += "Where A.LogGroupSerial = B.LogGroupSerial "; strCond2 += " And A.EventTime >= To_Date('" + strProductionDateFrom + "','YYYY/MM/DD') AND A.EventTime < To_Date('" + strProductionDateEnd + "','YYYY/MM/DD') "; strCond2 = Conversions.ToString(strCond2 + " And RESITEM = '" + aryEquipmentNo[i] + "' "); strCond2 = " And LogGroupSerial in (" + strCond2 + ") "; } } strSQL = " Update tblWIPReverseHistory Set CommitState=1, CommitDesc='AutoRun CreateWOWorkReportData_TTICD' Where LotSerial In (" + strCond + ")"; CollectionSQL.Add(strSQL); // 平攤的計算方式才需要回填tblWIPCont_Equipment與tblWIPCont_Employee_MultiUser if (blnShare) { strSQL = "Update tblWIPCont_Equipment Set ERPFlag = 1, WorkReportID = '" + strWorkReportID + "' Where LotSerial In (" + strCond + ")"; CollectionSQL.Add(strSQL); strSQL = "Update tblWIPCont_Employee_MultiUser Set ERPFlag = 1, WorkReportID = '" + strWorkReportID + "' Where LotSerial In (" + strCond + ")"; CollectionSQL.Add(strSQL); } // 2020/12/29 Grace Mantis 84927 因一台設備拋一筆報工資料, 因此增加設備查詢條件; 若為純人時資料, 改為排除Equipment為查詢條件 // tblCont_Resource壓上ERPFlag與WorkReportID strSQL = "Update " + tblCont_Resource + " Set ERPFlag = 1, WorkReportID = '" + strWorkReportID + "'" + " Where EventTime >= To_Date('" + strProductionDateFrom + "','YYYY/MM/DD') AND EventTime < To_Date('" + strProductionDateEnd + "','YYYY/MM/DD') " + strCond2; SQLCommandTuning(strDataBaseType, ref strSQL); CollectionSQL.Add(strSQL); // '報工單拋轉彙整資料表(T1) // strSQL = "Insert Into tblERPWorkRPT_Summary (WorkReportID, DataStartTime, DataEndTime, ERPFlag)" & // " Values('" & strWorkReportID & "', To_Date('" & strProductionDateFrom & "','YYYY/MM/DD'), To_Date('" & strProductionDateEnd & "','YYYY/MM/DD'), 1)" // CollectionSQL.Add(strSQL) // 報工單拋轉設備彙整資料表(T2) for (int j = 1, loopTo4 = colSQL_T2.Count; j <= loopTo4; j++) CollectionSQL.Add(colSQL_T2[j]); // 報工單拋轉明細資料表(T3) for (int j = 1, loopTo5 = colSQL_T3.Count; j <= loopTo5; j++) CollectionSQL.Add(colSQL_T3[j]); ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, CollectionSQL); } else { funCreateWOWorkReportData_TTICDRet = "fail;" + TranslateMsg("[%ERP Return Message%]:", strLanguageMode, strResourceDir) + description + ""; exitTry1 = true; break; } } if (exitTry1) { break; } } dsTemp.Dispose(); } // '----- 將UNDO鎖住 ----- // Dim strCond As String // If strDataBaseType <> "oracle" Then // strCond = " Select distinct B.LotSerial " // strCond += "From " & tblCont_Resource & " A, tblWIPLotLog B " // strCond += "Where A.LogGroupSerial = B.LogGroupSerial " // strCond += "And A.EventTime >= '" & strProductionDateFrom & "' AND A.EventTime < '" & strProductionDateEnd & "' " // Else // strCond = " Select distinct B.LotSerial " // strCond += "From " & tblCont_Resource & " A, tblWIPLotLog B " // strCond += "Where A.LogGroupSerial = B.LogGroupSerial " // strCond += "And A.EventTime >= To_Date('" & strProductionDateFrom & "','YYYY/MM/DD') AND A.EventTime < To_Date('" & strProductionDateEnd & "','YYYY/MM/DD') " // End If // strSQL = " Update tblWIPReverseHistory Set CommitState=1, CommitDesc='AutoRun CreateWOWorkReportData_TTICD' Where LotSerial In (" & strCond & ")" // CollectionSQL.Add(strSQL) // '平攤的計算方式才需要回填tblWIPCont_Equipment與tblWIPCont_Employee_MultiUser // If blnShare Then // strSQL = "Update tblWIPCont_Equipment Set ERPFlag = 1, WorkReportID = '" & strWorkReportID & "' Where LotSerial In (" & strCond & ")" // CollectionSQL.Add(strSQL) // strSQL = "Update tblWIPCont_Employee_MultiUser Set ERPFlag = 1, WorkReportID = '" & strWorkReportID & "' Where LotSerial In (" & strCond & ")" // CollectionSQL.Add(strSQL) // End If // 'tblCont_Resource壓上ERPFlag與WorkReportID // strSQL = "Update " & tblCont_Resource & " Set ERPFlag = 1, WorkReportID = '" & strWorkReportID & "'" & // " Where EventTime >= To_Date('" & strProductionDateFrom & "','YYYY/MM/DD') AND EventTime < To_Date('" & strProductionDateEnd & "','YYYY/MM/DD') " // CollectionSQL.Add(strSQL) // 報工單拋轉彙整資料表(T1) strSQL = "Insert Into tblERPWorkRPT_Summary (WorkReportID, DataStartTime, DataEndTime, ERPFlag)" + " Values('" + strWorkReportID + "', To_Date('" + strProductionDateFrom + "','YYYY/MM/DD'), To_Date('" + strProductionDateEnd + "','YYYY/MM/DD'), 1)"; SQLCommandTuning(strDataBaseType, ref strSQL); CollectionSQL = new Collection(); CollectionSQL.Add(strSQL); // '報工單拋轉設備彙整資料表(T2) // For i As Integer = 1 To colSQL_T2.Count // CollectionSQL.Add(colSQL_T2(i)) // Next // '報工單拋轉明細資料表(T3) // For i As Integer = 1 To colSQL_T3.Count // CollectionSQL.Add(colSQL_T3(i)) // Next ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, CollectionSQL); // //Return success if (costCenter == "N") { funCreateWOWorkReportData_TTICDRet = "success;" + responseValue + ";" + strMONo; } else { funCreateWOWorkReportData_TTICDRet = "success;" + responseValue + ";" + strEquipmentNo; } } catch (Exception ex) { funCreateWOWorkReportData_TTICDRet = CombineFailMsg("0000-999999", ex.Message); // 2013/02/05, Hank, Send Email colParameters.Add(funCreateWOWorkReportData_TTICDRet, "EmailBody"); SendJobFailEmail(colParameters); } finally { try { CloseConnection(cnnTemp); // =================================2021/03/30 Elvis 0087678: [瑞賢] AUTORUN報工--報工失敗,發送郵件新增提供失敗清單 STAR var dsResult = new DataTable("dsResult"); // 拋轉日期、報工日期、工單編號、失敗原因 // strProductionDateFrom 報工日期CreateConnection // drResource("MONo").ToString 工單編號 // funCreateWOWorkReportData_TTICD 失敗原因CreateConnection dsResult.Columns.Add("WOWorkDate", Type.GetType("System.String")); // 拋轉日期 dsResult.Columns.Add("ProductionDate", Type.GetType("System.String")); // 報工日期 dsResult.Columns.Add("MONo", Type.GetType("System.String")); // 工單單號 dsResult.Columns.Add("FailReason", Type.GetType("System.String")); // 失敗原因 string strFillType = "XLS"; dsResult.Rows.Add(strProductionDateEnd, strProductionDateFrom, strMONo, funCreateWOWorkReportData_TTICDRet); //var iugTemp = new iMESUltraGrid.iMESUltraGridControl(); //iugTemp.iMESUltraGrid_InitializeLayOut += iMESUltraGrid_InitializeLayOut; // Dim iugTemp As New iMESUltraGrid.iMESUltraGridControl // AddHandler iugTemp.iMESUltraGrid_InitializeLayOut, AddressOf iMESUltraGrid_InitializeLayOut //iugTemp.Identity = "iMES"; //iugTemp.UserNo = "iMES"; //var memStream = new MemoryStream(); //讓最後一列style生效,新增空列 DataRow drEnd = dsResult.NewRow(); dsResult.Rows.Add(drEnd); var dtResult = new DataSet(); dtResult.Tables.Add(dsResult); //iugTemp.iMESUltraGrid.DataSource = dtResult.Tables[0]; // 0133391: [跨平台]AutoRunLib移除iMESUltraGrid的使用, 2023/4/21 String ExcelMode = strFillType.ToString().ToUpper(); //"XLSX" , "XLS" byte[] membyte = modAutoRunLibrary.funExcelToByte(dtResult, ExcelMode, strLanguageMode, strResourceDir); //var memStream = new MemoryStream(membyte); //memStream.Seek(0L, SeekOrigin.Begin); //// 將欄位翻譯 //if (!string.IsNullOrEmpty(modWIN.gLanguageMode)) //{ // var ColSaveControl = new Collection(); // ColSaveControl.Add(iugTemp.iMESUltraGrid); // ChgTranslateName(ColSaveControl, modWIN.gLanguageMode); //} //foreach (DataRow drResource in dsResult.Rows) //{ // switch (strFillType.ToString().ToUpper() ?? "") // { // // Case "XLSX" // // '匯出Excel再轉Stream // // workbook = ExcelExp.Export(iugTemp.iMESUltraGrid, Infragistics.Documents.Excel.WorkbookFormat.Excel2007) // // workbook.Save(memStream) // // memStream.Seek(0, SeekOrigin.Begin) // case "XLS": // { // // 匯出Excel再轉Stream // //workbook = ExcelExp.Export(iugTemp.iMESUltraGrid); // iugTemp.iMESUltraGrid, Infragistics.Documents.Excel.WorkbookFormat.Excel97To2003 // //workbook.Save(memStream); // //memStream.Seek(0L, SeekOrigin.Begin); // break; // } // } //} // Stream轉成附件檔 //var AttachFile = new byte[(int)(memStream.Length - 1L + 1)]; //double count = 0d; //while (count < memStream.Length) //{ // AttachFile[(int)Math.Round(count)] = Convert.ToByte(memStream.ReadByte()); // count += 1d; //} try { dtResult.Dispose(); } catch (Exception ex) { } // =================================2021/03/30 Elvis 0087678: [瑞賢] AUTORUN報工--報工失敗,發送郵件新增提供失敗清單 END // 寄送Mail string argFileName = "ErrorList.xls"; string argEmailSubject = "WO Work Report Data [" + strProductionDateFrom + "]"; string argEmailBody = Conversions.ToString(funCreateWOWorkReportData_TTICDRet); modAutoRunLibrary.SendMultiEmail(ref argFileName, ref argEmailSubject, argEmailBody, strGroupNo, membyte); funCreateWOWorkReportData_TTICDRet = argEmailBody; } catch (Exception ex) { funCreateWOWorkReportData_TTICDRet = "fail_Finally;" + ex.Message; } } } while (false); return funCreateWOWorkReportData_TTICDRet; } #endregion #region PM // ======================================================================================================================== // 程式名稱:funEQPMaintenancePlan // 傳入參數:colParameters // 傳回參數:success(成功), fail(失敗) // 用 途:寄送保養計畫通知 // 撰寫人員:Acer.Wei // 撰寫日期:2011/12/23 // ======================================================================================================================== // Private Function funEQPMaintenancePlan(Optional ByVal colParameters As Collection = Nothing) // Dim cnnTemp As OleDb.OleDbConnection // Dim drTemp As OleDb.OleDbDataReader // Dim strSQL As String // Dim arriveTime As DateTime = DateTime.Now // Dim strGroupNo As String = String.Empty '異常處理群組 // Dim strAfterDayQty As String = String.Empty '發送多少天後資料 // Dim datData As Date // Dim strEmailSubject As String // Dim strEmailBody As String // Try // 'ParameterXX參數說明 // '01 使用者群組 // '02 發送多少天後資料 // 'Parameter01為傳入參數,作為GroupNo,若無此值則不進行下面的程式 // If IsNothing(colParameters("Parameter01")) OrElse Trim(colParameters("Parameter01")) = "" Then // funEQPMaintenancePlan = "User GroupNo not found!!!(Parameter 01)" // Exit Try // Else // strGroupNo = Trim(colParameters("Parameter01")) // End If // 'Parameter02為傳入參數,作為AfterDayQty,若無此值則不進行下面的程式 // If IsNothing(colParameters("Parameter02")) OrElse Trim(colParameters("Parameter02")) = "" Then // funEQPMaintenancePlan = "After Day Qty not found!!!(Parameter 02)" // Exit Try // Else // If IsNumeric(colParameters("Parameter02")) Then // strAfterDayQty = Trim(colParameters("Parameter02")) // Else // funEQPMaintenancePlan = "After Day Qty not Numeric!!!(Parameter 02)" // Exit Try // End If // End If // strAfterDayQty = Trim(colParameters("Parameter02")) // datData = DateAdd(DateInterval.Day, CInt(strAfterDayQty), Now()) // cnnTemp = CreateConnection(strConnectionString) // strSQL = " Select A.*, C.EngineerGroupNo " & _ // " From tblPMEqpMaintenancePlan A, " & _ // " tblPMEqpTypeSopBasis B, " & _ // " tblEQPEquipmentBasis C " & _ // " Where A.PMEqpSopNo=B.PMEqpSopNo " & _ // " And A.EquipmentNo=C.EquipmentNo " & _ // " And B.AutoEmail=1 " & _ // " And A.PMEstDateTime=To_Date('" & Format(datData, "yyyy/MM/dd") & "','YYYY/MM/DD')" // strSQL = SQLCommandTuning(strDataBaseType, strSQL) // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) // drTemp = ExecuteSQLQuery_Reader() // Do While drTemp.Read // strEmailSubject = "Information, EquipmentNo:" & drTemp("EquipmentNo") & " Maintenance Plan At " & Format(datData, "yyyy/MM/dd") // '使用Html的寫法 // strEmailBody = "

Equipment Maintenance Plan Information :

" // strEmailBody += "

EquipemntNo:" & drTemp("EquipmentNo") & "

" // strEmailBody += "

FrequencyNo:" & drTemp("FrequencyNo") & "

" // strEmailBody += "

PMSOPNo:" & drTemp("PMSOPNo") & "

" // strEmailBody += "

PlanDate:" & Format(drTemp("PMEstDateTime"), "yyyy/MM/dd") & "

" // strEmailBody += "" // SendMultiEmail("N/A", strEmailSubject, strEmailBody, drTemp("EngineerGroupNo"), , GroupType.EquipmentGroup) // Loop // drTemp.Close() // '//Return success // funEQPMaintenancePlan = "success;" // Catch ex As Exception // funEQPMaintenancePlan = "fail;" & ex.Message // '寄送Mail // SendMultiEmail("N/A", "Equipment Maintenance Plan Report Error [Plan Date:" & Format(CDate(datData), "yyyy/MM/dd") & "]", funEQPMaintenancePlan, strGroupNo, , GroupType.UserGroup) // Finally // Try // Call objSetting.CloseConnection(cnnTemp) // Catch ex As Exception // funEQPMaintenancePlan = "fail_Finally;" & ex.Message // End Try // End Try // End Function #endregion #region Replication private string funReplicationDB(Collection colParameters = null) { string funReplicationDBRet = default(string); // 此 Function 將目前現況的交易資料轉入ReportDB // 傳入值: colParameters{要轉送的Table,不轉送的Table} // 傳回值: success(成功), fail(失敗) // colParameters的資料取得範例如下 // colParameters("TBLMESAUTORUNJOB,") // colParameters("ProductNo") var cnnSource = default(IDbConnection); var cmmSource = default(IDbCommand); //System.Data.OleDb.OleDbDataAdapter daTemp; DbDataReader drTemp; var oTranSource = default(IDbTransaction); var CollectionSQL = new Collection(); var cnnTarget = default(IDbConnection); var cmmTarget = default(IDbCommand); IDataParameter param; var oTranTarget = default(IDbTransaction); var dsTemp = new DataSet(); DataRow[] drSel; var strSQL = default(string); string strCommandText; string[] aryReplicationTableList; try { // 取出目前現況資料 cnnSource = CreateConnection(strConnectionString); // 取得目標資料庫的連線字串 string argstrDataBaseType = "Null"; string strTargetConnection = AppSettings.GetConnectionString_LOB(objSetting.GetReportConnectionString(strDataBaseType: argstrDataBaseType)); string strTargetDataBaseType = objSetting.GetReportDataBaseType(); // 建立目標資料庫連線 if (strTargetDataBaseType == "oracle") { cnnTarget = new OracleConnection(strTargetConnection); cnnTarget.Open(); } else if (strTargetDataBaseType == "mssql") { cnnTarget = new SqlConnection(strTargetConnection); cnnTarget.Open(); } else { throw new Exception("Database not support,only support Oracle & SQL!"); } try { aryReplicationTableList = Strings.Split(File.ReadAllText(AppDomain.CurrentDomain.BaseDirectory + "ReplicationTableList.config"), Constants.vbNewLine); if (aryReplicationTableList.Length == 1 && string.IsNullOrEmpty(aryReplicationTableList[0])) { aryReplicationTableList = null; } } catch (Exception ex) { aryReplicationTableList = null; } ToNextTrans: ; // 取出先執行的交易資料 if (strDataBaseType == "oracle") { strSQL = "Select * From tblSYSTrans Where TransID = (Select TransID From tblSYSTrans Where TransDate = (Select Min(TransDate) TransDate From tblSYSTrans) AND ROWNUM <= 1) Order By SQLID"; } else if (strDataBaseType == "mssql") { strSQL = "Select * From tblSYSTrans Where TransID = (Select TOP 1 TransID From tblSYSTrans Where TransDate = (Select Min(TransDate) TransDate From tblSYSTrans)) Order By SQLID"; } //cmmSource = new IDbCommand(strSQL, cnnSource); //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmSource); //daTemp.Fill(dsTemp, "tblSYSTrans"); //daTemp.Dispose(); //cmmSource.Dispose(); ExecuteSQLQuery_Adapter(strSQL, dsTemp, "tblSYSTrans", cnnSource); // 如果有交易資料才要處理,不然直接跳到結束 if (dsTemp.Tables["tblSYSTrans"] == null || dsTemp.Tables["tblSYSTrans"].Rows.Count <= 0) goto ToEnd; if (dsTemp.Tables["tblSYSTrans"].Select("SQLType=1").Length > 0) { strSQL = "Select * From tblSYSTrans_AttachFile Where TransID = '" + dsTemp.Tables["tblSYSTrans"].Rows[0]["TransID"].ToString() + "' Order By SQLID"; //cmmSource = new IDbCommand(strSQL, cnnSource); //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmSource); //daTemp.Fill(dsTemp, "tblSYSTrans_AttachFile"); //daTemp.Dispose(); //cmmSource.Dispose(); ExecuteSQLQuery_Adapter(strSQL, dsTemp, "tblSYSTrans_AttachFile", cnnSource); } if (dsTemp.Tables["tblSYSTrans"].Select("SQLType=2").Length > 0) { strSQL = "Select * From tblSYSTrans_Clob Where TransID = '" + dsTemp.Tables["tblSYSTrans"].Rows[0]["TransID"].ToString() + "' Order By SQLID"; //cmmSource = new IDbCommand(strSQL, cnnSource); //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmSource); //daTemp.Fill(dsTemp, "tblSYSTrans_Clob"); //daTemp.Dispose(); //cmmSource.Dispose(); ExecuteSQLQuery_Adapter(strSQL, dsTemp, "tblSYSTrans_Clob", cnnSource); } // //Begin Source Transaction oTranSource = cnnSource.BeginTransaction(); if (strTargetDataBaseType == "oracle") { cmmTarget = new OracleCommand(); } else if (strTargetDataBaseType == "mssql") { cmmTarget = new SqlCommand(); } else { throw new Exception("Database not support,only support Oracle & SQL!"); } cmmTarget.Connection = cnnTarget; // Begin Target Transaction oTranTarget = cnnTarget.BeginTransaction(); cmmTarget.Transaction = oTranTarget; for (int i = 0, loopTo = dsTemp.Tables["tblSYSTrans"].Rows.Count - 1; i <= loopTo; i++) { // 如果沒有設定Table則全部執行,有設定Table則只執行Table List中的SQL if (aryReplicationTableList != null && aryReplicationTableList.Length > 0) { foreach (string strReplicationTable in aryReplicationTableList) { if (!string.IsNullOrEmpty(strReplicationTable.Trim()) && dsTemp.Tables["tblSYSTrans"].Rows[i]["SQLTEXT"].ToString().ToUpper().IndexOf(" " + strReplicationTable.Trim().ToUpper()) != -1) { // 有找到,離開For,執行SQL goto ToExeSQL; } } // 沒找到,表示不用執行,跳到下一個SQL goto ToNextSQL; } ToExeSQL: ; string strSQLCommandTmp = dsTemp.Tables["tblSYSTrans"].Rows[i]["SQLTEXT"].ToString(); strCommandText = SQLCommandTuning(strTargetDataBaseType, ref strSQLCommandTmp); if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dsTemp.Tables["tblSYSTrans"].Rows[i]["SQLTYPE"], 0, false))) // 普通SQL { cmmTarget.CommandText = strCommandText; cmmTarget.ExecuteNonQuery(); } else if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dsTemp.Tables["tblSYSTrans"].Rows[i]["SQLTYPE"], 1, false))) // 有附檔類型的SQL { cmmTarget.CommandText = strCommandText; drSel = dsTemp.Tables["tblSYSTrans_AttachFile"].Select("TransID = '" + dsTemp.Tables["tblSYSTrans"].Rows[i]["TransID"].ToString() + "' And SQLID = " + dsTemp.Tables["tblSYSTrans"].Rows[i]["SQLID"].ToString()); if (drSel.Length > 0) { for (int j = 0, loopTo1 = drSel.Length - 1; j <= loopTo1; j++) { if (strDataBaseType == "oracle") { param = new OracleParameter(":" + drSel[j]["PName"].ToString(), OracleDbType.Blob); param.Value = drSel[j]["PBinary"]; cmmTarget.Parameters.Add(param); param = null; } else if (strDataBaseType == "mssql") { param = new SqlParameter("@" + drSel[j]["PName"].ToString(), SqlDbType.VarBinary); param.Value = drSel[j]["PBinary"]; cmmTarget.Parameters.Add(param); param = null; } else { throw new Exception("Database not support,only support Oracle & SQL!"); } } } cmmTarget.ExecuteNonQuery(); cmmTarget.Parameters.Clear(); } else if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dsTemp.Tables["tblSYSTrans"].Rows[i]["SQLTYPE"], 2, false))) // LOB類型的SQL { cmmTarget.CommandText = strCommandText; drSel = dsTemp.Tables["tblSYSTrans_CLOB"].Select("TransID = '" + dsTemp.Tables["tblSYSTrans"].Rows[i]["TransID"].ToString() + "' And SQLID = " + dsTemp.Tables["tblSYSTrans"].Rows[i]["SQLID"].ToString()); if (drSel.Length > 0) { for (int j = 0, loopTo2 = drSel.Length - 1; j <= loopTo2; j++) { if (strDataBaseType == "oracle") { param = new OracleParameter(":" + drSel[j]["PName"].ToString(), OracleDbType.Clob); param.Value = drSel[j]["PVarchar"]; cmmTarget.Parameters.Add(param); param = null; } else if (strDataBaseType == "mssql") { param = new SqlParameter("@" + drSel[j]["PName"].ToString(), SqlDbType.NVarChar); param.Value = drSel[j]["PVarchar"]; cmmTarget.Parameters.Add(param); param = null; } else { throw new Exception("Database not support,only support Oracle & SQL!"); } } } cmmTarget.ExecuteNonQuery(); cmmTarget.Parameters.Clear(); } ToNextSQL: ; } cmmSource = CreateCommand(); cmmSource.Connection = cnnSource; cmmSource.Transaction = oTranSource; cmmSource.CommandText = "Delete From tblSYSTrans_CLOB Where TransID = '" + dsTemp.Tables["tblSYSTrans"].Rows[0]["TransID"].ToString() + "'"; cmmSource.ExecuteNonQuery(); cmmSource.CommandText = "Delete From tblSYSTrans_ATTACHFILE Where TransID = '" + dsTemp.Tables["tblSYSTrans"].Rows[0]["TransID"].ToString() + "'"; cmmSource.ExecuteNonQuery(); cmmSource.CommandText = "Delete From tblSYSTrans Where TransID = '" + dsTemp.Tables["tblSYSTrans"].Rows[0]["TransID"].ToString() + "'"; cmmSource.ExecuteNonQuery(); oTranSource.Commit(); oTranTarget.Commit(); cmmSource.Dispose(); cmmTarget.Dispose(); if (dsTemp.Tables["tblSYSTrans"] != null) dsTemp.Tables["tblSYSTrans"].Clear(); if (dsTemp.Tables["tblSYSTrans_AttachFile"] != null) dsTemp.Tables["tblSYSTrans"].Clear(); if (dsTemp.Tables["tblSYSTrans_Clob"] != null) dsTemp.Tables["tblSYSTrans"].Clear(); // 交易完成,取出下一筆交易資料 goto ToNextTrans; ToEnd: ; // //Return success funReplicationDBRet = "success"; } catch (Exception e1) { // Try to rollback the transaction try { if (oTranSource != null) oTranSource.Rollback(); if (oTranTarget != null) oTranSource.Rollback(); } catch { // Do nothing here; transaction is not active. } // 發生錯誤時丟回本身的Function Name及系統錯誤訊息 funReplicationDBRet = CombineFailMsg("0000-999999", e1.Message); // 發送EMAIL colParameters.Add(funReplicationDBRet, "EmailBody"); SendJobFailEmail(colParameters); } finally { if (oTranSource != null) oTranSource = null; if (oTranTarget != null) oTranTarget = null; CloseConnection(cnnSource); CloseConnection(cnnTarget); if (cmmSource != null) cmmSource.Dispose(); if (cmmTarget != null) cmmTarget.Dispose(); if (dsTemp != null) dsTemp.Dispose(); } return funReplicationDBRet; } #endregion #region Data Archive // 2013/02/04,Hank,資料封存 // 共用函數 private void LoadArchiveBasis(ref DataSet dsTemp, ref DataTable dtArchiveByMO, ref DataTable dtDeleteByDate) { // 讀取數據封存主檔 string strArchiveBasis = default(string), strArchiveRelation = default(string); dsTemp.Relations.Clear(); foreach (DataTable table in dsTemp.Tables) table.Constraints.Clear(); // 先判斷是否dataset中已有element之datatable,若有,需先remove否則會有錯誤 if (!(dsTemp.Tables[strArchiveBasis] == null)) { dsTemp.Tables.Remove(strArchiveBasis); } if (!(dsTemp.Tables[strArchiveRelation] == null)) { dsTemp.Tables.Remove(strArchiveRelation); } // 組InXml的字串 string argSendTime = Conversions.ToString(DateTime.Now); strIdentity = CombineXMLIdentity(modWIN.gComputerName, modWIN.gUserNo, argSendTime); strParameter = ""; InXml = CombineXMLRequest(strIdentity, strParameter); try { // 呼叫WebService // OutXml = wsSYS.LoadArchiveBasis(InXml) OutXml = modAutoRunLibrary.InvokeSrv("wsSYS.LoadArchiveBasis", InXml); // 利用XmlDoc物件處理ReturnValue XmlDoc.LoadXml(OutXml); if (chkExecutionSuccess(XmlDoc)) { strArchiveBasis = XmlDoc.GetElementsByTagName("returnvalue").Item(0).SelectNodes("loadarchivebasis").Item(0).SelectNodes("name").Item(0).InnerXml; // 取出Schema,dataset讀取Schema可防止Null Field及DateTime的問題 XmlSchema = XmlDoc.DocumentElement.GetElementsByTagName("loadarchivebasis").Item(0).SelectNodes("schema").Item(0).InnerXml; if (!string.IsNullOrEmpty(XmlSchema)) { // 將XML讀入String Reader object中,因為Dataset讀入XML時必須透過String Reader物件 tmpStringReader = new StringReader(XmlSchema); dsTemp.ReadXmlSchema(tmpStringReader); tmpStringReader.Close(); } // 取出Data XmlData = XmlDoc.DocumentElement.GetElementsByTagName("loadarchivebasis").Item(0).SelectNodes("value").Item(0).InnerXml; if (!string.IsNullOrEmpty(XmlData)) { tmpStringReader = new StringReader(XmlData); dsTemp.ReadXml(tmpStringReader); tmpStringReader.Close(); } var colCheckFlag = new DataColumn(); colCheckFlag.ColumnName = "CheckFlag"; colCheckFlag.DataType = Type.GetType("System.Boolean"); colCheckFlag.DefaultValue = true; dsTemp.Tables[strArchiveBasis].Columns.Add(colCheckFlag); dsTemp.Tables[strArchiveBasis].DefaultView.Sort = "ARCHIVETABLENAME"; dtArchiveByMO.Clear(); dsTemp.Tables[strArchiveBasis].DefaultView.RowFilter = "ARCHIVETYPE = 'ARCHIVEBYMONO' OR ARCHIVETYPE = 'ARCHIVEBYLOTNO' OR ARCHIVETYPE = 'ARCHIVEBYLOTSERIAL' OR ARCHIVETYPE = 'ARCHIVEBYLOGGROUPSERIAL'"; dtArchiveByMO = dsTemp.Tables[strArchiveBasis].DefaultView.ToTable(); dtDeleteByDate.Clear(); dsTemp.Tables[strArchiveBasis].DefaultView.RowFilter = "ARCHIVETYPE = 'DELETEBYDATE'"; dtDeleteByDate = dsTemp.Tables[strArchiveBasis].DefaultView.ToTable(); dsTemp.Tables[strArchiveBasis].DefaultView.RowFilter = "ARCHIVETYPE = 'ARCHIVEBYDATE'"; } else { throw new Exception(GetExceptionSysMsg(XmlDoc)); } } catch (Exception ex) { throw; } finally { } } private string GetArchiveConfig() { string GetArchiveConfigRet = default(string); // 取得封存目的schema //System.Data.OleDb.OleDbDataAdapter daTemp; var dsTempConfig = new DataSet(); var cnnTemp = default(IDbConnection); string strSQL; try { // //Create connection cnnTemp = CreateConnection(strConnectionString); strSQL = "Select ARCHIVEDATABASE From TBLSYSARCHIVECONFIG Where ACTIVESTATUS = 1"; // //Select data strSQL = SQLCommandTuning(strDataBaseType, ref strSQL); //cmmTemp = new IDbCommand(strSQL, cnnTemp); //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp); //daTemp.Fill(dsTempConfig, "ArchiveConfig"); //daTemp.Dispose(); //cmmTemp.Dispose(); ExecuteSQLQuery_Adapter(strSQL, dsTempConfig, "ArchiveConfig", cnnTemp); GetArchiveConfigRet = Conversions.ToString(dsTempConfig.Tables[0].Rows[0][0]); } catch (Exception ex) { GetArchiveConfigRet = null; throw; } finally { CloseConnection(cnnTemp); if (dsTempConfig != null) { dsTempConfig.Dispose(); } } return GetArchiveConfigRet; } private DateTime GetOldestMOCloseDate() { DateTime GetOldestMOCloseDateRet = default(DateTime); // 取得工單結案日 GetOldestMOCloseDateRet = defDateTime; // 組InXml的字串 string argSendTime = Conversions.ToString(DateTime.Now); strIdentity = CombineXMLIdentity(modWIN.gComputerName, modWIN.gUserNo, argSendTime); strParameter = ""; InXml = CombineXMLRequest(strIdentity, strParameter); try { // 呼叫WebService // OutXml = wsSYS.GetOldestMOCloseDate(InXml) OutXml = modAutoRunLibrary.InvokeSrv("wsSYS.GetOldestMOCloseDate", InXml); // 利用XmlDoc物件處理ReturnValue XmlDoc.LoadXml(OutXml); if (chkExecutionSuccess(XmlDoc)) { GetOldestMOCloseDateRet = Conversions.ToDate(XmlDoc.GetElementsByTagName("returnvalue").Item(0).InnerText); } else { throw new Exception(GetExceptionSysMsg(XmlDoc)); } } catch (Exception ex) { throw ex; } finally { } return GetOldestMOCloseDateRet; } private DateTime GetOldestTableDate(string TableList) { DateTime GetOldestTableDateRet = default(DateTime); // 取得封存日期 GetOldestTableDateRet = defDateTime; // 組InXml的字串 string argSendTime = Conversions.ToString(DateTime.Now); strIdentity = CombineXMLIdentity(modWIN.gComputerName, modWIN.gUserNo, argSendTime); string argvalue_name = "tablelist"; string argname = "TableList"; string argtype = "String"; string argdesc = ""; strParameter = CombineXMLParameterMultiValue(argvalue_name, argname, argtype, TableList, argdesc); InXml = CombineXMLRequest(strIdentity, strParameter); try { // 呼叫WebService // OutXml = wsSYS.GetOldestTableDate(InXml) OutXml = modAutoRunLibrary.InvokeSrv("wsSYS.GetOldestTableDate", InXml); // 利用XmlDoc物件處理ReturnValue XmlDoc.LoadXml(OutXml); if (chkExecutionSuccess(XmlDoc)) { GetOldestTableDateRet = Conversions.ToDate(XmlDoc.GetElementsByTagName("returnvalue").Item(0).InnerText); } else { throw new Exception(GetExceptionSysMsg(XmlDoc)); } } catch (Exception ex) { throw ex; } return GetOldestTableDateRet; } // Archive By MO private string funDataArchiveByMO(Collection colParameters = null) { string funDataArchiveByMORet = default(string); var dsTemp = new DataSet(); DataTable dtArchiveByMO = new DataTable(), dtDeleteByDate = new DataTable(); DataRow[] drSel; DataRow drAdd; int IntParDay; // 傳入天數-封存幾天以前的資料 do { try { // ParameterXX參數說明 // 01 Archive Day // Parameter01為傳入參數,作為IntParDay,若無此值則不進行下面的程式 if (colParameters["Parameter01"] == null || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter01"])))) { funDataArchiveByMORet = "Archive Day not found!!!(Parameter 01)"; break; } else if (Information.IsNumeric(colParameters["Parameter01"])) { IntParDay = Conversions.ToInteger(Strings.Trim(Conversions.ToString(colParameters["Parameter01"]))); } else { funDataArchiveByMORet = "Archive Day not Numeric!!!(Parameter 01)"; break; } int IntMaxDay; // Maximum Day DateTime IntArchiveDay = Conversions.ToDate(DateTime.Now.AddDays(-IntParDay).ToString("yyyy/MM/dd 23:59:59")); // 轉成日期 string strArchiveConfig; // Schema name var dtArchiveProcess1 = new DataTable(); // 要執行封存的table記錄 dtArchiveProcess1 = new DataTable("ArchiveProcess1"); dtArchiveProcess1.Columns.Add("ItemNo", Type.GetType("System.Decimal")); dtArchiveProcess1.Columns.Add("ArchiveDate", Type.GetType("System.DateTime")); LoadArchiveBasis(ref dsTemp, ref dtArchiveByMO, ref dtDeleteByDate); dsTemp.Dispose(); dtDeleteByDate.Dispose(); strArchiveConfig = GetArchiveConfig(); // 都沒有勾選就不執行了 drSel = dtArchiveByMO.Select("CheckFlag=True"); if (drSel.Length == 0) throw new Exception(TranslateMsg("[%PleaseCheck%] [%ArchiveByMO%] [%CONFIGSETTING%]!", strLanguageMode, strResourceDir)); // 要封存的TABLE資訊 存成XML string strArchiveByMOTable = ""; for (int i = 0, loopTo = drSel.Length - 1; i <= loopTo; i++) { strArchiveByMOTable += CombineXMLValueTag( CombineXMLValue("archivetype", drSel[i]["ArchiveType"].ToString()) + CombineXMLValue("archivetablename", drSel[i]["ArchiveTableName"].ToString()) + CombineXMLValue("historytablename", drSel[i]["HistoryTableName"].ToString()) + CombineXMLValue("conditioncolumn", drSel[i]["ConditionColumn"].ToString())); } // 取得工單結案日 var OldestMOCloseDate = defDateTime; OldestMOCloseDate = GetOldestMOCloseDate(); // 沒有取得工單結案日不執行 if (OldestMOCloseDate == defDateTime) throw new Exception(TranslateMsg("[%MOCloseDate%] [%IS NOT EXIST%]!", strLanguageMode, strResourceDir)); // 執行封存紀錄,先以天為單位執行 if (DateAndTime.DateDiff(DateInterval.Day, OldestMOCloseDate, IntArchiveDay) > 0L) { if (DateAndTime.DateAdd(DateInterval.Day, DateAndTime.DateDiff(DateInterval.Day, OldestMOCloseDate, IntArchiveDay), OldestMOCloseDate) < IntArchiveDay) { IntMaxDay = (int)(DateAndTime.DateDiff(DateInterval.Day, OldestMOCloseDate, IntArchiveDay) + 1L); } else { IntMaxDay = (int)DateAndTime.DateDiff(DateInterval.Day, OldestMOCloseDate, IntArchiveDay); } dtArchiveProcess1.Clear(); for (int i = 0, loopTo1 = IntMaxDay - 1; i <= loopTo1; i++) { if (i != IntMaxDay - 1) { drAdd = dtArchiveProcess1.NewRow(); drAdd["ItemNo"] = i + 1; drAdd["ArchiveDate"] = DateAndTime.DateAdd(DateInterval.Day, i + 1, OldestMOCloseDate); dtArchiveProcess1.Rows.Add(drAdd); } else { drAdd = dtArchiveProcess1.NewRow(); drAdd["ItemNo"] = i + 1; drAdd["ArchiveDate"] = IntArchiveDay; dtArchiveProcess1.Rows.Add(drAdd); } } } else if (OldestMOCloseDate < IntArchiveDay) // 執行封存紀錄小於1天,執行一次就足夠 { IntMaxDay = 1; dtArchiveProcess1.Clear(); drAdd = dtArchiveProcess1.NewRow(); drAdd["ItemNo"] = 1; drAdd["ArchiveDate"] = IntArchiveDay; dtArchiveProcess1.Rows.Add(drAdd); } else // 沒有需要執行的封存紀錄 { funDataArchiveByMORet = "success"; break; } // 開始執行封存記錄 ArchiveByMO(strArchiveConfig, strArchiveByMOTable, dtArchiveProcess1); funDataArchiveByMORet = "success"; } catch (Exception ex) { funDataArchiveByMORet = CombineFailMsg("0000-999999", ex.Message); colParameters.Add(funDataArchiveByMORet, "EmailBody"); SendJobFailEmail(colParameters); } } while (false); return funDataArchiveByMORet; } private void ArchiveByMO(string strArchiveDatabase1, string strArchiveByMOTable, DataTable dtArchiveProcess1) { dtArchiveProcess1.DefaultView.Sort = "ItemNo"; // 組InXml的字串 string argSendTime = Conversions.ToString(DateTime.Now); strIdentity = CombineXMLIdentity(modWIN.gComputerName, modWIN.gUserNo, argSendTime); string argvalue_name = "archivedate"; string argname = "ArchiveDate"; string argtype = "DateTime"; string argvalue = Strings.Format(dtArchiveProcess1.DefaultView[0]["ArchiveDate"], "yyyy/MM/dd H:mm:ss"); string argdesc = ""; strParameter = CombineXMLParameter(argvalue_name, argname, argtype, argvalue, argdesc); string argvalue_name1 = "archivedatabase"; string argname1 = "ArchiveDatabase"; string argtype1 = "String"; string argdesc1 = ""; strParameter += CombineXMLParameter(argvalue_name1, argname1, argtype1, strArchiveDatabase1, argdesc1); string argvalue_name2 = "archivetable"; string argname2 = "ArchiveTable"; string argtype2 = "String"; string argdesc2 = ""; strParameter += CombineXMLParameterMultiValue(argvalue_name2, argname2, argtype2, strArchiveByMOTable, argdesc2); string argvalue_name3 = "userno"; string argname3 = "UserNo"; string argtype3 = "String"; string argvalue1 = "AutoRun"; string argdesc3 = ""; strParameter += CombineXMLParameter(argvalue_name3, argname3, argtype3, argvalue1, argdesc3); InXml = CombineXMLRequest(strIdentity, strParameter); try { OutXml = modAutoRunLibrary.InvokeSrv("wsSYS.ExeArchiveByMO", InXml); XmlDocument XmlDoc = new XmlDocument(); XmlDoc.LoadXml(OutXml); if (chkExecutionSuccess(XmlDoc)) { // 刪除已送出的資料 dtArchiveProcess1.DefaultView[0].Delete(); dtArchiveProcess1.AcceptChanges(); if (dtArchiveProcess1.Rows.Count > 0) { // 遞迴處理下一筆資料 ArchiveByMO(strArchiveDatabase1, strArchiveByMOTable, dtArchiveProcess1); } } else { throw new Exception(XmlDoc.InnerText); } XmlDoc = null; } catch (Exception ex) { throw; } } // Archive By Date private string funDataArchiveByDate(Collection colParameters = null) { string funDataArchiveByDateRet = default(string); DataSet dsTemp = new DataSet(), dsGroup = new DataSet(); DataTable dtArchiveByMO = new DataTable(), dtDeleteByDate = new DataTable(); DataRow[] drSel; DataRow drAdd; int IntParDay; // 傳入天數-封存幾天以前的資料 do { try { // ParameterXX參數說明 // 01 Archive Day // Parameter01為傳入參數,作為IntParDay,若無此值則不進行下面的程式 if (colParameters["Parameter01"] == null || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter01"])))) { funDataArchiveByDateRet = "Archive Day not found!!!(Parameter 01)"; break; } else if (Information.IsNumeric(colParameters["Parameter01"])) { IntParDay = Conversions.ToInteger(Strings.Trim(Conversions.ToString(colParameters["Parameter01"]))); } else { funDataArchiveByDateRet = "Archive Day not Numeric!!!(Parameter 01)"; break; } int IntMaxDay; // Maximum Day var IntArchiveDay = DateTime.Now.AddDays(-IntParDay); // 轉成日期 string strArchiveConfig; // Schema name var dtArchiveProcess2 = new DataTable(); dtArchiveProcess2 = new DataTable("ArchiveProcess2"); dtArchiveProcess2.Columns.Add("ItemNo", Type.GetType("System.Decimal")); dtArchiveProcess2.Columns.Add("ArchiveDate", Type.GetType("System.DateTime")); LoadArchiveBasis(ref dsTemp, ref dtArchiveByMO, ref dtDeleteByDate); dtArchiveByMO.Dispose(); dtDeleteByDate.Dispose(); strArchiveConfig = GetArchiveConfig(); // 都沒有勾選就不執行了 drSel = dsTemp.Tables[0].Select("ArchiveType = 'ARCHIVEBYDATE' AND CheckFlag=True"); if (drSel.Length == 0) throw new Exception(TranslateMsg("[%PleaseCheck%] [%ArchivebyDate%] [%CONFIGSETTING%]!", strLanguageMode, strResourceDir)); // 要封存的TABLE資訊 存成XML string strArchiveByDateTable = ""; string strTableList = ""; for (int i = 0, loopTo = drSel.Length - 1; i <= loopTo; i++) { strArchiveByDateTable += CombineXMLValueTag( CombineXMLValue("archivetype", drSel[i]["ArchiveType"].ToString()) + CombineXMLValue("archivetablename", drSel[i]["ArchiveTableName"].ToString()) + CombineXMLValue("historytablename", drSel[i]["HistoryTableName"].ToString()) + CombineXMLValue("conditioncolumn", drSel[i]["ConditionColumn"].ToString())); strTableList += CombineXMLValueTag( CombineXMLValue("tablename", drSel[i]["ArchiveTableName"].ToString()) + CombineXMLValue("conditioncolumn", drSel[i]["ConditionColumn"].ToString())); } // 取得封存日 var OldestTableDate = defDateTime; OldestTableDate = GetOldestTableDate(strTableList); // 沒有取得封存日不執行 if (OldestTableDate == defDateTime) throw new Exception(TranslateMsg("[%ARCHIVEDATE%] [%IS NOT EXIST%]!", strLanguageMode, strResourceDir)); // 執行封存紀錄,先以天為單位執行 if (DateAndTime.DateDiff(DateInterval.Day, OldestTableDate, IntArchiveDay) > 0L) { if (DateAndTime.DateAdd(DateInterval.Day, DateAndTime.DateDiff(DateInterval.Day, OldestTableDate, IntArchiveDay), OldestTableDate) < IntArchiveDay) { IntMaxDay = (int)(DateAndTime.DateDiff(DateInterval.Day, OldestTableDate, IntArchiveDay) + 1L); } else { IntMaxDay = (int)DateAndTime.DateDiff(DateInterval.Day, OldestTableDate, IntArchiveDay); } dtArchiveProcess2.Clear(); for (int i = 0, loopTo1 = IntMaxDay - 1; i <= loopTo1; i++) { if (i != IntMaxDay - 1) { drAdd = dtArchiveProcess2.NewRow(); drAdd["ItemNo"] = i + 1; drAdd["ArchiveDate"] = DateAndTime.DateAdd(DateInterval.Day, i + 1, OldestTableDate); dtArchiveProcess2.Rows.Add(drAdd); } else { drAdd = dtArchiveProcess2.NewRow(); drAdd["ItemNo"] = i + 1; drAdd["ArchiveDate"] = IntArchiveDay; dtArchiveProcess2.Rows.Add(drAdd); } } } else if (OldestTableDate < IntArchiveDay) // 執行封存紀錄小於1天,執行一次就足夠 { IntMaxDay = 1; dtArchiveProcess2.Clear(); drAdd = dtArchiveProcess2.NewRow(); drAdd["ItemNo"] = 1; drAdd["ArchiveDate"] = IntArchiveDay; dtArchiveProcess2.Rows.Add(drAdd); } else // 沒有需要執行的封存紀錄 { funDataArchiveByDateRet = "success"; break; } // 開始執行封存記錄 ArchiveByDate(strArchiveConfig, strArchiveByDateTable, dtArchiveProcess2); funDataArchiveByDateRet = "success"; } catch (Exception ex) { funDataArchiveByDateRet = CombineFailMsg("0000-999999", ex.Message); colParameters.Add(funDataArchiveByDateRet, "EmailBody"); SendJobFailEmail(colParameters); } } while (false); return funDataArchiveByDateRet; } private void ArchiveByDate(string strArchiveDatabase2, string strArchiveByDateTable, DataTable dtArchiveProcess2) { dtArchiveProcess2.DefaultView.Sort = "ItemNo"; // 組InXml的字串 string argSendTime = Conversions.ToString(DateTime.Now); strIdentity = CombineXMLIdentity(modWIN.gComputerName, modWIN.gUserNo, argSendTime); string argvalue_name = "archivedate"; string argname = "ArchiveDate"; string argtype = "DateTime"; string argvalue = Strings.Format(dtArchiveProcess2.DefaultView[0]["ArchiveDate"], "yyyy/MM/dd H:mm:ss"); string argdesc = ""; strParameter = CombineXMLParameter(argvalue_name, argname, argtype, argvalue, argdesc); string argvalue_name1 = "archivedatabase"; string argname1 = "ArchiveDatabase"; string argtype1 = "String"; string argdesc1 = ""; strParameter += CombineXMLParameter(argvalue_name1, argname1, argtype1, strArchiveDatabase2, argdesc1); string argvalue_name2 = "archivetable"; string argname2 = "ArchiveTable"; string argtype2 = "String"; string argdesc2 = ""; strParameter += CombineXMLParameterMultiValue(argvalue_name2, argname2, argtype2, strArchiveByDateTable, argdesc2); string argvalue_name3 = "userno"; string argname3 = "UserNo"; string argtype3 = "String"; string argvalue1 = "AutoRun"; string argdesc3 = ""; strParameter += CombineXMLParameter(argvalue_name3, argname3, argtype3, argvalue1, argdesc3); InXml = CombineXMLRequest(strIdentity, strParameter); try { OutXml = modAutoRunLibrary.InvokeSrv("wsSYS.ExeArchiveByDate", InXml); XmlDocument XmlDoc = new XmlDocument(); XmlDoc.LoadXml(OutXml); if (chkExecutionSuccess(XmlDoc)) { // 刪除已送出的資料 dtArchiveProcess2.DefaultView[0].Delete(); dtArchiveProcess2.AcceptChanges(); if (dtArchiveProcess2.Rows.Count > 0) { // 遞迴處理下一筆資料 ArchiveByDate(strArchiveDatabase2, strArchiveByDateTable, dtArchiveProcess2); } } else { throw new Exception(XmlDoc.InnerText); } XmlDoc = null; } catch (Exception ex) { throw; } } // Delete By Date private string funDataDeleteByDate(Collection colParameters = null) { string funDataDeleteByDateRet = default(string); var dsTemp = new DataSet(); DataTable dtArchiveByMO = new DataTable(), dtDeleteByDate = new DataTable(); DataRow[] drSel; DataRow drAdd; int IntParDay; // 傳入天數-封存幾天以前的資料 do { try { // ParameterXX參數說明 // 01 Archive Day // Parameter01為傳入參數,作為IntParDay,若無此值則不進行下面的程式 if (colParameters["Parameter01"] == null || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter01"])))) { funDataDeleteByDateRet = "Archive Day not found!!!(Parameter 01)"; break; } else if (Information.IsNumeric(colParameters["Parameter01"])) { IntParDay = Conversions.ToInteger(Strings.Trim(Conversions.ToString(colParameters["Parameter01"]))); } else { funDataDeleteByDateRet = "Archive Day not Numeric!!!(Parameter 01)"; break; } int IntMaxDay; // Maximum Day var IntArchiveDay = DateTime.Now.AddDays(-IntParDay); // 轉成日期 string strArchiveConfig; // 傳入Schema name var dtArchiveProcess3 = new DataTable(); dtArchiveProcess3 = new DataTable("ArchiveProcess3"); dtArchiveProcess3.Columns.Add("ItemNo", Type.GetType("System.Decimal")); dtArchiveProcess3.Columns.Add("ArchiveDate", Type.GetType("System.DateTime")); LoadArchiveBasis(ref dsTemp, ref dtArchiveByMO, ref dtDeleteByDate); dsTemp.Dispose(); dtArchiveByMO.Dispose(); strArchiveConfig = GetArchiveConfig(); // 都沒有勾選就不執行了 drSel = dtDeleteByDate.Select("CheckFlag=True"); if (drSel.Length == 0) throw new Exception(TranslateMsg("[%PleaseCheck%] [%DataDelete%] [%CONFIGSETTING%]!", strLanguageMode, strResourceDir)); // 要封存的TABLE資訊 存成XML string strDeleteByDateTable = ""; string strTableList = ""; for (int i = 0, loopTo = drSel.Length - 1; i <= loopTo; i++) { strDeleteByDateTable += CombineXMLValueTag( CombineXMLValue("archivetablename", drSel[i]["ArchiveTableName"].ToString()) + CombineXMLValue("conditioncolumn", drSel[i]["ConditionColumn"].ToString())); strTableList += CombineXMLValueTag( CombineXMLValue("tablename", drSel[i]["ArchiveTableName"].ToString()) + CombineXMLValue("conditioncolumn", drSel[i]["ConditionColumn"].ToString())); } // 取得日期 var OldestTableDate = defDateTime; OldestTableDate = GetOldestTableDate(strTableList); // 沒有取得日期不執行 if (OldestTableDate == defDateTime) throw new Exception(TranslateMsg("[%DELETEDATE%] [%IS NOT EXIST%]!", strLanguageMode, strResourceDir)); // 執行封存紀錄,先以天為單位執行 if (DateAndTime.DateDiff(DateInterval.Day, OldestTableDate, IntArchiveDay) > 0L) { if (DateAndTime.DateAdd(DateInterval.Day, DateAndTime.DateDiff(DateInterval.Day, OldestTableDate, IntArchiveDay), OldestTableDate) < IntArchiveDay) { IntMaxDay = (int)(DateAndTime.DateDiff(DateInterval.Day, OldestTableDate, IntArchiveDay) + 1L); } else { IntMaxDay = (int)DateAndTime.DateDiff(DateInterval.Day, OldestTableDate, IntArchiveDay); } dtArchiveProcess3.Clear(); for (int i = 0, loopTo1 = IntMaxDay - 1; i <= loopTo1; i++) { if (i != IntMaxDay - 1) { drAdd = dtArchiveProcess3.NewRow(); drAdd["ItemNo"] = i + 1; drAdd["ArchiveDate"] = DateAndTime.DateAdd(DateInterval.Day, i + 1, OldestTableDate); dtArchiveProcess3.Rows.Add(drAdd); } else { drAdd = dtArchiveProcess3.NewRow(); drAdd["ItemNo"] = i + 1; drAdd["ArchiveDate"] = IntArchiveDay; dtArchiveProcess3.Rows.Add(drAdd); } } } else if (OldestTableDate < IntArchiveDay) // 執行封存紀錄小於1天,執行一次就足夠 { IntMaxDay = 1; dtArchiveProcess3.Clear(); drAdd = dtArchiveProcess3.NewRow(); drAdd["ItemNo"] = 1; drAdd["ArchiveDate"] = IntArchiveDay; dtArchiveProcess3.Rows.Add(drAdd); } else // 沒有需要執行的封存紀錄 { funDataDeleteByDateRet = "success"; break; } // 開始執行封存記錄 DeleteByDate(strArchiveConfig, strDeleteByDateTable, dtArchiveProcess3); funDataDeleteByDateRet = "success"; } catch (Exception ex) { funDataDeleteByDateRet = CombineFailMsg("0000-999999", ex.Message); colParameters.Add(funDataDeleteByDateRet, "EmailBody"); SendJobFailEmail(colParameters); } } while (false); return funDataDeleteByDateRet; } private void DeleteByDate(string strArchiveDatabase3, string strDeleteByDateTable, DataTable dtArchiveProcess3) { dtArchiveProcess3.DefaultView.Sort = "ItemNo"; // 組InXml的字串 string argSendTime = Conversions.ToString(DateTime.Now); strIdentity = CombineXMLIdentity(modWIN.gComputerName, modWIN.gUserNo, argSendTime); string argvalue_name = "archivedate"; string argname = "ArchiveDate"; string argtype = "DateTime"; string argvalue = Strings.Format(dtArchiveProcess3.DefaultView[0]["ArchiveDate"], "yyyy/MM/dd H:mm:ss"); string argdesc = ""; strParameter = CombineXMLParameter(argvalue_name, argname, argtype, argvalue, argdesc); string argvalue_name1 = "archivedatabase"; string argname1 = "ArchiveDatabase"; string argtype1 = "String"; string argdesc1 = ""; strParameter += CombineXMLParameter(argvalue_name1, argname1, argtype1, strArchiveDatabase3, argdesc1); string argvalue_name2 = "archivetable"; string argname2 = "ArchiveTable"; string argtype2 = "String"; string argdesc2 = ""; strParameter += CombineXMLParameterMultiValue(argvalue_name2, argname2, argtype2, strDeleteByDateTable, argdesc2); string argvalue_name3 = "userno"; string argname3 = "UserNo"; string argtype3 = "String"; string argvalue1 = "AutoRun"; string argdesc3 = ""; strParameter += CombineXMLParameter(argvalue_name3, argname3, argtype3, argvalue1, argdesc3); InXml = CombineXMLRequest(strIdentity, strParameter); try { OutXml = modAutoRunLibrary.InvokeSrv("wsSYS.DelLogData", InXml); XmlDocument XmlDoc = new XmlDocument(); XmlDoc.LoadXml(OutXml); if (chkExecutionSuccess(XmlDoc)) { // 刪除已送出的資料 dtArchiveProcess3.DefaultView[0].Delete(); dtArchiveProcess3.AcceptChanges(); if (dtArchiveProcess3.Rows.Count > 0) { // 遞迴處理下一筆資料 DeleteByDate(strArchiveDatabase3, strDeleteByDateTable, dtArchiveProcess3); } } else { throw new Exception(XmlDoc.InnerText); } XmlDoc = null; } catch (Exception ex) { throw; } } #endregion #region Subscription Report private string funSubscriptionReport(Collection colParameters = null) { string funSubscriptionReportRet = default(string); var cnnTemp = default(IDbConnection); //System.Data.OleDb.OleDbDataAdapter daTemp; var dsTemp = new DataSet(); string strSQL; //var ExcelExp = new Infragistics.Win.UltraWinGrid.ExcelExport.UltraGridExcelExporter(); //var workbook = new Infragistics.Documents.Excel.Workbook(); DataTable dtChartSettingResult = new DataTable(); DataTable dtAttachFiles = new DataTable(); DataRow[] drReportBasis, drCond, drPeriod; string strCondition, strOperand, strMailBody, strOperandChar; int intDataType; string[] aryInDefaultValue; string strTempDefaultValue; string strFinalScript, strRPTLogSerial = default(string); // ScriptReprot執行結果 try { cnnTemp = CreateConnection(strConnectionString); // 取出需要執行的報表訂閱 // 2019/04/16 OwenLiu, Mantis:0056206, 報表訂閱僅取出已簽核的使用者資料 strSQL = "Select A.*, B.EmailAddress From tblRPTSubscription A, tblUSRUserBasis B " + "Where A.UserNo = B.UserNo And B.EmailAddress is not null AND B.IssueState = 2 And " + "A.NextRunTime is not null And " + "A.NextRunTime <= To_Date('" + Strings.Format(DateTime.Now, "yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; strSQL = SQLCommandTuning(strDataBaseType, ref strSQL); //daTemp = new System.Data.OleDb.OleDbDataAdapter(strSQL, cnnTemp); //daTemp.Fill(dsTemp, "Subscription"); //daTemp.Dispose(); ExecuteSQLQuery_Adapter(strSQL, dsTemp, "Subscription", cnnTemp); if (dsTemp.Tables["Subscription"].Rows.Count == 0) // 沒有需要執行的訂閱 { funSubscriptionReportRet = "success"; return funSubscriptionReportRet; } strSQL = "Select * From tblRPTReportBasis Where ReportType = 2"; //daTemp = new System.Data.OleDb.OleDbDataAdapter(strSQL, cnnTemp); //daTemp.Fill(dsTemp, "ReportBasis"); //daTemp.Dispose(); ExecuteSQLQuery_Adapter(strSQL, dsTemp, "ReportBasis", cnnTemp); strSQL = "Select * From tblRPTSubscriptionCond"; //daTemp = new System.Data.OleDb.OleDbDataAdapter(strSQL, cnnTemp); //daTemp.Fill(dsTemp, "SubscriptionCond"); //daTemp.Dispose(); ExecuteSQLQuery_Adapter(strSQL, dsTemp, "SubscriptionCond", cnnTemp); strSQL = "Select * From tblRPTSubscriptionPeriod"; //daTemp = new System.Data.OleDb.OleDbDataAdapter(strSQL, cnnTemp); //daTemp.Fill(dsTemp, "Period"); //daTemp.Dispose(); ExecuteSQLQuery_Adapter(strSQL, dsTemp, "Period", cnnTemp); strSQL = "Select * From tblUSRUserBasis Where IssueState = 2"; //daTemp = new System.Data.OleDb.OleDbDataAdapter(strSQL, cnnTemp); //daTemp.Fill(dsTemp, "User"); //daTemp.Dispose(); ExecuteSQLQuery_Adapter(strSQL, dsTemp, "User", cnnTemp); dtAttachFiles.Columns.Add(new DataColumn("Name", typeof(string))); dtAttachFiles.Columns.Add(new DataColumn("Content", typeof(byte[]))); if (dsTemp.Tables["Subscription"].Rows.Count > 0) { var strEmailCC = default(string); foreach (DataRow drSub in dsTemp.Tables["Subscription"].Rows) { drReportBasis = dsTemp.Tables["ReportBasis"].Select(Conversions.ToString("ReportID = '" + drSub["ReportID"] + "'")); if (drReportBasis.Length == 0) { funSubscriptionReportRet = Conversions.ToString(funSubscriptionReportRet + "fail;Report Basis not found: ReportID(" + drSub["ReportID"] + ") "); continue; // 此訂閱失敗,執行下一筆訂閱 } else if (string.IsNullOrEmpty(drReportBasis[0]["ReportScript"].ToString())) { funSubscriptionReportRet = Conversions.ToString(funSubscriptionReportRet + "fail;Report Script not found: ReportID(" + drSub["ReportID"] + ") "); continue; // 此訂閱失敗,執行下一筆訂閱 } try { strCondition = ""; strMailBody = "[%ReportID%]:" + drSub["ReportID"].ToString() + "
"; strMailBody += "[%ReportName%]:" + drReportBasis[0]["ReportName"].ToString() + "
"; strMailBody += "[%CondField%]:" + "

    "; // 設定的條件 drCond = dsTemp.Tables["SubscriptionCond"].Select(Conversions.ToString("SubscriptionID = '" + drSub["SubscriptionID"] + "'")); for (int i = 0, loopTo = drCond.Length - 1; i <= loopTo; i++) { strCondition += CombineXMLValueTag( CombineXMLValue("condfield", CInput(drCond[i]["CondField"].ToString())) + CombineXMLValue("conddatatype", drCond[i]["CondDataType"].ToString()) + CombineXMLValue("condoperand", CInput(drCond[i]["CondOperand"].ToString())) + CombineXMLValue("condvalue", CInput(drCond[i]["defaultvalue"].ToString())) + CombineXMLValue("insertname", CInput(drCond[i]["InsertName"].ToString()))); strOperand = drCond[i]["CondOperand"].ToString().ToUpper(); intDataType = Conversions.ToInteger(drCond[i]["CondDataType"]); strTempDefaultValue = drCond[i]["DefaultValue"].ToString(); switch (strOperand ?? "") { case "=": { strOperandChar = "[%IS EQUAL TO%]"; break; } case "<>": { strOperandChar = "[%IS NOT EQUAL TO%]"; break; } case ">": { strOperandChar = "[%IS GREATER THAN%]"; break; } case ">=": { strOperandChar = "[%IS GREATER THAN OR EQUAL TO%]"; break; } case "<": { strOperandChar = "[%IS LESS THAN%]"; break; } case "<=": { strOperandChar = "[%IS LESS THAN OR EQUAL TO%]"; break; } case "Like": { strOperandChar = "[%LIKE QUERY%]"; break; } case "In": { strOperandChar = "[%In%]"; break; } default: { strOperandChar = strOperand; break; } } // 以運算元來決定Script寫法 if (strOperand == "IN") { strMailBody = Conversions.ToString(strMailBody + "
  • " + drCond[i]["CondField"] + "(" + drCond[i]["CondDesc"].ToString() + ") " + strOperandChar + " (" + strTempDefaultValue + ")" + "
  • "); } else if (strOperand == "LIKE") { strMailBody = Conversions.ToString(strMailBody + "
  • " + drCond[i]["CondField"] + "(" + drCond[i]["CondDesc"].ToString() + ") " + strOperandChar + " '" + drCond[i]["DefaultValue"] + "%'" + "
  • "); } else { switch (intDataType) { case 0: // Numeric { strMailBody = Conversions.ToString(strMailBody + "
  • " + drCond[i]["CondField"] + "(" + drCond[i]["CondDesc"].ToString() + ") " + strOperandChar + " " + drCond[i]["DefaultValue"] + "
  • "); break; } case 3: // DateTime { strMailBody = Conversions.ToString(strMailBody + "
  • " + drCond[i]["CondField"] + "(" + drCond[i]["CondDesc"].ToString() + ") " + strOperandChar + " " + Strings.Format(Conversions.ToDate(drCond[i]["DefaultValue"]), "yyyy/MM/dd HH:mm:ss") + "
  • "); // 其他一律視為字串 break; } default: { strMailBody += "
  • " + drCond[i]["CondField"] + "(" + drCond[i]["CondDesc"].ToString() + ") " + strOperandChar + " '" + CInput(drCond[i]["DefaultValue"].ToString()) + "'" + "
  • "; break; } } } } // 設定的區間條件 drPeriod = dsTemp.Tables["Period"].Select(Conversions.ToString("SubscriptionID = '" + drSub["SubscriptionID"] + "'")); for (int i = 0, loopTo1 = drPeriod.Length - 1; i <= loopTo1; i++) { switch (drPeriod[i]["DatetimePeriodType"].ToString() ?? "") { case "DayToDate": { strCondition += CombineXMLValueTag( CombineXMLValue("condfield", CInput(drPeriod[i]["CondField"].ToString())) + CombineXMLValue("conddatatype", "3") + CombineXMLValue("condoperand", CInput(">=")) + CombineXMLValue("condvalue", Strings.Format(DateTime.Now.AddDays(Convert.ToDouble(drPeriod[i]["FromDays"])), "yyyy/MM/dd") + " " + drPeriod[i]["FromTime"].ToString()) + CombineXMLValue("insertname", CInput(drPeriod[i]["InsertName"].ToString()))); strCondition += CombineXMLValueTag( CombineXMLValue("condfield", CInput(drPeriod[i]["CondField"].ToString())) + CombineXMLValue("conddatatype", "3") + CombineXMLValue("condoperand", CInput("<=")) + CombineXMLValue("condvalue", Strings.Format(DateTime.Now.AddDays(Convert.ToDouble(drPeriod[i]["ToDays"])), "yyyy/MM/dd") + " " + drPeriod[i]["ToTime"].ToString()) + CombineXMLValue("insertname", CInput(drPeriod[i]["InsertName"].ToString()))); // strCondition += " And " & drPeriod(i)("CondField") & " " & CInput(">=") & " To_Date('" & // Format(New Date(Now.Year, Now.Month, Now.AddDays(drPeriod(i)("FromDays")).Day, CInt(drPeriod(i)("FromTime").ToString.Substring(0, 2)), CInt(drPeriod(i)("FromTime").ToString.Substring(3, 2)), CInt(drPeriod(i)("FromTime").ToString.Substring(6, 2))), "yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') And " & // drPeriod(i)("CondField") & " " & CInput("<=") & " To_Date('" & // Format(New Date(Now.Year, Now.Month, Now.AddDays(drPeriod(i)("ToDays")).Day, CInt(drPeriod(i)("ToTime").ToString.Substring(0, 2)), CInt(drPeriod(i)("ToTime").ToString.Substring(3, 2)), CInt(drPeriod(i)("ToTime").ToString.Substring(6, 2))), "yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS')" strMailBody = Conversions.ToString(strMailBody + "
  • " + drPeriod[i]["CondField"] + "(" + drPeriod[i]["CondDesc"].ToString() + ") [%Between%] " + Strings.Format(DateTime.Now.AddDays(Conversions.ToDouble(drPeriod[i]["FromDays"])), "yyyy/MM/dd") + " " + drPeriod[i]["FromTime"].ToString() + " ~ " + Strings.Format(DateTime.Now.AddDays(Conversions.ToDouble(drPeriod[i]["ToDays"])), "yyyy/MM/dd") + " " + drPeriod[i]["ToTime"].ToString() + "
  • "); break; } case "MonthToDate": { strCondition += CombineXMLValueTag( CombineXMLValue("condfield", CInput(drPeriod[i]["CondField"].ToString())) + CombineXMLValue("conddatatype", "3") + CombineXMLValue("condoperand", CInput(">=")) + CombineXMLValue("condvalue", Strings.Format(new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1), "yyyy/MM/dd HH:mm:ss")) + CombineXMLValue("insertname", CInput(drPeriod[i]["InsertName"].ToString()))); strCondition += CombineXMLValueTag (CombineXMLValue("condfield", CInput(drPeriod[i]["CondField"].ToString())) + CombineXMLValue("conddatatype", "3") + CombineXMLValue("condoperand", CInput("<=")) + CombineXMLValue("condvalue", Strings.Format(DateTime.Now, "yyyy/MM/dd") + " " + drPeriod[i]["ToTime"].ToString()) + CombineXMLValue("insertname", CInput(drPeriod[i]["InsertName"].ToString()))); // strCondition += " And " & drPeriod(i)("CondField") & " " & CInput(">=") & " To_Date('" & Format(New Date(Now.Year, Now.Month, 1), "yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') And " & drPeriod(i)("CondField") & " " & CInput("<=") & " To_Date('" & Format(Now, "yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS')" strMailBody = Conversions.ToString(strMailBody + "
  • " + drPeriod[i]["CondField"] + "(" + drPeriod[i]["CondDesc"].ToString() + ") [%Between%] " + Strings.Format(new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1), "yyyy/MM/dd HH:mm:ss") + " ~ " + Strings.Format(DateTime.Now, "yyyy/MM/dd") + " " + drPeriod[i]["ToTime"].ToString() + "
  • "); break; } case "YearToDate": { strCondition += CombineXMLValueTag( CombineXMLValue("condfield", CInput(drPeriod[i]["CondField"].ToString())) + CombineXMLValue("conddatatype", "3") + CombineXMLValue("condoperand", CInput(">=")) + CombineXMLValue("condvalue", Strings.Format(new DateTime(DateTime.Now.Year, 1, 1), "yyyy/MM/dd HH:mm:ss")) + CombineXMLValue("insertname", CInput(drPeriod[i]["InsertName"].ToString()))); strCondition += CombineXMLValueTag( CombineXMLValue("condfield", CInput(drPeriod[i]["CondField"].ToString())) + CombineXMLValue("conddatatype", "3") + CombineXMLValue("condoperand", CInput("<=")) + CombineXMLValue("condvalue", Strings.Format(DateTime.Now, "yyyy/MM/dd") + " " + drPeriod[i]["ToTime"].ToString()) + CombineXMLValue("insertname", CInput(drPeriod[i]["InsertName"].ToString()))); // strCondition += " And " & drPeriod(i)("CondField") & " " & CInput(">=") & " To_Date('" & Format(New Date(Now.Year, 1, 1), "yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') And " & drPeriod(i)("CondField") & " " & CInput("<=") & " To_Date('" & Format(Now, "yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS')" strMailBody = Conversions.ToString(strMailBody + "
  • " + drPeriod[i]["CondField"] + "(" + drPeriod[i]["CondDesc"].ToString() + ") [%Between%] " + Strings.Format(new DateTime(DateTime.Now.Year, 1, 1), "yyyy/MM/dd HH:mm:ss") + " ~ " + Strings.Format(DateTime.Now, "yyyy/MM/dd") + " " + drPeriod[i]["ToTime"].ToString() + "
  • "); break; } } } strMailBody += "
"; var dsResult = new DataSet(); strIdentity = CombineXMLIdentity(modWIN.gComputerName, drSub["UserNo"].ToString(), DateTime.Now.ToString()); strParameter = CombineXMLParameter("reportid", "ReportId", "String", CInput(drSub["ReportID"].ToString()), ""); strParameter += CombineXMLParameterMultiValue("scriptcond", "ScriptCond", "String", strCondition, ""); strParameter += CombineXMLParameter("clientstarttime", "ClientStartTime", "DateTime", Strings.Format(DateTime.Now, "yyyy/MM/dd HH:mm:ss"), ""); InXml = CombineXMLRequest(strIdentity, strParameter); OutXml = modAutoRunLibrary.InvokeSrv("wsReportEngine.Query_ReturnDataSet", InXml, ref dsResult); // Dim XmlDoc As New XmlDocument XmlDoc.LoadXml(OutXml); if (chkExecutionSuccess(XmlDoc)) { // Get RPTLogSerial if (XmlDoc.GetElementsByTagName("rptlogserial").Item(0).SelectNodes("value").Count > 0) { strRPTLogSerial = XmlDoc.DocumentElement.GetElementsByTagName("rptlogserial").Item(0).SelectNodes("value").Item(0).InnerText; } // Get FinalScript if (XmlDoc.GetElementsByTagName("finalscript").Item(0).SelectNodes("value").Count > 0) { strFinalScript = XmlDoc.DocumentElement.GetElementsByTagName("finalscript").Item(0).SelectNodes("value").Item(0).InnerText; // 將二個單引號取代為一個單引號 strFinalScript = Strings.Replace(strFinalScript, "''", "'"); } //var iugTemp = new iMESUltraGrid.iMESUltraGridControl(); //iugTemp.iMESUltraGrid_InitializeLayOut += iMESUltraGrid_InitializeLayOut; //iugTemp.Identity = "iMES"; //iugTemp.UserNo = "iMES"; //iugTemp.iMESUltraGrid.DataSource = dsResult.Tables[0]; //讓最後一列style生效,新增空列 DataRow drEnd = dsResult.Tables[0].NewRow(); dsResult.Tables[0].Rows.Add(drEnd); // 0133391: [跨平台]AutoRunLib移除iMESUltraGrid的使用, 2023/4/21 String ExcelMode = drSub["FileType"].ToString().ToUpper(); //"XLSX" , "XLS" byte[] membyte = modAutoRunLibrary.funExcelToByte(dsResult, ExcelMode, strLanguageMode, strResourceDir); //// 將欄位翻譯 //if (!string.IsNullOrEmpty(modWIN.gLanguageMode)) //{ // var ColSaveControl = new Collection(); // ColSaveControl.Add(iugTemp.iMESUltraGrid); // ChgTranslateName(ColSaveControl, modWIN.gLanguageMode); // ColSaveControl = null; //} //switch (drSub["FileType"].ToString().ToUpper() ?? "") //{ // case "XLSX": // { // // 匯出Excel再轉Stream // workbook = ExcelExp.Export(iugTemp.iMESUltraGrid, Infragistics.Documents.Excel.WorkbookFormat.Excel2007); // workbook.Save(memStream); // memStream.Seek(0L, SeekOrigin.Begin); // break; // } // case "XLS": // { // // 匯出Excel再轉Stream // workbook = ExcelExp.Export(iugTemp.iMESUltraGrid, Infragistics.Documents.Excel.WorkbookFormat.Excel97To2003); // workbook.Save(memStream); // memStream.Seek(0L, SeekOrigin.Begin); // break; // } //} // 0125796: [6.0.7] SDD230104_01-01_訂閱報表新增輸出圖表 2023/3/10 if (drSub["EXPORTCHART"].ToString() == "1") { //Load ChartSetting dtChartSettingResult = LoadReportChartSetting(CInput(drSub["ReportID"].ToString())); string strMailBody1 = ""; string strMailBody2 = ""; // 取出 dtChartSettingResult 的 CHARTID 每一欄的資料 foreach (DataRow dtrow in dtChartSettingResult.Rows) { strMailBody1 += dtrow["CHARTID"].ToString() + ";"; strMailBody2 += dtrow["CHARTTITLE"].ToString() + ";"; } // 移除最後一個分號 strMailBody1 = strMailBody1.Remove(strMailBody1.Length - 1); strMailBody2 = strMailBody2.Remove(strMailBody2.Length - 1); strMailBody += "[%CHART ID%]:" + strMailBody1 + "
"; strMailBody += "[%CHART NAME%]:" + strMailBody2 + "
"; DataRow row = dtAttachFiles.NewRow(); row["Name"] = "Report Chart.zip"; row["Content"] = DrawChart(dsResult.Tables[0], dtChartSettingResult); dtAttachFiles.Rows.Add(row); if (!(dtChartSettingResult == null)) dtChartSettingResult.Dispose(); } // Stream轉成附件檔 //var AttachFile = new byte[(int)(memStream.Length - 1L + 1)]; //double count = 0d; //while (count < memStream.Length) //{ // AttachFile[(int)Math.Round(count)] = Convert.ToByte(memStream.ReadByte()); // count += 1d; //} // 20220927,13871,0118625: [聯詠] Autorun占用過多記憶體造成B2B服務停止 try { //memStream.Close(); //memStream.Dispose(); //iugTemp.iMESUltraGrid_InitializeLayOut -= iMESUltraGrid_InitializeLayOut; //iugTemp.iMESUltraGrid.DataSource = null; //iugTemp.Dispose(); dsResult.Dispose(); } catch (Exception ex) { // 副本收件人 } string[] UserNoCC = null; DataRow[] drUser = null; if (!string.IsNullOrEmpty(drSub["EmailCC"].ToString())) { UserNoCC = Strings.Split(drSub["EmailCC"].ToString(), ","); foreach (string u in UserNoCC) { drUser = dsTemp.Tables["User"].Select("UserNo = '" + u + "' And EmailAddress <> ''"); if (drUser.Length > 0) { strEmailCC += drUser[0]["EmailAddress"].ToString() + ","; } } strEmailCC = strEmailCC.TrimEnd(','); } // 發送郵件 string argEmailSubject = TranslateMsg("[%SubscriptionReport%]", strLanguageMode, strResourceDir) + "-" + drSub["SubscriptionName"].ToString(); string argEmailBody = TranslateMsg(strMailBody, strLanguageMode, strResourceDir); string MailResult = this.SendMultiEmailNonGroup(ref argEmailSubject, argEmailBody, drSub["EmailAddress"].ToString(), DateTime.Now.ToString("yyyyMMddhhmmss") + "." + drSub["FileType"].ToString(), membyte, strEmailCC, dtAttachFiles); if (MailResult.StartsWith("fail")) // Mail寄送失敗 { // 20220901,13871,0118251: 【度亘】描述性语言报表,排程执行失败,調整錯誤訊息 funSubscriptionReportRet = Conversions.ToString(funSubscriptionReportRet + MailResult + ",Send Email Fail : SubscriptionID(" + drSub["SubscriptionID"] + ") "); continue; // 此訂閱失敗,執行下一筆訂閱 } // 組InXml的字串 string argSendTime1 = Conversions.ToString(DateTime.Now); strIdentity = CombineXMLIdentity(modWIN.gComputerName, modWIN.gUserNo, argSendTime1); string argvalue_name3 = "rptlogserial"; string argname3 = "RPTLogSerial"; string argtype3 = "String"; string argdesc3 = ""; strParameter = CombineXMLParameter(argvalue_name3, argname3, argtype3, strRPTLogSerial, argdesc3); string argvalue_name4 = "clientendtime"; string argname4 = "ClientEndTime"; string argtype4 = "DateTime"; string argvalue2 = Strings.Format(DateTime.Now, "yyyy/MM/dd HH:mm:ss"); string argdesc4 = ""; strParameter += CombineXMLParameter(argvalue_name4, argname4, argtype4, argvalue2, argdesc4); InXml = CombineXMLRequest(strIdentity, strParameter); OutXml = modAutoRunLibrary.InvokeSrv("wsReportEngine.EditReportQueryLog", InXml); XmlDoc.LoadXml(OutXml); if (!chkExecutionSuccess(XmlDoc)) { funSubscriptionReportRet = Conversions.ToString(funSubscriptionReportRet + "fail;Edit Report Query Log Fail : SubscriptionID(" + drSub["SubscriptionID"] + ") " + GetExceptionSysMsg(XmlDoc) + " "); continue; // 此訂閱失敗,執行下一筆訂閱 } // 更新下次執行時間、最後執行時間 if (drSub["RunFrequent"].ToString().ToUpper() == "ONLYONCE") // 執行一次, 清空下次執行時間 { // 組InXml的字串 string argSendTime2 = Conversions.ToString(DateTime.Now); strIdentity = CombineXMLIdentity(modWIN.gComputerName, modWIN.gUserNo, argSendTime2); string argvalue_name5 = "subscriptionid"; string argname5 = "SubscriptionID"; string argtype5 = "String"; var tmp1 = drSub; string argvalue3 = Conversions.ToString(tmp1["SubscriptionID"]); string argdesc5 = ""; strParameter = CombineXMLParameter(argvalue_name5, argname5, argtype5, argvalue3, argdesc5); tmp1["SubscriptionID"] = argvalue3; string argvalue_name6 = "lastruntime"; string argname6 = "LastRunTime"; string argtype6 = "Date"; string argvalue4 = Strings.Format(DateTime.Now, "yyyy/MM/dd HH:mm:ss"); string argdesc6 = ""; strParameter += CombineXMLParameter(argvalue_name6, argname6, argtype6, argvalue4, argdesc6); InXml = CombineXMLRequest(strIdentity, strParameter); OutXml = modAutoRunLibrary.InvokeSrv("wsRPT.UpdSubscriptionReportRunTime", InXml); XmlDoc.LoadXml(OutXml); if (!chkExecutionSuccess(XmlDoc)) { funSubscriptionReportRet = Conversions.ToString(funSubscriptionReportRet + "fail;Update Report RunTime Fail : SubscriptionID(" + drSub["SubscriptionID"] + ") " + GetExceptionSysMsg(XmlDoc) + " "); continue; // 此訂閱失敗,執行下一筆訂閱 } } else // 更新下次執行時間 { string strNextRunTime = GetSubscriptionNextDate(drSub); if (string.IsNullOrEmpty(strNextRunTime)) { funSubscriptionReportRet = Conversions.ToString(funSubscriptionReportRet + "fail;Get Report Next RunTime Fail : SubscriptionID(" + drSub["SubscriptionID"] + ") "); continue; // 此訂閱失敗,執行下一筆訂閱 } // 組InXml的字串 string argSendTime3 = Conversions.ToString(DateTime.Now); strIdentity = CombineXMLIdentity(modWIN.gComputerName, modWIN.gUserNo, argSendTime3); string argvalue_name7 = "subscriptionid"; string argname7 = "SubscriptionID"; string argtype7 = "String"; var tmp2 = drSub; string argvalue5 = Conversions.ToString(tmp2["SubscriptionID"]); string argdesc7 = ""; strParameter = CombineXMLParameter(argvalue_name7, argname7, argtype7, argvalue5, argdesc7); tmp2["SubscriptionID"] = argvalue5; string argvalue_name8 = "lastruntime"; string argname8 = "LastRunTime"; string argtype8 = "Date"; string argvalue6 = Strings.Format(DateTime.Now, "yyyy/MM/dd HH:mm:ss"); string argdesc8 = ""; strParameter += CombineXMLParameter(argvalue_name8, argname8, argtype8, argvalue6, argdesc8); string argvalue_name9 = "nextruntime"; string argname9 = "NextRunTime"; string argtype9 = "Date"; string argdesc9 = ""; strParameter += CombineXMLParameter(argvalue_name9, argname9, argtype9, strNextRunTime, argdesc9); InXml = CombineXMLRequest(strIdentity, strParameter); OutXml = modAutoRunLibrary.InvokeSrv("wsRPT.UpdSubscriptionReportRunTime", InXml); XmlDoc.LoadXml(OutXml); if (!chkExecutionSuccess(XmlDoc)) { funSubscriptionReportRet = Conversions.ToString(funSubscriptionReportRet + "fail;Update Report RunTime Fail : SubscriptionID(" + drSub["SubscriptionID"] + ") " + GetExceptionSysMsg(XmlDoc) + " "); continue; // 此訂閱失敗,執行下一筆訂閱 } } dtAttachFiles.Clear(); } else { // Get FinalScript,若有Script即取出,可方便Debug. if (XmlDoc.GetElementsByTagName("finalscript").Item(0).SelectNodes("value").Count > 0) { strFinalScript = XmlDoc.DocumentElement.GetElementsByTagName("finalscript").Item(0).SelectNodes("value").Item(0).InnerText; // 將二個單引號取代為一個單引號 strFinalScript = Strings.Replace(strFinalScript, "''", "'"); } funSubscriptionReportRet = Conversions.ToString(funSubscriptionReportRet + "fail;Query Report Fail : SubscriptionID(" + drSub["SubscriptionID"] + ") " + GetExceptionSysMsg(XmlDoc) + " "); continue; } // 此訂閱失敗,執行下一筆訂閱 } catch (Exception ex) { funSubscriptionReportRet = Conversions.ToString(funSubscriptionReportRet + "fail;Query Report Fail : SubscriptionID(" + drSub["SubscriptionID"] + ") " + ex.Message + " "); continue; } // 此訂閱失敗,執行下一筆訂閱 } } if (string.IsNullOrEmpty(funSubscriptionReportRet)) funSubscriptionReportRet = "success"; } catch (Exception ex) { funSubscriptionReportRet = CombineFailMsg("0000-999999", ex.Message); colParameters.Add(funSubscriptionReportRet, "EmailBody"); SendJobFailEmail(colParameters); } finally { if (dtAttachFiles != null) { dtAttachFiles.Clear(); dtAttachFiles.Dispose(); } if (!(dsTemp == null)) dsTemp.Dispose(); // 20220927,13871, 0118625: [聯詠] Autorun占用過多記憶體造成B2B服務停止 try { //if (ExcelExp != null) //{ // ExcelExp.Dispose(); // ExcelExp = null; //} //workbook = null; } catch (Exception ex) { } CloseConnection(cnnTemp); } return funSubscriptionReportRet; } //private void iMESUltraGrid_InitializeLayOut(object sender, Infragistics.Win.UltraWinGrid.InitializeLayoutEventArgs e) //{ // { // var withBlock = ((iMESUltraGrid.iMESUltraGridControl)sender).iMESUltraGrid.DisplayLayout; // withBlock.PerformAutoResizeColumns(false, Infragistics.Win.UltraWinGrid.PerformAutoSizeType.AllRowsInBand, true); // if (((iMESUltraGrid.iMESUltraGridControl)sender).iMESUltraGrid.DisplayLayout.Bands.Count > 0) // { // for (int i = 0, loopTo = ((iMESUltraGrid.iMESUltraGridControl)sender).iMESUltraGrid.DisplayLayout.Bands[0].Columns.Count - 1; i <= loopTo; i++) // { // { // var withBlock1 = withBlock.Bands[0].Columns[i]; // if (withBlock1.DataType.Name == "DateTime") // { // withBlock1.Format = "yyyy/MM/dd HH:mm:ss"; // } // if (withBlock1.DataType.Name == "String") // { // withBlock1.CellAppearance.TextHAlign = Infragistics.Win.HAlign.Left; // } // if (withBlock1.DataType.Name == "Decimal") // { // withBlock1.Format = "0.######"; // withBlock1.CellAppearance.TextHAlign = Infragistics.Win.HAlign.Right; // } // } // } // } // } //} private string GetSubscriptionNextDate(DataRow drSub) { string GetSubscriptionNextDateRet = default(string); GetSubscriptionNextDateRet = ""; try { switch (drSub["RunFrequent"].ToString() ?? "") { case "OnlyOnce": // 執行一次 { GetSubscriptionNextDateRet = drSub["RunYear"].ToString() + "/" + drSub["RunMonth"].ToString() + "/" + drSub["RunDay"].ToString() + " " + drSub["RunHour"].ToString() + ":" + drSub["RunMin"].ToString() + ":00"; break; } case "EveryDay": // 每日的 { DateTime datTemp; if (DateTime.Now.Hour > Conversions.ToInteger(drSub["RunHour"])) // 小時超過隔天再執行 { datTemp = DateTime.Now.AddDays(1d); GetSubscriptionNextDateRet = datTemp.Year + "/" + datTemp.Month + "/" + datTemp.Day + " " + drSub["RunHour"].ToString() + ":" + drSub["RunMin"].ToString() + ":00"; } else if (DateTime.Now.Hour == Conversions.ToInteger(drSub["RunHour"]) && DateTime.Now.Minute >= Conversions.ToInteger(drSub["RunMin"])) // 分鐘超過隔天再執行 { datTemp = DateTime.Now.AddDays(1d); GetSubscriptionNextDateRet = datTemp.Year + "/" + datTemp.Month + "/" + datTemp.Day + " " + drSub["RunHour"].ToString() + ":" + drSub["RunMin"].ToString() + ":00"; } else // 當天執行 { GetSubscriptionNextDateRet = DateTime.Now.Year + "/" + DateTime.Now.Month + "/" + DateTime.Now.Day + " " + drSub["RunHour"].ToString() + ":" + drSub["RunMin"].ToString() + ":00"; } break; } case "EveryWeek": // 每週的 { var intDayOfWeek = default(int); var datTemp = default(DateTime); switch (drSub["RunWeek"].ToString() ?? "") { case "Sunday": { intDayOfWeek = 0; break; } case "Monday": { intDayOfWeek = 1; break; } case "Tuesday": { intDayOfWeek = 2; break; } case "Wednesday": { intDayOfWeek = 3; break; } case "Thursday": { intDayOfWeek = 4; break; } case "Friday": { intDayOfWeek = 5; break; } case "Saturday": { intDayOfWeek = 6; break; } } if ((int)DateTime.Now.DayOfWeek == intDayOfWeek) // 建立日期與下次執行日是同一天 { if (DateTime.Now.Hour > Conversions.ToInteger(drSub["RunHour"])) // 小時超過下週再執行 { datTemp = DateTime.Now.AddDays(7d); } else if (DateTime.Now.Hour == Conversions.ToInteger(drSub["RunHour"]) && DateTime.Now.Minute >= Conversions.ToInteger(drSub["RunMin"])) // 分鐘超過下週再執行 { datTemp = DateTime.Now.AddDays(7d); } else { datTemp = DateTime.Now; } // 當天執行 } else if ((int)DateTime.Now.DayOfWeek > intDayOfWeek) { datTemp = DateTime.Now.AddDays(intDayOfWeek + (7 - (int)DateTime.Now.DayOfWeek)); } else if ((int)DateTime.Now.DayOfWeek < intDayOfWeek) { datTemp = DateTime.Now.AddDays(intDayOfWeek - (int)DateTime.Now.DayOfWeek); } GetSubscriptionNextDateRet = datTemp.Year + "/" + datTemp.Month + "/" + datTemp.Day + " " + drSub["RunHour"].ToString() + ":" + drSub["RunMin"].ToString() + ":00"; break; } case "EveryMonth": // 每月的 { var datTemp = default(DateTime); bool blnEndDay = false; string strRunDay; if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drSub["RunDay"], "EndDay", false))) { strRunDay = DateTime.Now.AddMonths(1).AddDays(-DateTime.Now.AddMonths(1).Day).Day.ToString(); blnEndDay = true; } else { strRunDay = Conversions.ToString(drSub["RunDay"]); } if (DateTime.Now.Day == Conversions.ToDouble(strRunDay)) // 建立日期與下次執行日是同一天 { if (DateTime.Now.Hour > Conversions.ToInteger(drSub["RunHour"])) // 小時超過下月再執行 { datTemp = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1).AddMonths(1); if (!(datTemp.AddMonths(1).AddDays(-1).Day >= Conversions.ToInteger(strRunDay))) { datTemp = new DateTime(datTemp.Year, datTemp.Month, datTemp.AddMonths(1).AddDays(-1).Day); } else { datTemp = new DateTime(datTemp.Year, datTemp.Month, Conversions.ToInteger(strRunDay)); } } else if (DateTime.Now.Hour == Conversions.ToInteger(drSub["RunHour"]) && DateTime.Now.Minute >= Conversions.ToInteger(drSub["RunMin"])) // 分鐘超過下月再執行 { datTemp = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1).AddMonths(1); if (!(datTemp.AddMonths(1).AddDays(-1).Day >= Conversions.ToInteger(strRunDay))) { datTemp = new DateTime(datTemp.Year, datTemp.Month, datTemp.AddMonths(1).AddDays(-1).Day); } else { datTemp = new DateTime(datTemp.Year, datTemp.Month, Conversions.ToInteger(strRunDay)); } } else { datTemp = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day); } // 當天執行 } else if (DateTime.Now.Day > Conversions.ToInteger(strRunDay)) // 下月再執行 { datTemp = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1).AddMonths(1); if (!(datTemp.AddMonths(1).AddDays(-1).Day >= Conversions.ToInteger(strRunDay))) { datTemp = new DateTime(datTemp.Year, datTemp.Month, datTemp.AddMonths(1).AddDays(-1).Day); } else { datTemp = new DateTime(datTemp.Year, datTemp.Month, Conversions.ToInteger(strRunDay)); } } else if (DateTime.Now.Day < Conversions.ToInteger(strRunDay)) // 當月執行 { datTemp = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1); if (!(datTemp.AddMonths(1).AddDays(-1).Day >= Conversions.ToInteger(strRunDay))) { datTemp = new DateTime(datTemp.Year, datTemp.Month, datTemp.AddMonths(1).AddDays(-1).Day); } else { datTemp = new DateTime(datTemp.Year, datTemp.Month, Conversions.ToInteger(strRunDay)); } } GetSubscriptionNextDateRet = datTemp.Year + "/" + datTemp.Month + "/" + datTemp.Day + " " + drSub["RunHour"].ToString() + ":" + drSub["RunMin"].ToString() + ":00"; break; } case "EveryYear": // 每年的 { var datTemp = default(DateTime); if (DateTime.Now.Month == Conversions.ToInteger(drSub["RunMonth"]) && DateTime.Now.Day == Conversions.ToInteger(drSub["RunDay"])) // 建立日期與下次執行日是同一天 { if (DateTime.Now.Hour > Conversions.ToInteger(drSub["RunHour"])) // 小時超過明年再執行 { datTemp = new DateTime(DateTime.Now.Year, Conversions.ToInteger(drSub["RunMonth"]), Conversions.ToInteger(drSub["RunDay"])).AddYears(1); } else if (DateTime.Now.Hour == Conversions.ToInteger(drSub["RunHour"]) && DateTime.Now.Minute >= Conversions.ToInteger(drSub["RunMin"])) // 分鐘超過明年再執行 { datTemp = new DateTime(DateTime.Now.Year, Conversions.ToInteger(drSub["RunMonth"]), Conversions.ToInteger(drSub["RunDay"])).AddYears(1); } else { datTemp = new DateTime(DateTime.Now.Year, Conversions.ToInteger(drSub["RunMonth"]), Conversions.ToInteger(drSub["RunDay"])); } // 當天執行 } else if (DateTime.Now.Month == Conversions.ToInteger(drSub["RunMonth"]) && DateTime.Now.Day > Conversions.ToInteger(drSub["RunDay"])) // 明年再執行 { datTemp = new DateTime(DateTime.Now.Year, Conversions.ToInteger(drSub["RunMonth"]), Conversions.ToInteger(drSub["RunDay"])).AddYears(1); } else if (DateTime.Now.Month == Conversions.ToInteger(drSub["RunMonth"]) && DateTime.Now.Day < Conversions.ToInteger(drSub["RunDay"])) { datTemp = new DateTime(DateTime.Now.Year, Conversions.ToInteger(drSub["RunMonth"]), Conversions.ToInteger(drSub["RunDay"])); } else if (DateTime.Now.Month > Conversions.ToInteger(drSub["RunMonth"])) // 明年再執行 { datTemp = new DateTime(DateTime.Now.Year, Conversions.ToInteger(drSub["RunMonth"]), Conversions.ToInteger(drSub["RunDay"])).AddYears(1); } else if (DateTime.Now.Month < Conversions.ToInteger(drSub["RunMonth"])) // 當年執行 { datTemp = new DateTime(DateTime.Now.Year, Conversions.ToInteger(drSub["RunMonth"]), Conversions.ToInteger(drSub["RunDay"])); } GetSubscriptionNextDateRet = datTemp.Year + "/" + datTemp.Month + "/" + datTemp.Day + " " + drSub["RunHour"].ToString() + ":" + drSub["RunMin"].ToString() + ":00"; break; } // ===2021/07/12 0090110: [拓緯] 描述語言報表無法設定每小時寄信 case "EveryHour": { var datTemp = DateTime.Now; if (DateTime.Now.Minute > Conversions.ToInteger(drSub["RunMin"].ToString())) // 分鐘超過小時再執行 { datTemp = DateTime.Now.AddHours(1d); } // === GetSubscriptionNextDateRet = DateTime.Now.Year + "/" + DateTime.Now.Month + "/" + DateTime.Now.Day + " " + datTemp.Hour + ":" + drSub["RunMin"].ToString() + ":00"; break; } default: { break; } } } catch (Exception ex) { GetSubscriptionNextDateRet = ""; } return GetSubscriptionNextDateRet; } # region MESChart private byte[] DrawLineChart(Dictionary> chartColumnSetting, Dictionary chartParameter, Dictionary chartAdvenceSetting, Dictionary chartColorSetting, string chartID, DataTable dtResultSave, DataTable dtChartSettingResult) { iMESChart.MESChart pchart = new iMESChart.MESChart(); // 建構iMESChart.MESChart控制項 // 開啟圖例控制功能 pchart.Legend.Show = true; pchart.Title.Show = true; pchart.Legend.Type = iMESChart.Option.LegendType.scroll; // 標題名稱 pchart.Title.Text = chartParameter["TitleName"]; // 標題字體大小 pchart.Title.TextStyle.FontSize = Convert.ToInt32(chartParameter["TitleFontSize"]); // 標題位置 if (Convert.ToInt32(chartParameter["TitlePosition"]) == 0) pchart.Title.LeftType = iMESChart.Option.LeftType.left; else if (Convert.ToInt32(chartParameter["TitlePosition"]) == 1) pchart.Title.LeftType = iMESChart.Option.LeftType.center; else if (Convert.ToInt32(chartParameter["TitlePosition"]) == 2) pchart.Title.LeftType = iMESChart.Option.LeftType.right; // 圖例大小 pchart.Legend.ItemWidth = Convert.ToInt32(chartParameter["LegendSize"]); // 圖例方向 if (Convert.ToInt32(chartParameter["LegendDirection"]) == 0) pchart.Legend.Orient = iMESChart.Option.Orient.horizontal; else pchart.Legend.Orient = iMESChart.Option.Orient.vertical; // 圖例位置 if (Convert.ToInt32(chartParameter["LegendPosition"]) == 0) { pchart.Legend.TopType = iMESChart.Option.TopType.top; pchart.Legend.LeftType = iMESChart.Option.LeftType.left; } else if (Convert.ToInt32(chartParameter["LegendPosition"]) == 1) pchart.Legend.TopType = iMESChart.Option.TopType.top; else if (Convert.ToInt32(chartParameter["LegendPosition"]) == 2) { pchart.Legend.TopType = iMESChart.Option.TopType.top; pchart.Legend.LeftType = iMESChart.Option.LeftType.right; } // Y軸定義 iMESChart.Option.Axis yAxis = new iMESChart.Option.Axis(); { var withBlock = yAxis; withBlock.Type = iMESChart.Option.AxisType.value; withBlock.AlignTicks = true; if (chartAdvenceSetting["YAxisLabeled0"] == "Yes") withBlock.Scale = false; // .AxisLine.LineStyle.Width = Convert.ToInt32(chartAdvenceSetting("YAxisThickness")) if (chartAdvenceSetting["YAxisInterval"] == "") { } else withBlock.Interval = Convert.ToInt32(chartAdvenceSetting["YAxisInterval"]); } pchart.Axis_Y.Add(yAxis); if (chartAdvenceSetting["ShowDataPoint"] == "Yes") { pchart.ToolTip.Show = true; pchart.ToolTip.Trigger = iMESChart.Option.ToolTipTrigger.item; pchart.ToolTip.Formatter = "{c}"; } else pchart.ToolTip.Show = false; List XAxisvalue = chartColumnSetting["XAxis"]; List YAxisvalue = chartColumnSetting["YAxis"]; List SubYAxisvalue = null; List Groupvalue = null; if (chartColumnSetting.ContainsKey("SubYAxis")) SubYAxisvalue = chartColumnSetting["SubYAxis"]; if (chartColumnSetting.ContainsKey("GroupField")) Groupvalue = chartColumnSetting["GroupField"]; DataTable dt = new DataTable(); dt.Columns.Add(XAxisvalue[0]); if (chartColumnSetting.ContainsKey("SubYAxis")) dt.Columns.Add(SubYAxisvalue[0]); if (chartColumnSetting.ContainsKey("GroupField")) dt.Columns.Add(Groupvalue[0]); foreach (var item in YAxisvalue) dt.Columns.Add(item, Type.GetType("System.Decimal")); foreach (DataRow rowA in dtResultSave.Rows) { DataRow newRow = dt.NewRow(); foreach (DataColumn columnA in dtResultSave.Columns) { if (dt.Columns.Contains(columnA.ColumnName)) newRow[columnA.ColumnName] = rowA[columnA.ColumnName]; } dt.Rows.Add(newRow); } DataTable dtX = dt.DefaultView.ToTable(true, XAxisvalue[0]); List xColumns = new List(); foreach (DataRow dr in dtX.Rows) xColumns.Add(dr[XAxisvalue[0]].ToString()); // mesChart.Axis_X.Add(New Axis()) // X軸定義 iMESChart.Option.Axis xAxis = new iMESChart.Option.Axis(); { var withBlock = xAxis; withBlock.Type = iMESChart.Option.AxisType.category; withBlock.AxisTick.AlignWithLabel = true; withBlock.AxisLabel.Show = true; withBlock.AxisLabel.FontSize = 9; withBlock.AxisLabel.Margin = 13; foreach (string item in xColumns) xAxis.Data.Add(new iMESChart.Option.AxisData() { Value = item }); } pchart.Axis_X.Add(xAxis); ICollection colorValues = chartColorSetting.Values; var cNumber = 0; if (chartColumnSetting.ContainsKey("GroupField")) { DataTable dtTmp = dt.DefaultView.ToTable(true, Groupvalue[0]); foreach (DataRow dr in dtTmp.Rows) // EQP1 , EQP2 { DataRow[] drSel = dt.Select(string.Format("{0}='{1}'", Groupvalue[0], dr[Groupvalue[0]].ToString())); // EQP1所有資料 iMESChart.Option.LineChart line = new iMESChart.Option.LineChart(); // line.Name = YAxisvalue(0) & " " & dr(Groupvalue(0)).ToString() line.Name = dr[Groupvalue[0]].ToString(); line.AxisIndex_Y = 0; line.connectNulls = true; //if (chartAdvenceSetting["ShowYAxisLeaderLine"] == "Yes") // // pchart.ToolTip.AxisPointer.Type = [Option].AxisPointerType.line // line.LabelLine.Show = true; line.LineStyle.Width = Convert.ToInt32(chartAdvenceSetting["YAxisThickness"]); if (chartAdvenceSetting["ShowYAxisAverage"] == "Yes") { iMESChart.Option.MarkLineData mark = new iMESChart.Option.MarkLineData(); mark.Start.Type = iMESChart.Option.MarkLinePointType.average; mark.End.Type = iMESChart.Option.MarkLinePointType.average; line.MarkLine.Data.Add(mark); } if (chartAdvenceSetting["ShowYAxisValues"] == "Yes") { line.Label.Show = true; line.Label.Position = iMESChart.Option.LabelPosition_V2.top; } else { } if (chartColorSetting.Count > 0) { string colorStr; if (chartColorSetting.ContainsKey(dr[Groupvalue[0]].ToString())) { colorStr = chartColorSetting[dr[Groupvalue[0]].ToString()]; if (colorStr != "") { string[] colorRGB = colorStr.Split(','); int r = int.Parse(colorRGB[0]); int g = int.Parse(colorRGB[1]); int b = int.Parse(colorRGB[2]); line.LineStyle.Color = Color.FromArgb(r, g, b); line.ItemStyle.Color = Color.FromArgb(r, g, b); } } } cNumber = cNumber + 1; line.MarkLine.LineStyle.Color = Color.FromArgb(0, 0, 255); foreach (string item in xColumns) { DataRow[] drSel2 = dt.Select(string.Format("{0}='{1}' And {2}='{3}'", Groupvalue[0], dr[Groupvalue[0]].ToString(), XAxisvalue[0], item)); // EQP1 指定x軸 的資料 if (drSel2.Length > 0) line.Data.Add(new iMESChart.Option.LineData() { Value = string.Format("{0:N" + Convert.ToInt32(chartAdvenceSetting["YAxisDecimalPoint"]) + "}", Convert.ToDouble(drSel2[0][YAxisvalue[0]])) }); else line.Data.Add(new iMESChart.Option.LineData() { Value = "-" }); } pchart.Charts.Add(line); } } else { HashSet uniqueValues = new HashSet(); List rowsToRemove = new List(); // 遍歷 dt 中的每一行 foreach (DataRow row in dt.Rows) { object value = row[XAxisvalue[0]]; if (!uniqueValues.Add(value)) // 如果此值已經存在於 uniqueValues 中,則將該行添加到 rowsToRemove 中 rowsToRemove.Add(row); } // 從 dt 中刪除所有在 rowsToRemove 中的行 foreach (DataRow row in rowsToRemove) dt.Rows.Remove(row); foreach (var item in YAxisvalue) { iMESChart.Option.LineChart line = new iMESChart.Option.LineChart(); // 新增Line Chart line.LineStyle.Width = Convert.ToInt32(chartAdvenceSetting["YAxisThickness"]); { var withBlock = line; foreach (string item2 in xColumns) { DataRow[] drSel2 = dt.Select(string.Format("{0}='{1}'", XAxisvalue[0], item2)); // 指定x軸 的資料 if (drSel2.Length > 0) line.Data.Add(new iMESChart.Option.LineData() { Value = Convert.ToDouble(drSel2[0][YAxisvalue[cNumber]]).ToString("N" + Convert.ToInt32(chartAdvenceSetting["YAxisDecimalPoint"]).ToString()) }); else line.Data.Add(new iMESChart.Option.LineData() { Value = "-" }); } withBlock.Name = item; // 設定名稱,供圖例控制(legend)讀取 // .DataSource = dt '設定資料來源,如果設定Data則會依Data的資訊為主 // .Field_Item = XAxisvalue(0) '設定類別資料的欄位 // .Field_Value = item '設定數值資料的欄位 withBlock.AxisIndex_Y = 0; //if (chartAdvenceSetting["ShowYAxisLeaderLine"] == "Yes") // line.LabelLine.Show = true; if (chartAdvenceSetting["ShowYAxisAverage"] == "Yes") { iMESChart.Option.MarkLineData mark = new iMESChart.Option.MarkLineData(); mark.Start.Type = iMESChart.Option.MarkLinePointType.average; mark.End.Type = iMESChart.Option.MarkLinePointType.average; withBlock.MarkLine.Data.Add(mark); } if (chartAdvenceSetting["ShowYAxisValues"] == "Yes") { withBlock.Label.Show = true; withBlock.Label.Position = iMESChart.Option.LabelPosition_V2.top; } else { } if (chartColorSetting.Count > 0) { if (!string.IsNullOrEmpty(colorValues.ToList()[cNumber])) { string colorStr = colorValues.ToList()[cNumber]; string[] colorRGB = colorStr.Split(','); int r = int.Parse(colorRGB[0]); int g = int.Parse(colorRGB[1]); int b = int.Parse(colorRGB[2]); withBlock.LineStyle.Color = Color.FromArgb(r, g, b); withBlock.ItemStyle.Color = Color.FromArgb(r, g, b); } } cNumber = cNumber + 1; } pchart.Charts.Add(line); } } if (chartColumnSetting.ContainsKey("SubYAxis")) { iMESChart.Option.Axis yAxis2 = new iMESChart.Option.Axis(); { var withBlock = yAxis2; // .Name = "Hold Qty" // .Data.Add(New [Option].AxisData With {.Value = "5"}) withBlock.Position = iMESChart.Option.AxisPosition.top; withBlock.Type = iMESChart.Option.AxisType.value; withBlock.AlignTicks = true; withBlock.AxisLabel.Show = true; // 不是true則不序列化 if (chartAdvenceSetting["YAxisLabeled0"] == "Yes") withBlock.Scale = false; withBlock.AxisLine.LineStyle.Width = Convert.ToInt32(chartAdvenceSetting["YAxisThickness"]); if (chartAdvenceSetting["YAxisInterval"] == "") { } else withBlock.Interval = Convert.ToInt32(chartAdvenceSetting["YAxisInterval"]); } pchart.Axis_Y.Add(yAxis2); if (Convert.ToInt32(chartAdvenceSetting["SubChartType"]) == 0) { iMESChart.Option.LineChart line = new iMESChart.Option.LineChart(); { var withBlock = line; line.LineStyle.Width = Convert.ToInt32(chartAdvenceSetting["YAxisThickness"]); foreach (string item2 in xColumns) { DataRow[] drSel2 = dt.Select(string.Format("{0}='{1}'", XAxisvalue[0], item2)); // 指定x軸 的資料 if (drSel2.Length > 0) line.Data.Add(new iMESChart.Option.LineData() { Value = Convert.ToDecimal(drSel2[0][SubYAxisvalue[0]]).ToString("N" + Convert.ToInt32(chartAdvenceSetting["YAxisDecimalPoint"]).ToString()) }); else line.Data.Add(new iMESChart.Option.LineData() { Value = "-" }); } withBlock.Name = SubYAxisvalue[0]; // 設定名稱,供圖例控制(legend)讀取 // .DataSource = dt '設定資料來源,如果設定Data則會依Data的資訊為主 // .Field_Item = XAxisvalue(0) '設定類別資料的欄位 // .Field_Value = SubYAxisvalue(0) '設定數值資料的欄位 withBlock.AxisIndex_Y = 1; if (chartAdvenceSetting["ShowYAxisValues"] == "Yes") { withBlock.Label.Show = true; withBlock.Label.Position = iMESChart.Option.LabelPosition_V2.top; } else { } if (chartColorSetting.Count > 0) { if (!string.IsNullOrEmpty(colorValues.ToList()[cNumber])) { string colorStr = colorValues.ToList()[cNumber]; string[] colorRGB = colorStr.Split(','); int r = int.Parse(colorRGB[0]); int g = int.Parse(colorRGB[1]); int b = int.Parse(colorRGB[2]); withBlock.LineStyle.Color = Color.FromArgb(r, g, b); withBlock.ItemStyle.Color = Color.FromArgb(r, g, b); } } } pchart.Charts.Add(line); } if (Convert.ToInt32(chartAdvenceSetting["SubChartType"]) == 1) { iMESChart.Option.BarChart bar = new iMESChart.Option.BarChart(); { var withBlock = bar; foreach (string item2 in xColumns) { DataRow[] drSel2 = dt.Select(string.Format("{0}='{1}'", XAxisvalue[0], item2)); // 指定x軸 的資料 if (drSel2.Length > 0) bar.Data.Add(new iMESChart.Option.BarData() { Value = Convert.ToDouble(drSel2[0][SubYAxisvalue[0]]).ToString("N" + Convert.ToInt32(chartAdvenceSetting["YAxisDecimalPoint"])) }); else bar.Data.Add(new iMESChart.Option.BarData() { Value = "-" }); } withBlock.Name = SubYAxisvalue[0]; // 設定名稱,供圖例控制(legend)讀取 // .DataSource = dt '設定資料來源,如果設定Data則會依Data的資訊為主 // .Field_Item = XAxisvalue(0) '設定類別資料的欄位 // .Field_Value = SubYAxisvalue(0) '設定數值資料的欄位 withBlock.AxisIndex_Y = 1; if (chartAdvenceSetting["ShowYAxisValues"] == "Yes") { withBlock.Label.Show = true; withBlock.Label.Position = iMESChart.Option.LabelPosition_V2.top; } else { } if (chartColorSetting.Count > 0) { if (!string.IsNullOrEmpty(colorValues.ToList()[cNumber])) { string colorStr = colorValues.ToList()[cNumber]; string[] colorRGB = colorStr.Split(','); int r = int.Parse(colorRGB[0]); int g = int.Parse(colorRGB[1]); int b = int.Parse(colorRGB[2]); withBlock.ItemStyle.Color = Color.FromArgb(r, g, b); } } } pchart.Charts.Add(bar); } } var titleName = chartParameter["TitleName"]; return DrawRefresh(pchart, chartID, titleName); } private byte[] DrawTimeLineChart(Dictionary> chartColumnSetting, Dictionary chartParameter, Dictionary chartAdvenceSetting, Dictionary chartColorSetting, string chartID, DataTable dtResultSave, DataTable dtChartSettingResult) { iMESChart.MESChart pchart = new iMESChart.MESChart(); // 建構iMESChart.MESChart控制項 // 開啟圖例控制功能 pchart.Legend.Show = true; pchart.Title.Show = true; pchart.Legend.Type = iMESChart.Option.LegendType.scroll; // 標題名稱 pchart.Title.Text = chartParameter["TitleName"]; // 標題字體大小 pchart.Title.TextStyle.FontSize = Convert.ToInt32(chartParameter["TitleFontSize"]); // 標題位置 if (Convert.ToInt32(chartParameter["TitlePosition"]) == 0) pchart.Title.LeftType = iMESChart.Option.LeftType.left; else if (Convert.ToInt32(chartParameter["TitlePosition"]) == 1) pchart.Title.LeftType = iMESChart.Option.LeftType.center; else if (Convert.ToInt32(chartParameter["TitlePosition"]) == 2) pchart.Title.LeftType = iMESChart.Option.LeftType.right; // 圖例大小 pchart.Legend.ItemWidth = Convert.ToInt32(chartParameter["LegendSize"]); // 圖例方向 if (Convert.ToInt32(chartParameter["LegendDirection"]) == 0) pchart.Legend.Orient = iMESChart.Option.Orient.horizontal; else pchart.Legend.Orient = iMESChart.Option.Orient.vertical; // 圖例位置 if (Convert.ToInt32(chartParameter["LegendPosition"]) == 0) { pchart.Legend.TopType = iMESChart.Option.TopType.top; pchart.Legend.LeftType = iMESChart.Option.LeftType.left; } else if (Convert.ToInt32(chartParameter["LegendPosition"]) == 1) pchart.Legend.TopType = iMESChart.Option.TopType.top; else if (Convert.ToInt32(chartParameter["LegendPosition"]) == 2) { pchart.Legend.TopType = iMESChart.Option.TopType.top; pchart.Legend.LeftType = iMESChart.Option.LeftType.right; } // Y軸定義 iMESChart.Option.Axis yAxis = new iMESChart.Option.Axis(); { var withBlock = yAxis; withBlock.Type = iMESChart.Option.AxisType.value; withBlock.AlignTicks = true; if (chartAdvenceSetting["YAxisLabeled0"] == "Yes") withBlock.Scale = false; if (chartAdvenceSetting["YAxisInterval"] == "") { } else withBlock.Interval = Convert.ToInt32(chartAdvenceSetting["YAxisInterval"]); } pchart.Axis_Y.Add(yAxis); // pchart.series.markline需加入 if (chartAdvenceSetting["ShowDataPoint"] == "Yes") { pchart.ToolTip.Show = true; pchart.ToolTip.Trigger = iMESChart.Option.ToolTipTrigger.item; pchart.ToolTip.Formatter = "{c}"; } else pchart.ToolTip.Show = false; List XAxisvalue = chartColumnSetting["XAxis"]; List YAxisvalue = chartColumnSetting["YAxis"]; List Groupvalue = null; if (chartColumnSetting.ContainsKey("GroupField")) Groupvalue = chartColumnSetting["GroupField"]; DataTable dt = new DataTable(); dt.Columns.Add(XAxisvalue[0], Type.GetType("System.DateTime")); if (chartColumnSetting.ContainsKey("GroupField")) dt.Columns.Add(Groupvalue[0]); foreach (var item in YAxisvalue) dt.Columns.Add(item, Type.GetType("System.Decimal")); foreach (DataRow rowA in dtResultSave.Rows) { DataRow newRow = dt.NewRow(); foreach (DataColumn columnA in dtResultSave.Columns) { if (dt.Columns.Contains(columnA.ColumnName)) newRow[columnA.ColumnName] = rowA[columnA.ColumnName]; } dt.Rows.Add(newRow); } DataTable dtX = dt.DefaultView.ToTable(true, XAxisvalue[0]); List xColumns = new List(); foreach (DataRow dr in dtX.Rows) { if (Convert.ToInt32(chartAdvenceSetting["XAxisScale"]) == 0) xColumns.Add(String.Format(Convert.ToString(dr[XAxisvalue[0]]), "yyyy/MM/dd")); else if (Convert.ToInt32(chartAdvenceSetting["XAxisScale"]) == 1) xColumns.Add(String.Format(Convert.ToString(dr[XAxisvalue[0]]), "yyyy/MM/dd HH")); else if (Convert.ToInt32(chartAdvenceSetting["XAxisScale"]) == 2) xColumns.Add(String.Format(Convert.ToString(dr[XAxisvalue[0]]), "yyyy/MM/dd HH:mm")); else if (Convert.ToInt32(chartAdvenceSetting["XAxisScale"]) == 3) xColumns.Add(String.Format(Convert.ToString(dr[XAxisvalue[0]]), "yyyy/MM/dd HH:mm:ss")); } List xColumns2 = new List(); foreach (DataRow dr in dtX.Rows) xColumns2.Add(Convert.ToDateTime(dr[XAxisvalue[0]].ToString())); // X軸定義 iMESChart.Option.Axis xAxis = new iMESChart.Option.Axis(); { var withBlock = xAxis; withBlock.Type = iMESChart.Option.AxisType.time; withBlock.AxisTick.AlignWithLabel = true; withBlock.AxisLabel.Show = true; withBlock.AxisLabel.FontSize = 9; withBlock.AxisLabel.Margin = 13; //foreach (string item in xColumns) // xAxis.Data.Add(new iMESChart.Option.AxisData() { Value = item }); } pchart.Axis_X.Add(xAxis); ICollection colorValues = chartColorSetting.Values; var cNumber = 0; if (chartColumnSetting.ContainsKey("GroupField")) { DataTable dtTmp = dt.DefaultView.ToTable(true, Groupvalue[0]); foreach (DataRow dr in dtTmp.Rows) // EQP1 , EQP2 { DataRow[] drSel = dt.Select(string.Format("{0}='{1}'", Groupvalue[0], dr[Groupvalue[0]].ToString())); // EQP1所有資料 iMESChart.Option.LineChart line = new iMESChart.Option.LineChart(); line.LineStyle.Width = Convert.ToInt32(chartAdvenceSetting["TimelineThickness"]); if (chartAdvenceSetting["ShowYAxisValues"] == "Yes") { line.Label.Show = true; line.Label.Position = iMESChart.Option.LabelPosition_V2.top; } else { } // line.Name = YAxisvalue(0) & " " & dr(Groupvalue(0)).ToString() line.Name = dr[Groupvalue[0]].ToString(); line.AxisIndex_Y = 0; line.connectNulls = true; if (chartAdvenceSetting["ShowYAxisAverage"] == "Yes") { iMESChart.Option.MarkLineData mark = new iMESChart.Option.MarkLineData(); mark.Start.Type = iMESChart.Option.MarkLinePointType.average; mark.End.Type = iMESChart.Option.MarkLinePointType.average; line.MarkLine.Data.Add(mark); } //if (chartAdvenceSetting["ShowYAxisLeaderLine"] == "Yes") // line.LabelLine.Show = true; if (chartColorSetting.Count > 0) { string colorStr; if (chartColorSetting.ContainsKey(dr[Groupvalue[0]].ToString())) { colorStr = chartColorSetting[dr[Groupvalue[0]].ToString()]; if (colorStr != "") { string[] colorRGB = colorStr.Split(','); int r = int.Parse(colorRGB[0]); int g = int.Parse(colorRGB[1]); int b = int.Parse(colorRGB[2]); line.LineStyle.Color = Color.FromArgb(r, g, b); line.ItemStyle.Color = Color.FromArgb(r, g, b); } } } cNumber = cNumber + 1; Dictionary dic = new Dictionary(); foreach (DateTime item in xColumns2) { DataRow[] drSel2 = dt.Select(string.Format("{0}='{1}' And {2}='{3}'", Groupvalue[0], dr[Groupvalue[0]].ToString(), XAxisvalue[0], item)); // EQP1 指定x軸 的資料 if (drSel2.Length > 0) //line.Data.Add(new iMESChart.Option.LineData() { Value = Convert.ToDouble(drSel2[0][YAxisvalue[0]]).ToString("N" + Convert.ToInt32(chartAdvenceSetting["YAxisDecimalPoint"])) }); dic.Add(item, Convert.ToDouble(drSel2[0][YAxisvalue[0]]).ToString("N" + Convert.ToInt32(chartAdvenceSetting["YAxisDecimalPoint"]))); else //line.Data.Add(new iMESChart.Option.LineData() { Value = "-" }); dic.Add(item, "'"); } foreach (DateTime item in dic.Keys) { iMESChart.Option.LineData_Time lineData = new iMESChart.Option.LineData_Time(); if (Convert.ToInt32(chartAdvenceSetting["XAxisScale"]) == 0) { lineData.TimeFormat = "yyyy/MM/dd"; } else if (Convert.ToInt32(chartAdvenceSetting["XAxisScale"]) == 1) { lineData.TimeFormat = "yyyy/MM/dd HH"; } else if (Convert.ToInt32(chartAdvenceSetting["XAxisScale"]) == 2) { lineData.TimeFormat = "yyyy/MM/dd HH:mm"; } else if (Convert.ToInt32(chartAdvenceSetting["XAxisScale"]) == 3) { lineData.TimeFormat = "yyyy/MM/dd HH:mm:ss"; } lineData.Value = dic[item].ToString(); lineData.Time = item; line.Data.Add(lineData); } pchart.Charts.Add(line); } } else { HashSet uniqueValues = new HashSet(); List rowsToRemove = new List(); // 遍歷 dt 中的每一行 foreach (DataRow row in dt.Rows) { object value = row[XAxisvalue[0]]; if (!uniqueValues.Add(value)) // 如果此值已經存在於 uniqueValues 中,則將該行添加到 rowsToRemove 中 rowsToRemove.Add(row); } // 從 dt 中刪除所有在 rowsToRemove 中的行 foreach (DataRow row in rowsToRemove) dt.Rows.Remove(row); foreach (var item in YAxisvalue) { iMESChart.Option.LineChart line = new iMESChart.Option.LineChart(); // 新增Line Chart { var withBlock = line; if (chartAdvenceSetting["ShowYAxisAverage"] == "Yes") { iMESChart.Option.MarkLineData mark = new iMESChart.Option.MarkLineData(); mark.Start.Type = iMESChart.Option.MarkLinePointType.average; mark.End.Type = iMESChart.Option.MarkLinePointType.average; withBlock.MarkLine.Data.Add(mark); } //if (chartAdvenceSetting["ShowYAxisLeaderLine"] == "Yes") // line.LabelLine.Show = true; if (chartAdvenceSetting["ShowYAxisValues"] == "Yes") { withBlock.Label.Show = true; withBlock.Label.Position = iMESChart.Option.LabelPosition_V2.top; } else { } Dictionary dic = new Dictionary(); foreach (DateTime item2 in xColumns2) { DataRow[] drSel2 = dt.Select(string.Format("{0}='{1}'", XAxisvalue[0], item2)); // 指定x軸 的資料 if (drSel2.Length > 0) //line.Data.Add(new iMESChart.Option.LineData() { Value = Convert.ToDouble(drSel2[0][YAxisvalue[cNumber]]).ToString("N" + Convert.ToInt32(chartAdvenceSetting["YAxisDecimalPoint"])) }); dic.Add(item2, Convert.ToDouble(drSel2[0][YAxisvalue[cNumber]]).ToString("N" + Convert.ToInt32(chartAdvenceSetting["YAxisDecimalPoint"]))); else //line.Data.Add(new iMESChart.Option.LineData() { Value = "-" }); dic.Add(item2, "'"); } withBlock.Name = item; // 設定名稱,供圖例控制(legend)讀取 withBlock.LineStyle.Width = Convert.ToInt32(chartAdvenceSetting["TimelineThickness"]); withBlock.AxisIndex_Y = 0; if (chartColorSetting.Count > 0) { if (!string.IsNullOrEmpty(colorValues.ToList()[cNumber])) { string colorStr = colorValues.ToList()[cNumber]; string[] colorRGB = colorStr.Split(','); int r = int.Parse(colorRGB[0]); int g = int.Parse(colorRGB[1]); int b = int.Parse(colorRGB[2]); withBlock.LineStyle.Color = Color.FromArgb(r, g, b); withBlock.ItemStyle.Color = Color.FromArgb(r, g, b); } } cNumber = cNumber + 1; foreach (DateTime item3 in dic.Keys) { iMESChart.Option.LineData_Time lineData = new iMESChart.Option.LineData_Time(); if (Convert.ToInt32(chartAdvenceSetting["XAxisScale"]) == 0) { lineData.TimeFormat = "yyyy/MM/dd"; } else if (Convert.ToInt32(chartAdvenceSetting["XAxisScale"]) == 1) { lineData.TimeFormat = "yyyy/MM/dd HH"; } else if (Convert.ToInt32(chartAdvenceSetting["XAxisScale"]) == 2) { lineData.TimeFormat = "yyyy/MM/dd HH:mm"; } else if (Convert.ToInt32(chartAdvenceSetting["XAxisScale"]) == 3) { lineData.TimeFormat = "yyyy/MM/dd HH:mm:ss"; } lineData.Value = dic[item3].ToString(); lineData.Time = item3; line.Data.Add(lineData); } } pchart.Charts.Add(line); } } var titleName = chartParameter["TitleName"]; return DrawRefresh(pchart, chartID, titleName); } private byte[] DrawBarChart(Dictionary> chartColumnSetting, Dictionary chartParameter, Dictionary chartAdvenceSetting, Dictionary chartColorSetting, string chartID, string chartType, DataTable dtResultSave, DataTable dtChartSettingResult) { iMESChart.MESChart pchart = new iMESChart.MESChart(); // 建構iMESChart.MESChart控制項 // 開啟圖例控制功能 pchart.Legend.Show = true; pchart.Title.Show = true; pchart.Legend.Type = iMESChart.Option.LegendType.scroll; // 標題名稱 pchart.Title.Text = chartParameter["TitleName"]; // 標題字體大小 pchart.Title.TextStyle.FontSize = Convert.ToInt32(chartParameter["TitleFontSize"]); // 標題位置 if (Convert.ToInt32(chartParameter["TitlePosition"]) == 0) pchart.Title.LeftType = iMESChart.Option.LeftType.left; else if (Convert.ToInt32(chartParameter["TitlePosition"]) == 1) pchart.Title.LeftType = iMESChart.Option.LeftType.center; else if (Convert.ToInt32(chartParameter["TitlePosition"]) == 2) pchart.Title.LeftType = iMESChart.Option.LeftType.right; // 圖例大小 pchart.Legend.ItemWidth = Convert.ToInt32(chartParameter["LegendSize"]); pchart.Legend.Bottom = 20; // 圖例方向 if (Convert.ToInt32(chartParameter["LegendDirection"]) == 0) pchart.Legend.Orient = iMESChart.Option.Orient.horizontal; else pchart.Legend.Orient = iMESChart.Option.Orient.vertical; // 圖例位置 if (Convert.ToInt32(chartParameter["LegendPosition"]) == 0) { pchart.Legend.TopType = iMESChart.Option.TopType.top; pchart.Legend.LeftType = iMESChart.Option.LeftType.left; } else if (Convert.ToInt32(chartParameter["LegendPosition"]) == 1) pchart.Legend.TopType = iMESChart.Option.TopType.top; else if (Convert.ToInt32(chartParameter["LegendPosition"]) == 2) { pchart.Legend.TopType = iMESChart.Option.TopType.top; pchart.Legend.LeftType = iMESChart.Option.LeftType.right; } // Y軸定義 iMESChart.Option.Axis yAxis = new iMESChart.Option.Axis(); { var withBlock = yAxis; withBlock.Type = iMESChart.Option.AxisType.value; withBlock.AlignTicks = true; if (chartAdvenceSetting["YAxisLabeled0"] == "Yes") withBlock.Scale = false; if (chartAdvenceSetting["YAxisInterval"] == "") { } else withBlock.Interval = Convert.ToInt32(chartAdvenceSetting["YAxisInterval"]); } pchart.Axis_Y.Add(yAxis); if (chartAdvenceSetting["ShowDataPoint"] == "Yes") { pchart.ToolTip.Show = true; pchart.ToolTip.Trigger = iMESChart.Option.ToolTipTrigger.item; pchart.ToolTip.Formatter = "{c}"; } else pchart.ToolTip.Show = false; List XAxisvalue = chartColumnSetting["XAxis"]; List YAxisvalue = chartColumnSetting["YAxis"]; List SubYAxisvalue = null; List Groupvalue = null; if (chartColumnSetting.ContainsKey("SubYAxis")) SubYAxisvalue = chartColumnSetting["SubYAxis"]; if (chartColumnSetting.ContainsKey("GroupField")) Groupvalue = chartColumnSetting["GroupField"]; DataTable dt = new DataTable(); dt.Columns.Add(XAxisvalue[0]); if (chartColumnSetting.ContainsKey("SubYAxis")) dt.Columns.Add(SubYAxisvalue[0]); if (chartColumnSetting.ContainsKey("GroupField")) dt.Columns.Add(Groupvalue[0]); foreach (var item in YAxisvalue) dt.Columns.Add(item, Type.GetType("System.Decimal")); foreach (DataRow rowA in dtResultSave.Rows) { DataRow newRow = dt.NewRow(); foreach (DataColumn columnA in dtResultSave.Columns) { if (dt.Columns.Contains(columnA.ColumnName)) newRow[columnA.ColumnName] = rowA[columnA.ColumnName]; } dt.Rows.Add(newRow); } DataTable dtX = dt.DefaultView.ToTable(true, XAxisvalue[0]); List xColumns = new List(); foreach (DataRow dr in dtX.Rows) xColumns.Add(dr[XAxisvalue[0]].ToString()); // X軸定義 iMESChart.Option.Axis xAxis = new iMESChart.Option.Axis(); { var withBlock = xAxis; withBlock.Type = iMESChart.Option.AxisType.category; withBlock.AxisTick.AlignWithLabel = true; withBlock.AxisLabel.Show = true; withBlock.AxisLabel.FontSize = 9; withBlock.AxisLabel.Margin = 13; foreach (string item in xColumns) xAxis.Data.Add(new iMESChart.Option.AxisData() { Value = item }); } pchart.Axis_X.Add(xAxis); ICollection colorValues = chartColorSetting.Values; var cNumber = 0; if (chartColumnSetting.ContainsKey("GroupField")) { DataTable dtTmp = dt.DefaultView.ToTable(true, Groupvalue[0]); foreach (DataRow dr in dtTmp.Rows) // EQP1 , EQP2 { DataRow[] drSel = dt.Select(string.Format("{0}='{1}'", Groupvalue[0], dr[Groupvalue[0]].ToString())); // EQP1所有資料 iMESChart.Option.BarChart bar = new iMESChart.Option.BarChart(); // line.Name = YAxisvalue(0) & " " & dr(Groupvalue(0)).ToString() bar.Name = dr[Groupvalue[0]].ToString(); bar.AxisIndex_Y = 0; //if (chartAdvenceSetting["ShowYAxisLeaderLine"] == "Yes") // bar.LabelLine.Show = true; if (chartAdvenceSetting["ShowYAxisValues"] == "Yes") { bar.Label.Show = true; bar.Label.Position = iMESChart.Option.LabelPosition_V2.top; } else { } if (Convert.ToInt32(chartType) == 3) bar.Stack = "Stack"; if (chartColorSetting.Count > 0) { string colorStr; if (chartColorSetting.ContainsKey(dr[Groupvalue[0]].ToString())) { colorStr = chartColorSetting[dr[Groupvalue[0]].ToString()]; if (colorStr != "") { string[] colorRGB = colorStr.Split(','); int r = int.Parse(colorRGB[0]); int g = int.Parse(colorRGB[1]); int b = int.Parse(colorRGB[2]); bar.ItemStyle.Color = Color.FromArgb(r, g, b); } } } cNumber = cNumber + 1; // bar.MarkLine.LineStyle.Color = Color.FromArgb(0, 0, 255) // bar.MarkLine.Data.Add(mark) foreach (string item in xColumns) { DataRow[] drSel2 = dt.Select(string.Format("{0}='{1}' And {2}='{3}'", Groupvalue[0], dr[Groupvalue[0]].ToString(), XAxisvalue[0], item)); // EQP1 指定x軸 的資料 if (drSel2.Length > 0) bar.Data.Add(new iMESChart.Option.BarData() { Value = drSel2[0][YAxisvalue[0]].ToString() }); else bar.Data.Add(new iMESChart.Option.BarData() { Value = "-" }); } pchart.Charts.Add(bar); } } else { HashSet uniqueValues = new HashSet(); List rowsToRemove = new List(); // 遍歷 dt 中的每一行 foreach (DataRow row in dt.Rows) { object value = row[XAxisvalue[0]]; if (!uniqueValues.Add(value)) // 如果此值已經存在於 uniqueValues 中,則將該行添加到 rowsToRemove 中 rowsToRemove.Add(row); } // 從 dt 中刪除所有在 rowsToRemove 中的行 foreach (DataRow row in rowsToRemove) dt.Rows.Remove(row); foreach (var item in YAxisvalue) { iMESChart.Option.BarChart bar = new iMESChart.Option.BarChart(); // 新增Line Chart // mark.End.Name = "average line" { var withBlock = bar; //if (chartAdvenceSetting["ShowYAxisLeaderLine"] == "Yes") // bar.LabelLine.Show = true; if (chartAdvenceSetting["ShowYAxisValues"] == "Yes") { withBlock.Label.Show = true; withBlock.Label.Position = iMESChart.Option.LabelPosition_V2.top; } else { } foreach (string item2 in xColumns) { DataRow[] drSel2 = dt.Select(string.Format("{0}='{1}'", XAxisvalue[0], item2)); // 指定x軸 的資料 if (drSel2.Length > 0) bar.Data.Add(new iMESChart.Option.BarData() { Value = Convert.ToString(drSel2[0][YAxisvalue[cNumber]]) }); else bar.Data.Add(new iMESChart.Option.BarData() { Value = "-" }); } withBlock.Name = item; // 設定名稱,供圖例控制(legend)讀取 withBlock.AxisIndex_Y = 0; if (Convert.ToInt32(chartType) == 3) withBlock.Stack = "Stack"; if (chartColorSetting.Count > 0) { if (!string.IsNullOrEmpty(colorValues.ToList()[cNumber])) { string colorStr = colorValues.ToList()[cNumber]; string[] colorRGB = colorStr.Split(','); int r = int.Parse(colorRGB[0]); int g = int.Parse(colorRGB[1]); int b = int.Parse(colorRGB[2]); // .LineStyle.Color = Color.FromArgb(r, g, b) withBlock.ItemStyle.Color = Color.FromArgb(r, g, b); } } cNumber = cNumber + 1; } pchart.Charts.Add(bar); } } if (chartColumnSetting.ContainsKey("SubYAxis")) { iMESChart.Option.Axis yAxis2 = new iMESChart.Option.Axis(); { var withBlock = yAxis2; // .Name = "Hold Qty" // .Data.Add(New [Option].AxisData With {.Value = "5"}) withBlock.Position = iMESChart.Option.AxisPosition.top; withBlock.Type = iMESChart.Option.AxisType.value; withBlock.AlignTicks = true; withBlock.AxisLabel.Show = true; // 不是true則不序列化 if (chartAdvenceSetting["YAxisLabeled0"] == "Yes") withBlock.Scale = false; if (chartAdvenceSetting["YAxisInterval"] == "") { } else withBlock.Interval = Convert.ToInt32(chartAdvenceSetting["YAxisInterval"]); } pchart.Axis_Y.Add(yAxis2); if (Convert.ToInt32(chartAdvenceSetting["SubChartType"]) == 0) { iMESChart.Option.LineChart line = new iMESChart.Option.LineChart(); { var withBlock = line; if (chartAdvenceSetting["ShowYAxisValues"] == "Yes") { withBlock.Label.Show = true; withBlock.Label.Position = iMESChart.Option.LabelPosition_V2.top; } else { } foreach (string item2 in xColumns) { DataRow[] drSel2 = dt.Select(string.Format("{0}='{1}'", XAxisvalue[0], item2)); // 指定x軸 的資料 if (drSel2.Length > 0) line.Data.Add(new iMESChart.Option.LineData() { Value = Convert.ToString(drSel2[0][SubYAxisvalue[0]]) }); else line.Data.Add(new iMESChart.Option.LineData() { Value = "-" }); } withBlock.Name = SubYAxisvalue[0]; // 設定名稱,供圖例控制(legend)讀取 // .DataSource = dt '設定資料來源,如果設定Data則會依Data的資訊為主 // .Field_Item = XAxisvalue(0) '設定類別資料的欄位 withBlock.Field_Value = SubYAxisvalue[0]; // 設定數值資料的欄位 withBlock.AxisIndex_Y = 1; if (chartColorSetting.Count > 0) { if (!string.IsNullOrEmpty(colorValues.ToList()[cNumber])) { string colorStr = colorValues.ToList()[cNumber]; string[] colorRGB = colorStr.Split(','); int r = int.Parse(colorRGB[0]); int g = int.Parse(colorRGB[1]); int b = int.Parse(colorRGB[2]); withBlock.LineStyle.Color = Color.FromArgb(r, g, b); withBlock.ItemStyle.Color = Color.FromArgb(r, g, b); } } } pchart.Charts.Add(line); } if (Convert.ToInt32(chartAdvenceSetting["SubChartType"]) == 1) { iMESChart.Option.BarChart bar = new iMESChart.Option.BarChart(); { var withBlock = bar; if (chartAdvenceSetting["ShowYAxisValues"] == "Yes") { withBlock.Label.Show = true; withBlock.Label.Position = iMESChart.Option.LabelPosition_V2.top; } else { } foreach (string item2 in xColumns) { DataRow[] drSel2 = dt.Select(string.Format("{0}='{1}'", XAxisvalue[0], item2)); // 指定x軸 的資料 if (drSel2.Length > 0) bar.Data.Add(new iMESChart.Option.BarData() { Value = Convert.ToString(drSel2[0][SubYAxisvalue[0]]) }); else bar.Data.Add(new iMESChart.Option.BarData() { Value = "-" }); } withBlock.Name = SubYAxisvalue[0]; // 設定名稱,供圖例控制(legend)讀取 withBlock.AxisIndex_Y = 1; if (chartColorSetting.Count > 0) { if (!string.IsNullOrEmpty(colorValues.ToList()[cNumber])) { string colorStr = colorValues.ToList()[cNumber]; string[] colorRGB = colorStr.Split(','); int r = int.Parse(colorRGB[0]); int g = int.Parse(colorRGB[1]); int b = int.Parse(colorRGB[2]); withBlock.ItemStyle.Color = Color.FromArgb(r, g, b); } } } pchart.Charts.Add(bar); } } var titleName = chartParameter["TitleName"]; return DrawRefresh(pchart, chartID, titleName); } private byte[] DrawPieChart(Dictionary> chartColumnSetting, Dictionary chartParameter, Dictionary chartAdvenceSetting, Dictionary chartColorSetting, string chartID, DataTable dtResultSave, DataTable dtChartSettingResult) { // 建構iMESChart.MESChart控制項 iMESChart.MESChart pchart = new iMESChart.MESChart(); // 開啟圖例控制功能 pchart.Legend.Show = true; pchart.Title.Show = true; pchart.Legend.Type = iMESChart.Option.LegendType.scroll; // 標題名稱 pchart.Title.Text = chartParameter["TitleName"]; // 標題字體大小 pchart.Title.TextStyle.FontSize = Convert.ToInt32(chartParameter["TitleFontSize"]); // 標題位置 if (Convert.ToInt32(chartParameter["TitlePosition"]) == 0) pchart.Title.LeftType = iMESChart.Option.LeftType.left; else if (Convert.ToInt32(chartParameter["TitlePosition"]) == 1) pchart.Title.LeftType = iMESChart.Option.LeftType.center; else if (Convert.ToInt32(chartParameter["TitlePosition"]) == 2) pchart.Title.LeftType = iMESChart.Option.LeftType.right; // 圖例大小 pchart.Legend.ItemWidth = Convert.ToInt32(chartParameter["LegendSize"]); // 圖例方向 if (Convert.ToInt32(chartParameter["LegendDirection"]) == 0) pchart.Legend.Orient = iMESChart.Option.Orient.horizontal; else pchart.Legend.Orient = iMESChart.Option.Orient.vertical; // 圖例位置 if (Convert.ToInt32(chartParameter["LegendPosition"]) == 0) { pchart.Legend.TopType = iMESChart.Option.TopType.top; pchart.Legend.LeftType = iMESChart.Option.LeftType.left; } else if (Convert.ToInt32(chartParameter["LegendPosition"]) == 1) pchart.Legend.TopType = iMESChart.Option.TopType.top; else if (Convert.ToInt32(chartParameter["LegendPosition"]) == 2) { pchart.Legend.TopType = iMESChart.Option.TopType.top; pchart.Legend.LeftType = iMESChart.Option.LeftType.right; } if (chartAdvenceSetting["ShowDataPoint"] == "Yes") { pchart.ToolTip.Show = true; // If chartAdvenceSetting("ShowDataAxisLeaderLine") = "Yes" Then // pchart.ToolTip.AxisPointer.Type = [Option].AxisPointerType.cross // End If pchart.ToolTip.Trigger = iMESChart.Option.ToolTipTrigger.item; pchart.ToolTip.Formatter = "{b}: {c} ({d}%)"; } else pchart.ToolTip.Show = false; List DataAxisvalue = chartColumnSetting["DataAxis"]; List Groupvalue = null; if (chartColumnSetting.ContainsKey("GroupField")) Groupvalue = chartColumnSetting["GroupField"]; DataTable dt = new DataTable(); if (chartColumnSetting.ContainsKey("GroupField")) dt.Columns.Add(Groupvalue[0]); foreach (var item in DataAxisvalue) dt.Columns.Add(item, Type.GetType("System.Int32")); foreach (DataRow rowA in dtResultSave.Rows) { DataRow newRow = dt.NewRow(); foreach (DataColumn columnA in dtResultSave.Columns) { if (dt.Columns.Contains(columnA.ColumnName)) newRow[columnA.ColumnName] = rowA[columnA.ColumnName]; } dt.Rows.Add(newRow); } if (Convert.ToInt32(chartAdvenceSetting["PieChartOrder"]) == 0) dt.DefaultView.Sort = DataAxisvalue[0] + " DESC"; else if (Convert.ToInt32(chartAdvenceSetting["PieChartOrder"]) == 1) dt.DefaultView.Sort = Groupvalue[0] + " ASC"; ICollection colorValues = chartColorSetting.Values; var cNumber = 0; if (chartColumnSetting.ContainsKey("GroupField")) { DataTable dtTmp = dt.DefaultView.ToTable(true, Groupvalue[0]); iMESChart.Option.PieChart pie = new iMESChart.Option.PieChart(); foreach (DataRow dr in dtTmp.Rows) // EQP1 , EQP2 { DataRow[] drSel = dt.Select(string.Format("{0}='{1}'", Groupvalue[0], dr[Groupvalue[0]].ToString())); // EQP1所有資料 // pie.Name = dr(Groupvalue(0)).ToString() if (chartAdvenceSetting["ShowDataAxisLeaderLine"] == "Yes") pie.LabelLine.Show = true; else pie.LabelLine.Show = false; if (chartAdvenceSetting["ShowDataAxis"] == "Yes") { pie.Label.Show = true; pie.Label.Position = iMESChart.Option.LabelPosition.outside; pie.Label.Formatter = "{c}"; } else pie.Label.Show = false; iMESChart.Option.ItemStyle pieColor = new iMESChart.Option.ItemStyle(); if (chartColorSetting.Count > 0) { string colorStr; if (chartColorSetting.ContainsKey(dr[Groupvalue[0]].ToString())) { colorStr = chartColorSetting[dr[Groupvalue[0]].ToString()]; if (colorStr != "") { string[] colorRGB = colorStr.Split(','); int r = int.Parse(colorRGB[0]); int g = int.Parse(colorRGB[1]); int b = int.Parse(colorRGB[2]); // pie.ItemStyle.Color = Color.FromArgb(r, g, b) pieColor.Color = Color.FromArgb(r, g, b); } } } cNumber = cNumber + 1; foreach (DataRow dr2 in drSel) pie.Data.Add(new iMESChart.Option.PieData() { Value = dr2[DataAxisvalue[0]].ToString(), Name = dr[Groupvalue[0]].ToString(), ItemStyle = pieColor }); pie.AvoidLabelOverlap = true; if (chartAdvenceSetting["ShowSectorStyle"] == "Yes") pie.RoseType = iMESChart.Option.RoseType.radius; pie.RadiusOuter = Convert.ToInt32(chartAdvenceSetting["ChartSize"]); } pchart.Charts.Add(pie); } else { } var titleName = chartParameter["TitleName"]; return DrawRefresh(pchart, chartID, titleName); } private byte[] DrawScatterChart(Dictionary> chartColumnSetting, Dictionary chartParameter, Dictionary chartAdvenceSetting, Dictionary chartColorSetting, string chartID, DataTable dtResultSave, DataTable dtChartSettingResult) { iMESChart.MESChart pchart = new iMESChart.MESChart(); // 建構iMESChart.MESChart控制項 // 開啟圖例控制功能 pchart.Legend.Show = true; pchart.Title.Show = true; pchart.Legend.Type = iMESChart.Option.LegendType.scroll; // 標題名稱 pchart.Title.Text = chartParameter["TitleName"]; // 標題字體大小 pchart.Title.TextStyle.FontSize = Convert.ToInt32(chartParameter["TitleFontSize"]); // 標題位置 if (Convert.ToInt32(chartParameter["TitlePosition"]) == 0) pchart.Title.LeftType = iMESChart.Option.LeftType.left; else if (Convert.ToInt32(chartParameter["TitlePosition"]) == 1) pchart.Title.LeftType = iMESChart.Option.LeftType.center; else if (Convert.ToInt32(chartParameter["TitlePosition"]) == 2) pchart.Title.LeftType = iMESChart.Option.LeftType.right; // 圖例大小 pchart.Legend.ItemWidth = Convert.ToInt32(chartParameter["LegendSize"]); // 圖例方向 if (Convert.ToInt32(chartParameter["LegendDirection"]) == 0) pchart.Legend.Orient = iMESChart.Option.Orient.horizontal; else pchart.Legend.Orient = iMESChart.Option.Orient.vertical; // 圖例位置 if (Convert.ToInt32(chartParameter["LegendPosition"]) == 0) { pchart.Legend.TopType = iMESChart.Option.TopType.top; pchart.Legend.LeftType = iMESChart.Option.LeftType.left; } else if (Convert.ToInt32(chartParameter["LegendPosition"]) == 1) pchart.Legend.TopType = iMESChart.Option.TopType.top; else if (Convert.ToInt32(chartParameter["LegendPosition"]) == 2) { pchart.Legend.TopType = iMESChart.Option.TopType.top; pchart.Legend.LeftType = iMESChart.Option.LeftType.right; } // Y軸定義 iMESChart.Option.Axis yAxis = new iMESChart.Option.Axis(); { var withBlock = yAxis; withBlock.Type = iMESChart.Option.AxisType.value; } pchart.Axis_Y.Add(yAxis); if (chartAdvenceSetting["ShowDataPoint"] == "Yes") { pchart.ToolTip.Show = true; pchart.ToolTip.Trigger = iMESChart.Option.ToolTipTrigger.item; pchart.ToolTip.Formatter = "{c}"; } List XAxisvalue = chartColumnSetting["XAxis"]; List YAxisvalue = chartColumnSetting["YAxis"]; List MarkFieldvalue = null; List Groupvalue = null; DataTable dt = new DataTable(); dt.Columns.Add(XAxisvalue[0]); if (chartColumnSetting.ContainsKey("MarkField")) { MarkFieldvalue = chartColumnSetting["MarkField"]; dt.Columns.Add(MarkFieldvalue[0]); } if (chartColumnSetting.ContainsKey("GroupField")) { Groupvalue = chartColumnSetting["GroupField"]; dt.Columns.Add(Groupvalue[0]); } foreach (var item in YAxisvalue) dt.Columns.Add(item, Type.GetType("System.Decimal")); foreach (DataRow rowA in dtResultSave.Rows) { DataRow newRow = dt.NewRow(); foreach (DataColumn columnA in dtResultSave.Columns) { if (dt.Columns.Contains(columnA.ColumnName)) newRow[columnA.ColumnName] = rowA[columnA.ColumnName]; } dt.Rows.Add(newRow); } DataTable dtX = dt.DefaultView.ToTable(false, XAxisvalue[0]); List xColumns = new List(); foreach (DataRow dr in dtX.Rows) xColumns.Add(dr[XAxisvalue[0]].ToString()); DataTable dtY = dt.DefaultView.ToTable(false, YAxisvalue[0]); List yColumns = new List(); foreach (DataRow dr in dtY.Rows) yColumns.Add(dr[YAxisvalue[0]].ToString()); // mesChart.Axis_X.Add(New Axis()) // X軸定義 iMESChart.Option.Axis xAxis = new iMESChart.Option.Axis(); { var withBlock = xAxis; withBlock.Type = iMESChart.Option.AxisType.value; withBlock.AxisTick.AlignWithLabel = true; withBlock.AxisLabel.Show = true; withBlock.AxisLabel.FontSize = 9; withBlock.AxisLabel.Margin = 13; foreach (string item in xColumns) { } } pchart.Axis_X.Add(xAxis); ICollection colorValues = chartColorSetting.Values; var cNumber = 0; if (chartColumnSetting.ContainsKey("GroupField")) { DataTable dtTmp = dt.DefaultView.ToTable(true, Groupvalue[0]); foreach (DataRow dr in dtTmp.Rows) // EQP1 , EQP2 { if (chartColumnSetting.ContainsKey("MarkField")) { // Dim drSel() As DataRow = dt.Select(String.Format("{0}='{1}' And NOT({2} IS NULL)", Groupvalue(0), dr(Groupvalue(0)).ToString(), MarkFieldvalue(0))) // Dim drSel2() As DataRow = dt.Select(String.Format("{0}='{1}' And ({2} IS NULL)", Groupvalue(0), dr(Groupvalue(0)).ToString(), MarkFieldvalue(0))) iMESChart.Option.ScatterChart scatter = new iMESChart.Option.ScatterChart(); iMESChart.Option.EffectScatterChart escatter = new iMESChart.Option.EffectScatterChart(); //if (chartAdvenceSetting["ShowYAxisLeaderLine"] == "Yes") //{ // scatter.LabelLine.Show = true; // escatter.LabelLine.Show = true; //} // line.Name = YAxisvalue(0) & " " & dr(Groupvalue(0)).ToString() scatter.Name = dr[Groupvalue[0]].ToString(); scatter.AxisIndex_Y = 0; scatter.SymbolSize = new SizeF(Convert.ToInt32(chartAdvenceSetting["DataPointSize"]), Convert.ToInt32(chartAdvenceSetting["DataPointSize"])); escatter.Name = dr[Groupvalue[0]].ToString(); escatter.AxisIndex_Y = 0; escatter.SymbolSize = new SizeF(Convert.ToInt32(chartAdvenceSetting["DataPointSize"]), Convert.ToInt32(chartAdvenceSetting["DataPointSize"])); if (chartAdvenceSetting["ShowDataValue"] == "Yes") { scatter.Label.Show = true; scatter.Label.Position = iMESChart.Option.LabelPosition_V2.top; escatter.Label.Show = true; escatter.Label.Position = iMESChart.Option.LabelPosition_V2.top; } else { } if (chartColorSetting.Count > 0) { string colorStr; if (chartColorSetting.ContainsKey(dr[Groupvalue[0]].ToString())) { colorStr = chartColorSetting[dr[Groupvalue[0]].ToString()]; if (colorStr != "") { string[] colorRGB = colorStr.Split(','); int r = int.Parse(colorRGB[0]); int g = int.Parse(colorRGB[1]); int b = int.Parse(colorRGB[2]); // pie.ItemStyle.Color = Color.FromArgb(r, g, b) scatter.ItemStyle.Color = Color.FromArgb(r, g, b); escatter.ItemStyle.Color = Color.FromArgb(r, g, b); } } } cNumber = cNumber + 1; foreach (string item in xColumns) { DataRow[] drSel2 = dt.Select(string.Format("{0}='{1}' And {2}='{3}' And ({4} IS NULL)", Groupvalue[0], dr[Groupvalue[0]].ToString(), XAxisvalue[0], item, MarkFieldvalue[0])); // EQP1 指定x軸 的資料 DataRow[] drSel3 = dt.Select(string.Format("{0}='{1}' And {2}='{3}' And NOT({4} IS NULL)", Groupvalue[0], dr[Groupvalue[0]].ToString(), XAxisvalue[0], item, MarkFieldvalue[0])); if (drSel2.Length > 0) { iMESChart.Option.ScatterData scaNum = new iMESChart.Option.ScatterData(); // scaNum.Value = New PointF(3, 2) scaNum.Value = new PointF(float.Parse(Convert.ToString(drSel2[0][YAxisvalue[0]])), float.Parse(item)); scatter.Data.Add(scaNum); } if (drSel3.Length > 0) { iMESChart.Option.EffectScatterData scaNum2 = new iMESChart.Option.EffectScatterData(); // scaNum.Value = New PointF(3, 2) scaNum2.Value = new PointF(float.Parse(Convert.ToString(drSel3[0][YAxisvalue[0]])), float.Parse(item)); escatter.Data.Add(scaNum2); } } pchart.Charts.Add(scatter); pchart.Charts.Add(escatter); } else { DataRow[] drSel = dt.Select(string.Format("{0}='{1}'", Groupvalue[0], dr[Groupvalue[0]].ToString())); // EQP1所有資料 iMESChart.Option.ScatterChart scatter = new iMESChart.Option.ScatterChart(); // line.Name = YAxisvalue(0) & " " & dr(Groupvalue(0)).ToString() //if (chartAdvenceSetting["ShowYAxisLeaderLine"] == "Yes") // scatter.LabelLine.Show = true; scatter.Name = dr[Groupvalue[0]].ToString(); scatter.AxisIndex_Y = 0; scatter.SymbolSize = new SizeF(Convert.ToInt32(chartAdvenceSetting["DataPointSize"]), Convert.ToInt32(chartAdvenceSetting["DataPointSize"])); if (chartAdvenceSetting["ShowDataValue"] == "Yes") { scatter.Label.Show = true; scatter.Label.Position = iMESChart.Option.LabelPosition_V2.top; } else { } if (chartColorSetting.Count > 0) { string colorStr; if (chartColorSetting.ContainsKey(dr[Groupvalue[0]].ToString())) { colorStr = chartColorSetting[dr[Groupvalue[0]].ToString()]; if (colorStr != "") { string[] colorRGB = colorStr.Split(','); int r = int.Parse(colorRGB[0]); int g = int.Parse(colorRGB[1]); int b = int.Parse(colorRGB[2]); // pie.ItemStyle.Color = Color.FromArgb(r, g, b) scatter.ItemStyle.Color = Color.FromArgb(r, g, b); } } } cNumber = cNumber + 1; foreach (string item in xColumns) { DataRow[] drSel2 = dt.Select(string.Format("{0}='{1}' And {2}='{3}'", Groupvalue[0], dr[Groupvalue[0]].ToString(), XAxisvalue[0], item)); // EQP1 指定x軸 的資料 if (drSel2.Length > 0) { iMESChart.Option.ScatterData scaNum = new iMESChart.Option.ScatterData(); // scaNum.Value = New PointF(3, 2) scaNum.Value = new PointF(float.Parse(Convert.ToString(drSel2[0][YAxisvalue[0]])), float.Parse(item)); scatter.Data.Add(scaNum); } else { } } pchart.Charts.Add(scatter); } } } else foreach (var item in YAxisvalue) { if (chartColumnSetting.ContainsKey("MarkField")) { iMESChart.Option.ScatterChart scatter = new iMESChart.Option.ScatterChart(); iMESChart.Option.EffectScatterChart escatter = new iMESChart.Option.EffectScatterChart(); if (chartAdvenceSetting["ShowDataValue"] == "Yes") { scatter.Label.Show = true; scatter.Label.Position = iMESChart.Option.LabelPosition_V2.top; escatter.Label.Show = true; escatter.Label.Position = iMESChart.Option.LabelPosition_V2.top; } //if (chartAdvenceSetting["ShowYAxisLeaderLine"] == "Yes") //{ // scatter.LabelLine.Show = true; // escatter.LabelLine.Show = true; //} var scaCount = 0; foreach (string item2 in xColumns) { DataRow[] drSel2 = dt.Select(string.Format("{0}={1} And {2}={3} And ({4} IS NULL)", YAxisvalue[0], Convert.ToDouble(yColumns[scaCount]), XAxisvalue[0], item2, MarkFieldvalue[0])); // EQP1 指定x軸 的資料 DataRow[] drSel3 = dt.Select(string.Format("{0}={1} And {2}={3} And NOT({4} IS NULL)", YAxisvalue[0], Convert.ToDouble(yColumns[scaCount]), XAxisvalue[0], item2, MarkFieldvalue[0])); // EQP1 指定x軸 的資料 if (drSel2.Length > 0) { iMESChart.Option.ScatterData scaNum = new iMESChart.Option.ScatterData(); scaNum.Value = new PointF(float.Parse(item2), float.Parse(yColumns[scaCount])); scatter.Data.Add(scaNum); scatter.SymbolSize = new SizeF(Convert.ToInt32(chartAdvenceSetting["DataPointSize"]), Convert.ToInt32(chartAdvenceSetting["DataPointSize"])); scaCount = scaCount + 1; } else if (drSel3.Length > 0) { iMESChart.Option.EffectScatterData escaNum = new iMESChart.Option.EffectScatterData(); escaNum.Value = new PointF(float.Parse(item2), float.Parse(yColumns[scaCount])); escatter.Data.Add(escaNum); escatter.SymbolSize = new SizeF(Convert.ToInt32(chartAdvenceSetting["DataPointSize"]), Convert.ToInt32(chartAdvenceSetting["DataPointSize"])); scaCount = scaCount + 1; } } if (chartColorSetting.Count > 0) { if (!string.IsNullOrEmpty(colorValues.ToList()[cNumber])) { string colorStr = colorValues.ToList()[cNumber]; string[] colorRGB = colorStr.Split(','); int r = int.Parse(colorRGB[0]); int g = int.Parse(colorRGB[1]); int b = int.Parse(colorRGB[2]); scatter.ItemStyle.Color = Color.FromArgb(r, g, b); escatter.ItemStyle.Color = Color.FromArgb(r, g, b); } } cNumber = cNumber + 1; pchart.Charts.Add(scatter); pchart.Charts.Add(escatter); } else { iMESChart.Option.ScatterChart scatter = new iMESChart.Option.ScatterChart(); // Dim scatter As New iMESChart.Option.chart { var withBlock = scatter; var scaCount = 0; if (chartAdvenceSetting["ShowDataValue"] == "Yes") { scatter.Label.Show = true; scatter.Label.Position = iMESChart.Option.LabelPosition_V2.top; } //if (chartAdvenceSetting["ShowYAxisLeaderLine"] == "Yes") // scatter.LabelLine.Show = true; foreach (string item2 in xColumns) { iMESChart.Option.ScatterData scaNum = new iMESChart.Option.ScatterData(); scaNum.Value = new PointF(float.Parse(item2), float.Parse(yColumns[scaCount])); withBlock.Data.Add(scaNum); withBlock.SymbolSize = new SizeF(Convert.ToInt32(chartAdvenceSetting["DataPointSize"]), Convert.ToInt32(chartAdvenceSetting["DataPointSize"])); scaCount = scaCount + 1; } withBlock.AxisIndex_Y = 0; if (chartColorSetting.Count > 0) { if (!string.IsNullOrEmpty(colorValues.ToList()[cNumber])) { string colorStr = colorValues.ToList()[cNumber]; string[] colorRGB = colorStr.Split(','); int r = int.Parse(colorRGB[0]); int g = int.Parse(colorRGB[1]); int b = int.Parse(colorRGB[2]); withBlock.ItemStyle.Color = Color.FromArgb(r, g, b); } } cNumber = cNumber + 1; } pchart.Charts.Add(scatter); } } var titleName = chartParameter["TitleName"]; return DrawRefresh(pchart, chartID, titleName); } private byte[] DrawBoxplotChart(Dictionary> chartColumnSetting, Dictionary chartParameter, Dictionary chartAdvenceSetting, Dictionary chartColorSetting, string chartID, DataTable dtResultSave, DataTable dtChartSettingResult) { iMESChart.MESChart pchart = new iMESChart.MESChart(); // 建構iMESChart.MESChart控制項 // 開啟圖例控制功能 pchart.Legend.Show = true; pchart.Title.Show = true; pchart.Legend.Type = iMESChart.Option.LegendType.scroll; iMESChart.Option.Title title2 = new iMESChart.Option.Title(); title2.Text = @"upper: Q3 + 1.5 * IQR \nlower: Q1 - 1.5 * IQR"; title2.Left = 10; title2.Bottom = 5; title2.BorderWidth = 1; title2.TextStyle.FontSize = 12; title2.TextStyle.LineHeight = 16; title2.TextStyle.FontWeight = 200; title2.Show = true; pchart.Title.MultiTitle.Add(title2); // 標題名稱 pchart.Title.Text = chartParameter["TitleName"]; // 標題字體大小 pchart.Title.TextStyle.FontSize = Convert.ToInt32(chartParameter["TitleFontSize"]); // 標題位置 if (Convert.ToInt32(chartParameter["TitlePosition"]) == 0) pchart.Title.LeftType = iMESChart.Option.LeftType.left; else if (Convert.ToInt32(chartParameter["TitlePosition"]) == 1) pchart.Title.LeftType = iMESChart.Option.LeftType.center; else if (Convert.ToInt32(chartParameter["TitlePosition"]) == 2) pchart.Title.LeftType = iMESChart.Option.LeftType.right; // 圖例大小 pchart.Legend.ItemWidth = Convert.ToInt32(chartParameter["LegendSize"]); // 圖例方向 if (Convert.ToInt32(chartParameter["LegendDirection"]) == 0) pchart.Legend.Orient = iMESChart.Option.Orient.horizontal; else pchart.Legend.Orient = iMESChart.Option.Orient.vertical; // 圖例位置 if (Convert.ToInt32(chartParameter["LegendPosition"]) == 0) { pchart.Legend.TopType = iMESChart.Option.TopType.top; pchart.Legend.LeftType = iMESChart.Option.LeftType.left; } else if (Convert.ToInt32(chartParameter["LegendPosition"]) == 1) pchart.Legend.TopType = iMESChart.Option.TopType.top; else if (Convert.ToInt32(chartParameter["LegendPosition"]) == 2) { pchart.Legend.TopType = iMESChart.Option.TopType.top; pchart.Legend.LeftType = iMESChart.Option.LeftType.right; } // Y軸定義 iMESChart.Option.Axis yAxis = new iMESChart.Option.Axis(); { var withBlock = yAxis; withBlock.Type = iMESChart.Option.AxisType.value; withBlock.AlignTicks = true; } if (chartAdvenceSetting["ShowDataPoint"] == "Yes") { pchart.ToolTip.Show = true; pchart.ToolTip.AxisPointer.Type = iMESChart.Option.AxisPointerType.line; pchart.ToolTip.Trigger = iMESChart.Option.ToolTipTrigger.item; } else pchart.ToolTip.Show = false; List XAxisvalue = chartColumnSetting["XAxis"]; List YAxisvalue = chartColumnSetting["YAxis"]; List Groupvalue = null; if (chartColumnSetting.ContainsKey("GroupField")) Groupvalue = chartColumnSetting["GroupField"]; DataTable dt = new DataTable(); dt.Columns.Add(XAxisvalue[0]); if (chartColumnSetting.ContainsKey("GroupField")) dt.Columns.Add(Groupvalue[0]); foreach (var item in YAxisvalue) dt.Columns.Add(item, Type.GetType("System.Decimal")); foreach (DataRow rowA in dtResultSave.Rows) { DataRow newRow = dt.NewRow(); foreach (DataColumn columnA in dtResultSave.Columns) { if (dt.Columns.Contains(columnA.ColumnName)) newRow[columnA.ColumnName] = rowA[columnA.ColumnName]; } dt.Rows.Add(newRow); } Dictionary>> dict2 = new Dictionary>>(); for (int i = 0; i <= dt.Rows.Count - 1; i++) { DataRow row = dt.Rows[i]; string xValue = row[XAxisvalue[0]].ToString(); for (int yIndex = 0; yIndex <= YAxisvalue.Count - 1; yIndex++) { string yValue = YAxisvalue[yIndex]; if (!dict2.ContainsKey(yValue)) dict2.Add(yValue, new Dictionary>()); if (!dict2[yValue].ContainsKey(xValue)) dict2[yValue].Add(xValue, new List()); dict2[yValue][xValue].Add(Convert.ToDecimal(row[yValue])); } } DataTable dtX = dt.DefaultView.ToTable(true, XAxisvalue[0]); List xColumns = new List(); foreach (DataRow dr in dtX.Rows) xColumns.Add(dr[XAxisvalue[0]].ToString()); // mesChart.Axis_X.Add(New Axis()) // X軸定義 iMESChart.Option.Axis xAxis = new iMESChart.Option.Axis(); { var withBlock = xAxis; withBlock.Type = iMESChart.Option.AxisType.category; withBlock.AxisTick.AlignWithLabel = true; withBlock.AxisLabel.Show = true; withBlock.AxisLabel.FontSize = 9; withBlock.AxisLabel.Margin = 13; foreach (string item in xColumns) xAxis.Data.Add(new iMESChart.Option.AxisData() { Value = item }); } pchart.Axis_X.Add(xAxis); ICollection colorValues = chartColorSetting.Values; var cNumber = 0; Dictionary dic = new Dictionary(); // dic("serialname_dataindex") = New BoxValue() var seriesIndex = 0; double minNum = 0; // Dim scatter As New iMESChart.Option.ScatterChart if (chartColumnSetting.ContainsKey("GroupField")) { DataTable dtTmp = dt.DefaultView.ToTable(true, Groupvalue[0]); foreach (DataRow dr in dtTmp.Rows) // EQP1 , EQP2 { var dataIndex = 0; iMESChart.Option.BoxplotChart boxplot = new iMESChart.Option.BoxplotChart(); DataRow[] drSel = dt.Select(string.Format("{0}='{1}'", Groupvalue[0], dr[Groupvalue[0]].ToString())); // EQP1所有資料 foreach (string item in xColumns) { DataRow[] drSel2 = dt.Select(string.Format("{0}='{1}' And {2}='{3}'", Groupvalue[0], dr[Groupvalue[0]].ToString(), XAxisvalue[0], item)); // EQP1 指定x軸 的資料 if (drSel2.Length > 0) { List GroupdecimalList = new List(); foreach (DataRow row in drSel2) GroupdecimalList.Add(Convert.ToDecimal(row[YAxisvalue[0]])); { var withBlock = boxplot; withBlock.Name = dr[Groupvalue[0]].ToString(); // 設定名稱,供圖例控制(legend)讀取 withBlock.AxisIndex_Y = 0; iMESChart.Option.BoxplotData boxNum = new iMESChart.Option.BoxplotData(); boxNum.Max = Convert.ToDouble(GroupdecimalList.Max()); boxNum.Min = Convert.ToDouble(GroupdecimalList.Min()); boxNum.Q2 = Convert.ToDouble(Median(GroupdecimalList)); boxNum.Q3 = Convert.ToDouble(Percentile(GroupdecimalList, 75)); boxNum.Q1 = Convert.ToDouble(Percentile(GroupdecimalList, 25)); withBlock.Data.Add(boxNum); BoxValue itemBox = new BoxValue(); itemBox.Max = Convert.ToDouble(GroupdecimalList.Max()); itemBox.Min = Convert.ToDouble(GroupdecimalList.Min()); itemBox.Q2 = Convert.ToDouble(Median(GroupdecimalList)); itemBox.Q3 = Convert.ToDouble(Percentile(GroupdecimalList, 75)); itemBox.Q1 = Convert.ToDouble(Percentile(GroupdecimalList, 25)); if (minNum > itemBox.Min) minNum = itemBox.Min; List outMaxList = new List(); List outMinList = new List(); foreach (var outNumber in GroupdecimalList) { if (Convert.ToDouble(outNumber) > Convert.ToDouble(Percentile(GroupdecimalList, 75)) + 1.5 * Convert.ToDouble((Percentile(GroupdecimalList, 75) - Percentile(GroupdecimalList, 25)))) outMaxList.Add(outNumber); else if (Convert.ToDouble(outNumber) < Convert.ToDouble(Percentile(GroupdecimalList, 25)) - 1.5 * Convert.ToDouble((Percentile(GroupdecimalList, 75) - Percentile(GroupdecimalList, 25)))) { outMinList.Add(outNumber); if (minNum > Convert.ToDouble(outNumber)) minNum = Convert.ToDouble(outNumber); } } itemBox.OutMax = outMaxList; itemBox.OutMin = outMinList; dic["B" + dataIndex + "_" + seriesIndex] = itemBox; if (chartColorSetting.Count > 0) { string colorStr; if (chartColorSetting.ContainsKey(dr[Groupvalue[0]].ToString())) { colorStr = chartColorSetting[dr[Groupvalue[0]].ToString()]; if (colorStr != "") { string[] colorRGB = colorStr.Split(','); int r = int.Parse(colorRGB[0]); int g = int.Parse(colorRGB[1]); int b = int.Parse(colorRGB[2]); // pie.ItemStyle.Color = Color.FromArgb(r, g, b) withBlock.ItemStyle.BorderColor = Color.FromArgb(r, g, b); } } } dataIndex = dataIndex + 1; cNumber = cNumber + 1; } } else { iMESChart.Option.BoxplotData boxNum = new iMESChart.Option.BoxplotData(); boxNum.Max = defDouble; boxNum.Min = defDouble; boxNum.Q2 = defDouble; boxNum.Q3 = defDouble; boxNum.Q1 = defDouble; boxplot.Data.Add(boxNum); dataIndex = dataIndex + 1; } } pchart.Charts.Add(boxplot); seriesIndex = seriesIndex + 1; } yAxis.Min = minNum - 2; } else foreach (var item in YAxisvalue) // YAxisvalue { var dataIndex = 0; var i = 0; iMESChart.Option.BoxplotChart boxplot = new iMESChart.Option.BoxplotChart(); foreach (string itemx in xColumns) // YAxisvalue { List yValues = dict2[item][itemx]; { var withBlock = boxplot; withBlock.Name = item; // 設定名稱,供圖例控制(legend)讀取 withBlock.AxisIndex_Y = 0; iMESChart.Option.BoxplotData boxNum = new iMESChart.Option.BoxplotData(); boxNum.Max = Convert.ToDouble(yValues.Max()); boxNum.Min = Convert.ToDouble(yValues.Min()); boxNum.Q2 = Convert.ToDouble(Median(yValues)); boxNum.Q3 = Convert.ToDouble(Percentile(yValues, 75)); boxNum.Q1 = Convert.ToDouble(Percentile(yValues, 25)); withBlock.Data.Add(boxNum); BoxValue itemBox = new BoxValue(); itemBox.Max = Convert.ToDouble(yValues.Max()); itemBox.Min = Convert.ToDouble(yValues.Min()); itemBox.Q2 = Convert.ToDouble(Median(yValues)); itemBox.Q3 = Convert.ToDouble(Percentile(yValues, 75)); itemBox.Q1 = Convert.ToDouble(Percentile(yValues, 25)); List outMaxList = new List(); List outMinList = new List(); foreach (var outNumber in yValues) { if (Convert.ToDouble(outNumber) > Convert.ToDouble(Percentile(yValues, 75)) + 1.5 * Convert.ToDouble((Percentile(yValues, 75) - Percentile(yValues, 25)))) outMaxList.Add(outNumber); else if (Convert.ToDouble(outNumber) < Convert.ToDouble(Percentile(yValues, 25)) - 1.5 * Convert.ToDouble((Percentile(yValues, 75) - Percentile(yValues, 25)))) outMinList.Add(outNumber); } itemBox.OutMax = outMaxList; itemBox.OutMin = outMinList; dic["B" + dataIndex + "_" + seriesIndex] = itemBox; if (chartColorSetting.Count > 0) { if (!string.IsNullOrEmpty(colorValues.ToList()[cNumber])) { string colorStr = colorValues.ToList()[cNumber]; string[] colorRGB = colorStr.Split(','); int r = int.Parse(colorRGB[0]); int g = int.Parse(colorRGB[1]); int b = int.Parse(colorRGB[2]); withBlock.ItemStyle.BorderColor = Color.FromArgb(r, g, b); } } dataIndex = dataIndex + 1; } } pchart.Charts.Add(boxplot); cNumber = cNumber + 1; seriesIndex = seriesIndex + 1; } string js = "var par={"; foreach (string item in dic.Keys) js += $"{item}:{{max:{dic[item].Max},min:{dic[item].Min},q1:{dic[item].Q1},q2:{dic[item].Q2},q3:{dic[item].Q3},outmax:[{string.Join(",", dic[item].OutMax)}],outmin:[{string.Join(",", dic[item].OutMin)}]}},"; js = js.TrimEnd(','); js += "};"; pchart.Js = js; pchart.ToolTip.Formatter = "function(obj) { var result = ''; var key = 'B' + obj.dataIndex + '_' + obj.seriesIndex; if (par[key] != undefined) { var item = par[key]; result += 'Max: ' + item.max + ', '; result += 'Min: ' + item.min + ', '; result += 'Q1: ' + item.q1 + ', '; result += 'Q2: ' + item.q2 + ', '; result += 'Q3: ' + item.q3 + ', '; result += 'U_Outliers: '; for (var i = 0; i < item.outmax.length; i++) { result += item.outmax[i] + ' '; } result += ', '; result += 'L_Outliers: '; for (var i = 0; i < item.outmin.length; i++) { result += item.outmin[i] + ' '; } } return result; }"; // pchart.ToolTip.Formatter = "function(obj){ var result = ''; var key = 'B'+obj.dataIndex + '_' + obj.seriesIndex; if (par[key] != undefined) { var item = par[key]; result += 'MAX: ' + item.max + ', '; result += 'MIN: ' + item.min + ', '; result += 'Q1: ' + item.q1 + ', '; result += 'Q2: ' + item.q2 + ', '; result += 'Q3: ' + item.q3 + ', ';} return result; }" pchart.Axis_Y.Add(yAxis); var titleName = chartParameter["TitleName"]; return DrawRefresh(pchart, chartID, titleName); } private byte[] DrawWrongChart(Dictionary> chartColumnSetting, Dictionary chartParameter, Dictionary chartAdvenceSetting, Dictionary chartColorSetting, string chartID, DataTable dtResultSave, DataTable dtChartSettingResult) { iMESChart.MESChart pchart = new iMESChart.MESChart(); // 建構iMESChart.MESChart控制項 // 開啟圖例控制功能 pchart.Legend.Show = true; pchart.Title.Show = true; pchart.Legend.Type = iMESChart.Option.LegendType.scroll; // 標題名稱 pchart.Title.Text = chartParameter["TitleName"]; // 標題字體大小 pchart.Title.TextStyle.FontSize = Convert.ToInt32(chartParameter["TitleFontSize"]); // 標題位置 if (Convert.ToInt32(chartParameter["TitlePosition"]) == 0) pchart.Title.LeftType = iMESChart.Option.LeftType.left; else if (Convert.ToInt32(chartParameter["TitlePosition"]) == 1) pchart.Title.LeftType = iMESChart.Option.LeftType.center; else if (Convert.ToInt32(chartParameter["TitlePosition"]) == 2) pchart.Title.LeftType = iMESChart.Option.LeftType.right; // 圖例大小 pchart.Legend.ItemWidth = Convert.ToInt32(chartParameter["LegendSize"]); // 圖例方向 if (Convert.ToInt32(chartParameter["LegendDirection"]) == 0) pchart.Legend.Orient = iMESChart.Option.Orient.horizontal; else pchart.Legend.Orient = iMESChart.Option.Orient.vertical; // 圖例位置 if (Convert.ToInt32(chartParameter["LegendPosition"]) == 0) { pchart.Legend.TopType = iMESChart.Option.TopType.top; pchart.Legend.LeftType = iMESChart.Option.LeftType.left; } else if (Convert.ToInt32(chartParameter["LegendPosition"]) == 1) pchart.Legend.TopType = iMESChart.Option.TopType.top; else if (Convert.ToInt32(chartParameter["LegendPosition"]) == 2) { pchart.Legend.TopType = iMESChart.Option.TopType.top; pchart.Legend.LeftType = iMESChart.Option.LeftType.right; } // Y軸定義 iMESChart.Option.Axis yAxis = new iMESChart.Option.Axis(); { var withBlock = yAxis; withBlock.Type = iMESChart.Option.AxisType.value; withBlock.AlignTicks = true; } pchart.Axis_Y.Add(yAxis); // X軸定義 iMESChart.Option.Axis xAxis = new iMESChart.Option.Axis(); { var withBlock = xAxis; withBlock.Type = iMESChart.Option.AxisType.category; withBlock.AxisTick.AlignWithLabel = true; withBlock.AxisLabel.Show = true; withBlock.AxisLabel.FontSize = 9; withBlock.AxisLabel.Margin = 13; } pchart.Axis_X.Add(xAxis); var titleName = chartParameter["TitleName"]; return DrawRefresh(pchart, chartID, titleName); } private byte[] DrawChart(DataTable dtResultSave, DataTable dtChartSettingResult) { List> fileList = new List>(); byte[] CompressedData = null; if (dtChartSettingResult != null) { foreach (DataRow row in dtChartSettingResult.Rows) { byte[] Databyte = null; Dictionary> chartColumnSetting = new Dictionary>(); Dictionary chartParameter = new Dictionary(); Dictionary chartAdvenceSetting = new Dictionary(); Dictionary chartColorSetting = new Dictionary(); string chartType = row["CHARTTYPE"].ToString(); string configDetail = row["CONFIGDETAIL"].ToString(); string chartID = row["CHARTID"].ToString(); XmlDocument xDoc = new XmlDocument(); xDoc.LoadXml(configDetail); foreach (XmlNode columnSettingNode in xDoc.SelectNodes("/imes_echart/ChartColumnSetting/item")) { string key = columnSettingNode.Attributes["name"].Value; string value = columnSettingNode.Attributes["value"].Value; if (chartColumnSetting.ContainsKey(key)) chartColumnSetting[key].Add(value); else chartColumnSetting[key] = new List() { value }; } foreach (XmlNode parameterNode in xDoc.SelectNodes("/imes_echart/ChartParameter/item")) { chartParameter.Add(parameterNode.Attributes["name"].Value, parameterNode.Attributes["value"].Value); } string titleName = chartParameter["TitleName"]; foreach (XmlNode advenceSettingNode in xDoc.SelectNodes("/imes_echart/ChartAdvenceSetting/item")) { chartAdvenceSetting.Add(advenceSettingNode.Attributes["name"].Value, advenceSettingNode.Attributes["value"].Value); } foreach (XmlNode colorSettingNode in xDoc.SelectNodes("/imes_echart/ChartAdvenceSetting/colorsetting/yaxis/item")) { chartColorSetting.Add(colorSettingNode.Attributes["name"].Value, colorSettingNode.Attributes["value"].Value); } foreach (XmlNode colorSettingNode in xDoc.SelectNodes("/imes_echart/ChartAdvenceSetting/colorsetting/group/item")) { chartColorSetting.Add(colorSettingNode.Attributes["name"].Value, colorSettingNode.Attributes["value"].Value); } foreach (XmlNode colorSettingNode in xDoc.SelectNodes("/imes_echart/ChartAdvenceSetting/colorsetting/subyaxis/item")) { chartColorSetting.Add(colorSettingNode.Attributes["name"].Value, colorSettingNode.Attributes["value"].Value); } // 將每一個欄位名稱轉換為小寫,以便進行比較 List columnNames = dtResultSave.Columns.Cast().Select(x => x.ColumnName.ToLower()).ToList(); foreach (string settingKey in chartColumnSetting.Keys) { if (new List { "XAxis", "YAxis" }.Contains(settingKey)) { foreach (string columnName in chartColumnSetting[settingKey]) { string lowerColumnName = columnName.ToLower(); if (!columnNames.Contains(lowerColumnName)) { Databyte = DrawWrongChart(chartColumnSetting, chartParameter, chartAdvenceSetting, chartColorSetting, chartID, dtResultSave, dtChartSettingResult); //return; } } } else if (new List { "DataAxis" }.Contains(settingKey)) { foreach (string columnName in chartColumnSetting[settingKey]) { // 將查詢欄位名稱轉換為小寫,以便進行比較 string lowerColumnName = columnName.ToLower(); // 檢查是否存在該欄位名稱 if (!columnNames.Contains(lowerColumnName)) { Databyte = DrawWrongChart(chartColumnSetting, chartParameter, chartAdvenceSetting, chartColorSetting, chartID, dtResultSave, dtChartSettingResult); //return; } } } } if (Convert.ToInt32(chartType) == 0) Databyte = DrawLineChart(chartColumnSetting, chartParameter, chartAdvenceSetting, chartColorSetting, chartID, dtResultSave, dtChartSettingResult); if (Convert.ToInt32(chartType) == 1) Databyte = DrawTimeLineChart(chartColumnSetting, chartParameter, chartAdvenceSetting, chartColorSetting, chartID, dtResultSave, dtChartSettingResult); if (Convert.ToInt32(chartType) == 2) Databyte = DrawBarChart(chartColumnSetting, chartParameter, chartAdvenceSetting, chartColorSetting, chartID, chartType, dtResultSave, dtChartSettingResult); if (Convert.ToInt32(chartType) == 3) Databyte = DrawBarChart(chartColumnSetting, chartParameter, chartAdvenceSetting, chartColorSetting, chartID, chartType, dtResultSave, dtChartSettingResult); if (Convert.ToInt32(chartType) == 4) Databyte = DrawPieChart(chartColumnSetting, chartParameter, chartAdvenceSetting, chartColorSetting, chartID, dtResultSave, dtChartSettingResult); if (Convert.ToInt32(chartType) == 5) Databyte = DrawScatterChart(chartColumnSetting, chartParameter, chartAdvenceSetting, chartColorSetting, chartID, dtResultSave, dtChartSettingResult); if (Convert.ToInt32(chartType) == 6) Databyte = DrawBoxplotChart(chartColumnSetting, chartParameter, chartAdvenceSetting, chartColorSetting, chartID, dtResultSave, dtChartSettingResult); fileList.Add(new Tuple(titleName + ".Html", Databyte)); } } try { using (ZipFile zip = new ZipFile(Encoding.UTF8)) { foreach (var file in fileList) { zip.AddEntry(file.Item1, file.Item2); } using (MemoryStream ms = new MemoryStream()) { zip.Save(ms); CompressedData = ms.ToArray(); } } } catch (Exception) { throw; } return CompressedData; } private byte[] DrawRefresh(iMESChart.MESChart pchart, string chartID, string titleName) { pchart.ChartRefresh(); byte[] testbyte = pchart.GetHtmlFileBytes(); return testbyte; } // 計算中位數 private decimal Median(List lst) { var sortedList = lst.OrderBy(d => d).ToList(); var count = sortedList.Count(); if (count % 2 == 0) { var middle = count / 2; return (sortedList[middle - 1] + sortedList[middle]) / 2; } else return sortedList[count / 2]; } // 計算四分位數 private decimal Percentile(List lst, int quartile) { var sortedList = lst.OrderBy(d => d).ToList(); int n = sortedList.Count(); int k = (int)Math.Ceiling(n / 4.0); if (quartile == 25) { decimal d = (quartile * (n - 1) / 100.0m) - (k - 1); return sortedList[k - 1] + d * (sortedList[k] - sortedList[k - 1]); } else if (quartile == 75) { if (Math.Ceiling(n * 3 / 4.0) >= n) { k = Convert.ToInt32(Math.Ceiling(n * 3 / 4.0) - 1); } else { k = (int)Math.Ceiling(n * 3 / 4.0); } decimal d = (quartile * (n - 1) / 100.0m) - (k - 1); return sortedList[k - 1] + d * (sortedList[k] - sortedList[k - 1]); } else { return 0; } } private class BoxValue { public double Max { get; set; } public double Min { get; set; } public double Q1 { get; set; } public double Q2 { get; set; } public double Q3 { get; set; } public List OutMax { get; set; } public List OutMin { get; set; } } private DataTable LoadReportChartSetting(String ReportID) { string InXml, OutXml, strIdentity, strParameter, XmlData, XmlSchema, tblRPTMesChartSetting; StringReader tmpStringReader; DataSet dsDefine = new DataSet(); DataTable dtChartSettingResult = new DataTable(); // 先判斷是否dataset中已有datatable,若有,需先remove否則會有錯誤 //if (!IsNothing(dsDefine.Tables(tblRPTMesChartSetting))) // dsDefine.Tables.Remove(tblRPTMesChartSetting); // 組InXml的字串 string gUserNo = "AUTORUN"; string SendTime = Conversions.ToString(DateTime.Now); strIdentity = CombineXMLIdentity(modWIN.gComputerName, gUserNo, SendTime); strParameter = CombineXMLParameter("reportid", "ReportId", "String", ReportID, ""); InXml = CombineXMLRequest(strIdentity, strParameter); try { // 2016 YF, OutXml = wsRPT.LoadReportBasis(InXml) OutXml = modAutoRunLibrary.InvokeSrv("wsRPT.LoadReportChartSetting", InXml); XmlDocument XmlDoc = new XmlDocument(); XmlDoc.LoadXml(OutXml); if (chkExecutionSuccess(XmlDoc)) { tblRPTMesChartSetting = XmlDoc.GetElementsByTagName("returnvalue").Item(0).SelectNodes("loadreportchartsetting").Item(0).SelectNodes("name").Item(0).InnerXml; // 取出Schema,dataset讀取Schema可防止Null Field及DateTime的問題 XmlSchema = XmlDoc.DocumentElement.GetElementsByTagName("loadreportchartsetting").Item(0).SelectNodes("schema").Item(0).InnerXml; if (XmlSchema != "") { // 將XML讀入String Reader object中,因為Dataset讀入XML時必須透過String Reader物件 tmpStringReader = new System.IO.StringReader(XmlSchema); dsDefine.ReadXmlSchema(tmpStringReader); tmpStringReader.Close(); } // 取出Data XmlData = XmlDoc.DocumentElement.GetElementsByTagName("loadreportchartsetting").Item(0).SelectNodes("value").Item(0).InnerXml; if (XmlData != "") { tmpStringReader = new System.IO.StringReader(XmlData); dsDefine.ReadXml(tmpStringReader); tmpStringReader.Close(); } // Sort dsDefine.Tables[tblRPTMesChartSetting].DefaultView.Sort = "REPORTID"; dtChartSettingResult = dsDefine.Tables[tblRPTMesChartSetting]; dtChartSettingResult.DefaultView.Sort = "CHARTORDER"; dtChartSettingResult = dtChartSettingResult.DefaultView.ToTable(); } else { } XmlDoc = null; } catch (Exception) { } return dtChartSettingResult; dtChartSettingResult.Dispose(); dsDefine.Dispose(); } #endregion #endregion #region TableSpace Automatic Expansion private string funAutomaticExpansion(Collection colParameters = null) { string funAutomaticExpansionRet = default(string); var dsData = new DataSet(); var drSel = default(DataRow[]); string strTableSpaceInfo = "TableSpaceInfo"; string strTableSpaceFile = "TableSpaceFileName"; var aryFilename = new ArrayList(); var strFileName = default(string); string strMaxCode; // 最大碼 string strFilePath = ""; // 目錄路徑 string strTableSpace = "MESDATA_D1,MESIDX_D1,MESDATA_L1,MESIDX_L1,MESDATA_S1,MESIDX_S1"; // 要檢查的TableSpace int intUsedRatio = 90; // TableSpace使用比率界限,預設為90% string strUserPath = ""; // 產生DataFile放置的目錄,預設為DataFile當前目錄 int intFileSize = 500; // 產生DataFile初始大小,預設為500 MB int intGrowthSize = 100; // 產生DataFile自動成長大小,預設為100 MB int intFileMaxSize = 4096; // 產生DataFile最大檔案大小,預設為4096 MB do { try { // ParameterXX參數說明 // 01 要檢查的TableSpace // 02 TableSpace使用比率界限 // 03 產生DataFile放置的目錄 // 04 產生DataFile初始大小 // 05 產生DataFile自動成長大小 // 06 產生DataFile最大檔案大小 // Parameter01為傳入參數,作為要檢查的TableSpace if (colParameters["Parameter01"] == null == false && !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter01"])))) { strTableSpace = Strings.Trim(Conversions.ToString(colParameters["Parameter01"])); // 檢查TableSpace是否存在 if (CheckTableSpaceExist(strTableSpace) == false) { funAutomaticExpansionRet = "TableSpace is not Exist!!!(Parameter 01)"; break; } } // Parameter02為傳入參數,作為TableSpace使用比率界限 if (colParameters["Parameter02"] == null == false && !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter02"])))) { if (Information.IsNumeric(colParameters["Parameter02"])) { intUsedRatio = Conversions.ToInteger(Strings.Trim(Conversions.ToString(colParameters["Parameter02"]))); } else { funAutomaticExpansionRet = "TableSpace Used Ratio is not Numeric!!!(Parameter 02)"; break; } } // Parameter03為傳入參數,產生DataFile放置的目錄 if (colParameters["Parameter03"] == null == false && !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter03"])))) { if (Path.IsPathRooted(Conversions.ToString(colParameters["Parameter03"]))) { strUserPath = Strings.Trim(Conversions.ToString(colParameters["Parameter03"])); } else { funAutomaticExpansionRet = "DataFile Directory is not the Path format!!!(Parameter 03)"; break; } } // Parameter04為傳入參數,產生DataFile初始大小 if (colParameters["Parameter04"] == null == false && !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter04"])))) { if (Information.IsNumeric(colParameters["Parameter04"])) { intFileSize = Conversions.ToInteger(Strings.Trim(Conversions.ToString(colParameters["Parameter04"]))); } else { funAutomaticExpansionRet = "DataFile initial Size is not Numeric!!!(Parameter 04)"; break; } } // Parameter05為傳入參數,產生DataFile自動成長大小 if (colParameters["Parameter05"] == null == false && !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter05"])))) { if (Information.IsNumeric(colParameters["Parameter05"])) { intGrowthSize = Conversions.ToInteger(Strings.Trim(Conversions.ToString(colParameters["Parameter05"]))); } else { funAutomaticExpansionRet = "DataFile Growth Size is not Numeric!!!(Parameter 05)"; break; } } // Parameter06為傳入參數,產生DataFile最大檔案大小 if (colParameters["Parameter06"] == null == false && !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter06"])))) { if (Information.IsNumeric(colParameters["Parameter06"])) { intFileMaxSize = Conversions.ToInteger(Strings.Trim(Conversions.ToString(colParameters["Parameter06"]))); } else { funAutomaticExpansionRet = "DataFile Max Size is not Numeric!!!(Parameter 06)"; break; } } var dtTableSpaceInfo = LoadTableSpaceInfo(strTableSpaceInfo, strTableSpace); if (dtTableSpaceInfo == null) { funAutomaticExpansionRet = "success"; // mssql 有無限制maxsize 因此不需產生DataFile break; } // 讀入TableSpace資訊 dsData.Tables.Add(dtTableSpaceInfo); dsData.Tables.Add(LoadTableSpaceFileName(strTableSpaceFile, strTableSpace)); foreach (DataRow dr in dsData.Tables[strTableSpaceInfo].Rows) { if (!Information.IsNumeric(dr["Used Of Max"])) { throw new Exception("Used Of Max[%MUST BE NUMERIC%]"); } // 判斷超過最大使用比率的TableSpace if (Conversions.ToInteger(dr["Used Of Max"].ToString()) > intUsedRatio) { // 取得 超過最大使用比率的TableSpace/Schema FileName if (strDataBaseType == "oracle") { drSel = dsData.Tables[strTableSpaceFile].Select(Conversions.ToString(Operators.AddObject(Operators.AddObject("TableSpace_name='", dr[0]), "'"))); } else if (strDataBaseType == "mssql") { drSel = dsData.Tables[strTableSpaceFile].Select(); } if (drSel.Length > 0) { // 使用前先清空 aryFilename.Clear(); strFilePath = ""; // 取得目錄路徑 if (drSel[0][1].ToString().IndexOf(@"\") != -1) // Windows Path { // 判斷是否為使用者自訂目錄位置 if (string.IsNullOrEmpty(strUserPath)) { strFilePath = Path.GetDirectoryName(Conversions.ToString(drSel[0][1])) + @"\"; } else { strFilePath = strUserPath.Replace("/", @"\"); if (strFilePath.LastIndexOf(@"\") != strFilePath.Length - 1) { strFilePath += @"\"; } } } else if (drSel[0][1].ToString().IndexOf("/") != -1) // Linux Path { // 判斷是否為使用者自訂目錄位置 if (string.IsNullOrEmpty(strUserPath)) { strFilePath = Path.GetDirectoryName(Conversions.ToString(drSel[0][1])) + "/"; strFilePath = strFilePath.Replace(@"\", "/"); } else { strFilePath = strUserPath.Replace(@"\", "/"); if (strFilePath.LastIndexOf("/") != strFilePath.Length - 1) { strFilePath += "/"; } } } // 取得檔名 foreach (DataRow drSub in drSel) { strFileName = Path.GetFileName(Conversions.ToString(drSub[1])); aryFilename.Add(strFileName); } // strWriteName // oracle: TableSpace Name // mssql : Schema Name string strWriteName = Conversions.ToString(drSel[0][0]); // TableSpace Name if (strDataBaseType == "mssql") { string[] strTemp = strConnectionString.Split(';'); foreach (string sstr in strTemp) { if (sstr.IndexOf("Initial Catalog") == 0) { strTemp = sstr.Split('='); strWriteName = strTemp[1].Trim(); // Schema Name break; } } } // 計算最大碼 strMaxCode = CalculateMaxCode(strWriteName, aryFilename); // 組合路徑 if (strDataBaseType == "oracle") { strFileName = strFilePath + strWriteName + "_" + strMaxCode + ".DBF"; } else if (strDataBaseType == "mssql") { strFileName = strFilePath + strWriteName + "_" + strMaxCode + ".NDF"; } // 產生DataFile CreateDataFile(strWriteName, strFileName, intFileSize.ToString(), intGrowthSize.ToString(), intFileMaxSize.ToString()); } } } funAutomaticExpansionRet = "success"; } catch (Exception ex) { funAutomaticExpansionRet = CombineFailMsg("0000-999999", ex.Message); colParameters.Add(funAutomaticExpansionRet, "EmailBody"); SendJobFailEmail(colParameters); } } while (false); return funAutomaticExpansionRet; } // 檢查TableSpace是否存在 private bool CheckTableSpaceExist(object strTableSpace) { // 只檢查Oracle, 若傳入的TableSpace有任一不存在則回傳false // mssql直接回傳true var cnTemp = default(IDbConnection); //var daTemp = default(System.Data.OleDb.OleDbDataAdapter); string strSQL; var dtTemp = new DataTable(); DataRow[] drSel; try { cnTemp = CreateConnection(strConnectionString); if (strDataBaseType == "oracle") { strSQL = "Select Tablespace_name From Dba_tablespaces"; //cmmTemp = new IDbCommand(strSQL, cnTemp); //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp); //daTemp.Fill(dtTemp); ExecuteSQLQuery_Adapter(strSQL, dtTemp, cnTemp); // 取出要檢查的TableSpaceName string[] strArrayTS = strTableSpace.ToString().Split(','); foreach (string tablespace in strArrayTS) { drSel = dtTemp.Select("tablespace_name='" + tablespace.Trim() + "'"); if (drSel.Length == 0) { return false; } } return true; } else if (strDataBaseType == "mssql") { return true; } } catch (Exception ex) { throw; } finally { CloseConnection(cnTemp); //if (daTemp != null) // daTemp.Dispose(); } return default(Boolean); } // 讀取Table Space Info private DataTable LoadTableSpaceInfo(string strTableName, string strTableSpace) { // oracle: 讀取TableSpace // mssql: 檢查是否有無限制的maxsize var cnTemp = default(IDbConnection); //var daTemp = default(System.Data.OleDb.OleDbDataAdapter); var drTemp = default(DbDataReader); var strSQL = default(string); var dtResult = new DataTable(strTableName); do { try { cnTemp = CreateConnection(strConnectionString); if (strDataBaseType == "oracle") { strSQL = "Select A.Tablespace_name, " + " To_char(Round((A.Bytes-B.Bytes)/(1024*1024),0),'999,999') \"Used(MB)\"," + " To_char(Round((A.Maxbytes)/(1024*1024),0),'999,999,999') \"Max(MB)\"," + " Round((A.Bytes-B.Bytes)/A.Maxbytes*100,2) \"Used of Max\"" + " From (Select Tablespace_name, Sum(Bytes) \"BYTES\", Sum(Maxbytes) \"MAXBYTES\" From Dba_data_files Group By Tablespace_name) A," + " (Select Tablespace_name, Sum(Bytes) \"BYTES\" From Dba_free_space Group By Tablespace_name) B " + " Where A.Tablespace_name=B.Tablespace_name And ("; // 取出要讀取的TableSpaceName string[] strArrayTS = strTableSpace.Split(','); foreach (string tablespace in strArrayTS) strSQL += " A.TableSpace_name = '" + tablespace.Trim() + "' Or"; // 移除最後一個Or strSQL = strSQL.Substring(0, Strings.Len(strSQL) - 2); strSQL += " ) Order By Tablespace_name"; } else if (strDataBaseType == "mssql") { strSQL = "Select Max_Size From Sys.Database_files Where type = 0"; //cmmTemp = new IDbCommand(strSQL, cnTemp); if (cnTemp.State == ConnectionState.Closed) cnTemp.Open(); drTemp = ExecuteSQLQuery_Reader(strSQL, cnTemp); bool exitTry = false; while (drTemp.Read()) { if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp[0], -1, false))) // Max Size = -1 --> Unlimited { exitTry = true; break; } } if (exitTry) { break; } strSQL = "Select Type, " + " Round(Cast(Sum(Size) As Float)*8192/1024/1024, 2) 'Used(MB)'," + " Round(Cast(Sum(Max_Size) As Float)*8192/1024/1024, 2) 'Max(MB)' ," + " Round(Cast(Sum(Size) As Float)/Cast(Sum(Max_Size) As Float)*100, 0) 'Used Of Max'" + " From Sys.Database_Files" + " Where Type = 0" + " Group By Type"; } //cmmTemp = new IDbCommand(strSQL, cnTemp); //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp); //daTemp.Fill(dtResult); ExecuteSQLQuery_Adapter(strSQL, dtResult, cnTemp); return dtResult; } catch (Exception ex) { throw; } finally { CloseConnection(cnTemp); if (drTemp != null) drTemp.Close(); //if (daTemp != null) // daTemp.Dispose(); } } while (false); return default(DataTable); } // 讀取Table Space FileName private DataTable LoadTableSpaceFileName(string strTableName, string strTableSpace) { var cnTemp = default(IDbConnection); //var daTemp = default(System.Data.OleDb.OleDbDataAdapter); var strSQL = default(string); var dtResult = new DataTable(strTableName); try { cnTemp = CreateConnection(strConnectionString); if (strDataBaseType == "oracle") { strSQL = "Select Tablespace_name, File_name From Dba_data_files Where ("; // 取出要檢查的TableSpaceName string[] strArrayTS = strTableSpace.Split(','); foreach (string tablespace in strArrayTS) strSQL += " TableSpace_name = '" + tablespace.Trim() + "' Or"; // 移除最後一個Or strSQL = strSQL.Substring(0, Strings.Len(strSQL) - 2); strSQL += " ) Order By Tablespace_name, File_name"; } else if (strDataBaseType == "mssql") { strSQL = "Select Name, Physical_Name From Sys.Database_Files Where type = 0"; } //cmmTemp = new IDbCommand(strSQL, cnTemp); //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp); //daTemp.Fill(dtResult); ExecuteSQLQuery_Adapter(strSQL, dtResult, cnTemp); return dtResult; } catch (Exception ex) { throw; } finally { CloseConnection(cnTemp); //if (daTemp != null) // daTemp.Dispose(); } } // 計算最大碼 private string CalculateMaxCode(string strTableSpaceName, ArrayList aryFileName) { int intMaxNumber = 0; foreach (string strTemp in aryFileName) { if ((strTemp.ToUpper() ?? "") != (strTableSpaceName.ToUpper() ?? "") && strTemp.ToUpper().IndexOf(strTableSpaceName.ToUpper()) == 0) { string[] strArray = strTemp.Substring(strTableSpaceName.Length + 1, strTemp.Length - strTableSpaceName.Length - 1).Split('.'); // 判斷為3位數才須計算 且 是否可成功轉為數值 且 大於MaxNumber 即將MaxNumber替換為新值 if (strArray[0].Length == 3 && Information.IsNumeric(strArray[0]) && Conversions.ToInteger(strArray[0].ToString()) > intMaxNumber) { intMaxNumber = Conversions.ToInteger(strArray[0].ToString()); } } } intMaxNumber += 1; // 補0至三位數 string result = intMaxNumber.ToString().PadLeft(3, '0'); return result; } // 產生DataFile private void CreateDataFile(string strTableSpaceName, string strFilePathName, string strFileSize, string strGrowthSize, string strFileMaxSize) { var cnTemp = default(IDbConnection); var cmmTemp = default(IDbCommand); //var daTemp = default(System.Data.OleDb.OleDbDataAdapter); var strSQL = default(string); try { cnTemp = CreateConnection(strConnectionString); if (cnTemp.State == ConnectionState.Closed) cnTemp.Open(); cmmTemp = CreateCommand(); cmmTemp.Connection = cnTemp; if (strDataBaseType == "oracle") { //strSQL = "ALTER TABLESPACE " + strTableSpaceName + " ADD DATAFILE '" + strFilePathName + "'" + " SIZE " + strFileSize + "M" + " AUTOEXTEND ON" + " NEXT " + strGrowthSize + "M" + " MAXSIZE " + strFileMaxSize + "M"; strSQL = "ALTER TABLESPACE " + strTableSpaceName + " ADD DATAFILE '" + strFilePathName + "'" + " SIZE " + strFileSize + "M" + " AUTOEXTEND ON" + " NEXT " + strGrowthSize + "M" + " MAXSIZE " + " UNLIMITED"; } else if (strDataBaseType == "mssql") { // mssql 須寫入邏輯名稱, 取得檔名填入 string strFileName = Path.GetFileNameWithoutExtension(strFilePathName); strSQL = "ALTER DATABASE " + strTableSpaceName + " ADD File (" + " NAME = " + strFileName + "," + " FILENAME = '" + strFilePathName + "'," + " SIZE = " + strFileSize + "MB," + " MAXSIZE = " + strFileMaxSize + "MB," + " FILEGROWTH = " + strGrowthSize + "MB)"; } cmmTemp.CommandText = strSQL; cmmTemp.ExecuteNonQuery(); } catch (Exception ex) { throw; } finally { CloseConnection(cnTemp); //if (daTemp != null) // daTemp.Dispose(); } } #endregion #endregion #region 客製JobName #endregion #region 測試用JobName // Add by Martin 2009/03/03 for testing the Url get by using gMESWebServiceHost and GetAppSettings mathod. // Private Function funTestFuncton(Optional ByVal colParameters As Collection = Nothing) As String // Dim cnnTemp As OleDb.OleDbConnection // Dim drTemp As OleDb.OleDbDataReader // Dim wsSPC As New wsSPC.wsSPC // wsSPC.Url = LocalizeWebService(wsSPC.Url.ToString) // wsSPC.EnableDecompression = True // strIdentity = CombineXMLIdentity("Autorun", "Autorun", Now) // InXml = CombineXMLRequest(strIdentity, strParameter) // Try // '開始執行 // OutXml = wsSPC.LoadOQCForm(InXml) // 'MsgBox(OutXml, , "Test Function Response!") '2012/08/21,Even,由於該msgbox造成錯誤(程式不允許auto 回復為msgbox形式) // funTestFuncton = "success" // Catch e1 As Exception // funTestFuncton = "fail;" & e1.Message // '發生錯誤時丟回本身的Function Name及系統錯誤訊息 // 'Throw New Exception("clsAutoRunLibary.funTestFuncton: " & e1.Message) // '2013/02/05, Hank, Send Email // colParameters.Add(funTestFuncton, "EmailBody") // SendJobFailEmail(colParameters) // Finally // Call objSetting.CloseConnection(cnnTemp) // If Not wsSPC Is Nothing Then wsSPC.Dispose() // End Try // End Function #endregion #region ---T100 整合項目--- #region 共用 /// /// 生成EAI的request XML /// /// /// /// /// private string GenerateRequestXML(ERPName erp, string cdata, string servicename) { var XmlDoc = new XmlDocument(); string strRequest = ""; DataRowView row; string input = ""; string key = ""; try { // 取出ERP整合設定資料 if (dtERPSetting == null) { return default(string); } dtERPSetting.DefaultView.RowFilter = "ERP_Name = '" + erp.ToString() + "'"; if (dtERPSetting.DefaultView.Count == 0) { // Throw New iMESException.MESException("0000-200003", erp.ToString & " [%ERPSETTING%]") throw new Exception(erp.ToString() + " [%ERPSETTING%]"); } row = dtERPSetting.DefaultView[0]; // 建立request節點 var nodeRequest = XmlDoc.CreateElement("request"); XmlDoc.AppendChild(nodeRequest); // 建立host節點 var nodeHost = XmlDoc.CreateElement("host"); nodeHost.SetAttribute("prod", row["MESProductName"].ToString()); nodeHost.SetAttribute("ver", row["MESProductVer"].ToString()); nodeHost.SetAttribute("ip", row["MESIP"].ToString()); nodeHost.SetAttribute("id", row["MESID"].ToString()); nodeHost.SetAttribute("lang", row["ERP_LANG"].ToString()); nodeHost.SetAttribute("timestamp", Strings.Format(DateTime.Now, "yyyyMMddHHmmssfff")); nodeHost.SetAttribute("acct", row["ERP_USER"].ToString()); nodeRequest.AppendChild(nodeHost); // 建立service節點 var nodeService = XmlDoc.CreateElement("service"); nodeService.SetAttribute("prod", row["CalledProductName"].ToString()); nodeService.SetAttribute("name", servicename); nodeService.SetAttribute("ip", Conversions.ToString(row["CalledIP"])); nodeService.SetAttribute("id", Conversions.ToString(row["CalledID"])); nodeService.SetAttribute("srvver", row["CalledSrvver"].ToString()); // 2016-03-22, Joe, 改取ERPSetting nodeRequest.AppendChild(nodeService); // 產生request Key, MD5編碼, key=MD5(M+K), M="", K="28682266" (鼎新統一編號) input = nodeHost.OuterXml + nodeService.OuterXml; key = modAutoRunLibrary.GetRequestKey(input); nodeRequest.SetAttribute("type", "sync"); nodeRequest.SetAttribute("key", key); // 建立datakey節點 var nodeDataKey = XmlDoc.CreateElement("datakey"); nodeDataKey.AppendChild(GenerateKeyNode(ref XmlDoc, "EntId", row["ERP_ENTID"].ToString())); nodeDataKey.AppendChild(GenerateKeyNode(ref XmlDoc, "CompanyId", row["ERP_ORG"].ToString())); nodeRequest.AppendChild(nodeDataKey); // 建立payload節點 var nodePayload = XmlDoc.CreateElement("payload"); nodeRequest.AppendChild(nodePayload); // 建立param節點 var nodeParam = XmlDoc.CreateElement("param"); nodeParam.SetAttribute("key", "data"); nodeParam.SetAttribute("type", "XML"); nodePayload.AppendChild(nodeParam); // CDATA Section var cs = XmlDoc.CreateCDataSection(cdata); nodeParam.AppendChild(cs); strRequest = XmlDoc.InnerXml; } catch (Exception ex) { throw; } finally { XmlDoc = null; } return strRequest; } /// /// 生成Key節點 /// /// /// private XmlNode GenerateKeyNode(ref XmlDocument XmlDoc, string name, string value) { XmlElement nodeKey; try { nodeKey = XmlDoc.CreateElement("key"); nodeKey.SetAttribute("name", name); nodeKey.InnerText = value; } catch (Exception ex) { throw; } return nodeKey; } /// /// 查核ERP response XML的Execution Status, 若有錯誤直接拋出例外訊息 /// /// /// public bool CheckExecutionStatus_T100(XmlDocument xmlDoc) { bool blnResult = false; XmlNode node; try { node = xmlDoc.GetElementsByTagName("Execution").Item(0).SelectNodes("Status").Item(0); if (node.Attributes["code"].Value != "0") { throw new Exception("ERP Message: " + node.Attributes["description"].Value); } blnResult = true; } catch (Exception ex) { throw; } return blnResult; } public string CheckResponseContent_T100(XmlDocument xmlDoc) { string CheckResponseContent_T100Ret = default(string); string strCode; do { try { // 取出CDATA內的request節點 XmlNode node; node = GetRequestNode(xmlDoc); if (node == null) { break; } xmlDoc.LoadXml(node.InnerText); // 取得錯誤訊息 var nodeCode = xmlDoc.DocumentElement.SelectNodes("Execution").Item(0).SelectNodes("Status").Item(0); strCode = ((XmlElement)nodeCode).GetAttribute("code"); if (!strCode.StartsWith("0")) { throw new Exception("EAI Message: " + ((XmlElement)nodeCode).GetAttribute("description")); } // 取得回傳值 var nodeResult = xmlDoc.DocumentElement.SelectNodes("ResponseContent").Item(0).SelectNodes("Parameter").Item(0).SelectNodes("Record").Item(0).SelectNodes("Field[@name='result']"); string strResult = ((XmlElement)nodeResult.Item(0)).GetAttribute("value"); CheckResponseContent_T100Ret = strResult; } catch (Exception ex) { throw; } } while (false); return CheckResponseContent_T100Ret; } public XmlNode GetRequestNode(XmlDocument xmlDoc) { XmlNode node = null; XmlNodeList xmlList; try { // 檢查 payload 節點的CDATA Section foreach (XmlNode n in xmlDoc.GetElementsByTagName("payload").Item(0).ChildNodes) { if (n.NodeType == XmlNodeType.CDATA) { node = n; break; } } // 檢查 payload \ param 節點的CDATA Section if (node == null) { xmlList = xmlDoc.GetElementsByTagName("payload").Item(0).SelectNodes("param"); foreach (XmlNode n in xmlList) { if (n.FirstChild != null && n.FirstChild.NodeType == XmlNodeType.CDATA) { node = n; break; } } } } catch (Exception ex) { throw; } return node; } // Public Function getERP_WSURL(ByVal erp As ERPName) As String // Dim row As DataRowView // Try // ' 取出ERP整合設定資料 // If (dtERPSetting Is Nothing) Then // Exit Function // End If // dtERPSetting.DefaultView.RowFilter = "ERP_Name = '" & erp.ToString & "'" // If (dtERPSetting.DefaultView.Count = 0) Then // Throw New Exception(erp.ToString & " [%ERPSETTING%]") // End If // row = dtERPSetting.DefaultView(0) // getERP_WSURL = row("ERP_WSURL").ToString // Catch ex As Exception // Throw // Finally // row = Nothing // End Try // End Function // Public Function getERP_Site() As String // Dim cnTemp As OleDb.OleDbConnection // Dim cmmTemp As OleDb.OleDbCommand // Dim drTemp As OleDb.OleDbDataReader // Dim strSQL As String // Dim strSiteNo As String = "" // Try // cnTemp = CreateConnection(strConnectionString) // strSQL = " Select ParameterValue From tblSYSParameter Where ParameterType = 'SysInfo' And ParameterNo = 'SiteNo' " // cmmTemp = New OleDb.OleDbCommand(strSQL, cnTemp) // drTemp = ExecuteSQLQuery_Reader // If drTemp.Read Then // strSiteNo = drTemp("ParameterValue") // End If // drTemp.Close() // Return strSiteNo // Catch ex As Exception // Throw // Finally // If cnTemp IsNot Nothing Then cnTemp.Close() // If cmmTemp IsNot Nothing Then cmmTemp.Dispose() // End Try // End Function private int Update_T100_IfTable(ref Collection colSQL_T100, ref Collection colSQL_T100_Rows, ref ArrayList aryErrMessage, string IfTableName, string IfWhereCondition_PK, string MES_RESULT, DateTime MES_TIME, string MES_MESSAGE = "") { int Update_T100_IfTableRet = default(int); Update_T100_IfTableRet = -1; // Return -1:fail,0:Success string strSQL; do { try { // IfTableName:中介表名稱 // IfWhereCondition_PK:中介表PK條件,請確實組好後傳入變數,必須Where開頭. // MES_MESSAGE:當MES_RESULT="9"fail才須傳入. // 當MES_RESULT="9",必須傳入MES_MESSAGE. if (MES_RESULT == "9" && (MES_MESSAGE ?? "") == defString) { aryErrMessage.Add("MES處理結果:9,必須寫入處理失敗原因!!"); break; } // ----------------------------------------------------------- // 回填中介表資訊,(注意)各個資料表的PK不同。 // ----------------------------------------------------------- // MES_RESULT ,MES處理結果,預設值為空值,該筆資料處理成功回寫1,失敗回寫9. // MES_MESSAGE,MES處理失敗的原因,失敗時將EXCEPTION回寫(EXCEPTION 或 MES判定不合理資料). // MES_TIME ,MES處理時間,不論成功或失敗將時間回填(使用標準格式:yyyy/MM/dd HH:mm:ss). // ----------------------------------------------------------- // Update strSQL = "Update " + IfTableName + " Set " + " MES_RESULT = '" + MES_RESULT + "'"; // MES_MESSAGE if (!string.IsNullOrEmpty(MES_MESSAGE)) strSQL += ",MES_MESSAGE = '" + ChkSingleQuation(MES_MESSAGE) + "'"; strSQL += ",MES_TIME = '" + Strings.Format(MES_TIME, "yyyy/MM/dd HH:mm:ss") + "'"; // Where strSQL += IfWhereCondition_PK; colSQL_T100.Add(strSQL); colSQL_T100_Rows.Add(1); // //return 0 : Success Update_T100_IfTableRet = 0; } catch (Exception ex) { aryErrMessage.Add(ex.Message); throw; } finally { } } while (false); return Update_T100_IfTableRet; } private int ERP2MES_MailNoticeChk(ref IDbConnection cnnTemp, ref ArrayList aryErrorMessage, string strGroupNo) { int ERP2MES_MailNoticeChkRet = default(int); ERP2MES_MailNoticeChkRet = -1; var drTemp = default(DbDataReader); string strSQL; // 1.檢查寄送群組及郵件清單是否存在. try { // 1-1.Check User By GroupNo strSQL = "Select UserNo From tblUSRUserGroup " + " Where GroupNo = '" + strGroupNo + "'" + " And GroupType = 0"; // fallow SendMultiEmail(),取GroupType=0條件 //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (drTemp.HasRows) { string strUserList = ""; while (drTemp.Read()) strUserList = Conversions.ToString(strUserList + "Or UserNo='" + drTemp["UserNo"] + "'"); if (!string.IsNullOrEmpty(strUserList)) { drTemp.Close(); //cmmTemp.Dispose(); // 1-2.Check EmailAddress Is Null By User strSQL = "Select UserNo,EmailAddress From tblUSRUserBasis " + " Where (" + Strings.Mid(strUserList, 4) + ")" + " And EmailAddress Is Null"; //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); strUserList = ""; // reset while (drTemp.Read()) strUserList = Conversions.ToString(strUserList + "," + drTemp["UserNo"]); if (!string.IsNullOrEmpty(strUserList)) { aryErrorMessage.Add("群組主檔:" + strGroupNo + " 的使用者主檔未設定電子郵寄地址" + '\n' + "員工編號:" + Strings.Mid(strUserList, 2)); return ERP2MES_MailNoticeChkRet; } else { ERP2MES_MailNoticeChkRet = 0; } } drTemp.Close(); //cmmTemp.Dispose(); } else { aryErrorMessage.Add("群組主檔:" + strGroupNo + " 的使用者主檔未設定!!"); return ERP2MES_MailNoticeChkRet; } } catch (Exception ex) { aryErrorMessage.Add(ex.Message.ToString()); } // Throw finally { if (drTemp != null) drTemp.Dispose(); } return ERP2MES_MailNoticeChkRet; } private int ERP2MES_MailNotice(ref IDbConnection cnnTemp, ref ArrayList aryErrorMessage, string strSubject, string strGroupNo, string strBody) { int ERP2MES_MailNoticeRet = default(int); ERP2MES_MailNoticeRet = -1; // 寄送通知 string strResult = ""; try { string argFileName = "N/A"; string argEmailBody = CInput(strBody); strResult = modAutoRunLibrary.SendMultiEmail(ref argFileName, ref strSubject, argEmailBody, strGroupNo); if (strResult == "success") { ERP2MES_MailNoticeRet = 0; } else { // 2015/05/22,runtime測試,溝通外部主機有timeout問題,SendMultiEmail只會回傳success or fail. aryErrorMessage.Add("Mail通知 群組編號:" + strGroupNo + " " + strResult + "!!"); return ERP2MES_MailNoticeRet; } } catch (Exception ex) { aryErrorMessage.Add(ex.Message + ";寄件處理失敗 群組編號:" + strGroupNo + ""); // Throw } return ERP2MES_MailNoticeRet; } private string ArrayList2String(ref ArrayList aryReturnMessage) { string ArrayList2StringRet = default(string); ArrayList2StringRet = defString; try { string strReturnMessage = ""; foreach (string strErr in aryReturnMessage) strReturnMessage += strErr + '\n'; // Return ArrayList2StringRet = strReturnMessage; } catch (Exception ex) { // 此Function發生異常較難由訊息看出,加上FunctionName. aryReturnMessage.Add("ArrayList2String:" + ex.Message); } return ArrayList2StringRet; } #endregion #region t100舊整合(不使用用) #region MES InterFaceTable 轉入 MES正式區(產品、物料) // 功 能: MES InterFaceTable 轉入 MES正式區(產品。物料) // 傳回值: success(成功), fail(失敗) private string ProductIntegration(Collection colParameters = null) { string ProductIntegrationRet = default(string); // =========================================================== // 宣告 DB相關 變數 // =========================================================== var cnnERP = default(IDbConnection); // T100中介DB使用(ERP) var cnnMES = default(IDbConnection); // MESDB使用 var drTemp = default(DbDataReader); //var daTemp = new System.Data.OleDb.OleDbDataAdapter(); var dsTemp = new DataSet(); Collection colSQL_T100 = new Collection(), colSQL_T100_Rows = new Collection(); // T100中介DB(MES回填處理記錄). Collection colSQL_2MES = new Collection(), colSQL_2MES_Rows = new Collection(); // MES正式異動資料(主要). string strSQL; // =========================================================== // 宣告 AutoRunJob設定及執行記錄 變數 // =========================================================== string strParameter01 = ""; // 參數一,預設此功能fail通知EMAIL群組。 string strSubject, strBody; // 寄送通知資訊 // AutorunJob拋轉資訊 string strReturnMessage = ""; // 錯誤訊息(tblMESAutoRunLog.ReturnMessage),Chr(10)分隔錯誤項目。 var aryReturnMessage = new ArrayList(); // Catch Error Message (Exception及MES判定錯誤訊息)。 int intFailCount_PRD = 0; // PRD拋轉失敗筆數 int intFailCount_MTL = 0; // MTL拋轉失敗筆數 // ' 每筆中介交易記錄 // Dim strMES_MESSAGE As String '錯誤訊息(中介表.MES_MESSAGE),Chr(10)分隔錯誤項目。 // Dim aryMES_Message As New ArrayList 'Catch Error Message (Exception及MES判定錯誤訊息)。 // =========================================================== // 宣告 MESSERIES_T100中介表 變數 // =========================================================== // Dim strIfTableName As String = "mes_imaa_t" '統一小寫 // =========================================================== // 宣告 其他 變數 // =========================================================== DateTime datNow; do { try { // -------------------------------------------------- // 一、取得參數 // -------------------------------------------------- // Parameter01為參數一 // 作為Mail通知群組(GroupNo),放在最前面防止連線失敗無法寄送通知。 if (colParameters.Contains("Parameter01")) { strParameter01 = colParameters["Parameter01"].ToString().Trim(); } // If strParameter01 = "" Then // ProductIntegration = "fail;使用者群?未?定!!(tblMESAutorunJob.Parameter01)" // Exit Function '離開 Function。 // End If // -------------------------------------------------- // 二、連線 DB // -------------------------------------------------- // T100中介DB cnnERP = CreateConnection(strERPconnectionString); // MES DB cnnMES = CreateConnection(strConnectionString); // 取得ERPSetting if (!GetERPSetting(ref dtERPSetting, "T100")) { break; } // -------------------------------------------------- // 檢查參數一 Mail通知群組 是否已設定. // -------------------------------------------------- if (!string.IsNullOrEmpty(strParameter01) && ERP2MES_MailNoticeChk(ref cnnMES, ref aryReturnMessage, strParameter01) < 0) { ProductIntegrationRet = Conversions.ToString("fail;" + aryReturnMessage[0]); return ProductIntegrationRet; // 離開 Function。 } if (aryReturnMessage.Count > 0) break; // Exit Try /// 取出 MESSERIES_T100.中介表資料. // -------------------------------------------------- // 二、MESSERIES_T100.中介表資料,請依序處理: // Loop 1.料件 MES_IMAA_T:(必須優先) // Loop 2.料件據點製造檔 MES_IMAE_T // Loop 3.料件多語言檔 MES_IMAE_T // 每筆交易明細: // MES_Result為空白代表未拋轉。 // 取出後立即異動DB,無論成功或失敗(不跳離),都繼續執行下一筆。 // -------------------------------------------------- string MES_IMAA_T_1Main = "MES_IMAA_T"; string MES_IMAE_T_2 = "MES_IMAE_T"; string MES_IMAAL_T_3 = "MES_IMAAL_T"; DataRow[] drSel_IF; // -------------------------------------------------- // Loop 1.料件 MES_IMAA_T // -------------------------------------------------- strSQL = "Select T1.*, T1.imaa004 As imaa004_Upper " + " From " + MES_IMAA_T_1Main + " T1" + " Where T1.MES_Result Is Null" + " And T1.imaaent ='" + ERP_EntID + "' "; ////cmmTempERP = new IDbCommand(strSQL, cnnERP); //daTemp.SelectCommand = cmmTempERP; //daTemp.Fill(dsTemp, MES_IMAA_T_1Main); //cmmTempERP.Dispose(); ExecuteSQLQuery_Adapter(strSQL, dsTemp, MES_IMAA_T_1Main, cnnERP); if (dsTemp.Tables[MES_IMAA_T_1Main].Rows.Count > 0) { // 中介表資料來源說明: // 產品跟物料皆在此TABLE,以imaa004做區分 // 1.當imaa004 = 'A'時,此料件為產品(A.組合/加工品) drSel_IF = dsTemp.Tables[MES_IMAA_T_1Main].Select("imaa004_Upper = 'A'", "tran_Time,imaa001,imaa002"); if (drSel_IF.Length > 0) { // intFailCount_PRD if (ProductIntegration_1PRD_Trans_MES(ref cnnMES, ref aryReturnMessage, ref intFailCount_PRD, MES_IMAA_T_1Main, drSel_IF) < 0) { if (aryReturnMessage.Count == 0) // 避免不明原因,執行FAIL又沒收集到項目. { aryReturnMessage.Add("中介表:" + MES_IMAA_T_1Main + ", 料件類別(imaa004):A, 組合/加工品資料, 拋轉執行失敗!!"); } } } // 2.當imaa004 = 'M'時,此料件為物料(M.材料/零件/商品) drSel_IF = dsTemp.Tables[MES_IMAA_T_1Main].Select("imaa004_Upper = 'M'", "tran_Time,imaa001"); if (drSel_IF.Length > 0) { // intFailCount_MTL if (ProductIntegration_1MTL_Trans_MES(ref cnnMES, ref aryReturnMessage, ref intFailCount_MTL, MES_IMAA_T_1Main, drSel_IF) < 0) { if (aryReturnMessage.Count == 0) // 避免不明原因,執行FAIL又沒收集到項目. { aryReturnMessage.Add("中介表:" + MES_IMAA_T_1Main + ", 料件類別(imaa004):M, 材料/零件/商品資料, 拋轉執行失敗!!"); } } } string strIfWhereCond_PK; string strMES_MESSAGE; // 錯誤訊息(中介表.MES_MESSAGE),Chr(10)分隔錯誤項目。 // 3.當imaa004 料件類別不正確, 資料報錯. drSel_IF = dsTemp.Tables[MES_IMAA_T_1Main].Select("imaa004_Upper <> 'A' And imaa004_Upper <> 'M'", "tran_Time,imaa001"); foreach (DataRow drIF in drSel_IF) { datNow = DateTime.Now; // Now strMES_MESSAGE = Conversions.ToString("料件類別(imaa004):" + drIF["imaa004"] + ", 不正確!!"); // ----------------------------------------------------------- // 正常程序 // 回填中介表資訊,(注意)各個資料表的PK不同。 // ----------------------------------------------------------- strIfWhereCond_PK = Conversions.ToString(" Where imaa001 = '" + drIF["imaa001"] + "'" + " And tran_time = '" + drIF["tran_time"] + "'" + " And imaaent ='" + ERP_EntID + "' "); if (Update_T100_IfTable(ref colSQL_T100, ref colSQL_T100_Rows, ref aryReturnMessage, MES_IMAA_T_1Main, strIfWhereCond_PK, "9", datNow, strMES_MESSAGE) < 0) { aryReturnMessage.Add("中介表:" + MES_IMAA_T_1Main + "(料件), " + strMES_MESSAGE); } // Try // Catch ex As Exception // End Try // 不管成功或失敗,繼續下一筆。 } } // -------------------------------------------------- // Loop 2.料件據點製造檔 MES_IMAE_T // -------------------------------------------------- strSQL = "Select T1.*" + " From " + MES_IMAE_T_2 + " T1" + " Where T1.MES_Result Is Null " + " And T1.imaesite = '" + ERP_Site + "' " + " And T1.imaeent ='" + ERP_EntID + "' "; ////cmmTempERP = new IDbCommand(strSQL, cnnERP); //daTemp.SelectCommand = cmmTempERP; //daTemp.Fill(dsTemp, MES_IMAE_T_2); //cmmTempERP.Dispose(); ExecuteSQLQuery_Adapter(strSQL, dsTemp, MES_IMAE_T_2, cnnERP); if (dsTemp.Tables[MES_IMAE_T_2].Rows.Count > 0) { // 中介表資料來源說明: /// 產品跟物料皆在此TABLE,以imaa004做區分 /// 1.當imaa004 = 'A'時,此料件為產品(A.組合/加工品) /// 2.當imaa004 = 'M'時,此料件為物料(M.材料/零件/商品) drSel_IF = dsTemp.Tables[MES_IMAE_T_2].Select("", "tran_Time,imae001,imae016"); if (ProductIntegration_2Unit_Trans_MES(ref cnnMES, ref aryReturnMessage, ref intFailCount_PRD, MES_IMAE_T_2, drSel_IF) < 0) { if (aryReturnMessage.Count == 0) // 避免不明原因,執行FAIL又沒收集到項目. { aryReturnMessage.Add("中介表:" + MES_IMAE_T_2 + "(料件據點製造檔), 拋轉執行失敗!!"); } } } // -------------------------------------------------- // Loop 3.料件多語言檔 MES_IMAE_T // -------------------------------------------------- strSQL = "Select T1.*" + " From " + MES_IMAAL_T_3 + " T1" + " Where T1.MES_Result Is Null" + " And T1.imaal002 = '" + strLanguage_T100 + "'" + " And T1.imaalent ='" + ERP_EntID + "' "; ////cmmTempERP = new IDbCommand(strSQL, cnnERP); //daTemp.SelectCommand = cmmTempERP; //daTemp.Fill(dsTemp, MES_IMAAL_T_3); //cmmTempERP.Dispose(); ExecuteSQLQuery_Adapter(strSQL, dsTemp, MES_IMAAL_T_3, cnnERP); if (dsTemp.Tables[MES_IMAAL_T_3].Rows.Count > 0) { // 中介表資料來源說明: /// 產品跟物料皆在此TABLE,以imaa004做區分 /// 1.當imaa004 = 'A'時,此料件為產品(A.組合/加工品) /// 2.當imaa004 = 'M'時,此料件為物料(M.材料/零件/商品) drSel_IF = dsTemp.Tables[MES_IMAAL_T_3].Select("", "tran_Time,imaal001,imaal002"); if (ProductIntegration_3Res_Trans_MES(ref cnnMES, ref aryReturnMessage, ref intFailCount_PRD, MES_IMAAL_T_3, drSel_IF) < 0) { if (aryReturnMessage.Count == 0) // 避免不明原因,執行FAIL又沒收集到項目. { aryReturnMessage.Add("中介表:" + MES_IMAAL_T_3 + "(料件多語言檔), 拋轉執行失敗!!"); } } } } catch (Exception EX_AUT) { if (cnnERP == null) { aryReturnMessage.Add("T100中介DB(ERP) 連線失敗!!"); } else if (cnnMES == null) { aryReturnMessage.Add("MES DB 連線失敗!!"); } else { aryReturnMessage.Add("EX_AUT.Exception" + '\n' + EX_AUT.Message.ToString()); } } // 回傳結果 ReturnMessage,已一併在Finally處理。 finally { // -------------------------------------------------- // 七、回傳執行結果:succces 或 fail(ReturnMessage) // -------------------------------------------------- if (aryReturnMessage.Count == 0) { ProductIntegrationRet = "success"; } else { // 組合執行錯誤字串: Chr(10)分隔 strReturnMessage = ArrayList2String(ref aryReturnMessage); if ((strReturnMessage ?? "") == defString) { // 當錯誤字串組合失敗。補上 strReturnMessage = "ReturnMessage收集失敗!!"; } // If Not dsTemp.Tables(strIfTableName) Is Nothing Then // '整理中介表交易筆數 // Dim drSel As DataRow() // Dim strBody_Head As String = "" // strBody_Head = "T100中介表:" & strIfTableName & "匯入至MES正式區" & Chr(10) // drSel = dsTemp.Tables(strIfTableName).Select("imaa004='A'") // If drSel.Length > 0 Then // strBody_Head += "料件類別:A, 總筆數(" & drSel.Length & "),失敗筆數(" & intFailCount_PRD & ")" // End If // drSel = dsTemp.Tables(strIfTableName).Select("imaa004='M'") // If drSel.Length > 0 Then // strBody_Head += "料件類別:M, 總筆數(" & drSel.Length & "),失敗筆數(" & intFailCount_MTL & ")" // End If // '重組 strReturnMessage = 中介表交易筆數 & strReturnMessage // strReturnMessage = strBody_Head & Chr(10) & Chr(10) & strReturnMessage // 'Remove Table // dsTemp.Tables.Remove(strIfTableName) // dsTemp.AcceptChanges() // End If // tblMESAutoRunLog.ReturnMessage 長度4000限制. string strTemp = ""; if (strReturnMessage.Length > 4000) { // 自 strReturnMessage 中截取0-3991碼. strTemp = strReturnMessage.Substring(0, 3991) + "..."; } else { strTemp = strReturnMessage; } // //fail; ProductIntegrationRet = "fail;" + strTemp; } if (cnnERP != null) CloseConnection(cnnERP); if (cnnMES != null) CloseConnection(cnnMES); //if (daTemp != null) // daTemp.Dispose(); if (dsTemp != null) dsTemp.Dispose(); if (drTemp != null) drTemp.Close(); } } while (false); // -------------------------------------------------- // 八、當執行失敗,寄送 Email。必須有設定參數一。 // -------------------------------------------------- if (aryReturnMessage.Count > 0 && !string.IsNullOrEmpty(strParameter01)) { // strSubject = "[AUT]接收T100中介表:" & strIfTableName & "(產品、物料) 失敗 " strSubject = "[AUT]接收T100中介表:" + "(產品、物料) 失敗 "; strBody = Strings.Replace(strReturnMessage, Conversions.ToString('\n'), "
", Compare: CompareMethod.Text); // 寄送 Email if (ERP2MES_MailNotice(ref cnnMES, ref aryReturnMessage, strSubject, strParameter01, CInput(strBody)) < 0) { // '寄送不成功, ReturnMessage 再增加1項. // 'ProductIntegration += Chr(10) & aryReturnMessage.Item(aryReturnMessage.Count - 1).ToString // 寄送不成功, ReturnMessage 再增加1項. // tblMESAutoRunLog.ReturnMessage 長度4000限制. if (ProductIntegrationRet.Length < 4000) { string strTemp = ""; strTemp = strReturnMessage; if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(strTemp + aryReturnMessage[aryReturnMessage.Count - 1].ToString().Length, 4000, false))) { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); } else { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); // 自 strTemp 中截取0-3991碼. strTemp = strTemp.Substring(0, 3991) + "..."; } // //fail; ProductIntegrationRet = "fail;" + strTemp; } } } return ProductIntegrationRet; // --------------------------------------------------# } private int ProductIntegration_1PRD_Trans_MES(ref IDbConnection cnnMES, ref ArrayList aryReturnMessage, ref int intReturnFailCount, string IfTableName, DataRow[] drSel_IF) { int ProductIntegration_1PRD_Trans_MESRet = default(int); ProductIntegration_1PRD_Trans_MESRet = -1; // Return -1:fail,0:Success // -------------------------------------------------- // 中介表 MES_IMAA_T, 拋轉 MES 產品主檔. // -------------------------------------------------- // drSel_IF ,固定處理條件imaa004料件類別=A(組合/加工品). // aryMES_Message ,收集單筆中介交易記錄的錯誤記錄. // 新增產品:UnitNo,UnitType,ProductName一律填入"N/A", 後續由 mes_imae_t料件據點製造檔(單位) 更新. // =========================================================== // 宣告 DB相關 變數 // =========================================================== var drTemp = default(DbDataReader); Collection colSQL_T100 = new Collection(), colSQL_T100_Rows = new Collection(); // T100中介DB(MES回填處理記錄). Collection colSQL_2MES = new Collection(), colSQL_2MES_Rows = new Collection(); // MES正式異動資料(主要). string strSQL; // 每筆中介交易記錄 string strIfWhereCond_PK; string strMES_Result; string strMES_MESSAGE; // 錯誤訊息(中介表.MES_MESSAGE),Chr(10)分隔錯誤項目。 var aryMES_Message = new ArrayList(); // 收集單筆中介交易記錄的錯誤記錄, Exception及MES判定錯誤訊息。 var datNow = DateTime.Now; // Now do { try { // 宣告拋轉中介表資料使用變數 string strERP_ProductNo, strERP_status; string strERP_ProductVersion = "1"; // 未傳入時預設為1。 // 預設值 var strProductType = default(string); // 給予預設值"PRODUCT",若不存在則自動新增產品類別. int intIssueState = 0; int intCurVersion = 0; string strSpecNo = "N/A"; // If strProductType <> String.Empty Then '2021/03/10 Elvis 0088864: ERP 整合 MES 資料 // strProductType = strProductType // End If // ----------------------------------------------------------- // 固定檢查ProductType='PRODUCT'資料,若不存在則自動新增。 // ----------------------------------------------------------- if (AddProductType(ref cnnMES, ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strProductType, strERPCreator, datNow, "AutoRun建立") < 0) break; // -------------------------------------------------- // 必須以tran_Time順序,逐筆處理中介交易記錄。 // 每一筆交易記錄處理完成,立即變更 MESDB 及 MESSERIES_T100.中介表的MES處理記錄,綁在同一個交易裡. // (同包Transaction, 處理完畢後再一起commit) // 當某筆交易記錄處理失敗,立即變更 MESSERIES_T100.中介表的MES處理記錄,再接著處理下一筆記錄. // -------------------------------------------------- foreach (DataRow drIF in drSel_IF) { // reset datNow = DateTime.Now; // Now strIfWhereCond_PK = ""; strMES_Result = "9"; // 預設值 9 (MES處理結果, 成功回寫1, 失敗回寫9). strMES_MESSAGE = ""; // 錯誤訊息 aryMES_Message.Clear(); colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); colSQL_T100.Clear(); colSQL_T100_Rows.Clear(); do { try { // ----------------------------------------------------------- // 取出各欄位資料 // ----------------------------------------------------------- // 轉大寫 strERP_ProductNo = drIF["imaa001"].ToString().Trim().ToUpper(); // If Not IsDBNull(drIF("imaa002")) OrElse drIF("imaa002").ToString.Trim <> "" Then strERP_ProductVersion = drIF("imaa002").ToString.Trim.ToUpper strERP_status = drIF["tran_status"].ToString().Trim().ToUpper(); // 檢查是否有此產品設定 strSQL = "Select ProductNo,IssueState From tblPRDProductBasis " + " Where ProductNo='" + strERP_ProductNo + "'" + " And ProductVersion='" + strERP_ProductVersion + "'"; //cmmTemp = new IDbCommand(strSQL, cnnMES); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); bool exitTry = false; switch (strERP_status ?? "") { case "AU": // 有資料修改沒資料新增 { if (!drTemp.Read()) { strProductType = "PRODUCT"; // 給予預設值"PRODUCT",若不存在則自動新增產品類別. // ----------------------------------------------------------- // 產品編號合理性檢查 // ----------------------------------------------------------- if (ProductIntegration_ChkValid_ProductNo(ref cnnMES, ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_ProductNo, strERP_ProductVersion) < 0) { exitTry = true; break; // GoTo lblExitTry_2_NextRow } if (strProductType.Equals("PRODUCT") != true) { strProductType = strProductType; } // ----------------------------------------------------------- // 新增MES產品設定 // ----------------------------------------------------------- strSQL = "Insert Into tblPRDProductBasis " + "(ProductNo,ProductVersion,ProductName,ProductType," + " UnitNo,UnitType,ItemSpec,Description," + " IssueState,CurVersion,Creator,CreateDate)"; strSQL += " Values('" + strERP_ProductNo + "','" + strERP_ProductVersion + "','N/A','" + strProductType + "'," + "'N/A','N/A','" + strSpecNo + "','AutoRun建立'," + intIssueState + "," + intCurVersion + ",'" + strERPCreator + "'," + "To_Date('" + Strings.Format(datNow, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'))"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } // aryMES_Message.Add("產品編號(imaa001):" & strERP_ProductNo & ", 產品版本(imaa002):" & strERP_ProductVersion & ", 已存在MES, 不允許新增!!") // ERPws標準功能不論IssueState為何皆允許修改. // ----------------------------------------------------------- // 修改MES產品設定 // ----------------------------------------------------------- // 修改產品,因目前中介表定義欄位沒有需修改的,僅針對交易記錄判斷此產品在MES簽核狀態檢查是否需作變更。 else if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], -1, false))) { if (!string.IsNullOrEmpty(strProductType)) // 2021/03/10 Elvis 0088864: ERP 整合 MES 資料 { strProductType = strProductType; } // 注意事項:產品與物料,當IssueState=-1的更新方式不同. // MES已存在之資料IssueState如果是-1,ERP資料再次拋轉時,IssueState則更新為"0". strSQL = "Update tblPRDProductBasis Set " + " IssueState = 0" + " Where ProductNo='" + strERP_ProductNo + "'" + " And ProductVersion='" + strERP_ProductVersion + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } drTemp.Close(); //cmmTemp.Dispose(); break; } case "D": // D:刪除 { if (drTemp.Read()) { if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], 0, false))) { // ----------------------------------------------------------- // 先刪除MES產品相關設定 // ----------------------------------------------------------- if (ProductIntegration_DelProduct(ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_ProductNo, strERP_ProductVersion) < 0) { exitTry = true; break; // GoTo lblExitTry_2_NextRow } } else { // ----------------------------------------------------------- // 作廢MES產品設定 // ----------------------------------------------------------- strSQL = "Update tblPRDProductBasis Set " + " IssueState=-1" + " Where ProductNo='" + strERP_ProductNo + "'" + " And ProductVersion='" + strERP_ProductVersion + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } } else { aryMES_Message.Add("產品編號(imaa001):" + strERP_ProductNo + ", 產品版本(imaa002):" + strERP_ProductVersion + ", 不存在MES, 不允許刪除!!"); } drTemp.Close(); //cmmTemp.Dispose(); break; } default: { aryMES_Message.Add("ERP資料狀態(Status):" + strERP_status + "無效, 不允許執行!!"); break; } } if (exitTry) { break; } // If aryMES_Message.Count > 0 Then GoTo lblExitTry_2_NextRow // =============================================================================== // 判定 MES_Result 處理結果 (成功回寫1, 失敗回寫9). // =============================================================================== if (aryMES_Message.Count == 0) { strMES_Result = "1"; // -------------------------------------------------- // 四、MES資料庫異動 // -------------------------------------------------- if (colSQL_2MES.Count > 0) { ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colSQL_2MES, colSQL_2MES_Rows); } } else { break; } } catch (Exception EX_drIF) { strMES_Result = "9"; aryMES_Message.Add("ProductIntegration_1PRD_Trans_MES:EX_drIF.Exception" + '\n' + EX_drIF.Message); } finally { // 組合執行錯誤字串: Chr(10)分隔 strMES_MESSAGE = ArrayList2String(ref aryMES_Message); // 2016/01/13, 直接異動中介表-------------------------- // 'If strMES_MESSAGE = defString Then // ' '當錯誤字串組合失敗,在Finally後會記錄PK. // 'End If // --------------------------------------------------# // MES_Message長度4000限制, 截取0-3996碼加"...". if (strMES_MESSAGE.Length > 4000) strMES_MESSAGE = strMES_MESSAGE.Substring(0, 3996) + "..."; // ---取消前面收集SQL--- colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); colSQL_T100.Clear(); // 若T100中介資料庫異動fail。(若MES_MESSAGE問題,下面會不會一樣fail?) colSQL_T100_Rows.Clear(); // ----------------------------------------------------------- // (EX_drIF.Exception) // 回填中介表資訊,(注意)各個資料表的PK不同。 // ----------------------------------------------------------- // mssql,無trim用法,不串變數值,直接檢查原欄位值. strIfWhereCond_PK = Conversions.ToString(" Where imaa001 = '" + drIF["imaa001"] + "'" + " And tran_time = '" + drIF["tran_time"] + "'" + " And imaaent ='" + ERP_EntID + "' "); if (Update_T100_IfTable(ref colSQL_T100, ref colSQL_T100_Rows, ref aryMES_Message, IfTableName, strIfWhereCond_PK, strMES_Result, datNow, strMES_MESSAGE) >= 0) { // -------------------------------------------------- // 六、T100中介資料庫異動(EX_drIF) // -------------------------------------------------- ExecuteSQLNoneQuery_ChkRowCount(strERPDataBaseType, strERPconnectionString, colSQL_T100, colSQL_T100_Rows); } } } while (false); // lblExitTry_2_NextRow: // 當該筆中介交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 if (aryMES_Message.Count > 0) { /// 匯整記錄中介表的PK資訊. // 因從錯誤訊息不一定看的出哪一筆中介表交易記錄fail. // 故失敗訊息連同中介表的必要資訊一併匯整. (Email要放詳細資訊) // (1) aryReturnMessage.Add("tran_time:" + drIF["tran_time"] + ", imaa001:" + drIF["imaa001"] + ", imaa004:" + drIF["imaa004"]); // (2) foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); } // 計算失敗筆數 if (strMES_Result == "9") intReturnFailCount += 1; // 不管成功或失敗,繼續下一筆。 } // //return 0 : Success ProductIntegration_1PRD_Trans_MESRet = 0; } catch (Exception ex) { aryMES_Message.Add("ProductIntegration_1PRD_Trans_MES,Finally:" + ex.Message); // 當該筆中介交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); throw; } finally { if (drTemp != null) drTemp.Close(); } } while (false); return ProductIntegration_1PRD_Trans_MESRet; } private object ProductIntegration_ChkExist_ProductNo() { return default(Object); // Dim strSQL As String // Try // '//return 0 : Success // ProductIntegration_ChkValid_ProductNo = 0 // Catch ex As Exception // aryMES_Message.Add(ex.Message) // Throw // Finally // End Try } private int ProductIntegration_ChkValid_ProductNo(ref IDbConnection cnnMES, ref Collection colSQL_2MES, ref Collection colSQL_2MES_Rows, ref ArrayList aryMES_Message, string strERP_ProductNo, string strERP_ProductVersion) { int ProductIntegration_ChkValid_ProductNoRet = default(int); ProductIntegration_ChkValid_ProductNoRet = -1; // Return -1:fail,0:Success var drTemp = default(DbDataReader); string strSQL; try { // ----------------------------------------------------------- // 產品編號合理性檢查 // ----------------------------------------------------------- // (1)檢查ProductNo是否已存在於tblPRDType(因與ProductType共用Property故編號不可一樣). strSQL = "Select ProductType From tblPRDType Where ProductType='" + strERP_ProductNo + "'"; //cmmTemp = new IDbCommand(strSQL, cnnMES); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); if (drTemp.Read()) { aryMES_Message.Add("產品編號(imaa001):" + strERP_ProductNo + ", 已存在於MES產品類別主檔, 產品編號與產品類別不允許相同!!"); } drTemp.Close(); //cmmTemp.Dispose(); // (2)檢查ProductNo是否已存在於tblPRDModuleBasis(因與ModuleNo共用部份Table,故號不可一樣) strSQL = "Select ModuleNo From tblPRDModuleBasis Where ModuleNo='" + strERP_ProductNo + "'"; //cmmTemp = new IDbCommand(strSQL, cnnMES); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); if (drTemp.Read()) { aryMES_Message.Add("產品編號(imaa001):" + strERP_ProductNo + ", 已存在於MES模組主檔, 產品編號與模組編號不允許相同!!"); } drTemp.Close(); //cmmTemp.Dispose(); // 91561: 系統參數for ERP整合料件時使用 : ProductMaterialcoexist (產品物料同時並存) strSQL = "SELECT * FROM TBLSYSPARAMETER WHERE PARAMETERNO = 'ProductMaterialcoexist'"; //cmmTemp = new IDbCommand(strSQL, cnnMES); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); if (drTemp.Read()) { // 如果ProductMaterialcoexist設定為1,跳過檢查 if (drTemp["PARAMETERVALUE"].ToString() == "0") { // (3)檢查物料主檔: // 因產品可能是半成品,會當成料來使用, // 在BOM表(tblPRDBOM)、用料清單(tblOEMOMaterialList)及kcWIP.clsLot的處理邏輯上都沒有加上MaterialLevel. // 故ProductNo不可與MaterialNo一樣. strSQL = "Select MaterialNo From tblMTLMaterialBasis Where MaterialNo ='" + strERP_ProductNo + "'"; //cmmTemp = new IDbCommand(strSQL, cnnMES); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); if (drTemp.Read()) { aryMES_Message.Add("產品編號(imaa001):" + strERP_ProductNo + ", 已存在於MES物料主檔, 物料編號與產品編號不允許相同!! 半成品可會當成料來使用!!"); } drTemp.Close(); //cmmTemp.Dispose(); } } drTemp.Close(); //cmmTemp.Dispose(); // //return 0 : Success ProductIntegration_ChkValid_ProductNoRet = 0; } catch (Exception ex) { aryMES_Message.Add(ex.Message); throw; } finally { if (drTemp != null) drTemp.Close(); } return ProductIntegration_ChkValid_ProductNoRet; } private int ProductIntegration_DelProduct(ref Collection colSQL_2MES, ref Collection colSQL_2MES_Rows, ref ArrayList aryMES_Message, string strERP_ProductNo, string strERP_ProductVersion) { int ProductIntegration_DelProductRet = default(int); ProductIntegration_DelProductRet = -1; // Return -1:fail,0:Success string strSQL; try { // 1.tblPRDProductProperty strSQL = "Delete From tblPRDProductProperty " + " Where ProductNo='" + strERP_ProductNo + "'" + " And ProductVersion='" + strERP_ProductVersion + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // 2.tblPRDProductProcess strSQL = "Delete From tblPRDProductProcess " + " Where ProductNo='" + strERP_ProductNo + "'" + " And ProductVersion='" + strERP_ProductVersion + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // 3.tblPRDOPAttrib // Parameter:Item strSQL = "Delete From tblPRDOPAttrib " + " Where SerialNo In (Select SerialNo From tblPRDOP " + " Where ProductNo='" + strERP_ProductNo + "'" + " And ProductVersion='" + strERP_ProductVersion + "')"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // 4.tblPRDOPRule // Parameter:Rule strSQL = "Delete From tblPRDOPRule " + " Where SerialNo In (Select SerialNo From tblPRDOP " + " Where ProductNo='" + strERP_ProductNo + "'" + " And ProductVersion='" + strERP_ProductVersion + "')"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // 5.tblPRDOPEQPRecipe // Parameter:EQPRecipe strSQL = "Delete From tblPRDOPEQPRecipe " + " Where SerialNo In (Select SerialNo From tblPRDOP " + " Where ProductNo='" + strERP_ProductNo + "'" + " And ProductVersion='" + strERP_ProductVersion + "')"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // 6.tblPRDOpQCItemParameter // 2008/06/02,sammi.取消產品參數QCItem的參數設定功能,由SPC線上管制要因來變更抽樣計畫功能處理. // 暫時先不移處,因FK會造成無法刪除. // Parameter:QCItem Parameter strSQL = "Delete From tblPRDOpQCItemParameter " + " Where SerialNo In (Select SerialNo From tblPRDOP " + " Where ProductNo='" + strERP_ProductNo + "'" + " And ProductVersion='" + strERP_ProductVersion + "')"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // 7.tblPRDOP strSQL = "Delete From tblPRDOP " + " Where ProductNo='" + strERP_ProductNo + "'" + " And ProductVersion='" + strERP_ProductVersion + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // 8.tblPRDBOM strSQL = "Delete From tblPRDBOM " + " Where ProductNo='" + strERP_ProductNo + "'" + " And ProductVersion='" + strERP_ProductVersion + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // 9.tblPRDOPBusinessRuleRelation strSQL = "Delete From tblPRDOPBusinessRuleRelation " + " Where ProductNo='" + strERP_ProductNo + "'" + " And ProductVersion='" + strERP_ProductVersion + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // 10.tblPRDOPRuleXml_CLOB // 2006/05/11,sammi.處理DataGuard not support Long Type probleam. if (!objDBcom.DBSupportLongType) { strSQL = "Delete From tblPRDOPRuleXml_CLOB " + " Where ProductNo='" + strERP_ProductNo + "'" + " And ProductVersion='" + strERP_ProductVersion + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); } // 11.tblPRDOPBusinessRule strSQL = "Delete From tblPRDOPBusinessRule " + " Where ProductNo='" + strERP_ProductNo + "'" + " And ProductVersion='" + strERP_ProductVersion + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // 12.tblPRDOPDescription strSQL = "Delete From tblPRDOPDescription " + " Where ProductNo='" + strERP_ProductNo + "'" + " And ProductVersion='" + strERP_ProductVersion + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // 13.tblPRDOPArea strSQL = "Delete From tblPRDOPArea " + " Where ProductNo='" + strERP_ProductNo + "'" + " And ProductVersion='" + strERP_ProductVersion + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // 14.tblPRDAccessory strSQL = "Delete From tblPRDAccessory" + " Where ProductNo='" + strERP_ProductNo + "'" + " And ProductVersion='" + strERP_ProductVersion + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // 15.tblPRDOPSubOP // 用 途:刪除產品作業站中子工序,因晶發專案客製於標準版中 // 撰寫人員:Sam.Hsu // 建立日期:2008/06/13 strSQL = "Delete From tblPRDOPSubOP " + " Where ProductNo='" + strERP_ProductNo + "'" + " And ProductVersion='" + strERP_ProductVersion + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // 16.tblPRDRecipe strSQL = "Delete From tblPRDRecipe " + " Where ProductNo='" + strERP_ProductNo + "'" + " And ProductVersion='" + strERP_ProductVersion + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // 17.tblPRDQCItem strSQL = "Delete From tblPRDQCItem " + " Where ProductNo='" + strERP_ProductNo + "'" + " And ProductVersion='" + strERP_ProductVersion + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // 18.tblPRDProductSerialRuleBasis strSQL = "Delete From tblPRDProductSerialRuleBasis " + " Where ProductNo='" + strERP_ProductNo + "'" + " And ProductVersion='" + strERP_ProductVersion + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // 19.tblPRDProductSerialRuleDetail strSQL = "Delete From tblPRDProductSerialRuleDetail " + " Where ProductNo='" + strERP_ProductNo + "'" + " And ProductVersion='" + strERP_ProductVersion + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // 20.tblPRDPackingAccessory strSQL = "Delete From tblPRDPackingAccessory " + " Where ProductNo='" + strERP_ProductNo + "'" + " And ProductVersion='" + strERP_ProductVersion + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // 21.tblPRDProductLabelRuleBasis strSQL = "Delete From tblPRDProductLabelRuleBasis " + " Where ProductNo='" + strERP_ProductNo + "'" + " And ProductVersion='" + strERP_ProductVersion + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // 22.tblPRDProductLabelRuleDetail strSQL = "Delete From tblPRDProductLabelRuleDetail " + " Where ProductNo='" + strERP_ProductNo + "'" + " And ProductVersion='" + strERP_ProductVersion + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // 22.tblPRDProductLabelRuleDetail_M strSQL = "Delete From tblPRDProductLabelRuleDetail_M " + " Where ProductNo='" + strERP_ProductNo + "'" + " And ProductVersion='" + strERP_ProductVersion + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // 23.tblPRDRunTimeSetup strSQL = "Delete From tblPRDRunTimeSetup " + " Where ProductNo='" + strERP_ProductNo + "'" + " And ProductVersion='" + strERP_ProductVersion + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // ----------------------------------------------------------- // 刪除MES產品設定 // ----------------------------------------------------------- strSQL = "Delete From tblPRDProductBasis " + " Where ProductNo='" + strERP_ProductNo + "'" + " And ProductVersion='" + strERP_ProductVersion + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // //return 0 : Success ProductIntegration_DelProductRet = 0; } catch (Exception ex) { aryMES_Message.Add(ex.Message.ToString()); throw; } return ProductIntegration_DelProductRet; } private int ProductIntegration_1MTL_Trans_MES(ref IDbConnection cnnMES, ref ArrayList aryReturnMessage, ref int intReturnFailCount, string IfTableName, DataRow[] drSel_IF) { int ProductIntegration_1MTL_Trans_MESRet = default(int); ProductIntegration_1MTL_Trans_MESRet = -1; // Return -1:fail,0:Success // 未好 // -------------------------------------------------- // MES_IMAA_T 中介表 拋轉 MES 產品主檔. // -------------------------------------------------- // drSel_IF ,固定處理條件imaa004料件類別=M(材料/零件/商品). // aryMES_Message ,收集單筆中介交易記錄的錯誤記錄. // 新增物料:UnitNo,UnitType,一律填入"N/A", 後續由 mes_imae_t料件據點製造檔(單位) 更新. // 新增物料:UnitNo,UnitType一律填入"N/A", 後續由 mes_imae_t料件據點製造檔(單位) 更新. // =========================================================== // 宣告 DB相關 變數 // =========================================================== // Dim drTemp As OleDb.OleDbDataReader Collection colSQL_T100 = new Collection(), colSQL_T100_Rows = new Collection(); // T100中介DB(MES回填處理記錄). Collection colSQL_2MES = new Collection(), colSQL_2MES_Rows = new Collection(); // MES正式異動資料(主要). string strSQL; // 每筆中介交易記錄 string strIfWhereCond_PK; string strMES_Result; string strMES_MESSAGE; // 錯誤訊息(中介表.MES_MESSAGE),Chr(10)分隔錯誤項目。 var aryMES_Message = new ArrayList(); // 收集單筆中介交易記錄的錯誤記錄, Exception及MES判定錯誤訊息。 var datNow = DateTime.Now; // Now do { try { // 宣告拋轉中介表資料使用變數 string strERP_MaterialNo, strERP_status; DataRow drChk; // 預設值 string strMaterialType = "MATERIL"; // 給予預設值"MATERIL",若不存在則自動新增物料類別. int intPutInPlace = 3; // 投料點:預設為3(工單). int intCountWay = 1; // 計量方法:預設為1(實際用量). int intCheckLotNo = 1; // 物料批號檢查:預設為0(不檢查批號). int intIssueState = 0; string strSpecNo = "N/A"; // ----------------------------------------------------------- // 固定檢查MaterialType='MATERIL'資料,若不存在則自動新增。 // ----------------------------------------------------------- if (AddMaterialType(ref cnnMES, ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strMaterialType, strERPCreator, datNow, "AutoRun建立") < 0) break; // -------------------------------------------------- // 必須以tran_Time順序,逐筆處理中介交易記錄。 // 每一筆交易記錄處理完成,立即變更 MESDB 及 MESSERIES_T100.中介表的MES處理記錄,綁在同一個交易裡. // (同包Transaction, 處理完畢後再一起commit) // 當某筆交易記錄處理失敗,立即變更 MESSERIES_T100.中介表的MES處理記錄,再接著處理下一筆記錄. // -------------------------------------------------- foreach (DataRow drIF in drSel_IF) { // reset datNow = DateTime.Now; // Now strIfWhereCond_PK = ""; strMES_Result = "9"; // 預設值 9 (MES處理結果, 成功回寫1, 失敗回寫9). strMES_MESSAGE = ""; // 錯誤訊息 aryMES_Message.Clear(); colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); colSQL_T100.Clear(); colSQL_T100_Rows.Clear(); do { try { // ----------------------------------------------------------- // 取出各欄位資料 // ----------------------------------------------------------- // 轉大寫 strERP_MaterialNo = drIF["imaa001"].ToString().Trim().ToUpper(); strERP_status = drIF["tran_status"].ToString().Trim().ToUpper(); // 檢查是否有此物料設定 drChk = GetMaterialBasis(strERP_MaterialNo, cnnMES, aryMES_Message); if (drChk == null) break; // GoTo lblExitTry_2_NextRow 'fail bool exitTry = false; switch (strERP_status ?? "") { case "AU": // 有資料修改沒資料新增 { if (drChk["MaterialNo"] is DBNull) { // ----------------------------------------------------------- // 物料編號合理性檢查 // ----------------------------------------------------------- if (ProductIntegration_ChkValid_MaterialNo(ref cnnMES, ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_MaterialNo) < 0) { exitTry = true; break; // GoTo lblExitTry_2_NextRow } // ----------------------------------------------------------- // 新增MES物料設定 // MaterialName,MaterialSpec 必要欄位填"N/A". // ----------------------------------------------------------- strSQL = "Insert Into tblMTLMaterialBasis " + "(MaterialNo, MaterialName, MaterialSpec, MaterialType," + " PutInPlace, CountWay, CheckLotNo, UnitType, UnitNo, Description," + " IssueState, Creator, CreateDate)"; strSQL += " Values('" + strERP_MaterialNo + "','N/A','N/A','" + strMaterialType + "'," + intPutInPlace + "," + intCountWay + "," + intCheckLotNo + ",'N/A','N/A','AutoRun建立'," + intIssueState + ",'" + strERPCreator + "'," + "To_Date('" + Strings.Format(datNow, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'))"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } // aryMES_Message.Add("物料編號(imaa001):" & strERP_MaterialNo & ", 已存在MES, 不允許新增!!") // ERPws標準功能不論IssueState為何皆允許修改. // ----------------------------------------------------------- // 修改MES物料設定 // ----------------------------------------------------------- // 修改物料,因目前中介表定義欄位沒有需修改的,僅針對交易記錄判斷此物料在MES簽核狀態檢查是否需作變更。 else if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drChk["IssueState"], -1, false))) { // 注意事項:產品與物料,當IssueState=-1的更新方式不同. // MES已存在之資料IssueState如果是-1,ERP資料再次拋轉時,IssueState則更新為"2". strSQL = "Update tblMTLMaterialBasis Set " + " IssueState = 2" + " Where MaterialNo='" + strERP_MaterialNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } break; } case "D": // D:刪除 { // 檢查是否有此物料設定 drChk = GetMaterialBasis(strERP_MaterialNo, cnnMES, aryMES_Message); if (drChk == null) { exitTry = true; break; } // GoTo lblExitTry_2_NextRow 'fail if (!(drChk["MaterialNo"] is DBNull)) { // ----------------------------------------------------------- // 物料編號使用狀況檢查 // ----------------------------------------------------------- if (ProductIntegration_ChkforDelMaterialNo(ref cnnMES, ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_MaterialNo) < 0) { exitTry = true; break; // GoTo lblExitTry_2_NextRow } if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drChk["IssueState"], 0, false))) { // ----------------------------------------------------------- // 刪除MES物料相關設定 // ----------------------------------------------------------- if (ProductIntegration_DelMaterial(ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_MaterialNo) < 0) { exitTry = true; break; // GoTo lblExitTry_2_NextRow } } else { // ----------------------------------------------------------- // 作廢MES物料設定 // ----------------------------------------------------------- strSQL = "Update tblMTLMaterialBasis Set " + " IssueState=-1" + " Where MaterialNo='" + strERP_MaterialNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } } else { aryMES_Message.Add("物料編號(imaa001):" + strERP_MaterialNo + ", 不存在MES, 不允許修改!!"); } break; } default: { aryMES_Message.Add("ERP資料狀態(Status):" + strERP_status + "無效, 不允許執行!!"); break; } } if (exitTry) { break; } // If aryMES_Message.Count > 0 Then GoTo lblExitTry_2_NextRow // =============================================================================== // 判定 MES_Result 處理結果 (成功回寫1, 失敗回寫9). // =============================================================================== if (aryMES_Message.Count == 0) { strMES_Result = "1"; // -------------------------------------------------- // 四、MES資料庫異動 // -------------------------------------------------- if (colSQL_2MES.Count > 0) { ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colSQL_2MES, colSQL_2MES_Rows); } } else { break; } } catch (Exception EX_drIF) { strMES_Result = "9"; aryMES_Message.Add("ProductIntegration_1MTL_Trans_MES:EX_drIF.Exception" + '\n' + EX_drIF.Message); } finally { // 組合執行錯誤字串: Chr(10)分隔 strMES_MESSAGE = ArrayList2String(ref aryMES_Message); // 2016/01/13, 直接異動中介表-------------------------- // 'If strMES_MESSAGE = defString Then // ' '當錯誤字串組合失敗,在Finally後會記錄PK. // 'End If // --------------------------------------------------# // MES_Message長度4000限制, 截取0-3996碼加"...". if (strMES_MESSAGE.Length > 4000) strMES_MESSAGE = strMES_MESSAGE.Substring(0, 3996) + "..."; // ---取消前面收集SQL--- colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); colSQL_T100.Clear(); // 若T100中介資料庫異動fail。(若MES_MESSAGE問題,下面會不會一樣fail?) colSQL_T100_Rows.Clear(); // ----------------------------------------------------------- // (EX_drIF.Exception) // 回填中介表資訊,(注意)各個資料表的PK不同。 // ----------------------------------------------------------- // mssql,無trim用法,不串變數值,直接檢查原欄位值. strIfWhereCond_PK = Conversions.ToString(" Where imaa001 = '" + drIF["imaa001"] + "'" + " And tran_time = '" + drIF["tran_time"] + "'" + " And imaaent ='" + ERP_EntID + "' "); if (Update_T100_IfTable(ref colSQL_T100, ref colSQL_T100_Rows, ref aryMES_Message, IfTableName, strIfWhereCond_PK, strMES_Result, datNow, strMES_MESSAGE) >= 0) { // -------------------------------------------------- // 六、T100中介資料庫異動(EX_drIF) // -------------------------------------------------- ExecuteSQLNoneQuery_ChkRowCount(strERPDataBaseType, strERPconnectionString, colSQL_T100, colSQL_T100_Rows); } } } while (false); // lblExitTry_2_NextRow: // 當該筆中介交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 if (aryMES_Message.Count > 0) { /// 匯整記錄中介表的PK資訊. // 因從錯誤訊息不一定看的出哪一筆中介表交易記錄fail. // 故失敗訊息連同中介表的必要資訊一併匯整. (Email要放詳細資訊) // (1) aryReturnMessage.Add("tran_time:" + drIF["tran_time"] + ", imaa001:" + drIF["imaa001"] + ", imaa004:" + drIF["imaa004"]); // (2) foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); } // 計算失敗筆數 if (strMES_Result == "9") intReturnFailCount += 1; // 不管成功或失敗,繼續下一筆。 } // //return 0 : Success ProductIntegration_1MTL_Trans_MESRet = 0; } catch (Exception ex) { aryMES_Message.Add("ProductIntegration_1MTL_Trans_MES,Finally:" + ex.Message); // 當該筆中介交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); throw; } finally { } } // If Not drTemp Is Nothing Then drTemp.Close() while (false); return ProductIntegration_1MTL_Trans_MESRet; } private int ProductIntegration_ChkValid_MaterialNo(ref IDbConnection cnnMES, ref Collection colSQL_2MES, ref Collection colSQL_2MES_Rows, ref ArrayList aryMES_Message, string strMaterialNo) { int ProductIntegration_ChkValid_MaterialNoRet = default(int); ProductIntegration_ChkValid_MaterialNoRet = -1; // Return -1:fail,0:Success var drTemp = default(DbDataReader); string strSQL; try { // ----------------------------------------------------------- // 物料編號合理性檢查 // ----------------------------------------------------------- // (1)檢查MaterialNo是否已存在於tblMTLMaterialType(因與MaterialType共用Property故編號不可一樣) strSQL = "Select MaterialType From tblMTLMaterialType Where MaterialType='" + strMaterialNo + "'"; //cmmTemp = new IDbCommand(strSQL, cnnMES); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); if (drTemp.Read()) { aryMES_Message.Add("物料編號(imaa001):" + strMaterialNo + ", 已存在於MES物料類別主檔, 物料編號與物料類別不允許相同!!"); } drTemp.Close(); //cmmTemp.Dispose(); // 91561: 系統參數for ERP整合料件時使用 : ProductMaterialcoexist (產品物料同時並存) strSQL = "SELECT * FROM TBLSYSPARAMETER WHERE PARAMETERNO = 'ProductMaterialcoexist'"; //cmmTemp = new IDbCommand(strSQL, cnnMES); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); if (drTemp.Read()) { // 如果ProductMaterialcoexist設定為1,跳過檢查 if (drTemp["PARAMETERVALUE"].ToString() == "0") { // (2)檢查產品主檔: // 因產品可能是半成品,會當成料來使用, // 在BOM表(tblPRDBOM)、用料清單(tblOEMOMaterialList)及kcWIP.clsLot的處理邏輯上都沒有加上MaterialLevel. // 故MaterialNo不可與ProductNo一樣. strSQL = "Select ProductNo From tblPRDProductBasis Where ProductNo ='" + strMaterialNo + "'"; //cmmTemp = new IDbCommand(strSQL, cnnMES); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); if (drTemp.Read()) { aryMES_Message.Add("物料編號(imaa001):" + strMaterialNo + ", 已存在於MES產品主檔, 物料編號與產品編號不允許相同!! 半成品可會當成料來使用!!"); } drTemp.Close(); //cmmTemp.Dispose(); } } drTemp.Close(); //cmmTemp.Dispose(); // //return 0 : Success ProductIntegration_ChkValid_MaterialNoRet = 0; } catch (Exception ex) { aryMES_Message.Add(ex.Message); throw; } finally { if (drTemp != null) drTemp.Close(); } return ProductIntegration_ChkValid_MaterialNoRet; } private int ProductIntegration_ChkforDelMaterialNo(ref IDbConnection cnnMES, ref Collection colSQL_2MES, ref Collection colSQL_2MES_Rows, ref ArrayList aryMES_Message, string strMaterialNo) { int ProductIntegration_ChkforDelMaterialNoRet = default(int); ProductIntegration_ChkforDelMaterialNoRet = -1; // Return -1:fail,0:Success var drTemp = default(DbDataReader); string strSQL; try { /// ----------------------------------------------------------- /// 物料編號合理性檢查 /// ----------------------------------------------------------- // ----------------------------------------------------------- // 檢查MES物料相關設定. // 參考自kcMTL.clsMTLBasis.DelMaterialBasis(). // ----------------------------------------------------------- // (1)檢查MaterialNo是否已存在於MaterialList. strSQL = "Select MONo From tblOEMOMaterialList" + " Where MaterialLevel=0" + " And MaterialNo='" + strMaterialNo + "'"; //cmmTemp = new IDbCommand(strSQL, cnnMES); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); if (drTemp.Read()) { aryMES_Message.Add("物料編號(imaa001):" + strMaterialNo + ", 存在於MES工單物料清單(工單編號:" + drTemp["MONo"] + ")!!"); } drTemp.Close(); //cmmTemp.Dispose(); // (2)檢查MaterialNo是否已存在於BOM. strSQL = "Select ProductNo,ProductVersion From tblPRDBOM " + " Where NodeType=0 " + " And NodeNo='" + strMaterialNo + "'"; //cmmTemp = new IDbCommand(strSQL, cnnMES); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); if (drTemp.Read()) { aryMES_Message.Add("物料編號(imaa001):" + strMaterialNo + ", 存在於MES產品BOM表(產品編號:" + drTemp["ProductNo"] + ",產品版本:" + drTemp["ProductVersion"] + ")!!"); } drTemp.Close(); //cmmTemp.Dispose(); // PS.還有很多相關Table都未檢查,也未設FK.(kcMTL.clsMTLBasis註解) // -----------------------------------------------------------# // //return 0 : Success ProductIntegration_ChkforDelMaterialNoRet = 0; } catch (Exception ex) { aryMES_Message.Add(ex.Message); throw; } finally { if (drTemp != null) drTemp.Close(); } return ProductIntegration_ChkforDelMaterialNoRet; } private int ProductIntegration_DelMaterial(ref Collection colSQL_2MES, ref Collection colSQL_2MES_Rows, ref ArrayList aryMES_Message, string strMaterialNo) { int ProductIntegration_DelMaterialRet = default(int); ProductIntegration_DelMaterialRet = -1; // Return -1:fail,0:Success string strSQL; try { // ----------------------------------------------------------- // 先刪除MES物料相關設定 // ----------------------------------------------------------- // 1.tblMTLMaterialProperty strSQL = "Delete From tblMTLMaterialProperty " + " Where Material='" + strMaterialNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // 2.tblMTLMaterialVendorMap strSQL = "Delete From tblMTLMaterialVendorMap " + " Where MaterialNo='" + strMaterialNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // 3.tblMTLMaterialGroupDetail strSQL = "Delete From tblMTLMaterialGroupDetail " + " Where MaterialNo='" + strMaterialNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // ----------------------------------------------------------- // 刪除MES物料設定 // ----------------------------------------------------------- strSQL = "Delete From tblMTLMaterialBasis " + " Where MaterialNo='" + strMaterialNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // //return 0 : Success ProductIntegration_DelMaterialRet = 0; } catch (Exception ex) { aryMES_Message.Add(ex.Message.ToString()); throw; } return ProductIntegration_DelMaterialRet; } private int ProductIntegration_2Unit_Trans_MES(ref IDbConnection cnnMES, ref ArrayList aryReturnMessage, ref int intReturnFailCount, string IfTableName, DataRow[] drSel_IF) { int ProductIntegration_2Unit_Trans_MESRet = default(int); ProductIntegration_2Unit_Trans_MESRet = -1; // Return -1:fail,0:Success // -------------------------------------------------- // mes_imae_t 中介表 拋轉 MES 產品/MTL主檔. // -------------------------------------------------- // drSel_IF ,固定處理條件imaa004料件類別=A(組合/加工品). // aryMES_Message ,收集單筆中介交易記錄的錯誤記錄. // mes_imae_t 料件據點製造檔(單位) 更新產品:UnitNo,UnitType. // status:針對產品做 Update,若拋D視為不合理的ERP資料狀態。 // =========================================================== // 宣告 DB相關 變數 // =========================================================== var drTemp = default(DbDataReader); Collection colSQL_T100 = new Collection(), colSQL_T100_Rows = new Collection(); // T100中介DB(MES回填處理記錄). Collection colSQL_2MES = new Collection(), colSQL_2MES_Rows = new Collection(); // MES正式異動資料(主要). string strSQL; // 每筆中介交易記錄 string strIfWhereCond_PK; string strMES_Result; string strMES_MESSAGE; // 錯誤訊息(中介表.MES_MESSAGE),Chr(10)分隔錯誤項目。 var aryMES_Message = new ArrayList(); // 收集單筆中介交易記錄的錯誤記錄, Exception及MES判定錯誤訊息。 var datNow = DateTime.Now; // Now try { // 宣告拋轉中介表資料使用變數 string strERP_PRDMTLNo, strERP_PRDMTLVer, strERP_UnitNo; DataRow drChkPRD = default(DataRow), drChkMTL; var colRecUnitInfo = new Collection(); // 收集所有UnitNo,以判斷是否需Insert資料. // -------------------------------------------------- // 必須以tran_Time順序,逐筆處理中介交易記錄。 // 每一筆交易記錄處理完成,立即變更 MESDB 及 MESSERIES_T100.中介表的MES處理記錄,綁在同一個交易裡. // (同包Transaction, 處理完畢後再一起commit) // 當某筆交易記錄處理失敗,立即變更 MESSERIES_T100.中介表的MES處理記錄,再接著處理下一筆記錄. // -------------------------------------------------- foreach (DataRow drIF in drSel_IF) { // reset datNow = DateTime.Now; // Now strIfWhereCond_PK = ""; strMES_Result = "9"; // 預設值 9 (MES處理結果, 成功回寫1, 失敗回寫9). strMES_MESSAGE = ""; // 錯誤訊息 aryMES_Message.Clear(); colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); colSQL_T100.Clear(); colSQL_T100_Rows.Clear(); do { bool continueFor = false; try { // ----------------------------------------------------------- // 取出各欄位資料 // ----------------------------------------------------------- // 轉大寫 strERP_PRDMTLNo = drIF["imae001"].ToString().Trim().ToUpper(); // 轉小寫 strERP_UnitNo = drIF["imae016"].ToString().Trim().ToLower(); // ToLower // ERPws標準功能不論IssueState為何皆允許修改(產品主檔或物料主檔). // 1.檢查是否存在MES int intNo_ChkType = -1; // 檢查是否存在MES,物料找到(填0),產品找到(填1), Default -1 . string strReturnUnitType; // 1-1.檢查是否有此物料設定 drChkMTL = GetMaterialBasis(strERP_PRDMTLNo, cnnMES, aryMES_Message); if (drChkMTL == null) break; // GoTo lblExitTry_2_NextRow 'fail if (!(drChkMTL["MaterialNo"] is DBNull)) { intNo_ChkType = 0; // Material } else { // 1-2.檢查是否有此產品設定 drChkPRD = GetProduct(strERP_PRDMTLNo, cnnMES, aryMES_Message); if (drChkPRD == null) break; // GoTo lblExitTry_2_NextRow 'fail if (!(drChkPRD["ProductNo"] is DBNull)) { intNo_ChkType = 1; // Product } } if (intNo_ChkType == -1) { // imae001,不存在MES的產品主檔或物料主檔. // aryMES_Message.Add("產品編號(imae001):" & strERP_PRDMTLNo & ", 不存在MES的產品主檔或物料主檔, 不允許執行!!") // Exit Try 'GoTo lblExitTry_2_NextRow // 2017-02-07, Joe, 調整t100基本資料整合:如查不到產品/物料mes主檔資訊則離開不做任何處理 continueFor = true; break; } else { // ----------------------------------------------------------- // 2.檢查單位資料,若不存在則自動新增。 // ----------------------------------------------------------- strReturnUnitType = ""; if (!colRecUnitInfo.Contains(strERP_UnitNo)) { if (AddUnitBasis(ref cnnMES, ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_UnitNo, strERPCreator, datNow, "AutoRun建立", strReturnUnitType) == 0) { colRecUnitInfo.Add(strReturnUnitType, strERP_UnitNo); // 記錄UnitType,UnitNo } else if (aryMES_Message.Count > 0) break; } else { strReturnUnitType = Conversions.ToString(colRecUnitInfo[strERP_UnitNo]); } // -----------------------------------------------------------# } if (intNo_ChkType == 0) // 0:Material { // ----------------------------------------------------------- // 3-1.修改MES物料設定 // ----------------------------------------------------------- strSQL = "Update tblMTLMaterialBasis Set " + " UnitNo='" + strERP_UnitNo + "'" + ",UnitType='" + strReturnUnitType + "'"; // 注意事項:產品與物料,當IssueState=-1的更新方式不同. // MES已存在之資料IssueState如果是-1,ERP資料再次拋轉時,IssueState則更新為"2". if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drChkMTL["IssueState"], -1, false))) strSQL += ",IssueState = 2"; strSQL += " Where MaterialNo='" + strERP_PRDMTLNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } else if (intNo_ChkType == 1) // 1:Product { // ----------------------------------------------------------- // 3-2.修改MES產品設定 // ----------------------------------------------------------- strSQL = "Update tblPRDProductBasis Set " + " UnitNo='" + strERP_UnitNo + "'" + ",UnitType='" + strReturnUnitType + "'"; // 注意事項:產品與物料,當IssueState=-1的更新方式不同. // MES已存在之資料IssueState如果是-1,ERP資料再次拋轉時,IssueState則更新為"0". if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drChkPRD["IssueState"], -1, false))) strSQL += ",IssueState = 0"; // ProductVersion預設1 strSQL += " Where ProductNo='" + strERP_PRDMTLNo + "' And ProductVersion = '1' "; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } // =============================================================================== // 判定 MES_Result 處理結果 (成功回寫1, 失敗回寫9). // =============================================================================== if (aryMES_Message.Count == 0) { strMES_Result = "1"; // -------------------------------------------------- // 四、MES資料庫異動 // -------------------------------------------------- if (colSQL_2MES.Count > 0) { ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colSQL_2MES, colSQL_2MES_Rows); } } else { break; } } catch (Exception EX_drIF) { strMES_Result = "9"; aryMES_Message.Add("ProductIntegration_2Unit_Trans_MES:EX_drIF.Exception" + '\n' + EX_drIF.Message); } finally { // 組合執行錯誤字串: Chr(10)分隔 strMES_MESSAGE = ArrayList2String(ref aryMES_Message); // 2016/01/13, 直接異動中介表-------------------------- // 'If strMES_MESSAGE = defString Then // ' '當錯誤字串組合失敗,在Finally後會記錄PK. // 'End If // --------------------------------------------------# // MES_Message長度4000限制, 截取0-3996碼加"...". if (strMES_MESSAGE.Length > 4000) strMES_MESSAGE = strMES_MESSAGE.Substring(0, 3996) + "..."; // ---取消前面收集SQL--- colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); colSQL_T100.Clear(); // 若T100中介資料庫異動fail。(若MES_MESSAGE問題,下面會不會一樣fail?) colSQL_T100_Rows.Clear(); // ----------------------------------------------------------- // (EX_drIF.Exception) // 回填中介表資訊,(注意)各個資料表的PK不同。 // ----------------------------------------------------------- // mssql,無trim用法,不串變數值,直接檢查原欄位值. strIfWhereCond_PK = Conversions.ToString(" Where imae001 = '" + drIF["imae001"] + "'" + " And tran_time = '" + drIF["tran_time"] + "'" + " And imae016 = '" + drIF["imae016"] + "'" + " And imaesite = '" + ERP_Site + "' " + " And imaeent ='" + ERP_EntID + "' "); if (Update_T100_IfTable(ref colSQL_T100, ref colSQL_T100_Rows, ref aryMES_Message, IfTableName, strIfWhereCond_PK, strMES_Result, datNow, strMES_MESSAGE) >= 0) { // -------------------------------------------------- // 六、T100中介資料庫異動(EX_drIF) // -------------------------------------------------- try { ExecuteSQLNoneQuery_ChkRowCount(strERPDataBaseType, strERPconnectionString, colSQL_T100, colSQL_T100_Rows); } catch (Exception ex) { string strErrSQL = ""; foreach (string s in colSQL_T100) strErrSQL += s + ";"; aryMES_Message.Add("ProductIntegration_2Unit_Trans_MES,colSQL_T100:" + strErrSQL); throw; } } } if (continueFor) { continue; } } while (false); // lblExitTry_2_NextRow: // 當該筆中介交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 if (aryMES_Message.Count > 0) { /// 匯整記錄中介表的PK資訊. // 因從錯誤訊息不一定看的出哪一筆中介表交易記錄fail. // 故失敗訊息連同中介表的必要資訊一併匯整. (Email要放詳細資訊) // (1) aryReturnMessage.Add("tran_time:" + drIF["tran_time"] + ", imae001:" + drIF["imae001"] + ", imae016:" + drIF["imae016"]); // (2) foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); } // 計算失敗筆數 if (strMES_Result == "9") intReturnFailCount += 1; // 不管成功或失敗,繼續下一筆。 } // //return 0 : Success ProductIntegration_2Unit_Trans_MESRet = 0; } catch (Exception ex) { aryMES_Message.Add("ProductIntegration_2Unit_Trans_MES,Finally:" + ex.Message); // 當該筆中介交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); throw; } finally { if (drTemp != null) drTemp.Close(); } return ProductIntegration_2Unit_Trans_MESRet; } private int ProductIntegration_3Res_Trans_MES(ref IDbConnection cnnMES, ref ArrayList aryReturnMessage, ref int intReturnFailCount, string IfTableName, DataRow[] drSel_IF) { int ProductIntegration_3Res_Trans_MESRet = default(int); ProductIntegration_3Res_Trans_MESRet = -1; // Return -1:fail,0:Success // -------------------------------------------------- // mes_imae_t 中介表 拋轉 MES 產品/MTL主檔. // -------------------------------------------------- // drSel_IF ,固定處理條件imaa004料件類別=A(組合/加工品). // aryMES_Message ,收集單筆中介交易記錄的錯誤記錄. // mes_imae_t 料件據點製造檔(單位) 更新產品:UnitNo,UnitType. // status:針對產品做 Update,若拋D視為不合理的ERP資料狀態。 // =========================================================== // 宣告 DB相關 變數 // =========================================================== var drTemp = default(DbDataReader); Collection colSQL_T100 = new Collection(), colSQL_T100_Rows = new Collection(); // T100中介DB(MES回填處理記錄). Collection colSQL_2MES = new Collection(), colSQL_2MES_Rows = new Collection(); // MES正式異動資料(主要). string strSQL; // 每筆中介交易記錄 string strIfWhereCond_PK; string strMES_Result; string strMES_MESSAGE; // 錯誤訊息(中介表.MES_MESSAGE),Chr(10)分隔錯誤項目。 var aryMES_Message = new ArrayList(); // 收集單筆中介交易記錄的錯誤記錄, Exception及MES判定錯誤訊息。 var datNow = DateTime.Now; // Now try { // 宣告拋轉中介表資料使用變數 string strERP_PRDMTLNo, strERP_PRDMTLName, strERP_PRDMTLSpec; DataRow drChkPRD = default(DataRow), drChkMTL; // Dim colRecUnitInfo As New Collection '收集所有UnitNo,以判斷是否需Insert資料. // -------------------------------------------------- // 必須以tran_Time順序,逐筆處理中介交易記錄。 // 每一筆交易記錄處理完成,立即變更 MESDB 及 MESSERIES_T100.中介表的MES處理記錄,綁在同一個交易裡. // (同包Transaction, 處理完畢後再一起commit) // 當某筆交易記錄處理失敗,立即變更 MESSERIES_T100.中介表的MES處理記錄,再接著處理下一筆記錄. // -------------------------------------------------- foreach (DataRow drIF in drSel_IF) { // reset datNow = DateTime.Now; // Now strIfWhereCond_PK = ""; strMES_Result = "9"; // 預設值 9 (MES處理結果, 成功回寫1, 失敗回寫9). strMES_MESSAGE = ""; // 錯誤訊息 aryMES_Message.Clear(); colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); colSQL_T100.Clear(); colSQL_T100_Rows.Clear(); do { bool continueFor = false; try { // ----------------------------------------------------------- // 取出各欄位資料 // ----------------------------------------------------------- // 轉大寫 strERP_PRDMTLNo = drIF["imaal001"].ToString().Trim().ToUpper(); // 品名 strERP_PRDMTLName = drIF["imaal003"].ToString().Trim(); if (string.IsNullOrEmpty(strERP_PRDMTLName)) strERP_PRDMTLName = "N/A"; // 規格 strERP_PRDMTLSpec = drIF["imaal004"].ToString().Trim(); if (string.IsNullOrEmpty(strERP_PRDMTLSpec)) strERP_PRDMTLSpec = "N/A"; // ERPws標準功能不論IssueState為何皆允許修改(產品主檔或物料主檔). // 1.檢查是否存在MES int intNo_ChkType = -1; // 檢查是否存在MES,物料找到(填0),產品找到(填1), Default -1 . string strReturnUnitType; // 1-1.檢查是否有此物料設定 drChkMTL = GetMaterialBasis(strERP_PRDMTLNo, cnnMES, aryMES_Message); if (drChkMTL == null) break; // GoTo lblExitTry_2_NextRow 'fail if (!(drChkMTL["MaterialNo"] is DBNull)) { intNo_ChkType = 0; // Material } else { // 1-2.檢查是否有此產品設定 drChkPRD = GetProduct(strERP_PRDMTLNo, cnnMES, aryMES_Message); if (drChkPRD == null) break; // GoTo lblExitTry_2_NextRow 'fail if (!(drChkPRD["ProductNo"] is DBNull)) { intNo_ChkType = 1; // Product } } if (intNo_ChkType == -1) { // imae001,不存在MES的產品主檔或物料主檔. // aryMES_Message.Add("產品編號(imae001):" & strERP_PRDMTLNo & ", 不存在MES的產品主檔或物料主檔, 不允許執行!!") // Exit Try 'GoTo lblExitTry_2_NextRow // 2017-02-07, Joe, 調整t100基本資料整合:如查不到產品/物料mes主檔資訊則離開不做任何處理 continueFor = true; break; } else { // ----------------------------------------------------------- // 2.檢查單位資料,若不存在則自動新增。 // ----------------------------------------------------------- // strReturnUnitType = "" // If Not colRecUnitInfo.Contains(strERP_UnitNo) Then // If AddUnitBasis(cnnMES, colSQL_2MES, colSQL_2MES_Rows, aryMES_Message, strERP_UnitNo, _ // strERPCreator, datNow, "AutoRun建立", strReturnUnitType) = 0 Then // colRecUnitInfo.Add(strReturnUnitType, strERP_UnitNo) '記錄UnitType,UnitNo // Else // If aryMES_Message.Count > 0 Then Exit Try // End If // Else // strReturnUnitType = colRecUnitInfo(strERP_UnitNo) // End If // -----------------------------------------------------------# } if (intNo_ChkType == 0) // 0:Material { // ----------------------------------------------------------- // 3-1.修改MES物料設定 // ----------------------------------------------------------- strSQL = "Update tblMTLMaterialBasis Set " + " MaterialName='" + modWIN.GetSubString(strERP_PRDMTLName, 50) + "'" + ",MaterialSpec='" + modWIN.GetSubString(strERP_PRDMTLSpec, 100) + "'"; // 注意事項:產品與物料,當IssueState=-1的更新方式不同. // MES已存在之資料IssueState如果是-1,ERP資料再次拋轉時,IssueState則更新為"2". if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drChkMTL["IssueState"], -1, false))) strSQL += ",IssueState = 2"; strSQL += " Where MaterialNo='" + strERP_PRDMTLNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } else if (intNo_ChkType == 1) // 1:Product { // ----------------------------------------------------------- // 3-2.修改MES產品設定 // ----------------------------------------------------------- strSQL = "Update tblPRDProductBasis Set " + " ProductName='" + strERP_PRDMTLName + "'" + ",SpecNo='" + modWIN.GetSubString(strERP_PRDMTLSpec, 20) + "'"; // 注意事項:產品與物料,當IssueState=-1的更新方式不同. // MES已存在之資料IssueState如果是-1,ERP資料再次拋轉時,IssueState則更新為"0". if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drChkPRD["IssueState"], -1, false))) strSQL += ",IssueState = 0"; // ProductVersion預設1 strSQL += " Where ProductNo='" + strERP_PRDMTLNo + "' And ProductVersion = '1' "; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } // =============================================================================== // 判定 MES_Result 處理結果 (成功回寫1, 失敗回寫9). // =============================================================================== if (aryMES_Message.Count == 0) { strMES_Result = "1"; // -------------------------------------------------- // 四、MES資料庫異動 // -------------------------------------------------- if (colSQL_2MES.Count > 0) { ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colSQL_2MES, colSQL_2MES_Rows); } } else { break; } } catch (Exception EX_drIF) { strMES_Result = "9"; aryMES_Message.Add("ProductIntegration_3Res_Trans_MES:EX_drIF.Exception" + '\n' + EX_drIF.Message); } finally { // 組合執行錯誤字串: Chr(10)分隔 strMES_MESSAGE = ArrayList2String(ref aryMES_Message); // 2016/01/13, 直接異動中介表-------------------------- // 'If strMES_MESSAGE = defString Then // ' '當錯誤字串組合失敗,在Finally後會記錄PK. // 'End If // --------------------------------------------------# // MES_Message長度4000限制, 截取0-3996碼加"...". if (strMES_MESSAGE.Length > 4000) strMES_MESSAGE = strMES_MESSAGE.Substring(0, 3996) + "..."; // ---取消前面收集SQL--- colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); colSQL_T100.Clear(); // 若T100中介資料庫異動fail。(若MES_MESSAGE問題,下面會不會一樣fail?) colSQL_T100_Rows.Clear(); // ----------------------------------------------------------- // (EX_drIF.Exception) // 回填中介表資訊,(注意)各個資料表的PK不同。 // ----------------------------------------------------------- // mssql,無trim用法,不串變數值,直接檢查原欄位值. strIfWhereCond_PK = Conversions.ToString(" Where imaal001 = '" + drIF["imaal001"] + "'" + " And tran_time = '" + drIF["tran_time"] + "'" + " And imaal002 = '" + drIF["imaal002"] + "'" + " And imaalent ='" + ERP_EntID + "' "); if (Update_T100_IfTable(ref colSQL_T100, ref colSQL_T100_Rows, ref aryMES_Message, IfTableName, strIfWhereCond_PK, strMES_Result, datNow, strMES_MESSAGE) >= 0) { // -------------------------------------------------- // 六、T100中介資料庫異動(EX_drIF) // -------------------------------------------------- ExecuteSQLNoneQuery_ChkRowCount(strERPDataBaseType, strERPconnectionString, colSQL_T100, colSQL_T100_Rows); } } if (continueFor) { continue; } } while (false); // lblExitTry_2_NextRow: // 當該筆中介交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 if (aryMES_Message.Count > 0) { /// 匯整記錄中介表的PK資訊. // 因從錯誤訊息不一定看的出哪一筆中介表交易記錄fail. // 故失敗訊息連同中介表的必要資訊一併匯整. (Email要放詳細資訊) // (1) aryReturnMessage.Add("tran_time:" + drIF["tran_time"] + ", imaal001:" + drIF["imaal001"] + ", imaal002:" + drIF["imaal002"]); // (2) foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); } // 計算失敗筆數 if (strMES_Result == "9") intReturnFailCount += 1; // 不管成功或失敗,繼續下一筆。 } // //return 0 : Success ProductIntegration_3Res_Trans_MESRet = 0; } catch (Exception ex) { aryMES_Message.Add("ProductIntegration_3Res_Trans_MES,Finally:" + ex.Message); // 當該筆中介交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); throw; } finally { if (drTemp != null) drTemp.Close(); } return ProductIntegration_3Res_Trans_MESRet; } private DataRow GetMaterialBasis(string MaterialNo, IDbConnection cnnTemp = null, ArrayList aryErrMessage = null, int IssueState = defInteger, string strAdditional = "") { DataRow GetMaterialBasisRet = default(DataRow); // 此 Function 將資料以 DataRow 方式取出 // 傳回值: DataRow(成功), Nothing(失敗) //var daTemp = default(System.Data.OleDb.OleDbDataAdapter); var dsTemp = default(DataSet); var cnnLocal = default(IDbConnection); string strCondition = default(string), strSQL = default(string); try { if (cnnTemp == null) { // //Create connection string argstrDataBaseType = "Null"; string strDataBaseTypeTmp = objSetting.GetConnectionString(strDataBaseType: argstrDataBaseType); cnnLocal = CreateConnection(strDataBaseTypeTmp); } else { cnnLocal = cnnTemp; } // //查詢條件 if ((MaterialNo ?? "") != defString) { strCondition += " And MaterialNo = '" + MaterialNo + "'"; } if (IssueState != defInteger) { strCondition += " And IssueState = " + IssueState; } // Additional if (!string.IsNullOrEmpty(strAdditional)) { strSQL += strAdditional; } // //主SQL strSQL = "Select * From tblMTLMaterialBasis Where 1=1 " + strCondition; // //Select data //cmmTemp = new IDbCommand(strSQL, cnnTemp); //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp); dsTemp = new DataSet(); //daTemp.Fill(dsTemp, "MTLMaterialBasis"); ExecuteSQLQuery_Adapter(strSQL, dsTemp, "MTLMaterialBasis", cnnTemp); // //Return data if (dsTemp.Tables[0].Rows.Count > 0) { GetMaterialBasisRet = dsTemp.Tables[0].Rows[0]; } else { GetMaterialBasisRet = dsTemp.Tables[0].NewRow(); } } catch (Exception ex) { GetMaterialBasisRet = null; // 此Function發生異常較難由訊息看出,加上FunctionName. aryErrMessage.Add("GetMaterialBasis:" + ex.Message); throw; } finally { if (cnnTemp == null) CloseConnection(cnnLocal); //if (daTemp != null) // daTemp.Dispose(); if (dsTemp != null) dsTemp.Dispose(); } return GetMaterialBasisRet; } private DataRow GetProduct(string ProductNo, IDbConnection cnnTemp = null, ArrayList aryErrMessage = null, string ProductVersion = defString, int IssueState = defInteger, int CurVersion = 1, string strAdditional = "") { DataRow GetProductRet = default(DataRow); // 此 Function 將資料以 DataRow 方式取出 // 傳回值: DataRow(成功), Nothing(失敗) //var daTemp = default(System.Data.OleDb.OleDbDataAdapter); var dsTemp = default(DataSet); var cnnLocal = default(IDbConnection); string strCondition = default(string), strSQL = default(string); try { if (cnnTemp == null) { // //Create connection string argstrDataBaseType = "Null"; string strDataBaseTypeTmp = objSetting.GetConnectionString(strDataBaseType: argstrDataBaseType); cnnLocal = CreateConnection(strDataBaseTypeTmp); } else { cnnLocal = cnnTemp; } // //查詢條件 if ((ProductNo ?? "") != defString) { strSQL += " And ProductNo = '" + ProductNo + "'"; } if ((ProductVersion ?? "") != defString) { strSQL += " And ProductVersion='" + ProductVersion + "'"; } // CurVersion: // 0.只查詢 Old Version 的 Product // 1.只查詢Current Version 的 Product // Else 全部查詢 if (CurVersion == 0 || CurVersion == 1) { strSQL += " And CurVersion = " + CurVersion; } if (IssueState != defInteger) { strSQL += " And IssueState = " + IssueState; } // Additional if (!string.IsNullOrEmpty(strAdditional)) { strSQL += strAdditional; } // //主SQL strSQL = "Select * From tblPRDProductBasis " + strCondition; // --以下fallow kcPRD作法--. // 將較大的Version 置前 strSQL += " Order by ProductNo, ProductVersion Desc"; // //Select data //cmmTemp = new IDbCommand(strSQL, cnnTemp); //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp); dsTemp = new DataSet(); //daTemp.Fill(dsTemp, "PRDProductBasis"); ExecuteSQLQuery_Adapter(strSQL, dsTemp, "PRDProductBasis", cnnTemp); // //Return data if (dsTemp.Tables[0].Rows.Count > 0) { GetProductRet = dsTemp.Tables[0].Rows[0]; } else { GetProductRet = dsTemp.Tables[0].NewRow(); } } catch (Exception ex) { GetProductRet = null; // 此Function發生異常較難由訊息看出,加上FunctionName. aryErrMessage.Add("GetProductBasis:" + ex.Message); throw; } finally { if (cnnTemp == null) CloseConnection(cnnLocal); //if (daTemp != null) // daTemp.Dispose(); if (dsTemp != null) dsTemp.Dispose(); } return GetProductRet; } private int AddUnitBasis(ref IDbConnection cnnTemp, ref Collection colSQL, ref Collection colSQL_Rows, ref ArrayList aryErrorMessage, string strUnitNo, string strCreator, DateTime datCreateDate, string strDescription = "", string strReturnUnitType = defString) { int AddUnitBasisRet = default(int); AddUnitBasisRet = -1; // Return -1:fail,0:Success // IssueState固定寫2 var drTemp = default(DbDataReader); string strSQL; try { strSQL = "Select UnitType From tblSysUnitBasis" + " Where UnitNo='" + strUnitNo + "'"; //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (drTemp.Read()) { strReturnUnitType = Conversions.ToString(drTemp["UnitType"]); } else { // 新增單位主檔 strSQL = "Insert Into tblSysUnitBasis " + "(UnitNo, UnitType, SystemUnit, TransferRate, IssueState, Description, Creator, CreateDate) " + " Values('" + strUnitNo + "','" + strUnitNo + "','" + strUnitNo + "',1,2,'" + strDescription + "','" + strCreator + "', To_Date('" + Strings.Format(datCreateDate, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'))"; colSQL.Add(strSQL); colSQL_Rows.Add(1); // UnitType,直接給UnitNo。 strReturnUnitType = strUnitNo; } drTemp.Close(); //cmmTemp.Dispose(); // Return AddUnitBasisRet = 0; } catch (Exception ex) { aryErrorMessage.Add(ex.Message.ToString()); throw; } finally { if (drTemp != null) drTemp.Dispose(); } return AddUnitBasisRet; } private int AddProductType(ref IDbConnection cnnTemp, ref Collection colSQL, ref Collection colSQL_Rows, ref ArrayList aryErrorMessage, string strProductType, string strCreator, DateTime datCreateDate, string strDescription = "") { int AddProductTypeRet = default(int); AddProductTypeRet = -1; // Return -1:fail,0:Success // IssueState固定寫2 var drTemp = default(DbDataReader); string strSQL; try { strSQL = "Select ProductType From tblPRDType" + " Where ProductType='" + strProductType + "'"; //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (!drTemp.Read()) { // 新增ProductType主檔 strSQL = "Insert Into tblPRDType " + "(ProductType, Description, IssueState, Creator, CreateDate) " + " Values('" + strProductType + "','" + strDescription + "',2,'" + strCreator + "', To_Date('" + Strings.Format(datCreateDate, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'))"; colSQL.Add(strSQL); colSQL_Rows.Add(1); } drTemp.Close(); //cmmTemp.Dispose(); // Return AddProductTypeRet = 0; } catch (Exception ex) { aryErrorMessage.Add(ex.Message.ToString()); throw; } finally { if (drTemp != null) drTemp.Dispose(); } return AddProductTypeRet; } private int AddMaterialType(ref IDbConnection cnnTemp, ref Collection colSQL, ref Collection colSQL_Rows, ref ArrayList aryErrorMessage, string strMaterialType, string strCreator, DateTime datCreateDate, string strDescription = "") { int AddMaterialTypeRet = default(int); AddMaterialTypeRet = -1; // Return -1:fail,0:Success // IssueState固定寫2 var drTemp = default(DbDataReader); string strSQL; try { strSQL = "Select MaterialType From tblMTLMaterialType" + " Where MaterialType='" + strMaterialType + "'"; //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (!drTemp.Read()) { // 新增MaterialType主檔 strSQL = "Insert Into tblMTLMaterialType " + "(MaterialType, Description, IssueState, Creator, CreateDate) " + " Values('" + strMaterialType + "','" + strDescription + "',2,'" + strCreator + "', To_Date('" + Strings.Format(datCreateDate, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'))"; colSQL.Add(strSQL); colSQL_Rows.Add(1); } drTemp.Close(); //cmmTemp.Dispose(); // Return AddMaterialTypeRet = 0; } catch (Exception ex) { aryErrorMessage.Add(ex.Message.ToString()); throw; } finally { if (drTemp != null) drTemp.Dispose(); } return AddMaterialTypeRet; } // Private Function ProductIntegration_MES_IMAA_T_Transfer_PRD(ByRef cnnMES As OleDb.OleDbConnection, _ // ByRef cnnT100 As OleDb.OleDbConnection, _ // ByRef aryReturnMessage As ArrayList, _ // ByVal EventTime As DateTime, _ // ByVal drvIF As DataRowView) As Integer // ProductIntegration_MES_IMAA_T_Transfer_PRD = -1 'Return -1:fail,0:Success // '-------------------------------------------------- // 'MES_IMAA_T 中介表 拋轉 MES 產品主檔. // '-------------------------------------------------- // '固定處理條件 ,imaa004料件類別=A(組合/加工品). // 'aryMES_Message ,收集單筆中介交易記錄的錯誤記錄. // 'EventTime ,請傳入執行時間. // Dim drTemp As OleDb.OleDbDataReader // Dim daTemp As OleDb.OleDbDataAdapter // Dim dsTemp As New DataSet // Dim colSQL_T100, colSQL_T100_Rows As New Collection 'T100中介DB(MES回填處理記錄). // Dim colSQL_2MES, colSQL_2MES_Rows As New Collection 'MES正式異動資料(主要). // Dim strSQL As String // ' 每筆中介交易記錄 // Dim strMES_MESSAGE As String '錯誤訊息(中介表.MES_MESSAGE),Chr(10)分隔錯誤項目。 // Dim aryMES_Message As New ArrayList 'Catch Error Message (Exception及MES判定錯誤訊息)。 // '=========================================================== // ' 宣告 其他 變數 // '=========================================================== // Dim datNow As DateTime // Try // '宣告拋轉中介表名稱(固定) // Dim strIfTableName As String = "MES_IMAA_T" // '宣告拋轉中介表資料使用變數 // Dim strERP_ProductNo, strERP_ProductName, strERP_UnitNo, strERP_status As String // Dim strERP_ProductVersion As String = "1" '未傳入時預設為1。 // 'MES資料使用變數 // Dim strReturnUnitType As String // '預設值 // Dim strProductType As String = "PRODUCT" '給予預設值"PRODUCT",若不存在則自動新增產品類別. // Dim intIssueState As Integer = 0 // Dim intCurVersion As Integer = 0 // Dim strSpecNo As String = "N/A" // '----------------------------------------------------------- // '固定檢查ProductType='PRODUCT'資料,若不存在則自動新增。 // '----------------------------------------------------------- // If AddProductType(cnnMES, colSQL_2MES, colSQL_2MES_Rows, aryMES_Message, strProductType, _ // strERPCreator, EventTime, "AutoRun建立") < 0 Then Exit Try // 'MES_Result為空白代表未拋轉。 // strSQL = "Select * From " & strIfTableName & _ // " Where MES_Result Is Null" // cmmTempERP = New OleDb.OleDbCommand(strSQL, cnnERP) // daTemp = New OleDb.OleDbDataAdapter(cmmTempERP) // daTemp.Fill(dsTemp, "mes_imaa_t") // cmmTempERP.Dispose() // 'If dsTemp.Tables("mes_imaa_t").Rows.Count > 0 Then // ' Dim strERP_imaa001, strERP_imaa004, strERP_tran_time As String // ' Dim strMES_Result As String // ' Dim colRecUnitInfo As New Collection '收集所有UnitNo,以判斷是否需Insert資料. // ' '-------------------------------------------------- // ' '必須以tran_Time順序,逐筆處理中介交易記錄。 // ' '每一筆交易記錄處理完成,立即變更 MESDB 及 MESSERIES_T100.中介表的MES處理記錄,綁在同一個交易裡. // ' ' (同包Transaction, 處理完畢後再一起commit) // ' '當某筆交易記錄處理失敗,立即變更 MESSERIES_T100.中介表的MES處理記錄,再接著處理下一筆記錄. // ' '-------------------------------------------------- // ' 'Sort // ' dsTemp.Tables("mes_imaa_t").DefaultView.Sort = "tran_Time,imaa001" // ' For Each drvIF As DataRowView In dsTemp.Tables("mes_imaa_t").DefaultView // ' 'reset // ' datNow = Now 'Now // ' strMES_Result = "9" '預設值 9 (MES處理結果, 成功回寫1, 失敗回寫9). // ' strMES_MESSAGE = "" '錯誤訊息 // ' aryMES_Message.Clear() // ' colSQL_2MES.Clear() // ' colSQL_2MES_Rows.Clear() // ' colSQL_T100.Clear() // ' colSQL_T100_Rows.Clear() // ' Try // '----------------------------------------------------------- // '取出各欄位資料 // '----------------------------------------------------------- // '轉大寫 // strERP_ProductNo = drvIF("imaa001").ToString.Trim.ToUpper // strERP_ProductVersion = drvIF("imaa002").ToString.Trim.ToUpper // strERP_ProductName = drvIF("imaal003").ToString.Trim // strERP_status = drvIF("status").ToString.Trim.ToUpper // '轉小寫 // strERP_UnitNo = drvIF("imae016").ToString.Trim.ToLower 'ToLower // Select Case strERP_status // Case "A" 'A:新增 // '檢查是否有此產品設定 // strSQL = "Select ProductNo From tblPRDProductBasis " & _ // " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "'" // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnMES) // drTemp = ExecuteSQLQuery_Reader // If Not drTemp.Read Then // '----------------------------------------------------------- // '產品編號合理性檢查 // '----------------------------------------------------------- // '(1)檢查ProductNo是否已存在於tblPRDType(因與ProductType共用Property故編號不可一樣). // strSQL = "Select ProductType From tblPRDType Where ProductType='" & strERP_ProductNo & "'" // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnMES) // drTemp = ExecuteSQLQuery_Reader() // If drTemp.Read Then // aryMES_Message.Add("產品編號(imaa001):" & strERP_ProductNo & ", 已存在於MES產品類別主檔, 產品編號與產品類別不允許相同!!") // End If // drTemp.Close() // cmmTemp.Dispose() // '(2)檢查ProductNo是否已存在於tblPRDModuleBasis(因與ModuleNo共用部份Table,故號不可一樣) // strSQL = "Select ModuleNo From tblPRDModuleBasis Where ModuleNo='" & strERP_ProductNo & "'" // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnMES) // drTemp = ExecuteSQLQuery_Reader() // If drTemp.Read Then // aryMES_Message.Add("產品編號(imaa001):" & strERP_ProductNo & ", 已存在於MES模組主檔, 產品編號與模組編號不允許相同!!") // End If // drTemp.Close() // cmmTemp.Dispose() // '(3)檢查物料主檔: // '因產品可能是半成品,會當成料來使用, // '在BOM表(tblPRDBOM)、用料清單(tblOEMOMaterialList)及kcWIP.clsLot的處理邏輯上都沒有加上MaterialLevel. // '故ProductNo不可與MaterialNo一樣. // strSQL = "Select MaterialNo From tblMTLMaterialBasis Where MaterialNo ='" & strERP_ProductNo & "'" // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnMES) // drTemp = ExecuteSQLQuery_Reader() // If drTemp.Read Then // aryMES_Message.Add("產品編號(imaa001):" & strERP_ProductNo & ", 已存在於MES物料主檔, 物料編號與產品編號不允許相同!! 半成品可會當成料來使用!!") // End If // drTemp.Close() // cmmTemp.Dispose() // '----------------------------------------------------------- // '新增MES產品設定 // '----------------------------------------------------------- // strSQL = "Insert Into tblPRDProductBasis " & _ // "(ProductNo,ProductVersion,ProductName,ProductType," & _ // " UnitNo,UnitType,SpecNo,Description," & _ // " IssueState,CurVersion,Creator,CreateDate)" // strSQL += " Values('" & strERP_ProductNo & "','" & strERP_ProductVersion & "','" & strERP_ProductName & "','" & strProductType & "','" & _ // strERP_UnitNo & "','" & strReturnUnitType & "','" & strSpecNo & "','AutoRun建立'," & _ // intIssueState & "," & intCurVersion & ",'" & strERPCreator & "'," & _ // "To_Date('" & Format(EventTime, "yyyy/MM/dd H:mm:ss") & "','YYYY/MM/DD HH24:MI:SS'))" // colSQL.Add(strSQL) // colSQL_Rows.Add(1) // Else // aryMES_Message.Add("產品編號(imaa001):" & strERP_ProductNo & ", 產品版本(imaa002):" & strERP_ProductVersion & ", 已存在MES, 不允許新增!!") // End If // drTemp.Close() // cmmTemp.Dispose() // Case "U" 'U:修改 // '檢查是否有此產品設定 // strSQL = "Select IssueState From tblPRDProductBasis " & _ // " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "'" // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnMES) // drTemp = ExecuteSQLQuery_Reader // If drTemp.Read Then // 'ERPws標準功能不論IssueState為何皆允許修改. // '----------------------------------------------------------- // '修改MES產品設定 // '----------------------------------------------------------- // strSQL = "Update tblPRDProductBasis Set " & _ // " UnitNo='" & strERP_UnitNo & "'" & _ // ",UnitType='" & strReturnUnitType & "'" & _ // ",ProductName='" & strERP_ProductName & "'" // '注意事項:產品與物料,當IssueState=-1的更新方式不同. // 'MES已存在之資料IssueState如果是-1,ERP資料再次拋轉時,IssueState則更新為"0". // If drTemp("IssueState") = -1 Then strSQL += ",IssueState = 0" // strSQL += " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "'" // colSQL.Add(strSQL) // colSQL_Rows.Add(1) // Else // aryMES_Message.Add("產品編號(imaa001):" & strERP_ProductNo & ", 產品版本(imaa002):" & strERP_ProductVersion & ", 不存在MES, 不允許修改!!") // End If // drTemp.Close() // cmmTemp.Dispose() // Case "D" 'D:刪除 // '檢查是否有此產品設定 // strSQL = "Select IssueState From tblPRDProductBasis " & _ // " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "'" // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnMES) // drTemp = ExecuteSQLQuery_Reader // If drTemp.Read Then // If drTemp("IssueState") = 0 Then // '----------------------------------------------------------- // '先刪除MES產品相關設定 // '----------------------------------------------------------- // '1.tblPRDProductProperty // strSQL = "Delete From tblPRDProductProperty " & _ // " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "'" // colSQL.Add(strSQL) // colSQL_Rows.Add(-1) // '2.tblPRDProductProcess // strSQL = "Delete From tblPRDProductProcess " & _ // " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "'" // colSQL.Add(strSQL) // colSQL_Rows.Add(-1) // '3.tblPRDOPAttrib // 'Parameter:Item // strSQL = "Delete From tblPRDOPAttrib " & _ // " Where SerialNo In (Select SerialNo From tblPRDOP " & _ // " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "')" // colSQL.Add(strSQL) // colSQL_Rows.Add(-1) // '4.tblPRDOPRule // 'Parameter:Rule // strSQL = "Delete From tblPRDOPRule " & _ // " Where SerialNo In (Select SerialNo From tblPRDOP " & _ // " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "')" // colSQL.Add(strSQL) // colSQL_Rows.Add(-1) // '5.tblPRDOPEQPRecipe // 'Parameter:EQPRecipe // strSQL = "Delete From tblPRDOPEQPRecipe " & _ // " Where SerialNo In (Select SerialNo From tblPRDOP " & _ // " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "')" // colSQL.Add(strSQL) // colSQL_Rows.Add(-1) // '6.tblPRDOpQCItemParameter // '2008/06/02,sammi.取消產品參數QCItem的參數設定功能,由SPC線上管制要因來變更抽樣計畫功能處理. // '暫時先不移處,因FK會造成無法刪除. // 'Parameter:QCItem Parameter // strSQL = "Delete From tblPRDOpQCItemParameter " & _ // " Where SerialNo In (Select SerialNo From tblPRDOP " & _ // " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "')" // colSQL.Add(strSQL) // colSQL_Rows.Add(-1) // '7.tblPRDOP // strSQL = "Delete From tblPRDOP " & _ // " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "'" // colSQL.Add(strSQL) // colSQL_Rows.Add(-1) // '8.tblPRDBOM // strSQL = "Delete From tblPRDBOM " & _ // " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "'" // colSQL.Add(strSQL) // colSQL_Rows.Add(-1) // '9.tblPRDOPBusinessRuleRelation // strSQL = "Delete From tblPRDOPBusinessRuleRelation " & _ // " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "'" // colSQL.Add(strSQL) // colSQL_Rows.Add(-1) // '10.tblPRDOPRuleXml_CLOB // '2006/05/11,sammi.處理DataGuard not support Long Type probleam. // If Not objDBcom.DBSupportLongType Then // strSQL = "Delete From tblPRDOPRuleXml_CLOB " & _ // " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "'" // colSQL.Add(strSQL) // colSQL_Rows.Add(-1) // End If // '11.tblPRDOPBusinessRule // strSQL = "Delete From tblPRDOPBusinessRule " & _ // " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "'" // colSQL.Add(strSQL) // colSQL_Rows.Add(-1) // '12.tblPRDOPDescription // strSQL = "Delete From tblPRDOPDescription " & _ // " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "'" // colSQL.Add(strSQL) // colSQL_Rows.Add(-1) // '13.tblPRDOPArea // strSQL = "Delete From tblPRDOPArea " & _ // " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "'" // colSQL.Add(strSQL) // colSQL_Rows.Add(-1) // '14.tblPRDAccessory // strSQL = "Delete From tblPRDAccessory" & _ // " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "'" // colSQL.Add(strSQL) // colSQL_Rows.Add(-1) // '15.tblPRDOPSubOP // ' 用 途:刪除產品作業站中子工序,因晶發專案客製於標準版中 // ' 撰寫人員:Sam.Hsu // ' 建立日期:2008/06/13 // strSQL = "Delete From tblPRDOPSubOP " & _ // " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "'" // colSQL.Add(strSQL) // colSQL_Rows.Add(-1) // '16.tblPRDRecipe // strSQL = "Delete From tblPRDRecipe " & _ // " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "'" // colSQL.Add(strSQL) // colSQL_Rows.Add(-1) // '17.tblPRDQCItem // strSQL = "Delete From tblPRDQCItem " & _ // " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "'" // colSQL.Add(strSQL) // colSQL_Rows.Add(-1) // '18.tblPRDProductSerialRuleBasis // strSQL = "Delete From tblPRDProductSerialRuleBasis " & _ // " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "'" // colSQL.Add(strSQL) // colSQL_Rows.Add(-1) // '19.tblPRDProductSerialRuleDetail // strSQL = "Delete From tblPRDProductSerialRuleDetail " & _ // " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "'" // colSQL.Add(strSQL) // colSQL_Rows.Add(-1) // '20.tblPRDPackingAccessory // strSQL = "Delete From tblPRDPackingAccessory " & _ // " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "'" // colSQL.Add(strSQL) // colSQL_Rows.Add(-1) // '21.tblPRDProductLabelRuleBasis // strSQL = "Delete From tblPRDProductLabelRuleBasis " & _ // " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "'" // colSQL.Add(strSQL) // colSQL_Rows.Add(-1) // '22.tblPRDProductLabelRuleDetail // strSQL = "Delete From tblPRDProductLabelRuleDetail " & _ // " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "'" // colSQL.Add(strSQL) // colSQL_Rows.Add(-1) // '22.tblPRDProductLabelRuleDetail_M // strSQL = "Delete From tblPRDProductLabelRuleDetail_M " & _ // " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "'" // colSQL.Add(strSQL) // colSQL_Rows.Add(-1) // '23.tblPRDRunTimeSetup // strSQL = "Delete From tblPRDRunTimeSetup " & _ // " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "'" // colSQL.Add(strSQL) // colSQL_Rows.Add(-1) // '----------------------------------------------------------- // '刪除MES產品設定 // '----------------------------------------------------------- // strSQL = "Delete From tblPRDProductBasis " & _ // " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "'" // colSQL.Add(strSQL) // colSQL_Rows.Add(1) // Else // '----------------------------------------------------------- // '作廢MES產品設定 // '----------------------------------------------------------- // strSQL = "Update tblPRDProductBasis Set " & _ // " IssueState=-1" & _ // " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "'" // colSQL.Add(strSQL) // colSQL_Rows.Add(1) // End If // Else // aryMES_Message.Add("產品編號(imaa001):" & strERP_ProductNo & ", 產品版本(imaa002):" & strERP_ProductVersion & ", 不存在MES, 不允許刪除!!") // End If // drTemp.Close() // cmmTemp.Dispose() // Case Else // aryMES_Message.Add("ERP資料狀態(Status):" & strERP_status & "無效, 不允許執行!!") // End Select // If aryMES_Message.Count > 0 Then GoTo lblExitTry_2_NextRow // ' '=============================================================================== // ' '(正常程序)(MES處理結果, 成功回寫1, 失敗回寫9). // ' '=============================================================================== // ' If aryMES_Message.Count = 0 Then // ' strMES_Result = "1" // ' Else // ' '組合執行錯誤字串: Chr(10)分隔 // ' strMES_MESSAGE = ArrayList2String(aryMES_Message) // ' If strMES_MESSAGE = defString Then // ' '當錯誤字串組合失敗,在Finally後會記錄PK. // ' GoTo lblExitTry_2_NextRow '--兩層 Try Catch 易混沌,不用 Exit Try 用 GoTo. // ' End If // ' 'MES_Message長度4000限制, 截取0-3996碼加"...". // ' If strMES_MESSAGE.Length > 4000 Then strMES_MESSAGE = strMES_MESSAGE.Substring(0, 3996) & "..." // ' '---取消前面異動SQL--- // ' colSQL_2MES.Clear() // ' colSQL_2MES_Rows.Clear() // ' End If // ' '----------------------------------------------------------- // ' '回填中介表資訊,(注意)各個資料表的PK不同。 // ' '----------------------------------------------------------- // ' 'MES_RESULT ,MES處理結果,預設值為空值,該筆資料處理成功回寫1,失敗回寫9. // ' 'MES_MESSAGE,MES處理失敗的原因,失敗時將EXCEPTION回寫(EXCEPTION 或 MES判定不合理資料). // ' 'MES_TIME ,MES處理時間,不論成功或失敗將時間回填(使用標準格式:yyyy/MM/dd HH:mm:ss). // ' '----------------------------------------------------------- // ' 'Update // ' strSQL = "Update " & strIfTableName & " Set " & _ // ' " MES_RESULT = '" & strMES_Result & "'" // ' 'MES_MESSAGE // ' If strMES_MESSAGE <> "" Then strSQL += ",MES_MESSAGE = '" & ChkSingleQuation(strMES_MESSAGE) & "'" // ' strSQL += ",MES_TIME = '" & Format(datNow, "yyyy/MM/dd HH:mm:ss") & "'" // ' 'Where // ' strSQL += " Where Upper(Trim(imaa001)) = '" & strERP_imaa001 & "'" & _ // ' " And Upper(Trim(tran_time)) = '" & strERP_tran_time & "'" // ' colSQL_T100.Add(strSQL) // ' colSQL_T100_Rows.Add(1) // ' '-------------------------------------------------- // ' '四、MES資料庫異動 // ' '-------------------------------------------------- // ' If colSQL_2MES.Count > 0 Then // ' Call ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colSQL_2MES, colSQL_2MES_Rows) // ' End If // ' '-------------------------------------------------- // ' '五、T100中介資料庫異動 // ' '-------------------------------------------------- // ' Call ExecuteSQLNoneQuery_ChkRowCount(strERPDataBaseType, strERPconnectionString, colSQL_T100, colSQL_T100_Rows) // 'Catch EX_drvIF As Exception // ' aryMES_Message.Add("EX_drvIF.Exception" & Chr(10) & EX_drvIF.Message.ToString) // ' '組合執行錯誤字串: Chr(10)分隔 // ' strMES_MESSAGE = ArrayList2String(aryMES_Message) // ' '2016/01/13, 直接異動中介表-------------------------- // ' ''If strMES_MESSAGE = defString Then // ' '' '當錯誤字串組合失敗,在Finally後會記錄PK. // ' '' GoTo lblExitTry_2_NextRow '--兩層 Try Catch 易混沌,不用 Exit Try 用 GoTo. // ' ''End If // ' '--------------------------------------------------# // ' 'MES_Message長度4000限制, 截取0-3996碼加"...". // ' If strMES_MESSAGE.Length > 4000 Then strMES_MESSAGE = strMES_MESSAGE.Substring(0, 3996) & "..." // ' '---取消前面收集SQL--- // ' colSQL_2MES.Clear() // ' colSQL_2MES_Rows.Clear() // ' colSQL_T100.Clear() '若T100中介資料庫異動fail。 // ' colSQL_T100_Rows.Clear() // ' '----------------------------------------------------------- // ' '(EX_drvIF.Exception) // ' '回填中介表資訊,(注意)各個資料表的PK不同。 // ' '----------------------------------------------------------- // ' 'MES_RESULT ,MES處理結果,預設值為空值,該筆資料處理成功回寫1,失敗回寫9. // ' 'MES_MESSAGE,MES處理失敗的原因,失敗時將EXCEPTION回寫(EXCEPTION 或 MES判定不合理資料). // ' 'MES_TIME ,MES處理時間,不論成功或失敗將時間回填(使用標準格式:yyyy/MM/dd H:mm:ss). // ' '----------------------------------------------------------- // ' strSQL = "Update " & strIfTableName & " Set " & _ // ' " MES_RESULT = '9'" & _ // ' ",MES_MESSAGE = '" & ChkSingleQuation(strMES_MESSAGE) & "'" & _ // ' ",MES_TIME = To_Date('" & Format(datNow, "yyyy/MM/dd H:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') " & _ // ' " Where Upper(Trim(imaa001)) = '" & strERP_imaa001 & "'" & _ // ' " And Upper(Trim(tran_time)) = '" & strERP_tran_time & "'" // ' colSQL_T100.Add(strSQL) // ' colSQL_T100_Rows.Add(1) // ' '-------------------------------------------------- // ' '六、T100中介資料庫異動(EX_drvIF) // ' '-------------------------------------------------- // ' Call ExecuteSQLNoneQuery_ChkRowCount(strERPDataBaseType, strERPconnectionString, colSQL_T100, colSQL_T100_Rows) // 'End Try // 'lblExitTry_2_NextRow: // ' '當該筆中介交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 // ' If aryMES_Message.Count > 0 Then // ' '''匯整記錄中介表的PK資訊. // ' '因從錯誤訊息不一定看的出哪一筆中介表交易記錄fail. // ' '故失敗訊息連同中介表的必要資訊一併匯整. (Email要放詳細資訊) // ' '(1) // ' aryReturnMessage.Add("tran_time:" & strERP_tran_time & ", imaa001:" & strERP_imaa001 & ", imaa004:" & strERP_imaa004) // ' '(2) // ' For Each strErr As String In aryMES_Message // ' aryReturnMessage.Add(strErr) // ' Next strErr // ' End If // ' '計算失敗筆數 // ' If strMES_Result = "9" Then // ' If strERP_imaa004 = "A" Then // ' intFailCount_PRD += 1 // ' Else // ' intFailCount_MTL += 1 // ' End If // ' End If // ' '不管成功或失敗,繼續下一筆。 // ' Next drvIF // 'End If // 'Return // ProductIntegration_2MES_PRD = 0 // Catch ex As Exception // aryMES_Message.Add(ex.Message.ToString) // Throw // Finally // If Not drTemp Is Nothing Then drTemp.Close() // End Try // End Function // Private Function ProductIntegration_2MES_PRD(ByRef cnnMES As OleDb.OleDbConnection, _ // ByRef colSQL As Collection, ByRef colSQL_Rows As Collection, _ // ByRef aryMES_Message As ArrayList, _ // ByRef colRecUnitInfo As Collection, _ // ByVal EventTime As DateTime, _ // ByVal drvIF As DataRowView) As Integer // ProductIntegration_2MES_PRD = -1 'Return -1:fail,0:Success // '固定處理條件 ,imaa004料件類別=A(組合/加工品). // 'aryMES_Message ,收集單筆中介交易記錄的錯誤記錄. // 'colRecUnitInfo ,必須傳入單位資料,以判斷是否需Insert資料. // 'EventTime ,請傳入執行時間. // 'drvIF ,傳入單筆資料列,此Function進行檢查及sqlcommand收集. // Dim drTemp As OleDb.OleDbDataReader // Dim strSQL As String // Try // '宣告拋轉中介表資料使用變數 // Dim strERP_ProductNo, strERP_ProductName, strERP_UnitNo, strERP_status As String // Dim strERP_ProductVersion As String = "1" '未傳入時預設為1。 // 'MES資料使用變數 // Dim strReturnUnitType As String // '預設值 // Dim strProductType As String = "PRODUCT" '給予預設值"PRODUCT",若不存在則自動新增產品類別. // Dim intIssueState As Integer = 0 // Dim intCurVersion As Integer = 0 // Dim strSpecNo As String = "N/A" // '----------------------------------------------------------- // '固定檢查ProductType='PRODUCT'資料,若不存在則自動新增。 // '----------------------------------------------------------- // If AddProductType(cnnMES, colSQL, colSQL_Rows, aryMES_Message, strProductType, _ // strERPCreator, EventTime, "AutoRun建立") < 0 Then Exit Try // '----------------------------------------------------------- // '取出各欄位資料 // '----------------------------------------------------------- // '轉大寫 // strERP_ProductNo = drvIF("imaa001").ToString.Trim.ToUpper // strERP_ProductVersion = drvIF("imaa002").ToString.Trim.ToUpper // strERP_ProductName = drvIF("imaal003").ToString.Trim // strERP_status = drvIF("status").ToString.Trim.ToUpper // '轉小寫 // strERP_UnitNo = drvIF("imae016").ToString.Trim.ToLower 'ToLower // '----------------------------------------------------------- // '產品編號合理性檢查 // '----------------------------------------------------------- // '(1)檢查ProductNo是否已存在於tblPRDType(因與ProductType共用Property故編號不可一樣). // strSQL = "Select ProductType From tblPRDType Where ProductType='" & strERP_ProductNo & "'" // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnMES) // drTemp = ExecuteSQLQuery_Reader() // If drTemp.Read Then // aryMES_Message.Add("產品編號(imaa001):" & strERP_ProductNo & ", 已存在於MES產品類別主檔, 產品編號與產品類別不允許相同!!") // End If // drTemp.Close() // cmmTemp.Dispose() // '(2)檢查ProductNo是否已存在於tblPRDModuleBasis(因與ModuleNo共用部份Table,故號不可一樣) // strSQL = "Select ModuleNo From tblPRDModuleBasis Where ModuleNo='" & strERP_ProductNo & "'" // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnMES) // drTemp = ExecuteSQLQuery_Reader() // If drTemp.Read Then // aryMES_Message.Add("產品編號(imaa001):" & strERP_ProductNo & ", 已存在於MES模組主檔, 產品編號與模組編號不允許相同!!") // End If // drTemp.Close() // cmmTemp.Dispose() // '(3)檢查物料主檔: // '因產品可能是半成品,會當成料來使用, // '在BOM表(tblPRDBOM)、用料清單(tblOEMOMaterialList)及kcWIP.clsLot的處理邏輯上都沒有加上MaterialLevel. // '故ProductNo不可與MaterialNo一樣. // strSQL = "Select MaterialNo From tblMTLMaterialBasis Where MaterialNo ='" & strERP_ProductNo & "'" // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnMES) // drTemp = ExecuteSQLQuery_Reader() // If drTemp.Read Then // aryMES_Message.Add("產品編號(imaa001):" & strERP_ProductNo & ", 已存在於MES物料主檔, 物料編號與產品編號不允許相同!! 半成品可會當成料來使用!!") // End If // drTemp.Close() // cmmTemp.Dispose() // '----------------------------------------------------------- // '檢查單位資料,若不存在則自動新增。 // '----------------------------------------------------------- // strReturnUnitType = "" // If Not colRecUnitInfo.Contains(strERP_UnitNo) Then // If AddUnitBasis(cnnMES, colSQL, colSQL_Rows, aryMES_Message, strERP_UnitNo, _ // strERPCreator, EventTime, "AutoRun建立", strReturnUnitType) = 0 Then // colRecUnitInfo.Add(strReturnUnitType, strERP_UnitNo) '記錄UnitType,UnitNo // Else // If aryMES_Message.Count > 0 Then Exit Try // End If // Else // strReturnUnitType = colRecUnitInfo(strERP_UnitNo) // End If // '-----------------------------------------------------------# // Select Case strERP_status // Case "A" 'A:新增 // '檢查是否有此產品設定 // strSQL = "Select ProductNo From tblPRDProductBasis " & _ // " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "'" // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnMES) // drTemp = ExecuteSQLQuery_Reader // If Not drTemp.Read Then // '----------------------------------------------------------- // '新增MES產品設定 // '----------------------------------------------------------- // strSQL = "Insert Into tblPRDProductBasis " & _ // "(ProductNo,ProductVersion,ProductName,ProductType," & _ // " UnitNo,UnitType,SpecNo,Description," & _ // " IssueState,CurVersion,Creator,CreateDate)" // strSQL += " Values('" & strERP_ProductNo & "','" & strERP_ProductVersion & "','" & strERP_ProductName & "','" & strProductType & "','" & _ // strERP_UnitNo & "','" & strReturnUnitType & "','" & strSpecNo & "','AutoRun建立'," & _ // intIssueState & "," & intCurVersion & ",'" & strERPCreator & "'," & _ // "To_Date('" & Format(EventTime, "yyyy/MM/dd H:mm:ss") & "','YYYY/MM/DD HH24:MI:SS'))" // colSQL.Add(strSQL) // colSQL_Rows.Add(1) // Else // aryMES_Message.Add("產品編號(imaa001):" & strERP_ProductNo & ", 產品版本(imaa002):" & strERP_ProductVersion & ", 已存在MES, 不允許新增!!") // End If // drTemp.Close() // cmmTemp.Dispose() // Case "U" 'U:修改 // '檢查是否有此產品設定 // strSQL = "Select IssueState From tblPRDProductBasis " & _ // " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "'" // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnMES) // drTemp = ExecuteSQLQuery_Reader // If drTemp.Read Then // 'ERPws標準功能不論IssueState為何皆允許修改. // '----------------------------------------------------------- // '修改MES產品設定 // '----------------------------------------------------------- // strSQL = "Update tblPRDProductBasis Set " & _ // " UnitNo='" & strERP_UnitNo & "'" & _ // ",UnitType='" & strReturnUnitType & "'" & _ // ",ProductName='" & strERP_ProductName & "'" // '注意事項:產品與物料,當IssueState=-1的更新方式不同. // 'MES已存在之資料IssueState如果是-1,ERP資料再次拋轉時,IssueState則更新為"0". // If drTemp("IssueState") = -1 Then strSQL += ",IssueState = 0" // strSQL += " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "'" // colSQL.Add(strSQL) // colSQL_Rows.Add(1) // Else // aryMES_Message.Add("產品編號(imaa001):" & strERP_ProductNo & ", 產品版本(imaa002):" & strERP_ProductVersion & ", 不存在MES, 不允許修改!!") // End If // drTemp.Close() // cmmTemp.Dispose() // Case "D" 'D:刪除 // '檢查是否有此產品設定 // strSQL = "Select IssueState From tblPRDProductBasis " & _ // " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "'" // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnMES) // drTemp = ExecuteSQLQuery_Reader // If drTemp.Read Then // If drTemp("IssueState") = 0 Then // '----------------------------------------------------------- // '先刪除MES產品相關設定 // '----------------------------------------------------------- // '1.tblPRDProductProperty // strSQL = "Delete From tblPRDProductProperty " & _ // " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "'" // colSQL.Add(strSQL) // colSQL_Rows.Add(-1) // '2.tblPRDProductProcess // strSQL = "Delete From tblPRDProductProcess " & _ // " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "'" // colSQL.Add(strSQL) // colSQL_Rows.Add(-1) // '3.tblPRDOPAttrib // 'Parameter:Item // strSQL = "Delete From tblPRDOPAttrib " & _ // " Where SerialNo In (Select SerialNo From tblPRDOP " & _ // " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "')" // colSQL.Add(strSQL) // colSQL_Rows.Add(-1) // '4.tblPRDOPRule // 'Parameter:Rule // strSQL = "Delete From tblPRDOPRule " & _ // " Where SerialNo In (Select SerialNo From tblPRDOP " & _ // " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "')" // colSQL.Add(strSQL) // colSQL_Rows.Add(-1) // '5.tblPRDOPEQPRecipe // 'Parameter:EQPRecipe // strSQL = "Delete From tblPRDOPEQPRecipe " & _ // " Where SerialNo In (Select SerialNo From tblPRDOP " & _ // " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "')" // colSQL.Add(strSQL) // colSQL_Rows.Add(-1) // '6.tblPRDOpQCItemParameter // '2008/06/02,sammi.取消產品參數QCItem的參數設定功能,由SPC線上管制要因來變更抽樣計畫功能處理. // '暫時先不移處,因FK會造成無法刪除. // 'Parameter:QCItem Parameter // strSQL = "Delete From tblPRDOpQCItemParameter " & _ // " Where SerialNo In (Select SerialNo From tblPRDOP " & _ // " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "')" // colSQL.Add(strSQL) // colSQL_Rows.Add(-1) // '7.tblPRDOP // strSQL = "Delete From tblPRDOP " & _ // " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "'" // colSQL.Add(strSQL) // colSQL_Rows.Add(-1) // '8.tblPRDBOM // strSQL = "Delete From tblPRDBOM " & _ // " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "'" // colSQL.Add(strSQL) // colSQL_Rows.Add(-1) // '9.tblPRDOPBusinessRuleRelation // strSQL = "Delete From tblPRDOPBusinessRuleRelation " & _ // " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "'" // colSQL.Add(strSQL) // colSQL_Rows.Add(-1) // '10.tblPRDOPRuleXml_CLOB // '2006/05/11,sammi.處理DataGuard not support Long Type probleam. // If Not objDBcom.DBSupportLongType Then // strSQL = "Delete From tblPRDOPRuleXml_CLOB " & _ // " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "'" // colSQL.Add(strSQL) // colSQL_Rows.Add(-1) // End If // '11.tblPRDOPBusinessRule // strSQL = "Delete From tblPRDOPBusinessRule " & _ // " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "'" // colSQL.Add(strSQL) // colSQL_Rows.Add(-1) // '12.tblPRDOPDescription // strSQL = "Delete From tblPRDOPDescription " & _ // " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "'" // colSQL.Add(strSQL) // colSQL_Rows.Add(-1) // '13.tblPRDOPArea // strSQL = "Delete From tblPRDOPArea " & _ // " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "'" // colSQL.Add(strSQL) // colSQL_Rows.Add(-1) // '14.tblPRDAccessory // strSQL = "Delete From tblPRDAccessory" & _ // " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "'" // colSQL.Add(strSQL) // colSQL_Rows.Add(-1) // '15.tblPRDOPSubOP // ' 用 途:刪除產品作業站中子工序,因晶發專案客製於標準版中 // ' 撰寫人員:Sam.Hsu // ' 建立日期:2008/06/13 // strSQL = "Delete From tblPRDOPSubOP " & _ // " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "'" // colSQL.Add(strSQL) // colSQL_Rows.Add(-1) // '16.tblPRDRecipe // strSQL = "Delete From tblPRDRecipe " & _ // " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "'" // colSQL.Add(strSQL) // colSQL_Rows.Add(-1) // '17.tblPRDQCItem // strSQL = "Delete From tblPRDQCItem " & _ // " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "'" // colSQL.Add(strSQL) // colSQL_Rows.Add(-1) // '18.tblPRDProductSerialRuleBasis // strSQL = "Delete From tblPRDProductSerialRuleBasis " & _ // " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "'" // colSQL.Add(strSQL) // colSQL_Rows.Add(-1) // '19.tblPRDProductSerialRuleDetail // strSQL = "Delete From tblPRDProductSerialRuleDetail " & _ // " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "'" // colSQL.Add(strSQL) // colSQL_Rows.Add(-1) // '20.tblPRDPackingAccessory // strSQL = "Delete From tblPRDPackingAccessory " & _ // " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "'" // colSQL.Add(strSQL) // colSQL_Rows.Add(-1) // '21.tblPRDProductLabelRuleBasis // strSQL = "Delete From tblPRDProductLabelRuleBasis " & _ // " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "'" // colSQL.Add(strSQL) // colSQL_Rows.Add(-1) // '22.tblPRDProductLabelRuleDetail // strSQL = "Delete From tblPRDProductLabelRuleDetail " & _ // " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "'" // colSQL.Add(strSQL) // colSQL_Rows.Add(-1) // '22.tblPRDProductLabelRuleDetail_M // strSQL = "Delete From tblPRDProductLabelRuleDetail_M " & _ // " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "'" // colSQL.Add(strSQL) // colSQL_Rows.Add(-1) // '23.tblPRDRunTimeSetup // strSQL = "Delete From tblPRDRunTimeSetup " & _ // " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "'" // colSQL.Add(strSQL) // colSQL_Rows.Add(-1) // '----------------------------------------------------------- // '刪除MES產品設定 // '----------------------------------------------------------- // strSQL = "Delete From tblPRDProductBasis " & _ // " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "'" // colSQL.Add(strSQL) // colSQL_Rows.Add(1) // Else // '----------------------------------------------------------- // '作廢MES產品設定 // '----------------------------------------------------------- // strSQL = "Update tblPRDProductBasis Set " & _ // " IssueState=-1" & _ // " Where ProductNo='" & strERP_ProductNo & "'" & _ // " And ProductVersion='" & strERP_ProductVersion & "'" // colSQL.Add(strSQL) // colSQL_Rows.Add(1) // End If // Else // aryMES_Message.Add("產品編號(imaa001):" & strERP_ProductNo & ", 產品版本(imaa002):" & strERP_ProductVersion & ", 不存在MES, 不允許刪除!!") // End If // drTemp.Close() // cmmTemp.Dispose() // Case Else // aryMES_Message.Add("ERP資料狀態(Status):" & strERP_status & "無效, 不允許執行!!") // End Select // If aryMES_Message.Count > 0 Then Exit Try // 'Return // ProductIntegration_2MES_PRD = 0 // Catch ex As Exception // aryMES_Message.Add(ex.Message.ToString) // Throw // Finally // If Not drTemp Is Nothing Then drTemp.Close() // End Try // End Function // Private Function ProductIntegration_2MES_MTL(ByRef cnnMES As OleDb.OleDbConnection, _ // ByRef colSQL As Collection, ByRef colSQL_Rows As Collection, _ // ByRef aryMES_Message As ArrayList, _ // ByRef colRecUnitInfo As Collection, _ // ByVal EventTime As DateTime, _ // ByVal drvIF As DataRowView) As Integer // ProductIntegration_2MES_MTL = -1 'Return -1:fail,0:Success // '固定處理條件 ,imaa004料件類別=M(材料/零件/商品). // 'aryMES_Message ,收集單筆中介交易記錄的錯誤記錄. // 'colRecUnitInfo ,必須傳入單位資料,以判斷是否需Insert資料. // 'EventTime ,請傳入執行時間. // 'drvIF ,傳入單筆資料列,此Function進行檢查及sqlcommand收集. // Dim cmmTemp2 As OleDb.OleDbCommand // Dim drTemp, drTemp2 As OleDb.OleDbDataReader // Dim strSQL As String // Try // '宣告拋轉中介表資料使用變數 // Dim strERP_MaterialNo, strERP_MaterialName, strERP_MaterialSpec, strERP_UnitNo, strERP_status As String // 'MES資料使用變數 // Dim strReturnUnitType As String // '預設值 // Dim strMaterialType As String = "MATERIL" '給予預設值"MATERIL",若不存在則自動新增物料類別. // Dim intPutInPlace As Integer = 3 '投料點:預設為3(工單). // Dim intCountWay As Integer = 1 '計量方法:預設為1(實際用量). // Dim intCheckLotNo As Integer = 1 '物料批號檢查:預設為0(不檢查批號). // Dim intIssueState As Integer = 0 // Dim strSpecNo As String = "N/A" // '----------------------------------------------------------- // '固定檢查MaterialType='MATERIL'資料,若不存在則自動新增。 // '----------------------------------------------------------- // If AddMaterialType(cnnMES, colSQL, colSQL_Rows, aryMES_Message, strMaterialType, _ // strERPCreator, EventTime, "AutoRun建立") < 0 Then Exit Try // '----------------------------------------------------------- // '取出各欄位資料 // '----------------------------------------------------------- // '轉大寫 // strERP_MaterialNo = drvIF("imaa001").ToString.Trim.ToUpper // strERP_MaterialName = drvIF("imaal003").ToString.Trim.ToUpper // strERP_MaterialSpec = drvIF("imaal004").ToString.Trim.ToUpper // strERP_status = drvIF("status").ToString.Trim.ToUpper // '轉小寫 // strERP_UnitNo = drvIF("imae016").ToString.Trim.ToLower 'ToLower // '----------------------------------------------------------- // '物料編號合理性檢查 // '----------------------------------------------------------- // '(1)檢查MaterialNo是否已存在於tblMTLMaterialType(因與MaterialType共用Property故編號不可一樣) // strSQL = "Select MaterialType From tblMTLMaterialType Where MaterialType='" & strERP_MaterialNo & "'" // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnMES) // drTemp = ExecuteSQLQuery_Reader() // If drTemp.Read Then // aryMES_Message.Add("物料編號(imaa001):" & strERP_MaterialNo & ", 已存在於MES物料類別主檔, 物料編號與物料類別不允許相同!!") // End If // drTemp.Close() // cmmTemp.Dispose() // '(2)檢查產品主檔: // '因產品可能是半成品,會當成料來使用, // '在BOM表(tblPRDBOM)、用料清單(tblOEMOMaterialList)及kcWIP.clsLot的處理邏輯上都沒有加上MaterialLevel. // '故MaterialNo不可與ProductNo一樣. // strSQL = "Select ProductNo From tblPRDProductBasis Where ProductNo ='" & strERP_MaterialNo & "'" // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnMES) // drTemp = ExecuteSQLQuery_Reader() // If drTemp.Read Then // aryMES_Message.Add("物料編號(imaa001):" & strERP_MaterialNo & ", 已存在於MES產品主檔, 物料編號與產品編號不允許相同!! 半成品可會當成料來使用!!") // End If // drTemp.Close() // cmmTemp.Dispose() // '----------------------------------------------------------- // '檢查單位資料,若不存在則自動新增。 // '----------------------------------------------------------- // strReturnUnitType = "" // If Not colRecUnitInfo.Contains(strERP_UnitNo) Then // If AddUnitBasis(cnnMES, colSQL, colSQL_Rows, aryMES_Message, strERP_UnitNo, _ // strERPCreator, EventTime, "AutoRun建立", strReturnUnitType) = 0 Then // colRecUnitInfo.Add(strReturnUnitType, strERP_UnitNo) '記錄UnitType,UnitNo // Else // If aryMES_Message.Count > 0 Then Exit Try // End If // Else // strReturnUnitType = colRecUnitInfo(strERP_UnitNo) // End If // '-----------------------------------------------------------# // Select Case strERP_status // Case "A" 'A:新增 // '檢查是否有此物料設定 // strSQL = "Select MaterialNo From tblMTLMaterialBasis " & _ // " Where MaterialNo='" & strERP_MaterialNo & "'" // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnMES) // drTemp = ExecuteSQLQuery_Reader // If Not drTemp.Read Then // '----------------------------------------------------------- // '新增MES物料設定 // 'MaterialName,MaterialSpec 必要欄位. // '----------------------------------------------------------- // strSQL = "Insert Into tblMTLMaterialBasis " & _ // "(MaterialNo, MaterialName, MaterialSpec, MaterialType," & _ // " PutInPlace, CountWay, CheckLotNo, UnitType, UnitNo, Description," & _ // " IssueState, Creator, CreateDate)" // strSQL += " Values('" & strERP_MaterialNo & "','" & strERP_MaterialName & "','" & strERP_MaterialSpec & "','" & strMaterialType & "'," & _ // intPutInPlace & "," & intCountWay & "," & intCheckLotNo & ",'" & strReturnUnitType & "','" & strERP_UnitNo & "','AutoRun建立'," & _ // intIssueState & ",'" & strERPCreator & "'," & _ // "To_Date('" & Format(EventTime, "yyyy/MM/dd H:mm:ss") & "','YYYY/MM/DD HH24:MI:SS'))" // colSQL.Add(strSQL) // colSQL_Rows.Add(1) // Else // aryMES_Message.Add("物料編號(imaa001):" & strERP_MaterialNo & ", 已存在MES, 不允許新增!!") // End If // drTemp.Close() // cmmTemp.Dispose() // Case "U" 'U:修改 // '檢查是否有此物料設定 // strSQL = "Select IssueState From tblMTLMaterialBasis " & _ // " Where MaterialNo='" & strERP_MaterialNo & "'" // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnMES) // drTemp = ExecuteSQLQuery_Reader // If drTemp.Read Then // 'ERPws標準功能不論IssueState為何皆允許修改. // '----------------------------------------------------------- // '修改MES物料設定 // '----------------------------------------------------------- // strSQL = "Update tblMTLMaterialBasis Set " & _ // " UnitNo='" & strERP_UnitNo & "'" & _ // ",UnitType='" & strReturnUnitType & "'" // '注意事項:產品與物料,當IssueState=-1的更新方式不同. // 'MES已存在之資料IssueState如果是-1,ERP資料再次拋轉時,IssueState則更新為"2". // If drTemp("IssueState") = -1 Then strSQL += ",IssueState = 2" // strSQL += " Where MaterialNo='" & strERP_MaterialNo & "'" // colSQL.Add(strSQL) // colSQL_Rows.Add(1) // Else // aryMES_Message.Add("物料編號(imaa001):" & strERP_MaterialNo & ", 不存在MES, 不允許修改!!") // End If // drTemp.Close() // cmmTemp.Dispose() // Case "D" 'D:刪除 // '檢查是否有此物料設定 // strSQL = "Select IssueState From tblMTLMaterialBasis " & _ // " Where MaterialNo='" & strERP_MaterialNo & "'" // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnMES) // drTemp = ExecuteSQLQuery_Reader // If drTemp.Read Then // '----------------------------------------------------------- // '檢查MES產品相關設定. // '參考自kcMTL.clsMTLBasis.DelMaterialBasis(). // '----------------------------------------------------------- // '(1)檢查MaterialNo是否已存在於MaterialList. // strSQL = "Select MONo From tblOEMOMaterialList" & _ // " Where MaterialLevel=0" & _ // " And MaterialNo='" & strERP_MaterialNo & "'" // cmmTemp2 = New OleDb.OleDbCommand(strSQL, cnnMES) // drTemp2 = cmmTemp2.ExecuteReader() // If drTemp2.Read Then // aryMES_Message.Add("物料編號(imaa001):" & strERP_MaterialNo & ", 存在於MES工單物料清單(工單編號:" & drTemp2("MONo") & ")!!") // End If // drTemp2.Close() // cmmTemp2.Dispose() // '(2)檢查MaterialNo是否已存在於BOM. // strSQL = "Select ProductNo,ProductVersion From tblPRDBOM " & _ // " Where NodeType=0 " & _ // " And NodeNo='" & strERP_MaterialNo & "'" // cmmTemp2 = New OleDb.OleDbCommand(strSQL, cnnMES) // drTemp2 = cmmTemp2.ExecuteReader() // If drTemp2.Read Then // aryMES_Message.Add("物料編號(imaa001):" & strERP_MaterialNo & ", 存在於MES產品BOM表(產品編號:" & drTemp2("ProductNo") & ",產品版本:" & drTemp2("ProductVersion") & ")!!") // End If // drTemp2.Close() // cmmTemp2.Dispose() // 'PS.還有很多相關Table都未檢查,也未設FK.(kcMTL.clsMTLBasis註解) // '-----------------------------------------------------------# // If drTemp("IssueState") = 0 Then // '----------------------------------------------------------- // '先刪除MES物料相關設定 // '----------------------------------------------------------- // '1.tblMTLMaterialProperty // strSQL = "Delete From tblMTLMaterialProperty " & _ // " Where MaterialNo='" & strERP_MaterialNo & "'" // colSQL.Add(strSQL) // colSQL_Rows.Add(-1) // '2.tblMTLMaterialVendorMap // strSQL = "Delete From tblMTLMaterialVendorMap " & _ // " Where MaterialNo='" & strERP_MaterialNo & "'" // colSQL.Add(strSQL) // colSQL_Rows.Add(-1) // '3.tblMTLMaterialGroupDetail // strSQL = "Delete From tblMTLMaterialGroupDetail " & _ // " Where MaterialNo='" & strERP_MaterialNo & "'" // colSQL.Add(strSQL) // colSQL_Rows.Add(-1) // '----------------------------------------------------------- // '刪除MES物料設定 // '----------------------------------------------------------- // strSQL = "Delete From tblMTLMaterialBasis " & _ // " Where MaterialNo='" & strERP_MaterialNo & "'" // colSQL.Add(strSQL) // colSQL_Rows.Add(1) // Else // '----------------------------------------------------------- // '作廢MES物料設定 // '----------------------------------------------------------- // strSQL = "Update tblMTLMaterialBasis Set " & _ // " IssueState=-1" & _ // " Where MaterialNo='" & strERP_MaterialNo & "'" // colSQL.Add(strSQL) // colSQL_Rows.Add(1) // End If // Else // aryMES_Message.Add("物料編號(imaa001):" & strERP_MaterialNo & ", 不存在MES, 不允許刪除!!") // End If // drTemp.Close() // cmmTemp.Dispose() // Case Else // aryMES_Message.Add("ERP資料狀態(Status):" & strERP_status & "無效, 不允許執行!!") // End Select // If aryMES_Message.Count > 0 Then Exit Try // 'Return // ProductIntegration_2MES_MTL = 0 // Catch ex As Exception // aryMES_Message.Add(ex.Message.ToString) // Throw // Finally // If Not cmmTemp2 Is Nothing Then cmmTemp2.Dispose() // If Not drTemp Is Nothing Then drTemp.Close() // If Not drTemp2 Is Nothing Then drTemp2.Close() // End Try // End Function #endregion #region MES InterFaceTable 轉入 MES正式區(客戶、物料供應商) // 功 能: MES InterFaceTable 轉入 MES正式區(客戶、物料供應商) // 傳回值: success(成功), fail(失敗) private string CustVendorIntegration(Collection colParameters = null) { string CustVendorIntegrationRet = default(string); // =========================================================== // 宣告 DB相關 變數 // =========================================================== var cnnERP = default(IDbConnection); // T100中介DB使用(ERP) var cnnMES = default(IDbConnection); // MESDB使用 var drTemp = default(DbDataReader); //var daTemp = new System.Data.OleDb.OleDbDataAdapter(); var dsTemp = new DataSet(); Collection colSQL_T100 = new Collection(), colSQL_T100_Rows = new Collection(); // T100中介DB(MES回填處理記錄). Collection colSQL_2MES = new Collection(), colSQL_2MES_Rows = new Collection(); // MES正式異動資料(主要). string strSQL; // =========================================================== // 宣告 AutoRunJob設定及執行記錄 變數 // =========================================================== string strParameter01 = ""; // 參數一,預設此功能fail通知EMAIL群組。 string strSubject, strBody; // 寄送通知資訊 // AutorunJob拋轉資訊 string strReturnMessage = ""; // 錯誤訊息(tblMESAutoRunLog.ReturnMessage),Chr(10)分隔錯誤項目。 var aryReturnMessage = new ArrayList(); // Catch Error Message (Exception及MES判定錯誤訊息)。 int intFailCount_Vendor = 0; // Vendor拋轉失敗筆數 int intFailCount_Customer = 0; // Customer拋轉失敗筆數 // =========================================================== // 宣告 其他 變數 // =========================================================== DateTime datNow; do { try { // -------------------------------------------------- // 一、取得參數 // -------------------------------------------------- // Parameter01為參數一 // 作為Mail通知群組(GroupNo),放在最前面防止連線失敗無法寄送通知。 if (colParameters.Contains("Parameter01")) { strParameter01 = colParameters["Parameter01"].ToString().Trim(); } // If strParameter01 = "" Then // ProductIntegration = "fail;使用者群?未?定!!(tblMESAutorunJob.Parameter01)" // Exit Function '離開 Function。 // End If // -------------------------------------------------- // 二、連線 DB // -------------------------------------------------- // T100中介DB cnnERP = CreateConnection(strERPconnectionString); // MES DB cnnMES = CreateConnection(strConnectionString); // 取得ERPSetting if (!GetERPSetting(ref dtERPSetting, "T100")) { break; } // -------------------------------------------------- // 檢查參數一 Mail通知群組 是否已設定. // -------------------------------------------------- if (!string.IsNullOrEmpty(strParameter01) && ERP2MES_MailNoticeChk(ref cnnMES, ref aryReturnMessage, strParameter01) < 0) { CustVendorIntegrationRet = Conversions.ToString("fail;" + aryReturnMessage[0]); return CustVendorIntegrationRet; // 離開 Function。 } if (aryReturnMessage.Count > 0) break; // Exit Try /// 取出 MESSERIES_T100.中介表資料. // -------------------------------------------------- // 二、MESSERIES_T100.中介表資料,請依序處理: // Loop 1.交易對象主檔 MES_PMMA_T:(必須優先) // Loop 2.交易對象主檔多語言檔 MES_PMAAL_T // Loop 3.交易對象料號對應檔 MES_PMAO_T // 每筆交易明細: // MES_Result為空白代表未拋轉。 // 取出後立即異動DB,無論成功或失敗(不跳離),都繼續執行下一筆。 // -------------------------------------------------- string MES_PMMA_T_1 = "MES_PMAA_T"; string MES_PMAAL_T_2 = "MES_PMAAL_T"; string MES_PMAO_T_3 = "MES_PMAO_T"; DataRow[] drSel_IF; // -------------------------------------------------- // Loop 1.交易對象主檔 MES_PMMA_T // -------------------------------------------------- strSQL = "Select T1.*, T1.pmaa002 As pmaa002_Upper " + " From " + MES_PMMA_T_1 + " T1" + " Where T1.MES_Result Is Null" + " And T1.pmaaent ='" + ERP_EntID + "' "; //cmmTempERP = new IDbCommand(strSQL, cnnERP); //daTemp.SelectCommand = cmmTempERP; //daTemp.Fill(dsTemp, MES_PMMA_T_1); //cmmTempERP.Dispose(); ExecuteSQLQuery_Adapter(strSQL, dsTemp, MES_PMMA_T_1, cnnERP); if (!(dsTemp == null) && dsTemp.Tables[MES_PMMA_T_1].Rows.Count > 0) { // 中介表資料來源說明: // 客戶及物料供應商皆在此TABLE,以pmaa002做區分 // 1.當pmaa002 = '1'時,此交易對象為供應商 drSel_IF = dsTemp.Tables[MES_PMMA_T_1].Select("pmaa002_Upper = '1'", "tran_Time,pmaa001"); if (!(drSel_IF == null) && drSel_IF.Length > 0) { // intFailCount_Vendor if (CustVendorIntegration_ERP2MES_Vendor(ref cnnMES, ref aryReturnMessage, ref intFailCount_Vendor, MES_PMMA_T_1, drSel_IF) < 0) { if (aryReturnMessage.Count == 0) // 避免不明原因,執行FAIL又沒收集到項目. { aryReturnMessage.Add("中介表:" + MES_PMMA_T_1 + ", 交易對象(pmaa002):1, 供應商, 拋轉執行失敗!!"); } } } // 2.當pmaa002 = '2'時,此交易對象為客戶 drSel_IF = dsTemp.Tables[MES_PMMA_T_1].Select("pmaa002_Upper = '2'", "tran_Time,pmaa001"); if (!(drSel_IF == null) && drSel_IF.Length > 0) { // intFailCount_Customer if (CustVendorIntegration_ERP2MES_Customer(ref cnnMES, ref aryReturnMessage, ref intFailCount_Customer, MES_PMMA_T_1, drSel_IF) < 0) { if (aryReturnMessage.Count == 0) // 避免不明原因,執行FAIL又沒收集到項目. { aryReturnMessage.Add("中介表:" + MES_PMMA_T_1 + ", 交易對象(pmaa002):2, 客戶, 拋轉執行失敗!!"); } } } string strIfWhereCond_PK; string strMES_MESSAGE; // 錯誤訊息(中介表.MES_MESSAGE),Chr(10)分隔錯誤項目。 // 3.當pmaa002 交易對象不正確, 資料報錯. drSel_IF = dsTemp.Tables[MES_PMMA_T_1].Select("pmaa002_Upper <> '1' And pmaa002_Upper <> '2'", "tran_Time,pmaa002"); foreach (DataRow drIF in drSel_IF) { datNow = DateTime.Now; // Now strMES_MESSAGE = Conversions.ToString("交易對象(pmaa002):" + drIF["pmaa002"] + ", 不正確!!"); // ----------------------------------------------------------- // 正常程序 // 回填中介表資訊,(注意)各個資料表的PK不同。 // ----------------------------------------------------------- strIfWhereCond_PK = Conversions.ToString(" Where pmaa001 = '" + drIF["pmaa001"] + "'" + " And tran_time = '" + drIF["tran_time"] + "'" + " And pmaaent ='" + ERP_EntID + "' "); if (Update_T100_IfTable(ref colSQL_T100, ref colSQL_T100_Rows, ref aryReturnMessage, MES_PMMA_T_1, strIfWhereCond_PK, "9", datNow, strMES_MESSAGE) < 0) { aryReturnMessage.Add("中介表:" + MES_PMMA_T_1 + "(交易對象), " + strMES_MESSAGE); } } } // -------------------------------------------------- // Loop 2.交易對象主檔多語言檔 MES_PMAAL_T // -------------------------------------------------- strSQL = "Select T1.*" + " From " + MES_PMAAL_T_2 + " T1" + " Where T1.MES_Result Is Null" + " And T1.pmaal002 = '" + strLanguage_T100 + "'" + " And T1.pmaalent ='" + ERP_EntID + "' "; //cmmTempERP = new IDbCommand(strSQL, cnnERP); //daTemp.SelectCommand = cmmTempERP; //daTemp.Fill(dsTemp, MES_PMAAL_T_2); //cmmTempERP.Dispose(); ExecuteSQLQuery_Adapter(strSQL, dsTemp, MES_PMAAL_T_2, cnnERP); if (!(dsTemp == null) && dsTemp.Tables[MES_PMAAL_T_2].Rows.Count > 0) { // 中介表資料來源說明: /// 供應商及客戶皆在此TABLE,以pmaa002做區分 /// 1.當pmaa002 = '1'時,此交易對象為供應商 /// 2.當pmaa002 = '2'時,此交易對象為客戶 drSel_IF = dsTemp.Tables[MES_PMAAL_T_2].Select("", "tran_Time,pmaal001"); if (CustVendorIntegration_ERP2MES_Resource(ref cnnMES, ref aryReturnMessage, ref intFailCount_Vendor, MES_PMAAL_T_2, drSel_IF) < 0) { if (aryReturnMessage.Count == 0) // 避免不明原因,執行FAIL又沒收集到項目. { aryReturnMessage.Add("中介表:" + MES_PMAAL_T_2 + "(料件多語言檔), 拋轉執行失敗!!"); } } } // -------------------------------------------------- // Loop 3.交易對象料號對應檔 MES_PMAO_T // -------------------------------------------------- strSQL = "Select T1.*" + " From " + MES_PMAO_T_3 + " T1" + " Where T1.MES_Result Is Null" + " And T1.pmaoent ='" + ERP_EntID + "' "; //cmmTempERP = new IDbCommand(strSQL, cnnERP); //daTemp.SelectCommand = cmmTempERP; //daTemp.Fill(dsTemp, MES_PMAO_T_3); //cmmTempERP.Dispose(); ExecuteSQLQuery_Adapter(strSQL, dsTemp, MES_PMAO_T_3, cnnERP); if (!(dsTemp == null) && dsTemp.Tables[MES_PMAO_T_3].Rows.Count > 0) { // 中介表資料來源說明: /// 供應商及客戶皆在此TABLE,以pmaa002做區分 /// 1.當pmaa002 = '1'時,此交易對象為供應商 /// 2.當pmaa002 = '2'時,此交易對象為客戶 drSel_IF = dsTemp.Tables[MES_PMAO_T_3].Select("", "tran_Time,pmao001"); if (CustVendorIntegration_ERP2MES_MTLVendorMap(ref cnnMES, ref aryReturnMessage, ref intFailCount_Vendor, MES_PMAO_T_3, drSel_IF) < 0) { if (aryReturnMessage.Count == 0) // 避免不明原因,執行FAIL又沒收集到項目. { aryReturnMessage.Add("中介表:" + MES_PMAO_T_3 + "(交易對象料號對應檔), 拋轉執行失敗!!"); } } } } catch (Exception EX_AUT) { if (cnnERP == null) { aryReturnMessage.Add("T100中介DB(ERP) 連線失敗!!"); } else if (cnnMES == null) { aryReturnMessage.Add("MES DB 連線失敗!!"); } else { aryReturnMessage.Add("EX_AUT.Exception" + '\n' + EX_AUT.Message.ToString()); } } // 回傳結果 ReturnMessage,已一併在Finally處理。 finally { // -------------------------------------------------- // 七、回傳執行結果:succces 或 fail(ReturnMessage) // -------------------------------------------------- if (aryReturnMessage.Count == 0) { CustVendorIntegrationRet = "success"; } else { // 組合執行錯誤字串: Chr(10)分隔 strReturnMessage = ArrayList2String(ref aryReturnMessage); if ((strReturnMessage ?? "") == defString) { // 當錯誤字串組合失敗。補上 strReturnMessage = "ReturnMessage收集失敗!!"; } // If Not dsTemp.Tables(strIfTableName) Is Nothing Then // '整理中介表交易筆數 // Dim drSel As DataRow() // Dim strBody_Head As String = "" // strBody_Head = "T100中介表:" & strIfTableName & "匯入至MES正式區" & Chr(10) // drSel = dsTemp.Tables(strIfTableName).Select("imaa004='A'") // If drSel.Length > 0 Then // strBody_Head += "料件類別:A, 總筆數(" & drSel.Length & "),失敗筆數(" & intFailCount_PRD & ")" // End If // drSel = dsTemp.Tables(strIfTableName).Select("imaa004='M'") // If drSel.Length > 0 Then // strBody_Head += "料件類別:M, 總筆數(" & drSel.Length & "),失敗筆數(" & intFailCount_MTL & ")" // End If // '重組 strReturnMessage = 中介表交易筆數 & strReturnMessage // strReturnMessage = strBody_Head & Chr(10) & Chr(10) & strReturnMessage // 'Remove Table // dsTemp.Tables.Remove(strIfTableName) // dsTemp.AcceptChanges() // End If // tblMESAutoRunLog.ReturnMessage 長度4000限制. string strTemp = ""; if (strReturnMessage.Length > 4000) { // 自 strReturnMessage 中截取0-3991碼. strTemp = strReturnMessage.Substring(0, 3991) + "..."; } else { strTemp = strReturnMessage; } // //fail; CustVendorIntegrationRet = "fail;" + strTemp; } if (cnnERP != null) CloseConnection(cnnERP); if (cnnMES != null) CloseConnection(cnnMES); //if (daTemp != null) // daTemp.Dispose(); if (dsTemp != null) dsTemp.Dispose(); if (drTemp != null) drTemp.Close(); } } while (false); // -------------------------------------------------- // 八、當執行失敗,寄送 Email。必須有設定參數一。 // -------------------------------------------------- if (aryReturnMessage.Count > 0 && !string.IsNullOrEmpty(strParameter01)) { // strSubject = "[AUT]接收T100中介表:" & strIfTableName & "(產品、物料) 失敗 " strSubject = "[AUT]接收T100中介表:" + "(供應商、客戶) 失敗 "; strBody = Strings.Replace(strReturnMessage, Conversions.ToString('\n'), "
", Compare: CompareMethod.Text); // 寄送 Email if (ERP2MES_MailNotice(ref cnnMES, ref aryReturnMessage, strSubject, strParameter01, CInput(strBody)) < 0) { // '寄送不成功, ReturnMessage 再增加1項. // 'ProductIntegration += Chr(10) & aryReturnMessage.Item(aryReturnMessage.Count - 1).ToString // 寄送不成功, ReturnMessage 再增加1項. // tblMESAutoRunLog.ReturnMessage 長度4000限制. if (this.ProductIntegration().Length < 4000) { string strTemp = ""; strTemp = strReturnMessage; if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(strTemp + aryReturnMessage[aryReturnMessage.Count - 1].ToString().Length, 4000, false))) { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); } else { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); // 自 strTemp 中截取0-3991碼. strTemp = strTemp.Substring(0, 3991) + "..."; } // //fail; CustVendorIntegrationRet = "fail;" + strTemp; } } } return CustVendorIntegrationRet; // --------------------------------------------------# } private int CustVendorIntegration_ERP2MES_Vendor(ref IDbConnection cnnMES, ref ArrayList aryReturnMessage, ref int intReturnFailCount, string IfTableName, DataRow[] drSel_IF) { int CustVendorIntegration_ERP2MES_VendorRet = default(int); CustVendorIntegration_ERP2MES_VendorRet = -1; // Return -1:fail,0:Success // -------------------------------------------------- // 中介表 MES_PMMA_T, 拋轉 MES 供應商主檔. // -------------------------------------------------- // drSel_IF ,固定處理條件pmaa002料件類別=1(供應商). // aryMES_Message ,收集單筆中介交易記錄的錯誤記錄. // 新增供應商:VendorName一律填入"N/A", 後續由 mes_pmaal_t交易對象主檔多語言檔更新. // =========================================================== // 宣告 DB相關 變數 // =========================================================== var drTemp = default(DbDataReader); Collection colSQL_T100 = new Collection(), colSQL_T100_Rows = new Collection(); // T100中介DB(MES回填處理記錄). Collection colSQL_2MES = new Collection(), colSQL_2MES_Rows = new Collection(); // MES正式異動資料(主要). string strSQL; // 每筆中介交易記錄 string strIfWhereCond_PK; string strMES_Result; string strMES_MESSAGE; // 錯誤訊息(中介表.MES_MESSAGE),Chr(10)分隔錯誤項目。 var aryMES_Message = new ArrayList(); // 收集單筆中介交易記錄的錯誤記錄, Exception及MES判定錯誤訊息。 var datNow = DateTime.Now; // Now try { // 宣告拋轉中介表資料使用變數 string strERP_VendorNo, strERP_status; // 預設值 int intIssueState = 2; // -------------------------------------------------- // 必須以tran_Time順序,逐筆處理中介交易記錄。 // 每一筆交易記錄處理完成,立即變更 MESDB 及 MESSERIES_T100.中介表的MES處理記錄,綁在同一個交易裡. // (同包Transaction, 處理完畢後再一起commit) // 當某筆交易記錄處理失敗,立即變更 MESSERIES_T100.中介表的MES處理記錄,再接著處理下一筆記錄. // -------------------------------------------------- foreach (DataRow drIF in drSel_IF) { // reset datNow = DateTime.Now; // Now strIfWhereCond_PK = ""; strMES_Result = "9"; // 預設值 9 (MES處理結果, 成功回寫1, 失敗回寫9). strMES_MESSAGE = ""; // 錯誤訊息 aryMES_Message.Clear(); colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); colSQL_T100.Clear(); colSQL_T100_Rows.Clear(); do { try { // ----------------------------------------------------------- // 取出各欄位資料 // ----------------------------------------------------------- // 轉大寫 strERP_VendorNo = drIF["pmaa001"].ToString().Trim().ToUpper(); strERP_status = drIF["tran_status"].ToString().Trim().ToUpper(); // 檢查是否有此供應商設定 strSQL = "Select VendorNo,IssueState From tblMTLMaterialVendor " + " Where VendorNo='" + strERP_VendorNo + "'"; //cmmTemp = new IDbCommand(strSQL, cnnMES); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); bool exitTry = false; switch (strERP_status ?? "") { case "AU": // 有資料修改沒資料新增 { if (!drTemp.Read()) { // ----------------------------------------------------------- // 新增MES供應商設定 // ----------------------------------------------------------- strSQL = "Insert Into tblMTLMaterialVendor " + "(VendorNo,VendorName,IssueState," + " Description,Creator,CreateDate)"; strSQL += " Values('" + strERP_VendorNo + "','N/A'," + intIssueState + ",'AutoRun建立','" + strERPCreator + "'," + "To_Date('" + Strings.Format(datNow, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'))"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } // aryMES_Message.Add("供應商編號(pmaa001):" & strERP_VendorNo & ", 已存在MES, 不允許新增!!") // ERPws標準功能不論IssueState為何皆允許修改. // ----------------------------------------------------------- // 修改MES供應商設定 // ----------------------------------------------------------- else if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], -1, false))) { // MES已存在之資料IssueState如果是-1,ERP資料再次拋轉時,IssueState則更新為"0". strSQL = "Update tblMTLMaterialVendor Set " + " IssueState = " + intIssueState + " Where VendorNo='" + strERP_VendorNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } drTemp.Close(); //cmmTemp.Dispose(); break; } case "D": // D:刪除 { if (drTemp.Read()) { if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], 0, false))) { // ----------------------------------------------------------- // 先刪除ME供應商相關設定 // ----------------------------------------------------------- if (CustVendorIntegration_DelVendor(ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_VendorNo) < 0) { // GoTo lblExitTry_2_NextRow exitTry = true; break; } } else { // ----------------------------------------------------------- // 作廢MES供應商設定 // ----------------------------------------------------------- strSQL = "Update tblMTLMaterialVendor Set " + " IssueState=-1" + " Where VendorNo='" + strERP_VendorNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } } else { aryMES_Message.Add("供應商編號(pmaa001):" + strERP_VendorNo + ", 不存在MES, 不允許刪除!!"); } drTemp.Close(); //cmmTemp.Dispose(); break; } default: { aryMES_Message.Add("ERP資料狀態(Status):" + strERP_status + "無效, 不允許執行!!"); break; } } if (exitTry) { break; } // If aryMES_Message.Count > 0 Then GoTo lblExitTry_2_NextRow // =============================================================================== // 判定 MES_Result 處理結果 (成功回寫1, 失敗回寫9). // =============================================================================== if (aryMES_Message.Count == 0) { strMES_Result = "1"; // -------------------------------------------------- // 四、MES資料庫異動 // -------------------------------------------------- if (colSQL_2MES.Count > 0) { ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colSQL_2MES, colSQL_2MES_Rows); } } else { break; } } catch (Exception EX_drIF) { strMES_Result = "9"; aryMES_Message.Add("EX_drIF.Exception" + '\n' + EX_drIF.Message); } finally { // 組合執行錯誤字串: Chr(10)分隔 strMES_MESSAGE = ArrayList2String(ref aryMES_Message); // 2016/01/13, 直接異動中介表-------------------------- // 'If strMES_MESSAGE = defString Then // ' '當錯誤字串組合失敗,在Finally後會記錄PK. // 'End If // --------------------------------------------------# // MES_Message長度4000限制, 截取0-3996碼加"...". if (strMES_MESSAGE.Length > 4000) strMES_MESSAGE = strMES_MESSAGE.Substring(0, 3996) + "..."; // ---取消前面收集SQL--- colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); colSQL_T100.Clear(); // 若T100中介資料庫異動fail。(若MES_MESSAGE問題,下面會不會一樣fail?) colSQL_T100_Rows.Clear(); // ----------------------------------------------------------- // (EX_drIF.Exception) // 回填中介表資訊,(注意)各個資料表的PK不同。 // ----------------------------------------------------------- // mssql,無trim用法,不串變數值,直接檢查原欄位值. strIfWhereCond_PK = Conversions.ToString(" Where pmaa001 = '" + drIF["pmaa001"] + "'" + " And tran_time = '" + drIF["tran_time"] + "'" + " And pmaaent ='" + ERP_EntID + "' "); if (Update_T100_IfTable(ref colSQL_T100, ref colSQL_T100_Rows, ref aryMES_Message, IfTableName, strIfWhereCond_PK, strMES_Result, datNow, strMES_MESSAGE) >= 0) { // -------------------------------------------------- // 六、T100中介資料庫異動(EX_drIF) // -------------------------------------------------- ExecuteSQLNoneQuery_ChkRowCount(strERPDataBaseType, strERPconnectionString, colSQL_T100, colSQL_T100_Rows); } } } while (false); // lblExitTry_2_NextRow: // 當該筆中介交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 if (aryMES_Message.Count > 0) { /// 匯整記錄中介表的PK資訊. // 因從錯誤訊息不一定看的出哪一筆中介表交易記錄fail. // 故失敗訊息連同中介表的必要資訊一併匯整. (Email要放詳細資訊) // (1) aryReturnMessage.Add("tran_time:" + drIF["tran_time"] + ", pmaa001:" + drIF["pmaa001"] + ", pmaa002:" + drIF["pmaa002"]); // (2) foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); } // 計算失敗筆數 if (strMES_Result == "9") intReturnFailCount += 1; // 不管成功或失敗,繼續下一筆。 } // //return 0 : Success CustVendorIntegration_ERP2MES_VendorRet = 0; } catch (Exception ex) { aryMES_Message.Add(ex.Message); // 當該筆中介交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); throw; } finally { if (drTemp != null) drTemp.Close(); } return CustVendorIntegration_ERP2MES_VendorRet; } private int CustVendorIntegration_DelVendor(ref Collection colSQL_2MES, ref Collection colSQL_2MES_Rows, ref ArrayList aryMES_Message, string strERP_VendorNo) { int CustVendorIntegration_DelVendorRet = default(int); CustVendorIntegration_DelVendorRet = -1; // Return -1:fail,0:Success string strSQL; try { // 1. 刪除Contactor strSQL = "Delete From tblMTLMaterialVendorContactor " + "Where VendorNo='" + strERP_VendorNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // 2. 刪除MaterialVendorMap strSQL = "Delete From tblMTLMaterialVendorMap " + "Where VendorNo='" + strERP_VendorNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // 3. 刪除主檔 strSQL = "Delete From tblMTLMaterialVendor " + " Where VendorNo ='" + strERP_VendorNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // //return 0 : Success CustVendorIntegration_DelVendorRet = 0; } catch (Exception ex) { aryMES_Message.Add(ex.Message.ToString()); throw; } return CustVendorIntegration_DelVendorRet; } private int CustVendorIntegration_ERP2MES_Customer(ref IDbConnection cnnMES, ref ArrayList aryReturnMessage, ref int intReturnFailCount, string IfTableName, DataRow[] drSel_IF) { int CustVendorIntegration_ERP2MES_CustomerRet = default(int); CustVendorIntegration_ERP2MES_CustomerRet = -1; // Return -1:fail,0:Success // -------------------------------------------------- // 中介表 MES_PMMA_T, 拋轉 MES 客戶主檔. // -------------------------------------------------- // drSel_IF ,固定處理條件pmaa002料件類別=2(客戶). // aryMES_Message ,收集單筆中介交易記錄的錯誤記錄. // 新增供應商:CustomerName,CustomerSName一律填入"N/A", 後續由 mes_pmaal_t交易對象主檔多語言檔更新. // =========================================================== // 宣告 DB相關 變數 // =========================================================== var drTemp = default(DbDataReader); Collection colSQL_T100 = new Collection(), colSQL_T100_Rows = new Collection(); // T100中介DB(MES回填處理記錄). Collection colSQL_2MES = new Collection(), colSQL_2MES_Rows = new Collection(); // MES正式異動資料(主要). string strSQL; // 每筆中介交易記錄 string strIfWhereCond_PK; string strMES_Result; string strMES_MESSAGE; // 錯誤訊息(中介表.MES_MESSAGE),Chr(10)分隔錯誤項目。 var aryMES_Message = new ArrayList(); // 收集單筆中介交易記錄的錯誤記錄, Exception及MES判定錯誤訊息。 var datNow = DateTime.Now; // Now try { // 宣告拋轉中介表資料使用變數 string strERP_CustomerNo, strERP_status; // 預設值 int intIssueState = 2; // -------------------------------------------------- // 必須以tran_Time順序,逐筆處理中介交易記錄。 // 每一筆交易記錄處理完成,立即變更 MESDB 及 MESSERIES_T100.中介表的MES處理記錄,綁在同一個交易裡. // (同包Transaction, 處理完畢後再一起commit) // 當某筆交易記錄處理失敗,立即變更 MESSERIES_T100.中介表的MES處理記錄,再接著處理下一筆記錄. // -------------------------------------------------- foreach (DataRow drIF in drSel_IF) { // reset datNow = DateTime.Now; // Now strIfWhereCond_PK = ""; strMES_Result = "9"; // 預設值 9 (MES處理結果, 成功回寫1, 失敗回寫9). strMES_MESSAGE = ""; // 錯誤訊息 aryMES_Message.Clear(); colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); colSQL_T100.Clear(); colSQL_T100_Rows.Clear(); do { try { // ----------------------------------------------------------- // 取出各欄位資料 // ----------------------------------------------------------- // 轉大寫 strERP_CustomerNo = drIF["pmaa001"].ToString().Trim().ToUpper(); strERP_status = drIF["tran_status"].ToString().Trim().ToUpper(); // 檢查是否有此供應商設定 strSQL = "Select CustomerNo,IssueState From tblENTCustomerBasis " + " Where CustomerNo='" + strERP_CustomerNo + "'"; //cmmTemp = new IDbCommand(strSQL, cnnMES); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); bool exitTry = false; switch (strERP_status ?? "") { case "AU": // 有資料修改沒資料新增 { if (!drTemp.Read()) { // ----------------------------------------------------------- // 新增MES客戶設定 // ----------------------------------------------------------- strSQL = "Insert Into tblENTCustomerBasis " + "(CustomerNo,CustomerName,CustomerSName,IssueState," + " Creator,CreateDate)"; strSQL += " Values('" + strERP_CustomerNo + "','N/A','N/A'," + intIssueState + ",'" + strERPCreator + "'," + "To_Date('" + Strings.Format(datNow, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'))"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } // aryMES_Message.Add("客戶編號(pmaa001):" & strERP_CustomerNo & ", 已存在MES, 不允許新增!!") // ----------------------------------------------------------- // 修改MES客戶設定 // ----------------------------------------------------------- // 修改客戶,因目前中介表定義欄位沒有需修改的,僅針對交易記錄判斷此產品在MES簽核狀態檢查是否需作變更。 else if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], -1, false))) { strSQL = "Update tblENTCustomerBasis Set " + " IssueState = " + intIssueState + " Where CustomerNo='" + strERP_CustomerNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } drTemp.Close(); //cmmTemp.Dispose(); break; } case "D": // D:刪除 { if (drTemp.Read()) { if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], 0, false))) { // ----------------------------------------------------------- // 先刪除MES客戶相關設定 // ----------------------------------------------------------- if (CustVendorIntegration_DelCustomer(ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_CustomerNo) < 0) { // GoTo lblExitTry_2_NextRow exitTry = true; break; } } else { // ----------------------------------------------------------- // 作廢MES客戶設定 // ----------------------------------------------------------- strSQL = "Update tblENTCustomerBasis Set " + " IssueState=-1" + " Where CustomerNo='" + strERP_CustomerNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } } else { aryMES_Message.Add("客戶編號(pmaa001):" + strERP_CustomerNo + ", 不存在MES, 不允許刪除!!"); } drTemp.Close(); //cmmTemp.Dispose(); break; } default: { aryMES_Message.Add("ERP資料狀態(Status):" + strERP_status + "無效, 不允許執行!!"); break; } } if (exitTry) { break; } // If aryMES_Message.Count > 0 Then GoTo lblExitTry_2_NextRow // =============================================================================== // 判定 MES_Result 處理結果 (成功回寫1, 失敗回寫9). // =============================================================================== if (aryMES_Message.Count == 0) { strMES_Result = "1"; // -------------------------------------------------- // 四、MES資料庫異動 // -------------------------------------------------- if (colSQL_2MES.Count > 0) { ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colSQL_2MES, colSQL_2MES_Rows); } } else { break; } } catch (Exception EX_drIF) { strMES_Result = "9"; aryMES_Message.Add("EX_drIF.Exception" + '\n' + EX_drIF.Message); } finally { // 組合執行錯誤字串: Chr(10)分隔 strMES_MESSAGE = ArrayList2String(ref aryMES_Message); // 2016/01/13, 直接異動中介表-------------------------- // 'If strMES_MESSAGE = defString Then // ' '當錯誤字串組合失敗,在Finally後會記錄PK. // 'End If // --------------------------------------------------# // MES_Message長度4000限制, 截取0-3996碼加"...". if (strMES_MESSAGE.Length > 4000) strMES_MESSAGE = strMES_MESSAGE.Substring(0, 3996) + "..."; // ---取消前面收集SQL--- colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); colSQL_T100.Clear(); // 若T100中介資料庫異動fail。(若MES_MESSAGE問題,下面會不會一樣fail?) colSQL_T100_Rows.Clear(); // ----------------------------------------------------------- // (EX_drIF.Exception) // 回填中介表資訊,(注意)各個資料表的PK不同。 // ----------------------------------------------------------- // mssql,無trim用法,不串變數值,直接檢查原欄位值. strIfWhereCond_PK = Conversions.ToString(" Where pmaa001 = '" + drIF["pmaa001"] + "'" + " And tran_time = '" + drIF["tran_time"] + "'" + " And pmaaent ='" + ERP_EntID + "' "); if (Update_T100_IfTable(ref colSQL_T100, ref colSQL_T100_Rows, ref aryMES_Message, IfTableName, strIfWhereCond_PK, strMES_Result, datNow, strMES_MESSAGE) >= 0) { // -------------------------------------------------- // 六、T100中介資料庫異動(EX_drIF) // -------------------------------------------------- ExecuteSQLNoneQuery_ChkRowCount(strERPDataBaseType, strERPconnectionString, colSQL_T100, colSQL_T100_Rows); } } } while (false); // lblExitTry_2_NextRow: // 當該筆中介交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 if (aryMES_Message.Count > 0) { /// 匯整記錄中介表的PK資訊. // 因從錯誤訊息不一定看的出哪一筆中介表交易記錄fail. // 故失敗訊息連同中介表的必要資訊一併匯整. (Email要放詳細資訊) // (1) aryReturnMessage.Add("tran_time:" + drIF["tran_time"] + ", pmaa001:" + drIF["pmaa001"] + ", pmaa002:" + drIF["pmaa002"]); // (2) foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); } // 計算失敗筆數 if (strMES_Result == "9") intReturnFailCount += 1; // 不管成功或失敗,繼續下一筆。 } // //return 0 : Success CustVendorIntegration_ERP2MES_CustomerRet = 0; } catch (Exception ex) { aryMES_Message.Add(ex.Message); // 當該筆中介交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); throw; } finally { if (drTemp != null) drTemp.Close(); } return CustVendorIntegration_ERP2MES_CustomerRet; } private int CustVendorIntegration_DelCustomer(ref Collection colSQL_2MES, ref Collection colSQL_2MES_Rows, ref ArrayList aryMES_Message, string strERP_CustomerNo) { int CustVendorIntegration_DelCustomerRet = default(int); CustVendorIntegration_DelCustomerRet = -1; // Return -1:fail,0:Success string strSQL; try { // Del detail strSQL = "Delete From tblENTCustomerShipAddr " + "Where CustomerNo='" + strERP_CustomerNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); strSQL = "Delete From tblENTCustomerContactor " + "Where CustomerNo='" + strERP_CustomerNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // Del basis strSQL = "Delete From tblENTCustomerBasis " + "Where CustomerNo='" + strERP_CustomerNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // //return 0 : Success CustVendorIntegration_DelCustomerRet = 0; } catch (Exception ex) { aryMES_Message.Add(ex.Message.ToString()); throw; } return CustVendorIntegration_DelCustomerRet; } private int CustVendorIntegration_ERP2MES_Resource(ref IDbConnection cnnMES, ref ArrayList aryReturnMessage, ref int intReturnFailCount, string IfTableName, DataRow[] drSel_IF) { int CustVendorIntegration_ERP2MES_ResourceRet = default(int); CustVendorIntegration_ERP2MES_ResourceRet = -1; // Return -1:fail,0:Success // -------------------------------------------------- // mes_pmaal_t 中介表 拋轉 MES 供應商/客戶主檔. // -------------------------------------------------- // aryMES_Message ,收集單筆中介交易記錄的錯誤記錄. // mes_pmaa_t 交易對象主檔更新 // status:針對產品做 Update,若拋D視為不合理的ERP資料狀態。 // =========================================================== // 宣告 DB相關 變數 // =========================================================== var drTemp = default(DbDataReader); Collection colSQL_T100 = new Collection(), colSQL_T100_Rows = new Collection(); // T100中介DB(MES回填處理記錄). Collection colSQL_2MES = new Collection(), colSQL_2MES_Rows = new Collection(); // MES正式異動資料(主要). string strSQL; // 每筆中介交易記錄 string strIfWhereCond_PK; string strMES_Result; string strMES_MESSAGE; // 錯誤訊息(中介表.MES_MESSAGE),Chr(10)分隔錯誤項目。 var aryMES_Message = new ArrayList(); // 收集單筆中介交易記錄的錯誤記錄, Exception及MES判定錯誤訊息。 var datNow = DateTime.Now; // Now try { // 宣告拋轉中介表資料使用變數 string strERP_CustVendorNo, strERP_CustVendorName, strERP_CustVendorSName; DataRow drChkCustomer, drChkVendor; // Dim colRecUnitInfo As New Collection '收集所有UnitNo,以判斷是否需Insert資料. // -------------------------------------------------- // 必須以tran_Time順序,逐筆處理中介交易記錄。 // 每一筆交易記錄處理完成,立即變更 MESDB 及 MESSERIES_T100.中介表的MES處理記錄,綁在同一個交易裡. // (同包Transaction, 處理完畢後再一起commit) // 當某筆交易記錄處理失敗,立即變更 MESSERIES_T100.中介表的MES處理記錄,再接著處理下一筆記錄. // -------------------------------------------------- foreach (DataRow drIF in drSel_IF) { // reset datNow = DateTime.Now; // Now strIfWhereCond_PK = ""; strMES_Result = "9"; // 預設值 9 (MES處理結果, 成功回寫1, 失敗回寫9). strMES_MESSAGE = ""; // 錯誤訊息 aryMES_Message.Clear(); colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); colSQL_T100.Clear(); colSQL_T100_Rows.Clear(); do { try { // ----------------------------------------------------------- // 取出各欄位資料 // ----------------------------------------------------------- // 編號 strERP_CustVendorNo = drIF["pmaal001"].ToString().Trim().ToUpper(); // 全名 strERP_CustVendorName = drIF["pmaal003"].ToString().Trim().ToUpper(); if (string.IsNullOrEmpty(strERP_CustVendorName)) strERP_CustVendorName = "N/A"; // 簡名 strERP_CustVendorSName = drIF["pmaal004"].ToString().Trim().ToUpper(); if (string.IsNullOrEmpty(strERP_CustVendorSName)) strERP_CustVendorSName = modWIN.GetSubString(strERP_CustVendorName, 20); // ERPws標準功能不論IssueState為何皆允許修改(產品主檔或物料主檔). // 1.檢查是否存在MES int intNo_ChkType = -1; // 檢查是否存在MES,物料找到(填0),產品找到(填1), Default -1 . string strReturnUnitType; // 1-1.檢查是否有此客戶設定 drChkCustomer = GetCustomerBasis(strERP_CustVendorNo, cnnMES, aryMES_Message); if (drChkCustomer == null) break; // GoTo lblExitTry_2_NextRow 'fail if (!(drChkCustomer["CustomerNo"] is DBNull)) { intNo_ChkType = 1; // Customer // ----------------------------------------------------------- // 3-2.修改MES客戶設定 // ----------------------------------------------------------- strSQL = "Update tblENTCustomerBasis Set " + " CustomerName='" + modWIN.GetSubString(strERP_CustVendorName, 50) + "'" + ",CustomerSName='" + modWIN.GetSubString(strERP_CustVendorSName, 50) + "'"; // 注意事項:產品與物料,當IssueState=-1的更新方式不同. // MES已存在之資料IssueState如果是-1,ERP資料再次拋轉時,IssueState則更新為"0". if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drChkCustomer["IssueState"], -1, false))) strSQL += ",IssueState = 0"; // ProductVersion預設1 strSQL += " Where CustomerNo='" + strERP_CustVendorNo + "' "; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); } // 1-2.檢查是否有此供應商設定 drChkVendor = GetVendorBasis(strERP_CustVendorNo, cnnMES, aryMES_Message); if (drChkVendor == null) break; // GoTo lblExitTry_2_NextRow 'fail if (!(drChkVendor["VendorNo"] is DBNull)) { intNo_ChkType = 0; // Vendor // ----------------------------------------------------------- // 3-1.修改MES供應商設定 // ----------------------------------------------------------- strSQL = "Update tblMTLMaterialVendor Set " + " VendorName='" + modWIN.GetSubString(strERP_CustVendorName, 50) + "'"; // 注意事項:產品與物料,當IssueState=-1的更新方式不同. // MES已存在之資料IssueState如果是-1,ERP資料再次拋轉時,IssueState則更新為"2". if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drChkVendor["IssueState"], -1, false))) strSQL += ",IssueState = 2"; strSQL += " Where VendorNo='" + strERP_CustVendorNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); } if (intNo_ChkType == -1) { // pmaa001,不存在MES的供應商主檔或客戶主檔. aryMES_Message.Add("交易對象編號(pmaa001):" + strERP_CustVendorNo + ", 不存在MES的供應商主檔或客戶主檔, 不允許執行!!"); // GoTo lblExitTry_2_NextRow break; } // =============================================================================== // 判定 MES_Result 處理結果 (成功回寫1, 失敗回寫9). // =============================================================================== if (aryMES_Message.Count == 0) { strMES_Result = "1"; // -------------------------------------------------- // 四、MES資料庫異動 // -------------------------------------------------- if (colSQL_2MES.Count > 0) { ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colSQL_2MES, colSQL_2MES_Rows); } } else { break; } } catch (Exception EX_drIF) { strMES_Result = "9"; aryMES_Message.Add("EX_drIF.Exception" + '\n' + EX_drIF.Message); } finally { // 組合執行錯誤字串: Chr(10)分隔 strMES_MESSAGE = ArrayList2String(ref aryMES_Message); // 2016/01/13, 直接異動中介表-------------------------- // 'If strMES_MESSAGE = defString Then // ' '當錯誤字串組合失敗,在Finally後會記錄PK. // 'End If // --------------------------------------------------# // MES_Message長度4000限制, 截取0-3996碼加"...". if (strMES_MESSAGE.Length > 4000) strMES_MESSAGE = strMES_MESSAGE.Substring(0, 3996) + "..."; // ---取消前面收集SQL--- colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); colSQL_T100.Clear(); // 若T100中介資料庫異動fail。(若MES_MESSAGE問題,下面會不會一樣fail?) colSQL_T100_Rows.Clear(); // ----------------------------------------------------------- // (EX_drIF.Exception) // 回填中介表資訊,(注意)各個資料表的PK不同。 // ----------------------------------------------------------- // mssql,無trim用法,不串變數值,直接檢查原欄位值. strIfWhereCond_PK = Conversions.ToString(" Where pmaal001 = '" + drIF["pmaal001"] + "'" + " And tran_time = '" + drIF["tran_time"] + "'" + " And pmaal002 = '" + drIF["pmaal002"] + "'" + " And pmaalent ='" + ERP_EntID + "' "); if (Update_T100_IfTable(ref colSQL_T100, ref colSQL_T100_Rows, ref aryMES_Message, IfTableName, strIfWhereCond_PK, strMES_Result, datNow, strMES_MESSAGE) >= 0) { // -------------------------------------------------- // 六、T100中介資料庫異動(EX_drIF) // -------------------------------------------------- ExecuteSQLNoneQuery_ChkRowCount(strERPDataBaseType, strERPconnectionString, colSQL_T100, colSQL_T100_Rows); } } } while (false); // lblExitTry_2_NextRow: // 當該筆中介交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 if (aryMES_Message.Count > 0) { /// 匯整記錄中介表的PK資訊. // 因從錯誤訊息不一定看的出哪一筆中介表交易記錄fail. // 故失敗訊息連同中介表的必要資訊一併匯整. (Email要放詳細資訊) // (1) aryReturnMessage.Add("tran_time:" + drIF["tran_time"] + ", pmaal001:" + drIF["pmaal001"] + ", pmaal002:" + drIF["pmaal002"]); // (2) foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); } // 計算失敗筆數 if (strMES_Result == "9") intReturnFailCount += 1; // 不管成功或失敗,繼續下一筆。 } // //return 0 : Success CustVendorIntegration_ERP2MES_ResourceRet = 0; } catch (Exception ex) { aryMES_Message.Add(ex.Message); // 當該筆中介交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); throw; } finally { if (drTemp != null) drTemp.Close(); } return CustVendorIntegration_ERP2MES_ResourceRet; } private DataRow GetVendorBasis(string VendorNo, IDbConnection cnnTemp = null, ArrayList aryErrMessage = null, int IssueState = defInteger, string strAdditional = "") { DataRow GetVendorBasisRet = default(DataRow); // 此 Function 將資料以 DataRow 方式取出 // 傳回值: DataRow(成功), Nothing(失敗) //var daTemp = default(System.Data.OleDb.OleDbDataAdapter); var dsTemp = default(DataSet); var cnnLocal = default(IDbConnection); string strCondition = default(string), strSQL = default(string); try { if (cnnTemp == null) { // //Create connection string argstrDataBaseType = "Null"; string strDataBaseTypeTmp = objSetting.GetConnectionString(strDataBaseType: argstrDataBaseType); cnnLocal = CreateConnection(strDataBaseTypeTmp); } else { cnnLocal = cnnTemp; } // //查詢條件 if ((VendorNo ?? "") != defString) { strCondition += " And VendorNo = '" + VendorNo + "'"; } if (IssueState != defInteger) { strCondition += " And IssueState = " + IssueState; } // Additional if (!string.IsNullOrEmpty(strAdditional)) { strSQL += strAdditional; } // //主SQL strSQL = "Select * From tblMTLMaterialVendor Where 1=1 " + strCondition; // //Select data //cmmTemp = new IDbCommand(strSQL, cnnTemp); //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp); dsTemp = new DataSet(); //daTemp.Fill(dsTemp, "MTLMaterialVendor"); ExecuteSQLQuery_Adapter(strSQL, dsTemp, "MTLMaterialVendor", cnnTemp); // //Return data if (dsTemp.Tables[0].Rows.Count > 0) { GetVendorBasisRet = dsTemp.Tables[0].Rows[0]; } else { GetVendorBasisRet = dsTemp.Tables[0].NewRow(); } } catch (Exception ex) { GetVendorBasisRet = null; // 此Function發生異常較難由訊息看出,加上FunctionName. aryErrMessage.Add("GetVendorBasis:" + ex.Message); throw; } finally { if (cnnTemp == null) CloseConnection(cnnLocal); //if (daTemp != null) // daTemp.Dispose(); if (dsTemp != null) dsTemp.Dispose(); } return GetVendorBasisRet; } private DataRow GetCustomerBasis(string CustomerNo, IDbConnection cnnTemp = null, ArrayList aryErrMessage = null, int IssueState = defInteger, string strAdditional = "") { DataRow GetCustomerBasisRet = default(DataRow); // 此 Function 將資料以 DataRow 方式取出 // 傳回值: DataRow(成功), Nothing(失敗) //var daTemp = default(System.Data.OleDb.OleDbDataAdapter); var dsTemp = default(DataSet); var cnnLocal = default(IDbConnection); string strCondition = default(string), strSQL = default(string); try { if (cnnTemp == null) { // //Create connection string argstrDataBaseType = "Null"; string strDataBaseTypeTmp = objSetting.GetConnectionString(strDataBaseType: argstrDataBaseType); cnnLocal = CreateConnection(strDataBaseTypeTmp); } else { cnnLocal = cnnTemp; } // //查詢條件 if ((CustomerNo ?? "") != defString) { strCondition += " And CustomerNo = '" + CustomerNo + "'"; } if (IssueState != defInteger) { strCondition += " And IssueState = " + IssueState; } // Additional if (!string.IsNullOrEmpty(strAdditional)) { strSQL += strAdditional; } // //主SQL strSQL = "Select * From tblENTCustomerBasis Where 1=1" + strCondition; // //Select data //cmmTemp = new IDbCommand(strSQL, cnnTemp); //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp); dsTemp = new DataSet(); //daTemp.Fill(dsTemp, "ENTCustomerBasis"); ExecuteSQLQuery_Adapter(strSQL, dsTemp, "ENTCustomerBasis", cnnTemp); // //Return data if (dsTemp.Tables[0].Rows.Count > 0) { GetCustomerBasisRet = dsTemp.Tables[0].Rows[0]; } else { GetCustomerBasisRet = dsTemp.Tables[0].NewRow(); } } catch (Exception ex) { GetCustomerBasisRet = null; // 此Function發生異常較難由訊息看出,加上FunctionName. aryErrMessage.Add("GetCustomerBasis:" + ex.Message); throw; } finally { if (cnnTemp == null) CloseConnection(cnnLocal); //if (daTemp != null) // daTemp.Dispose(); if (dsTemp != null) dsTemp.Dispose(); } return GetCustomerBasisRet; } private int CustVendorIntegration_ERP2MES_MTLVendorMap(ref IDbConnection cnnMES, ref ArrayList aryReturnMessage, ref int intReturnFailCount, string IfTableName, DataRow[] drSel_IF) { int CustVendorIntegration_ERP2MES_MTLVendorMapRet = default(int); CustVendorIntegration_ERP2MES_MTLVendorMapRet = -1; // Return -1:fail,0:Success // -------------------------------------------------- // mes_pmao_t 中介表 拋轉 MES 物料供應商對應檔. // -------------------------------------------------- // drSel_IF ,固定處理條件pmaa002料件類別=1(供應商). // aryMES_Message ,收集單筆中介交易記錄的錯誤記錄. // status:針對產品做 Insert/Delete,若拋U視為不合理的ERP資料狀態。 // =========================================================== // 宣告 DB相關 變數 // =========================================================== var drTemp = default(DbDataReader); Collection colSQL_T100 = new Collection(), colSQL_T100_Rows = new Collection(); // T100中介DB(MES回填處理記錄). Collection colSQL_2MES = new Collection(), colSQL_2MES_Rows = new Collection(); // MES正式異動資料(主要). string strSQL; // 每筆中介交易記錄 string strIfWhereCond_PK; string strMES_Result; string strMES_MESSAGE; // 錯誤訊息(中介表.MES_MESSAGE),Chr(10)分隔錯誤項目。 var aryMES_Message = new ArrayList(); // 收集單筆中介交易記錄的錯誤記錄, Exception及MES判定錯誤訊息。 var datNow = DateTime.Now; // Now try { // 宣告拋轉中介表資料使用變數 string strERP_VendorNo, strERP_MTLNo, strERP_Description, strERP_status; DataRow drChkVendor, drChkMTL; var colRecUnitInfo = new Collection(); // 收集所有UnitNo,以判斷是否需Insert資料. // -------------------------------------------------- // 必須以tran_Time順序,逐筆處理中介交易記錄。 // 每一筆交易記錄處理完成,立即變更 MESDB 及 MESSERIES_T100.中介表的MES處理記錄,綁在同一個交易裡. // (同包Transaction, 處理完畢後再一起commit) // 當某筆交易記錄處理失敗,立即變更 MESSERIES_T100.中介表的MES處理記錄,再接著處理下一筆記錄. // -------------------------------------------------- // 此Table一率先刪除再處理邏輯 foreach (DataRow drIF in drSel_IF) { // reset datNow = DateTime.Now; // Now strIfWhereCond_PK = ""; strMES_Result = "9"; // 預設值 9 (MES處理結果, 成功回寫1, 失敗回寫9). strMES_MESSAGE = ""; // 錯誤訊息 aryMES_Message.Clear(); colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); colSQL_T100.Clear(); colSQL_T100_Rows.Clear(); do { try { // ----------------------------------------------------------- // 取出各欄位資料 // ----------------------------------------------------------- // 供應商編號 strERP_VendorNo = drIF["pmao001"].ToString().Trim().ToUpper(); // 物料編號 strERP_MTLNo = drIF["pmao002"].ToString().Trim().ToUpper(); // 說明 strERP_Description = drIF["pmao005"].ToString().Trim().ToUpper(); // ERP狀態 strERP_status = drIF["tran_status"].ToString().Trim().ToUpper(); // ERPws標準功能不論IssueState為何皆允許修改. // 1.檢查是否存在MES // Dim intNo_ChkType As Integer = -1 '檢查是否存在MES,物料找到(填0),產品找到(填1), Default -1 . // Dim strReturnUnitType As String // 1-1.檢查是否有此物料設定 drChkMTL = GetMaterialBasis(strERP_MTLNo, cnnMES, aryMES_Message); if (drChkMTL == null) break; // GoTo lblExitTry_2_NextRow 'fail if (drChkMTL["MaterialNo"] is DBNull) { // pmao002,不存在MES的物料主檔. aryMES_Message.Add("物料編號(pmao002):" + strERP_MTLNo + ", 不存在MES的物料主檔, 不允許執行!!"); // GoTo lblExitTry_2_NextRow break; } // 1-2.檢查是否有此供應商設定 drChkVendor = GetVendorBasis(strERP_VendorNo, cnnMES, aryMES_Message); if (drChkVendor == null) break; // GoTo lblExitTry_2_NextRow 'fail if (drChkVendor["VendorNo"] is DBNull) { // pmao001,不存在MES的供應商主檔. aryMES_Message.Add("供應商編號(pmao001):" + strERP_MTLNo + ", 不存在MES的供應商主檔, 不允許執行!!"); // GoTo lblExitTry_2_NextRow break; } // ----------------------------------------------------------- // 作廢MES產品設定 // ----------------------------------------------------------- strSQL = "Delete tblMTLMaterialVendorMap " + " Where VendorNo='" + strERP_VendorNo + "'" + " And MaterialNo='" + strERP_MTLNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); switch (strERP_status ?? "") { case "AU": // 有資料修改沒資料新增 { // ----------------------------------------------------------- // 新增MES供應商設定 // ----------------------------------------------------------- strSQL = "Insert Into tblMTLMaterialVendorMap " + "(VendorNo,MaterialNo,Description)"; strSQL += " Values('" + strERP_VendorNo + "','" + strERP_MTLNo + "','" + strERP_Description + "')"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); break; } case "D": // D:刪除 { break; } default: { aryMES_Message.Add("ERP資料狀態(Status):" + strERP_status + "無效, 不允許執行!!"); break; } } // =============================================================================== // 判定 MES_Result 處理結果 (成功回寫1, 失敗回寫9). // =============================================================================== if (aryMES_Message.Count == 0) { strMES_Result = "1"; // -------------------------------------------------- // 四、MES資料庫異動 // -------------------------------------------------- if (colSQL_2MES.Count > 0) { ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colSQL_2MES, colSQL_2MES_Rows); } } else { break; } } catch (Exception EX_drIF) { strMES_Result = "9"; aryMES_Message.Add("EX_drIF.Exception" + '\n' + EX_drIF.Message); } finally { // 組合執行錯誤字串: Chr(10)分隔 strMES_MESSAGE = ArrayList2String(ref aryMES_Message); // 2016/01/13, 直接異動中介表-------------------------- // 'If strMES_MESSAGE = defString Then // ' '當錯誤字串組合失敗,在Finally後會記錄PK. // 'End If // --------------------------------------------------# // MES_Message長度4000限制, 截取0-3996碼加"...". if (strMES_MESSAGE.Length > 4000) strMES_MESSAGE = strMES_MESSAGE.Substring(0, 3996) + "..."; // ---取消前面收集SQL--- colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); colSQL_T100.Clear(); // 若T100中介資料庫異動fail。(若MES_MESSAGE問題,下面會不會一樣fail?) colSQL_T100_Rows.Clear(); // ----------------------------------------------------------- // (EX_drIF.Exception) // 回填中介表資訊,(注意)各個資料表的PK不同。 // ----------------------------------------------------------- // mssql,無trim用法,不串變數值,直接檢查原欄位值. strIfWhereCond_PK = Conversions.ToString(" Where pmao001 = '" + drIF["pmao001"] + "'" + " And pmao002 = '" + drIF["pmao002"] + "'" + " And tran_time = '" + drIF["tran_time"] + "'" + " And pmaoent ='" + ERP_EntID + "' "); if (Update_T100_IfTable(ref colSQL_T100, ref colSQL_T100_Rows, ref aryMES_Message, IfTableName, strIfWhereCond_PK, strMES_Result, datNow, strMES_MESSAGE) >= 0) { // -------------------------------------------------- // 六、T100中介資料庫異動(EX_drIF) // -------------------------------------------------- ExecuteSQLNoneQuery_ChkRowCount(strERPDataBaseType, strERPconnectionString, colSQL_T100, colSQL_T100_Rows); } } } while (false); // lblExitTry_2_NextRow: // 當該筆中介交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 if (aryMES_Message.Count > 0) { /// 匯整記錄中介表的PK資訊. // 因從錯誤訊息不一定看的出哪一筆中介表交易記錄fail. // 故失敗訊息連同中介表的必要資訊一併匯整. (Email要放詳細資訊) // (1) aryReturnMessage.Add("tran_time:" + drIF["tran_time"] + ", pmao001:" + drIF["pmao001"] + ", pmao002:" + drIF["pmao002"]); // (2) foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); } // 計算失敗筆數 if (strMES_Result == "9") intReturnFailCount += 1; // 不管成功或失敗,繼續下一筆。 } // //return 0 : Success CustVendorIntegration_ERP2MES_MTLVendorMapRet = 0; } catch (Exception ex) { aryMES_Message.Add(ex.Message); // 當該筆中介交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); throw; } finally { if (drTemp != null) drTemp.Close(); } return CustVendorIntegration_ERP2MES_MTLVendorMapRet; } #endregion #region MES InterFaceTable 轉入 MES正式區(作業站) // 功 能: MES InterFaceTable 轉入 MES正式區(作業站) // 傳回值: success(成功), fail(失敗) private string OPIntegration(Collection colParameters = null) { string OPIntegrationRet = default(string); // =========================================================== // 宣告 DB相關 變數 // =========================================================== var cnnERP = default(IDbConnection); // T100中介DB使用(ERP) var cnnMES = default(IDbConnection); // MESDB使用 var drTemp = default(DbDataReader); //var daTemp = new System.Data.OleDb.OleDbDataAdapter(); var dsTemp = new DataSet(); Collection colSQL_T100 = new Collection(), colSQL_T100_Rows = new Collection(); // T100中介DB(MES回填處理記錄). Collection colSQL_2MES = new Collection(), colSQL_2MES_Rows = new Collection(); // MES正式異動資料(主要). string strSQL; // =========================================================== // 宣告 AutoRunJob設定及執行記錄 變數 // =========================================================== string strParameter01 = ""; // 參數一,預設此功能fail通知EMAIL群組。 string strSubject, strBody; // 寄送通知資訊 // AutorunJob拋轉資訊 string strReturnMessage = ""; // 錯誤訊息(tblMESAutoRunLog.ReturnMessage),Chr(10)分隔錯誤項目。 var aryReturnMessage = new ArrayList(); // Catch Error Message (Exception及MES判定錯誤訊息)。 int intFailCount_OP = 0; // OP拋轉失敗筆數 // ' 每筆中介交易記錄 // Dim strMES_MESSAGE As String '錯誤訊息(中介表.MES_MESSAGE),Chr(10)分隔錯誤項目。 // Dim aryMES_Message As New ArrayList 'Catch Error Message (Exception及MES判定錯誤訊息)。 // =========================================================== // 宣告 MESSERIES_T100中介表 變數 // =========================================================== // Dim strIfTableName As String = "mes_imaa_t" '統一小寫 // =========================================================== // 宣告 其他 變數 // =========================================================== DateTime datNow; do { try { // -------------------------------------------------- // 一、取得參數 // -------------------------------------------------- // Parameter01為參數一 // 作為Mail通知群組(GroupNo),放在最前面防止連線失敗無法寄送通知。 if (colParameters.Contains("Parameter01")) { strParameter01 = colParameters["Parameter01"].ToString().Trim(); } // If strParameter01 = "" Then // ProductIntegration = "fail;使用者群?未?定!!(tblMESAutorunJob.Parameter01)" // Exit Function '離開 Function。 // End If // -------------------------------------------------- // 二、連線 DB // -------------------------------------------------- // T100中介DB cnnERP = CreateConnection(strERPconnectionString); // MES DB cnnMES = CreateConnection(strConnectionString); // 取得ERPSetting if (!GetERPSetting(ref dtERPSetting, "T100")) { break; } // -------------------------------------------------- // 檢查參數一 Mail通知群組 是否已設定. // -------------------------------------------------- if (!string.IsNullOrEmpty(strParameter01) && ERP2MES_MailNoticeChk(ref cnnMES, ref aryReturnMessage, strParameter01) < 0) { OPIntegrationRet = Conversions.ToString("fail;" + aryReturnMessage[0]); return OPIntegrationRet; // 離開 Function。 } if (aryReturnMessage.Count > 0) break; // Exit Try /// 取出 MESSERIES_T100.中介表資料. // -------------------------------------------------- // 二、MESSERIES_T100.中介表資料,請依序處理: // Loop 1.作業站主檔 MES_OOCQ_T:(必須優先) // Loop 2.作業站主檔多語言檔 MES_OOCQL_T // 每筆交易明細: // MES_Result為空白代表未拋轉。 // 取出後立即異動DB,無論成功或失敗(不跳離),都繼續執行下一筆。 // -------------------------------------------------- string MES_OOCQ_T_1 = "MES_OOCQ_T"; string MES_OOCQL_T_2 = "MES_OOCQL_T"; DataRow[] drSel_IF; // -------------------------------------------------- // Loop 1.作業站主檔 MES_OOCQ_T // -------------------------------------------------- strSQL = "Select T1.*, T1.oocq002 As oocq002_Upper " + " From " + MES_OOCQ_T_1 + " T1" + " Where T1.MES_Result Is Null" + " And T1.oocq001= 221" + " And T1.oocqent ='" + ERP_EntID + "' "; //cmmTempERP = new IDbCommand(strSQL, cnnERP); //daTemp.SelectCommand = cmmTempERP; //daTemp.Fill(dsTemp, MES_OOCQ_T_1); //cmmTempERP.Dispose(); ExecuteSQLQuery_Adapter(strSQL, dsTemp, MES_OOCQ_T_1, cnnERP); if (!(dsTemp == null) && dsTemp.Tables[MES_OOCQ_T_1].Rows.Count > 0) { drSel_IF = dsTemp.Tables[MES_OOCQ_T_1].Select("", "tran_Time,oocq002"); if (!(drSel_IF == null) && drSel_IF.Length > 0) { // intFailCount_OP if (OPIntegration_ERP2MES_OP(ref cnnMES, ref aryReturnMessage, ref intFailCount_OP, MES_OOCQ_T_1, drSel_IF) < 0) { if (aryReturnMessage.Count == 0) // 避免不明原因,執行FAIL又沒收集到項目. { aryReturnMessage.Add("中介表:" + MES_OOCQ_T_1 + ", 拋轉執行失敗!!"); } } } string strIfWhereCond_PK; string strMES_MESSAGE; // 錯誤訊息(中介表.MES_MESSAGE),Chr(10)分隔錯誤項目。 } // -------------------------------------------------- // Loop 2.作業站主檔多語言檔 MES_OOCQL_T // -------------------------------------------------- strSQL = "Select T1.*" + " From " + MES_OOCQL_T_2 + " T1" + " Where T1.MES_Result Is Null" + " And T1.oocql003 = '" + strLanguage_T100 + "'" + " And T1.oocqlent ='" + ERP_EntID + "' "; //cmmTempERP = new IDbCommand(strSQL, cnnERP); //daTemp.SelectCommand = cmmTempERP; //daTemp.Fill(dsTemp, MES_OOCQL_T_2); //cmmTempERP.Dispose(); ExecuteSQLQuery_Adapter(strSQL, dsTemp, MES_OOCQL_T_2, cnnERP); if (!(dsTemp == null) && dsTemp.Tables[MES_OOCQL_T_2].Rows.Count > 0) { drSel_IF = dsTemp.Tables[MES_OOCQL_T_2].Select("", "tran_Time,oocql002"); if (OPIntegration_ERP2MES_Resource(ref cnnMES, ref aryReturnMessage, ref intFailCount_OP, MES_OOCQL_T_2, drSel_IF) < 0) { if (aryReturnMessage.Count == 0) // 避免不明原因,執行FAIL又沒收集到項目. { aryReturnMessage.Add("中介表:" + MES_OOCQL_T_2 + "(料件多語言檔), 拋轉執行失敗!!"); } } } } catch (Exception EX_AUT) { if (cnnERP == null) { aryReturnMessage.Add("T100中介DB(ERP) 連線失敗!!"); } else if (cnnMES == null) { aryReturnMessage.Add("MES DB 連線失敗!!"); } else { aryReturnMessage.Add("EX_AUT.Exception" + '\n' + EX_AUT.Message.ToString()); } } // 回傳結果 ReturnMessage,已一併在Finally處理。 finally { // -------------------------------------------------- // 七、回傳執行結果:succces 或 fail(ReturnMessage) // -------------------------------------------------- if (aryReturnMessage.Count == 0) { OPIntegrationRet = "success"; } else { // 組合執行錯誤字串: Chr(10)分隔 strReturnMessage = ArrayList2String(ref aryReturnMessage); if ((strReturnMessage ?? "") == defString) { // 當錯誤字串組合失敗。補上 strReturnMessage = "ReturnMessage收集失敗!!"; } // If Not dsTemp.Tables(strIfTableName) Is Nothing Then // '整理中介表交易筆數 // Dim drSel As DataRow() // Dim strBody_Head As String = "" // strBody_Head = "T100中介表:" & strIfTableName & "匯入至MES正式區" & Chr(10) // drSel = dsTemp.Tables(strIfTableName).Select("imaa004='A'") // If drSel.Length > 0 Then // strBody_Head += "料件類別:A, 總筆數(" & drSel.Length & "),失敗筆數(" & intFailCount_PRD & ")" // End If // drSel = dsTemp.Tables(strIfTableName).Select("imaa004='M'") // If drSel.Length > 0 Then // strBody_Head += "料件類別:M, 總筆數(" & drSel.Length & "),失敗筆數(" & intFailCount_MTL & ")" // End If // '重組 strReturnMessage = 中介表交易筆數 & strReturnMessage // strReturnMessage = strBody_Head & Chr(10) & Chr(10) & strReturnMessage // 'Remove Table // dsTemp.Tables.Remove(strIfTableName) // dsTemp.AcceptChanges() // End If // tblMESAutoRunLog.ReturnMessage 長度4000限制. string strTemp = ""; if (strReturnMessage.Length > 4000) { // 自 strReturnMessage 中截取0-3991碼. strTemp = strReturnMessage.Substring(0, 3991) + "..."; } else { strTemp = strReturnMessage; } // //fail; OPIntegrationRet = "fail;" + strTemp; } if (cnnERP != null) CloseConnection(cnnERP); if (cnnMES != null) CloseConnection(cnnMES); //if (daTemp != null) // daTemp.Dispose(); if (dsTemp != null) dsTemp.Dispose(); if (drTemp != null) drTemp.Close(); } } while (false); // -------------------------------------------------- // 八、當執行失敗,寄送 Email。必須有設定參數一。 // -------------------------------------------------- if (aryReturnMessage.Count > 0 && !string.IsNullOrEmpty(strParameter01)) { // strSubject = "[AUT]接收T100中介表:" & strIfTableName & "(產品、物料) 失敗 " strSubject = "[AUT]接收T100中介表:" + "(作業站) 失敗 "; strBody = Strings.Replace(strReturnMessage, Conversions.ToString('\n'), "
", Compare: CompareMethod.Text); // 寄送 Email if (ERP2MES_MailNotice(ref cnnMES, ref aryReturnMessage, strSubject, strParameter01, CInput(strBody)) < 0) { // '寄送不成功, ReturnMessage 再增加1項. // 'ProductIntegration += Chr(10) & aryReturnMessage.Item(aryReturnMessage.Count - 1).ToString // 寄送不成功, ReturnMessage 再增加1項. // tblMESAutoRunLog.ReturnMessage 長度4000限制. if (this.ProductIntegration().Length < 4000) { string strTemp = ""; strTemp = strReturnMessage; if (Convert.ToInt32(strTemp + aryReturnMessage[aryReturnMessage.Count - 1].ToString().Length) < 4000) { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); } else { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); // 自 strTemp 中截取0-3991碼. strTemp = strTemp.Substring(0, 3991) + "..."; } // //fail; OPIntegrationRet = "fail;" + strTemp; } } } return OPIntegrationRet; // --------------------------------------------------# } private int OPIntegration_ERP2MES_OP(ref IDbConnection cnnMES, ref ArrayList aryReturnMessage, ref int intReturnFailCount, string IfTableName, DataRow[] drSel_IF) { int OPIntegration_ERP2MES_OPRet = default(int); OPIntegration_ERP2MES_OPRet = -1; // Return -1:fail,0:Success // -------------------------------------------------- // 中介表 MES_OOCQ_T, 拋轉 MES 供應商主檔. // -------------------------------------------------- // aryMES_Message ,收集單筆中介交易記錄的錯誤記錄. // 新增供應商:OPName一律填入"N/A", 後續由 mes_oocql_t作業站主檔多語言檔更新. // =========================================================== // 宣告 DB相關 變數 // =========================================================== var drTemp = default(DbDataReader); Collection colSQL_T100 = new Collection(), colSQL_T100_Rows = new Collection(); // T100中介DB(MES回填處理記錄). Collection colSQL_2MES = new Collection(), colSQL_2MES_Rows = new Collection(); // MES正式異動資料(主要). string strSQL; // 每筆中介交易記錄 string strIfWhereCond_PK; string strMES_Result; string strMES_MESSAGE; // 錯誤訊息(中介表.MES_MESSAGE),Chr(10)分隔錯誤項目。 var aryMES_Message = new ArrayList(); // 收集單筆中介交易記錄的錯誤記錄, Exception及MES判定錯誤訊息。 var datNow = DateTime.Now; // Now try { // 宣告拋轉中介表資料使用變數 string strERP_OPNo, strERP_status, strERP_OPType; // 預設值 int intIssueState = 0; // -------------------------------------------------- // 必須以tran_Time順序,逐筆處理中介交易記錄。 // 每一筆交易記錄處理完成,立即變更 MESDB 及 MESSERIES_T100.中介表的MES處理記錄,綁在同一個交易裡. // (同包Transaction, 處理完畢後再一起commit) // 當某筆交易記錄處理失敗,立即變更 MESSERIES_T100.中介表的MES處理記錄,再接著處理下一筆記錄. // -------------------------------------------------- foreach (DataRow drIF in drSel_IF) { // reset datNow = DateTime.Now; // Now strIfWhereCond_PK = ""; strMES_Result = "9"; // 預設值 9 (MES處理結果, 成功回寫1, 失敗回寫9). strMES_MESSAGE = ""; // 錯誤訊息 aryMES_Message.Clear(); colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); colSQL_T100.Clear(); colSQL_T100_Rows.Clear(); do { try { // ----------------------------------------------------------- // 取出各欄位資料 // ----------------------------------------------------------- // 轉大寫 strERP_OPNo = drIF["oocq002"].ToString().Trim().ToUpper(); strERP_OPType = "OP"; strERP_status = drIF["tran_status"].ToString().Trim().ToUpper(); // ----------------------------------------------------------- // 固定檢查OPType資料,若不存在則自動新增。 // ----------------------------------------------------------- if (AddOPType(ref cnnMES, ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_OPType, strERPCreator, datNow, "AutoRun建立") < 0) break; // 檢查是否有此作業站設定 strSQL = "Select OPNo,IssueState From tblOPBasis " + " Where OPNo='" + strERP_OPNo + "'"; //cmmTemp = new IDbCommand(strSQL, cnnMES); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); bool exitTry = false; switch (strERP_status ?? "") { case "AU": // 有資料修改沒資料新增 { if (!drTemp.Read()) { // ----------------------------------------------------------- // 新增MES供應商設定 // ----------------------------------------------------------- strSQL = "Insert Into tblOPBasis " + "(OPType,OPNo,OPName,OPClass,OPShortName," + "OPOrder,STDUnitRunTime,CountOPUnitQty,STDQueueTime," + "IssueState,Creator,CreateDate)"; strSQL += " Values('" + strERP_OPType + "','" + strERP_OPNo + "','N/A',0,'N/A'," + " 0,0,1,0," + intIssueState + ",'" + strERPCreator + "'," + "To_Date('" + Strings.Format(datNow, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'))"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } // aryMES_Message.Add("作業站編號(oocq002):" & strERP_OPNo & ", 已存在MES, 不允許新增!!") // ERPws標準功能不論IssueState為何皆允許修改. // ----------------------------------------------------------- // 修改MES作業站設定 // ----------------------------------------------------------- // 修改作業站,因目前中介表定義欄位沒有需修改的,僅針對交易記錄判斷此產品在MES簽核狀態檢查是否需作變更。 else if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], -1, false))) { strSQL = "Update tblOPBasis Set " + " IssueState = " + intIssueState + " Where OPNo='" + strERP_OPNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } drTemp.Close(); //cmmTemp.Dispose(); break; } case "D": // D:刪除 { if (drTemp.Read()) { if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], 0, false))) { // ----------------------------------------------------------- // 先刪除MES產品相關設定 // ----------------------------------------------------------- if (OPIntegration_DelOP(ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_OPNo) < 0) { // GoTo lblExitTry_2_NextRow exitTry = true; break; } } else { // ----------------------------------------------------------- // 作廢MES產品設定 // ----------------------------------------------------------- strSQL = "Update tblOPBasis Set " + " IssueState=-1" + " Where OPNo='" + strERP_OPNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } } else { aryMES_Message.Add("作業站編號(oocq002):" + strERP_OPNo + ", 不存在MES, 不允許刪除!!"); } drTemp.Close(); //cmmTemp.Dispose(); break; } default: { aryMES_Message.Add("ERP資料狀態(Status):" + strERP_status + "無效, 不允許執行!!"); break; } } if (exitTry) { break; } // If aryMES_Message.Count > 0 Then GoTo lblExitTry_2_NextRow // =============================================================================== // 判定 MES_Result 處理結果 (成功回寫1, 失敗回寫9). // =============================================================================== if (aryMES_Message.Count == 0) { strMES_Result = "1"; // -------------------------------------------------- // 四、MES資料庫異動 // -------------------------------------------------- if (colSQL_2MES.Count > 0) { ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colSQL_2MES, colSQL_2MES_Rows); } } else { break; } } catch (Exception EX_drIF) { strMES_Result = "9"; aryMES_Message.Add("EX_drIF.Exception" + '\n' + EX_drIF.Message); } finally { // 組合執行錯誤字串: Chr(10)分隔 strMES_MESSAGE = ArrayList2String(ref aryMES_Message); // 2016/01/13, 直接異動中介表-------------------------- // 'If strMES_MESSAGE = defString Then // ' '當錯誤字串組合失敗,在Finally後會記錄PK. // 'End If // --------------------------------------------------# // MES_Message長度4000限制, 截取0-3996碼加"...". if (strMES_MESSAGE.Length > 4000) strMES_MESSAGE = strMES_MESSAGE.Substring(0, 3996) + "..."; // ---取消前面收集SQL--- colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); colSQL_T100.Clear(); // 若T100中介資料庫異動fail。(若MES_MESSAGE問題,下面會不會一樣fail?) colSQL_T100_Rows.Clear(); // ----------------------------------------------------------- // (EX_drIF.Exception) // 回填中介表資訊,(注意)各個資料表的PK不同。 // ----------------------------------------------------------- // mssql,無trim用法,不串變數值,直接檢查原欄位值. strIfWhereCond_PK = Conversions.ToString(" Where oocq002 = '" + drIF["oocq002"] + "'" + " And tran_time = '" + drIF["tran_time"] + "'" + " And oocqent ='" + ERP_EntID + "' "); if (Update_T100_IfTable(ref colSQL_T100, ref colSQL_T100_Rows, ref aryMES_Message, IfTableName, strIfWhereCond_PK, strMES_Result, datNow, strMES_MESSAGE) >= 0) { // -------------------------------------------------- // 六、T100中介資料庫異動(EX_drIF) // -------------------------------------------------- ExecuteSQLNoneQuery_ChkRowCount(strERPDataBaseType, strERPconnectionString, colSQL_T100, colSQL_T100_Rows); } } } while (false); // lblExitTry_2_NextRow: // 當該筆中介交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 if (aryMES_Message.Count > 0) { /// 匯整記錄中介表的PK資訊. // 因從錯誤訊息不一定看的出哪一筆中介表交易記錄fail. // 故失敗訊息連同中介表的必要資訊一併匯整. (Email要放詳細資訊) // (1) aryReturnMessage.Add("tran_time:" + drIF["tran_time"] + ", oocq002:" + drIF["oocq002"]); // (2) foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); } // 計算失敗筆數 if (strMES_Result == "9") intReturnFailCount += 1; // 不管成功或失敗,繼續下一筆。 } // //return 0 : Success OPIntegration_ERP2MES_OPRet = 0; } catch (Exception ex) { aryMES_Message.Add(ex.Message); // 當該筆中介交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); throw; } finally { if (drTemp != null) drTemp.Close(); } return OPIntegration_ERP2MES_OPRet; } private int AddOPType(ref IDbConnection cnnTemp, ref Collection colSQL, ref Collection colSQL_Rows, ref ArrayList aryErrorMessage, string strOPType, string strCreator, DateTime datCreateDate, string strDescription = "") { int AddOPTypeRet = default(int); AddOPTypeRet = -1; // Return -1:fail,0:Success // IssueState固定寫2 var drTemp = default(DbDataReader); string strSQL; try { strSQL = "Select OPType From tblOPType" + " Where OPType='" + strOPType + "'"; //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (!drTemp.Read()) { // 新增OPType主檔 strSQL = "Insert Into tblOPType " + "(OPType, Description, IssueState, Creator, CreateDate) " + " Values('" + strOPType + "','" + strDescription + "',2,'" + strCreator + "', To_Date('" + Strings.Format(datCreateDate, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'))"; colSQL.Add(strSQL); colSQL_Rows.Add(1); } drTemp.Close(); //cmmTemp.Dispose(); // Return AddOPTypeRet = 0; } catch (Exception ex) { aryErrorMessage.Add(ex.Message.ToString()); throw; } finally { if (drTemp != null) drTemp.Dispose(); } return AddOPTypeRet; } private int OPIntegration_DelOP(ref Collection colSQL_2MES, ref Collection colSQL_2MES_Rows, ref ArrayList aryMES_Message, string strERP_OPNo) { int OPIntegration_DelOPRet = default(int); OPIntegration_DelOPRet = -1; // Return -1:fail,0:Success string strSQL; try { // 1. 刪除Abnormal strSQL = "Delete From tblOPAbnormal Where OPNo='" + strERP_OPNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // 1. 刪除Error strSQL = "Delete From tblOPError Where OPNo='" + strERP_OPNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // 1. 刪除Property strSQL = "Delete From tblOPProperty Where OPNo='" + strERP_OPNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // 2. 刪除Business Rule Relation strSQL = "Delete From tblOPBusinessRuleRelation Where OPNo='" + strERP_OPNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // 3. 刪除Resource Area strSQL = "Delete From tblOPArea Where OPNo='" + strERP_OPNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // 4. 刪除Resource EQPType strSQL = "Delete From tblOPEquipmentType Where OPNo='" + strERP_OPNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // 5. 刪除Attrib strSQL = "Delete From tblOPAttrib Where OPNo='" + strERP_OPNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // 6. 刪除Rule strSQL = "Delete From tblOPRule Where OPNo='" + strERP_OPNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // 7. 刪除EQP Recipe strSQL = "Delete From tblOPEQPRecipe Where OPNo='" + strERP_OPNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // 8. 刪除QCItem strSQL = "Delete From tblOPQCItem Where OPNo='" + strERP_OPNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // 2006/05/08,sammi.處理DataGuard not support Long Type probleam. if (!objDBcom.DBSupportLongType) { strSQL = "Delete From tblOPRuleXml_CLOB Where OPNo='" + strERP_OPNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); } // 用 途:刪除作業站中子工序,因晶發專案客製於標準版中 // 撰寫人員:Sam.Hsu // 建立日期:2008/06/13 // OP SubOP strSQL = "Delete From tblOPSubOPBasis Where OPNo = '" + strERP_OPNo + "' "; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // 10. 刪除主檔 strSQL = "Delete From tblOPBasis Where OPNo='" + strERP_OPNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // //return 0 : Success OPIntegration_DelOPRet = 0; } catch (Exception ex) { aryMES_Message.Add(ex.Message.ToString()); throw; } return OPIntegration_DelOPRet; } private int OPIntegration_ERP2MES_Resource(ref IDbConnection cnnMES, ref ArrayList aryReturnMessage, ref int intReturnFailCount, string IfTableName, DataRow[] drSel_IF) { int OPIntegration_ERP2MES_ResourceRet = default(int); OPIntegration_ERP2MES_ResourceRet = -1; // Return -1:fail,0:Success // -------------------------------------------------- // mes_oocql_t 中介表 拋轉 MES 作業站主檔. // -------------------------------------------------- // aryMES_Message ,收集單筆中介交易記錄的錯誤記錄. // mes_oocq_t 作業站主檔更新 // status:針對產品做 Update,若拋D視為不合理的ERP資料狀態。 // =========================================================== // 宣告 DB相關 變數 // =========================================================== var drTemp = default(DbDataReader); Collection colSQL_T100 = new Collection(), colSQL_T100_Rows = new Collection(); // T100中介DB(MES回填處理記錄). Collection colSQL_2MES = new Collection(), colSQL_2MES_Rows = new Collection(); // MES正式異動資料(主要). string strSQL; // 每筆中介交易記錄 string strIfWhereCond_PK; string strMES_Result; string strMES_MESSAGE; // 錯誤訊息(中介表.MES_MESSAGE),Chr(10)分隔錯誤項目。 var aryMES_Message = new ArrayList(); // 收集單筆中介交易記錄的錯誤記錄, Exception及MES判定錯誤訊息。 var datNow = DateTime.Now; // Now try { // 宣告拋轉中介表資料使用變數 string strERP_OPNo, strERP_OPName, strERP_OPSName; DataRow drChkOP; // Dim colRecUnitInfo As New Collection '收集所有UnitNo,以判斷是否需Insert資料. // -------------------------------------------------- // 必須以tran_Time順序,逐筆處理中介交易記錄。 // 每一筆交易記錄處理完成,立即變更 MESDB 及 MESSERIES_T100.中介表的MES處理記錄,綁在同一個交易裡. // (同包Transaction, 處理完畢後再一起commit) // 當某筆交易記錄處理失敗,立即變更 MESSERIES_T100.中介表的MES處理記錄,再接著處理下一筆記錄. // -------------------------------------------------- foreach (DataRow drIF in drSel_IF) { // reset datNow = DateTime.Now; // Now strIfWhereCond_PK = ""; strMES_Result = "9"; // 預設值 9 (MES處理結果, 成功回寫1, 失敗回寫9). strMES_MESSAGE = ""; // 錯誤訊息 aryMES_Message.Clear(); colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); colSQL_T100.Clear(); colSQL_T100_Rows.Clear(); do { try { // ----------------------------------------------------------- // 取出各欄位資料 // ----------------------------------------------------------- // 編號 strERP_OPNo = drIF["oocql002"].ToString().Trim().ToUpper(); // 全名 strERP_OPName = modWIN.GetSubString(drIF["oocql004"].ToString().Trim().ToUpper(), 50); if (string.IsNullOrEmpty(strERP_OPName)) strERP_OPName = "N/A"; strERP_OPSName = modWIN.GetSubString(strERP_OPName, 20); // ERPws標準功能不論IssueState為何皆允許修改(產品主檔或物料主檔). // 1.檢查是否存在MES int intNo_ChkType = -1; // 檢查是否存在MES,物料找到(填0),產品找到(填1), Default -1 . string strReturnUnitType; // 1-1.檢查是否有此作業站設定 drChkOP = GetOPBasis(strERP_OPNo, cnnMES, aryMES_Message); if (drChkOP == null) break; // GoTo lblExitTry_2_NextRow 'fail if (drChkOP["OPNo"] is DBNull) { // oocql002,不存在MES的作業站主檔. aryMES_Message.Add("作業站編號(oocql002):" + strERP_OPNo + ", 不存在MES的作業站主檔, 不允許執行!!"); // GoTo lblExitTry_2_NextRow break; } // ----------------------------------------------------------- // 3-1.修改MES作業站設定 // ----------------------------------------------------------- strSQL = "Update tblOPBasis Set " + " OPName='" + strERP_OPName + "'" + " ,OPShortName='" + strERP_OPSName + "'"; // 注意事項:產品與物料,當IssueState=-1的更新方式不同. // MES已存在之資料IssueState如果是-1,ERP資料再次拋轉時,IssueState則更新為"2". if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drChkOP["IssueState"], -1, false))) strSQL += ",IssueState = 2"; strSQL += " Where OPNo='" + strERP_OPNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); // =============================================================================== // 判定 MES_Result 處理結果 (成功回寫1, 失敗回寫9). // =============================================================================== if (aryMES_Message.Count == 0) { strMES_Result = "1"; // -------------------------------------------------- // 四、MES資料庫異動 // -------------------------------------------------- if (colSQL_2MES.Count > 0) { ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colSQL_2MES, colSQL_2MES_Rows); } } else { break; } } catch (Exception EX_drIF) { strMES_Result = "9"; aryMES_Message.Add("EX_drIF.Exception" + '\n' + EX_drIF.Message); } finally { // 組合執行錯誤字串: Chr(10)分隔 strMES_MESSAGE = ArrayList2String(ref aryMES_Message); // 2016/01/13, 直接異動中介表-------------------------- // 'If strMES_MESSAGE = defString Then // ' '當錯誤字串組合失敗,在Finally後會記錄PK. // 'End If // --------------------------------------------------# // MES_Message長度4000限制, 截取0-3996碼加"...". if (strMES_MESSAGE.Length > 4000) strMES_MESSAGE = strMES_MESSAGE.Substring(0, 3996) + "..."; // ---取消前面收集SQL--- colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); colSQL_T100.Clear(); // 若T100中介資料庫異動fail。(若MES_MESSAGE問題,下面會不會一樣fail?) colSQL_T100_Rows.Clear(); // ----------------------------------------------------------- // (EX_drIF.Exception) // 回填中介表資訊,(注意)各個資料表的PK不同。 // ----------------------------------------------------------- // mssql,無trim用法,不串變數值,直接檢查原欄位值. strIfWhereCond_PK = Conversions.ToString(" Where oocql002 = '" + drIF["oocql002"] + "'" + " And tran_time = '" + drIF["tran_time"] + "'" + " And oocql003 = '" + drIF["oocql003"] + "'" + " And oocqlent ='" + ERP_EntID + "' "); if (Update_T100_IfTable(ref colSQL_T100, ref colSQL_T100_Rows, ref aryMES_Message, IfTableName, strIfWhereCond_PK, strMES_Result, datNow, strMES_MESSAGE) >= 0) { // -------------------------------------------------- // 六、T100中介資料庫異動(EX_drIF) // -------------------------------------------------- ExecuteSQLNoneQuery_ChkRowCount(strERPDataBaseType, strERPconnectionString, colSQL_T100, colSQL_T100_Rows); } } } while (false); // lblExitTry_2_NextRow: // 當該筆中介交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 if (aryMES_Message.Count > 0) { /// 匯整記錄中介表的PK資訊. // 因從錯誤訊息不一定看的出哪一筆中介表交易記錄fail. // 故失敗訊息連同中介表的必要資訊一併匯整. (Email要放詳細資訊) // (1) aryReturnMessage.Add("tran_time:" + drIF["tran_time"] + ", oocql002:" + drIF["oocql002"] + ", oocql003:" + drIF["oocql003"]); // (2) foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); } // 計算失敗筆數 if (strMES_Result == "9") intReturnFailCount += 1; // 不管成功或失敗,繼續下一筆。 } // //return 0 : Success OPIntegration_ERP2MES_ResourceRet = 0; } catch (Exception ex) { aryMES_Message.Add(ex.Message); // 當該筆中介交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); throw; } finally { if (drTemp != null) drTemp.Close(); } return OPIntegration_ERP2MES_ResourceRet; } private DataRow GetOPBasis(string OPNo, IDbConnection cnnTemp = null, ArrayList aryErrMessage = null, int IssueState = defInteger, string strAdditional = "") { DataRow GetOPBasisRet = default(DataRow); // 此 Function 將資料以 DataRow 方式取出 // 傳回值: DataRow(成功), Nothing(失敗) //var daTemp = default(System.Data.OleDb.OleDbDataAdapter); var dsTemp = default(DataSet); var cnnLocal = default(IDbConnection); string strCondition = default(string), strSQL = default(string); try { if (cnnTemp == null) { // //Create connection string argstrDataBaseType = "Null"; string strDataBaseTypeTmp = objSetting.GetConnectionString(strDataBaseType: argstrDataBaseType); cnnLocal = CreateConnection(strDataBaseTypeTmp); } else { cnnLocal = cnnTemp; } // //查詢條件 if ((OPNo ?? "") != defString) { strCondition += " And OPNo = '" + OPNo + "'"; } if (IssueState != defInteger) { strCondition += " And IssueState = " + IssueState; } // Additional if (!string.IsNullOrEmpty(strAdditional)) { strSQL += strAdditional; } // //主SQL strSQL = "Select * From tblOPBasis Where 1=1" + strCondition; // //Select data //cmmTemp = new IDbCommand(strSQL, cnnTemp); //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp); dsTemp = new DataSet(); //daTemp.Fill(dsTemp, "OPBasis"); ExecuteSQLQuery_Adapter(strSQL, dsTemp, "OPBasis", cnnTemp); // //Return data if (dsTemp.Tables[0].Rows.Count > 0) { GetOPBasisRet = dsTemp.Tables[0].Rows[0]; } else { GetOPBasisRet = dsTemp.Tables[0].NewRow(); } } catch (Exception ex) { GetOPBasisRet = null; // 此Function發生異常較難由訊息看出,加上FunctionName. aryErrMessage.Add("GetOPBasis:" + ex.Message); throw; } finally { if (cnnTemp == null) CloseConnection(cnnLocal); //if (daTemp != null) // daTemp.Dispose(); if (dsTemp != null) dsTemp.Dispose(); } return GetOPBasisRet; } private int AddOPProductionSegment(ref IDbConnection cnnTemp, ref Collection colSQL, ref Collection colSQL_Rows, ref ArrayList aryErrorMessage, string PSNo, string strCreator, DateTime datCreateDate, string strDescription = "") { int AddOPProductionSegmentRet = default(int); AddOPProductionSegmentRet = -1; // Return -1:fail,0:Success // IssueState固定寫2 var drTemp = default(DbDataReader); string strSQL; try { strSQL = "Select PSNo From tblPRSProductionSegment" + " Where PSNo='" + PSNo + "'"; //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (!drTemp.Read()) { // 新增一筆區段主檔資料 strSQL = "Insert Into tblPRSProductionSegment " + "(PSNo, PSName, PSOrder, Creator, CreateDate, Description, IssueState) " + " Values('" + PSNo + "','N/A' , 2, '" + strCreator + "'," + " To_Date('" + Strings.Format(datCreateDate, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')," + "'" + strDescription + "', 2 )"; colSQL.Add(strSQL); colSQL_Rows.Add(1); } drTemp.Close(); //cmmTemp.Dispose(); // Return AddOPProductionSegmentRet = 0; } catch (Exception ex) { aryErrorMessage.Add(ex.Message.ToString()); throw; } finally { if (drTemp != null) drTemp.Dispose(); } return AddOPProductionSegmentRet; } #endregion #region MES InterFaceTable 轉入 MES正式區(庫房) // 功 能: MES InterFaceTable 轉入 MES正式區(庫房) // 傳回值: success(成功), fail(失敗) private string InventoryIntegration(Collection colParameters = null) { string InventoryIntegrationRet = default(string); // =========================================================== // 宣告 DB相關 變數 // =========================================================== var cnnERP = default(IDbConnection); // T100中介DB使用(ERP) var cnnMES = default(IDbConnection); // MESDB使用 var drTemp = default(DbDataReader); //var daTemp = new System.Data.OleDb.OleDbDataAdapter(); var dsTemp = new DataSet(); Collection colSQL_T100 = new Collection(), colSQL_T100_Rows = new Collection(); // T100中介DB(MES回填處理記錄). Collection colSQL_2MES = new Collection(), colSQL_2MES_Rows = new Collection(); // MES正式異動資料(主要). string strSQL; // =========================================================== // 宣告 AutoRunJob設定及執行記錄 變數 // =========================================================== string strParameter01 = ""; // 參數一,預設此功能fail通知EMAIL群組。 string strSubject, strBody; // 寄送通知資訊 // AutorunJob拋轉資訊 string strReturnMessage = ""; // 錯誤訊息(tblMESAutoRunLog.ReturnMessage),Chr(10)分隔錯誤項目。 var aryReturnMessage = new ArrayList(); // Catch Error Message (Exception及MES判定錯誤訊息)。 int intFailCount_INV = 0; // Inventory拋轉失敗筆數 // =========================================================== // 宣告 其他 變數 // =========================================================== DateTime datNow; do { try { // -------------------------------------------------- // 一、取得參數 // -------------------------------------------------- // Parameter01為參數一 // 作為Mail通知群組(GroupNo),放在最前面防止連線失敗無法寄送通知。 if (colParameters.Contains("Parameter01")) { strParameter01 = colParameters["Parameter01"].ToString().Trim(); } // If strParameter01 = "" Then // ProductIntegration = "fail;使用者群?未?定!!(tblMESAutorunJob.Parameter01)" // Exit Function '離開 Function。 // End If // -------------------------------------------------- // 二、連線 DB // -------------------------------------------------- // T100中介DB cnnERP = CreateConnection(strERPconnectionString); // MES DB cnnMES = CreateConnection(strConnectionString); // 取得ERPSetting if (!GetERPSetting(ref dtERPSetting, "T100")) { break; } // -------------------------------------------------- // 檢查參數一 Mail通知群組 是否已設定. // -------------------------------------------------- if (!string.IsNullOrEmpty(strParameter01) && ERP2MES_MailNoticeChk(ref cnnMES, ref aryReturnMessage, strParameter01) < 0) { InventoryIntegrationRet = Conversions.ToString("fail;" + aryReturnMessage[0]); return InventoryIntegrationRet; // 離開 Function。 } if (aryReturnMessage.Count > 0) break; // Exit Try /// 取出 MESSERIES_T100.中介表資料. // -------------------------------------------------- // 二、MESSERIES_T100.中介表資料,請依序處理: // Loop 1.庫房主檔 MES_INAA_T:(必須優先) // 每筆交易明細: // MES_Result為空白代表未拋轉。 // 取出後立即異動DB,無論成功或失敗(不跳離),都繼續執行下一筆。 // -------------------------------------------------- string MES_INAA_T_1 = "MES_INAA_T"; DataRow[] drSel_IF; // -------------------------------------------------- // Loop 1.庫房主檔 MES_INAA_T // -------------------------------------------------- strSQL = "Select T1.*, T1.inaa001 As inaa001_Upper " + " From " + MES_INAA_T_1 + " T1" + " Where T1.MES_Result Is Null" + " And T1.inaasite = '" + ERP_Site + "' " + " And T1.inaaent ='" + ERP_EntID + "' "; //cmmTempERP = new IDbCommand(strSQL, cnnERP); //daTemp.SelectCommand = cmmTempERP; //daTemp.Fill(dsTemp, MES_INAA_T_1); //cmmTempERP.Dispose(); ExecuteSQLQuery_Adapter(strSQL, dsTemp, MES_INAA_T_1, cnnERP); if (!(dsTemp == null) && dsTemp.Tables[MES_INAA_T_1].Rows.Count > 0) { drSel_IF = dsTemp.Tables[MES_INAA_T_1].Select("", "tran_Time,inaa001"); if (!(drSel_IF == null) && drSel_IF.Length > 0) { // intFailCount_INV if (InventoryIntegration_ERP2MES_INV(ref cnnMES, ref aryReturnMessage, ref intFailCount_INV, MES_INAA_T_1, drSel_IF) < 0) { if (aryReturnMessage.Count == 0) // 避免不明原因,執行FAIL又沒收集到項目. { aryReturnMessage.Add("中介表:" + MES_INAA_T_1 + ", 拋轉執行失敗!!"); } } } } } catch (Exception EX_AUT) { if (cnnERP == null) { aryReturnMessage.Add("T100中介DB(ERP) 連線失敗!!"); } else if (cnnMES == null) { aryReturnMessage.Add("MES DB 連線失敗!!"); } else { aryReturnMessage.Add("EX_AUT.Exception" + '\n' + EX_AUT.Message.ToString()); } } // 回傳結果 ReturnMessage,已一併在Finally處理。 finally { // -------------------------------------------------- // 七、回傳執行結果:succces 或 fail(ReturnMessage) // -------------------------------------------------- if (aryReturnMessage.Count == 0) { InventoryIntegrationRet = "success"; } else { // 組合執行錯誤字串: Chr(10)分隔 strReturnMessage = ArrayList2String(ref aryReturnMessage); if ((strReturnMessage ?? "") == defString) { // 當錯誤字串組合失敗。補上 strReturnMessage = "ReturnMessage收集失敗!!"; } // If Not dsTemp.Tables(strIfTableName) Is Nothing Then // '整理中介表交易筆數 // Dim drSel As DataRow() // Dim strBody_Head As String = "" // strBody_Head = "T100中介表:" & strIfTableName & "匯入至MES正式區" & Chr(10) // drSel = dsTemp.Tables(strIfTableName).Select("imaa004='A'") // If drSel.Length > 0 Then // strBody_Head += "料件類別:A, 總筆數(" & drSel.Length & "),失敗筆數(" & intFailCount_PRD & ")" // End If // drSel = dsTemp.Tables(strIfTableName).Select("imaa004='M'") // If drSel.Length > 0 Then // strBody_Head += "料件類別:M, 總筆數(" & drSel.Length & "),失敗筆數(" & intFailCount_MTL & ")" // End If // '重組 strReturnMessage = 中介表交易筆數 & strReturnMessage // strReturnMessage = strBody_Head & Chr(10) & Chr(10) & strReturnMessage // 'Remove Table // dsTemp.Tables.Remove(strIfTableName) // dsTemp.AcceptChanges() // End If // tblMESAutoRunLog.ReturnMessage 長度4000限制. string strTemp = ""; if (strReturnMessage.Length > 4000) { // 自 strReturnMessage 中截取0-3991碼. strTemp = strReturnMessage.Substring(0, 3991) + "..."; } else { strTemp = strReturnMessage; } // //fail; InventoryIntegrationRet = "fail;" + strTemp; } if (cnnERP != null) CloseConnection(cnnERP); if (cnnMES != null) CloseConnection(cnnMES); //if (daTemp != null) // daTemp.Dispose(); if (dsTemp != null) dsTemp.Dispose(); if (drTemp != null) drTemp.Close(); } } while (false); // -------------------------------------------------- // 八、當執行失敗,寄送 Email。必須有設定參數一。 // -------------------------------------------------- if (aryReturnMessage.Count > 0 && !string.IsNullOrEmpty(strParameter01)) { // strSubject = "[AUT]接收T100中介表:" & strIfTableName & "(產品、物料) 失敗 " strSubject = "[AUT]接收T100中介表:" + "(庫房) 失敗 "; strBody = Strings.Replace(strReturnMessage, Conversions.ToString('\n'), "
", Compare: CompareMethod.Text); // 寄送 Email if (ERP2MES_MailNotice(ref cnnMES, ref aryReturnMessage, strSubject, strParameter01, CInput(strBody)) < 0) { // '寄送不成功, ReturnMessage 再增加1項. // 'ProductIntegration += Chr(10) & aryReturnMessage.Item(aryReturnMessage.Count - 1).ToString // 寄送不成功, ReturnMessage 再增加1項. // tblMESAutoRunLog.ReturnMessage 長度4000限制. if (this.ProductIntegration().Length < 4000) { string strTemp = ""; strTemp = strReturnMessage; if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(strTemp + aryReturnMessage[aryReturnMessage.Count - 1].ToString().Length, 4000, false))) { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); } else { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); // 自 strTemp 中截取0-3991碼. strTemp = strTemp.Substring(0, 3991) + "..."; } // //fail; InventoryIntegrationRet = "fail;" + strTemp; } } } return InventoryIntegrationRet; // --------------------------------------------------# } private int InventoryIntegration_ERP2MES_INV(ref IDbConnection cnnMES, ref ArrayList aryReturnMessage, ref int intReturnFailCount, string IfTableName, DataRow[] drSel_IF) { int InventoryIntegration_ERP2MES_INVRet = default(int); InventoryIntegration_ERP2MES_INVRet = -1; // Return -1:fail,0:Success // -------------------------------------------------- // 中介表 MES_OOCQ_T, 拋轉 MES 供應商主檔. // -------------------------------------------------- // aryMES_Message ,收集單筆中介交易記錄的錯誤記錄. // 新增供應商:OPName一律填入"N/A", 後續由 mes_oocql_t作業站主檔多語言檔更新. // =========================================================== // 宣告 DB相關 變數 // =========================================================== var drTemp = default(DbDataReader); Collection colSQL_T100 = new Collection(), colSQL_T100_Rows = new Collection(); // T100中介DB(MES回填處理記錄). Collection colSQL_2MES = new Collection(), colSQL_2MES_Rows = new Collection(); // MES正式異動資料(主要). string strSQL; // 每筆中介交易記錄 string strIfWhereCond_PK; string strMES_Result; string strMES_MESSAGE; // 錯誤訊息(中介表.MES_MESSAGE),Chr(10)分隔錯誤項目。 var aryMES_Message = new ArrayList(); // 收集單筆中介交易記錄的錯誤記錄, Exception及MES判定錯誤訊息。 var datNow = DateTime.Now; // Now try { // 宣告拋轉中介表資料使用變數 string strERP_INVNo, strERP_INVName, strERP_FactoryNo, strERP_status; // 預設值 int intIssueState = 0; // -------------------------------------------------- // 必須以tran_Time順序,逐筆處理中介交易記錄。 // 每一筆交易記錄處理完成,立即變更 MESDB 及 MESSERIES_T100.中介表的MES處理記錄,綁在同一個交易裡. // (同包Transaction, 處理完畢後再一起commit) // 當某筆交易記錄處理失敗,立即變更 MESSERIES_T100.中介表的MES處理記錄,再接著處理下一筆記錄. // -------------------------------------------------- foreach (DataRow drIF in drSel_IF) { // reset datNow = DateTime.Now; // Now strIfWhereCond_PK = ""; strMES_Result = "9"; // 預設值 9 (MES處理結果, 成功回寫1, 失敗回寫9). strMES_MESSAGE = ""; // 錯誤訊息 aryMES_Message.Clear(); colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); colSQL_T100.Clear(); colSQL_T100_Rows.Clear(); do { try { // ----------------------------------------------------------- // 取出各欄位資料 // ----------------------------------------------------------- // 轉大寫 strERP_FactoryNo = drIF["inaasite"].ToString().Trim().ToUpper(); strERP_INVNo = drIF["inaa001"].ToString().Trim().ToUpper(); strERP_INVName = drIF["inaa002"].ToString().Trim().ToUpper(); if (strERP_INVName == null || string.IsNullOrEmpty(strERP_INVName.Trim())) strERP_INVName = "N/A"; strERP_status = drIF["tran_status"].ToString().Trim().ToUpper(); // 檢查是否有此作業站設定 strSQL = "Select InventoryNo,IssueState From tblINVInventoryBasis " + " Where InventoryNo='" + strERP_INVNo + "'"; //cmmTemp = new IDbCommand(strSQL, cnnMES); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); bool exitTry = false; switch (strERP_status ?? "") { case "AU": // 有資料修改沒資料新增 { if (!drTemp.Read()) { // ----------------------------------------------------------- // 新增MES庫房設定 // ----------------------------------------------------------- strSQL = "Insert Into tblINVInventoryBasis " + "(InventoryNo,InventoryName,InventoryType,InventoryClass,FactoryNo," + "IssueState,Creator,CreateDate)"; strSQL += " Values('" + strERP_INVNo + "','" + strERP_INVName + "',0,0,'" + strERP_FactoryNo + "'," + intIssueState + ",'" + strERPCreator + "'," + "To_Date('" + Strings.Format(datNow, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'))"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } else { // aryMES_Message.Add("庫房編號(inaa001):" & strERP_INVNo & ", 已存在MES, 不允許新增!!") // ERPws標準功能不論IssueState為何皆允許修改. // ----------------------------------------------------------- // 修改MES庫房設定 // ----------------------------------------------------------- strSQL = "Update tblINVInventoryBasis Set " + " FactoryNo = '" + strERP_FactoryNo + "'" + " ,InventoryName = '" + strERP_INVName + "'"; // MES已存在之資料IssueState如果是-1,ERP資料再次拋轉時,IssueState則更新為"0". if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], -1, false))) { strSQL += " ,IssueState = " + intIssueState; } strSQL += " Where InventoryNo='" + strERP_INVNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } drTemp.Close(); //cmmTemp.Dispose(); break; } case "D": // D:刪除 { if (drTemp.Read()) { if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], 0, false))) { // ----------------------------------------------------------- // 先刪除MES庫房相關設定 // ----------------------------------------------------------- if (InventoryIntegration_DelInventory(ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_INVNo) < 0) { // GoTo lblExitTry_2_NextRow exitTry = true; break; } } else { // ----------------------------------------------------------- // 作廢MES產品設定 // ----------------------------------------------------------- strSQL = "Update tblINVInventoryBasis Set " + " IssueState = -1" + " Where InventoryNo='" + strERP_INVNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } } else { aryMES_Message.Add("庫房編號(inaa001):" + strERP_INVNo + ", 不存在MES, 不允許刪除!!"); } drTemp.Close(); //cmmTemp.Dispose(); break; } default: { aryMES_Message.Add("ERP資料狀態(Status):" + strERP_status + "無效, 不允許執行!!"); break; } } if (exitTry) { break; } // If aryMES_Message.Count > 0 Then GoTo lblExitTry_2_NextRow // =============================================================================== // 判定 MES_Result 處理結果 (成功回寫1, 失敗回寫9). // =============================================================================== if (aryMES_Message.Count == 0) { strMES_Result = "1"; // -------------------------------------------------- // 四、MES資料庫異動 // -------------------------------------------------- if (colSQL_2MES.Count > 0) { ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colSQL_2MES, colSQL_2MES_Rows); } } else { break; } } catch (Exception EX_drIF) { strMES_Result = "9"; aryMES_Message.Add("EX_drIF.Exception" + '\n' + EX_drIF.Message); } finally { // 組合執行錯誤字串: Chr(10)分隔 strMES_MESSAGE = ArrayList2String(ref aryMES_Message); // 2016/01/13, 直接異動中介表-------------------------- // 'If strMES_MESSAGE = defString Then // ' '當錯誤字串組合失敗,在Finally後會記錄PK. // 'End If // --------------------------------------------------# // MES_Message長度4000限制, 截取0-3996碼加"...". if (strMES_MESSAGE.Length > 4000) strMES_MESSAGE = strMES_MESSAGE.Substring(0, 3996) + "..."; // ---取消前面收集SQL--- colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); colSQL_T100.Clear(); // 若T100中介資料庫異動fail。(若MES_MESSAGE問題,下面會不會一樣fail?) colSQL_T100_Rows.Clear(); // ----------------------------------------------------------- // (EX_drIF.Exception) // 回填中介表資訊,(注意)各個資料表的PK不同。 // ----------------------------------------------------------- // mssql,無trim用法,不串變數值,直接檢查原欄位值. strIfWhereCond_PK = Conversions.ToString(" Where inaa001 = '" + drIF["inaa001"] + "'" + " And tran_time = '" + drIF["tran_time"] + "'" + " And inaasite = '" + ERP_Site + "' " + " And inaaent ='" + ERP_EntID + "' "); if (Update_T100_IfTable(ref colSQL_T100, ref colSQL_T100_Rows, ref aryMES_Message, IfTableName, strIfWhereCond_PK, strMES_Result, datNow, strMES_MESSAGE) >= 0) { // GoTo lblExitTry_2_NextRow // Exit Try // -------------------------------------------------- // 六、T100中介資料庫異動(EX_drIF) // -------------------------------------------------- ExecuteSQLNoneQuery_ChkRowCount(strERPDataBaseType, strERPconnectionString, colSQL_T100, colSQL_T100_Rows); } } } while (false); // lblExitTry_2_NextRow: // 當該筆中介交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 if (aryMES_Message.Count > 0) { /// 匯整記錄中介表的PK資訊. // 因從錯誤訊息不一定看的出哪一筆中介表交易記錄fail. // 故失敗訊息連同中介表的必要資訊一併匯整. (Email要放詳細資訊) // (1) aryReturnMessage.Add("tran_time:" + drIF["tran_time"] + ", inaa001:" + drIF["inaa001"]); // (2) foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); } // 計算失敗筆數 if (strMES_Result == "9") intReturnFailCount += 1; // 不管成功或失敗,繼續下一筆。 } // //return 0 : Success InventoryIntegration_ERP2MES_INVRet = 0; } catch (Exception ex) { aryMES_Message.Add(ex.Message); // 當該筆中介交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); throw; } finally { if (drTemp != null) drTemp.Close(); } return InventoryIntegration_ERP2MES_INVRet; } private int InventoryIntegration_DelInventory(ref Collection colSQL_2MES, ref Collection colSQL_2MES_Rows, ref ArrayList aryMES_Message, string strERP_INVNo) { int InventoryIntegration_DelInventoryRet = default(int); InventoryIntegration_DelInventoryRet = -1; // Return -1:fail,0:Success string strSQL; try { // 1. 刪除庫房基本資料 strSQL = "Delete From tblINVInventoryBasis " + "Where InventoryNo='" + strERP_INVNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // 2. 刪除庫房屬性 strSQL = "Delete From tblINVInventoryProperty Where InventoryNo='" + strERP_INVNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // 3. 刪除儲位 strSQL = "Delete From tblINVLocatorBasis Where InventoryNo='" + strERP_INVNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // //return 0 : Success InventoryIntegration_DelInventoryRet = 0; } catch (Exception ex) { aryMES_Message.Add(ex.Message.ToString()); throw; } return InventoryIntegration_DelInventoryRet; } #endregion #region MES InterFaceTable 轉入 MES正式區(儲位) // 功 能: MES InterFaceTable 轉入 MES正式區(儲位) // 傳回值: success(成功), fail(失敗) private string LocatorIntegration(Collection colParameters = null) { string LocatorIntegrationRet = default(string); // =========================================================== // 宣告 DB相關 變數 // =========================================================== var cnnERP = default(IDbConnection); // T100中介DB使用(ERP) var cnnMES = default(IDbConnection); // MESDB使用 var drTemp = default(DbDataReader); //var daTemp = new System.Data.OleDb.OleDbDataAdapter(); var dsTemp = new DataSet(); Collection colSQL_T100 = new Collection(), colSQL_T100_Rows = new Collection(); // T100中介DB(MES回填處理記錄). Collection colSQL_2MES = new Collection(), colSQL_2MES_Rows = new Collection(); // MES正式異動資料(主要). string strSQL; // =========================================================== // 宣告 AutoRunJob設定及執行記錄 變數 // =========================================================== string strParameter01 = ""; // 參數一,預設此功能fail通知EMAIL群組。 string strSubject, strBody; // 寄送通知資訊 // AutorunJob拋轉資訊 string strReturnMessage = ""; // 錯誤訊息(tblMESAutoRunLog.ReturnMessage),Chr(10)分隔錯誤項目。 var aryReturnMessage = new ArrayList(); // Catch Error Message (Exception及MES判定錯誤訊息)。 int intFailCount_Locator = 0; // Locator拋轉失敗筆數 // =========================================================== // 宣告 其他 變數 // =========================================================== DateTime datNow; do { try { // -------------------------------------------------- // 一、取得參數 // -------------------------------------------------- // Parameter01為參數一 // 作為Mail通知群組(GroupNo),放在最前面防止連線失敗無法寄送通知。 if (colParameters.Contains("Parameter01")) { strParameter01 = colParameters["Parameter01"].ToString().Trim(); } // If strParameter01 = "" Then // ProductIntegration = "fail;使用者群?未?定!!(tblMESAutorunJob.Parameter01)" // Exit Function '離開 Function。 // End If // -------------------------------------------------- // 二、連線 DB // -------------------------------------------------- // T100中介DB cnnERP = CreateConnection(strERPconnectionString); // MES DB cnnMES = CreateConnection(strConnectionString); // 取得ERPSetting if (!GetERPSetting(ref dtERPSetting, "T100")) { break; } // -------------------------------------------------- // 檢查參數一 Mail通知群組 是否已設定. // -------------------------------------------------- if (!string.IsNullOrEmpty(strParameter01) && ERP2MES_MailNoticeChk(ref cnnMES, ref aryReturnMessage, strParameter01) < 0) { LocatorIntegrationRet = Conversions.ToString("fail;" + aryReturnMessage[0]); return LocatorIntegrationRet; // 離開 Function。 } if (aryReturnMessage.Count > 0) break; // Exit Try /// 取出 MESSERIES_T100.中介表資料. // -------------------------------------------------- // 二、MESSERIES_T100.中介表資料,請依序處理: // Loop 1.庫房主檔 MES_INAB_T:(必須優先) // 每筆交易明細: // MES_Result為空白代表未拋轉。 // 取出後立即異動DB,無論成功或失敗(不跳離),都繼續執行下一筆。 // -------------------------------------------------- string MES_INAB_T_1 = "MES_INAB_T"; DataRow[] drSel_IF; // -------------------------------------------------- // Loop 1.庫房主檔 MES_INAA_T // -------------------------------------------------- strSQL = "Select T1.*, T1.inab001 As inab001_Upper, T1.inab002 As inab002_Upper " + " From " + MES_INAB_T_1 + " T1" + " Where T1.MES_Result Is Null" + " And T1.inabsite = '" + ERP_Site + "' " + " And T1.inabent ='" + ERP_EntID + "' "; //cmmTempERP = new IDbCommand(strSQL, cnnERP); //daTemp.SelectCommand = cmmTempERP; //daTemp.Fill(dsTemp, MES_INAB_T_1); //cmmTempERP.Dispose(); ExecuteSQLQuery_Adapter(strSQL, dsTemp, MES_INAB_T_1, cnnERP); if (!(dsTemp == null) && dsTemp.Tables[MES_INAB_T_1].Rows.Count > 0) { drSel_IF = dsTemp.Tables[MES_INAB_T_1].Select("", "tran_Time,inab001,inab002"); if (!(drSel_IF == null) && drSel_IF.Length > 0) { // intFailCount_Locator if (LocatorIntegration_ERP2MES_Locator(ref cnnMES, ref aryReturnMessage, ref intFailCount_Locator, MES_INAB_T_1, drSel_IF) < 0) { if (aryReturnMessage.Count == 0) // 避免不明原因,執行FAIL又沒收集到項目. { aryReturnMessage.Add("中介表:" + MES_INAB_T_1 + ", 拋轉執行失敗!!"); } } } } } catch (Exception EX_AUT) { if (cnnERP == null) { aryReturnMessage.Add("T100中介DB(ERP) 連線失敗!!"); } else if (cnnMES == null) { aryReturnMessage.Add("MES DB 連線失敗!!"); } else { aryReturnMessage.Add("EX_AUT.Exception" + '\n' + EX_AUT.Message.ToString()); } } // 回傳結果 ReturnMessage,已一併在Finally處理。 finally { // -------------------------------------------------- // 七、回傳執行結果:succces 或 fail(ReturnMessage) // -------------------------------------------------- if (aryReturnMessage.Count == 0) { LocatorIntegrationRet = "success"; } else { // 組合執行錯誤字串: Chr(10)分隔 strReturnMessage = ArrayList2String(ref aryReturnMessage); if ((strReturnMessage ?? "") == defString) { // 當錯誤字串組合失敗。補上 strReturnMessage = "ReturnMessage收集失敗!!"; } // If Not dsTemp.Tables(strIfTableName) Is Nothing Then // '整理中介表交易筆數 // Dim drSel As DataRow() // Dim strBody_Head As String = "" // strBody_Head = "T100中介表:" & strIfTableName & "匯入至MES正式區" & Chr(10) // drSel = dsTemp.Tables(strIfTableName).Select("imaa004='A'") // If drSel.Length > 0 Then // strBody_Head += "料件類別:A, 總筆數(" & drSel.Length & "),失敗筆數(" & intFailCount_PRD & ")" // End If // drSel = dsTemp.Tables(strIfTableName).Select("imaa004='M'") // If drSel.Length > 0 Then // strBody_Head += "料件類別:M, 總筆數(" & drSel.Length & "),失敗筆數(" & intFailCount_MTL & ")" // End If // '重組 strReturnMessage = 中介表交易筆數 & strReturnMessage // strReturnMessage = strBody_Head & Chr(10) & Chr(10) & strReturnMessage // 'Remove Table // dsTemp.Tables.Remove(strIfTableName) // dsTemp.AcceptChanges() // End If // tblMESAutoRunLog.ReturnMessage 長度4000限制. string strTemp = ""; if (strReturnMessage.Length > 4000) { // 自 strReturnMessage 中截取0-3991碼. strTemp = strReturnMessage.Substring(0, 3991) + "..."; } else { strTemp = strReturnMessage; } // //fail; LocatorIntegrationRet = "fail;" + strTemp; } if (cnnERP != null) CloseConnection(cnnERP); if (cnnMES != null) CloseConnection(cnnMES); //if (daTemp != null) // daTemp.Dispose(); if (dsTemp != null) dsTemp.Dispose(); if (drTemp != null) drTemp.Close(); } } while (false); // -------------------------------------------------- // 八、當執行失敗,寄送 Email。必須有設定參數一。 // -------------------------------------------------- if (aryReturnMessage.Count > 0 && !string.IsNullOrEmpty(strParameter01)) { // strSubject = "[AUT]接收T100中介表:" & strIfTableName & "(產品、物料) 失敗 " strSubject = "[AUT]接收T100中介表:" + "(儲位) 失敗 "; strBody = Strings.Replace(strReturnMessage, Conversions.ToString('\n'), "
", Compare: CompareMethod.Text); // 寄送 Email if (ERP2MES_MailNotice(ref cnnMES, ref aryReturnMessage, strSubject, strParameter01, CInput(strBody)) < 0) { // '寄送不成功, ReturnMessage 再增加1項. // 'ProductIntegration += Chr(10) & aryReturnMessage.Item(aryReturnMessage.Count - 1).ToString // 寄送不成功, ReturnMessage 再增加1項. // tblMESAutoRunLog.ReturnMessage 長度4000限制. if (this.ProductIntegration().Length < 4000) { string strTemp = ""; strTemp = strReturnMessage; if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(strTemp + aryReturnMessage[aryReturnMessage.Count - 1].ToString().Length, 4000, false))) { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); } else { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); // 自 strTemp 中截取0-3991碼. strTemp = strTemp.Substring(0, 3991) + "..."; } // //fail; LocatorIntegrationRet = "fail;" + strTemp; } } } return LocatorIntegrationRet; // --------------------------------------------------# } private int LocatorIntegration_ERP2MES_Locator(ref IDbConnection cnnMES, ref ArrayList aryReturnMessage, ref int intReturnFailCount, string IfTableName, DataRow[] drSel_IF) { int LocatorIntegration_ERP2MES_LocatorRet = default(int); LocatorIntegration_ERP2MES_LocatorRet = -1; // Return -1:fail,0:Success // -------------------------------------------------- // 中介表 MES_OOCQ_T, 拋轉 MES 供應商主檔. // -------------------------------------------------- // aryMES_Message ,收集單筆中介交易記錄的錯誤記錄. // 新增供應商:OPName一律填入"N/A", 後續由 mes_oocql_t作業站主檔多語言檔更新. // =========================================================== // 宣告 DB相關 變數 // =========================================================== var drTemp = default(DbDataReader); Collection colSQL_T100 = new Collection(), colSQL_T100_Rows = new Collection(); // T100中介DB(MES回填處理記錄). Collection colSQL_2MES = new Collection(), colSQL_2MES_Rows = new Collection(); // MES正式異動資料(主要). string strSQL; // 每筆中介交易記錄 string strIfWhereCond_PK; string strMES_Result; string strMES_MESSAGE; // 錯誤訊息(中介表.MES_MESSAGE),Chr(10)分隔錯誤項目。 var aryMES_Message = new ArrayList(); // 收集單筆中介交易記錄的錯誤記錄, Exception及MES判定錯誤訊息。 var datNow = DateTime.Now; // Now try { // 宣告拋轉中介表資料使用變數 string strERP_INVNo, strERP_Locator, strERP_status, strERP_FactoryNo; // 預設值 int intIssueState = 2; // -------------------------------------------------- // 必須以tran_Time順序,逐筆處理中介交易記錄。 // 每一筆交易記錄處理完成,立即變更 MESDB 及 MESSERIES_T100.中介表的MES處理記錄,綁在同一個交易裡. // (同包Transaction, 處理完畢後再一起commit) // 當某筆交易記錄處理失敗,立即變更 MESSERIES_T100.中介表的MES處理記錄,再接著處理下一筆記錄. // -------------------------------------------------- foreach (DataRow drIF in drSel_IF) { // reset datNow = DateTime.Now; // Now strIfWhereCond_PK = ""; strMES_Result = "9"; // 預設值 9 (MES處理結果, 成功回寫1, 失敗回寫9). strMES_MESSAGE = ""; // 錯誤訊息 aryMES_Message.Clear(); colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); colSQL_T100.Clear(); colSQL_T100_Rows.Clear(); do { try { // ----------------------------------------------------------- // 取出各欄位資料 // ----------------------------------------------------------- // 轉大寫 strERP_FactoryNo = drIF["inabsite"].ToString().Trim().ToUpper(); strERP_INVNo = drIF["inab001"].ToString().Trim().ToUpper(); strERP_Locator = drIF["inab002"].ToString().ToUpper(); if (string.IsNullOrEmpty(strERP_Locator.Trim())) strERP_Locator = "N/A"; strERP_status = drIF["tran_status"].ToString().Trim().ToUpper(); strSQL = "Select InventoryNo,IssueState From tblINVInventoryBasis " + " Where InventoryNo='" + strERP_INVNo + "'"; //cmmTemp = new IDbCommand(strSQL, cnnMES); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); if (!drTemp.Read()) { strSQL = "Insert Into tblINVInventoryBasis " + "(InventoryNo,InventoryName,InventoryType,InventoryClass,FactoryNo," + "IssueState,Creator,CreateDate)"; strSQL += " Values('" + strERP_INVNo + "','N/A',0,0,'" + strERP_FactoryNo + "',0,'" + strERPCreator + "'," + "To_Date('" + Strings.Format(datNow, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'))"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } drTemp.Close(); //cmmTemp.Dispose(); // 檢查是否有此儲位設定 strSQL = "Select InventoryNo,IssueState From tblINVLocatorBasis " + " Where InventoryNo='" + strERP_INVNo + "'" + " And LocatorNo='" + strERP_Locator + "'"; //cmmTemp = new IDbCommand(strSQL, cnnMES); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); bool exitTry = false; switch (strERP_status ?? "") { case "AU": // 有資料修改沒資料新增 { if (!drTemp.Read()) { // ----------------------------------------------------------- // 新增MES供應商設定 // ----------------------------------------------------------- strSQL = "Insert Into tblINVLocatorBasis " + "(LocatorNo,InventoryNo," + "IssueState,Creator,CreateDate)"; strSQL += " Values('" + strERP_Locator + "','" + strERP_INVNo + "'," + intIssueState + ",'" + strERPCreator + "'," + "To_Date('" + Strings.Format(datNow, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'))"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } // aryMES_Message.Add("庫房編號(inab001):" & strERP_INVNo & ",儲位編號(inab002):" & strERP_Locator & ", 已存在MES, 不允許新增!!") // ERPws標準功能不論IssueState為何皆允許修改. // ----------------------------------------------------------- // 修改MES產品設定 // ----------------------------------------------------------- // 修改產品,因目前中介表定義欄位沒有需修改的,僅針對交易記錄判斷此產品在MES簽核狀態檢查是否需作變更。 else if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], -1, false))) { // 注意事項:產品與物料,當IssueState=-1的更新方式不同. // MES已存在之資料IssueState如果是-1,ERP資料再次拋轉時,IssueState則更新為"0". strSQL = "Update tblINVInventoryBasis Set " + " IssueState = " + intIssueState + " Where InventoryNo='" + strERP_INVNo + "'" + " And LocatorNo='" + strERP_Locator + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } break; } case "D": // D:刪除 { if (drTemp.Read()) { if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], 0, false))) { // ----------------------------------------------------------- // 先刪除MES產品相關設定 // ----------------------------------------------------------- if (LocatorIntegration_DelLocator(ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_INVNo, strERP_Locator) < 0) { // GoTo lblExitTry_2_NextRow exitTry = true; break; } } else { // ----------------------------------------------------------- // 作廢MES產品設定 // ----------------------------------------------------------- strSQL = "Update tblINVInventoryBasis Set " + " IssueState = -1" + " Where InventoryNo='" + strERP_INVNo + "'" + " And LocatorNo='" + strERP_Locator + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } } else { aryMES_Message.Add("庫房編號(inab001):" + strERP_INVNo + ",儲位編號(inab002):" + strERP_Locator + ", 不存在MES, 不允許刪除!!"); } break; } default: { aryMES_Message.Add("ERP資料狀態(Status):" + strERP_status + "無效, 不允許執行!!"); break; } } if (exitTry) { break; } drTemp.Close(); //cmmTemp.Dispose(); // If aryMES_Message.Count > 0 Then GoTo lblExitTry_2_NextRow // =============================================================================== // 判定 MES_Result 處理結果 (成功回寫1, 失敗回寫9). // =============================================================================== if (aryMES_Message.Count == 0) { strMES_Result = "1"; // -------------------------------------------------- // 四、MES資料庫異動 // -------------------------------------------------- if (colSQL_2MES.Count > 0) { ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colSQL_2MES, colSQL_2MES_Rows); } } else { break; } } catch (Exception EX_drIF) { strMES_Result = "9"; aryMES_Message.Add("EX_drIF.Exception" + '\n' + EX_drIF.Message); } finally { // 組合執行錯誤字串: Chr(10)分隔 strMES_MESSAGE = ArrayList2String(ref aryMES_Message); // 2016/01/13, 直接異動中介表-------------------------- // 'If strMES_MESSAGE = defString Then // ' '當錯誤字串組合失敗,在Finally後會記錄PK. // 'End If // --------------------------------------------------# // MES_Message長度4000限制, 截取0-3996碼加"...". if (strMES_MESSAGE.Length > 4000) strMES_MESSAGE = strMES_MESSAGE.Substring(0, 3996) + "..."; // ---取消前面收集SQL--- colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); colSQL_T100.Clear(); // 若T100中介資料庫異動fail。(若MES_MESSAGE問題,下面會不會一樣fail?) colSQL_T100_Rows.Clear(); // ----------------------------------------------------------- // (EX_drIF.Exception) // 回填中介表資訊,(注意)各個資料表的PK不同。 // ----------------------------------------------------------- // mssql,無trim用法,不串變數值,直接檢查原欄位值. strIfWhereCond_PK = Conversions.ToString(" Where inab001 = '" + drIF["inab001"] + "'" + " And inab002 = '" + drIF["inab002"] + "'" + " And tran_time = '" + drIF["tran_time"] + "'" + " And inabsite = '" + ERP_Site + "' " + " And inabent ='" + ERP_EntID + "' "); if (Update_T100_IfTable(ref colSQL_T100, ref colSQL_T100_Rows, ref aryMES_Message, IfTableName, strIfWhereCond_PK, strMES_Result, datNow, strMES_MESSAGE) >= 0) { // GoTo lblExitTry_2_NextRow // Exit Try // -------------------------------------------------- // 六、T100中介資料庫異動(EX_drIF) // -------------------------------------------------- ExecuteSQLNoneQuery_ChkRowCount(strERPDataBaseType, strERPconnectionString, colSQL_T100, colSQL_T100_Rows); } } } while (false); // lblExitTry_2_NextRow: // 當該筆中介交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 if (aryMES_Message.Count > 0) { /// 匯整記錄中介表的PK資訊. // 因從錯誤訊息不一定看的出哪一筆中介表交易記錄fail. // 故失敗訊息連同中介表的必要資訊一併匯整. (Email要放詳細資訊) // (1) aryReturnMessage.Add("tran_time:" + drIF["tran_time"] + ", inab001:" + drIF["inab001"] + ", inab002:" + drIF["inab002"]); // (2) foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); } // 計算失敗筆數 if (strMES_Result == "9") intReturnFailCount += 1; // 不管成功或失敗,繼續下一筆。 } // //return 0 : Success LocatorIntegration_ERP2MES_LocatorRet = 0; } catch (Exception ex) { aryMES_Message.Add(ex.Message); // 當該筆中介交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); throw; } finally { if (drTemp != null) drTemp.Close(); } return LocatorIntegration_ERP2MES_LocatorRet; } private int LocatorIntegration_DelLocator(ref Collection colSQL_2MES, ref Collection colSQL_2MES_Rows, ref ArrayList aryMES_Message, string strERP_INVNo, string strERP_LocatorNo) { int LocatorIntegration_DelLocatorRet = default(int); LocatorIntegration_DelLocatorRet = -1; // Return -1:fail,0:Success string strSQL; try { // 1. 刪除儲位 strSQL = "Delete From tblINVLocatorBasis Where InventoryNo='" + strERP_INVNo + "' And LocatorNo = '" + strERP_LocatorNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // //return 0 : Success LocatorIntegration_DelLocatorRet = 0; } catch (Exception ex) { aryMES_Message.Add(ex.Message.ToString()); throw; } return LocatorIntegration_DelLocatorRet; } #endregion #region MES InterFaceTable 轉入 MES正式區(資源) // 功 能: MES InterFaceTable 轉入 MES正式區(資源) // 傳回值: success(成功), fail(失敗) private string ResourcesIntegration(Collection colParameters = null) { string ResourcesIntegrationRet = default(string); // =========================================================== // 宣告 DB相關 變數 // =========================================================== var cnnERP = default(IDbConnection); // T100中介DB使用(ERP) var cnnMES = default(IDbConnection); // MESDB使用 var drTemp = default(DbDataReader); //var daTemp = new System.Data.OleDb.OleDbDataAdapter(); var dsTemp = new DataSet(); Collection colSQL_T100 = new Collection(), colSQL_T100_Rows = new Collection(); // T100中介DB(MES回填處理記錄). Collection colSQL_2MES = new Collection(), colSQL_2MES_Rows = new Collection(); // MES正式異動資料(主要). string strSQL; // =========================================================== // 宣告 AutoRunJob設定及執行記錄 變數 // =========================================================== string strParameter01 = ""; // 參數一,預設此功能fail通知EMAIL群組。 string strSubject, strBody; // 寄送通知資訊 // AutorunJob拋轉資訊 string strReturnMessage = ""; // 錯誤訊息(tblMESAutoRunLog.ReturnMessage),Chr(10)分隔錯誤項目。 var aryReturnMessage = new ArrayList(); // Catch Error Message (Exception及MES判定錯誤訊息)。 int intFailCount_EQP = 0; // EQP拋轉失敗筆數 // =========================================================== // 宣告 其他 變數 // =========================================================== DateTime datNow; do { try { // -------------------------------------------------- // 一、取得參數 // -------------------------------------------------- // Parameter01為參數一 // 作為Mail通知群組(GroupNo),放在最前面防止連線失敗無法寄送通知。 if (colParameters.Contains("Parameter01")) { strParameter01 = colParameters["Parameter01"].ToString().Trim(); } // If strParameter01 = "" Then // ProductIntegration = "fail;使用者群?未?定!!(tblMESAutorunJob.Parameter01)" // Exit Function '離開 Function。 // End If // -------------------------------------------------- // 二、連線 DB // -------------------------------------------------- // T100中介DB cnnERP = CreateConnection(strERPconnectionString); // MES DB cnnMES = CreateConnection(strConnectionString); // 取得ERPSetting if (!GetERPSetting(ref dtERPSetting, "T100")) { break; } // -------------------------------------------------- // 檢查參數一 Mail通知群組 是否已設定. // -------------------------------------------------- if (!string.IsNullOrEmpty(strParameter01) && ERP2MES_MailNoticeChk(ref cnnMES, ref aryReturnMessage, strParameter01) < 0) { ResourcesIntegrationRet = Conversions.ToString("fail;" + aryReturnMessage[0]); return ResourcesIntegrationRet; // 離開 Function。 } if (aryReturnMessage.Count > 0) break; // Exit Try /// 取出 MESSERIES_T100.中介表資料. // -------------------------------------------------- // 二、MESSERIES_T100.中介表資料,請依序處理: // Loop 1.庫房主檔 MES_INAB_T:(必須優先) // 每筆交易明細: // MES_Result為空白代表未拋轉。 // 取出後立即異動DB,無論成功或失敗(不跳離),都繼續執行下一筆。 // -------------------------------------------------- string MES_MRBA_T_1 = "MES_MRBA_T"; DataRow[] drSel_IF; // -------------------------------------------------- // Loop 1. 設備主檔 MES_MRBA_T // -------------------------------------------------- strSQL = "Select T1.*, T1.mrba001 As mrba001_Upper " + " From " + MES_MRBA_T_1 + " T1" + " Where T1.MES_Result Is Null" + " And T1.mrba000 in ('0','1')" + " And T1.mrbasite = '" + ERP_Site + "' " + " And T1.mrbaent ='" + ERP_EntID + "' "; //cmmTempERP = new IDbCommand(strSQL, cnnERP); //daTemp.SelectCommand = cmmTempERP; //daTemp.Fill(dsTemp, MES_MRBA_T_1); //cmmTempERP.Dispose(); ExecuteSQLQuery_Adapter(strSQL, dsTemp, MES_MRBA_T_1, cnnERP); if (!(dsTemp == null) && dsTemp.Tables[MES_MRBA_T_1].Rows.Count > 0) { drSel_IF = dsTemp.Tables[MES_MRBA_T_1].Select("", "tran_Time,mrba001"); if (!(drSel_IF == null) && drSel_IF.Length > 0) { // intFailCount_EQP if (ResourcesIntegration_ERP2MES_Equipment(ref cnnMES, ref aryReturnMessage, ref intFailCount_EQP, MES_MRBA_T_1, drSel_IF) < 0) { if (aryReturnMessage.Count == 0) // 避免不明原因,執行FAIL又沒收集到項目. { aryReturnMessage.Add("中介表:" + MES_MRBA_T_1 + ", 拋轉執行失敗!!"); } } } } } catch (Exception EX_AUT) { if (cnnERP == null) { aryReturnMessage.Add("T100中介DB(ERP) 連線失敗!!"); } else if (cnnMES == null) { aryReturnMessage.Add("MES DB 連線失敗!!"); } else { aryReturnMessage.Add("EX_AUT.Exception" + '\n' + EX_AUT.Message.ToString()); } } // 回傳結果 ReturnMessage,已一併在Finally處理。 finally { // -------------------------------------------------- // 七、回傳執行結果:succces 或 fail(ReturnMessage) // -------------------------------------------------- if (aryReturnMessage.Count == 0) { ResourcesIntegrationRet = "success"; } else { // 組合執行錯誤字串: Chr(10)分隔 strReturnMessage = ArrayList2String(ref aryReturnMessage); if ((strReturnMessage ?? "") == defString) { // 當錯誤字串組合失敗。補上 strReturnMessage = "ReturnMessage收集失敗!!"; } // If Not dsTemp.Tables(strIfTableName) Is Nothing Then // '整理中介表交易筆數 // Dim drSel As DataRow() // Dim strBody_Head As String = "" // strBody_Head = "T100中介表:" & strIfTableName & "匯入至MES正式區" & Chr(10) // drSel = dsTemp.Tables(strIfTableName).Select("imaa004='A'") // If drSel.Length > 0 Then // strBody_Head += "料件類別:A, 總筆數(" & drSel.Length & "),失敗筆數(" & intFailCount_PRD & ")" // End If // drSel = dsTemp.Tables(strIfTableName).Select("imaa004='M'") // If drSel.Length > 0 Then // strBody_Head += "料件類別:M, 總筆數(" & drSel.Length & "),失敗筆數(" & intFailCount_MTL & ")" // End If // '重組 strReturnMessage = 中介表交易筆數 & strReturnMessage // strReturnMessage = strBody_Head & Chr(10) & Chr(10) & strReturnMessage // 'Remove Table // dsTemp.Tables.Remove(strIfTableName) // dsTemp.AcceptChanges() // End If // tblMESAutoRunLog.ReturnMessage 長度4000限制. string strTemp = ""; if (strReturnMessage.Length > 4000) { // 自 strReturnMessage 中截取0-3991碼. strTemp = strReturnMessage.Substring(0, 3991) + "..."; } else { strTemp = strReturnMessage; } // //fail; ResourcesIntegrationRet = "fail;" + strTemp; } if (cnnERP != null) CloseConnection(cnnERP); if (cnnMES != null) CloseConnection(cnnMES); //if (daTemp != null) // daTemp.Dispose(); if (dsTemp != null) dsTemp.Dispose(); if (drTemp != null) drTemp.Close(); } } while (false); // -------------------------------------------------- // 八、當執行失敗,寄送 Email。必須有設定參數一。 // -------------------------------------------------- if (aryReturnMessage.Count > 0 && !string.IsNullOrEmpty(strParameter01)) { // strSubject = "[AUT]接收T100中介表:" & strIfTableName & "(產品、物料) 失敗 " strSubject = "[AUT]接收T100中介表:" + "(設備) 失敗 "; strBody = Strings.Replace(strReturnMessage, Conversions.ToString('\n'), "
", Compare: CompareMethod.Text); // 寄送 Email if (ERP2MES_MailNotice(ref cnnMES, ref aryReturnMessage, strSubject, strParameter01, CInput(strBody)) < 0) { // '寄送不成功, ReturnMessage 再增加1項. // 'ProductIntegration += Chr(10) & aryReturnMessage.Item(aryReturnMessage.Count - 1).ToString // 寄送不成功, ReturnMessage 再增加1項. // tblMESAutoRunLog.ReturnMessage 長度4000限制. if (this.ProductIntegration().Length < 4000) { string strTemp = ""; strTemp = strReturnMessage; if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(strTemp + aryReturnMessage[aryReturnMessage.Count - 1].ToString().Length, 4000, false))) { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); } else { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); // 自 strTemp 中截取0-3991碼. strTemp = strTemp.Substring(0, 3991) + "..."; } // //fail; ResourcesIntegrationRet = "fail;" + strTemp; } } } return ResourcesIntegrationRet; // --------------------------------------------------# } private int ResourcesIntegration_ERP2MES_Equipment(ref IDbConnection cnnMES, ref ArrayList aryReturnMessage, ref int intReturnFailCount, string IfTableName, DataRow[] drSel_IF) { int ResourcesIntegration_ERP2MES_EquipmentRet = default(int); ResourcesIntegration_ERP2MES_EquipmentRet = -1; // Return -1:fail,0:Success // -------------------------------------------------- // 中介表 MES_MRBA_T, 拋轉 MES 供應商主檔. // -------------------------------------------------- // aryMES_Message ,收集單筆中介交易記錄的錯誤記錄. // =========================================================== // 宣告 DB相關 變數 // =========================================================== var drTemp = default(DbDataReader); Collection colSQL_T100 = new Collection(), colSQL_T100_Rows = new Collection(); // T100中介DB(MES回填處理記錄). Collection colSQL_2MES = new Collection(), colSQL_2MES_Rows = new Collection(); // MES正式異動資料(主要). string strSQL; // 每筆中介交易記錄 string strIfWhereCond_PK; string strMES_Result; string strMES_MESSAGE; // 錯誤訊息(中介表.MES_MESSAGE),Chr(10)分隔錯誤項目。 var aryMES_Message = new ArrayList(); // 收集單筆中介交易記錄的錯誤記錄, Exception及MES判定錯誤訊息。 var datNow = DateTime.Now; // Now do { try { // 宣告拋轉中介表資料使用變數 string strERP_EQPNo, strERP_AssetNo, strERP_Description, strERP_status; string strEQP_EQPType = "EQPTYPE"; // ----------------------------------------------------------- // 固定檢查ProductType='PRODUCT'資料,若不存在則自動新增。 // ----------------------------------------------------------- if (AddEquipmentType(ref cnnMES, ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strEQP_EQPType, strERPCreator, datNow, "AutoRun建立") < 0) break; // 預設值 int intIssueState = 0; // -------------------------------------------------- // 必須以tran_Time順序,逐筆處理中介交易記錄。 // 每一筆交易記錄處理完成,立即變更 MESDB 及 MESSERIES_T100.中介表的MES處理記錄,綁在同一個交易裡. // (同包Transaction, 處理完畢後再一起commit) // 當某筆交易記錄處理失敗,立即變更 MESSERIES_T100.中介表的MES處理記錄,再接著處理下一筆記錄. // -------------------------------------------------- foreach (DataRow drIF in drSel_IF) { // reset datNow = DateTime.Now; // Now strIfWhereCond_PK = ""; strMES_Result = "9"; // 預設值 9 (MES處理結果, 成功回寫1, 失敗回寫9). strMES_MESSAGE = ""; // 錯誤訊息 aryMES_Message.Clear(); colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); colSQL_T100.Clear(); colSQL_T100_Rows.Clear(); do { try { // ----------------------------------------------------------- // 取出各欄位資料 // ----------------------------------------------------------- // 轉大寫 strERP_EQPNo = drIF["mrba001"].ToString().Trim().ToUpper(); strERP_AssetNo = drIF["mrba002"].ToString().Trim().ToUpper(); strERP_Description = drIF["mrba101"].ToString().Trim(); strERP_status = drIF["tran_status"].ToString().Trim().ToUpper(); // 檢查是否有此作業站設定 strSQL = "Select EquipmentNo,IssueState From tblEQPEquipmentBasis " + " Where EquipmentNo='" + strERP_EQPNo + "'"; //cmmTemp = new IDbCommand(strSQL, cnnMES); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); bool exitTry = false; switch (strERP_status ?? "") { case "AU": // 有資料修改沒資料新增 { if (!drTemp.Read()) { // ----------------------------------------------------------- // 新增MES供應商設定 // ----------------------------------------------------------- strSQL = "Insert Into tblEQPEquipmentBasis " + "(EquipmentNo,EquipmentType,Capacity,VendorNo," + "Description,EngineerGroupNo,AssetNo,LoadPort," + "AutoFlag,Eacontroller,EQPRecipe," + "IssueState,Creator,CreateDate)"; strSQL += " Values('" + strERP_EQPNo + "','" + strEQP_EQPType + "',-1,'N/A','" + strERP_Description + "','N/A','" + strERP_AssetNo + "',0," + "0,'N/A',0," + intIssueState + ",'" + strERPCreator + "'," + "To_Date('" + Strings.Format(datNow, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'))"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } else { // aryMES_Message.Add("設備編號(mrba001):" & strERP_EQPNo & ", 已存在MES, 不允許新增!!") // ERPws標準功能不論IssueState為何皆允許修改. // ----------------------------------------------------------- // 修改MES設備設定 // ----------------------------------------------------------- strSQL = "Update tblEQPEquipmentBasis Set " + " AssetNo = '" + strERP_AssetNo + "'" + " ,Description='" + strERP_Description + "'"; // MES已存在之資料IssueState如果是-1,ERP資料再次拋轉時,IssueState則更新為"0". if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], -1, false))) { strSQL += " IssueState = 0"; } strSQL += " Where EquipmentNo='" + strERP_EQPNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } drTemp.Close(); //cmmTemp.Dispose(); break; } case "D": // D:刪除 { if (drTemp.Read()) { if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], 0, false))) { // ----------------------------------------------------------- // 先刪除MES產品相關設定 // ----------------------------------------------------------- if (ResourcesIntegration_DelEquipment(ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_EQPNo) < 0) { // GoTo lblExitTry_2_NextRow exitTry = true; break; } } else { // ----------------------------------------------------------- // 作廢MES產品設定 // ----------------------------------------------------------- strSQL = "Update tblEQPEquipmentBasis Set " + " IssueState = -1" + " Where EquipmentNo='" + strERP_EQPNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } } else { aryMES_Message.Add("設備編號(mrba001):" + strERP_EQPNo + ", 不存在MES, 不允許刪除!!"); } drTemp.Close(); //cmmTemp.Dispose(); break; } default: { aryMES_Message.Add("ERP資料狀態(Status):" + strERP_status + "無效, 不允許執行!!"); break; } } if (exitTry) { break; } // If aryMES_Message.Count > 0 Then GoTo lblExitTry_2_NextRow // =============================================================================== // 判定 MES_Result 處理結果 (成功回寫1, 失敗回寫9). // =============================================================================== if (aryMES_Message.Count == 0) { strMES_Result = "1"; // -------------------------------------------------- // 四、MES資料庫異動 // -------------------------------------------------- if (colSQL_2MES.Count > 0) { ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colSQL_2MES, colSQL_2MES_Rows); } } else { break; } } catch (Exception EX_drIF) { strMES_Result = "9"; aryMES_Message.Add("EX_drIF.Exception" + '\n' + EX_drIF.Message); } finally { // 組合執行錯誤字串: Chr(10)分隔 strMES_MESSAGE = ArrayList2String(ref aryMES_Message); // 2016/01/13, 直接異動中介表-------------------------- // 'If strMES_MESSAGE = defString Then // ' '當錯誤字串組合失敗,在Finally後會記錄PK. // 'End If // --------------------------------------------------# // MES_Message長度4000限制, 截取0-3996碼加"...". if (strMES_MESSAGE.Length > 4000) strMES_MESSAGE = strMES_MESSAGE.Substring(0, 3996) + "..."; // ---取消前面收集SQL--- colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); colSQL_T100.Clear(); // 若T100中介資料庫異動fail。(若MES_MESSAGE問題,下面會不會一樣fail?) colSQL_T100_Rows.Clear(); // ----------------------------------------------------------- // (EX_drIF.Exception) // 回填中介表資訊,(注意)各個資料表的PK不同。 // ----------------------------------------------------------- // mssql,無trim用法,不串變數值,直接檢查原欄位值. strIfWhereCond_PK = Conversions.ToString(" Where mrba001 = '" + drIF["mrba001"] + "'" + " And tran_time = '" + drIF["tran_time"] + "'" + " And mrbasite = '" + ERP_Site + "' " + " And mrbaent ='" + ERP_EntID + "' "); if (Update_T100_IfTable(ref colSQL_T100, ref colSQL_T100_Rows, ref aryMES_Message, IfTableName, strIfWhereCond_PK, strMES_Result, datNow, strMES_MESSAGE) >= 0) { // -------------------------------------------------- // 六、T100中介資料庫異動(EX_drIF) // -------------------------------------------------- ExecuteSQLNoneQuery_ChkRowCount(strERPDataBaseType, strERPconnectionString, colSQL_T100, colSQL_T100_Rows); } } } while (false); // lblExitTry_2_NextRow: // 當該筆中介交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 if (aryMES_Message.Count > 0) { /// 匯整記錄中介表的PK資訊. // 因從錯誤訊息不一定看的出哪一筆中介表交易記錄fail. // 故失敗訊息連同中介表的必要資訊一併匯整. (Email要放詳細資訊) // (1) aryReturnMessage.Add("tran_time:" + drIF["tran_time"] + ", mrba001:" + drIF["mrba001"]); // (2) foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); } // 計算失敗筆數 if (strMES_Result == "9") intReturnFailCount += 1; // 不管成功或失敗,繼續下一筆。 } // //return 0 : Success ResourcesIntegration_ERP2MES_EquipmentRet = 0; } catch (Exception ex) { aryMES_Message.Add(ex.Message); // 當該筆中介交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); throw; } finally { if (drTemp != null) drTemp.Close(); } } while (false); return ResourcesIntegration_ERP2MES_EquipmentRet; } private int ResourcesIntegration_DelEquipment(ref Collection colSQL_2MES, ref Collection colSQL_2MES_Rows, ref ArrayList aryMES_Message, string strERP_EQPNo) { int ResourcesIntegration_DelEquipmentRet = default(int); ResourcesIntegration_DelEquipmentRet = -1; // Return -1:fail,0:Success string strSQL; try { // 1. 刪除機台特性 strSQL = "Delete From tblEQPEquipmentProperty " + "Where Equipment='" + strERP_EQPNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // 2. 刪除主檔 strSQL = "Delete From tblEQPEquipmentBasis " + "Where EquipmentNo='" + strERP_EQPNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // 3.刪除設備狀態 strSQL = "Delete From tblEMSEquipmentState Where EquipmentNo='" + strERP_EQPNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // //return 0 : Success ResourcesIntegration_DelEquipmentRet = 0; } catch (Exception ex) { aryMES_Message.Add(ex.Message.ToString()); throw; } return ResourcesIntegration_DelEquipmentRet; } private int AddEquipmentType(ref IDbConnection cnnTemp, ref Collection colSQL, ref Collection colSQL_Rows, ref ArrayList aryErrorMessage, string strEQPType, string strCreator, DateTime datCreateDate, string strDescription = "") { int AddEquipmentTypeRet = default(int); AddEquipmentTypeRet = -1; // Return -1:fail,0:Success // IssueState固定寫2 var drTemp = default(DbDataReader); string strSQL; try { strSQL = "Select EquipmentType From tblEQPEquipmentType" + " Where EquipmentType='" + strEQPType + "'"; //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (!drTemp.Read()) { // 新增ProductType主檔 strSQL = "Insert Into tblEQPEquipmentType " + "(EquipmentType, Description, IssueState, Creator, CreateDate) " + " Values('" + strEQPType + "','" + strDescription + "',2,'" + strCreator + "', To_Date('" + Strings.Format(datCreateDate, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'))"; colSQL.Add(strSQL); colSQL_Rows.Add(1); } drTemp.Close(); //cmmTemp.Dispose(); // Return AddEquipmentTypeRet = 0; } catch (Exception ex) { aryErrorMessage.Add(ex.Message.ToString()); throw; } finally { if (drTemp != null) drTemp.Dispose(); } return AddEquipmentTypeRet; } #endregion #region MES InterFaceTable 轉入 MES正式區(作業站群組) // 功 能: MES InterFaceTable 轉入 MES正式區(作業站群組) // 傳回值: success(成功), fail(失敗) private string OPGroupIntegration(Collection colParameters = null) { string OPGroupIntegrationRet = default(string); // =========================================================== // 宣告 DB相關 變數 // =========================================================== var cnnERP = default(IDbConnection); // T100中介DB使用(ERP) var cnnMES = default(IDbConnection); // MESDB使用 var drTemp = default(DbDataReader); //var daTemp = new System.Data.OleDb.OleDbDataAdapter(); var dsTemp = new DataSet(); Collection colSQL_T100 = new Collection(), colSQL_T100_Rows = new Collection(); // T100中介DB(MES回填處理記錄). Collection colSQL_2MES = new Collection(), colSQL_2MES_Rows = new Collection(); // MES正式異動資料(主要). string strSQL; // =========================================================== // 宣告 AutoRunJob設定及執行記錄 變數 // =========================================================== string strParameter01 = ""; // 參數一,預設此功能fail通知EMAIL群組。 string strSubject, strBody; // 寄送通知資訊 // AutorunJob拋轉資訊 string strReturnMessage = ""; // 錯誤訊息(tblMESAutoRunLog.ReturnMessage),Chr(10)分隔錯誤項目。 var aryReturnMessage = new ArrayList(); // Catch Error Message (Exception及MES判定錯誤訊息)。 int intFailCount_OPGroup = 0; // OPGroup拋轉失敗筆數 // =========================================================== // 宣告 其他 變數 // =========================================================== DateTime datNow; do { try { // -------------------------------------------------- // 一、取得參數 // -------------------------------------------------- // Parameter01為參數一 // 作為Mail通知群組(GroupNo),放在最前面防止連線失敗無法寄送通知。 if (colParameters.Contains("Parameter01")) { strParameter01 = colParameters["Parameter01"].ToString().Trim(); } // If strParameter01 = "" Then // ProductIntegration = "fail;使用者群?未?定!!(tblMESAutorunJob.Parameter01)" // Exit Function '離開 Function。 // End If // -------------------------------------------------- // 二、連線 DB // -------------------------------------------------- // T100中介DB cnnERP = CreateConnection(strERPconnectionString); // MES DB cnnMES = CreateConnection(strConnectionString); // 取得ERPSetting if (!GetERPSetting(ref dtERPSetting, "T100")) { break; } // -------------------------------------------------- // 檢查參數一 Mail通知群組 是否已設定. // -------------------------------------------------- if (!string.IsNullOrEmpty(strParameter01) && ERP2MES_MailNoticeChk(ref cnnMES, ref aryReturnMessage, strParameter01) < 0) { OPGroupIntegrationRet = Conversions.ToString("fail;" + aryReturnMessage[0]); return OPGroupIntegrationRet; // 離開 Function。 } if (aryReturnMessage.Count > 0) break; // Exit Try /// 取出 MESSERIES_T100.中介表資料. // -------------------------------------------------- // 二、MESSERIES_T100.中介表資料,請依序處理: // Loop 1.作業站群組主檔 MES_ECAA_T:(必須優先) // 每筆交易明細: // MES_Result為空白代表未拋轉。 // 取出後立即異動DB,無論成功或失敗(不跳離),都繼續執行下一筆。 // -------------------------------------------------- string MES_ECAA_T_1 = "MES_ECAA_T"; DataRow[] drSel_IF; // -------------------------------------------------- // Loop 1. 作業站群組主檔 MES_ECAA_T // -------------------------------------------------- strSQL = "Select T1.*, T1.ecaa001 As ecaa001_Upper " + " From " + MES_ECAA_T_1 + " T1" + " Where T1.MES_Result Is Null" + " And T1.ecaaent ='" + ERP_EntID + "' "; //cmmTempERP = new IDbCommand(strSQL, cnnERP); //daTemp.SelectCommand = cmmTempERP; //daTemp.Fill(dsTemp, MES_ECAA_T_1); //cmmTempERP.Dispose(); ExecuteSQLQuery_Adapter(strSQL, dsTemp, MES_ECAA_T_1, cnnERP); if (!(dsTemp == null) && dsTemp.Tables[MES_ECAA_T_1].Rows.Count > 0) { drSel_IF = dsTemp.Tables[MES_ECAA_T_1].Select("", "tran_Time,ecaa001"); if (!(drSel_IF == null) && drSel_IF.Length > 0) { // intFailCount_OPGroup if (OPGroupIntegration_ERP2MES_OPGroup(ref cnnMES, ref aryReturnMessage, ref intFailCount_OPGroup, MES_ECAA_T_1, drSel_IF) < 0) { if (aryReturnMessage.Count == 0) // 避免不明原因,執行FAIL又沒收集到項目. { aryReturnMessage.Add("中介表:" + MES_ECAA_T_1 + ", 拋轉執行失敗!!"); } } } } } catch (Exception EX_AUT) { if (cnnERP == null) { aryReturnMessage.Add("T100中介DB(ERP) 連線失敗!!"); } else if (cnnMES == null) { aryReturnMessage.Add("MES DB 連線失敗!!"); } else { aryReturnMessage.Add("EX_AUT.Exception" + '\n' + EX_AUT.Message.ToString()); } } // 回傳結果 ReturnMessage,已一併在Finally處理。 finally { // -------------------------------------------------- // 七、回傳執行結果:succces 或 fail(ReturnMessage) // -------------------------------------------------- if (aryReturnMessage.Count == 0) { OPGroupIntegrationRet = "success"; } else { // 組合執行錯誤字串: Chr(10)分隔 strReturnMessage = ArrayList2String(ref aryReturnMessage); if ((strReturnMessage ?? "") == defString) { // 當錯誤字串組合失敗。補上 strReturnMessage = "ReturnMessage收集失敗!!"; } // If Not dsTemp.Tables(strIfTableName) Is Nothing Then // '整理中介表交易筆數 // Dim drSel As DataRow() // Dim strBody_Head As String = "" // strBody_Head = "T100中介表:" & strIfTableName & "匯入至MES正式區" & Chr(10) // drSel = dsTemp.Tables(strIfTableName).Select("imaa004='A'") // If drSel.Length > 0 Then // strBody_Head += "料件類別:A, 總筆數(" & drSel.Length & "),失敗筆數(" & intFailCount_PRD & ")" // End If // drSel = dsTemp.Tables(strIfTableName).Select("imaa004='M'") // If drSel.Length > 0 Then // strBody_Head += "料件類別:M, 總筆數(" & drSel.Length & "),失敗筆數(" & intFailCount_MTL & ")" // End If // '重組 strReturnMessage = 中介表交易筆數 & strReturnMessage // strReturnMessage = strBody_Head & Chr(10) & Chr(10) & strReturnMessage // 'Remove Table // dsTemp.Tables.Remove(strIfTableName) // dsTemp.AcceptChanges() // End If // tblMESAutoRunLog.ReturnMessage 長度4000限制. string strTemp = ""; if (strReturnMessage.Length > 4000) { // 自 strReturnMessage 中截取0-3991碼. strTemp = strReturnMessage.Substring(0, 3991) + "..."; } else { strTemp = strReturnMessage; } // //fail; OPGroupIntegrationRet = "fail;" + strTemp; } if (cnnERP != null) CloseConnection(cnnERP); if (cnnMES != null) CloseConnection(cnnMES); //if (daTemp != null) // daTemp.Dispose(); if (dsTemp != null) dsTemp.Dispose(); if (drTemp != null) drTemp.Close(); } } while (false); // -------------------------------------------------- // 八、當執行失敗,寄送 Email。必須有設定參數一。 // -------------------------------------------------- if (aryReturnMessage.Count > 0 && !string.IsNullOrEmpty(strParameter01)) { // strSubject = "[AUT]接收T100中介表:" & strIfTableName & "(產品、物料) 失敗 " strSubject = "[AUT]接收T100中介表:" + "(作業站群組) 失敗 "; strBody = Strings.Replace(strReturnMessage, Conversions.ToString('\n'), "
", Compare: CompareMethod.Text); // 寄送 Email if (ERP2MES_MailNotice(ref cnnMES, ref aryReturnMessage, strSubject, strParameter01, CInput(strBody)) < 0) { // '寄送不成功, ReturnMessage 再增加1項. // 'ProductIntegration += Chr(10) & aryReturnMessage.Item(aryReturnMessage.Count - 1).ToString // 寄送不成功, ReturnMessage 再增加1項. // tblMESAutoRunLog.ReturnMessage 長度4000限制. if (this.ProductIntegration().Length < 4000) { string strTemp = ""; strTemp = strReturnMessage; if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(strTemp + aryReturnMessage[aryReturnMessage.Count - 1].ToString().Length, 4000, false))) { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); } else { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); // 自 strTemp 中截取0-3991碼. strTemp = strTemp.Substring(0, 3991) + "..."; } // //fail; OPGroupIntegrationRet = "fail;" + strTemp; } } } return OPGroupIntegrationRet; // --------------------------------------------------# } private int OPGroupIntegration_ERP2MES_OPGroup(ref IDbConnection cnnMES, ref ArrayList aryReturnMessage, ref int intReturnFailCount, string IfTableName, DataRow[] drSel_IF) { int OPGroupIntegration_ERP2MES_OPGroupRet = default(int); OPGroupIntegration_ERP2MES_OPGroupRet = -1; // Return -1:fail,0:Success // -------------------------------------------------- // 中介表 MES_ECAA_T, 拋轉 MES 作業站群組主檔. // -------------------------------------------------- // aryMES_Message ,收集單筆中介交易記錄的錯誤記錄. // =========================================================== // 宣告 DB相關 變數 // =========================================================== var drTemp = default(DbDataReader); Collection colSQL_T100 = new Collection(), colSQL_T100_Rows = new Collection(); // T100中介DB(MES回填處理記錄). Collection colSQL_2MES = new Collection(), colSQL_2MES_Rows = new Collection(); // MES正式異動資料(主要). string strSQL; // 每筆中介交易記錄 string strIfWhereCond_PK; string strMES_Result; string strMES_MESSAGE; // 錯誤訊息(中介表.MES_MESSAGE),Chr(10)分隔錯誤項目。 var aryMES_Message = new ArrayList(); // 收集單筆中介交易記錄的錯誤記錄, Exception及MES判定錯誤訊息。 var datNow = DateTime.Now; // Now try { // 宣告拋轉中介表資料使用變數 string strERP_OPGroupNo, strERP_OPGroupName, strERP_status, strPRSNo; // 預設值 int intIssueState = 0; // -------------------------------------------------- // 必須以tran_Time順序,逐筆處理中介交易記錄。 // 每一筆交易記錄處理完成,立即變更 MESDB 及 MESSERIES_T100.中介表的MES處理記錄,綁在同一個交易裡. // (同包Transaction, 處理完畢後再一起commit) // 當某筆交易記錄處理失敗,立即變更 MESSERIES_T100.中介表的MES處理記錄,再接著處理下一筆記錄. // -------------------------------------------------- foreach (DataRow drIF in drSel_IF) { // reset datNow = DateTime.Now; // Now strIfWhereCond_PK = ""; strMES_Result = "9"; // 預設值 9 (MES處理結果, 成功回寫1, 失敗回寫9). strMES_MESSAGE = ""; // 錯誤訊息 aryMES_Message.Clear(); colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); colSQL_T100.Clear(); colSQL_T100_Rows.Clear(); do { try { // ----------------------------------------------------------- // 取出各欄位資料 // ----------------------------------------------------------- // 轉大寫 strERP_OPGroupNo = drIF["ecaa001"].ToString().Trim().ToUpper(); if (string.IsNullOrEmpty(drIF["ecaa002"].ToString().Trim())) { strERP_OPGroupName = strERP_OPGroupNo; } else { strERP_OPGroupName = drIF["ecaa002"].ToString().Trim().ToUpper(); } strERP_status = drIF["tran_status"].ToString().Trim().ToUpper(); // 取得區段 strSQL = "Select PSNo From tblPRSProductionSegment " + " Where IssueState= 2 "; //cmmTemp = new IDbCommand(strSQL, cnnMES); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); if (!drTemp.Read()) { strPRSNo = "N/A"; } else { strPRSNo = Conversions.ToString(drTemp["PSNo"]); } drTemp.Close(); //cmmTemp.Dispose(); // 檢查是否有此作業站設定 strSQL = "Select OPGroupNo From tblOPGroupBasis " + " Where OPGroupNo='" + strERP_OPGroupNo + "'"; //cmmTemp = new IDbCommand(strSQL, cnnMES); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); bool exitTry = false; switch (strERP_status ?? "") { case "AU": // 有資料修改沒資料新增 { if (!drTemp.Read()) { // ----------------------------------------------------------- // 新增MES作業站群組設定 // ----------------------------------------------------------- strSQL = "Insert Into tblOPGroupBasis " + "(OPGroupNo,OPGroupName, PSNo," + "Creator,CreateDate)"; strSQL += " Values('" + strERP_OPGroupNo + "','" + strERP_OPGroupName + "','" + strPRSNo + "','" + strERPCreator + "'," + "To_Date('" + Strings.Format(datNow, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'))"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } else { // aryMES_Message.Add("作業站群組編號(ecaa001):" & strERP_OPGroupNo & ", 已存在MES, 不允許新增!!") // ERPws標準功能不論IssueState為何皆允許修改. // ----------------------------------------------------------- // 修改MES設備設定 // ----------------------------------------------------------- strSQL = "Update tblOPGroupBasis Set " + " OPGroupName = '" + strERP_OPGroupName + "'" + " Where OPGroupNo='" + strERP_OPGroupNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } drTemp.Close(); //cmmTemp.Dispose(); break; } case "D": // D:刪除 { if (drTemp.Read()) { // ----------------------------------------------------------- // 刪除MES作業站群組設定 // ----------------------------------------------------------- if (OPGroupIntegration_DelOPGroup(ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_OPGroupNo) < 0) { // GoTo lblExitTry_2_NextRow exitTry = true; break; } } else { aryMES_Message.Add("作業站群組編號(ecaa001):" + strERP_OPGroupNo + ", 不存在MES, 不允許刪除!!"); } drTemp.Close(); //cmmTemp.Dispose(); break; } default: { aryMES_Message.Add("ERP資料狀態(Status):" + strERP_status + "無效, 不允許執行!!"); break; } } if (exitTry) { break; } // If aryMES_Message.Count > 0 Then GoTo lblExitTry_2_NextRow // =============================================================================== // 判定 MES_Result 處理結果 (成功回寫1, 失敗回寫9). // =============================================================================== if (aryMES_Message.Count == 0) { strMES_Result = "1"; // -------------------------------------------------- // 四、MES資料庫異動 // -------------------------------------------------- if (colSQL_2MES.Count > 0) { ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colSQL_2MES, colSQL_2MES_Rows); } } else { break; } } catch (Exception EX_drIF) { strMES_Result = "9"; aryMES_Message.Add("EX_drIF.Exception" + '\n' + EX_drIF.Message); } finally { // 組合執行錯誤字串: Chr(10)分隔 strMES_MESSAGE = ArrayList2String(ref aryMES_Message); // 2016/01/13, 直接異動中介表-------------------------- // 'If strMES_MESSAGE = defString Then // ' '當錯誤字串組合失敗,在Finally後會記錄PK. // 'End If // --------------------------------------------------# // MES_Message長度4000限制, 截取0-3996碼加"...". if (strMES_MESSAGE.Length > 4000) strMES_MESSAGE = strMES_MESSAGE.Substring(0, 3996) + "..."; // ---取消前面收集SQL--- colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); colSQL_T100.Clear(); // 若T100中介資料庫異動fail。(若MES_MESSAGE問題,下面會不會一樣fail?) colSQL_T100_Rows.Clear(); // ----------------------------------------------------------- // (EX_drIF.Exception) // 回填中介表資訊,(注意)各個資料表的PK不同。 // ----------------------------------------------------------- // mssql,無trim用法,不串變數值,直接檢查原欄位值. strIfWhereCond_PK = Conversions.ToString(" Where ecaa001 = '" + drIF["ecaa001"] + "'" + " And tran_time = '" + drIF["tran_time"] + "'" + " And ecaasite = '" + ERP_Site + "' " + " And ecaaent ='" + ERP_EntID + "' "); if (Update_T100_IfTable(ref colSQL_T100, ref colSQL_T100_Rows, ref aryMES_Message, IfTableName, strIfWhereCond_PK, strMES_Result, datNow, strMES_MESSAGE) >= 0) { // -------------------------------------------------- // 六、T100中介資料庫異動(EX_drIF) // -------------------------------------------------- ExecuteSQLNoneQuery_ChkRowCount(strERPDataBaseType, strERPconnectionString, colSQL_T100, colSQL_T100_Rows); } } } while (false); // lblExitTry_2_NextRow: // 當該筆中介交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 if (aryMES_Message.Count > 0) { /// 匯整記錄中介表的PK資訊. // 因從錯誤訊息不一定看的出哪一筆中介表交易記錄fail. // 故失敗訊息連同中介表的必要資訊一併匯整. (Email要放詳細資訊) // (1) aryReturnMessage.Add("tran_time:" + drIF["tran_time"] + ", ecaa001:" + drIF["ecaa001"]); // (2) foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); } // 計算失敗筆數 if (strMES_Result == "9") intReturnFailCount += 1; // 不管成功或失敗,繼續下一筆。 } // //return 0 : Success OPGroupIntegration_ERP2MES_OPGroupRet = 0; } catch (Exception ex) { aryMES_Message.Add(ex.Message); // 當該筆中介交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); throw; } finally { if (drTemp != null) drTemp.Close(); } return OPGroupIntegration_ERP2MES_OPGroupRet; } private int OPGroupIntegration_DelOPGroup(ref Collection colSQL_2MES, ref Collection colSQL_2MES_Rows, ref ArrayList aryMES_Message, string strERP_OPGroupNo) { int OPGroupIntegration_DelOPGroupRet = default(int); OPGroupIntegration_DelOPGroupRet = -1; // Return -1:fail,0:Success string strSQL; try { // 刪除明細檔 strSQL = "Delete From tblOPGroupDetail " + " Where OPGroupNo='" + strERP_OPGroupNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // 刪除主檔 strSQL = "Delete From tblOPGroupBasis " + "Where OPGroupNo='" + strERP_OPGroupNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // //return 0 : Success OPGroupIntegration_DelOPGroupRet = 0; } catch (Exception ex) { aryMES_Message.Add(ex.Message.ToString()); throw; } return OPGroupIntegration_DelOPGroupRet; } #endregion #region MES InterFaceTable 轉入 MES正式區(部門) // 功 能: MES InterFaceTable 轉入 MES正式區(部門) // 傳回值: success(成功), fail(失敗) private string DepartmentIntegration(Collection colParameters = null) { string DepartmentIntegrationRet = default(string); // =========================================================== // 宣告 DB相關 變數 // =========================================================== var cnnERP = default(IDbConnection); // T100中介DB使用(ERP) var cnnMES = default(IDbConnection); // MESDB使用 var drTemp = default(DbDataReader); //var daTemp = new System.Data.OleDb.OleDbDataAdapter(); var dsTemp = new DataSet(); Collection colSQL_T100 = new Collection(), colSQL_T100_Rows = new Collection(); // T100中介DB(MES回填處理記錄). Collection colSQL_2MES = new Collection(), colSQL_2MES_Rows = new Collection(); // MES正式異動資料(主要). string strSQL; // =========================================================== // 宣告 AutoRunJob設定及執行記錄 變數 // =========================================================== string strParameter01 = ""; // 參數一,預設此功能fail通知EMAIL群組。 string strSubject, strBody; // 寄送通知資訊 // AutorunJob拋轉資訊 string strReturnMessage = ""; // 錯誤訊息(tblMESAutoRunLog.ReturnMessage),Chr(10)分隔錯誤項目。 var aryReturnMessage = new ArrayList(); // Catch Error Message (Exception及MES判定錯誤訊息)。 int intFailCount_Dept = 0; // Department拋轉失敗筆數 // =========================================================== // 宣告 其他 變數 // =========================================================== DateTime datNow; do { try { // -------------------------------------------------- // 一、取得參數 // -------------------------------------------------- // Parameter01為參數一 // 作為Mail通知群組(GroupNo),放在最前面防止連線失敗無法寄送通知。 if (colParameters.Contains("Parameter01")) { strParameter01 = colParameters["Parameter01"].ToString().Trim(); } // If strParameter01 = "" Then // ProductIntegration = "fail;使用者群?未?定!!(tblMESAutorunJob.Parameter01)" // Exit Function '離開 Function。 // End If // -------------------------------------------------- // 二、連線 DB // -------------------------------------------------- // T100中介DB cnnERP = CreateConnection(strERPconnectionString); // MES DB cnnMES = CreateConnection(strConnectionString); // 取得ERPSetting if (!GetERPSetting(ref dtERPSetting, "T100")) { break; } // -------------------------------------------------- // 檢查參數一 Mail通知群組 是否已設定. // -------------------------------------------------- if (!string.IsNullOrEmpty(strParameter01) && ERP2MES_MailNoticeChk(ref cnnMES, ref aryReturnMessage, strParameter01) < 0) { DepartmentIntegrationRet = Conversions.ToString("fail;" + aryReturnMessage[0]); return DepartmentIntegrationRet; // 離開 Function。 } if (aryReturnMessage.Count > 0) break; // Exit Try /// 取出 MESSERIES_T100.中介表資料. // -------------------------------------------------- // 二、MESSERIES_T100.中介表資料,請依序處理: // Loop 1.部門主檔 MES_OOEF_T:(必須優先) // Loop 2.部門主檔多語言檔 MES_OOEFL_T // 每筆交易明細: // MES_Result為空白代表未拋轉。 // 取出後立即異動DB,無論成功或失敗(不跳離),都繼續執行下一筆。 // -------------------------------------------------- string MES_OOEF_T_1 = "MES_OOEF_T"; string MES_OOEFL_T_2 = "MES_OOEFL_T"; DataRow[] drSel_IF; // -------------------------------------------------- // Loop 1.部門主檔 MES_OOEF_T // -------------------------------------------------- strSQL = "Select T1.*, T1.ooef001 As ooef001_Upper " + " From " + MES_OOEF_T_1 + " T1" + " Where T1.MES_Result Is Null" + " And T1.ooefent ='" + ERP_EntID + "' "; //cmmTempERP = new IDbCommand(strSQL, cnnERP); //daTemp.SelectCommand = cmmTempERP; //daTemp.Fill(dsTemp, MES_OOEF_T_1); //cmmTempERP.Dispose(); ExecuteSQLQuery_Adapter(strSQL, dsTemp, MES_OOEF_T_1, cnnERP); if (!(dsTemp == null) && dsTemp.Tables[MES_OOEF_T_1].Rows.Count > 0) { drSel_IF = dsTemp.Tables[MES_OOEF_T_1].Select("", "tran_Time,ooef001"); if (!(drSel_IF == null) && drSel_IF.Length > 0) { // intFailCount_Dept if (DepartmentIntegration_ERP2MES_Department(ref cnnMES, ref aryReturnMessage, ref intFailCount_Dept, MES_OOEF_T_1, drSel_IF) < 0) { if (aryReturnMessage.Count == 0) // 避免不明原因,執行FAIL又沒收集到項目. { aryReturnMessage.Add("中介表:" + MES_OOEF_T_1 + ", 拋轉執行失敗!!"); } } } string strIfWhereCond_PK; string strMES_MESSAGE; // 錯誤訊息(中介表.MES_MESSAGE),Chr(10)分隔錯誤項目。 } // -------------------------------------------------- // Loop 2.部門主檔多語言檔 MES_OOEFL_T // -------------------------------------------------- strSQL = "Select T1.*" + " From " + MES_OOEFL_T_2 + " T1" + " Where T1.MES_Result Is Null" + " And T1.ooefl002 = '" + strLanguage_T100 + "'" + " And T1.ooeflent ='" + ERP_EntID + "' "; //cmmTempERP = new IDbCommand(strSQL, cnnERP); //daTemp.SelectCommand = cmmTempERP; //daTemp.Fill(dsTemp, MES_OOEFL_T_2); //cmmTempERP.Dispose(); ExecuteSQLQuery_Adapter(strSQL, dsTemp, MES_OOEFL_T_2, cnnERP); if (!(dsTemp == null) && dsTemp.Tables[MES_OOEFL_T_2].Rows.Count > 0) { drSel_IF = dsTemp.Tables[MES_OOEFL_T_2].Select("", "tran_Time,ooefl001"); if (DepartmentIntegration_ERP2MES_Resource(ref cnnMES, ref aryReturnMessage, ref intFailCount_Dept, MES_OOEFL_T_2, drSel_IF) < 0) { if (aryReturnMessage.Count == 0) // 避免不明原因,執行FAIL又沒收集到項目. { aryReturnMessage.Add("中介表:" + MES_OOEFL_T_2 + "(料件多語言檔), 拋轉執行失敗!!"); } } } } catch (Exception EX_AUT) { if (cnnERP == null) { aryReturnMessage.Add("T100中介DB(ERP) 連線失敗!!"); } else if (cnnMES == null) { aryReturnMessage.Add("MES DB 連線失敗!!"); } else { aryReturnMessage.Add("EX_AUT.Exception" + '\n' + EX_AUT.Message.ToString()); } } // 回傳結果 ReturnMessage,已一併在Finally處理。 finally { // -------------------------------------------------- // 七、回傳執行結果:succces 或 fail(ReturnMessage) // -------------------------------------------------- if (aryReturnMessage.Count == 0) { DepartmentIntegrationRet = "success"; } else { // 組合執行錯誤字串: Chr(10)分隔 strReturnMessage = ArrayList2String(ref aryReturnMessage); if ((strReturnMessage ?? "") == defString) { // 當錯誤字串組合失敗。補上 strReturnMessage = "ReturnMessage收集失敗!!"; } // If Not dsTemp.Tables(strIfTableName) Is Nothing Then // '整理中介表交易筆數 // Dim drSel As DataRow() // Dim strBody_Head As String = "" // strBody_Head = "T100中介表:" & strIfTableName & "匯入至MES正式區" & Chr(10) // drSel = dsTemp.Tables(strIfTableName).Select("imaa004='A'") // If drSel.Length > 0 Then // strBody_Head += "料件類別:A, 總筆數(" & drSel.Length & "),失敗筆數(" & intFailCount_PRD & ")" // End If // drSel = dsTemp.Tables(strIfTableName).Select("imaa004='M'") // If drSel.Length > 0 Then // strBody_Head += "料件類別:M, 總筆數(" & drSel.Length & "),失敗筆數(" & intFailCount_MTL & ")" // End If // '重組 strReturnMessage = 中介表交易筆數 & strReturnMessage // strReturnMessage = strBody_Head & Chr(10) & Chr(10) & strReturnMessage // 'Remove Table // dsTemp.Tables.Remove(strIfTableName) // dsTemp.AcceptChanges() // End If // tblMESAutoRunLog.ReturnMessage 長度4000限制. string strTemp = ""; if (strReturnMessage.Length > 4000) { // 自 strReturnMessage 中截取0-3991碼. strTemp = strReturnMessage.Substring(0, 3991) + "..."; } else { strTemp = strReturnMessage; } // //fail; DepartmentIntegrationRet = "fail;" + strTemp; } if (cnnERP != null) CloseConnection(cnnERP); if (cnnMES != null) CloseConnection(cnnMES); //if (daTemp != null) // daTemp.Dispose(); if (dsTemp != null) dsTemp.Dispose(); if (drTemp != null) drTemp.Close(); } } while (false); // -------------------------------------------------- // 八、當執行失敗,寄送 Email。必須有設定參數一。 // -------------------------------------------------- if (aryReturnMessage.Count > 0 && !string.IsNullOrEmpty(strParameter01)) { // strSubject = "[AUT]接收T100中介表:" & strIfTableName & "(產品、物料) 失敗 " strSubject = "[AUT]接收T100中介表:" + "(部門) 失敗 "; strBody = Strings.Replace(strReturnMessage, Conversions.ToString('\n'), "
", Compare: CompareMethod.Text); // 寄送 Email if (ERP2MES_MailNotice(ref cnnMES, ref aryReturnMessage, strSubject, strParameter01, CInput(strBody)) < 0) { // '寄送不成功, ReturnMessage 再增加1項. // 'ProductIntegration += Chr(10) & aryReturnMessage.Item(aryReturnMessage.Count - 1).ToString // 寄送不成功, ReturnMessage 再增加1項. // tblMESAutoRunLog.ReturnMessage 長度4000限制. if (this.ProductIntegration().Length < 4000) { string strTemp = ""; strTemp = strReturnMessage; if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(strTemp + aryReturnMessage[aryReturnMessage.Count - 1].ToString().Length, 4000, false))) { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); } else { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); // 自 strTemp 中截取0-3991碼. strTemp = strTemp.Substring(0, 3991) + "..."; } // //fail; DepartmentIntegrationRet = "fail;" + strTemp; } } } return DepartmentIntegrationRet; // --------------------------------------------------# } private int DepartmentIntegration_ERP2MES_Department(ref IDbConnection cnnMES, ref ArrayList aryReturnMessage, ref int intReturnFailCount, string IfTableName, DataRow[] drSel_IF) { int DepartmentIntegration_ERP2MES_DepartmentRet = default(int); DepartmentIntegration_ERP2MES_DepartmentRet = -1; // Return -1:fail,0:Success // -------------------------------------------------- // 中介表 MES_OOEF_T, 拋轉 MES 部門主檔. // -------------------------------------------------- // =========================================================== // 宣告 DB相關 變數 // =========================================================== var drTemp = default(DbDataReader); Collection colSQL_T100 = new Collection(), colSQL_T100_Rows = new Collection(); // T100中介DB(MES回填處理記錄). Collection colSQL_2MES = new Collection(), colSQL_2MES_Rows = new Collection(); // MES正式異動資料(主要). string strSQL; // 每筆中介交易記錄 string strIfWhereCond_PK; string strMES_Result; string strMES_MESSAGE; // 錯誤訊息(中介表.MES_MESSAGE),Chr(10)分隔錯誤項目。 var aryMES_Message = new ArrayList(); // 收集單筆中介交易記錄的錯誤記錄, Exception及MES判定錯誤訊息。 var datNow = DateTime.Now; // Now try { // 宣告拋轉中介表資料使用變數 string strERP_DepartmentNo, strERP_status; // 預設值 int intIssueState = 2; // -------------------------------------------------- // 必須以tran_Time順序,逐筆處理中介交易記錄。 // 每一筆交易記錄處理完成,立即變更 MESDB 及 MESSERIES_T100.中介表的MES處理記錄,綁在同一個交易裡. // (同包Transaction, 處理完畢後再一起commit) // 當某筆交易記錄處理失敗,立即變更 MESSERIES_T100.中介表的MES處理記錄,再接著處理下一筆記錄. // -------------------------------------------------- foreach (DataRow drIF in drSel_IF) { // reset datNow = DateTime.Now; // Now strIfWhereCond_PK = ""; strMES_Result = "9"; // 預設值 9 (MES處理結果, 成功回寫1, 失敗回寫9). strMES_MESSAGE = ""; // 錯誤訊息 aryMES_Message.Clear(); colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); colSQL_T100.Clear(); colSQL_T100_Rows.Clear(); do { try { // ----------------------------------------------------------- // 取出各欄位資料 // ----------------------------------------------------------- // 轉大寫 strERP_DepartmentNo = drIF["ooef001"].ToString().Trim().ToUpper(); strERP_status = drIF["tran_status"].ToString().Trim().ToUpper(); // 檢查是否有此作業站設定 strSQL = "Select DepartmentNo,IssueState From tblUSRDepartmentBasis " + " Where DepartmentNo='" + strERP_DepartmentNo + "'"; //cmmTemp = new IDbCommand(strSQL, cnnMES); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); bool exitTry = false; switch (strERP_status ?? "") { case "AU": // 有資料修改沒資料新增 { if (!drTemp.Read()) { // ----------------------------------------------------------- // 新增MES部門設定 // ----------------------------------------------------------- strSQL = "Insert Into tblUSRDepartmentBasis " + "(DepartmentNo,DepartmentName,DepartmentSName," + "IssueState,Creator,CreateDate)"; strSQL += " Values('" + strERP_DepartmentNo + "','N/A','N/A'," + intIssueState + ",'" + strERPCreator + "'," + "To_Date('" + Strings.Format(datNow, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'))"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } // aryMES_Message.Add("部門編號(ooef001):" & strERP_DepartmentNo & ", 已存在MES, 不允許新增!!") // ERPws標準功能不論IssueState為何皆允許修改. // ----------------------------------------------------------- // 修改MES部門設定 // ----------------------------------------------------------- // 修改部門,因目前中介表定義欄位沒有需修改的,僅針對交易記錄判斷此產品在MES簽核狀態檢查是否需作變更。 else if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], -1, false))) { strSQL = "Update tblUSRDepartmentBasis Set " + " IssueState = " + intIssueState + " Where DepartmentNo='" + strERP_DepartmentNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } drTemp.Close(); //cmmTemp.Dispose(); break; } case "D": // D:刪除 { if (drTemp.Read()) { if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], 0, false))) { // ----------------------------------------------------------- // 先刪除MES部門相關設定 // ----------------------------------------------------------- if (DepartmentIntegration_DelDepartment(ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_DepartmentNo) < 0) { // GoTo lblExitTry_2_NextRow exitTry = true; break; } } else { // ----------------------------------------------------------- // 作廢MES部門設定 // ----------------------------------------------------------- strSQL = "Update tblUSRDepartmentBasis Set " + " IssueState=-1" + " Where DepartmentNo='" + strERP_DepartmentNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } } else { aryMES_Message.Add("部門編號(ooef001):" + strERP_DepartmentNo + ", 不存在MES, 不允許刪除!!"); } drTemp.Close(); //cmmTemp.Dispose(); break; } default: { aryMES_Message.Add("ERP資料狀態(Status):" + strERP_status + "無效, 不允許執行!!"); break; } } if (exitTry) { break; } // If aryMES_Message.Count > 0 Then GoTo lblExitTry_2_NextRow // =============================================================================== // 判定 MES_Result 處理結果 (成功回寫1, 失敗回寫9). // =============================================================================== if (aryMES_Message.Count == 0) { strMES_Result = "1"; // -------------------------------------------------- // 四、MES資料庫異動 // -------------------------------------------------- if (colSQL_2MES.Count > 0) { ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colSQL_2MES, colSQL_2MES_Rows); } } else { break; } } catch (Exception EX_drIF) { strMES_Result = "9"; aryMES_Message.Add("EX_drIF.Exception" + '\n' + EX_drIF.Message); } finally { // 組合執行錯誤字串: Chr(10)分隔 strMES_MESSAGE = ArrayList2String(ref aryMES_Message); // 2016/01/13, 直接異動中介表-------------------------- // 'If strMES_MESSAGE = defString Then // ' '當錯誤字串組合失敗,在Finally後會記錄PK. // 'End If // --------------------------------------------------# // MES_Message長度4000限制, 截取0-3996碼加"...". if (strMES_MESSAGE.Length > 4000) strMES_MESSAGE = strMES_MESSAGE.Substring(0, 3996) + "..."; // ---取消前面收集SQL--- colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); colSQL_T100.Clear(); // 若T100中介資料庫異動fail。(若MES_MESSAGE問題,下面會不會一樣fail?) colSQL_T100_Rows.Clear(); // ----------------------------------------------------------- // (EX_drIF.Exception) // 回填中介表資訊,(注意)各個資料表的PK不同。 // ----------------------------------------------------------- // mssql,無trim用法,不串變數值,直接檢查原欄位值. strIfWhereCond_PK = Conversions.ToString(" Where ooef001 = '" + drIF["ooef001"] + "'" + " And tran_time = '" + drIF["tran_time"] + "'" + " And ooefent ='" + ERP_EntID + "' "); if (Update_T100_IfTable(ref colSQL_T100, ref colSQL_T100_Rows, ref aryMES_Message, IfTableName, strIfWhereCond_PK, strMES_Result, datNow, strMES_MESSAGE) >= 0) { // -------------------------------------------------- // 六、T100中介資料庫異動(EX_drIF) // -------------------------------------------------- ExecuteSQLNoneQuery_ChkRowCount(strERPDataBaseType, strERPconnectionString, colSQL_T100, colSQL_T100_Rows); } } } while (false); // lblExitTry_2_NextRow: // 當該筆中介交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 if (aryMES_Message.Count > 0) { /// 匯整記錄中介表的PK資訊. // 因從錯誤訊息不一定看的出哪一筆中介表交易記錄fail. // 故失敗訊息連同中介表的必要資訊一併匯整. (Email要放詳細資訊) // (1) aryReturnMessage.Add("tran_time:" + drIF["tran_time"] + ", ooef001:" + drIF["ooef001"]); // (2) foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); } // 計算失敗筆數 if (strMES_Result == "9") intReturnFailCount += 1; // 不管成功或失敗,繼續下一筆。 } // //return 0 : Success DepartmentIntegration_ERP2MES_DepartmentRet = 0; } catch (Exception ex) { aryMES_Message.Add(ex.Message); // 當該筆中介交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); throw; } finally { if (drTemp != null) drTemp.Close(); } return DepartmentIntegration_ERP2MES_DepartmentRet; } private int DepartmentIntegration_DelDepartment(ref Collection colSQL_2MES, ref Collection colSQL_2MES_Rows, ref ArrayList aryMES_Message, string strERP_Department) { int DepartmentIntegration_DelDepartmentRet = default(int); DepartmentIntegration_DelDepartmentRet = -1; // Return -1:fail,0:Success string strSQL; try { // 刪除班別檔 strSQL = "Delete From tblUSRShiftBasis " + "Where DepartmentNo='" + strERP_Department + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // 刪除主檔 strSQL = "Delete From tblUSRDepartmentBasis " + "Where DepartmentNo='" + strERP_Department + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // //return 0 : Success DepartmentIntegration_DelDepartmentRet = 0; } catch (Exception ex) { aryMES_Message.Add(ex.Message.ToString()); throw; } return DepartmentIntegration_DelDepartmentRet; } private int DepartmentIntegration_ERP2MES_Resource(ref IDbConnection cnnMES, ref ArrayList aryReturnMessage, ref int intReturnFailCount, string IfTableName, DataRow[] drSel_IF) { int DepartmentIntegration_ERP2MES_ResourceRet = default(int); DepartmentIntegration_ERP2MES_ResourceRet = -1; // Return -1:fail,0:Success // -------------------------------------------------- // MES_OOEFL_T 中介表 拋轉 MES 部門主檔. // -------------------------------------------------- // aryMES_Message ,收集單筆中介交易記錄的錯誤記錄. // MES_OOEF_T 部門主檔更新 // status:針對產品做 Update,若拋D視為不合理的ERP資料狀態。 // =========================================================== // 宣告 DB相關 變數 // =========================================================== var drTemp = default(DbDataReader); Collection colSQL_T100 = new Collection(), colSQL_T100_Rows = new Collection(); // T100中介DB(MES回填處理記錄). Collection colSQL_2MES = new Collection(), colSQL_2MES_Rows = new Collection(); // MES正式異動資料(主要). string strSQL; // 每筆中介交易記錄 string strIfWhereCond_PK; string strMES_Result; string strMES_MESSAGE; // 錯誤訊息(中介表.MES_MESSAGE),Chr(10)分隔錯誤項目。 var aryMES_Message = new ArrayList(); // 收集單筆中介交易記錄的錯誤記錄, Exception及MES判定錯誤訊息。 var datNow = DateTime.Now; // Now try { // 宣告拋轉中介表資料使用變數 string strERP_DepartmentNo, strERP_DepartmentName, strERP_DepartmentSName; DataRow drChkDept; // Dim colRecUnitInfo As New Collection '收集所有UnitNo,以判斷是否需Insert資料. // -------------------------------------------------- // 必須以tran_Time順序,逐筆處理中介交易記錄。 // 每一筆交易記錄處理完成,立即變更 MESDB 及 MESSERIES_T100.中介表的MES處理記錄,綁在同一個交易裡. // (同包Transaction, 處理完畢後再一起commit) // 當某筆交易記錄處理失敗,立即變更 MESSERIES_T100.中介表的MES處理記錄,再接著處理下一筆記錄. // -------------------------------------------------- foreach (DataRow drIF in drSel_IF) { // reset datNow = DateTime.Now; // Now strIfWhereCond_PK = ""; strMES_Result = "9"; // 預設值 9 (MES處理結果, 成功回寫1, 失敗回寫9). strMES_MESSAGE = ""; // 錯誤訊息 aryMES_Message.Clear(); colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); colSQL_T100.Clear(); colSQL_T100_Rows.Clear(); do { try { // ----------------------------------------------------------- // 取出各欄位資料 // ----------------------------------------------------------- // 編號 strERP_DepartmentNo = drIF["ooefl001"].ToString().Trim().ToUpper(); // 全名 strERP_DepartmentName = modWIN.GetSubString(drIF["ooefl004"].ToString().Trim().ToUpper(), 50); if (string.IsNullOrEmpty(strERP_DepartmentName)) strERP_DepartmentName = "N/A"; // 簡名 if (string.IsNullOrEmpty(drIF["ooefl003"].ToString().Trim())) { strERP_DepartmentSName = modWIN.GetSubString(strERP_DepartmentName, 20); } else { strERP_DepartmentSName = modWIN.GetSubString(drIF["ooefl003"].ToString().Trim().ToUpper(), 20); } if (strERP_DepartmentSName == null || string.IsNullOrEmpty(strERP_DepartmentSName)) strERP_DepartmentSName = strERP_DepartmentName; // ERPws標準功能不論IssueState為何皆允許修改(產品主檔或物料主檔). // 1.檢查是否存在MES string strReturnUnitType; // 1-1.檢查是否有此部門設定 drChkDept = GetDepartmentBasis(strERP_DepartmentNo, cnnMES, aryMES_Message); if (drChkDept == null) break; // GoTo lblExitTry_2_NextRow 'fail if (drChkDept["DepartmentNo"] is DBNull) { aryMES_Message.Add("部門編號(ooefl001):" + strERP_DepartmentName + ", 不存在MES的部門主檔, 不允許執行!!"); // GoTo lblExitTry_2_NextRow break; } // ----------------------------------------------------------- // 3-1.修改MES部門設定 // ----------------------------------------------------------- strSQL = "Update tblUSRDepartmentBasis Set " + " DepartmentName='" + modWIN.GetSubString(strERP_DepartmentName, 50) + "'" + " ,DepartmentSName='" + modWIN.GetSubString(strERP_DepartmentSName, 20) + "'"; if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drChkDept["IssueState"], -1, false))) strSQL += ",IssueState = 2"; strSQL += " Where DepartmentNo='" + strERP_DepartmentNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); // =============================================================================== // 判定 MES_Result 處理結果 (成功回寫1, 失敗回寫9). // =============================================================================== if (aryMES_Message.Count == 0) { strMES_Result = "1"; // -------------------------------------------------- // 四、MES資料庫異動 // -------------------------------------------------- if (colSQL_2MES.Count > 0) { ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colSQL_2MES, colSQL_2MES_Rows); } } else { break; } } catch (Exception EX_drIF) { strMES_Result = "9"; aryMES_Message.Add("EX_drIF.Exception" + '\n' + EX_drIF.Message); } finally { // 組合執行錯誤字串: Chr(10)分隔 strMES_MESSAGE = ArrayList2String(ref aryMES_Message); // 2016/01/13, 直接異動中介表-------------------------- // 'If strMES_MESSAGE = defString Then // ' '當錯誤字串組合失敗,在Finally後會記錄PK. // 'End If // --------------------------------------------------# // MES_Message長度4000限制, 截取0-3996碼加"...". if (strMES_MESSAGE.Length > 4000) strMES_MESSAGE = strMES_MESSAGE.Substring(0, 3996) + "..."; // ---取消前面收集SQL--- colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); colSQL_T100.Clear(); // 若T100中介資料庫異動fail。(若MES_MESSAGE問題,下面會不會一樣fail?) colSQL_T100_Rows.Clear(); // ----------------------------------------------------------- // (EX_drIF.Exception) // 回填中介表資訊,(注意)各個資料表的PK不同。 // ----------------------------------------------------------- // mssql,無trim用法,不串變數值,直接檢查原欄位值. strIfWhereCond_PK = Conversions.ToString(" Where ooefl001 = '" + drIF["ooefl001"] + "'" + " And tran_time = '" + drIF["tran_time"] + "'" + " And ooefl002 = '" + drIF["ooefl002"] + "'" + " And ooeflent ='" + ERP_EntID + "' "); if (Update_T100_IfTable(ref colSQL_T100, ref colSQL_T100_Rows, ref aryMES_Message, IfTableName, strIfWhereCond_PK, strMES_Result, datNow, strMES_MESSAGE) >= 0) { // -------------------------------------------------- // 六、T100中介資料庫異動(EX_drIF) // -------------------------------------------------- ExecuteSQLNoneQuery_ChkRowCount(strERPDataBaseType, strERPconnectionString, colSQL_T100, colSQL_T100_Rows); } } } while (false); // lblExitTry_2_NextRow: // 當該筆中介交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 if (aryMES_Message.Count > 0) { /// 匯整記錄中介表的PK資訊. // 因從錯誤訊息不一定看的出哪一筆中介表交易記錄fail. // 故失敗訊息連同中介表的必要資訊一併匯整. (Email要放詳細資訊) // (1) aryReturnMessage.Add("tran_time:" + drIF["tran_time"] + ", ooefl001:" + drIF["ooefl001"] + ", ooefl002:" + drIF["ooefl002"]); // (2) foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); } // 計算失敗筆數 if (strMES_Result == "9") intReturnFailCount += 1; // 不管成功或失敗,繼續下一筆。 } // //return 0 : Success DepartmentIntegration_ERP2MES_ResourceRet = 0; } catch (Exception ex) { aryMES_Message.Add(ex.Message); // 當該筆中介交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); throw; } finally { if (drTemp != null) drTemp.Close(); } return DepartmentIntegration_ERP2MES_ResourceRet; } private DataRow GetDepartmentBasis(string DepartmentNo, IDbConnection cnnTemp = null, ArrayList aryErrMessage = null, int IssueState = defInteger, string strAdditional = "") { DataRow GetDepartmentBasisRet = default(DataRow); // 此 Function 將資料以 DataRow 方式取出 // 傳回值: DataRow(成功), Nothing(失敗) //var daTemp = default(System.Data.OleDb.OleDbDataAdapter); var dsTemp = default(DataSet); var cnnLocal = default(IDbConnection); string strCondition = default(string), strSQL = default(string); try { if (cnnTemp == null) { // //Create connection string argstrDataBaseType = "Null"; string strDataBaseTypeTmp = objSetting.GetConnectionString(strDataBaseType: argstrDataBaseType); cnnLocal = CreateConnection(strDataBaseTypeTmp); } else { cnnLocal = cnnTemp; } // //查詢條件 if ((DepartmentNo ?? "") != defString) { strCondition += " And DepartmentNo = '" + DepartmentNo + "'"; } if (IssueState != defInteger) { strCondition += " And IssueState = " + IssueState; } // Additional if (!string.IsNullOrEmpty(strAdditional)) { strSQL += strAdditional; } // //主SQL strSQL = "Select * From tblUSRDepartmentBasis Where 1=1" + strCondition; // //Select data //cmmTemp = new IDbCommand(strSQL, cnnTemp); //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp); dsTemp = new DataSet(); //daTemp.Fill(dsTemp, "USRDepartmentBasis"); ExecuteSQLQuery_Adapter(strSQL, dsTemp, "USRDepartmentBasis", cnnTemp); // //Return data if (dsTemp.Tables[0].Rows.Count > 0) { GetDepartmentBasisRet = dsTemp.Tables[0].Rows[0]; } else { GetDepartmentBasisRet = dsTemp.Tables[0].NewRow(); } } catch (Exception ex) { GetDepartmentBasisRet = null; // 此Function發生異常較難由訊息看出,加上FunctionName. aryErrMessage.Add("GetDepartmentBasis:" + ex.Message); throw; } finally { if (cnnTemp == null) CloseConnection(cnnLocal); //if (daTemp != null) // daTemp.Dispose(); if (dsTemp != null) dsTemp.Dispose(); } return GetDepartmentBasisRet; } #endregion #region MES InterFaceTable 轉入 MES正式區(班別) // 功 能: MES InterFaceTable 轉入 MES正式區(班別) // 傳回值: success(成功), fail(失敗) private string ShiftIntegration(Collection colParameters = null) { string ShiftIntegrationRet = default(string); // =========================================================== // 宣告 DB相關 變數 // =========================================================== var cnnERP = default(IDbConnection); // T100中介DB使用(ERP) var cnnMES = default(IDbConnection); // MESDB使用 var drTemp = default(DbDataReader); //var daTemp = new System.Data.OleDb.OleDbDataAdapter(); var dsTemp = new DataSet(); Collection colSQL_T100 = new Collection(), colSQL_T100_Rows = new Collection(); // T100中介DB(MES回填處理記錄). Collection colSQL_2MES = new Collection(), colSQL_2MES_Rows = new Collection(); // MES正式異動資料(主要). string strSQL; // =========================================================== // 宣告 AutoRunJob設定及執行記錄 變數 // =========================================================== string strParameter01 = ""; // 參數一,預設此功能fail通知EMAIL群組。 string strSubject, strBody; // 寄送通知資訊 // AutorunJob拋轉資訊 string strReturnMessage = ""; // 錯誤訊息(tblMESAutoRunLog.ReturnMessage),Chr(10)分隔錯誤項目。 var aryReturnMessage = new ArrayList(); // Catch Error Message (Exception及MES判定錯誤訊息)。 int intFailCount_Shift = 0; // Shift拋轉失敗筆數 // =========================================================== // 宣告 其他 變數 // =========================================================== DateTime datNow; do { try { // -------------------------------------------------- // 一、取得參數 // -------------------------------------------------- // Parameter01為參數一 // 作為Mail通知群組(GroupNo),放在最前面防止連線失敗無法寄送通知。 if (colParameters.Contains("Parameter01")) { strParameter01 = colParameters["Parameter01"].ToString().Trim(); } // If strParameter01 = "" Then // ProductIntegration = "fail;使用者群?未?定!!(tblMESAutorunJob.Parameter01)" // Exit Function '離開 Function。 // End If // -------------------------------------------------- // 二、連線 DB // -------------------------------------------------- // T100中介DB cnnERP = CreateConnection(strERPconnectionString); // MES DB cnnMES = CreateConnection(strConnectionString); // 取得ERPSetting if (!GetERPSetting(ref dtERPSetting, "T100")) { break; } // -------------------------------------------------- // 檢查參數一 Mail通知群組 是否已設定. // -------------------------------------------------- if (!string.IsNullOrEmpty(strParameter01) && ERP2MES_MailNoticeChk(ref cnnMES, ref aryReturnMessage, strParameter01) < 0) { ShiftIntegrationRet = Conversions.ToString("fail;" + aryReturnMessage[0]); return ShiftIntegrationRet; // 離開 Function。 } if (aryReturnMessage.Count > 0) break; // Exit Try /// 取出 MESSERIES_T100.中介表資料. // -------------------------------------------------- // 二、MESSERIES_T100.中介表資料,請依序處理: // Loop 1.班別主檔 MES_ECAA_T:(必須優先) // 每筆交易明細: // MES_Result為空白代表未拋轉。 // 取出後立即異動DB,無論成功或失敗(不跳離),都繼續執行下一筆。 // -------------------------------------------------- string MES_OOGD_T_1 = "MES_OOGD_T"; DataRow[] drSel_IF; // -------------------------------------------------- // Loop 1. 班別主檔 MES_OOGD_T // -------------------------------------------------- strSQL = "Select T1.*, T1.oogd001 As oogd001_Upper " + " From " + MES_OOGD_T_1 + " T1" + " Where T1.MES_Result Is Null" + " And T1.oogdsite = '" + ERP_Site + "' " + " And T1.oogdent ='" + ERP_EntID + "' "; //cmmTempERP = new IDbCommand(strSQL, cnnERP); //daTemp.SelectCommand = cmmTempERP; //daTemp.Fill(dsTemp, MES_OOGD_T_1); //cmmTempERP.Dispose(); ExecuteSQLQuery_Adapter(strSQL, dsTemp, MES_OOGD_T_1, cnnERP); if (!(dsTemp == null) && dsTemp.Tables[MES_OOGD_T_1].Rows.Count > 0) { drSel_IF = dsTemp.Tables[MES_OOGD_T_1].Select("", "tran_Time,oogd001"); if (!(drSel_IF == null) && drSel_IF.Length > 0) { // intFailCount_Shift if (ShiftIntegration_ERP2MES_Shift(ref cnnMES, ref aryReturnMessage, ref intFailCount_Shift, MES_OOGD_T_1, drSel_IF) < 0) { if (aryReturnMessage.Count == 0) // 避免不明原因,執行FAIL又沒收集到項目. { aryReturnMessage.Add("中介表:" + MES_OOGD_T_1 + ", 拋轉執行失敗!!"); } } } } } catch (Exception EX_AUT) { if (cnnERP == null) { aryReturnMessage.Add("T100中介DB(ERP) 連線失敗!!"); } else if (cnnMES == null) { aryReturnMessage.Add("MES DB 連線失敗!!"); } else { aryReturnMessage.Add("EX_AUT.Exception" + '\n' + EX_AUT.Message.ToString()); } } // 回傳結果 ReturnMessage,已一併在Finally處理。 finally { // -------------------------------------------------- // 七、回傳執行結果:succces 或 fail(ReturnMessage) // -------------------------------------------------- if (aryReturnMessage.Count == 0) { ShiftIntegrationRet = "success"; } else { // 組合執行錯誤字串: Chr(10)分隔 strReturnMessage = ArrayList2String(ref aryReturnMessage); if ((strReturnMessage ?? "") == defString) { // 當錯誤字串組合失敗。補上 strReturnMessage = "ReturnMessage收集失敗!!"; } // If Not dsTemp.Tables(strIfTableName) Is Nothing Then // '整理中介表交易筆數 // Dim drSel As DataRow() // Dim strBody_Head As String = "" // strBody_Head = "T100中介表:" & strIfTableName & "匯入至MES正式區" & Chr(10) // drSel = dsTemp.Tables(strIfTableName).Select("imaa004='A'") // If drSel.Length > 0 Then // strBody_Head += "料件類別:A, 總筆數(" & drSel.Length & "),失敗筆數(" & intFailCount_PRD & ")" // End If // drSel = dsTemp.Tables(strIfTableName).Select("imaa004='M'") // If drSel.Length > 0 Then // strBody_Head += "料件類別:M, 總筆數(" & drSel.Length & "),失敗筆數(" & intFailCount_MTL & ")" // End If // '重組 strReturnMessage = 中介表交易筆數 & strReturnMessage // strReturnMessage = strBody_Head & Chr(10) & Chr(10) & strReturnMessage // 'Remove Table // dsTemp.Tables.Remove(strIfTableName) // dsTemp.AcceptChanges() // End If // tblMESAutoRunLog.ReturnMessage 長度4000限制. string strTemp = ""; if (strReturnMessage.Length > 4000) { // 自 strReturnMessage 中截取0-3991碼. strTemp = strReturnMessage.Substring(0, 3991) + "..."; } else { strTemp = strReturnMessage; } // //fail; ShiftIntegrationRet = "fail;" + strTemp; } if (cnnERP != null) CloseConnection(cnnERP); if (cnnMES != null) CloseConnection(cnnMES); //if (daTemp != null) // daTemp.Dispose(); if (dsTemp != null) dsTemp.Dispose(); if (drTemp != null) drTemp.Close(); } } while (false); // -------------------------------------------------- // 八、當執行失敗,寄送 Email。必須有設定參數一。 // -------------------------------------------------- if (aryReturnMessage.Count > 0 && !string.IsNullOrEmpty(strParameter01)) { // strSubject = "[AUT]接收T100中介表:" & strIfTableName & "(產品、物料) 失敗 " strSubject = "[AUT]接收T100中介表:" + "(班別) 失敗 "; strBody = Strings.Replace(strReturnMessage, Conversions.ToString('\n'), "
", Compare: CompareMethod.Text); // 寄送 Email if (ERP2MES_MailNotice(ref cnnMES, ref aryReturnMessage, strSubject, strParameter01, CInput(strBody)) < 0) { // '寄送不成功, ReturnMessage 再增加1項. // 'ProductIntegration += Chr(10) & aryReturnMessage.Item(aryReturnMessage.Count - 1).ToString // 寄送不成功, ReturnMessage 再增加1項. // tblMESAutoRunLog.ReturnMessage 長度4000限制. if (this.ProductIntegration().Length < 4000) { string strTemp = ""; strTemp = strReturnMessage; if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(strTemp + aryReturnMessage[aryReturnMessage.Count - 1].ToString().Length, 4000, false))) { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); } else { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); // 自 strTemp 中截取0-3991碼. strTemp = strTemp.Substring(0, 3991) + "..."; } // //fail; ShiftIntegrationRet = "fail;" + strTemp; } } } return ShiftIntegrationRet; // --------------------------------------------------# } private int ShiftIntegration_ERP2MES_Shift(ref IDbConnection cnnMES, ref ArrayList aryReturnMessage, ref int intReturnFailCount, string IfTableName, DataRow[] drSel_IF) { int ShiftIntegration_ERP2MES_ShiftRet = default(int); ShiftIntegration_ERP2MES_ShiftRet = -1; // Return -1:fail,0:Success // -------------------------------------------------- // 中介表 MES_OOGD_T, 拋轉 MES 班別主檔. // -------------------------------------------------- // aryMES_Message ,收集單筆中介交易記錄的錯誤記錄. // =========================================================== // 宣告 DB相關 變數 // =========================================================== var drTemp = default(DbDataReader); Collection colSQL_T100 = new Collection(), colSQL_T100_Rows = new Collection(); // T100中介DB(MES回填處理記錄). Collection colSQL_2MES = new Collection(), colSQL_2MES_Rows = new Collection(); // MES正式異動資料(主要). string strSQL; // 每筆中介交易記錄 string strIfWhereCond_PK; string strMES_Result; string strMES_MESSAGE; // 錯誤訊息(中介表.MES_MESSAGE),Chr(10)分隔錯誤項目。 var aryMES_Message = new ArrayList(); // 收集單筆中介交易記錄的錯誤記錄, Exception及MES判定錯誤訊息。 var datNow = DateTime.Now; // Now try { // 宣告拋轉中介表資料使用變數 string strERP_ShiftNo, strERP_ShiftName, strERP_status; // 預設值 int intIssueState = 0; // -------------------------------------------------- // 必須以tran_Time順序,逐筆處理中介交易記錄。 // 每一筆交易記錄處理完成,立即變更 MESDB 及 MESSERIES_T100.中介表的MES處理記錄,綁在同一個交易裡. // (同包Transaction, 處理完畢後再一起commit) // 當某筆交易記錄處理失敗,立即變更 MESSERIES_T100.中介表的MES處理記錄,再接著處理下一筆記錄. // -------------------------------------------------- foreach (DataRow drIF in drSel_IF) { // reset datNow = DateTime.Now; // Now strIfWhereCond_PK = ""; strMES_Result = "9"; // 預設值 9 (MES處理結果, 成功回寫1, 失敗回寫9). strMES_MESSAGE = ""; // 錯誤訊息 aryMES_Message.Clear(); colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); colSQL_T100.Clear(); colSQL_T100_Rows.Clear(); do { try { // ----------------------------------------------------------- // 取出各欄位資料 // ----------------------------------------------------------- // 轉大寫 strERP_ShiftNo = drIF["oogd001"].ToString().Trim().ToUpper(); if (string.IsNullOrEmpty(drIF["oogd002"].ToString().Trim())) { strERP_ShiftName = strERP_ShiftNo; } else { strERP_ShiftName = drIF["oogd002"].ToString().Trim().ToUpper(); } strERP_status = drIF["tran_status"].ToString().Trim().ToUpper(); // 檢查是否有此班別設定 strSQL = "Select ShiftNo,IssueState From tblUSRShiftBasis " + " Where ShiftNo='" + strERP_ShiftNo + "'"; //cmmTemp = new IDbCommand(strSQL, cnnMES); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); switch (strERP_status ?? "") { case "AU": // 有資料修改沒資料新增 { if (!drTemp.Read()) { // ----------------------------------------------------------- // 新增MES班別設定 // ----------------------------------------------------------- strSQL = "Insert Into tblUSRShiftBasis " + "(DepartmentNo,ShiftNo,ShiftName," + "IssueState,FromTime,ToTime," + "Creator,CreateDate)"; strSQL += " Values('*','" + strERP_ShiftNo + "','" + strERP_ShiftName + "',0," + "To_Date('2000/01/01 00:00:00','YYYY/MM/DD HH24:MI:SS')," + "To_Date('2000/01/01 00:00:00','YYYY/MM/DD HH24:MI:SS'),'" + strERPCreator + "'," + "To_Date('" + Strings.Format(datNow, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'))"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } else { // aryMES_Message.Add("班別編號(oogd001):" & strERP_ShiftNo & ", 已存在MES, 不允許新增!!") // ERPws標準功能不論IssueState為何皆允許修改. // ----------------------------------------------------------- // 修改MES設備設定 // ----------------------------------------------------------- strSQL = "Update tblUSRShiftBasis Set " + " ShiftName = '" + strERP_ShiftName + "'" + " Where ShiftNo='" + strERP_ShiftNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } drTemp.Close(); //cmmTemp.Dispose(); break; } case "D": // D:刪除 { if (drTemp.Read()) { if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], 0, false))) { // ----------------------------------------------------------- // 刪除MES班別設定 // ----------------------------------------------------------- strSQL = "Delete tblUSRShiftBasis " + " Where DepartmentNo='*'" + " And ShiftNo='" + strERP_ShiftNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } else { // ----------------------------------------------------------- // 作廢MES產品設定 // ----------------------------------------------------------- strSQL = "Update tblUSRShiftBasis Set " + " IssueState = -1" + " Where DepartmentNo='*'" + " And ShiftNo='" + strERP_ShiftNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } } else { aryMES_Message.Add("班別編號(oogd001):" + strERP_ShiftNo + ", 不存在MES, 不允許刪除!!"); } drTemp.Close(); //cmmTemp.Dispose(); break; } default: { aryMES_Message.Add("ERP資料狀態(Status):" + strERP_status + "無效, 不允許執行!!"); break; } } // If aryMES_Message.Count > 0 Then GoTo lblExitTry_2_NextRow // =============================================================================== // 判定 MES_Result 處理結果 (成功回寫1, 失敗回寫9). // =============================================================================== if (aryMES_Message.Count == 0) { strMES_Result = "1"; // -------------------------------------------------- // 四、MES資料庫異動 // -------------------------------------------------- if (colSQL_2MES.Count > 0) { ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colSQL_2MES, colSQL_2MES_Rows); } } else { break; } } catch (Exception EX_drIF) { strMES_Result = "9"; aryMES_Message.Add("EX_drIF.Exception" + '\n' + EX_drIF.Message); } finally { // 組合執行錯誤字串: Chr(10)分隔 strMES_MESSAGE = ArrayList2String(ref aryMES_Message); // 2016/01/13, 直接異動中介表-------------------------- // 'If strMES_MESSAGE = defString Then // ' '當錯誤字串組合失敗,在Finally後會記錄PK. // 'End If // --------------------------------------------------# // MES_Message長度4000限制, 截取0-3996碼加"...". if (strMES_MESSAGE.Length > 4000) strMES_MESSAGE = strMES_MESSAGE.Substring(0, 3996) + "..."; // ---取消前面收集SQL--- colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); colSQL_T100.Clear(); // 若T100中介資料庫異動fail。(若MES_MESSAGE問題,下面會不會一樣fail?) colSQL_T100_Rows.Clear(); // ----------------------------------------------------------- // (EX_drIF.Exception) // 回填中介表資訊,(注意)各個資料表的PK不同。 // ----------------------------------------------------------- // mssql,無trim用法,不串變數值,直接檢查原欄位值. strIfWhereCond_PK = Conversions.ToString(" Where oogd001 = '" + drIF["oogd001"] + "'" + " And tran_time = '" + drIF["tran_time"] + "'" + " And oogdsite = '" + ERP_Site + "' " + " And oogdent ='" + ERP_EntID + "' "); if (Update_T100_IfTable(ref colSQL_T100, ref colSQL_T100_Rows, ref aryMES_Message, IfTableName, strIfWhereCond_PK, strMES_Result, datNow, strMES_MESSAGE) >= 0) { // -------------------------------------------------- // 六、T100中介資料庫異動(EX_drIF) // -------------------------------------------------- ExecuteSQLNoneQuery_ChkRowCount(strERPDataBaseType, strERPconnectionString, colSQL_T100, colSQL_T100_Rows); } } } while (false); // lblExitTry_2_NextRow: // 當該筆中介交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 if (aryMES_Message.Count > 0) { /// 匯整記錄中介表的PK資訊. // 因從錯誤訊息不一定看的出哪一筆中介表交易記錄fail. // 故失敗訊息連同中介表的必要資訊一併匯整. (Email要放詳細資訊) // (1) aryReturnMessage.Add("tran_time:" + drIF["tran_time"] + ", oogd001:" + drIF["oogd001"]); // (2) foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); } // 計算失敗筆數 if (strMES_Result == "9") intReturnFailCount += 1; // 不管成功或失敗,繼續下一筆。 } // //return 0 : Success ShiftIntegration_ERP2MES_ShiftRet = 0; } catch (Exception ex) { aryMES_Message.Add(ex.Message); // 當該筆中介交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); throw; } finally { if (drTemp != null) drTemp.Close(); } return ShiftIntegration_ERP2MES_ShiftRet; } #endregion #endregion #region 生產報工_EAI // 2019/12/27,Ning,此Function應為T100使用 private object funCreateWOWorkReportData_EAI(Collection colParameters = null) { object funCreateWOWorkReportData_EAIRet = default(object); var cnnTemp = default(IDbConnection); DbDataReader drTemp; string strSQL; var XmlDoc = new XmlDocument(); //System.Data.OleDb.OleDbDataAdapter daTemp; var CollectionSQL = new Collection(); var arriveTime = DateTime.Now; string strSheetType = string.Empty; // 報工單別 string strGroupNo = string.Empty; // 異常處理群組 string strProductionDateFrom = string.Empty; // 生產日期起(如無指定則帶昨天) string strProductionDateEnd = string.Empty; // 生產日期迄(如無指定則帶今天) string auto = "N"; // Request... Y: 建立入庫單後自動確認+過帳, N:建立入庫單後不自動確認過帳 string code = string.Empty; // Response... code:錯誤碼;非0則為錯誤 (function回傳 success 或 fail) string VirtualEQP = ""; // Request... 整合成本中心時,沒有機台編號的人工作業站帶入的ERP虛擬機台編號 string WorkReportNos = ""; string RequestKey = ""; string strShiftNo = ""; var datEventTime = DateTime.Now; // 2021/03/30 Elvis 0087678: [瑞賢] AUTORUN報工--報工失敗,發送郵件新增提供失敗清單 //var ExcelExp = new Infragistics.Win.UltraWinGrid.ExcelExport.UltraGridExcelExporter(); //var workbook = new Infragistics.Documents.Excel.Workbook(); var strMONo = default(string); // 2020/09/25 Grace 調整報工單拋轉的source_no, 修改編碼為yyMMddHHmmssff-序號, 避免超出20碼(T100欄位僅開20碼) // 2019/12/27,Ning, WorkReportID string strWorkReportID = Strings.Format(datEventTime, "yyMMddHHmmssff"); var colSQL_T3 = new Collection(); // 2020/11/17,Ning, 允許tblWIPLotLog_Report.EndTime Is Null, 若GoodQty, FailQty, UnitNo為Null時改取自tblWIPLotLog decimal decLogGoodQty, decLogFailQty; string strLogUnitNo; decimal decGoodQty; do { try { // ParameterXX參數說明 // 01 報工單單別 // 02 使用者群組 // 03 生產日期[yyyy/MM/dd](如無指定則用昨天) // 04 ERP自動確認(如無指定則用N) // 05 整合成本中心 Y:表示整合成本中心;N:表示未整合成本中心;未設定預設值為N // 06 整合成本中心時,純人工作業站沒有機台,回報人時需所指定ERP虛擬機台編號,如果未設定,ERP將抓取ERP工單上的成本中心欄位作為歸屬機台。 // Parameter01為傳入參數,作為SheetType,若無此值則不進行下面的程式 if (colParameters["Parameter01"] == null || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter01"])))) { funCreateWOWorkReportData_EAIRet = CombineFailMsg("0000-200002", "SheetType not found!!!(Parameter 01)"); break; } else { strSheetType = Strings.Trim(Conversions.ToString(colParameters["Parameter01"])); } // Parameter02為傳入參數,作為GroupNo,若無此值則不進行下面的程式 if (colParameters["Parameter02"] == null || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter02"])))) { funCreateWOWorkReportData_EAIRet = CombineFailMsg("0000-200002", "User GroupNo not found!!!(Parameter 02)"); break; } else { strGroupNo = Strings.Trim(Conversions.ToString(colParameters["Parameter02"])); } // Parameter03為傳入參數,作為ProductionDate,若無此值則用昨天當日期 if (colParameters["Parameter03"] == null || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter03"])))) { strProductionDateFrom = Strings.Format(DateTime.Now.AddDays(-1), "yyyy/MM/dd"); strProductionDateEnd = Strings.Format(DateTime.Now, "yyyy/MM/dd"); } else { do { try { strProductionDateFrom = Strings.Format(DateTime.Parse(colParameters["Parameter03"].ToString().Trim()), "yyyy/MM/dd"); strProductionDateEnd = Strings.Format(DateTime.Parse(colParameters["Parameter03"].ToString().Trim()).AddDays(1d), "yyyy/MM/dd"); } catch (Exception ex) { funCreateWOWorkReportData_EAIRet = CombineFailMsg("0000-200012", "Parse ProductionDate fail(yyyy/MM/dd)!!!(Parameter 03)"); break; } } while (false); } // Parameter04為傳入參數,作為自動確認,若無此值則用N if (colParameters["Parameter04"] == null || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter04"])))) { auto = "N"; } else if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(colParameters["Parameter04"].ToString().ToUpper(), "Y", false)) || Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(colParameters["Parameter04"].ToString().ToUpper(), "N", false))) { auto = colParameters["Parameter04"].ToString().ToUpper(); } else { funCreateWOWorkReportData_EAIRet = CombineFailMsg("0000-200015", "Parameter 04 not Y or N"); break; } // Parameter06為傳入參數,作為defVirtualEQP if (colParameters["Parameter06"] == null || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter06"])))) { VirtualEQP = ""; } else { VirtualEQP = colParameters["Parameter06"].ToString().Trim().ToUpper(); } // ------------------Joe,測試用資訊-------------------- // strConnectionString = "Provider=OraOleDB.Oracle;User ID=MESSERIES_TEST;Data Source=IMES_HC;Password=sa" // cnnTemp = CreateConnection(strConnectionString) // strProductionDateFrom = Format(Now.AddDays(-365), "yyyy/MM/dd") // strProductionDateEnd = Format(Now, "yyyy/MM/dd") // strDataBaseType = "oracle" // ------------------Joe,測試用資訊-------------------- cnnTemp = CreateConnection(strConnectionString); // 取得班別第1筆資料 strSQL = "Select * From tblUSRShiftBasis "; //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (drTemp.Read()) { strShiftNo = drTemp["ShiftNo"].ToString(); // 2017-04-25, Joe, 用ERP原始的編號回傳 if (!string.IsNullOrEmpty(drTemp["ERPNo"].ToString())) strShiftNo = drTemp["ERPNo"].ToString(); } drTemp.Close(); if (string.IsNullOrEmpty(strShiftNo) || string.IsNullOrEmpty(strShiftNo)) { funCreateWOWorkReportData_EAIRet = CombineFailMsg("0000-200003", "ShiftNo not found!!!"); break; } // 2017/12/27,sammi.MEStoERP生產報工抛轉資料,1:平攤(tblWIPCont_Resource_Share),2:原始(未平攤,tblWIPCont_Resource) string tblCont_Resource = "tblWIPCont_Resource_Share "; bool blnReCalResource = true; bool blnShare = true; strSQL = "Select ParameterValue From tblSYSParameter " + " Where ParameterType='SysInfo' " + " And ParameterNo='ERPWOWORKREPORTDATA' "; //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (drTemp.Read()) { if (drTemp["ParameterValue"].ToString() == "2") { tblCont_Resource = "tblWIPCont_Resource"; blnReCalResource = false; blnShare = false; } } drTemp.Close(); //cmmTemp.Dispose(); // 2018/07/19 Lena, 增加系統參數,判定是否需要重匯機時、人時, 0:No、1:Yes. // 當為平攤時, 必須再參考系統參數中是否有設定要重匯機時 if (blnReCalResource) { strSQL = "Select ParameterValue From tblSYSParameter " + " Where ParameterType='SysInfo' " + " And ParameterNo='ERPWOWorkReportReCalResource' "; //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (drTemp.Read()) { if (drTemp["ParameterValue"].ToString() == "0") { blnReCalResource = false; } } drTemp.Close(); //cmmTemp.Dispose(); } if (blnReCalResource) { // 機時,人時 var colParameters_Resource = new Collection(); colParameters_Resource.Add(strProductionDateFrom, "Parameter01"); // funCreateWOWorkReportData_T100,TP,WF,call funShareEQPTime/funShareEMPTime,發Mail通知,統一由主funciton發出. // colParameters_Resource.Add(strGroupNo, "Parameter02") colParameters_Resource.Add("", "Parameter02"); string strResult_EQP; strResult_EQP = Conversions.ToString(funShareEQPTime(colParameters_Resource)); if (strResult_EQP != "success") { funCreateWOWorkReportData_EAIRet = CombineFailMsg("0000-200091", "funShareEQPTime:" + strResult_EQP); break; } string strResult_EMP; strResult_EMP = Conversions.ToString(funShareEMPTime(colParameters_Resource)); if (strResult_EMP != "success") { funCreateWOWorkReportData_EAIRet = CombineFailMsg("0000-200091", "funShareEMPTime:" + strResult_EMP); break; } } // 2020/05/17 Grace Mantis 71922 MSSQL查詢語法修改 // 2017-04-19, Joe, 人時、機時改為秒 // 報工單號,項次,單據日期,報工人員,報工班別(非必要),工單單號,作業編號,作業序(非必要),工作站(非必要),機器編號,作業人數,完成日期,完成時間,工時,機時,單位,良品數量,報廢數量,備註(非必要) if (strDataBaseType != "oracle") { strSQL = " SELECT A.EVENTTIME, ISNULL(ec.EquipmentNo,'" + VirtualEQP + "') EQUIPMENTNO, A.MONO, ISNULL(ea.ERPNo,'" + VirtualEQP + "') OPGroupNo, (eb.ERPNo) as OPNo,c.endtime, c.GoodQty, C.FAILQTY, "; strSQL += " ISNULL(e.PropertyValue,c.GoodUnitNo) UnitNo, count(userno) as ExcUserCount, "; strSQL += "SUM(ISNULL(B.RESVALUE,0)) * 60 EQP, "; // strSQL += " (SUM(ISNULL(A.RESVALUE,0)) / Case When (SELECT COUNT(*) FROM TBLWIPCONT_RESOURCE C WHERE C.LOGGROUPSERIAL = A.LOGGROUPSERIAL AND C.RESCLASS = 1) = 0 then 1 else (SELECT COUNT(*) FROM TBLWIPCONT_RESOURCE C WHERE C.LOGGROUPSERIAL = A.LOGGROUPSERIAL AND C.RESCLASS = 1) end ) EMP " strSQL += " (SUM(ISNULL(A.RESVALUE,0)) / Case When (SELECT COUNT(*) FROM " + tblCont_Resource + " C WHERE C.LOGGROUPSERIAL = A.LOGGROUPSERIAL AND C.RESCLASS = 1) = 0 then 1 else (SELECT COUNT(*) FROM " + tblCont_Resource + " C WHERE C.LOGGROUPSERIAL = A.LOGGROUPSERIAL AND C.RESCLASS = 1) end ) EMP "; strSQL += " ,A.LOGGROUPSERIAL, F.FactoryNo, g.WorkPriceType, g.WorkPrice "; strSQL += " FROM ( "; // strSQL += " SELECT CONVERT(CHAR(10), EVENTTIME, 111) AS EVENTTIME, A.MONO, A.OPNo, A.LOGGROUPSERIAL, SUM(A.RESVALUE) * 60 RESVALUE " // strSQL += " FROM TBLWIPCONT_RESOURCE A " strSQL += " SELECT A.EVENTTIME, A.MONO, A.OPNo, A.LOGGROUPSERIAL, SUM(A.RESVALUE) * 60 RESVALUE "; strSQL += " FROM " + tblCont_Resource + " A "; strSQL += " WHERE A.RESCLASS = 0 AND A.EVENTTIME >= '" + strProductionDateFrom + "' AND A.EVENTTIME < '" + strProductionDateEnd + "' "; strSQL += " GROUP BY A.EVENTTIME, A.MONO, A.MONO, A.OPNo, A.LOGGROUPSERIAL) A "; // strSQL += " LEFT JOIN TBLWIPCONT_RESOURCE B ON A.LOGGROUPSERIAL = B.LOGGROUPSERIAL AND B.RESCLASS = 1 " strSQL += " LEFT JOIN " + tblCont_Resource + " B ON A.LOGGROUPSERIAL = B.LOGGROUPSERIAL AND B.RESCLASS = 1 "; strSQL += " left join tblWIPLotLog_Report c on a.LogGroupSerial = c.LogGroupSerial "; strSQL += " left join tblOPGroupDetail d on A.OPNO = d.OPNo "; strSQL += " left join tblOEMOProperty e on a.mono = e.mono and e.PropertyNO = '" + strERPUnitNo + "' "; strSQL += " left join tblOEMOBasis f on C.mono = f.mono "; strSQL += " left join tblOPGroupBasis ea on ea.OPGroupNo = d.OPGroupNo "; strSQL += " left join tblOPBasis eb on eb.OPNo = a.OPNo "; strSQL += " left join tblEQPEquipmentBasis ec on ec.EquipmentNo = b.RESItem "; strSQL += " Left Join TBLPRDRUNTIMESETUP g on g.ProductNo = c.ProductNo and g.ProductVersion = c.ProductVersion and g.OPNo = b.OPNo and g.EquipmentNo = b.ResItem "; // 2019/12/27,Ning, 因tblWIPCont_Resource_Share沒有ResType欄位, 故取消, 已有g.EquipmentNo = b.ResItem條件已足夠 // strSQL += " Left Join TBLPRDRUNTIMESETUP g on g.ProductNo = c.ProductNo and g.ProductVersion = c.ProductVersion and g.OPNo = b.OPNo and g.EquipmentType = b.ResType and g.EquipmentNo = b.ResItem " strSQL += "where c.ERPNo is null "; // strSQL += "and c.EndTime is not null " strSQL += "GROUP BY A.EVENTTIME, ec.EquipmentNo, A.MONO ,ea.ERPNo, eb.ERPNo,c.endtime, c.GoodQty, c.FAILQTY, ISNULL(e.PropertyValue,c.GoodUnitNo),A.LOGGROUPSERIAL, F.FactoryNo, g.WorkPriceType, g.WorkPrice "; } else { strSQL = " SELECT A.EVENTTIME, NVL(ec.EquipmentNo, '" + VirtualEQP + "') AS EQUIPMENTNO, A.MONO, NVL(ea.ERPNo,'" + VirtualEQP + "') as OPGroupNo, (eb.ERPNo) as OPNo,c.endtime, c.GoodQty, C.FAILQTY, "; strSQL += "NVL(e.PropertyValue,c.GoodUnitNo) as UnitNo, count(userno) as ExcUserCount, "; strSQL += "SUM(NVL(B.RESVALUE,0)) * 60 EQP, "; // strSQL += "ROUND(SUM(CASE WHEN (SELECT COUNT(*) FROM TBLWIPCONT_RESOURCE C WHERE C.LOGGROUPSERIAL = A.LOGGROUPSERIAL AND C.RESCLASS = 1) > 1 " // strSQL += "THEN A.RESVALUE / (SELECT COUNT(*) FROM TBLWIPCONT_RESOURCE C WHERE C.LOGGROUPSERIAL = A.LOGGROUPSERIAL AND C.RESCLASS = 1) " strSQL += "ROUND(SUM(CASE WHEN (SELECT COUNT(*) FROM " + tblCont_Resource + " C WHERE C.LOGGROUPSERIAL = A.LOGGROUPSERIAL AND C.RESCLASS = 1) > 1 "; strSQL += "THEN A.RESVALUE / (SELECT COUNT(*) FROM " + tblCont_Resource + " C WHERE C.LOGGROUPSERIAL = A.LOGGROUPSERIAL AND C.RESCLASS = 1) "; strSQL += "Else A.RESVALUE "; strSQL += "END),2) AS EMP "; strSQL += " ,A.LOGGROUPSERIAL, F.FactoryNo, g.WorkPriceType, g.WorkPrice "; strSQL += "FROM ( "; // strSQL += "SELECT TO_CHAR(A.EVENTTIME,'YYYY/MM/DD') EVENTTIME, A.MONO, A.OPNo, A.LOGGROUPSERIAL, SUM(A.RESVALUE) * 60 RESVALUE " // strSQL += "FROM TBLWIPCONT_RESOURCE A " strSQL += "SELECT A.EVENTTIME, A.MONO, A.OPNo, A.LOGGROUPSERIAL, SUM(A.RESVALUE) * 60 RESVALUE "; strSQL += "FROM " + tblCont_Resource + " A "; strSQL += "WHERE A.RESCLASS = 0 AND A.EVENTTIME >= TO_DATE( '" + strProductionDateFrom + "','YYYY/MM/DD') AND A.EVENTTIME < TO_DATE('" + strProductionDateEnd + "','YYYY/MM/DD') "; strSQL += "GROUP BY A.EVENTTIME, A.MONO, A.MONO, A.OPNo, A.LOGGROUPSERIAL) A "; // strSQL += "GROUP BY TO_CHAR(A.EVENTTIME,'YYYY/MM/DD'), A.MONO, A.MONO, A.OPNo, A.LOGGROUPSERIAL) A " // strSQL += "LEFT JOIN TBLWIPCONT_RESOURCE B ON A.LOGGROUPSERIAL = B.LOGGROUPSERIAL AND B.RESCLASS = 1 " strSQL += "LEFT JOIN " + tblCont_Resource + " B ON A.LOGGROUPSERIAL = B.LOGGROUPSERIAL AND B.RESCLASS = 1 "; strSQL += "left join tblWIPLotLog_Report c on a.LogGroupSerial = c.LogGroupSerial "; strSQL += "left join tblOPGroupDetail d on A.OPNO = d.OPNo and rownum = 1 "; strSQL += "left join tblOEMOProperty e on a.mono = e.mono and e.PropertyNO = '" + strERPUnitNo + "' "; strSQL += "left join tblOEMOBasis f on C.mono = f.mono "; strSQL += " left join tblOPGroupBasis ea on ea.OPGroupNo = d.OPGroupNo "; strSQL += " left join tblOPBasis eb on eb.OPNo = a.OPNo "; strSQL += " left join tblEQPEquipmentBasis ec on ec.EquipmentNo = b.RESItem "; strSQL += " Left Join TBLPRDRUNTIMESETUP g on g.ProductNo = c.ProductNo and g.ProductVersion = c.ProductVersion and g.OPNo = b.OPNo and g.EquipmentNo = b.ResItem "; // 2019/12/27,Ning, 因tblWIPCont_Resource_Share沒有ResType欄位, 故取消, 已有g.EquipmentNo = b.ResItem條件已足夠 // strSQL += " Left Join TBLPRDRUNTIMESETUP g on g.ProductNo = c.ProductNo and g.ProductVersion = c.ProductVersion and g.OPNo = b.OPNo and g.EquipmentType = b.ResType and g.EquipmentNo = b.ResItem " strSQL += "where c.ERPNo is null "; // strSQL += "and c.EndTime is not null " strSQL += "GROUP BY A.EVENTTIME, ec.EquipmentNo, A.MONO ,ea.ERPNo, eb.ERPNo,c.endtime, c.GoodQty, c.FAILQTY, NVL(e.PropertyValue,c.GoodUnitNo),A.LOGGROUPSERIAL, F.FactoryNo, g.WorkPriceType, g.WorkPrice "; } //cmmTemp = new IDbCommand(strSQL, cnnTemp); //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp); var dsTemp = new DataSet(); //daTemp.Fill(dsTemp, "costCenter"); //daTemp.Dispose(); //cmmTemp.Dispose(); ExecuteSQLQuery_Adapter(strSQL, dsTemp, "costCenter", cnnTemp); // 取得erp資訊 if (!GetERPSetting(ref dtERPSetting, pEAIType: 1)) { funCreateWOWorkReportData_EAIRet = CombineFailMsg("0000-200091", "Can not found EAI ERP Setting Info (EAI_TYPE = 1)!"); break; } if (dsTemp.Tables["costCenter"].Rows.Count > 0) { int iCount = 0; // 一筆資料一張xml拋erp bool exitTry = false; foreach (DataRow dr in dsTemp.Tables["costCenter"].Rows) { strMONo = dr["MONO"].ToString(); // 2021/03/30 Elvis 0087678: [瑞賢] AUTORUN報工--報工失敗,發送郵件新增提供失敗清單 STAR iCount += 1; // test // If dr("MONo").ToString.StartsWith("C") = False Then Continue For CollectionSQL.Clear(); var objMaster = new iMESCIO.SCI.ERP.Request.SCI_Request_wo_work_report_data_create(); var objDetail = new List(); var objD = new iMESCIO.SCI.ERP.Request.SCI_detail_wo_work_report(); // ==========單頭 // 報工單號 objMaster.doc_type_no = strSheetType; // 單據日期 objMaster.create_date = Strings.Format(datEventTime, "yyyyMMddHHmmss"); // 工作站 objMaster.workstation_no = dr["OPGroupNo"].ToString(); // 工廠 objMaster.factory_no = dr["FactoryNo"].ToString(); // 班別 objMaster.shift_no = strShiftNo; // 2020/09/25 Grace 調整報工單拋轉的source_no, 修改編碼為yyMMddHHmmssff-序號, 避免超出20碼(T100欄位僅開20碼) // 2020/05/22 Grace Mantis 72259 MES產生報工單號後,將單號後面加上"-" & 流水碼回給ERP(source_no),避免ERP收到的單號重複,也避免異動到取消報工的架構 // MES單據 '2020/02/14 Grace 新增傳遞source_no, source_no不可為空, T100會報錯 objMaster.source_no = strWorkReportID + "-" + iCount.ToString(); // 備註(沒有) // ==========單身 // 2020/11/17,Ning,當tblWIPLotLog_Report.GoodQty為Null時, 去tblWIPLotLog取 decLogGoodQty = 0m; decLogFailQty = 0m; strLogUnitNo = "N/A"; if (string.IsNullOrEmpty(dr["GoodQty"].ToString()) || string.IsNullOrEmpty(dr["FailQty"].ToString()) || string.IsNullOrEmpty(dr["UnitNo"].ToString())) { strSQL = "Select GoodQty,Nvl(ScrapQty,0) As ScrapQty,Nvl(UnitNo,'N/A') As UnitNo " + " From tblWIPLotLog Where LogGroupSerial = '" + dr["LogGroupSerial"].ToString() + "'" + " And GoodQty is not Null " + " Order by LotSerial Desc"; strSQL = SQLCommandTuning(strDataBaseType, ref strSQL); //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (drTemp.Read()) { decLogGoodQty = Conversions.ToDecimal(drTemp["GoodQty"]); decLogFailQty = Conversions.ToDecimal(drTemp["ScrapQty"]); strLogUnitNo = Conversions.ToString(drTemp["UnitNo"]); } drTemp.Close(); //cmmTemp.Dispose(); } // 序號 objD.seq = 1.ToString(); // 工單單號 objD.wo_no = dr["MONo"].ToString(); // 報廢數量 // 2017-02-08, Joe, 取消報廢數 // objD.scrap_qty = dr("FailQty") // 良品數量 if (string.IsNullOrEmpty(dr["GoodQty"].ToString())) { objD.qty = decLogGoodQty.ToString(); } else { objD.qty = dr["GoodQty"].ToString(); } // 工時 objD.labor_hours = dr["EMP"].ToString(); // 機時 objD.machine_hours = dr["EQP"].ToString(); // 機器編號 objD.machine_no = dr["EquipmentNo"].ToString(); // 製程順序(沒有) // 作業編號 objD.op_no = dr["OPNo"].ToString(); // 單位 20180427 0046049 KevinChang,ERP回覆單位須傳入大寫 if (string.IsNullOrEmpty(dr["UnitNo"].ToString())) { objD.unit_no = strLogUnitNo.ToUpper(); } else { objD.unit_no = dr["UnitNo"].ToString().ToUpper(); } // 報工人員(沒有) // 報工時間(迄) // 2017-05-23, Joe, 此欄位改為string只傳HH:mm // 2020/11/17,Ning, 報工日期應EventTime // objD.report_datetime_e = Format(dr("EndTime"), "HH:mm") objD.report_datetime_e = Strings.Format(dr["EventTime"], "HH:mm"); // 作業人數 objD.number_of_operators = Conversions.ToString(dr["ExcUserCount"]); // 完成日期 // 2017-05-23, Joe, 此欄傳yyyyMMdd,2017-07-04 KevinChang ERP討論結果此欄傳yyyyMMddHHmmss // 2020/11/17,Ning, 報工日期應EventTime // objD.complete_date = Format(dr("EndTime"), "yyyyMMddHHmmss") objD.complete_date = Strings.Format(dr["EventTime"], "yyyyMMddHHmmss"); // 備註(沒有) // 2017-05-03, Joe, Add 計價類型、計件單價、每小時工資 objD.return_type = dr["WorkPriceType"].ToString(); objD.price = 0.ToString(); objD.wages = 0.ToString(); if (objD.return_type == "1") { if (!(dr["WorkPrice"] is DBNull)) objD.price = Conversions.ToString(dr["WorkPrice"]); } else if (objD.return_type == "2") { if (!(dr["WorkPrice"] is DBNull)) objD.wages = Conversions.ToString(dr["WorkPrice"]); } objDetail.Add(objD); objMaster.report_detail = objDetail; object argSCI_Object = objMaster; InXml = CombineRequestXMLbyCDO(ref argSCI_Object, dtERPSetting.Rows[0]["ERP_Name"].ToString(), "", "wo.work.report.data.create", pRequestKey: RequestKey); objMaster = (iMESCIO.SCI.ERP.Request.SCI_Request_wo_work_report_data_create)argSCI_Object; // ----- Call ERP Web Service ----- using (var ws = new iMESCore.Base.Invoke.wsERP_EAI.IntegrationEntry()) { ws.Url = ERP_URL; OutXml = ws.invokeSrv(InXml); } // ---------------Joe,測試用--------------------- // Dim strFile As String = "C:\Users\Joe\Desktop\Project\RD\ERP整合\xml\response.wo.work.report.data.create.xml" // XmlDoc.Load(strFile) // OutXml = XmlDoc.InnerXml // ---------------Joe,測試用--------------------- // 將ERP拋回的資料轉成物件 var objReponse = new iMESCIO.SCI.ERP.Response.SCI_Response_wo_work_report_data_create(); // Dim ERPResult As String = "fail" code = "fail"; do { try { objReponse.ParseXmlToObject(OutXml); } catch (Exception ex) { funCreateWOWorkReportData_EAIRet = CombineFailMsg("0000-200015", "Response XML Format Error!"); // 紀錄TransactionLog() string argstrException1 = null; modAutoRunLibrary.addTransactionLog_ErrorCode(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "MES", "WorkReportData_EAI", Environment.MachineName, "AutoRun", datEventTime.ToString("yyyy/MM/dd HH:mm:ss"), code, dr["MONo"].ToString(), "CreateWOWorkReportData", ErrorCode: "0000-200015", LogClass: "AutoRun", strException: argstrException1); break; } } while (false); // 檢核ERP回傳結果 if (objReponse.code == "0") { code = "success"; } else { if (objReponse.description == null) { funCreateWOWorkReportData_EAIRet = CombineFailMsg("0000-200015", OutXml); } else { funCreateWOWorkReportData_EAIRet = CombineFailMsg("0000-200015", objReponse.description); } exitTry = true; break; } // 紀錄TransactionLog() // addTransactionLog(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "MES", "WorkReportData_EAI", My.Computer.Name, // "AutoRun", datEventTime.ToString("yyyy/MM/dd HH:mm:ss"), code, dr("MONo").ToString, "CreateWOWorkReportData") // ----- 將UNDO鎖住 ----- strSQL = " Update tblWIPReverseHistory Set CommitState=1, CommitDesc='AutoRun CreateWOWorkReportData_EAI' " + " Where LotSerial In (Select LotSerial From tblWIPLotLog Where LogGroupSerial = '" + dr["LogGroupSerial"].ToString() + "' )"; CollectionSQL.Add(strSQL); // ----- 執行ERP交易完畢紀錄TransactionLog ----- string argstrException = null; modAutoRunLibrary.addTransactionLog(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "MES", "WorkReportData_EAI", Environment.MachineName, "AutoRun", arriveTime.ToString("yyyy/MM/dd HH:mm:ss"), code, objReponse.report_no, "CreateWOWorkReportData", strException: argstrException); // ----- 將報工單號回填LotLog_Report ----- strSQL = " Update tblWIPLotLog_Report Set ERPNo='" + objReponse.report_no + "' Where LogGroupSerial = '" + dr["LogGroupSerial"].ToString() + "' "; CollectionSQL.Add(strSQL); RequestKey= funGetRequestKey(ref argSCI_Object, dtERPSetting.Rows[0]["ERP_Name"].ToString(), "", "wo.work.report.data.create", pRequestKey: RequestKey); // ----- 將報工單據回寫MES----- strSQL = "insert into tblSYSERPDocumentLog (TransID ,MESNo ,ERPNo ,DocumentType,CreateDate) " + " Values ('" + RequestKey + "','" + dr["LogGroupSerial"].ToString() + "','" + objReponse.report_no + "',3" + ", To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'))"; CollectionSQL.Add(strSQL); // ----- 執行SQL ----- ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, CollectionSQL); if (string.IsNullOrEmpty(dr["GoodQty"].ToString())) { decGoodQty = decLogGoodQty; } else { decGoodQty = Convert.ToDecimal(dr["GoodQty"].ToString()); } // 2019/12/27, Ning, 紀錄報工單拋轉明細資料(T3_EAI) // 2020/02/14 Grace 增加ERPNo欄位, 紀錄ERP回傳的報工單號, 避免執行重拋後報工單畫面查詢明細時對應到多筆資料 strSQL = Conversions.ToString("Insert Into tblERPWorkRPT_Detail_EAI (WorkReportID, LogGroupSerial, EquipmentNo, MONo, EQP_ResValue, EMP_ResValue, GoodQty, ERPNo)" + " Values ('" + strWorkReportID + "','" + dr["LogGroupSerial"].ToString() + "','" + dr["EquipmentNo"].ToString() + "','" + dr["MONo"].ToString() + "'," + dr["EQP"] + "," + dr["EMP"] + "," + decGoodQty + ", '" + objReponse.report_no + "')"); colSQL_T3.Add(strSQL); // 平攤的計算方式才需要回填tblWIPCont_Equipment與tblWIPCont_Employee_MultiUser if (blnShare) { strSQL = "Update tblWIPCont_Equipment Set ERPFlag = 1, WorkReportID = '" + strWorkReportID + "' Where LogGroupSerial = '" + dr["LogGroupSerial"].ToString() + "'"; colSQL_T3.Add(strSQL); strSQL = "Update tblWIPCont_Employee_MultiUser Set ERPFlag = 1, WorkReportID = '" + strWorkReportID + "' Where LogGroupSerial = '" + dr["LogGroupSerial"].ToString() + "'"; colSQL_T3.Add(strSQL); } // ----- 將所有單號保留,後續寄mail會用到 ----- WorkReportNos += objReponse.report_no + ","; objMaster = null; objDetail = null; objD = null; } if (exitTry) { break; } } dsTemp.Dispose(); // tblCont_Resource壓上ERPFlag與WorkReportID strSQL = "Update " + tblCont_Resource + " Set ERPFlag = 1, WorkReportID = '" + strWorkReportID + "'" + " Where EventTime >= To_Date('" + strProductionDateFrom + "','YYYY/MM/DD') AND EventTime < To_Date('" + strProductionDateEnd + "','YYYY/MM/DD') "; SQLCommandTuning(strDataBaseType, ref strSQL); colSQL_T3.Add(strSQL); // 報工單拋轉彙整資料表(T1) strSQL = "Insert Into tblERPWorkRPT_Summary (WorkReportID, DataStartTime, DataEndTime, ERPFlag)" + " Values('" + strWorkReportID + "', To_Date('" + strProductionDateFrom + "','YYYY/MM/DD'), To_Date('" + strProductionDateEnd + "','YYYY/MM/DD'), 1)"; SQLCommandTuning(strDataBaseType, ref strSQL); colSQL_T3.Add(strSQL); // ----- 執行SQL ----- ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, colSQL_T3); // //Return success funCreateWOWorkReportData_EAIRet = "success;" + WorkReportNos + ";"; } catch (Exception ex) { funCreateWOWorkReportData_EAIRet = CombineFailMsg("0000-999999", ex.Message); // ----- 執行ERP交易完畢紀錄TransactionLog ----- string argstrException = null; modAutoRunLibrary.addTransactionLog_ErrorCode(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "MES", "WorkReportData_EAI", Environment.MachineName, "AutoRun", arriveTime.ToString("yyyy/MM/dd HH:mm:ss"), "fail", "MONo", "CreateWOWorkReportData", ErrorCode: "0000-999999", LogClass: "AutoRun", strException: argstrException); // 2013/02/05, Hank, Send Email colParameters.Add(funCreateWOWorkReportData_EAIRet, "EmailBody"); SendJobFailEmail(colParameters); } finally { try { CloseConnection(cnnTemp); // =================================2021/03/30 Elvis 0087678: [瑞賢] AUTORUN報工--報工失敗,發送郵件新增提供失敗清單 STAR var dsResult = new DataTable("dsResult"); // 拋轉日期、報工日期、工單編號、失敗原因 // strProductionDateFrom 報工日期CreateConnection // drResource("MONo").ToString 工單編號 // funCreateWOWorkReportData_WF 失敗原因CreateConnection dsResult.Columns.Add("WOWorkDate", Type.GetType("System.String")); // 拋轉日期 dsResult.Columns.Add("ProductionDate", Type.GetType("System.String")); // 報工日期 dsResult.Columns.Add("MONo", Type.GetType("System.String")); // 工單單號 dsResult.Columns.Add("FailReason", Type.GetType("System.String")); // 失敗原因 string strFillType = "XLS"; dsResult.Rows.Add(strProductionDateEnd, strProductionDateFrom, strMONo, funCreateWOWorkReportData_EAIRet); //var iugTemp = new iMESUltraGrid.iMESUltraGridControl(); //iugTemp.iMESUltraGrid_InitializeLayOut += iMESUltraGrid_InitializeLayOut; // Dim iugTemp As New iMESUltraGrid.iMESUltraGridControl // AddHandler iugTemp.iMESUltraGrid_InitializeLayOut, AddressOf iMESUltraGrid_InitializeLayOut //iugTemp.Identity = "iMES"; //iugTemp.UserNo = "iMES"; //var memStream = new MemoryStream(); //讓最後一列style生效,新增空列 DataRow drEnd = dsResult.NewRow(); dsResult.Rows.Add(drEnd); var dtResult = new DataSet(); dtResult.Tables.Add(dsResult); //iugTemp.iMESUltraGrid.DataSource = dtResult.Tables[0]; // 0133391: [跨平台]AutoRunLib移除iMESUltraGrid的使用, 2023/4/21 String ExcelMode = strFillType.ToString().ToUpper(); //"XLSX" , "XLS" byte[] membyte = modAutoRunLibrary.funExcelToByte(dtResult, ExcelMode, strLanguageMode, strResourceDir); //var memStream = new MemoryStream(membyte); //memStream.Seek(0L, SeekOrigin.Begin); //// 將欄位翻譯 //if (!string.IsNullOrEmpty(modWIN.gLanguageMode)) //{ // var ColSaveControl = new Collection(); // ColSaveControl.Add(iugTemp.iMESUltraGrid); // //ChgTranslateName(ColSaveControl, modWIN.gLanguageMode); //} //foreach (DataRow drResource in dsResult.Rows) //{ // switch (strFillType.ToString().ToUpper() ?? "") // { // // Case "XLSX" // // '匯出Excel再轉Stream // // workbook = ExcelExp.Export(iugTemp.iMESUltraGrid, Infragistics.Documents.Excel.WorkbookFormat.Excel2007) // // workbook.Save(memStream) // // memStream.Seek(0, SeekOrigin.Begin) // case "XLS": // { // // 匯出Excel再轉Stream // workbook = ExcelExp.Export(iugTemp.iMESUltraGrid); // iugTemp.iMESUltraGrid, Infragistics.Documents.Excel.WorkbookFormat.Excel97To2003 // workbook.Save(memStream); // memStream.Seek(0L, SeekOrigin.Begin); // break; // } // } //} // Stream轉成附件檔 //var AttachFile = new byte[(int)(memStream.Length - 1L + 1)]; //double count = 0d; //while (count < memStream.Length) //{ // AttachFile[(int)Math.Round(count)] = Convert.ToByte(memStream.ReadByte()); // count += 1d; //} try { dtResult.Dispose(); } catch (Exception ex) { } // =================================2021/03/30 Elvis 0087678: [瑞賢] AUTORUN報工--報工失敗,發送郵件新增提供失敗清單 END // 寄送Mail string argFileName = "ErrorList.xls"; string argEmailSubject = "WO Work Report Data [" + strProductionDateFrom + "]"; string argEmailBody = Conversions.ToString(funCreateWOWorkReportData_EAIRet); modAutoRunLibrary.SendMultiEmail(ref argFileName, ref argEmailSubject, argEmailBody, strGroupNo, membyte); funCreateWOWorkReportData_EAIRet = argEmailBody; } catch (Exception ex) { funCreateWOWorkReportData_EAIRet = "fail_Finally;" + ex.Message; } // ----- 執行ERP交易完畢紀錄TransactionLog ----- string argstrException = null; modAutoRunLibrary.addTransactionLog_ErrorCode(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "MES", "WorkReportData_EAI", Environment.MachineName, "AutoRun", arriveTime.ToString("yyyy/MM/dd HH:mm:ss"), "fail", "MONo", "CreateWOWorkReportData", LogClass: "AutoRun", strException: argstrException); } } while (false); return funCreateWOWorkReportData_EAIRet; } #endregion #endregion #region ---共用的Function(2015新加)--- // Private Function UpdERPIntegration(ByRef cnnTemp As OleDb.OleDbConnection, _ // ByRef colSQL As Collection, ByRef colSQL_Rows As Collection, _ // ByRef aryErrorMessage As ArrayList, _ // ByVal EventTime As DateTime, _ // ByVal TableName As String, _ // Optional ByVal Tran_Time As String = defString) As Integer // UpdERPIntegration = -1 'Return -1:fail,0:Success // '參數: // 'EventTime,請傳入執行時間. // 'Tran_Time,若tblERPIntegration已存在,請傳入原始Tran_Time. (時間戳格式, "yyyyMMddHHmmssfff") // Dim drTemp As OleDb.OleDbDataReader // Dim strSQL As String // Try // '1.回填整合資訊 // strSQL = "Select tablename From tblERPIntegration" & _ // " Where Lower(Trim(tablename)) = '" & TableName.ToLower & "'" // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) // drTemp = ExecuteSQLQuery_Reader // If drTemp.Read Then // '----------------------------------------------------------- // '更新tblERPIntegration 回填資料建立時間(時間截). // 'ps.在此不擋時間,時間不符也不能異動. // '----------------------------------------------------------- // strSQL = "Update tblERPIntegration Set " & _ // "tran_time = '" & Format(EventTime, "yyyyMMddHHmmssfff") & "'" & _ // " Where Lower(Trim(tablename)) = '" & TableName.ToLower & "'" & _ // " And Trim(tran_time) = '" & Tran_Time & "'" // colSQL.Add(strSQL) // colSQL_Rows.Add(1) // Else // '----------------------------------------------------------- // '新增tblERPIntegration中介表拋轉資訊. // '----------------------------------------------------------- // strSQL = "Insert Into tblERPIntegration " & _ // "(tablename, tran_time) " & _ // " Values('" & TableName.ToLower & "','" & Format(EventTime, "yyyyMMddHHmmssfff") & "')" // colSQL.Add(strSQL) // colSQL_Rows.Add(1) // End If // drTemp.Close() // cmmTemp.Dispose() // 'Return // UpdERPIntegration = 0 // Catch ex As Exception // aryErrorMessage.Add(ex.Message.ToString) // Throw // Finally // If Not drTemp Is Nothing Then drTemp.Dispose() // End Try // End Function #endregion #region ---OEE報表--- private string funOEESummary(Collection colParameters = null) { string funOEESummaryRet = default(string); var cnnTemp = default(IDbConnection); //var daTemp = new System.Data.OleDb.OleDbDataAdapter(); var dsTemp = new DataSet(); DbDataReader drTemp; var colSQL = new Collection(); var colSQL_Rows = new Collection(); string strSQL; const string strSeparateTime = " 00:00:00"; var datStartTime = defDateTime; var datEndTime = defDateTime; string strReturnMessage = ""; // 執行檔Catch訊息(Job Jog)。Chr(10)分隔每個錯誤訊息。 try { // 1.取出AutoRun設定參數. // Parameter01:彙整資料時間起(如:2016/01/15),未設定則預設為執行日之前一日. // Parameter02:彙整資料時間迄(如:2016/01/18),未設定則預設為執行日之前一日. string strTemp = ""; // Parameter01:時間起 if (colParameters["Parameter01"] == null || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter01"])))) { } else { strTemp = Strings.Trim(Conversions.ToString(colParameters["Parameter01"])).ToUpper(); if (Information.IsDate(strTemp)) { datStartTime = Conversions.ToDate(strTemp); } else { throw new Exception("Parameter01(StartTime) is not valid DateTime data!"); } } // Parameter02:時間訖 if (colParameters["Parameter02"] == null || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter02"])))) { } else { strTemp = Strings.Trim(Conversions.ToString(colParameters["Parameter02"])).ToUpper(); if (Information.IsDate(strTemp)) { datEndTime = Conversions.ToDate(strTemp); } else { throw new Exception("Parameter02(EndTime) is not valid DateTime data!"); } } // //建立Connection cnnTemp = CreateConnection(strConnectionString); if (datStartTime == defDateTime || datEndTime == defDateTime) { // 未傳入開始時間/結束時間,固定取前一天00:00到今天00:00. var datCurrDate = DateTime.Now; datStartTime = Conversions.ToDate(datCurrDate.AddDays(-1).ToString("yyyy/MM/dd") + strSeparateTime); datEndTime = Conversions.ToDate(datCurrDate.ToString("yyyy/MM/dd") + strSeparateTime); } // 2.取出系統參數-一日工時,除外時間 decimal decOEEWorkTime, decOEEExceptTime; // 一日工時(分鐘) strSQL = "Select ParameterValue From tblSYSParameter " + " Where Upper(ParameterNo)='OEEWORKTIME'"; //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (drTemp.Read()) { strTemp = Conversions.ToString(drTemp["ParameterValue"]); } else { throw new Exception("ParameterNo:OEEWorkTime,is not exist in tblSYSParameter,please setup first!"); } drTemp.Close(); //cmmTemp.Dispose(); if (string.IsNullOrEmpty(strTemp.Trim())) { throw new Exception("ParameterNo:OEEWorkTime,Parameter Value is empty!"); } else if (Information.IsNumeric(strTemp)) { decOEEWorkTime = Conversions.ToDecimal(strTemp); if (decOEEWorkTime <= 0m || decOEEWorkTime > 1440m) { throw new Exception("ParameterNo:OEEWorkTime,Parameter Value must between in 1~1440!"); } } else { throw new Exception("ParameterNo:OEEWorkTime,Parameter Value must be Numeric and between in 1~1440!"); } // 除外時間(分鐘) strSQL = "Select ParameterValue From tblSYSParameter " + " Where Upper(ParameterNo)='OEEEXCEPTTIME'"; //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (drTemp.Read()) { strTemp = Conversions.ToString(drTemp["ParameterValue"]); } else { throw new Exception("ParameterNo:OEEExceptTime,is not exist in tblSYSParameter,please setup first!"); } drTemp.Close(); //cmmTemp.Dispose(); if (string.IsNullOrEmpty(strTemp.Trim())) { throw new Exception("ParameterNo:OEEExceptTime,Parameter Value is empty!"); } else if (Information.IsNumeric(strTemp)) { decOEEExceptTime = Conversions.ToDecimal(strTemp); if (decOEEExceptTime < 0m || decOEEExceptTime >= 1440m) { throw new Exception("ParameterNo:OEEExceptTime,Parameter Value must >=0 and < 1440!"); } if (decOEEExceptTime >= decOEEWorkTime) { throw new Exception("ParameterNo:OEEExceptTime can not greater than OEEWorkTime!"); } } else { throw new Exception("ParameterNo:OEEExceptTime,Parameter Value must be Numeric and >=0 and < 1440!"); } // 每日計畫工作時間(分鐘) decimal decOEEDaiyWorkTime; decOEEDaiyWorkTime = decOEEWorkTime - decOEEExceptTime; // 3.取出區域設備對應資料 strSQL = "Select ContainAreaNo,ObjectNo as EquipmentNo " + " From tblSMDAreaRelation " + " Where ObjectType=2 " + " Union " + " Select A.ContainAreaNo,B.EquipmentNo " + " From tblSMDAreaRelation A,tblEQPGroupDetail B " + " Where A.ObjectType=4 " + " And A.ObjectNo=B.EquipmentGroup"; //cmmTemp = new IDbCommand(strSQL, cnnTemp); //daTemp.SelectCommand = cmmTemp; //daTemp.Fill(dsTemp, "tblEQPArea"); //cmmTemp.Dispose(); ExecuteSQLQuery_Adapter(strSQL, dsTemp, "tblEQPArea", cnnTemp); // 4.暫存Table var dtEQPType = new DataTable("tblOEESummary"); dtEQPType.Columns.Add("EquipmentType"); dtEQPType.Columns.Add("EQPSTDOutput", Type.GetType("System.Decimal")); // 一小時之標準產出數 var dtSummary = new DataTable("tblOEESummary"); dtSummary.Columns.Add("BelongDate", Type.GetType("System.DateTime")); dtSummary.Columns.Add("BelongDateStart", Type.GetType("System.DateTime")); dtSummary.Columns.Add("BelongDateEnd", Type.GetType("System.DateTime")); dtSummary.Columns.Add("AreaNo"); dtSummary.Columns.Add("EquipmentType"); dtSummary.Columns.Add("EquipmentNo"); dtSummary.Columns.Add("AvailRate", Type.GetType("System.Decimal")); // 稼動率 dtSummary.Columns.Add("PerforRate", Type.GetType("System.Decimal")); // 產能效率 dtSummary.Columns.Add("Yield", Type.GetType("System.Decimal")); // 良率 dtSummary.Columns.Add("OEE", Type.GetType("System.Decimal")); // 整體設備效率 dtSummary.Columns.Add("EQPAvailableTime", Type.GetType("System.Decimal")); // 稼動時間(分鐘) dtSummary.Columns.Add("EQPOffTime", Type.GetType("System.Decimal")); // 非稼動時間(分鐘) dtSummary.Columns.Add("EQPSTDOutput", Type.GetType("System.Decimal")); // 單位小時之標準產出數 dtSummary.Columns.Add("EQPRealOutput", Type.GetType("System.Decimal")); // 單位小時之實際產出數 dtSummary.Columns.Add("EQPTotalInput", Type.GetType("System.Decimal")); // 總投入數 dtSummary.Columns.Add("EQPTotalOutput", Type.GetType("System.Decimal")); // 總產出數 dtSummary.Columns.Add("CompleteData", Type.GetType("System.Boolean")); // 完整資料,False:否,True:是 var dtSummaryLot = new DataTable("tblOEELot"); dtSummaryLot.Columns.Add("BelongDate", Type.GetType("System.DateTime")); dtSummaryLot.Columns.Add("EquipmentNo"); dtSummaryLot.Columns.Add("LogGroupSerial"); // 取得DBServer時間. var datEventTime = default(DateTime); if (strDataBaseType == "oracle") { strSQL = "Select SysDate as EventTime From Dual"; } else { strSQL = "Select getdate() As EventTime "; } //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (drTemp.Read()) { datEventTime = Conversions.ToDate(Strings.Format(drTemp["EventTime"], "yyyy/MM/dd HH:mm:ss")); } drTemp.Close(); //cmmTemp.Dispose(); // 4.計算稼動 var tmp = dsTemp.Tables; var argdtEQPArea = tmp["tblEQPArea"]; string strSpeparteTimeTmp = strSeparateTime; fuOEEAvailRate(ref strSpeparteTimeTmp, ref cnnTemp, ref dtSummary, ref argdtEQPArea, ref dtEQPType, datStartTime, datEndTime); // 5.計算產能效、良率、OEE // 刪除已彙整資料 foreach (DataRow drBelongDate in dtSummary.DefaultView.ToTable(true, "BelongDate").Rows) { strSQL = "Delete From tblRPTEQPOEESummary " + " Where BelongDate=To_Date('" + Strings.Format(drBelongDate["BelongDate"], "yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')"; colSQL.Add(strSQL); colSQL_Rows.Add(-1); strSQL = "Delete From tblRPTEQPOEELot " + " Where BelongDate=To_Date('" + Strings.Format(drBelongDate["BelongDate"], "yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')"; colSQL.Add(strSQL); colSQL_Rows.Add(-1); } string strSeparateTimeTmp = strSeparateTime; fuOEEPerforRate(ref colSQL, ref colSQL_Rows, ref strSeparateTimeTmp, ref cnnTemp, ref dtSummary, ref dtSummaryLot, decOEEDaiyWorkTime, datEventTime, datStartTime, datEndTime); // 6.回存至DB ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colSQL, colSQL_Rows); } catch (Exception ex) { // 錯誤訊息: 截取錯誤訊息+換行符號 if (!string.IsNullOrEmpty(strReturnMessage)) { strReturnMessage += ControlChars.Cr + ex.Message; } else { strReturnMessage += ex.Message; } } finally { if (cnnTemp != null) CloseConnection(cnnTemp); //if (daTemp != null) // daTemp.Dispose(); if (dsTemp != null) dsTemp.Dispose(); } if (string.IsNullOrEmpty(strReturnMessage)) { // //回傳Success funOEESummaryRet = "success"; } else { // Message長度4000限制 if (strReturnMessage.Length > 3996) strReturnMessage = strReturnMessage.Substring(0, 3996) + "..."; funOEESummaryRet = CombineFailMsg("0000-999999", strReturnMessage); } return funOEESummaryRet; } private string fuOEEAvailRate(ref string strSeparateTime, ref IDbConnection cnnTemp, ref DataTable dtSummary, ref DataTable dtEQPArea, ref DataTable dtEQPType, DateTime datStartTime, DateTime datEndTime) { string fuOEEAvailRateRet = default(string); //var daTemp = new System.Data.OleDb.OleDbDataAdapter(); var dsTemp = new DataSet(); DbDataReader drTemp; string strSQL; try { // 1.Log if (strDataBaseType == "oracle") { strSQL = "Select 1 as DataType,A.EquipmentType,A.EquipmentNo,A.EquipmentState," + " Greatest(A.StartTime,To_Date('" + Strings.Format(Conversions.ToDate(datStartTime), "yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')) StartTime, " + " Least(A.EndTime,To_Date('" + Strings.Format(Conversions.ToDate(datEndTime), "yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')) EndTime, " + " B.StateName,Nvl(B.UtilizationType,1) as UtilizationType " + " From tblEMSEquipmentStateLog A,tblEQPStateBasis B " + " Where A.StartTime < To_Date('" + Strings.Format(Conversions.ToDate(datEndTime), "yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')" + " And A.EndTime >= To_Date('" + Strings.Format(Conversions.ToDate(datStartTime), "yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')" + " And A.EquipmentState=B.EquipmentState "; } else { // 2019/06/14 Edison 修正 strSQL = "Select 1 as DataType, A.EquipmentType,A.EquipmentNo,A.EquipmentState," + " (Case" + " When A.StartTime > '" + Strings.Format(Conversions.ToDate(datStartTime), "yyyy/MM/dd HH:mm:ss") + "' Then A.StartTime" + " Else '" + Strings.Format(Conversions.ToDate(datStartTime), "yyyy/MM/dd HH:mm:ss") + "'" + " End) StartTime," + " (Case" + " When A.EndTime < '" + Strings.Format(Conversions.ToDate(datEndTime), "yyyy/MM/dd HH:mm:ss") + "' Then A.EndTime" + " Else '" + Strings.Format(Conversions.ToDate(datEndTime), "yyyy/MM/dd HH:mm:ss") + "'" + " End) EndTime," + " B.StateName,Nvl(B.UtilizationType,1) as UtilizationType " + " From tblEMSEquipmentStateLog A,tblEQPStateBasis B " + " Where A.StartTime < '" + Strings.Format(Conversions.ToDate(datEndTime), "yyyy/MM/dd HH:mm:ss") + "'" + " And A.EndTime >= '" + Strings.Format(Conversions.ToDate(datStartTime), "yyyy/MM/dd HH:mm:ss") + "'" + " And A.EquipmentState=B.EquipmentState "; } // 2019/06/14 Edison 修正 SQLCommandTuning(strDataBaseType, ref strSQL); //cmmTemp = new IDbCommand(strSQL, cnnTemp); //daTemp.SelectCommand = cmmTemp; //daTemp.Fill(dsTemp, "tblEMSLog_State"); //cmmTemp.Dispose(); ExecuteSQLQuery_Adapter(strSQL, dsTemp, "tblEMSLog_State", cnnTemp); // 2.State if (strDataBaseType == "oracle") { strSQL = "Select 2 as DataType,A.EquipmentType,A.EquipmentNo,A.EquipmentState," + " Greatest(A.StartTime,To_Date('" + Strings.Format(Conversions.ToDate(datStartTime), "yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')) StartTime, " + " Least(SysDate,To_Date('" + Strings.Format(Conversions.ToDate(datEndTime), "yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')) EndTime, " + " B.StateName,Nvl(B.UtilizationType,1) as UtilizationType " + " From tblEMSEquipmentState A,tblEQPStateBasis B " + " Where A.StartTime < To_Date('" + Strings.Format(Conversions.ToDate(datEndTime), "yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')" + " And A.EquipmentState=B.EquipmentState "; } else { // 2019/06/14 Edison 修正 strSQL = "Select 2 as DataType, A.EquipmentType,A.EquipmentNo,A.EquipmentState," + " (Case" + " When A.StartTime > '" + Strings.Format(Conversions.ToDate(datStartTime), "yyyy/MM/dd HH:mm:ss") + "' Then A.StartTime" + " Else '" + Strings.Format(Conversions.ToDate(datStartTime), "yyyy/MM/dd HH:mm:ss") + "'" + " End) StartTime," + " (Case" + " When GetDate() < '" + Strings.Format(Conversions.ToDate(datEndTime), "yyyy/MM/dd HH:mm:ss") + "' Then GetDate() " + " Else '" + Strings.Format(Conversions.ToDate(datEndTime), "yyyy/MM/dd HH:mm:ss") + "'" + " End) EndTime," + " B.StateName,Nvl(B.UtilizationType,1) as UtilizationType " + " From tblEMSEquipmentState A,tblEQPStateBasis B " + " Where A.StartTime < '" + Strings.Format(Conversions.ToDate(datEndTime), "yyyy/MM/dd HH:mm:ss") + "'" + " And A.EquipmentState=B.EquipmentState "; } // 2019/06/14 Edison 修正 SQLCommandTuning(strDataBaseType, ref strSQL); //cmmTemp = new IDbCommand(strSQL, cnnTemp); //daTemp.SelectCommand = cmmTemp; //daTemp.Fill(dsTemp, "tblEMSLog_State"); //cmmTemp.Dispose(); ExecuteSQLQuery_Adapter(strSQL, dsTemp, "tblEMSLog_State", cnnTemp); // 3.依每日+設備編號區分資料 DataRow[] drSel_Summary, drSel_Area, drSel_EQPType; DataRow drAdd; string strTmpAreaNo; DateTime datTmpStart, datTmpEnd; DateTime datTmpBelongDate, datTmpBelongDateEndTime; decimal decTmpEQPSTDOutput; foreach (DataRow drLog in dsTemp.Tables["tblEMSLog_State"].Rows) { // 起始時間 datTmpStart = Conversions.ToDate(drLog["StartTime"]); while (DateAndTime.DateDiff(DateInterval.Second, datTmpStart, Conversions.ToDate(drLog["EndTime"])) > 0L) { // 資料歸屬日 datTmpBelongDate = fuOEEBelongDate(ref strSeparateTime, datTmpStart); // 歸屬日之EndTime datTmpBelongDateEndTime = fuOEEBelongDateEndTime(ref strSeparateTime, datTmpBelongDate); // 本歸屬日此State之EndTime if (DateAndTime.DateDiff(DateInterval.Second, Conversions.ToDate(drLog["EndTime"]), datTmpBelongDateEndTime) > 0L) { // EndTime與datTmpStart同一歸屬日 datTmpEnd = Conversions.ToDate(drLog["EndTime"]); } else { // EndTime與datTmpStart不同歸屬日,本日此State之EndTime計算到datTmpBelongDateEndTime. datTmpEnd = datTmpBelongDateEndTime; } drSel_Summary = dtSummary.Select(Conversions.ToString("BelongDate=#" + Strings.Format(Conversions.ToDate(datTmpBelongDate), "yyyy/MM/dd") + "#" + " And EquipmentNo='" + drLog["EquipmentNo"] + "'")); if (drSel_Summary.Length == 0) { // 取出AreaNo drSel_Area = dtEQPArea.Select(Conversions.ToString("EquipmentNo='" + drLog["EquipmentNo"] + "'")); if (drSel_Area.Length == 0) { strTmpAreaNo = "N/A"; } else { strTmpAreaNo = Conversions.ToString(drSel_Area[0]["ContainAreaNo"]); } // 取出標準產能(Hour) drSel_EQPType = dtEQPType.Select(Conversions.ToString("EquipmentType='" + drLog["EquipmentType"] + "'")); if (drSel_EQPType.Length == 0) { strSQL = Conversions.ToString("Select StdUnitEQPTime,CountEQPUnitQty From tblEQPEquipmentType " + " Where EquipmentType='" + drLog["EquipmentType"] + "'"); //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (drTemp.Read()) { if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["StdUnitEQPTime"], 0, false))) { // 無法計算產能效率 decTmpEQPSTDOutput = 0m; } else { // 一小時之標準產出數 decTmpEQPSTDOutput = Conversions.ToDecimal(Operators.MultiplyObject(Operators.DivideObject(drTemp["CountEQPUnitQty"], drTemp["StdUnitEQPTime"]), 60)); } drAdd = dtEQPType.NewRow(); drAdd["EquipmentType"] = drLog["EquipmentType"]; drAdd["EQPSTDOutput"] = decTmpEQPSTDOutput; dtEQPType.Rows.Add(drAdd); } else { throw new Exception(Conversions.ToString("EquipmentType:" + drLog["EquipmentType"] + ",is not exist in tblEQPEquipmentType!")); } drTemp.Close(); //cmmTemp.Dispose(); } else { decTmpEQPSTDOutput = Conversions.ToDecimal(drSel_EQPType[0]["EQPSTDOutput"]); } drAdd = dtSummary.NewRow(); drAdd["BelongDate"] = Strings.Format(Conversions.ToDate(datTmpBelongDate), "yyyy/MM/dd"); drAdd["BelongDateStart"] = Strings.Format(datTmpBelongDate, "yyyy/MM/dd") + strSeparateTime; drAdd["BelongDateEnd"] = datTmpBelongDateEndTime; drAdd["AreaNo"] = strTmpAreaNo; drAdd["EquipmentType"] = drLog["EquipmentType"]; // EquipmentType單位小時之標準產出數. if (decTmpEQPSTDOutput == 0m) { drAdd["EQPSTDOutput"] = DBNull.Value; } else { drAdd["EQPSTDOutput"] = decTmpEQPSTDOutput; } drAdd["EquipmentNo"] = drLog["EquipmentNo"]; if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drLog["UtilizationType"], 0, false))) // 非稼動 { drAdd["EQPAvailableTime"] = 0; drAdd["EQPOffTime"] = DateAndTime.DateDiff(DateInterval.Second, datTmpStart, datTmpEnd) / 60d; } else // 稼動 { drAdd["EQPAvailableTime"] = DateAndTime.DateDiff(DateInterval.Second, datTmpStart, datTmpEnd) / 60d; drAdd["EQPOffTime"] = 0; } // 是否為完整資料,0:否,1:是. if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drLog["DataType"], 1, false))) // Log { drAdd["CompleteData"] = 1; } else { // State // -可能未生產完成或其他,fuOEEPerforRate若無對應生產中之Lot,再變更回1. drAdd["CompleteData"] = 0; } dtSummary.Rows.Add(drAdd); } else if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drLog["UtilizationType"], 0, false))) // 非稼動 { if (drSel_Summary[0]["EQPOffTime"] is DBNull) { drSel_Summary[0]["EQPOffTime"] = DateAndTime.DateDiff(DateInterval.Second, datTmpStart, datTmpEnd) / 60d; } else { drSel_Summary[0]["EQPOffTime"] = Convert.ToDouble(drSel_Summary[0]["EQPOffTime"]) + (DateAndTime.DateDiff(DateInterval.Second, datTmpStart, datTmpEnd) / 60d); } } else if (drSel_Summary[0]["EQPAvailableTime"] is DBNull) // 稼動 { drSel_Summary[0]["EQPAvailableTime"] = DateAndTime.DateDiff(DateInterval.Second, datTmpStart, datTmpEnd) / 60d; } else { drSel_Summary[0]["EQPAvailableTime"] = Convert.ToDouble(drSel_Summary[0]["EQPAvailableTime"]) + (DateAndTime.DateDiff(DateInterval.Second, datTmpStart, datTmpEnd) / 60d); } // 更新datTmpStart為本歸屬日之EndTime datTmpStart = datTmpBelongDateEndTime; } } fuOEEAvailRateRet = "success"; } catch (Exception e1) { fuOEEAvailRateRet = "fail"; throw; } finally { //if (daTemp != null) // daTemp.Dispose(); if (dsTemp != null) dsTemp.Dispose(); } return fuOEEAvailRateRet; } private string fuOEEPerforRate(ref Collection colSQL, ref Collection colSQL_Rows, ref string strSeparateTime, ref IDbConnection cnnTemp, ref DataTable dtSummary, ref DataTable dtSummaryLot, decimal decOEEDaiyWorkTime, DateTime datEventTime, DateTime datStartTime, DateTime datEndTime) { string fuOEEPerforRateRet = default(string); //var daTemp = new System.Data.OleDb.OleDbDataAdapter(); var dsTemp = new DataSet(); DbDataReader drTemp; string strSQL, strSQL_F, strSQL_V; try { // 1.取出datStartTime~datEndTime完成之歷程資料. // -因B.RESItem為NotNull,故使用B.RESItem做為EquipmentNo. strSQL = "Select A.LogGroupSerial,A.LotNo,Nvl(A.InputQty,B.InputQty) as InputQty,C.OUTPUTQTY as GoodQty," + " B.RESItem as EquipmentNo,C.InputQty as EQPInputQty," + " C.StartTime,C.EndTime " + " From tblWIPLotLog_Report A,tblWIPCont_Resource B,tblWIPCont_Equipment C" + " Where A.Status=1 " + " And A.EndTime >= To_Date('" + Strings.Format(datStartTime, "yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')" + " And A.EndTime < To_Date('" + Strings.Format(datEndTime, "yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')" + " And B.RESClass=1 " + " And A.LogGroupSerial=B.LogGroupSerial " + " And B.LogGroupSerial=C.LogGroupSerial " + " And B.RESItem=C.EquipmentNo "; strSQL = SQLCommandTuning(strDataBaseType, ref strSQL); //cmmTemp = new IDbCommand(strSQL, cnnTemp); //daTemp.SelectCommand = cmmTemp; //daTemp.Fill(dsTemp, "tblLog_Cont"); //cmmTemp.Dispose(); ExecuteSQLQuery_Adapter(strSQL, dsTemp, "tblLog_Cont", cnnTemp); DataRow[] drSel_Summary, drSel_SummaryLot; DataRow drAdd; decimal decEQPInput, decEQPOutput, decEQPRunTime, decStartEndDiff; DateTime datTmpStart, datTmpEnd; DateTime datTmpBelongDate, datTmpBelongDateEndTime; // 各天投入及產出依機時所佔比率計算: // -假設L1的加工時間是:2016/01/13 22:00 ~ 2016/01/14 08:00,總機時10,總產出是500. // --1/13產出數=500*2/10=100 ---> 1/14結算1/13的資料時,不會取得此筆紀錄,會於1/15日結算1/14的資料時才被結算到,系統會將1/13的產能回溯. // --1/14產出數=500*8/10=400 foreach (DataRow drLog in dsTemp.Tables["tblLog_Cont"].Rows) { if (drLog["InputQty"] is DBNull) { throw new Exception(Conversions.ToString("LogGroupSerial:" + drLog["LogGroupSerial"] + ",InputQty is Null(tblWIPLotLog_Report) !")); } if (drLog["GoodQty"] is DBNull) { throw new Exception(Conversions.ToString("LogGroupSerial:" + drLog["LogGroupSerial"] + ",GoodQty is Null(tblWIPLotLog_Report)!")); } if (drLog["StartTime"] is DBNull) { throw new Exception(Conversions.ToString("LogGroupSerial:" + drLog["LogGroupSerial"] + ",EquipmentNo:" + drLog["EquipmentNo"] + ",StartTime is Null(tblWIPCont_Equipment)!")); } if (drLog["EndTime"] is DBNull) { throw new Exception(Conversions.ToString("LogGroupSerial:" + drLog["LogGroupSerial"] + ",EquipmentNo:" + drLog["EquipmentNo"] + ",EndTime is Null(tblWIPCont_Equipment)!")); } // 使用EQPInputQty,因EQPInputQty已考慮多機台共同生產之狀況. decEQPInput = Conversions.ToDecimal(drLog["EQPInputQty"]); // 依投入數所佔比率推算產出. // decEQPOutput = (drLog("GoodQty") * (drLog("EQPInputQty") / drLog("InputQty"))) // 2021/12/22,Ning,Mantis 104580: 【江苏中科】OEE报表(RT416)菜单精度调整 // 中科情境, drLog("EQPInputQty") = 233094, drLog("InputQty")=12, 造成數值失真, 改為不*比率, 以實際產出數為EQPOutput decEQPOutput = Conversions.ToDecimal(drLog["GoodQty"]); // 總機時(分鐘) decEQPRunTime = (decimal)(DateAndTime.DateDiff(DateInterval.Second, Conversions.ToDate(drLog["StartTime"]), Conversions.ToDate(drLog["EndTime"])) / 60d); // 起始時間 datTmpStart = Conversions.ToDate(drLog["StartTime"]); while (DateAndTime.DateDiff(DateInterval.Second, datTmpStart, Conversions.ToDate(drLog["EndTime"])) > 0L) { // 資料歸屬日 datTmpBelongDate = fuOEEBelongDate(ref strSeparateTime, datTmpStart); // 歸屬日之EndTime datTmpBelongDateEndTime = fuOEEBelongDateEndTime(ref strSeparateTime, datTmpBelongDate); // 本歸屬日此State之EndTime if (DateAndTime.DateDiff(DateInterval.Second, Conversions.ToDate(drLog["EndTime"]), datTmpBelongDateEndTime) > 0L) { // EndTime與datTmpStart同一歸屬日 datTmpEnd = Conversions.ToDate(drLog["EndTime"]); } else { // EndTime與datTmpStart不同歸屬日,本日此State之EndTime計算到datTmpBelongDateEndTime. datTmpEnd = datTmpBelongDateEndTime; } // 計算本歸屬日所佔之投入及產出 decStartEndDiff = (decimal)(DateAndTime.DateDiff(DateInterval.Second, datTmpStart, datTmpEnd) / 60d); decEQPInput = decEQPInput * (decStartEndDiff / decEQPRunTime); decEQPOutput = decEQPOutput * (decStartEndDiff / decEQPRunTime); drSel_Summary = dtSummary.Select(Conversions.ToString("BelongDate=#" + Strings.Format(Conversions.ToDate(datTmpBelongDate), "yyyy/MM/dd") + "#" + " And EquipmentNo='" + drLog["EquipmentNo"] + "'")); if (drSel_Summary.Length == 0) { } // 目前執行日前的資料,回溯. // 需考慮回溯資料再次執行時如何刪除,及Summary要如何扣減? else { // EQPTotalInput if (drSel_Summary[0]["EQPTotalInput"] is DBNull) { drSel_Summary[0]["EQPTotalInput"] = decEQPInput; } else { drSel_Summary[0]["EQPTotalInput"] = Convert.ToDecimal(drSel_Summary[0]["EQPTotalInput"]) + decEQPInput; } // EQPTotalOutput if (drSel_Summary[0]["EQPTotalOutput"] is DBNull) { drSel_Summary[0]["EQPTotalOutput"] = decEQPOutput; } else { drSel_Summary[0]["EQPTotalOutput"] = Convert.ToDecimal(drSel_Summary[0]["EQPTotalOutput"]) + decEQPOutput; } // tblRPTEQPOEELot drSel_SummaryLot = dtSummaryLot.Select(Conversions.ToString("BelongDate=#" + Strings.Format(Conversions.ToDate(datTmpBelongDate), "yyyy/MM/dd") + "#" + " And EquipmentNo='" + drLog["EquipmentNo"] + "'" + " And LogGroupSerial='" + drLog["LogGroupSerial"] + "'")); if (drSel_SummaryLot.Length == 0) { strSQL = Conversions.ToString("Insert into tblRPTEQPOEELot " + " (BelongDate,EquipmentNo,LogGroupSerial,LotNo,CollectionDate) " + " Values(To_Date('" + Strings.Format(datTmpBelongDate, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),'" + drLog["EquipmentNo"] + "','" + drLog["LogGroupSerial"] + "','" + drLog["LotNo"] + "'," + " To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'))"); colSQL.Add(strSQL); colSQL_Rows.Add(1); // 先忽略同一站同一設備使用多次的狀況. drAdd = dtSummaryLot.NewRow(); drAdd["BelongDate"] = Strings.Format(Conversions.ToDate(datTmpBelongDate), "yyyy/MM/dd"); drAdd["EquipmentNo"] = drLog["EquipmentNo"]; drAdd["LogGroupSerial"] = drLog["LogGroupSerial"]; dtSummaryLot.Rows.Add(drAdd); } } // 更新datTmpStart為本歸屬日之EndTime datTmpStart = datTmpBelongDateEndTime; } } // 2.彙整 decimal decAvailRate, decPerforRate, decYield; foreach (DataRow drSummary in dtSummary.Rows) { // 若稼動+非稼動<每日計畫工作時間 // -將差額歸至非稼動 // -如:設備2014/5/20 15:00:00購入並開始生產,00:00:00~15:00:00不會有歷程,將該段時間歸入至非稼動. if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(Operators.AddObject(drSummary["EQPAvailableTime"], drSummary["EQPOffTime"]), decOEEDaiyWorkTime, false))) { drSummary["EQPOffTime"] = Convert.ToDecimal(drSummary["EQPOffTime"]) + (decOEEDaiyWorkTime - (decimal)drSummary["EQPAvailableTime"] - (decimal)drSummary["EQPOffTime"]); } // 格式化至小數二位. drSummary["EQPAvailableTime"] = Strings.Format(drSummary["EQPAvailableTime"], "0.##"); drSummary["EQPOffTime"] = Strings.Format(drSummary["EQPOffTime"], "0.##"); // 實際運轉時間/每日計畫工作時間 // -實際運轉時間(分鐘)=每日計畫工作時間(分鐘)-非稼動時間(分鐘). // 2019/12/20,Ning,Mantis 0065736 若 decOEEDaiyWorkTime - drSummary("EQPOffTime")<=0 將decAvailRate設為0 if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLessEqual(Operators.SubtractObject(decOEEDaiyWorkTime, drSummary["EQPOffTime"]), 0, false))) { decAvailRate = 0m; } else { decAvailRate = Conversions.ToDecimal(Operators.DivideObject(Operators.SubtractObject(decOEEDaiyWorkTime, drSummary["EQPOffTime"]), decOEEDaiyWorkTime)); } drSummary["AvailRate"] = Strings.Format(decAvailRate, "0.####"); // 實際產能(個/小時) // -總產出數/(實際運轉時間(分鐘)/60) if (drSummary["EQPTotalOutput"] is DBNull) { // 無法計算以空值呈現. drSummary["EQPRealOutput"] = DBNull.Value; } else { drSummary["EQPTotalOutput"] = Strings.Format(drSummary["EQPTotalOutput"], "0.##"); // 2019/12/20,Ning,Mantis 0065736 若(decOEEDaiyWorkTime - drSummary("EQPOffTime"))<=0 ,將EQPRealOutput設為0 if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLessEqual(Operators.SubtractObject(decOEEDaiyWorkTime, drSummary["EQPOffTime"]), 0, false))) { drSummary["EQPRealOutput"] = 0; } else { drSummary["EQPRealOutput"] = Operators.DivideObject(drSummary["EQPTotalOutput"], Operators.DivideObject(Operators.SubtractObject(decOEEDaiyWorkTime, drSummary["EQPOffTime"]), 60)); } } // 產能效率=實際產能/標準產能 if (drSummary["EQPRealOutput"] is DBNull || drSummary["EQPSTDOutput"] is DBNull) { // 設備類別未設定標準產出,故無法計算產能效率 // 以1表示,OEE各項相乘時才會有值. decPerforRate = 1m; // 無法計算以空值呈現. drSummary["PerforRate"] = DBNull.Value; } else { drSummary["EQPSTDOutput"] = Strings.Format(drSummary["EQPSTDOutput"], "0.##"); decPerforRate = Conversions.ToDecimal(Operators.DivideObject(drSummary["EQPRealOutput"], drSummary["EQPSTDOutput"])); drSummary["PerforRate"] = Strings.Format(decPerforRate, "0.####"); } // 良率=產出/投入 if (drSummary["EQPTotalInput"] is DBNull || drSummary["EQPTotalOutput"] is DBNull) { // 未生產,無良率. // 以1表示,OEE各項相乘時才會有值. decYield = 1m; // 無法計算以空值呈現. drSummary["Yield"] = DBNull.Value; } else { drSummary["EQPTotalInput"] = Strings.Format(drSummary["EQPTotalInput"], "0.##"); // '0107427: 东莞精旺:自动排程 OEE summary 12月16日抛转报尝试除以0,该问题之前已经反馈下修,但是最近还是有报错,请帮忙核查 if (Operators.ConditionalCompareObjectEqual(drSummary["EQPTotalInput"], 0, false)) { decYield = 0m; } else { decYield = Conversions.ToDecimal(Operators.DivideObject(drSummary["EQPTotalOutput"], drSummary["EQPTotalInput"])); drSummary["Yield"] = Strings.Format(decYield, "0.####"); } } // OEE=稼働率×產能效率×良率 drSummary["OEE"] = Strings.Format(decAvailRate * decPerforRate * decYield, "0.####"); // tblRPTEQPOEESummary strSQL_F = "Insert into tblRPTEQPOEESummary " + " (BelongDate,BelongDateStart,BelongDateEnd,CollectionDate, " + " AreaNo,EquipmentType,EquipmentNo," + " AvailRate,OEE,EQPAvailableTime,EQPOffTime "; strSQL_V = Conversions.ToString(" Values(To_Date('" + Strings.Format(drSummary["BelongDate"], "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')," + " To_Date('" + Strings.Format(drSummary["BelongDateStart"], "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')," + " To_Date('" + Strings.Format(drSummary["BelongDateEnd"], "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'),'" + drSummary["AreaNo"] + "','" + drSummary["EquipmentType"] + "','" + drSummary["EquipmentNo"] + "'," + drSummary["AvailRate"] + "," + drSummary["OEE"] + "," + drSummary["EQPAvailableTime"] + "," + drSummary["EQPOffTime"]); if (!(drSummary["PerforRate"] is DBNull)) { strSQL_F += ",PerforRate"; strSQL_V = Conversions.ToString(strSQL_V + "," + drSummary["PerforRate"]); } if (!(drSummary["Yield"] is DBNull)) { strSQL_F += ",Yield"; strSQL_V = Conversions.ToString(strSQL_V + "," + drSummary["Yield"]); } if (!(drSummary["EQPTotalInput"] is DBNull)) { strSQL_F += ",EQPTotalInput"; strSQL_V = Conversions.ToString(strSQL_V + "," + drSummary["EQPTotalInput"]); } if (!(drSummary["EQPTotalOutput"] is DBNull)) { strSQL_F += ",EQPTotalOutput"; strSQL_V = Conversions.ToString(strSQL_V + "," + drSummary["EQPTotalOutput"]); } if (!(drSummary["EQPSTDOutput"] is DBNull)) { strSQL_F += ",EQPSTDOutput"; strSQL_V = Conversions.ToString(strSQL_V + "," + drSummary["EQPSTDOutput"]); } if (!(drSummary["EQPRealOutput"] is DBNull)) { strSQL_F += ",EQPRealOutput"; strSQL_V = Conversions.ToString(strSQL_V + "," + drSummary["EQPRealOutput"]); } // 是否為完整資料,0:否,1:是. if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drSummary["CompleteData"], 1, false))) // Log { strSQL_F += ",CompleteData"; strSQL_V += ",1"; } else { // State // -可能未生產完成或其他狀態,fuOEEPerforRate若無對應生產中之Lot,再變更回1. strSQL = Conversions.ToString("Select LotNo From tblWIPTemp_Equipment " + " Where EquipmentNo='" + drSummary["EquipmentNo"] + "'"); //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (drTemp.Read()) { strSQL_F += ",CompleteData"; strSQL_V += ",0"; } else { strSQL_F += ",CompleteData"; strSQL_V += ",1"; } drTemp.Close(); //cmmTemp.Dispose(); } colSQL.Add(strSQL_F + ")" + strSQL_V + ")"); colSQL_Rows.Add(1); } fuOEEPerforRateRet = "success"; } catch (Exception e1) { fuOEEPerforRateRet = "fail"; throw; } finally { //if (daTemp != null) // daTemp.Dispose(); if (dsTemp != null) dsTemp.Dispose(); } return fuOEEPerforRateRet; } private DateTime fuOEEBelongDate(ref string strSeparateTime, DateTime datEventTime) { DateTime fuOEEBelongDateRet = default(DateTime); // 取得歸屬日 DateTime datBelongDate; try { // 歸屬日的區分時間為strSeparateTime if (DateAndTime.DateDiff(DateInterval.Second, Conversions.ToDate(Strings.Format(datEventTime, "yyyy/MM/dd") + " 00:00:00"), datEventTime) > 0L && DateAndTime.DateDiff(DateInterval.Second, datEventTime, Conversions.ToDate(Strings.Format(datEventTime, "yyyy/MM/dd") + " " + strSeparateTime)) > 0L) { // 已過00:00:00 datBelongDate = Conversions.ToDate(Strings.Format(DateAndTime.DateAdd(DateInterval.Day, -1, datEventTime), "yyyy/MM/dd")); } else { datBelongDate = Conversions.ToDate(Strings.Format(datEventTime, "yyyy/MM/dd")); } // Return fuOEEBelongDateRet = datBelongDate; } catch (Exception e1) { throw; } return fuOEEBelongDateRet; } private DateTime fuOEEBelongDateEndTime(ref string strSeparateTime, DateTime datBelongDate) { DateTime fuOEEBelongDateEndTimeRet = default(DateTime); // 取得歸屬日 DateTime datBelongDateEndTime; try { datBelongDateEndTime = Conversions.ToDate(Strings.Format(DateAndTime.DateAdd(DateInterval.Day, 1d, datBelongDate), "yyyy/MM/dd") + " " + strSeparateTime); // Return fuOEEBelongDateEndTimeRet = datBelongDateEndTime; } catch (Exception e1) { throw; } return fuOEEBelongDateEndTimeRet; } #endregion #region ---ERP to MES 基本資料整合(MES call ERP Webservice)--- private string LoadXmlFileForTest(string ServiceName) { string LoadXmlFileForTestRet = default(string); LoadXmlFileForTestRet = string.Empty; try { string strAppBase = AppDomain.CurrentDomain.BaseDirectory; if (Directory.Exists(strAppBase + "xml")) { var pReasXml = new XmlDocument(); pReasXml.Load(strAppBase + @"xml\" + ServiceName + ".xml"); LoadXmlFileForTestRet = pReasXml.InnerXml; pReasXml = null; } } catch (Exception ex) { } return LoadXmlFileForTestRet; } // ======================================================================================================================== // 程式名稱:funCreateWOWorkReportData_E10ICD // 傳入參數:colParameters // 傳回參數:success(成功), fail(失敗) // 用 途:報工單整合 // 撰寫人員:Elvis // 撰寫日期:2021/03/24 // ======================================================================================================================== // 為做測試所以Function先改為Public,測試完畢必須改回private private object funCreateWOWorkReportData_E10ICD(Collection colParameters = null) { object funCreateWOWorkReportData_E10ICDRet = default(DateTime); string str = ""; string str2 = ""; var cnnTemp = default(IDbConnection); DbDataReader drTemp; string strSQL; var XmlDoc = new XmlDocument(); //System.Data.OleDb.OleDbDataAdapter daTemp; var CollectionSQL = new Collection(); var arriveTime = DateTime.Now; string strSheetType = string.Empty; // 報工單別 string strGroupNo = string.Empty; // 異常處理群組 string strProductionDateFrom = string.Empty; // 生產日期起(如無指定則帶昨天) string strProductionDateEnd = string.Empty; // 生產日期迄(如無指定則帶今天) string strWorkOrderType = ""; // 報工單單別 string auto = "N"; // Request... Y: 建立入庫單後自動確認+過帳, N:建立入庫單後不自動確認過帳 string code = string.Empty; // Response... code:錯誤碼;非0則為錯誤 (function回傳 success 或 fail) string VirtualEQP = ""; // Request... 整合成本中心時,沒有機台編號的人工作業站帶入的ERP虛擬機台編號 string WorkReportNos = ""; string RequestKey = ""; string strShiftNo = ""; var datEventTime = DateTime.Now; // 2020/09/25 Grace 調整報工單拋轉的source_no, 修改編碼為yyMMddHHmmssff-序號, 避免超出20碼(T100欄位僅開20碼) // 2019/12/27,Ning, WorkReportID string strWorkReportID = Strings.Format(datEventTime, "yyMMddHHmmssff"); var colSQL_T3 = new Collection(); var colSQL_T2 = new Collection(); var colSQL_T1 = new Collection(); // 2020/11/17,Ning, 允許tblWIPLotLog_Report.EndTime Is Null, 若GoodQty, FailQty, UnitNo為Null時改取自tblWIPLotLog decimal decLogGoodQty, decLogFailQty; string strLogUnitNo; // 2021/03/25,Elvis,單身回報報工者 string strRepoter; var datNow = DateTime.Now; var dsTemp = new DataSet(); bool blnException = false; do { try { // ParameterXX參數說明 // 01:生產日期[yyyy/MM/dd](如無指定則用昨天) // 02:使用者群組 // 03:報工單單別 // Parameter01為傳入參數,作為ProductionDate,若無此值則用昨天當日期 if (colParameters["Parameter01"] == null || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter01"])))) { strProductionDateFrom = Strings.Format(datNow.AddDays(-1), "yyyy/MM/dd"); strProductionDateEnd = Strings.Format(datNow, "yyyy/MM/dd"); } else { do { try { strProductionDateFrom = Strings.Format(DateTime.Parse(colParameters["Parameter01"].ToString().Trim()), "yyyy/MM/dd"); strProductionDateEnd = Strings.Format(DateTime.Parse(colParameters["Parameter01"].ToString().Trim()).AddDays(1d), "yyyy/MM/dd"); } catch (Exception ex) { funCreateWOWorkReportData_E10ICDRet = "Parse ProductionDate fail(yyyy/MM/dd)!!!(Parameter 01)"; break; } } while (false); } // 2017/10/06 YF, 沒有Group則不發送MAIL // Parameter02為傳入參數,作為GroupNo,若無此值則不進行下面的程式 if (colParameters["Parameter02"] == null || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter02"])))) { strGroupNo = ""; } // funCreateWOWorkReportData_E10ICD = "User GroupNo not found!!!(Parameter 02)" // Exit Try else { strGroupNo = Strings.Trim(Conversions.ToString(colParameters["Parameter02"])); } // Parameter03為傳入參數,作為報工單單別,若無此值及超過四個字則不進行下面的程式 if (colParameters["Parameter03"] == null || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter03"])))) { } // funCreateWOWorkReportData_E10ICD = "Work Order not found!!!(Parameter 03)" // Exit Try else { // strWorkOrderType = Trim(colParameters("Parameter03")) } if (colParameters["Parameter03"].ToString().Length > 4) { // funCreateWOWorkReportData_E10ICD = "Work Order more than four words(Parameter 03)" // Exit Try } cnnTemp = CreateConnection(strConnectionString); str2 += "Z" + Constants.vbCrLf; // 2017/12/27,sammi.MEStoERP生產報工抛轉資料,1:平攤(tblWIPCont_Resource_Share),2:原始(未平攤,tblWIPCont_Resource) string tblCont_Resource = "tblWIPCont_Resource_Share "; bool blnReCalResource = true; strSQL = "Select ParameterValue From tblSYSParameter " + " Where ParameterType='SysInfo' " + " And ParameterNo='ERPWOWORKREPORTDATA' "; //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (drTemp.Read()) { if (drTemp["ParameterValue"].ToString() == "2") { tblCont_Resource = "tblWIPCont_Resource"; blnReCalResource = false; str2 += "tblCont_Resource:" + tblCont_Resource + Constants.vbCrLf; str2 += "ERPWOWORKREPORTDATA " + drTemp["ParameterValue"].ToString() + Constants.vbCrLf; } } drTemp.Close(); //cmmTemp.Dispose(); // 2018/07/19 Lena, 增加系統參數,判定是否需要重匯機時、人時, 0:No、1:Yes. // 當為平攤時, 必須再參考系統參數中是否有設定要重匯機時 if (blnReCalResource) { strSQL = "Select ParameterValue From tblSYSParameter " + " Where ParameterType='SysInfo' " + " And ParameterNo='ERPWOWorkReportReCalResource' "; //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (drTemp.Read()) { str2 += "ERPWOWorkReportReCalResource " + drTemp["ParameterValue"].ToString() + Constants.vbCrLf; if (drTemp["ParameterValue"].ToString() == "0") { blnReCalResource = false; } } drTemp.Close(); //cmmTemp.Dispose(); } if (blnReCalResource) { // 機時,人時 var colParameters_Resource = new Collection(); colParameters_Resource.Add(strProductionDateFrom, "Parameter01"); // funCreateWOWorkReportData_T100,TP,E10ICD,call funShareEQPTime/funShareEMPTime,發Mail通知,統一由主funciton發出. // colParameters_Resource.Add(strGroupNo, "Parameter02") colParameters_Resource.Add("", "Parameter02"); string strResult_EQP; strResult_EQP = Conversions.ToString(funShareEQPTime(colParameters_Resource)); if (strResult_EQP != "success") { funCreateWOWorkReportData_E10ICDRet = "funShareEQPTime:" + strResult_EQP; break; } string strResult_EMP; strResult_EMP = Conversions.ToString(funShareEMPTime(colParameters_Resource)); if (strResult_EMP != "success") { funCreateWOWorkReportData_E10ICDRet = "funShareEMPTime:" + strResult_EMP; break; } } // 彙整暫存表. var dtERP = new DataTable("tblERP"); // ------------------------------------------------------------------------------------------- dtERP.Columns.Add("MONo", Type.GetType("System.String")); // 工單單號 dtERP.Columns.Add("OPGroupNo", Type.GetType("System.String")); // 生產線別 dtERP.Columns.Add("MOTypeNo", Type.GetType("System.String")); // 工單單別 // 20180122 KevinChang 新增欄位製程代號(OPNo)、機台代號(EquipmentNo)、型態(1:正常 2:報廢) dtERP.Columns.Add("EquipmentNo", Type.GetType("System.String")); // 機台代號 dtERP.Columns.Add("OPNo", Type.GetType("System.String")); // 製程代號 dtERP.Columns.Add("Type", Type.GetType("System.String")); // 型態 // ------------------------------------------------------------------------------------------- dtERP.Columns.Add("InputQty", Type.GetType("System.Decimal")); // 移轉數量 dtERP.Columns.Add("EQP", Type.GetType("System.Decimal")); // 機時 (秒) dtERP.Columns.Add("EMP", Type.GetType("System.Decimal")); // 人時 (秒) dtERP.Columns.Add("ProductNo", Type.GetType("System.String")); // 產品品號 dtERP.Columns.Add("ProductName", Type.GetType("System.String")); // 產品品名 dtERP.Columns.Add("SpecNo", Type.GetType("System.String")); // 產品規格 dtERP.Columns.Add("UnitNo", Type.GetType("System.String")); // 單位 // 2021/1/15,Ning,新增LogGroupSerial dtERP.Columns.Add("LogGroupSerial", Type.GetType("System.String")); // LogGroupSerial dtERP.Columns.Add("USERNO", Type.GetType("System.Decimal")); // AS REPORTER 報工者 dtERP.Columns.Add("GOODQTY", Type.GetType("System.Decimal")); // 良品數 dtERP.Columns.Add("FactoryNo", Type.GetType("System.Decimal")); // 工廠 dtERP.Columns.Add("RESItem", Type.GetType("System.Decimal")); // dtERP.Columns.Add("WorkPriceType", System.Type.GetType("System.String")) // dtERP.Columns.Add("WorkPrice", System.Type.GetType("System.Decimal")) dtERP.Columns.Add("ExcUserCount", Type.GetType("System.Decimal")); dtERP.Columns.Add("MOUNITNO", Type.GetType("System.String")); dtERP.Columns.Add("HAVECOMPONENT", Type.GetType("System.String")); // 2021/1/15, Ning, 加上ERPFlag=0的條件 if (strDataBaseType.ToLower() == "oracle") // 增加InputQTY名稱 { strSQL = "Select A.LogGroupSerial,A.OPGroupNo,A.EventTime,B.ResItem as EquipmentNo,A.MOTypeNo,A.MONo,A.OPNo,sum(A.InputQty) InputQty,ROUND(Sum(NVL(B.ResValue,0)*60)) EQP , " + "ROUND((Sum(NVL(A.ResValue,0)*60)) / " + "case when (Select Count(*) From " + tblCont_Resource + " C Where C.LogGroupSerial=A.LogGroupSerial And C.ResClass = 1)= 0 then 1 else (Select Count(*) From " + tblCont_Resource + " C Where C.LogGroupSerial=A.LogGroupSerial And C.ResClass = 1) End " + ") EMP,B.USERNO,C.GOODQTY,D.FactoryNo,B.RESItem,ROUND((SELECT count(userno) FROM " + tblCont_Resource + ")) ExcUserCount,D.MOUNITNO, H.HAVECOMPONENT " + "From ( " + " Select A.EventTime,c.MOTypeNo,A.MONo,A.OPNo,B.GoodQty as InputQty,A.LogGroupSerial,Sum(A.ResValue) ResValue," + " (Case B.OPGroupNo When 'N/A' Then OPGroup.OPGroupNo Else B.OPGroupNo end) OPGroupNo " + " From " + tblCont_Resource + " A " + " Join tblWIPLotLog_Report B on A.LogGroupSerial=B.LogGroupSerial " + " Left Join tblOPGroupDetail OPGroup On B.OPNO=OPGroup.OPNO " + " Join tblOEMOBasis C on A.MONo = C.MONo " + " Where A.ResClass=0 " + " And A.EventTime>= to_date('" + strProductionDateFrom + "','YYYY/MM/DD HH24:MI:SS') " + " And A.EventTime='" + strProductionDateFrom + "'" + " And A.EventTime<'" + strProductionDateEnd + "'" + " And IsNull(A.ERPFlag,0) = 0 " + " And A.LogGroupSerial=B.LogGroupSerial " + " And A.Mono=C.Mono " + " Group By (Case B.OPGroupNo When 'N/A' Then OPGroup.OPGroupNo Else B.OPGroupNo end),EventTime,c.MOTypeNo,A.MONo,A.OPNo,A.LogGroupSerial, B.GoodQty "; strSQL += " ) A "; strSQL += " Left Join " + tblCont_Resource + " B ON A.LogGroupSerial = B.LogGroupSerial And B.ResClass=1 "; strSQL += " Left Join tblWIPLotLog_Report C ON A.LogGroupSerial = C.LogGroupSerial "; strSQL += " Left join tblOEMOBasis D on C.mono = D.mono "; strSQL += " Left Join TBLPRDRUNTIMESETUP g on g.OPNo = b.OPNo "; strSQL += "Left Join tblOEMOPROCESS H on H.MONO = A.MONO"; strSQL += " Group By A.OPGroupNo,A.EventTime,B.ResItem,A.MOTypeNo,A.MONo,A.OPNo,A.LogGroupSerial,C.GOODQTY,B.USERNO,C.GOODQTY,B.RESItem,D.FactoryNo,D.MOUNITNO,H.HAVECOMPONENT"; } // 2017/10/11 KunYuan:多人加工拋wf之移轉數量會變n倍,調整為直接取tblWIPLotLog_Report之GoodQty↑ //cmmTemp = new IDbCommand(strSQL, cnnTemp); //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp); //daTemp.Fill(dsTemp, "costCenter"); //daTemp.Dispose(); //cmmTemp.Dispose(); ExecuteSQLQuery_Adapter(strSQL, dsTemp, "costCenter", cnnTemp); // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnTemp) // daTemp = New OleDb.OleDbDataAdapter(cmmTemp) // daTemp.Fill(dsTemp, "costCenter") // daTemp.Dispose() // cmmTemp.Dispose() // 取得erp資訊 if (!GetERPSetting(ref dtERPSetting, pEAIType: 1)) { funCreateWOWorkReportData_E10ICDRet = "Can not found EAI ERP Setting Info (EAI_TYPE = 1)!"; break; } str2 += "A" + Constants.vbCrLf; str2 += "彙整時間 strProductionDateFrom:" + strProductionDateFrom.ToString() + Constants.vbCrLf; str2 += "彙整時間 strProductionDateEnd:" + strProductionDateEnd.ToString() + Constants.vbCrLf; str2 += "資料筆數:" + dsTemp.Tables["costCenter"].Rows.Count.ToString() + Constants.vbCrLf; str2 += "SQL:" + strSQL.ToString() + Constants.vbCrLf; if (dsTemp.Tables["costCenter"].Rows.Count > 0) { int iCount = 0; // 一筆資料一張xml拋erp bool exitTry = false; foreach (DataRow dr in dsTemp.Tables["costCenter"].Rows) { iCount += 1; // test // If dr("MONo").ToString.StartsWith("C") = False Then Continue For CollectionSQL.Clear(); var objMaster = new iMESCIO.SCI.ERP.Request_E10ICD.SCI_Request_wo_work_report_data_create(); var objDetail = new List(); var objD = new iMESCIO.SCI.ERP.Request_E10ICD.SCI_detail_wo_work_report(); str2 += "B: 單頭" + Constants.vbCrLf; // ==========單頭 // 報工單號 objMaster.doc_type_no = strSheetType; // 單據日期 objMaster.create_date = Strings.Format(datEventTime, "yyyyMMddHHmmss"); // 工作站 objMaster.workstation_no = dr["OPGROUPNO"].ToString(); // 工廠 objMaster.factory_no = dr["FactoryNo"].ToString(); // ' // 班別 objMaster.shift_no = strShiftNo; // 2020/09/25 Grace 調整報工單拋轉的source_no, 修改編碼為yyMMddHHmmssff-序號, 避免超出20碼(T100欄位僅開20碼) // 2020/05/22 Grace Mantis 72259 MES產生報工單號後,將單號後面加上"-" & 流水碼回給ERP(source_no),避免ERP收到的單號重複,也避免異動到取消報工的架構 // MES單據 '2020/02/14 Grace 新增傳遞source_no, source_no不可為空, T100會報錯 objMaster.source_no = strWorkReportID + "-" + iCount.ToString(); // 備註(沒有) str2 += "C: 單身" + Constants.vbCrLf; // ==========單身 // 2020/11/17,Ning,當tblWIPLotLog_Report.GoodQty為Null時, 去tblWIPLotLog取 decLogGoodQty = 0m; decLogFailQty = 0m; strRepoter = dr["USERNO"].ToString(); strLogUnitNo = "N/A"; if (string.IsNullOrEmpty(dr["GOODQTY"].ToString()) || string.IsNullOrEmpty(dr["MOUNITNO"].ToString())) { strSQL = "Select GOODQTY,Nvl(ScrapQty,0) As ScrapQty,Nvl(UnitNo,'N/A') As UnitNo " + " From tblWIPLotLog Where LogGroupSerial = '" + dr["LogGroupSerial"].ToString() + "'" + " And GOODQTY is not Null " + " Order by LotSerial Desc"; strSQL = SQLCommandTuning(strDataBaseType, ref strSQL); //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (drTemp.Read()) { decLogGoodQty = Conversions.ToDecimal(drTemp["GoodQty"]); decLogFailQty = Conversions.ToDecimal(drTemp["ScrapQty"]); strLogUnitNo = Conversions.ToString(drTemp["UnitNo"]); } drTemp.Close(); //cmmTemp.Dispose(); } if (dr["HAVECOMPONENT"].ToString() == "1") { strSQL = "Select OUT_GOODQTY,Nvl(UnitNo,'N/A') As UnitNo " + " From tblWipCont_Component Where LogGroupSerial = '" + dr["LogGroupSerial"].ToString() + "'" + " And OUT_GOODQTY is not Null " + " Order by LotSerial Desc"; strSQL = SQLCommandTuning(strDataBaseType, ref strSQL); //cmmTemp = new IDbCommand(strSQL, cnnTemp); //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp); var dsTemp1 = new DataSet(); //daTemp.Fill(dsTemp1, "plus"); ExecuteSQLQuery_Adapter(strSQL, dsTemp1, "plus", cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (drTemp.Read()) { int qty = 0; foreach (DataRow dr1 in dsTemp1.Tables["plus"].Rows) qty = qty + Convert.ToInt32(drTemp["OUT_GOODQTY"]); decLogGoodQty = qty; strLogUnitNo = Conversions.ToString(drTemp["UnitNo"]); } //daTemp.Dispose(); drTemp.Close(); //cmmTemp.Dispose(); } // 序號 objD.seq = 1.ToString(); // 工單單號 objD.wo_no = dr["MONo"].ToString(); // 報廢數量 // 2017-02-08, Joe, 取消報廢數 // objD.scrap_qty = dr("FailQty") // 良品數量 if (string.IsNullOrEmpty(dr["GOODQTY"].ToString())) { objD.qty = decLogGoodQty.ToString(); } else { objD.qty = dr["GOODQTY"].ToString(); } // 人時 objD.labor_hours = dr["EMP"].ToString(); // objD.labor_hours = dr("RESVALUE").ToString // 機時 objD.machine_hours = dr["EQP"].ToString(); // objD.machine_hours = dr("RESVALUE").ToString // 實際加工機台 objD.machine_no = dr["ResItem"].ToString(); // ' // 製程順序(沒有) // 作業編號 objD.op_no = dr["OPNo"].ToString(); // 單位 20180427 0046049 KevinChang,ERP回覆單位須傳入大寫 if (string.IsNullOrEmpty(dr["MOUNITNO"].ToString())) { objD.unit_no = strLogUnitNo.ToUpper(); } else { objD.unit_no = dr["MOUNITNO"].ToString().ToUpper(); } // 報工人員 2021/03/25 Elvis objD.reporter = dr["USERNO"].ToString(); // 報工時間(迄) // 2017-05-23, Joe, 此欄位改為string只傳HH:mm // 2020/11/17,Ning, 報工日期應EventTime // objD.report_datetime_e = Format(dr("EndTime"), "HH:mm") objD.report_datetime_e = Strings.Format(dr["EventTime"], "HH:mm"); // 作業人數 objD.number_of_operators = Conversions.ToString(dr["ExcUserCount"]); // 完成日期 // 2017-05-23, Joe, 此欄傳yyyyMMdd,2017-07-04 KevinChang ERP討論結果此欄傳yyyyMMddHHmmss // 2020/11/17,Ning, 報工日期應EventTime // objD.complete_date = Format(dr("EndTime"), "yyyyMMddHHmmss") objD.complete_date = Strings.Format(dr["EventTime"], "yyyyMMddHHmmss"); // 備註(沒有) // 2017-05-03, Joe, Add 計價類型、計件單價、每小時工資 // objD.return_type = dr("WorkPriceType").ToString // If dr("WorkPriceType").ToString = "" Then objD.return_type = 1 objD.return_type = "1"; // 2021/4/26 Steven Mantis: 0091759 WorkPriceType與WorkPrice兩個欄位預計從60513版中下架 objD.price = 0.ToString(); // 單價(price), 預先填 0  ===== 0091619: [605][CP+FT] E10ICD整合問題_報工拋轉調整 objD.wages = 0.ToString(); // If objD.return_type = "1" Then 'return_type = "1" 計件 // If Not IsDBNull(dr("WorkPrice")) Then objD.price = dr("WorkPrice") // ElseIf objD.return_type = "2" Then 'return_type = "2" 計時 // If Not IsDBNull(dr("WorkPrice")) Then objD.wages = dr("WorkPrice") // End If objDetail.Add(objD); objMaster.report_detail = objDetail; object argSCI_Object = objMaster; InXml = CombineRequestXMLbyCDO(ref argSCI_Object, dtERPSetting.Rows[0]["ERP_Name"].ToString(), "", "wo.work.report.data.create", pRequestKey: RequestKey); objMaster = (iMESCIO.SCI.ERP.Request_E10ICD.SCI_Request_wo_work_report_data_create)argSCI_Object; str2 += "D: ERP資料" + Constants.vbCrLf; str2 += "ERP_URL:" + ERP_URL + Constants.vbCrLf; str2 += "InXml:" + InXml + Constants.vbCrLf; // ----- Call ERP Web Service ----- using (var ws = new iMESCore.Base.Invoke.wsERP_EAI.IntegrationEntry()) { ws.Url = ERP_URL; OutXml = ws.invokeSrv(InXml); } // ---------------Joe,測試用--------------------- // Dim strFile As String = "C:\Users\Joe\Desktop\Project\RD\ERP整合\xml\response.wo.work.report.data.create.xml" // XmlDoc.Load(strFile) // OutXml = XmlDoc.InnerXml // ---------------Joe,測試用--------------------- // 將ERP拋回的資料轉成物件 var objReponse = new iMESCIO.SCI.ERP.Response_E10ICD.SCI_Response_wo_work_report_data_create(); // Dim ERPResult As String = "fail" code = "fail"; blnException = false; do { try { str2 += "OutXml:" + OutXml + Constants.vbCrLf; objReponse.ParseXmlToObject(OutXml); } catch (Exception ex) { funCreateWOWorkReportData_E10ICDRet = "Response XML Format Error!"; // 紀錄TransactionLog() string argstrException2 = null; blnException = true; modAutoRunLibrary.addTransactionLog_ErrorCode(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "MES", "WorkReportData_E10ICD", Environment.MachineName, "AutoRun", datEventTime.ToString("yyyy/MM/dd HH:mm:ss"), code, dr["MONo"].ToString() + "," + dr["OPGroupNo"].ToString(), "CreateWOWorkReportData", ErrorCode: "0000-999999", LogClass: "E10ICD", strException: argstrException2); break; } } while (false); // 紀錄TransactionLog() string argstrException = null; str2 += "objReponse.code :" + objReponse.code + Constants.vbCrLf; // 檢核ERP回傳結果 if (objReponse.code == "0") { code = "success"; } if (blnException == false) //Exception時已記錄TransactionLog { modAutoRunLibrary.addTransactionLog(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "MES", "WorkReportData_E10ICD", Environment.MachineName, "AutoRun", datEventTime.ToString("yyyy/MM/dd HH:mm:ss"), code, dr["MONo"].ToString() + "," + dr["OPGroupNo"].ToString(), "CreateWOWorkReportData", strException: argstrException); } // =====tblERPWorkRPT_EQPSummary // strSQL = "Insert Into tblERPWorkRPT_EQPSummary (WorkReportID, EquipmentNo, EQP_ResValue, EMP_ResValue, ERPFlag, ERPNo)" & // " Values('" & strWorkReportID & "','" & dr("EquipmentNo").ToString & "'," & dr("EQP") & "," & dr("EMP") & ",1,'" & objReponse.report_no & "')" // colSQL_T3.Add(strSQL) // ===== else { if (objReponse.description == null) { funCreateWOWorkReportData_E10ICDRet = OutXml; } else { funCreateWOWorkReportData_E10ICDRet = objReponse.description; } exitTry = true; break; } // 紀錄TransactionLog() // addTransactionLog(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "MES", "WorkReportData_EAI", My.Computer.Name, // "AutoRun", datEventTime.ToString("yyyy/MM/dd HH:mm:ss"), code, dr("MONo").ToString, "CreateWOWorkReportData") str2 += "E : 開始組SQL" + Constants.vbCrLf; // ----- 將UNDO鎖住 ----- strSQL = " Update tblWIPReverseHistory Set CommitState=1, CommitDesc='AutoRun CreateWOWorkReportData_E10ICD' " + " Where LotSerial In (Select LotSerial From tblWIPLotLog_Report Where LogGroupSerial = '" + dr["LogGroupSerial"].ToString() + "' )"; CollectionSQL.Add(strSQL); str2 += "F : testffff " + Constants.vbCrLf; str2 += "" + strSQL + Constants.vbCrLf; // ----- 執行ERP交易完畢紀錄TransactionLog ----- //string argstrException1 = null; //modAutoRunLibrary.addTransactionLog(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "MES", "WorkReportData_E10ICD", Environment.MachineName, "AutoRun", arriveTime.ToString("yyyy/MM/dd HH:mm:ss"), code, objReponse.report_no, "CreateWOWorkReportData", strException: argstrException1); // ----- 將報工單號回填LotLog_Report ----- strSQL = " Update tblWIPLotLog_Report Set ERPNo='" + objReponse.report_no + "' Where LogGroupSerial = '" + dr["LogGroupSerial"].ToString() + "' "; CollectionSQL.Add(strSQL); str2 += "G :" + Constants.vbCrLf; str2 += "" + strSQL + Constants.vbCrLf; RequestKey = funGetRequestKey(ref argSCI_Object, dtERPSetting.Rows[0]["ERP_Name"].ToString(), "", "wo.work.report.data.create", pRequestKey: RequestKey); // ----- 將報工單據回寫MES----- strSQL = "insert into tblSYSERPDocumentLog (TransID ,MESNo ,ERPNo ,DocumentType,CreateDate) " + " Values ('" + RequestKey + "','" + dr["LogGroupSerial"].ToString() + "','" + objReponse.report_no + "',3" + ", To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'))"; CollectionSQL.Add(strSQL); str2 += "H :" + Constants.vbCrLf; str2 += "" + strSQL + Constants.vbCrLf; foreach (string s in CollectionSQL) str2 += s + ";" + Constants.vbCrLf; // ----- 執行SQL ----- ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, CollectionSQL); // 2019/12/27, Ning, 紀錄報工單拋轉明細資料(T3_E10ICD) // 2020/02/14 Grace 增加ERPNo欄位, 紀錄ERP回傳的報工單號, 避免執行重拋後報工單畫面查詢明細時對應到多筆資料 bool blnShare = true; strSQL = Conversions.ToString("Insert Into tblERPWorkRPT_Detail_E10ICD (WorkReportID, OPGROUPNO, EquipmentNo, MONo, EQP_ResValue, EMP_ResValue, GoodQty, ERPNo)" + " Values ('" + strWorkReportID + "','" + dr["OPGROUPNO"].ToString() + "','" + dr["EquipmentNo"].ToString() + "','" + dr["MONo"].ToString() + "'," + dr["EQP"] + "," + dr["EMP"] + "," + dr["GoodQty"] + ", '" + objReponse.report_no + "')"); colSQL_T3.Add(strSQL); str2 += "I :" + Constants.vbCrLf; str2 += "" + strSQL + Constants.vbCrLf; // '平攤的計算方式才需要回填tblWIPCont_Equipment與tblWIPCont_Employee_MultiUser if (blnShare) { strSQL = "Update tblWIPCont_Equipment Set ERPFlag = 1, WorkReportID = '" + strWorkReportID + "' Where LogGroupSerial = '" + dr["LogGroupSerial"].ToString() + "'"; colSQL_T3.Add(strSQL); str2 += "J :" + Constants.vbCrLf; str2 += "" + strSQL + Constants.vbCrLf; strSQL = "Update tblWIPCont_Employee_MultiUser Set ERPFlag = 1, WorkReportID = '" + strWorkReportID + "' Where LogGroupSerial = '" + dr["LogGroupSerial"].ToString() + "'"; colSQL_T3.Add(strSQL); str2 += "K :" + Constants.vbCrLf; str2 += "" + strSQL + Constants.vbCrLf; } // ----- 將所有單號保留,後續寄mail會用到 ----- WorkReportNos += objReponse.report_no + ","; objMaster = null; objDetail = null; objD = null; } if (exitTry) { break; } } dsTemp.Dispose(); // tblCont_Resource壓上ERPFlag與WorkReportID strSQL = "Update " + tblCont_Resource + " Set ERPFlag = 1, WorkReportID = '" + strWorkReportID + "'" + " Where EventTime >= To_Date('" + strProductionDateFrom + "','YYYY/MM/DD') AND EventTime < To_Date('" + strProductionDateEnd + "','YYYY/MM/DD') "; SQLCommandTuning(strDataBaseType, ref strSQL); colSQL_T3.Add(strSQL); // 報工單拋轉彙整資料表(T1) strSQL = "Insert Into tblERPWorkRPT_Summary (WorkReportID, DataStartTime, DataEndTime, ERPFlag)" + " Values('" + strWorkReportID + "', To_Date('" + strProductionDateFrom + "','YYYY/MM/DD'), To_Date('" + strProductionDateEnd + "','YYYY/MM/DD'), 1)"; SQLCommandTuning(strDataBaseType, ref strSQL); colSQL_T3.Add(strSQL); foreach (string s in colSQL_T3) str += s + ";" + Constants.vbCrLf; // ----- 執行SQL ----- ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, colSQL_T3); // //Return success funCreateWOWorkReportData_E10ICDRet = "success;" + WorkReportNos + ";"; results = "success"; } catch (Exception ex) { funCreateWOWorkReportData_E10ICDRet = CombineFailMsg("0000-999999", ex.Message); results = "fail"; // ----- 執行ERP交易完畢紀錄TransactionLog ----- //string argstrException = null; //modAutoRunLibrary.addTransactionLog(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "MES", "WorkReportData_E10ICD", Environment.MachineName, "AutoRun", arriveTime.ToString("yyyy/MM/dd HH:mm:ss"), results, "MONo", "CreateWOWorkReportData", strException: argstrException); // 2013/02/05, Hank, Send Email colParameters.Add(funCreateWOWorkReportData_E10ICDRet, "EmailBody"); SendJobFailEmail(colParameters); } finally { try { CloseConnection(cnnTemp); // 寄送Mail string argFileName = "N/A"; string argEmailSubject = "WO Work Report Data [" + strProductionDateFrom + "]"; string argEmailBody = Conversions.ToString(funCreateWOWorkReportData_E10ICDRet); modAutoRunLibrary.SendMultiEmail(ref argFileName, ref argEmailSubject, argEmailBody, strGroupNo); funCreateWOWorkReportData_E10ICDRet = argEmailBody; } catch (Exception ex) { funCreateWOWorkReportData_E10ICDRet = "fail_Finally;" + ex.Message; } // if (!Directory.Exists(AppDomain.CurrentDomain.BaseDirectory + @"\Log")) { Directory.CreateDirectory(AppDomain.CurrentDomain.BaseDirectory + @"\Log"); } var fs = new FileStream(AppDomain.CurrentDomain.BaseDirectory + @"\Log\AutoRunWS_Log_" + Strings.Format(DateTime.Now, "yyyyMMdd") + "_SQL_A.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite); var w = new StreamWriter(fs); w.BaseStream.Seek(0L, SeekOrigin.End); w.WriteLine(Strings.Format(DateTime.Now, "yyyy/MM/dd HH:mm:ss") + " " + str2); w.Close(); fs.Close(); if (!Directory.Exists(AppDomain.CurrentDomain.BaseDirectory + @"\Log")) { Directory.CreateDirectory(AppDomain.CurrentDomain.BaseDirectory + @"\Log"); } var fs2 = new FileStream(AppDomain.CurrentDomain.BaseDirectory + @"\Log\AutoRunWS_Log_" + Strings.Format(DateTime.Now, "yyyyMMdd") + "_SQL_B.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite); var w2 = new StreamWriter(fs2); w2.BaseStream.Seek(0L, SeekOrigin.End); w2.WriteLine(Strings.Format(DateTime.Now, "yyyy/MM/dd HH:mm:ss") + " " + str); w2.Close(); fs2.Close(); //// ===manties:0095454 AutoRun addTransactionLog位置錯誤 需移至Finally 2021/07/06 //// 執行ERP交易完畢寫入Log //string argstrException = null; //modAutoRunLibrary.addTransactionLog(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "MES", "WorkReportData_E10ICD", Environment.MachineName, "AutoRun", arriveTime.ToString("yyyy/MM/dd HH:mm:ss"), results, "MONo", "CreateWOWorkReportData", strException: argstrException); } } // === while (false); return funCreateWOWorkReportData_E10ICDRet; } // ======================================================================================================================== // 程式名稱:funCreateWOWorkReportData_WF // 傳入參數:colParameters // 傳回參數:success(成功), fail(失敗) // 用 途:報工單整合 // 撰寫人員:KevinChang // 撰寫日期:2017/01/06 // ======================================================================================================================== // 為做測試所以Function先改為Public,測試完畢必須改回private private object funCreateWOWorkReportData_WF(Collection colParameters = null) { object funCreateWOWorkReportData_WFRet = default(object); var cnnTemp = default(IDbConnection); //var daTemp = new System.Data.OleDb.OleDbDataAdapter(); var dsTemp = new DataSet(); DbDataReader drTemp; var colSQL = new Collection(); string strSQL; var datArriveTime = DateTime.Now; string strProductionDateFrom = string.Empty; // 生產日期起(如無指定則帶昨天) string strProductionDateEnd = string.Empty; // 生產日期迄(如無指定則帶今天) string strGroupNo = ""; // 使用者群組 string strWorkOrderType = ""; // 報工單單別 // 2021/03/30 Elvis 0087678: [瑞賢] AUTORUN報工--報工失敗,發送郵件新增提供失敗清單 //var ExcelExp = new Infragistics.Win.UltraWinGrid.ExcelExport.UltraGridExcelExporter(); //var workbook = new Infragistics.Documents.Excel.Workbook(); var strMONo = default(string); string strSQL_Field, strSQL_Value; var datNow = DateTime.Now; do { try { // ParameterXX參數說明 // 01:生產日期[yyyy/MM/dd](如無指定則用昨天) // 02:使用者群組 // 03:報工單單別 // Parameter01為傳入參數,作為ProductionDate,若無此值則用昨天當日期 if (colParameters["Parameter01"] == null || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter01"])))) { strProductionDateFrom = Strings.Format(datNow.AddDays(-1), "yyyy/MM/dd"); strProductionDateEnd = Strings.Format(datNow, "yyyy/MM/dd"); } else { do { try { strProductionDateFrom = Strings.Format(DateTime.Parse(colParameters["Parameter01"].ToString().Trim()), "yyyy/MM/dd"); strProductionDateEnd = Strings.Format(DateTime.Parse(colParameters["Parameter01"].ToString().Trim()).AddDays(1d), "yyyy/MM/dd"); } catch (Exception ex) { funCreateWOWorkReportData_WFRet = "Parse ProductionDate fail(yyyy/MM/dd)!!!(Parameter 01)"; break; } } while (false); } // 2017/10/06 YF, 沒有Group則不發送MAIL // Parameter02為傳入參數,作為GroupNo,若無此值則不進行下面的程式 if (colParameters["Parameter02"] == null || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter02"])))) { strGroupNo = ""; } // funCreateWOWorkReportData_WF = "User GroupNo not found!!!(Parameter 02)" // Exit Try else { strGroupNo = Strings.Trim(Conversions.ToString(colParameters["Parameter02"])); } // Parameter03為傳入參數,作為報工單單別,若無此值及超過四個字則不進行下面的程式 if (colParameters["Parameter03"] == null || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter03"])))) { funCreateWOWorkReportData_WFRet = "Work Order not found!!!(Parameter 03)"; break; } else { strWorkOrderType = Strings.Trim(Conversions.ToString(colParameters["Parameter03"])); } if (colParameters["Parameter03"].ToString().Length > 4) { funCreateWOWorkReportData_WFRet = "Work Order more than four words(Parameter 03)"; break; } cnnTemp = CreateConnection(strConnectionString); // 2017/12/27,sammi.MEStoERP生產報工抛轉資料,1:平攤(tblWIPCont_Resource_Share),2:原始(未平攤,tblWIPCont_Resource) string tblCont_Resource = "tblWIPCont_Resource_Share "; bool blnReCalResource = true; strSQL = "Select ParameterValue From tblSYSParameter " + " Where ParameterType='SysInfo' " + " And ParameterNo='ERPWOWORKREPORTDATA' "; //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (drTemp.Read()) { if (drTemp["ParameterValue"].ToString() == "2") { tblCont_Resource = "tblWIPCont_Resource"; blnReCalResource = false; } } drTemp.Close(); //cmmTemp.Dispose(); // 2018/07/19 Lena, 增加系統參數,判定是否需要重匯機時、人時, 0:No、1:Yes. // 當為平攤時, 必須再參考系統參數中是否有設定要重匯機時 if (blnReCalResource) { strSQL = "Select ParameterValue From tblSYSParameter " + " Where ParameterType='SysInfo' " + " And ParameterNo='ERPWOWorkReportReCalResource' "; //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (drTemp.Read()) { if (drTemp["ParameterValue"].ToString() == "0") { blnReCalResource = false; } } drTemp.Close(); //cmmTemp.Dispose(); } if (blnReCalResource) { // 機時,人時 var colParameters_Resource = new Collection(); colParameters_Resource.Add(strProductionDateFrom, "Parameter01"); // funCreateWOWorkReportData_T100,TP,WF,call funShareEQPTime/funShareEMPTime,發Mail通知,統一由主funciton發出. // colParameters_Resource.Add(strGroupNo, "Parameter02") colParameters_Resource.Add("", "Parameter02"); string strResult_EQP; strResult_EQP = Conversions.ToString(funShareEQPTime(colParameters_Resource)); if (strResult_EQP != "success") { funCreateWOWorkReportData_WFRet = "funShareEQPTime:" + strResult_EQP; break; } string strResult_EMP; strResult_EMP = Conversions.ToString(funShareEMPTime(colParameters_Resource)); if (strResult_EMP != "success") { funCreateWOWorkReportData_WFRet = "funShareEMPTime:" + strResult_EMP; break; } } // 彙整暫存表. var dtERP = new DataTable("tblERP"); // ------------------------------------------------------------------------------------------- dtERP.Columns.Add("MONo", Type.GetType("System.String")); // 工單單號 dtERP.Columns.Add("OPGroupNo", Type.GetType("System.String")); // 生產線別 dtERP.Columns.Add("MOTypeNo", Type.GetType("System.String")); // 工單單別 // 20180122 KevinChang 新增欄位製程代號(OPNo)、機台代號(EquipmentNo)、型態(1:正常 2:報廢) dtERP.Columns.Add("EquipmentNo", Type.GetType("System.String")); // 機台代號 dtERP.Columns.Add("OPNo", Type.GetType("System.String")); // 製程代號 dtERP.Columns.Add("Type", Type.GetType("System.String")); // 型態 // ------------------------------------------------------------------------------------------- dtERP.Columns.Add("InputQty", Type.GetType("System.Decimal")); // 移轉數量 dtERP.Columns.Add("EQP", Type.GetType("System.Decimal")); // 機時 (Minutes) dtERP.Columns.Add("EMP", Type.GetType("System.Decimal")); // 人時 (Minutes) dtERP.Columns.Add("ProductNo", Type.GetType("System.String")); // 產品品號 dtERP.Columns.Add("ProductName", Type.GetType("System.String")); // 產品品名 dtERP.Columns.Add("SpecNo", Type.GetType("System.String")); // 產品規格 dtERP.Columns.Add("UnitNo", Type.GetType("System.String")); // 單位 // 2021/1/15,Ning,新增LogGroupSerial dtERP.Columns.Add("LogGroupSerial", Type.GetType("System.String")); // LogGroupSerial // 2017/10/11 KunYuan:多人加工拋wf之移轉數量會變n倍,調整為直接取tblWIPLotLog_Report之GoodQty↓ // If strDataBaseType.ToLower = "oracle" Then '增加InputQTY名稱 // strSQL = "Select A.LogGroupSerial,A.OPGroupNo,A.EventTime,B.ResItem as EquipmentNo,A.MOTypeNo,A.MONo,A.OPNo,sum(A.InputQty) InputQty,Sum(NVL(B.ResValue,0)) EQP , " & // "(Sum(NVL(A.ResValue,0)) / " & // "case when (Select Count(*) From tblWIPCont_Resource C Where C.LogGroupSerial=A.LogGroupSerial And C.ResClass = 1)= 0 then 1 else (Select Count(*) From tblWIPCont_Resource C Where C.LogGroupSerial=A.LogGroupSerial And C.ResClass = 1) End " & // ") EMP " & // "From ( " & // " Select to_char(EventTime,'yyyy/mm/dd') as EventTime,c.MOTypeNo,A.MONo,A.OPNo,Sum(A.InputQty) as InputQty,A.LogGroupSerial,Sum(A.ResValue) ResValue,B.OPGroupNo " & // " From tblWIPCont_Resource A " & // " Join tblWIPLotLog_Report B on A.LogGroupSerial=B.LogGroupSerial " & // " Join tblOEMOBasis C on A.MONo = C.MONo " & // " Where A.ResClass=0 " & // " And A.EventTime>= to_date('" & strProductionDateFrom & "','YYYY/MM/DD HH24:MI:SS') " & // " And A.EventTime='" & strProductionDateFrom & "'" & // " And A.EventTime<'" & strProductionDateEnd & "'" & // " And A.LogGroupSerial=B.LogGroupSerial " & // " And A.Mono=C.Mono " & // " Group By B.OPGroupNo,Convert(varchar(10),EventTime,112),c.MOTypeNo,A.MONo,A.OPNo,A.LogGroupSerial " // strSQL += " ) A " // strSQL += " Left Join tblWIPCont_Resource B ON A.LogGroupSerial = B.LogGroupSerial And B.ResClass=1 " // strSQL += " Group By A.OPGroupNo,A.EventTime,B.ResItem,A.MOTypeNo,A.MONo,A.OPNo,A.LogGroupSerial " // End If // 2021/1/15, Ning, 加上ERPFlag=0的條件 if (strDataBaseType.ToLower() == "oracle") // 增加InputQTY名稱 { strSQL = "Select A.LogGroupSerial,A.OPGroupNo,A.EventTime,B.ResItem as EquipmentNo,A.MOTypeNo,A.MONo,A.OPNo,sum(A.InputQty) InputQty,Sum(NVL(B.ResValue,0)) EQP , " + "(Sum(NVL(A.ResValue,0)) / " + "case when (Select Count(*) From " + tblCont_Resource + " C Where C.LogGroupSerial=A.LogGroupSerial And C.ResClass = 1)= 0 then 1 else (Select Count(*) From " + tblCont_Resource + " C Where C.LogGroupSerial=A.LogGroupSerial And C.ResClass = 1) End " + ") EMP " + "From ( " + " Select to_char(EventTime,'yyyy/mm/dd') as EventTime,c.MOTypeNo,A.MONo,A.OPNo,B.GoodQty as InputQty,A.LogGroupSerial,Sum(A.ResValue) ResValue," + " (Case B.OPGroupNo When 'N/A' Then OPGroup.OPGroupNo Else B.OPGroupNo end) OPGroupNo " + " From " + tblCont_Resource + " A " + " Join tblWIPLotLog_Report B on A.LogGroupSerial=B.LogGroupSerial " + " Left Join tblOPGroupDetail OPGroup On B.OPNO=OPGroup.OPNO " + " Join tblOEMOBasis C on A.MONo = C.MONo " + " Where A.ResClass=0 " + " And A.EventTime>= to_date('" + strProductionDateFrom + "','YYYY/MM/DD HH24:MI:SS') " + " And A.EventTime='" + strProductionDateFrom + "'" + " And A.EventTime<'" + strProductionDateEnd + "'" + " And IsNull(A.ERPFlag,0) = 0 " + " And A.LogGroupSerial=B.LogGroupSerial " + " And A.Mono=C.Mono " + " Group By (Case B.OPGroupNo When 'N/A' Then OPGroup.OPGroupNo Else B.OPGroupNo end),EventTime,c.MOTypeNo,A.MONo,A.OPNo,A.LogGroupSerial, B.GoodQty "; strSQL += " ) A "; strSQL += " Left Join " + tblCont_Resource + " B ON A.LogGroupSerial = B.LogGroupSerial And B.ResClass=1 "; strSQL += " Group By A.OPGroupNo,A.EventTime,B.ResItem,A.MOTypeNo,A.MONo,A.OPNo,A.LogGroupSerial "; } // 2017/10/11 KunYuan:多人加工拋wf之移轉數量會變n倍,調整為直接取tblWIPLotLog_Report之GoodQty↑ //cmmTemp = new IDbCommand(strSQL, cnnTemp); //daTemp.SelectCommand = cmmTemp; //daTemp.Fill(dsTemp, "tblResource"); //daTemp.Dispose(); //cmmTemp.Dispose(); ExecuteSQLQuery_Adapter(strSQL, dsTemp, "tblResource", cnnTemp); DataRow drAdd; decimal decEQP, decEMP, decInputQty; string strProductNo, strProductName, strSpecNo, strUnitNo; bool exitTry = false; foreach (DataRow drResource in dsTemp.Tables["tblResource"].Rows) { strMONo = drResource["MONO"].ToString(); if (drResource["InputQty"] is DBNull) { decInputQty = 0m; } else { decInputQty = Conversions.ToDecimal(drResource["InputQty"]); } // 取得工單對應之產品資料 strSQL = "Select A.ProductNo, B.PRODUCTVERSION, B.PRODUCTNAME, B.SPECNO, B.UNITNO, C.PROPERTYNO, C.DEFAULTVALUE ,B.ERPNo From tblOEMOBasis A" + " LEFT JOIN tblPRDproductBasis B ON A.PRODUCTNO = B.PRODUCTNO" + " LEFT JOIN tblPRDProductproperty C ON A.PRODUCTNO = C.PRODUCTNO and A.PRODUCTVERSION = C.PRODUCTVERSION and C.PROPERTYNO='" + strERPUnitNo + "'" + " Where MONo='" + drResource["MONo"].ToString() + "'"; //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (drTemp.Read()) { if (string.IsNullOrEmpty(drTemp["ERPNo"].ToString())) { strProductNo = drTemp["ProductNo"].ToString(); } else { strProductNo = drTemp["ERPNo"].ToString(); } strProductName = drTemp["ProductName"].ToString(); strSpecNo = drTemp["SpecNo"].ToString(); // 以ERPUnitNo去搜尋單位,若找不到就用產品主檔設定的單位 if (string.IsNullOrEmpty(drTemp["DefaultValue"].ToString())) { strUnitNo = drTemp["UnitNo"].ToString(); } else { strUnitNo = drTemp["DefaultValue"].ToString(); } } else { funCreateWOWorkReportData_WFRet = " Warning!!! MONo:" + drResource["MONo"].ToString() + " at tblOEMOBasis,not exist!!!"; exitTry = true; break; } drTemp.Close(); //cmmTemp.Dispose(); // 2019/11/22 Grace Mantis 62203, 因WF ERP拋轉的製程性質可能有託外, 報工時須將託外資料排除 strSQL = "Select OPNO From TBLOPBASIS Where OSOption = '1' And OPNo = '" + drResource["OPNo"].ToString() + "'"; //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (!drTemp.Read()) { // 將撈出來的資料塞進DataTable drAdd = dtERP.NewRow(); if (string.IsNullOrEmpty(drResource["OPGroupNo"].ToString())) { drAdd["OPGroupNo"] = "N/A"; } else { drAdd["OPGroupNo"] = drResource["OPGroupNo"].ToString(); } drAdd["MOTypeNo"] = drResource["MOTypeNo"].ToString(); drAdd["MONo"] = drResource["MONo"].ToString(); drAdd["InputQty"] = decInputQty; drAdd["EMP"] = drResource["EMP"]; drAdd["EQP"] = drResource["EQP"]; drAdd["ProductNo"] = strProductNo; drAdd["ProductName"] = strProductName; drAdd["SpecNo"] = strSpecNo; drAdd["UnitNo"] = strUnitNo; // 20180122 KevinChang 新增欄位製程代號(OPNo)、機台代號(EquipmentNo)、型態(1:正常 2:報廢) drAdd["OPNo"] = drResource["OPNo"].ToString(); drAdd["EquipmentNo"] = drResource["EquipmentNo"].ToString(); drAdd["Type"] = "1"; // 2021/1/15,Ning, 新增LogGroupSerial drAdd["LogGroupSerial"] = drResource["LogGroupSerial"]; dtERP.Rows.Add(drAdd); strProductNo = ""; strProductName = ""; strSpecNo = ""; strUnitNo = ""; } drTemp.Close(); //cmmTemp.Dispose(); } if (exitTry) { break; } if (dtERP.Rows.Count > 0) { // 以OPGroupNo作Sorting,一個Group傳送一份XML string strResult = default(string); string strCode = default(string); string strSysMsg = default(string); string strMesMsg = default(string); string strStack = default(string); string strERPNo = default(string); bool exitTry1 = false; foreach (DataRow drERPHead in dtERP.DefaultView.ToTable(true, "OPGroupNo").Rows) { var colSQL_Log = new Collection(); int intItemNo = 1; datNow = DateTime.Now; string strTDRecordList = ""; string strTDTempField = ""; string strTERecordList = ""; string strTETempField = ""; // SFCTD下要組的資訊 strTDTempField = cbXMLField_WF("TD001", strWorkOrderType); // 報工單別 strTDTempField += cbXMLField_WF("TD003", strProductionDateFrom.Replace("/", "")); // 生產當日,YYYYMMDD strTDTempField += cbXMLField_WF("TD004", drERPHead["OPGroupNo"].ToString()); // MES作業站群組(生產線別) strTDRecordList = cbXMLRecordList_WF(strTDTempField); // 20180122 調整為依照工單+生產線別+機台+製程代號+型態去匯整 // For Each drERPBody As DataRow In dtERP.Select("MONo='" & drERPHead("MONo").ToString & "' And OPGroupNo='" & drERPHead("OPGroupNo").ToString & "' and OPNo='" & drERPHead("OPNo").ToString & "' // And EquipmentNo='" & drERPHead("EquipmentNo").ToString & "' and OPNo='" & drERPHead("OPNo").ToString & "' and Type='" & drERPHead("Type").ToString & "'") foreach (DataRow drERPBody in dtERP.Select("OPGroupNo='" + drERPHead["OPGroupNo"].ToString() + "'")) { // 2017-04-26, Joe, 工單單別傳(-)前,單號傳(-)後 string[] aryMO = drERPBody["MONo"].ToString().Split('-'); // 2017/10/24 KunYuan:加判若非合法工單格式則不拋轉 if (aryMO.Length < 2) continue; // SFCTE下要組的資訊 // 20180122 KevinChang 新增傳回機台代號(TE005)、製程代號(TE009)、型態(TE010) string ProductNameTmp = drERPBody["ProductName"].ToString(); string SpecNoTmp = drERPBody["SpecNo"].ToString(); strTETempField = cbXMLField_WF("TE005", drERPBody["EquipmentNo"].ToString()); // 機台代號 strTETempField += cbXMLField_WF("TE006", aryMO[0]); // 工單單別 strTETempField += cbXMLField_WF("TE007", aryMO[1]); // 工單單號 strTETempField += cbXMLField_WF("TE009", drERPBody["OPNo"].ToString()); // 製程代號 strTETempField += cbXMLField_WF("TE010", drERPBody["Type"].ToString()); // 型態(1:正常 2:報廢) strTETempField += cbXMLField_WF("TE011", Conversions.ToString(drERPBody["InputQty"])); // 移轉數量 strTETempField += cbXMLField_WF("TE012", Conversions.ToString(Operators.MultiplyObject(drERPBody["EMP"], 60))); // 使用人時,單位(秒) strTETempField += cbXMLField_WF("TE013", Conversions.ToString(Operators.MultiplyObject(drERPBody["EQP"], 60))); // 使用機時,單位(秒) strTETempField += cbXMLField_WF("TE017", drERPBody["ProductNo"].ToString()); // 產品品號 strTETempField += cbXMLField_WF("TE018", modWIN.CInputWithXMLStandard(ref ProductNameTmp)); // 產品品名 20170605 Add By KevinChang 加入Cinput轉換特殊字原 strTETempField += cbXMLField_WF("TE019", modWIN.CInputWithXMLStandard(ref SpecNoTmp)); // 產品規格 20170605 Add By KevinChang 加入Cinput轉換特殊字原 strTETempField += cbXMLField_WF("TE020", drERPBody["UnitNo"].ToString()); // 單位 strTERecordList += cbXMLRecordList_WF(strTETempField); // 2017/12/29,sammi.紀錄抛轉資料. // tblERPWorkReportDetail_WF strSQL_Field = "Insert into tblERPWorkReportDetail_WF " + " (SequenceNo, ItemNo, TE006, TE007, TE011, TE012, TE013, TE017, TE018, TE019, TE020 "; strSQL_Value = Conversions.ToString(" Values ('" + Strings.Format(datNow, "yyyyMMddHHmmssffffff") + "'," + intItemNo + ",'" + aryMO[0] + "','" + aryMO[1] + "'," + drERPBody["InputQty"] + "," + Operators.MultiplyObject(drERPBody["EMP"], 60) + "," + Operators.MultiplyObject(drERPBody["EQP"], 60) + ",'" + drERPBody["ProductNo"].ToString() + "','" + ChkSingleQuation(drERPBody["ProductName"].ToString()) + "','" + ChkSingleQuation(drERPBody["SpecNo"].ToString()) + "','" + drERPBody["UnitNo"].ToString() + "'"); strSQL = strSQL_Field + ")" + strSQL_Value + ")"; colSQL_Log.Add(strSQL); // 2021/1/15,Ning,更新ERPFlag strSQL = Conversions.ToString("Update " + tblCont_Resource + " Set ERPFlag = 1 Where LogGroupSerial = '" + drERPBody["LogGroupSerial"] + "'"); colSQL_Log.Add(strSQL); // 平攤的計算方式才需要回填tblWIPCont_Equipment與tblWIPCont_Employee_MultiUser if (tblCont_Resource == "tblWIPCont_Resource_Share ") { strSQL = Conversions.ToString("Update tblWIPCont_Equipment Set ERPFlag = 1 Where LogGroupSerial = '" + drERPBody["LogGroupSerial"] + "'"); colSQL_Log.Add(strSQL); strSQL = Conversions.ToString("Update tblWIPCont_Employee_MultiUser Set ERPFlag = 1 Where LogGroupSerial = '" + drERPBody["LogGroupSerial"] + "'"); colSQL_Log.Add(strSQL); } // 鎖住Undo strSQL = Conversions.ToString(" Update tblWIPReverseHistory Set CommitState=1, CommitDesc='AutoRun CreateWOWorkReportData_WF' Where LotSerial In " + " (Select LotSerial From tblWIPLotLog Where LogGroupSerial = '" + drERPBody["LogGroupSerial"] + "')"); colSQL_Log.Add(strSQL); intItemNo += 1; } // ---- InXml ----- string strAccess = ""; string strParameter = ""; // cbXMLAccess_WF // - // - strAccess = cbXMLAccess_WF(); // cbXMLParameter_WF // 7 // 1 string strReferenceCase = "1"; // 1.重複不做 2.重複覆蓋 3.補資料 string strReferenceType = "7"; // MES整合匯入WF(DoAction=7) strParameter = cbXMLParameter_WF(strReferenceType, strReferenceCase); // ERP端的TABLE NAME(SFCTD) string strFormHead = ""; strFormHead = cbXMLFormHead_WF("SFCTD", strTDRecordList); // ERP端的TABLE NAME(SFCTE) string strFormBody = ""; strFormBody = cbXMLFormBody_WF("SFCTE", strTERecordList); InXml = cbXMLRequest_WF(strAccess, strParameter, cbXMLData_WF(strFormHead, strFormBody)); // 取得WorkFlow的ERP設定值 // funGetERPSetting("Workflow") 2019/05/15 Edison Marked 已於cbXMLAccess_WF取得,不需重複取得 var XmlDoc = new XmlDocument(); using (var ws = new wsERP_WorkFlow.WFMESService()) { ws.Url = gERPWSURL; OutXml = ws.XMLAdapter(InXml); } // ----- 取得ERP執行結果----- XmlDoc.LoadXml(OutXml); chkResponseGetException_WF(XmlDoc, ref strResult, ref strCode, ref strSysMsg, ref strMesMsg, ref strStack); // 2021/1/27,Ning,86220: [萬達光電] AUTORUN報工需回寫WF報工單號 // ----- 取得ERP入庫單號 ----- chkResponseContent_WF(XmlDoc, ref strERPNo); string argstrException = null; modAutoRunLibrary.addTransactionLog(InXml, OutXml, datArriveTime.ToString("yyyyMMddHHmmssss"), "AutoRun", "funCreateWOWorkReportData_WF", Environment.MachineName, modWIN.gUserNo, datArriveTime.ToString("yyyy/MM/dd HH:mm:ss"), strResult, "ERP", "CreateWOWorkReportData", strException: argstrException); if (strResult.ToLower() == "fail") { funCreateWOWorkReportData_WFRet = "fail;ERP Return Message:" + strCode + "," + strSysMsg + "," + strMesMsg; exitTry1 = true; break; } else { // 2017/12/29,sammi.紀錄抛轉資料. // tblERPWorkReport_WF strSQL_Field = "Insert into tblERPWorkReport_WF " + " (SequenceNo,TD001,TD003,TD004,ERPNo,CreateDate,StartDate,EndDate "; strSQL_Value = " Values ('" + Strings.Format(datNow, "yyyyMMddHHmmssffffff") + "','" + strWorkOrderType + "','" + strProductionDateFrom.Replace("/", "") + "','" + drERPHead["OPGroupNo"].ToString() + "'," + "'" + strERPNo + "', To_Date('" + Strings.Format(datNow, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') ," + " To_Date('" + Strings.Format(Conversions.ToDate(strProductionDateFrom), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')," + " To_Date('" + Strings.Format(Conversions.ToDate(strProductionDateEnd), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; strSQL = strSQL_Field + ")" + strSQL_Value + ")"; colSQL_Log.Add(strSQL); // 以一次抛轉為單位,直接先寫入. ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, colSQL_Log); } } if (exitTry1) { break; } } // //Return success funCreateWOWorkReportData_WFRet = "success"; } catch (Exception ex) { funCreateWOWorkReportData_WFRet = CombineFailMsg("0000-999999", ex.Message); try { string argstrException = null; modAutoRunLibrary.addTransactionLog_ErrorCode(InXml, OutXml, datArriveTime.ToString("yyyyMMddHHmmssss"), "AutoRun", "funCreateWOWorkReportData_WF", Environment.MachineName, modWIN.gUserNo, datArriveTime.ToString("yyyy/MM/dd HH:mm:ss"), "fail", "ERP", "XMLAdapter", ErrorCode: "0000-999999", LogClass: "AutoRun", strException: argstrException); } catch (Exception ex2) { } } finally { string argstrException = null; modAutoRunLibrary.addTransactionLog(InXml, OutXml, datArriveTime.ToString("yyyyMMddHHmmssss"), "AutoRun", "funCreateWOWorkReportData_WF", Environment.MachineName, modWIN.gUserNo, datArriveTime.ToString("yyyy/MM/dd HH:mm:ss"), "fail", "ERP", "XMLAdapter", strException: argstrException); //if (daTemp != null) // daTemp.Dispose(); if (dsTemp != null) dsTemp.Dispose(); try { CloseConnection(cnnTemp); // =================================2021/03/30 Elvis 0087678: [瑞賢] AUTORUN報工--報工失敗,發送郵件新增提供失敗清單 STAR var dsResult = new DataTable("dsResult"); // 拋轉日期、報工日期、工單編號、失敗原因 // strProductionDateFrom 報工日期CreateConnection // drResource("MONo").ToString 工單編號 // funCreateWOWorkReportData_WF 失敗原因CreateConnection dsResult.Columns.Add("WOWorkDate", Type.GetType("System.String")); // 拋轉日期 dsResult.Columns.Add("ProductionDate", Type.GetType("System.String")); // 報工日期 dsResult.Columns.Add("MONo", Type.GetType("System.String")); // 工單單號 dsResult.Columns.Add("FailReason", Type.GetType("System.String")); // 失敗原因 string strFillType = "XLS"; dsResult.Rows.Add(strProductionDateEnd, strProductionDateFrom, strMONo, funCreateWOWorkReportData_WFRet); //var iugTemp = new iMESUltraGrid.iMESUltraGridControl(); //iugTemp.iMESUltraGrid_InitializeLayOut += iMESUltraGrid_InitializeLayOut; // Dim iugTemp As New iMESUltraGrid.iMESUltraGridControl // AddHandler iugTemp.iMESUltraGrid_InitializeLayOut, AddressOf iMESUltraGrid_InitializeLayOut //iugTemp.Identity = "iMES"; //iugTemp.UserNo = "iMES"; //var memStream = new MemoryStream(); //讓最後一列style生效,新增空列 DataRow drEnd = dsResult.NewRow(); dsResult.Rows.Add(drEnd); var dtResult = new DataSet(); dtResult.Tables.Add(dsResult); //iugTemp.iMESUltraGrid.DataSource = dtResult.Tables[0]; // 0133391: [跨平台]AutoRunLib移除iMESUltraGrid的使用, 2023/4/21 String ExcelMode = strFillType.ToString().ToUpper(); //"XLSX" , "XLS" byte[] membyte = modAutoRunLibrary.funExcelToByte(dtResult, ExcelMode, strLanguageMode, strResourceDir); //var memStream = new MemoryStream(membyte); //memStream.Seek(0L, SeekOrigin.Begin); //// 將欄位翻譯 //if (!string.IsNullOrEmpty(modWIN.gLanguageMode)) //{ // var ColSaveControl = new Collection(); // ColSaveControl.Add(iugTemp.iMESUltraGrid); // //ChgTranslateName(ColSaveControl, modWIN.gLanguageMode); //} //foreach (DataRow drResource in dsResult.Rows) //{ // switch (strFillType.ToString().ToUpper() ?? "") // { // // Case "XLSX" // // '匯出Excel再轉Stream // // workbook = ExcelExp.Export(iugTemp.iMESUltraGrid, Infragistics.Documents.Excel.WorkbookFormat.Excel2007) // // workbook.Save(memStream) // // memStream.Seek(0, SeekOrigin.Begin) // case "XLS": // { // // 匯出Excel再轉Stream // workbook = ExcelExp.Export(iugTemp.iMESUltraGrid); // iugTemp.iMESUltraGrid, Infragistics.Documents.Excel.WorkbookFormat.Excel97To2003 // workbook.Save(memStream); // memStream.Seek(0L, SeekOrigin.Begin); // break; // } // } //} // Stream轉成附件檔 //var AttachFile = new byte[(int)(memStream.Length - 1L + 1)]; //double count = 0d; //while (count < memStream.Length) //{ // AttachFile[(int)Math.Round(count)] = Convert.ToByte(memStream.ReadByte()); // count += 1d; //} try { dtResult.Dispose(); } catch (Exception ex) { } // =================================2021/03/30 Elvis 0087678: [瑞賢] AUTORUN報工--報工失敗,發送郵件新增提供失敗清單 END // 寄送Mail if (!string.IsNullOrEmpty(strGroupNo)) { string argFileName = "ErrorList.xls"; string argEmailSubject = "WO Work Report Data [" + strProductionDateFrom + "]"; string argEmailBody = Conversions.ToString(funCreateWOWorkReportData_WFRet); modAutoRunLibrary.SendMultiEmail(ref argFileName, ref argEmailSubject, argEmailBody, strGroupNo, membyte); funCreateWOWorkReportData_WFRet = argEmailBody; } } catch (Exception ex) { funCreateWOWorkReportData_WFRet = CombineFailMsg("0000-999999", ex.Message); } } } while (false); return funCreateWOWorkReportData_WFRet; } // ======================================================================================================================== // 程式名稱:funMESCallERPPRDMTLBasis // 傳入參數:colParameters // 傳回參數:success(成功), fail(失敗) // 用 途:整合服務-產品、物料主檔 // 撰寫人員:05876 崑源 // 撰寫日期:2017/02/08 // ======================================================================================================================== private object funMESCallERPPRDMTLBasis(Collection colParameters = null) { object funMESCallERPPRDMTLBasisRet = default(object); var XmlDoc = new XmlDocument(); var CollectionSQL = new Collection(); // =========================================================== // 宣告 AutoRunJob設定及執行記錄 變數 // =========================================================== string strParameter01 = ""; // 參數一,預設此功能fail通知EMAIL群組。 string strPageSize = "500"; // 參數二,分包筆數 string strDate; // 參數三,手動重收時填上時間,如沒填則以log tableERP拋回的最後執行時間為主 string strSubject, strBody; // 寄送通知資訊 string strServiceName = "item.get"; // AutorunJob拋轉資訊 string strReturnMessage = ""; // 錯誤訊息(tblMESAutoRunLog.ReturnMessage),Chr(10)分隔錯誤項目。 var aryReturnMessage = new ArrayList(); // Catch Error Message (Exception及MES判定錯誤訊息)。 var colResponseXML = new Collection(); do { try { // Parameter01為參數一 // 作為Mail通知群組(GroupNo),放在最前面防止連線失敗無法寄送通知。 if (!(colParameters["Parameter01"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter01"])))) { strParameter01 = colParameters["Parameter01"].ToString().Trim(); } else { aryReturnMessage.Add(TranslateMsg("Mail GroupNo [%NOT SET%]([%PARAMETER01%])!", strLanguageMode, strResourceDir)); // ===== 2021/05/18 Elvis 92880 break; } // 分包筆數必須為數值型態,Add by KevinChang if (Information.IsNumeric(colParameters["Parameter02"])) { if (!(colParameters["Parameter02"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter02"])))) { // 每封包筆數不可小於500筆,Add by KevinChang if (Conversions.ToInteger(colParameters["Parameter02"]) < 500) { strPageSize = "500"; } else { strPageSize = colParameters["Parameter02"].ToString().Trim(); } } } if (!(colParameters["Parameter03"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter03"])))) { strDate = GetDate(Conversions.ToString(colParameters["Parameter03"]), "Parameter03"); } else { // 20170316 edit liyujn strDate = GetERPTransactionDate(strServiceName); } // 取得erp資訊 if (!GetERPSetting(ref dtERPSetting, pEAIType: 1)) { aryReturnMessage.Add(TranslateMsg("[%PleaseCheck%] EAI ERP Setting Info [%CONFIGSETTING%]!", strLanguageMode, strResourceDir)); break; } var objResponse = new iMESCIO.SCI.ERP.Response.SCI_Response_item_get(); XmlNode xmlNodeCnt; string strCnt; string strTTcnt; bool chkStatus = true; // 抓取其它status為0之資料且塞入colResponseXML GetReTransData(strServiceName, ref colResponseXML); // 判斷『當前回傳筆數』=『應回傳筆數』時才代表為最後一次請求,執行後才進行後續動作 var objMaster = new iMESCIO.SCI.ERP.Request.SCI_Request_item_get(); objMaster.data_time = strDate; objMaster.key_condition = ""; objMaster.page_size = strPageSize; object argSCI_Object = objMaster; string argpRequestKey = "Null"; InXml = CombineRequestXMLbyCDO(ref argSCI_Object, dtERPSetting.Rows[0]["ERP_Name"].ToString(), "", strServiceName, pRequestKey: argpRequestKey); objMaster = (iMESCIO.SCI.ERP.Request.SCI_Request_item_get)argSCI_Object; int intloopTimes = 0; do { // 迴圈執行超過5次直接跳出迴圈並回傳錯誤訊息,Add by KevinChang if (intloopTimes >= 5) { throw new Exception("[%THE NUMBER OF SUBCONTRACTS IS SET TOO LITTLE TO CAUSE THE LOOP TO EXECUTE MORE THAN FIVE TIMES%]"); break; } // 先確認是否有測試檔案,有的話就讀取出xml OutXml = string.Empty; OutXml = LoadXmlFileForTest(strServiceName); try { if (string.IsNullOrEmpty(OutXml)) { // ----- Call ERP Web Service ----- using (var ws = new iMESCore.Base.Invoke.wsERP_EAI.IntegrationEntry()) { ws.Url = ERP_URL; OutXml = ws.invokeSrv(InXml); } // 2017-05-03, Joe, 轉換單引號 OutXml = OutXml.Replace("'", "''"); } } catch (Exception ex) { OutXml = ex.Message; throw ex; } finally { // 需等到取得所有資料後,再處理後面之動作,故統一將請求完之ResponseXML放入容器內 colResponseXML.Add(OutXml); } XmlDoc.LoadXml(OutXml); // 執行ERP交易完畢寫入Log string argstrException = null; modAutoRunLibrary.addTransactionLog(InXml, OutXml, DateTime.Now.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPProductBasis", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), "success", "ERP", strServiceName, strException: argstrException); // 將ERP拋回的資料轉成物件 objResponse.ParseXmlToObject(OutXml); if (objResponse.srvcode == null == false && objResponse.srvcode.Equals("000") && objResponse.code == null == false && objResponse.code.Equals("0")) { objMaster = new iMESCIO.SCI.ERP.Request.SCI_Request_item_get(); objMaster.data_time = objResponse.data_time; // 第二次後請求需為回傳之最後拋轉時間 objMaster.key_condition = Strings.Replace(objResponse.key_condition, "''", "'"); // 第二次後待入從ERP收到之keyCondition objMaster.page_size = strPageSize; object argSCI_Object1 = objMaster; string argpRequestKey1 = "Null"; InXml = CombineRequestXMLbyCDO(ref argSCI_Object1, dtERPSetting.Rows[0]["ERP_Name"].ToString(), "", strServiceName, pRequestKey: argpRequestKey1); objMaster = (iMESCIO.SCI.ERP.Request.SCI_Request_item_get)argSCI_Object1; xmlNodeCnt = XmlDoc.SelectSingleNode("/response/payload/param/data_response/datainfo/parameter/data"); strCnt = xmlNodeCnt.Attributes.GetNamedItem("cnt").Value; strTTcnt = xmlNodeCnt.Attributes.GetNamedItem("tt_cnt").Value; } else { chkStatus = false; aryReturnMessage.Add(OutXml); // 2017-06-26, Joe, 如是中台層的錯誤要往外拋 break; } intloopTimes += 1; } while ((strCnt ?? "") != (strTTcnt ?? "")); // 寫入log table TreatWriteLogTable(colResponseXML, strServiceName); // 寫入MES DB if (chkStatus) { foreach (string strOutXML in colResponseXML) { objResponse.ParseXmlToObject(strOutXML); if (WriteProductOrMaterailBasis(objResponse, ref aryReturnMessage) < 0) { if (aryReturnMessage.Count == 0) // 避免不明原因,執行FAIL又沒收集到項目. { aryReturnMessage.Add(TranslateMsg("item_get, [%INVOKE FAIL%]!", strLanguageMode, strResourceDir)); } } } } } catch (Exception EX_AUT) { aryReturnMessage.Add("EX_AUT.Exception" + '\n' + EX_AUT.Message.ToString()); OutXml = EX_AUT.Message.ToString(); results = "fail"; // 執行ERP交易完畢寫入Log string argstrException = null; modAutoRunLibrary.addTransactionLog_ErrorCode(InXml, OutXml, DateTime.Now.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPProductBasis", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), results, "ERP", strServiceName, LogClass: "AutoRun", strException: argstrException); } finally { // -------------------------------------------------- // 回傳執行結果:succces 或 fail(ReturnMessage) // -------------------------------------------------- if (aryReturnMessage.Count == 0) { funMESCallERPPRDMTLBasisRet = "success"; results = "success"; } else { // 組合執行錯誤字串: Chr(10)分隔 strReturnMessage = ArrayList2String(ref aryReturnMessage); if ((strReturnMessage ?? "") == defString) { // 當錯誤字串組合失敗。補上 strReturnMessage = "ReturnMessage收集失敗!!"; } // tblMESAutoRunLog.ReturnMessage 長度4000限制. string strTemp = ""; if (strReturnMessage.Length > 4000) { // 自 strReturnMessage 中截取0-3991碼. strTemp = strReturnMessage.Substring(0, 3991) + "..."; } else { strTemp = strReturnMessage; } // 更新log table異常資訊 // Dim nodeID As XmlNode = XmlDoc.SelectSingleNode("/response/reqid") // UpdateLogTableErrorInfo(nodeID.InnerText, strTemp) UpdateLogTableErrorInfo(colResponseXML, strServiceName, strTemp); // //fail; funMESCallERPPRDMTLBasisRet = CombineFailMsg("0000-999999", strTemp); } // ===manties:0095454 AutoRun addTransactionLog位置錯誤 需移至Finally 2021/07/06 // 執行ERP交易完畢寫入Log string argstrException = null; modAutoRunLibrary.addTransactionLog(InXml, OutXml, DateTime.Now.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPProductBasis", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), results, "ERP", strServiceName, strException: argstrException); } } // === while (false); // -------------------------------------------------- // 當執行失敗,寄送 Email。必須有設定參數一。 // -------------------------------------------------- IDbConnection argcnnTemp = null; try { if (aryReturnMessage.Count > 0 && Conversions.ToBoolean(Operators.ConditionalCompareObjectNotEqual(colParameters["Parameter01"], "", false))) { strSubject = "[AUT]料件-基本資料抛轉失敗! "; strBody = Strings.Replace(strReturnMessage, Conversions.ToString('\n'), "
", Compare: CompareMethod.Text); // 寄送 Email argcnnTemp = CreateConnection(strConnectionString); if (ERP2MES_MailNotice(ref argcnnTemp, ref aryReturnMessage, strSubject, strParameter01, CInput(strBody)) < 0) { // '寄送不成功, ReturnMessage 再增加1項. // 'ProductIntegration += Chr(10) & aryReturnMessage.Item(aryReturnMessage.Count - 1).ToString // 寄送不成功, ReturnMessage 再增加1項. // tblMESAutoRunLog.ReturnMessage 長度4000限制. if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(funMESCallERPPRDMTLBasisRet.ToString().Length, 4000, false))) { string strTemp = ""; strTemp = strReturnMessage; if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(strTemp + aryReturnMessage[aryReturnMessage.Count - 1].ToString().Length, 4000, false))) { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); } else { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); // 自 strTemp 中截取0-3991碼. strTemp = strTemp.Substring(0, 3991) + "..."; } // //fail; funMESCallERPPRDMTLBasisRet = CombineFailMsg("0000-999999", strTemp); } } } } catch (Exception) { throw; } finally { CloseConnection(argcnnTemp); } return funMESCallERPPRDMTLBasisRet; } // ======================================================================================================================== // 程式名稱:funMESCallERPMaterialVendorBasis // 傳入參數:colParameters // 傳回參數:success(成功), fail(失敗) // 用 途:整合服務-物料供應商主檔 // 撰寫人員:05876 崑源 // 撰寫日期:2017/02/08 // ======================================================================================================================== private object funMESCallERPVendorBasis(Collection colParameters = null) { object funMESCallERPVendorBasisRet = default(object); var XmlDoc = new XmlDocument(); var CollectionSQL = new Collection(); // =========================================================== // 宣告 AutoRunJob設定及執行記錄 變數 // =========================================================== string strParameter01 = ""; // 參數一,預設此功能fail通知EMAIL群組。 string strPageSize = "500"; // 參數二,分包筆數 string strDate; // 參數三,手動重收時填上時間,如沒填則以log tableERP拋回的最後執行時間為主 string strSubject, strBody; // 寄送通知資訊 string strServiceName = "supplier.get"; // AutorunJob拋轉資訊 string strReturnMessage = ""; // 錯誤訊息(tblMESAutoRunLog.ReturnMessage),Chr(10)分隔錯誤項目。 var aryReturnMessage = new ArrayList(); // Catch Error Message (Exception及MES判定錯誤訊息)。 var colResponseXML = new Collection(); do { try { // Parameter01為參數一 // 作為Mail通知群組(GroupNo),放在最前面防止連線失敗無法寄送通知。 if (!(colParameters["Parameter01"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter01"])))) { strParameter01 = colParameters["Parameter01"].ToString().Trim(); } else { aryReturnMessage.Add(TranslateMsg("Mail GroupNo [%NOT SET%]([%PARAMETER01%])!", strLanguageMode, strResourceDir)); // ===== 2021/05/18 Elvis 92880 break; } // 分包筆數必須為數值型態,Add by KevinChang if (Information.IsNumeric(colParameters["Parameter02"])) { if (!(colParameters["Parameter02"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter02"])))) { // 每封包筆數不可小於500筆,Add by KevinChang if (Conversions.ToInteger(colParameters["Parameter02"]) < 500) { strPageSize = "500"; } else { strPageSize = colParameters["Parameter02"].ToString().Trim(); } } } if (!(colParameters["Parameter03"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter03"])))) { strDate = GetDate(Conversions.ToString(colParameters["Parameter03"]), "Parameter03"); } else { // 20170316 edit liyujn strDate = GetERPTransactionDate(strServiceName); } // 取得erp資訊 if (!GetERPSetting(ref dtERPSetting, pEAIType: 1)) { aryReturnMessage.Add(TranslateMsg("[%PleaseCheck%] EAI ERP Setting Info [%CONFIGSETTING%]!", strLanguageMode, strResourceDir)); break; } var objResponse = new iMESCIO.SCI.ERP.Response.SCI_Response_supplier_get(); // Dim colResponseXML As New Collection XmlNode xmlNodeCnt; string strCnt; string strTTcnt; bool chkStatus = true; // 抓取其它status為0之資料且塞入colResponseXML GetReTransData(strServiceName, ref colResponseXML); // 判斷『當前回傳筆數』=『應回傳筆數』時才代表為最後一次請求,執行後才進行後續動作 var objMaster = new iMESCIO.SCI.ERP.Request.SCI_Request_supplier_get(); objMaster.data_time = strDate; objMaster.page_size = strPageSize; objMaster.key_condition = ""; object argSCI_Object = objMaster; string argpRequestKey = "Null"; InXml = CombineRequestXMLbyCDO(ref argSCI_Object, dtERPSetting.Rows[0]["ERP_Name"].ToString(), "", strServiceName, pRequestKey: argpRequestKey); objMaster = (iMESCIO.SCI.ERP.Request.SCI_Request_supplier_get)argSCI_Object; int intloopTimes = 0; do { // 迴圈執行超過5次直接跳出迴圈並回傳錯誤訊息 if (intloopTimes >= 5) { throw new Exception("[%THE NUMBER OF SUBCONTRACTS IS SET TOO LITTLE TO CAUSE THE LOOP TO EXECUTE MORE THAN FIVE TIMES%]"); break; } OutXml = string.Empty; OutXml = LoadXmlFileForTest(strServiceName); try { if (string.IsNullOrEmpty(OutXml)) { // ----- Call ERP Web Service ----- using (var ws = new iMESCore.Base.Invoke.wsERP_EAI.IntegrationEntry()) { ws.Url = ERP_URL; OutXml = ws.invokeSrv(InXml); } // 2017-05-03, Joe, 轉換單引號 OutXml = OutXml.Replace("'", "''"); } } catch (Exception ex) { OutXml = ex.Message; throw ex; } finally { // 需等到取得所有資料後,再處理後面之動作,故統一將請求完之ResponseXML放入容器內 colResponseXML.Add(OutXml); } XmlDoc.LoadXml(OutXml); // 執行ERP交易完畢寫入Log string argstrException = null; modAutoRunLibrary.addTransactionLog(InXml, OutXml, DateTime.Now.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPVendorBasis", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), "success", "ERP", strServiceName, strException: argstrException); // 將ERP拋回的資料轉成物件 objResponse.ParseXmlToObject(OutXml); if (objResponse.srvcode == null == false && objResponse.srvcode.Equals("000") && objResponse.code == null == false && objResponse.code.Equals("0")) { objMaster = new iMESCIO.SCI.ERP.Request.SCI_Request_supplier_get(); objMaster.data_time = objResponse.data_time; // 第二次後請求需為回傳之最後拋轉時間 objMaster.page_size = strPageSize; objMaster.key_condition = Strings.Replace(objResponse.key_condition, "''", "'"); // 第二次後待入從ERP收到之keyCondition object argSCI_Object1 = objMaster; string argpRequestKey1 = "Null"; InXml = CombineRequestXMLbyCDO(ref argSCI_Object1, dtERPSetting.Rows[0]["ERP_Name"].ToString(), "", strServiceName, pRequestKey: argpRequestKey1); objMaster = (iMESCIO.SCI.ERP.Request.SCI_Request_supplier_get)argSCI_Object1; xmlNodeCnt = XmlDoc.SelectSingleNode("/response/payload/param/data_response/datainfo/parameter/data"); strCnt = xmlNodeCnt.Attributes.GetNamedItem("cnt").Value; strTTcnt = xmlNodeCnt.Attributes.GetNamedItem("tt_cnt").Value; } else { chkStatus = false; aryReturnMessage.Add(OutXml); // 2017-06-26, Joe, 如是中台層的錯誤要往外拋 break; } intloopTimes += 1; } while ((strCnt ?? "") != (strTTcnt ?? "")); // 寫入log table TreatWriteLogTable(colResponseXML, strServiceName); // 寫入MES DB if (chkStatus == true) { foreach (string strOutXML in colResponseXML) { objResponse.ParseXmlToObject(strOutXML); if (WriteVendorBasis(objResponse, ref aryReturnMessage) < 0) { if (aryReturnMessage.Count == 0) // 避免不明原因,執行FAIL又沒收集到項目. { aryReturnMessage.Add(TranslateMsg("supplier_get, [%INVOKE FAIL%]!", strLanguageMode, strResourceDir)); } } } } } catch (Exception EX_AUT) { aryReturnMessage.Add("EX_AUT.Exception" + '\n' + EX_AUT.Message.ToString()); OutXml = EX_AUT.Message.ToString(); results = "fail"; // 執行ERP交易完畢寫入Log string argstrException = null; modAutoRunLibrary.addTransactionLog_ErrorCode(InXml, OutXml, DateTime.Now.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPVendorBasis", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), results, "ERP", strServiceName, LogClass: "AutoRun", strException: argstrException); } finally { // -------------------------------------------------- // 回傳執行結果:succces 或 fail(ReturnMessage) // -------------------------------------------------- if (aryReturnMessage.Count == 0) { funMESCallERPVendorBasisRet = "success"; results = "fail"; } else { // 組合執行錯誤字串: Chr(10)分隔 strReturnMessage = ArrayList2String(ref aryReturnMessage); if ((strReturnMessage ?? "") == defString) { // 當錯誤字串組合失敗。補上 strReturnMessage = "ReturnMessage收集失敗!!"; } // tblMESAutoRunLog.ReturnMessage 長度4000限制. string strTemp = ""; if (strReturnMessage.Length > 4000) { // 自 strReturnMessage 中截取0-3991碼. strTemp = strReturnMessage.Substring(0, 3991) + "..."; } else { strTemp = strReturnMessage; } // 更新log table異常資訊 // Dim nodeID As XmlNode = XmlDoc.SelectSingleNode("/response/reqid") UpdateLogTableErrorInfo(colResponseXML, strServiceName, strTemp); // //fail; funMESCallERPVendorBasisRet = CombineFailMsg("0000-999999", strTemp); } // ===manties:0095454 AutoRun addTransactionLog位置錯誤 需移至Finally 2021/07/06 // 執行ERP交易完畢寫入Log string argstrException = null; modAutoRunLibrary.addTransactionLog(InXml, OutXml, DateTime.Now.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPVendorBasis", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), results, "ERP", strServiceName, strException: argstrException); } } // === while (false); // -------------------------------------------------- // 當執行失敗,寄送 Email。必須有設定參數一。 // -------------------------------------------------- IDbConnection argcnnTemp = null; try { if (aryReturnMessage.Count > 0 && Conversions.ToBoolean(Operators.ConditionalCompareObjectNotEqual(colParameters["Parameter01"], "", false))) { strSubject = "[AUT]料件供應商-基本資料抛轉失敗! "; strBody = Strings.Replace(strReturnMessage, Conversions.ToString('\n'), "
", Compare: CompareMethod.Text); // 寄送 Email argcnnTemp = CreateConnection(strConnectionString); if (ERP2MES_MailNotice(ref argcnnTemp, ref aryReturnMessage, strSubject, strParameter01, CInput(strBody)) < 0) { // '寄送不成功, ReturnMessage 再增加1項. // 'ProductIntegration += Chr(10) & aryReturnMessage.Item(aryReturnMessage.Count - 1).ToString // 寄送不成功, ReturnMessage 再增加1項. // tblMESAutoRunLog.ReturnMessage 長度4000限制. if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(funMESCallERPVendorBasisRet.ToString().Length, 4000, false))) { string strTemp = ""; strTemp = strReturnMessage; if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(strTemp + aryReturnMessage[aryReturnMessage.Count - 1].ToString().Length, 4000, false))) { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); } else { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); // 自 strTemp 中截取0-3991碼. strTemp = strTemp.Substring(0, 3991) + "..."; } // //fail; funMESCallERPVendorBasisRet = CombineFailMsg("0000-999999", strTemp); } } } } catch (Exception) { throw; } finally { CloseConnection(argcnnTemp); } return funMESCallERPVendorBasisRet; } // ======================================================================================================================== // 程式名稱:funMESCallERPMaterialVendorMAPBasis // 傳入參數:colParameters // 傳回參數:success(成功), fail(失敗) // 用 途:整合服務-物料供應商主檔對應 // 撰寫人員:05876 崑源 // 撰寫日期:2017/02/08 // ======================================================================================================================== private object funMESCallERPMaterialVendorMAPBasis(Collection colParameters = null) { object funMESCallERPMaterialVendorMAPBasisRet = default(object); var XmlDoc = new XmlDocument(); var CollectionSQL = new Collection(); // =========================================================== // 宣告 AutoRunJob設定及執行記錄 變數 // =========================================================== string strParameter01 = ""; // 參數一,預設此功能fail通知EMAIL群組。 string strPageSize = "500"; // 參數二,分包筆數 string strDate; // 參數三,手動重收時填上時間,如沒填則以log tableERP拋回的最後執行時間為主 string strSubject, strBody; // 寄送通知資訊 string strServiceName = "item.supplier.get"; // AutorunJob拋轉資訊 string strReturnMessage = ""; // 錯誤訊息(tblMESAutoRunLog.ReturnMessage),Chr(10)分隔錯誤項目。 var aryReturnMessage = new ArrayList(); // Catch Error Message (Exception及MES判定錯誤訊息)。 var colResponseXML = new Collection(); do { try { // Parameter01為參數一 // 作為Mail通知群組(GroupNo),放在最前面防止連線失敗無法寄送通知。 if (!(colParameters["Parameter01"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter01"])))) { strParameter01 = colParameters["Parameter01"].ToString().Trim(); } else { aryReturnMessage.Add(TranslateMsg("Mail GroupNo [%NOT SET%]!", strLanguageMode, strResourceDir)); break; } // 分包筆數必須為數值型態,Add by KevinChang if (Information.IsNumeric(colParameters["Parameter02"])) { if (!(colParameters["Parameter02"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter02"])))) { // 每封包筆數不可小於500筆,Add by KevinChang if (Conversions.ToInteger(colParameters["Parameter02"]) < 500) { strPageSize = "500"; } else { strPageSize = colParameters["Parameter02"].ToString().Trim(); } } } if (!(colParameters["Parameter03"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter03"])))) { strDate = GetDate(Conversions.ToString(colParameters["Parameter03"]), "Parameter03"); } else { // 20170316 edit liyujn strDate = GetERPTransactionDate(strServiceName); } // 取得erp資訊 if (!GetERPSetting(ref dtERPSetting, pEAIType: 1)) { aryReturnMessage.Add(TranslateMsg("[%PleaseCheck%] EAI ERP Setting Info [%CONFIGSETTING%]!", strLanguageMode, strResourceDir)); break; } var objResponse = new iMESCIO.SCI.ERP.Response.SCI_Response_item_supplier_get(); // Dim colResponseXML As New Collection XmlNode xmlNodeCnt; string strCnt; string strTTcnt; bool chkStatus = true; // 抓取其它status為0之資料且塞入colResponseXML GetReTransData(strServiceName, ref colResponseXML); // 判斷『當前回傳筆數』=『應回傳筆數』時才代表為最後一次請求,執行後才進行後續動作 var objMaster = new iMESCIO.SCI.ERP.Request.SCI_Request_item_supplier_get(); objMaster.data_time = strDate; objMaster.key_condition = ""; objMaster.page_size = strPageSize; object argSCI_Object = objMaster; string argpRequestKey = "Null"; InXml = CombineRequestXMLbyCDO(ref argSCI_Object, dtERPSetting.Rows[0]["ERP_Name"].ToString(), "", strServiceName, pRequestKey: argpRequestKey); objMaster = (iMESCIO.SCI.ERP.Request.SCI_Request_item_supplier_get)argSCI_Object; int intloopTimes = 0; do { // 迴圈執行超過5次直接跳出迴圈並回傳錯誤訊息 if (intloopTimes >= 5) { throw new Exception("[%THE NUMBER OF SUBCONTRACTS IS SET TOO LITTLE TO CAUSE THE LOOP TO EXECUTE MORE THAN FIVE TIMES%]"); break; } OutXml = string.Empty; OutXml = LoadXmlFileForTest(strServiceName); try { if (string.IsNullOrEmpty(OutXml)) { // ----- Call ERP Web Service ----- using (var ws = new iMESCore.Base.Invoke.wsERP_EAI.IntegrationEntry()) { ws.Url = ERP_URL; OutXml = ws.invokeSrv(InXml); } // 2017-05-03, Joe, 轉換單引號 OutXml = OutXml.Replace("'", "''"); } } catch (Exception ex) { OutXml = ex.Message; throw ex; } finally { // 需等到取得所有資料後,再處理後面之動作,故統一將請求完之ResponseXML放入容器內 colResponseXML.Add(OutXml); } XmlDoc.LoadXml(OutXml); // 執行ERP交易完畢寫入Log string argstrException = null; modAutoRunLibrary.addTransactionLog(InXml, OutXml, DateTime.Now.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPMaterialVendorMAPBasis", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), "success", "ERP", strServiceName, strException: argstrException); // 將ERP拋回的資料轉成物件 objResponse.ParseXmlToObject(OutXml); if (objResponse.srvcode == null == false && objResponse.srvcode.Equals("000") && objResponse.code == null == false && objResponse.code.Equals("0")) { objMaster = new iMESCIO.SCI.ERP.Request.SCI_Request_item_supplier_get(); objMaster.data_time = objResponse.data_time; // 第二次後請求需為回傳之最後拋轉時間 objMaster.key_condition = Strings.Replace(objResponse.key_condition, "''", "'"); // 第二次後待入從ERP收到之keyCondition objMaster.page_size = strPageSize; object argSCI_Object1 = objMaster; string argpRequestKey1 = "Null"; InXml = CombineRequestXMLbyCDO(ref argSCI_Object1, dtERPSetting.Rows[0]["ERP_Name"].ToString(), "", strServiceName, pRequestKey: argpRequestKey1); objMaster = (iMESCIO.SCI.ERP.Request.SCI_Request_item_supplier_get)argSCI_Object1; xmlNodeCnt = XmlDoc.SelectSingleNode("/response/payload/param/data_response/datainfo/parameter/data"); strCnt = xmlNodeCnt.Attributes.GetNamedItem("cnt").Value; strTTcnt = xmlNodeCnt.Attributes.GetNamedItem("tt_cnt").Value; } else { chkStatus = false; aryReturnMessage.Add(OutXml); // 2017-06-26, Joe, 如是中台層的錯誤要往外拋 break; } intloopTimes += 1; } while ((strCnt ?? "") != (strTTcnt ?? "")); // 寫入log table TreatWriteLogTable(colResponseXML, strServiceName); // 寫入MES DB if (chkStatus == true) { foreach (string strOutXML in colResponseXML) { objResponse.ParseXmlToObject(strOutXML); if (WriteMaterialVendorMapBasis(objResponse, ref aryReturnMessage) < 0) { if (aryReturnMessage.Count == 0) // 避免不明原因,執行FAIL又沒收集到項目. { aryReturnMessage.Add(TranslateMsg("item_supplier_get, [%INVOKE FAIL%]!", strLanguageMode, strResourceDir)); } } } } } catch (Exception EX_AUT) { aryReturnMessage.Add("EX_AUT.Exception" + '\n' + EX_AUT.Message.ToString()); OutXml = EX_AUT.Message.ToString(); results = "fail"; // 執行ERP交易完畢寫入Log string argstrException = null; modAutoRunLibrary.addTransactionLog_ErrorCode(InXml, OutXml, DateTime.Now.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPMaterialVendorMAPBasis", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), results, "ERP", strServiceName, LogClass: "AutoRun", strException: argstrException); } finally { // -------------------------------------------------- // 回傳執行結果:succces 或 fail(ReturnMessage) // -------------------------------------------------- if (aryReturnMessage.Count == 0) { funMESCallERPMaterialVendorMAPBasisRet = "success"; results = "success"; } else { // 組合執行錯誤字串: Chr(10)分隔 strReturnMessage = ArrayList2String(ref aryReturnMessage); if ((strReturnMessage ?? "") == defString) { // 當錯誤字串組合失敗。補上 strReturnMessage = "ReturnMessage收集失敗!!"; } // tblMESAutoRunLog.ReturnMessage 長度4000限制. string strTemp = ""; if (strReturnMessage.Length > 4000) { // 自 strReturnMessage 中截取0-3991碼. strTemp = strReturnMessage.Substring(0, 3991) + "..."; } else { strTemp = strReturnMessage; } // 更新log table異常資訊 // Dim nodeID As XmlNode = XmlDoc.SelectSingleNode("/response/reqid") UpdateLogTableErrorInfo(colResponseXML, strServiceName, strTemp); // //fail; funMESCallERPMaterialVendorMAPBasisRet = "fail;" + strTemp; } // ===manties:0095454 AutoRun addTransactionLog位置錯誤 需移至Finally 2021/07/06 // 執行ERP交易完畢寫入Log string argstrException = null; modAutoRunLibrary.addTransactionLog(InXml, OutXml, DateTime.Now.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPMaterialVendorMAPBasis", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), results, "ERP", strServiceName, strException: argstrException); } } // === while (false); // -------------------------------------------------- // 當執行失敗,寄送 Email。必須有設定參數一。 // -------------------------------------------------- IDbConnection argcnnTemp = null; try { if (aryReturnMessage.Count > 0 && Conversions.ToBoolean(Operators.ConditionalCompareObjectNotEqual(colParameters["Parameter01"], "", false))) { strSubject = "[AUT]料件供應商主檔對應抛轉失敗! "; strBody = Strings.Replace(strReturnMessage, Conversions.ToString('\n'), "
", Compare: CompareMethod.Text); // 寄送 Email argcnnTemp = CreateConnection(strConnectionString); if (ERP2MES_MailNotice(ref argcnnTemp, ref aryReturnMessage, strSubject, strParameter01, CInput(strBody)) < 0) { // '寄送不成功, ReturnMessage 再增加1項. // 'ProductIntegration += Chr(10) & aryReturnMessage.Item(aryReturnMessage.Count - 1).ToString // 寄送不成功, ReturnMessage 再增加1項. // tblMESAutoRunLog.ReturnMessage 長度4000限制. if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(funMESCallERPMaterialVendorMAPBasisRet.ToString().Length, 4000, false))) { string strTemp = ""; strTemp = strReturnMessage; if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(strTemp + aryReturnMessage[aryReturnMessage.Count - 1].ToString().Length, 4000, false))) { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); } else { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); // 自 strTemp 中截取0-3991碼. strTemp = strTemp.Substring(0, 3991) + "..."; } // //fail; funMESCallERPMaterialVendorMAPBasisRet = "fail;" + strTemp; } } } } catch (Exception) { throw; } finally { CloseConnection(argcnnTemp); } return funMESCallERPMaterialVendorMAPBasisRet; } // ======================================================================================================================== // 程式名稱:funMESCallERPEquipmentBasis // 傳入參數:colParameters // 傳回參數:success(成功), fail(失敗) // 用 途:整合服務-設備主檔 // 撰寫人員:05876 崑源 // 撰寫日期:2017/02/08 // ======================================================================================================================== private object funMESCallERPEquipmentBasis(Collection colParameters = null) { object funMESCallERPEquipmentBasisRet = default(object); var XmlDoc = new XmlDocument(); var CollectionSQL = new Collection(); // =========================================================== // 宣告 AutoRunJob設定及執行記錄 變數 // =========================================================== string strParameter01 = ""; // 參數一,預設此功能fail通知EMAIL群組。 string strPageSize = "500"; // 參數二,分包筆數 string strDate; // 參數三,手動重收時填上時間,如沒填則以log tableERP拋回的最後執行時間為主 string strSubject, strBody; // 寄送通知資訊 string strServiceName = "machine.get"; // AutorunJob拋轉資訊 string strReturnMessage = ""; // 錯誤訊息(tblMESAutoRunLog.ReturnMessage),Chr(10)分隔錯誤項目。 var aryReturnMessage = new ArrayList(); // Catch Error Message (Exception及MES判定錯誤訊息)。 var colResponseXML = new Collection(); do { try { // Parameter01為參數一 // 作為Mail通知群組(GroupNo),放在最前面防止連線失敗無法寄送通知。 if (!(colParameters["Parameter01"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter01"])))) { strParameter01 = colParameters["Parameter01"].ToString().Trim(); } else { aryReturnMessage.Add(TranslateMsg("Mail GroupNo [%NOT SET%]([%PARAMETER01%])!", strLanguageMode, strResourceDir)); // ===== 2021/05/18 Elvis 92880 break; } // 分包筆數必須為數值型態,Add by KevinChang if (Information.IsNumeric(colParameters["Parameter02"])) { if (!(colParameters["Parameter02"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter02"])))) { // 每封包筆數不可小於500筆,Add by KevinChang if (Conversions.ToInteger(colParameters["Parameter02"]) < 500) { strPageSize = "500"; } else { strPageSize = colParameters["Parameter02"].ToString().Trim(); } } } if (!(colParameters["Parameter03"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter03"])))) { strDate = GetDate(Conversions.ToString(colParameters["Parameter03"]), "Parameter03"); } else { // 20170316 edit liyujn strDate = GetERPTransactionDate(strServiceName); } // 取得erp資訊 if (!GetERPSetting(ref dtERPSetting, pEAIType: 1)) { aryReturnMessage.Add(TranslateMsg("[%PleaseCheck%] EAI ERP Setting Info [%CONFIGSETTING%]!", strLanguageMode, strResourceDir)); break; } var objResponse = new iMESCIO.SCI.ERP.Response.SCI_Response_machine_get(); // Dim colResponseXML As New Collection XmlNode xmlNodeCnt; string strCnt; string strTTcnt; bool chkStatus = true; // 抓取其它status為0之資料且塞入colResponseXML GetReTransData(strServiceName, ref colResponseXML); // 判斷『當前回傳筆數』=『應回傳筆數』時才代表為最後一次請求,執行後才進行後續動作 var objMaster = new iMESCIO.SCI.ERP.Request.SCI_Request_machine_get(); objMaster.data_time = strDate; objMaster.page_size = strPageSize; objMaster.key_condition = ""; object argSCI_Object = objMaster; string argpRequestKey = "Null"; InXml = CombineRequestXMLbyCDO(ref argSCI_Object, dtERPSetting.Rows[0]["ERP_Name"].ToString(), "", strServiceName, pRequestKey: argpRequestKey); objMaster = (iMESCIO.SCI.ERP.Request.SCI_Request_machine_get)argSCI_Object; int intloopTimes = 0; do { // 迴圈執行超過5次直接跳出迴圈並回傳錯誤訊息,Add By KevinChang if (intloopTimes >= 5) { throw new Exception("[%THE NUMBER OF SUBCONTRACTS IS SET TOO LITTLE TO CAUSE THE LOOP TO EXECUTE MORE THAN FIVE TIMES%]"); break; } OutXml = string.Empty; OutXml = LoadXmlFileForTest(strServiceName); try { if (string.IsNullOrEmpty(OutXml)) { // ----- Call ERP Web Service ----- using (var ws = new iMESCore.Base.Invoke.wsERP_EAI.IntegrationEntry()) { ws.Url = ERP_URL; OutXml = ws.invokeSrv(InXml); } // 2017-05-03, Joe, 轉換單引號 OutXml = OutXml.Replace("'", "''"); } } catch (Exception ex) { OutXml = ex.Message; throw ex; } finally { // 需等到取得所有資料後,再處理後面之動作,故統一將請求完之ResponseXML放入容器內 colResponseXML.Add(OutXml); } XmlDoc.LoadXml(OutXml); // 執行ERP交易完畢寫入Log string argstrException = null; modAutoRunLibrary.addTransactionLog(InXml, OutXml, DateTime.Now.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPEquipmentBasis", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), "success", "ERP", strServiceName, strException: argstrException); // 將ERP拋回的資料轉成物件 objResponse.ParseXmlToObject(OutXml); if (objResponse.srvcode == null == false && objResponse.srvcode.Equals("000") && objResponse.code == null == false && objResponse.code.Equals("0")) { objMaster = new iMESCIO.SCI.ERP.Request.SCI_Request_machine_get(); objMaster.data_time = objResponse.data_time; // 第二次後請求需為回傳之最後拋轉時間 objMaster.page_size = strPageSize; objMaster.key_condition = Strings.Replace(objResponse.key_condition, "''", "'"); // 第二次後代入從ERP收到之keyCondition object argSCI_Object1 = objMaster; string argpRequestKey1 = "Null"; InXml = CombineRequestXMLbyCDO(ref argSCI_Object1, dtERPSetting.Rows[0]["ERP_Name"].ToString(), "", strServiceName, pRequestKey: argpRequestKey1); objMaster = (iMESCIO.SCI.ERP.Request.SCI_Request_machine_get)argSCI_Object1; xmlNodeCnt = XmlDoc.SelectSingleNode("/response/payload/param/data_response/datainfo/parameter/data"); strCnt = xmlNodeCnt.Attributes.GetNamedItem("cnt").Value; strTTcnt = xmlNodeCnt.Attributes.GetNamedItem("tt_cnt").Value; } else { chkStatus = false; aryReturnMessage.Add(OutXml); // 2017-06-26, Joe, 如是中台層的錯誤要往外拋 break; } intloopTimes += 1; } while ((strCnt ?? "") != (strTTcnt ?? "")); // 寫入log table TreatWriteLogTable(colResponseXML, strServiceName); // 寫入MES DB if (chkStatus == true) { foreach (string strOutXML in colResponseXML) { objResponse.ParseXmlToObject(strOutXML); if (WriteEquipmentBasis(ref objResponse, ref aryReturnMessage) < 0) { if (aryReturnMessage.Count == 0) // 避免不明原因,執行FAIL又沒收集到項目. { aryReturnMessage.Add(TranslateMsg("machine_get, [%INVOKE FAIL%]!", strLanguageMode, strResourceDir)); } } } } } catch (Exception EX_AUT) { aryReturnMessage.Add("EX_AUT.Exception" + '\n' + EX_AUT.Message.ToString()); OutXml = EX_AUT.Message.ToString(); results = "fail"; // 執行ERP交易完畢寫入Log string argstrException = null; modAutoRunLibrary.addTransactionLog_ErrorCode(InXml, OutXml, DateTime.Now.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPEquipmentBasis", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), results, "ERP", strServiceName, LogClass: "AutoRun", strException: argstrException); } finally { // -------------------------------------------------- // 回傳執行結果:succces 或 fail(ReturnMessage) // -------------------------------------------------- if (aryReturnMessage.Count == 0) { funMESCallERPEquipmentBasisRet = "success"; results = "success"; } else { // 組合執行錯誤字串: Chr(10)分隔 strReturnMessage = ArrayList2String(ref aryReturnMessage); if ((strReturnMessage ?? "") == defString) { // 當錯誤字串組合失敗。補上 strReturnMessage = "ReturnMessage收集失敗!!"; } // tblMESAutoRunLog.ReturnMessage 長度4000限制. string strTemp = ""; if (strReturnMessage.Length > 4000) { // 自 strReturnMessage 中截取0-3991碼. strTemp = strReturnMessage.Substring(0, 3991) + "..."; } else { strTemp = strReturnMessage; } // 更新log table異常資訊 // Dim nodeID As XmlNode = XmlDoc.SelectSingleNode("/response/reqid") UpdateLogTableErrorInfo(colResponseXML, strServiceName, strTemp); // //fail; funMESCallERPEquipmentBasisRet = "fail;" + strTemp; } // ===manties:0095454 AutoRun addTransactionLog位置錯誤 需移至Finally 2021/07/06 // 執行ERP交易完畢寫入Log string argstrException = null; modAutoRunLibrary.addTransactionLog(InXml, OutXml, DateTime.Now.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPEquipmentBasis", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), results, "ERP", strServiceName, strException: argstrException); } } // === while (false); // -------------------------------------------------- // 當執行失敗,寄送 Email。必須有設定參數一。 // -------------------------------------------------- IDbConnection argcnnTemp = null; try { if (aryReturnMessage.Count > 0 && Conversions.ToBoolean(Operators.ConditionalCompareObjectNotEqual(colParameters["Parameter01"], "", false))) { strSubject = "[AUT]設備-基本資料抛轉失敗! "; strBody = Strings.Replace(strReturnMessage, Conversions.ToString('\n'), "
", Compare: CompareMethod.Text); // 寄送 Email argcnnTemp = CreateConnection(strConnectionString); if (ERP2MES_MailNotice(ref argcnnTemp, ref aryReturnMessage, strSubject, strParameter01, CInput(strBody)) < 0) { // 寄送不成功, ReturnMessage 再增加1項. // tblMESAutoRunLog.ReturnMessage 長度4000限制. if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(funMESCallERPEquipmentBasisRet.ToString().Length, 4000, false))) { string strTemp = ""; strTemp = strReturnMessage; if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(strTemp + aryReturnMessage[aryReturnMessage.Count - 1].ToString().Length, 4000, false))) { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); } else { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); // 自 strTemp 中截取0-3991碼. strTemp = strTemp.Substring(0, 3991) + "..."; } // //fail; funMESCallERPEquipmentBasisRet = "fail;" + strTemp; } } } } catch (Exception) { throw; } finally { CloseConnection(argcnnTemp); } return funMESCallERPEquipmentBasisRet; } // ======================================================================================================================== // 程式名稱:funMESCallERPCustomerBasis // 傳入參數:colParameters // 傳回參數:success(成功), fail(失敗) // 用 途:客戶主檔整合 // 撰寫人員:LiJyun // 撰寫日期:2017/02/02 // ======================================================================================================================== // 為做測試所以Function先改為Public,測試完畢必須改回private private object funMESCallERPCustomerBasis(Collection colParameters = null) { object funMESCallERPCustomerBasisRet = default(object); var XmlDoc = new XmlDocument(); var drTemp = default(DbDataReader); //var daTemp = default(System.Data.OleDb.OleDbDataAdapter); var CollectionSQL = new Collection(); string strSQL; string strServiceName = "customer.get"; string strGroupNo = ""; // 使用者群組 string strPageSize = "500"; // 分包筆數 string strDate = string.Empty; // 日期迄(如無指定則帶今天) var arriveTime = DateTime.Now; string strCustomerNo, strERP_CustomerNo, strERP_status; string strSubject, strBody; // 寄送通知資訊 // AutorunJob拋轉資訊 string strReturnMessage = ""; // 錯誤訊息(tblMESAutoRunLog.ReturnMessage),Chr(10)分隔錯誤項目。 var aryReturnMessage = new ArrayList(); // Catch Error Message (Exception及MES判定錯誤訊息)。 var colResponseXML = new Collection(); do { try { // ParameterXX參數說明 // 01:Mail通知群組(GroupNo) // 02:分包筆數 // 03:手動重收時填上時間,如沒填則以log tableERP拋回的最後執行時間為主 // Parameter01為傳入參數,作為GroupNo,若無此值則不進行下面的程式 if (!(colParameters["Parameter01"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter01"])))) { strGroupNo = colParameters["Parameter01"].ToString().Trim(); } else { aryReturnMessage.Add(TranslateMsg("Mail GroupNo [%NOT SET%]([%PARAMETER01%])!", strLanguageMode, strResourceDir)); // ===== 2021/05/18 Elvis 92880 break; } // 分包筆數必須為數值型態,Add by KevinChang if (Information.IsNumeric(colParameters["Parameter02"])) { if (!(colParameters["Parameter02"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter02"])))) { // 每封包筆數不可小於500筆,Add by KevinChang if (Conversions.ToInteger(colParameters["Parameter02"]) < 500) { strPageSize = "500"; } else { strPageSize = colParameters["Parameter02"].ToString().Trim(); } } } // Parameter03為傳入參數,作為手動重收時填上時間,若無此值則以log tableERP拋回的最後執行時間為主 if (!(colParameters["Parameter03"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter03"])))) { strDate = GetDate(Conversions.ToString(colParameters["Parameter03"]), "Parameter03"); } else { // 20170316 edit liyujn strDate = GetERPTransactionDate(strServiceName); } // 取得erp資訊 if (!GetERPSetting(ref dtERPSetting, pEAIType: 1)) { aryReturnMessage.Add("Can not found ERP ERP Setting Info (ERP_TYPE = 1)!"); break; } var objResponse = new iMESCIO.SCI.ERP.Response.SCI_Response_customer_get(); XmlNode xmlNodeCnt; string strCnt; string strTTcnt; bool chkStatus = true; // 抓取其它status為0之資料且塞入colResponseXML GetReTransData(strServiceName, ref colResponseXML); // 判斷『當前回傳筆數』=『應回傳筆數』時才代表為最後一次請求,執行後才進行後續動作 var objRequest = new iMESCIO.SCI.ERP.Request.SCI_Request_customer_get(); objRequest.page_size = strPageSize; objRequest.data_time = strDate; objRequest.key_condition = ""; // ---- InXml ----- object argSCI_Object = objRequest; string argpRequestKey = "Null"; InXml = CombineRequestXMLbyCDO(ref argSCI_Object, dtERPSetting.Rows[0]["ERP_Name"].ToString(), "", strServiceName, pRequestKey: argpRequestKey); objRequest = (iMESCIO.SCI.ERP.Request.SCI_Request_customer_get)argSCI_Object; int intloopTimes = 0; do { // 迴圈執行超過5次直接跳出迴圈並回傳錯誤訊息 if (intloopTimes >= 5) { throw new Exception("[%THE NUMBER OF SUBCONTRACTS IS SET TOO LITTLE TO CAUSE THE LOOP TO EXECUTE MORE THAN FIVE TIMES%]"); break; } OutXml = string.Empty; OutXml = LoadXmlFileForTest("customer.get"); try { if (string.IsNullOrEmpty(OutXml)) { // ----- Call ERP Web Service ----- using (var ws = new iMESCore.Base.Invoke.wsERP_EAI.IntegrationEntry()) { ws.Url = ERP_URL; OutXml = ws.invokeSrv(InXml); } // 2017-05-03, Joe, 轉換單引號 OutXml = OutXml.Replace("'", "''"); } } catch (Exception ex) { OutXml = ex.Message; throw ex; } finally { // 需等到取得所有資料後,再處理後面之動作,故統一將請求完之ResponseXML放入容器內 colResponseXML.Add(OutXml); } XmlDoc.LoadXml(OutXml); // ----- 執行ERP交易完畢紀錄TransactionLog ----- string argstrException = null; modAutoRunLibrary.addTransactionLog(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPCustomerBasis", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), "success", "ERP", strServiceName, strException: argstrException); // 將ERP拋回的資料轉成物件 objResponse.ParseXmlToObject(OutXml); if (objResponse.srvcode == null == false && objResponse.srvcode.Equals("000") && objResponse.code == null == false && objResponse.code.Equals("0")) { objRequest = new iMESCIO.SCI.ERP.Request.SCI_Request_customer_get(); objRequest.data_time = objResponse.data_time; // 第二次後請求需為回傳之最後拋轉時間 objRequest.key_condition = Strings.Replace(objResponse.key_condition, "''", "'"); // 第二次後待入從ERP收到之keyCondition objRequest.page_size = strPageSize; object argSCI_Object1 = objRequest; string argpRequestKey1 = "Null"; InXml = CombineRequestXMLbyCDO(ref argSCI_Object1, dtERPSetting.Rows[0]["ERP_Name"].ToString(), "", strServiceName, pRequestKey: argpRequestKey1); objRequest = (iMESCIO.SCI.ERP.Request.SCI_Request_customer_get)argSCI_Object1; xmlNodeCnt = XmlDoc.SelectSingleNode("/response/payload/param/data_response/datainfo/parameter/data"); strCnt = xmlNodeCnt.Attributes.GetNamedItem("cnt").Value; strTTcnt = xmlNodeCnt.Attributes.GetNamedItem("tt_cnt").Value; } else { chkStatus = false; aryReturnMessage.Add(OutXml); // 2017-06-26, Joe, 如是中台層的錯誤要往外拋 break; } intloopTimes += 1; } while ((strCnt ?? "") != (strTTcnt ?? "")); // 寫入log table TreatWriteLogTable(colResponseXML, strServiceName); // 寫入MES DB if (chkStatus) { foreach (string strOutXML in colResponseXML) { objResponse.ParseXmlToObject(strOutXML); if (WriteToMESCustomerBasis(objResponse, ref aryReturnMessage) < 0) { if (aryReturnMessage.Count == 0) // 避免不明原因,執行FAIL又沒收集到項目. { aryReturnMessage.Add(strServiceName + ", 客戶主檔拋轉執行失敗!!"); } } } } } catch (Exception EX_AUT) { aryReturnMessage.Add("EX_AUT.Exception" + '\n' + EX_AUT.Message.ToString()); OutXml = EX_AUT.Message.ToString(); results = "fail"; // 執行ERP交易完畢寫入Log string argstrException = null; modAutoRunLibrary.addTransactionLog_ErrorCode(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPCustomerBasis", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), results, "ERP", strServiceName, LogClass: "AutoRun", strException: argstrException); } finally { // -------------------------------------------------- // 回傳執行結果:succces 或 fail(ReturnMessage) // -------------------------------------------------- if (aryReturnMessage.Count == 0) { funMESCallERPCustomerBasisRet = "success"; results = "success"; } else { // 組合執行錯誤字串: Chr(10)分隔 strReturnMessage = ArrayList2String(ref aryReturnMessage); if ((strReturnMessage ?? "") == defString) { // 當錯誤字串組合失敗。補上 strReturnMessage = "ReturnMessage收集失敗!!"; } // tblMESAutoRunLog.ReturnMessage 長度4000限制. string strTemp = ""; if (strReturnMessage.Length > 4000) { // 自 strReturnMessage 中截取0-3991碼. strTemp = strReturnMessage.Substring(0, 3991) + "..."; } else { strTemp = strReturnMessage; } // 更新log table異常資訊 // Dim nodeID As XmlNode = XmlDoc.SelectSingleNode("/response/reqid") UpdateLogTableErrorInfo(colResponseXML, strServiceName, strTemp); // //fail; funMESCallERPCustomerBasisRet = CombineFailMsg("0000-999999", strTemp); } // ===manties:0095454 AutoRun addTransactionLog位置錯誤 需移至Finally 2021/07/06 // 執行ERP交易完畢寫入Log string argstrException = null; modAutoRunLibrary.addTransactionLog(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPCustomerBasis", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), results, "ERP", strServiceName, strException: argstrException); // === //if (daTemp != null) // daTemp.Dispose(); if (drTemp != null) drTemp.Close(); } } while (false); // -------------------------------------------------- // 當執行失敗,寄送 Email。必須有設定參數一。 // -------------------------------------------------- IDbConnection argcnnTemp = null; try { if (aryReturnMessage.Count > 0 && Conversions.ToBoolean(Operators.ConditionalCompareObjectNotEqual(colParameters["Parameter01"], "", false))) { strSubject = "[AUT]客戶主檔-基本資料抛轉失敗! "; strBody = Strings.Replace(strReturnMessage, Conversions.ToString('\n'), "
", Compare: CompareMethod.Text); argcnnTemp = CreateConnection(strConnectionString); // 寄送 Email if (ERP2MES_MailNotice(ref argcnnTemp, ref aryReturnMessage, strSubject, strGroupNo, CInput(strBody)) < 0) { // '寄送不成功, ReturnMessage 再增加1項. // 'ProductIntegration += Chr(10) & aryReturnMessage.Item(aryReturnMessage.Count - 1).ToString // 寄送不成功, ReturnMessage 再增加1項. // tblMESAutoRunLog.ReturnMessage 長度4000限制. if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(funMESCallERPCustomerBasisRet.ToString().Length, 4000, false))) { string strTemp = ""; strTemp = strReturnMessage; if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(strTemp + aryReturnMessage[aryReturnMessage.Count - 1].ToString().Length, 4000, false))) { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); } else { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); // 自 strTemp 中截取0-3991碼. strTemp = strTemp.Substring(0, 3991) + "..."; } // //fail; funMESCallERPCustomerBasisRet = CombineFailMsg("0000-999999", strTemp); } } } } catch (Exception) { throw; } finally { CloseConnection(argcnnTemp); } return funMESCallERPCustomerBasisRet; } // ======================================================================================================================== // 程式名稱:funMESCallERPInventoryBasis // 傳入參數:colParameters // 傳回參數:success(成功), fail(失敗) // 用 途:客戶主檔整合 // 撰寫人員:LiJyun // 撰寫日期:2017/02/08 // ======================================================================================================================== // 為做測試所以Function先改為Public,測試完畢必須改回private private object funMESCallERPInventoryBasis(Collection colParameters = null) { object funMESCallERPInventoryBasisRet = default(object); var XmlDoc = new XmlDocument(); var drTemp = default(DbDataReader); //var daTemp = default(System.Data.OleDb.OleDbDataAdapter); var CollectionSQL = new Collection(); string strSQL; string strServiceName = "warehouse.get"; string strGroupNo = ""; // 使用者群組 string strPageSize = "500"; // 分包筆數 string strDate = string.Empty; // 日期迄(如無指定則帶今天) var arriveTime = DateTime.Now; string strCustomerNo, strERP_CustomerNo, strERP_status; string strSubject, strBody; // 寄送通知資訊 // AutorunJob拋轉資訊 string strReturnMessage = ""; // 錯誤訊息(tblMESAutoRunLog.ReturnMessage),Chr(10)分隔錯誤項目。 var aryReturnMessage = new ArrayList(); // Catch Error Message (Exception及MES判定錯誤訊息)。 var colResponseXML = new Collection(); do { try { // ParameterXX參數說明 // 01:Mail通知群組(GroupNo) // 02:分包筆數 // 03:手動重收時填上時間,如沒填則以log tableERP拋回的最後執行時間為主 // Parameter01為傳入參數,作為GroupNo,若無此值則不進行下面的程式 if (!(colParameters["Parameter01"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter01"])))) { strGroupNo = colParameters["Parameter01"].ToString().Trim(); } else { aryReturnMessage.Add(TranslateMsg("Mail GroupNo [%NOT SET%]([%PARAMETER01%])!", strLanguageMode, strResourceDir)); // ===== 2021/05/18 Elvis 92880 break; } // 分包筆數必須為數值型態,Add by KevinChang if (Information.IsNumeric(colParameters["Parameter02"])) { if (!(colParameters["Parameter02"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter02"])))) { // 每封包筆數不可小於500筆,Add by KevinChang if (Conversions.ToInteger(colParameters["Parameter02"]) < 500) { strPageSize = "500"; } else { strPageSize = colParameters["Parameter02"].ToString().Trim(); } } } // Parameter03為傳入參數,作為手動重收時填上時間,若無此值則以log tableERP拋回的最後執行時間為主 if (!(colParameters["Parameter03"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter03"])))) { strDate = GetDate(Conversions.ToString(colParameters["Parameter03"]), "Parameter03"); } else { // 20170316 edit liyujn strDate = GetERPTransactionDate(strServiceName); } // 取得erp資訊 if (!GetERPSetting(ref dtERPSetting, pEAIType: 1)) { aryReturnMessage.Add("Can not found EAI ERP Setting Info (EAI_TYPE = 1)!"); break; } var objResponse = new iMESCIO.SCI.ERP.Response.SCI_Response_warehouse_get(); XmlNode xmlNodeCnt; string strCnt; string strTTcnt; bool chkStatus = true; // 抓取其它status為0之資料且塞入colResponseXML GetReTransData(strServiceName, ref colResponseXML); // 判斷『當前回傳筆數』=『應回傳筆數』時才代表為最後一次請求,執行後才進行後續動作 var objRequest = new iMESCIO.SCI.ERP.Request.SCI_Request_warehouse_get(); objRequest.page_size = strPageSize; objRequest.data_time = strDate; objRequest.key_condition = ""; // ---- InXml ----- object argSCI_Object = objRequest; string argpRequestKey = "Null"; InXml = CombineRequestXMLbyCDO(ref argSCI_Object, dtERPSetting.Rows[0]["ERP_Name"].ToString(), "", strServiceName, pRequestKey: argpRequestKey); objRequest = (iMESCIO.SCI.ERP.Request.SCI_Request_warehouse_get)argSCI_Object; int intloopTimes = 0; do { // 迴圈執行超過5次直接跳出迴圈並回傳錯誤訊息 if (intloopTimes >= 5) { throw new Exception("[%THE NUMBER OF SUBCONTRACTS IS SET TOO LITTLE TO CAUSE THE LOOP TO EXECUTE MORE THAN FIVE TIMES%]"); break; } OutXml = string.Empty; OutXml = LoadXmlFileForTest("warehouse.get"); try { if (string.IsNullOrEmpty(OutXml)) { // ----- Call ERP Web Service ----- using (var ws = new iMESCore.Base.Invoke.wsERP_EAI.IntegrationEntry()) { ws.Url = ERP_URL; OutXml = ws.invokeSrv(InXml); } // 2017-05-03, Joe, 轉換單引號 OutXml = OutXml.Replace("'", "''"); } } catch (Exception ex) { OutXml = ex.Message; throw ex; } finally { // 需等到取得所有資料後,再處理後面之動作,故統一將請求完之ResponseXML放入容器內 colResponseXML.Add(OutXml); } XmlDoc.LoadXml(OutXml); // ----- 執行ERP交易完畢紀錄TransactionLog ----- string argstrException = null; modAutoRunLibrary.addTransactionLog(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPInventoryBasis", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), "success", "ERP", strServiceName, strException: argstrException); // 將ERP拋回的資料轉成物件 objResponse.ParseXmlToObject(OutXml); if (objResponse.srvcode == null == false && objResponse.srvcode.Equals("000") && objResponse.code == null == false && objResponse.code.Equals("0")) { objRequest = new iMESCIO.SCI.ERP.Request.SCI_Request_warehouse_get(); objRequest.data_time = objResponse.data_time; // 第二次後請求需為回傳之最後拋轉時間 objRequest.page_size = strPageSize; objRequest.key_condition = Strings.Replace(objResponse.key_condition, "''", "'"); // 第二次後代入從ERP收到之keyCondition object argSCI_Object1 = objRequest; string argpRequestKey1 = "Null"; InXml = CombineRequestXMLbyCDO(ref argSCI_Object1, dtERPSetting.Rows[0]["ERP_Name"].ToString(), "", strServiceName, pRequestKey: argpRequestKey1); objRequest = (iMESCIO.SCI.ERP.Request.SCI_Request_warehouse_get)argSCI_Object1; xmlNodeCnt = XmlDoc.SelectSingleNode("/response/payload/param/data_response/datainfo/parameter/data"); strCnt = xmlNodeCnt.Attributes.GetNamedItem("cnt").Value; strTTcnt = xmlNodeCnt.Attributes.GetNamedItem("tt_cnt").Value; } else { chkStatus = false; aryReturnMessage.Add(OutXml); // 2017-06-26, Joe, 如是中台層的錯誤要往外拋 break; } intloopTimes += 1; } while ((strCnt ?? "") != (strTTcnt ?? "")); // 寫入log table TreatWriteLogTable(colResponseXML, strServiceName); // 寫入MES DB if (chkStatus) { foreach (string strOutXML in colResponseXML) { objResponse.ParseXmlToObject(strOutXML); if (WriteToMESInventoryBasis(objResponse, ref aryReturnMessage) < 0) { if (aryReturnMessage.Count == 0) // 避免不明原因,執行FAIL又沒收集到項目. { aryReturnMessage.Add(strServiceName + ", 庫房主檔拋轉執行失敗!!"); } } } } } catch (Exception EX_AUT) { aryReturnMessage.Add("EX_AUT.Exception" + '\n' + EX_AUT.Message.ToString()); OutXml = EX_AUT.Message.ToString(); results = "fail"; // 執行ERP交易完畢寫入Log string argstrException = null; modAutoRunLibrary.addTransactionLog_ErrorCode(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPInventoryBasis", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), results, "ERP", strServiceName, LogClass: "AutoRun", strException: argstrException); } finally { // -------------------------------------------------- // 回傳執行結果:succces 或 fail(ReturnMessage) // -------------------------------------------------- if (aryReturnMessage.Count == 0) { funMESCallERPInventoryBasisRet = "success"; results = "success"; } else { // 組合執行錯誤字串: Chr(10)分隔 strReturnMessage = ArrayList2String(ref aryReturnMessage); if ((strReturnMessage ?? "") == defString) { // 當錯誤字串組合失敗。補上 strReturnMessage = "ReturnMessage收集失敗!!"; } // tblMESAutoRunLog.ReturnMessage 長度4000限制. string strTemp = ""; if (strReturnMessage.Length > 4000) { // 自 strReturnMessage 中截取0-3991碼. strTemp = strReturnMessage.Substring(0, 3991) + "..."; } else { strTemp = strReturnMessage; } // 更新log table異常資訊 // Dim nodeID As XmlNode = XmlDoc.SelectSingleNode("/response/reqid") UpdateLogTableErrorInfo(colResponseXML, strServiceName, strTemp); // //fail; funMESCallERPInventoryBasisRet = "fail;" + strTemp; } // ===manties:0095454 AutoRun addTransactionLog位置錯誤 需移至Finally 2021/07/06 // 執行ERP交易完畢寫入Log string argstrException = null; modAutoRunLibrary.addTransactionLog(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPInventoryBasis", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), results, "ERP", strServiceName, strException: argstrException); // === //if (daTemp != null) // daTemp.Dispose(); if (drTemp != null) drTemp.Close(); } } while (false); // -------------------------------------------------- // 當執行失敗,寄送 Email。必須有設定參數一。 // -------------------------------------------------- IDbConnection argcnnTemp = null; try { if (aryReturnMessage.Count > 0 && Conversions.ToBoolean(Operators.ConditionalCompareObjectNotEqual(colParameters["Parameter01"], "", false))) { strSubject = "[AUT]庫房主檔-基本資料抛轉失敗! "; strBody = Strings.Replace(strReturnMessage, Conversions.ToString('\n'), "
", Compare: CompareMethod.Text); argcnnTemp = CreateConnection(strConnectionString); // 寄送 Email if (ERP2MES_MailNotice(ref argcnnTemp, ref aryReturnMessage, strSubject, strGroupNo, CInput(strBody)) < 0) { // '寄送不成功, ReturnMessage 再增加1項. // 'ProductIntegration += Chr(10) & aryReturnMessage.Item(aryReturnMessage.Count - 1).ToString // 寄送不成功, ReturnMessage 再增加1項. // tblMESAutoRunLog.ReturnMessage 長度4000限制. if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(funMESCallERPInventoryBasisRet.ToString().Length, 4000, false))) { string strTemp = ""; strTemp = strReturnMessage; if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(strTemp + aryReturnMessage[aryReturnMessage.Count - 1].ToString().Length, 4000, false))) { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); } else { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); // 自 strTemp 中截取0-3991碼. strTemp = strTemp.Substring(0, 3991) + "..."; } // //fail; funMESCallERPInventoryBasisRet = "fail;" + strTemp; } } } } catch (Exception) { throw; } finally { CloseConnection(argcnnTemp); } return funMESCallERPInventoryBasisRet; } // ======================================================================================================================== // 程式名稱:funMESCallERPLocatorBasis // 傳入參數:colParameters // 傳回參數:success(成功), fail(失敗) // 用 途:客戶主檔整合 // 撰寫人員:LiJyun // 撰寫日期:2017/02/08 // ======================================================================================================================== // 為做測試所以Function先改為Public,測試完畢必須改回private private object funMESCallERPLocatorBasis(Collection colParameters = null) { object funMESCallERPLocatorBasisRet = default(object); var XmlDoc = new XmlDocument(); var drTemp = default(DbDataReader); //var daTemp = default(System.Data.OleDb.OleDbDataAdapter); var CollectionSQL = new Collection(); string strSQL; string strServiceName = "storage.spaces.get"; string strGroupNo = ""; // 使用者群組 string strPageSize = "500"; // 分包筆數 string strDate = string.Empty; // 日期迄(如無指定則帶今天) var arriveTime = DateTime.Now; string strCustomerNo, strERP_CustomerNo, strERP_status; string strSubject, strBody; // 寄送通知資訊 // AutorunJob拋轉資訊 string strReturnMessage = ""; // 錯誤訊息(tblMESAutoRunLog.ReturnMessage),Chr(10)分隔錯誤項目。 var aryReturnMessage = new ArrayList(); // Catch Error Message (Exception及MES判定錯誤訊息)。 var colResponseXML = new Collection(); do { try { // ParameterXX參數說明 // 01:Mail通知群組(GroupNo) // 02:分包筆數 // 03:手動重收時填上時間,如沒填則以log tableERP拋回的最後執行時間為主 // Parameter01為傳入參數,作為GroupNo,若無此值則不進行下面的程式 if (!(colParameters["Parameter01"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter01"])))) { strGroupNo = colParameters["Parameter01"].ToString().Trim(); } else { aryReturnMessage.Add(TranslateMsg("Mail GroupNo [%NOT SET%]([%PARAMETER01%])!", strLanguageMode, strResourceDir)); // ===== 2021/05/18 Elvis 92880 break; } // 分包筆數必須為數值型態,Add by KevinChang if (Information.IsNumeric(colParameters["Parameter02"])) { if (!(colParameters["Parameter02"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter02"])))) { // 每封包筆數不可小於500筆,Add by KevinChang if (Conversions.ToInteger(colParameters["Parameter02"]) < 500) { strPageSize = "500"; } else { strPageSize = colParameters["Parameter02"].ToString().Trim(); } } } // Parameter03為傳入參數,作為手動重收時填上時間,若無此值則以log tableERP拋回的最後執行時間為主 if (!(colParameters["Parameter03"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter03"])))) { strDate = GetDate(Conversions.ToString(colParameters["Parameter03"]), "Parameter03"); } else { // 20170316 edit liyujn strDate = GetERPTransactionDate(strServiceName); } // 取得erp資訊 if (!GetERPSetting(ref dtERPSetting, pEAIType: 1)) { aryReturnMessage.Add("Can not found EAI ERP Setting Info (EAI_TYPE = 1)!"); break; } var objResponse = new iMESCIO.SCI.ERP.Response.SCI_Response_storage_spaces_get(); XmlNode xmlNodeCnt; string strCnt; string strTTcnt; bool chkStatus = true; // 抓取其它status為0之資料且塞入colResponseXML GetReTransData(strServiceName, ref colResponseXML); // 判斷『當前回傳筆數』=『應回傳筆數』時才代表為最後一次請求,執行後才進行後續動作 var objRequest = new iMESCIO.SCI.ERP.Request.SCI_Request_storage_spaces_get(); objRequest.page_size = strPageSize; objRequest.data_time = strDate; objRequest.key_condition = ""; // ---- InXml ----- object argSCI_Object = objRequest; string argpRequestKey = "Null"; InXml = CombineRequestXMLbyCDO(ref argSCI_Object, dtERPSetting.Rows[0]["ERP_Name"].ToString(), "", strServiceName, pRequestKey: argpRequestKey); objRequest = (iMESCIO.SCI.ERP.Request.SCI_Request_storage_spaces_get)argSCI_Object; int intloopTimes = 0; do { // 迴圈執行超過5次直接跳出迴圈並回傳錯誤訊息,Add By KevinChang if (intloopTimes >= 5) { throw new Exception("[%THE NUMBER OF SUBCONTRACTS IS SET TOO LITTLE TO CAUSE THE LOOP TO EXECUTE MORE THAN FIVE TIMES%]"); break; } OutXml = string.Empty; OutXml = LoadXmlFileForTest("storage.space.get"); try { if (string.IsNullOrEmpty(OutXml)) { // ----- Call ERP Web Service ----- using (var ws = new iMESCore.Base.Invoke.wsERP_EAI.IntegrationEntry()) { ws.Url = ERP_URL; OutXml = ws.invokeSrv(InXml); } // 2017-05-03, Joe, 轉換單引號 OutXml = OutXml.Replace("'", "''"); } } catch (Exception ex) { OutXml = ex.Message; throw ex; } finally { // 需等到取得所有資料後,再處理後面之動作,故統一將請求完之ResponseXML放入容器內 colResponseXML.Add(OutXml); } XmlDoc.LoadXml(OutXml); // ----- 執行ERP交易完畢紀錄TransactionLog ----- string argstrException = null; modAutoRunLibrary.addTransactionLog(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPLocatorBasis", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), "success", "ERP", strServiceName, strException: argstrException); // 將ERP拋回的資料轉成物件 objResponse.ParseXmlToObject(OutXml); if (objResponse.srvcode == null == false && objResponse.srvcode.Equals("000") && objResponse.code == null == false && objResponse.code.Equals("0")) { objRequest = new iMESCIO.SCI.ERP.Request.SCI_Request_storage_spaces_get(); objRequest.data_time = objResponse.data_time; // 第二次後請求需為回傳之最後拋轉時間 objRequest.page_size = strPageSize; objRequest.key_condition = Strings.Replace(objResponse.key_condition, "''", "'"); // 第二次後代入從ERP收到之keyCondition object argSCI_Object1 = objRequest; string argpRequestKey1 = "Null"; InXml = CombineRequestXMLbyCDO(ref argSCI_Object1, dtERPSetting.Rows[0]["ERP_Name"].ToString(), "", strServiceName, pRequestKey: argpRequestKey1); objRequest = (iMESCIO.SCI.ERP.Request.SCI_Request_storage_spaces_get)argSCI_Object1; xmlNodeCnt = XmlDoc.SelectSingleNode("/response/payload/param/data_response/datainfo/parameter/data"); strCnt = xmlNodeCnt.Attributes.GetNamedItem("cnt").Value; strTTcnt = xmlNodeCnt.Attributes.GetNamedItem("tt_cnt").Value; } else { chkStatus = false; aryReturnMessage.Add(OutXml); // 2017-06-26, Joe, 如是中台層的錯誤要往外拋 break; } intloopTimes += 1; } while ((strCnt ?? "") != (strTTcnt ?? "")); // 寫入log table TreatWriteLogTable(colResponseXML, strServiceName); // 寫入MES DB if (chkStatus) { foreach (string strOutXML in colResponseXML) { objResponse.ParseXmlToObject(strOutXML); if (WriteToMESLocatorBasis(objResponse, ref aryReturnMessage) < 0) { if (aryReturnMessage.Count == 0) // 避免不明原因,執行FAIL又沒收集到項目. { aryReturnMessage.Add(strServiceName + ", 儲位主檔拋轉執行失敗!!"); } } } } } catch (Exception EX_AUT) { aryReturnMessage.Add("EX_AUT.Exception" + '\n' + EX_AUT.Message.ToString()); OutXml = EX_AUT.Message.ToString(); results = "fail"; // 執行ERP交易完畢寫入Log string argstrException = null; modAutoRunLibrary.addTransactionLog_ErrorCode(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPLocatorBasis", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), results, "ERP", strServiceName, LogClass: "AutoRun", strException: argstrException); } finally { // -------------------------------------------------- // 回傳執行結果:succces 或 fail(ReturnMessage) // -------------------------------------------------- if (aryReturnMessage.Count == 0) { funMESCallERPLocatorBasisRet = "success"; results = "success"; } else { // 組合執行錯誤字串: Chr(10)分隔 strReturnMessage = ArrayList2String(ref aryReturnMessage); if ((strReturnMessage ?? "") == defString) { // 當錯誤字串組合失敗。補上 strReturnMessage = "ReturnMessage收集失敗!!"; } // tblMESAutoRunLog.ReturnMessage 長度4000限制. string strTemp = ""; if (strReturnMessage.Length > 4000) { // 自 strReturnMessage 中截取0-3991碼. strTemp = strReturnMessage.Substring(0, 3991) + "..."; } else { strTemp = strReturnMessage; } // 更新log table異常資訊 // Dim nodeID As XmlNode = XmlDoc.SelectSingleNode("/response/reqid") UpdateLogTableErrorInfo(colResponseXML, strServiceName, strTemp); // //fail; funMESCallERPLocatorBasisRet = "fail;" + strTemp; } // ===manties:0095454 AutoRun addTransactionLog位置錯誤 需移至Finally 2021/07/06 // 執行ERP交易完畢寫入Log string argstrException = null; modAutoRunLibrary.addTransactionLog(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPLocatorBasis", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), results, "ERP", strServiceName, strException: argstrException); // === //if (daTemp != null) // daTemp.Dispose(); if (drTemp != null) drTemp.Close(); } } while (false); // -------------------------------------------------- // 當執行失敗,寄送 Email。必須有設定參數一。 // -------------------------------------------------- IDbConnection argcnnTemp = null; try { if (aryReturnMessage.Count > 0 && Conversions.ToBoolean(Operators.ConditionalCompareObjectNotEqual(colParameters["Parameter01"], "", false))) { strSubject = "[AUT]儲位主檔-基本資料抛轉失敗! "; strBody = Strings.Replace(strReturnMessage, Conversions.ToString('\n'), "
", Compare: CompareMethod.Text); argcnnTemp = CreateConnection(strConnectionString); // 寄送 Email if (ERP2MES_MailNotice(ref argcnnTemp, ref aryReturnMessage, strSubject, strGroupNo, CInput(strBody)) < 0) { // '寄送不成功, ReturnMessage 再增加1項. // 'ProductIntegration += Chr(10) & aryReturnMessage.Item(aryReturnMessage.Count - 1).ToString // 寄送不成功, ReturnMessage 再增加1項. // tblMESAutoRunLog.ReturnMessage 長度4000限制. if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(funMESCallERPLocatorBasisRet.ToString().Length, 4000, false))) { string strTemp = ""; strTemp = strReturnMessage; if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(strTemp + aryReturnMessage[aryReturnMessage.Count - 1].ToString().Length, 4000, false))) { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); } else { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); // 自 strTemp 中截取0-3991碼. strTemp = strTemp.Substring(0, 3991) + "..."; } // //fail; funMESCallERPLocatorBasisRet = "fail;" + strTemp; } } } } catch (Exception) { throw; } finally { CloseConnection(argcnnTemp); } return funMESCallERPLocatorBasisRet; } // ======================================================================================================================== // 程式名稱:funMESCallERPDepartmentBasis // 傳入參數:colParameters // 傳回參數:success(成功), fail(失敗) // 用 途:客戶主檔整合 // 撰寫人員:LiJyun // 撰寫日期:2017/02/08 // ======================================================================================================================== // 為做測試所以Function先改為Public,測試完畢必須改回private private object funMESCallERPDepartmentBasis(Collection colParameters = null) { object funMESCallERPDepartmentBasisRet = default(object); var XmlDoc = new XmlDocument(); var drTemp = default(DbDataReader); //var daTemp = default(System.Data.OleDb.OleDbDataAdapter); var CollectionSQL = new Collection(); string strSQL; string strServiceName = "department.get"; string strGroupNo = ""; // 使用者群組 string strPageSize = "500"; // 分包筆數 string strDate = string.Empty; // 日期迄(如無指定則帶今天) var arriveTime = DateTime.Now; string strCustomerNo, strERP_CustomerNo, strERP_status; string strSubject, strBody; // 寄送通知資訊 // AutorunJob拋轉資訊 string strReturnMessage = ""; // 錯誤訊息(tblMESAutoRunLog.ReturnMessage),Chr(10)分隔錯誤項目。 var aryReturnMessage = new ArrayList(); // Catch Error Message (Exception及MES判定錯誤訊息)。 var colResponseXML = new Collection(); do { try { // ParameterXX參數說明 // 01:Mail通知群組(GroupNo) // 02:分包筆數 // 03:手動重收時填上時間,如沒填則以log tableERP拋回的最後執行時間為主 // Parameter01為傳入參數,作為GroupNo,若無此值則不進行下面的程式 if (!(colParameters["Parameter01"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter01"])))) { strGroupNo = colParameters["Parameter01"].ToString().Trim(); } else { aryReturnMessage.Add(TranslateMsg("Mail GroupNo [%NOT SET%]([%PARAMETER01%])!", strLanguageMode, strResourceDir)); // ===== 2021/05/18 Elvis 92880 break; } // 分包筆數必須為數值型態,Add by KevinChang if (Information.IsNumeric(colParameters["Parameter02"])) { if (!(colParameters["Parameter02"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter02"])))) { // 每封包筆數不可小於500筆,Add by KevinChang if (Conversions.ToInteger(colParameters["Parameter02"]) < 500) { strPageSize = "500"; } else { strPageSize = colParameters["Parameter02"].ToString().Trim(); } } } // Parameter03為傳入參數,作為手動重收時填上時間,若無此值則以log tableERP拋回的最後執行時間為主 if (!(colParameters["Parameter03"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter03"])))) { strDate = GetDate(Conversions.ToString(colParameters["Parameter03"]), "Parameter03"); } else { // 20170316 edit liyujn strDate = GetERPTransactionDate(strServiceName); } // 取得erp資訊 if (!GetERPSetting(ref dtERPSetting, pEAIType: 1)) { aryReturnMessage.Add("Can not found EAI ERP Setting Info (EAI_TYPE = 1)!"); break; } var objResponse = new iMESCIO.SCI.ERP.Response.SCI_Response_department_get(); XmlNode xmlNodeCnt; string strCnt; string strTTcnt; bool chkStatus = true; // 抓取其它status為0之資料且塞入colResponseXML GetReTransData(strServiceName, ref colResponseXML); // 判斷『當前回傳筆數』=『應回傳筆數』時才代表為最後一次請求,執行後才進行後續動作 var objRequest = new iMESCIO.SCI.ERP.Request.SCI_Request_department_get(); objRequest.page_size = strPageSize; objRequest.data_time = strDate; objRequest.key_condition = ""; // ---- InXml ----- object argSCI_Object = objRequest; string argpRequestKey = "Null"; InXml = CombineRequestXMLbyCDO(ref argSCI_Object, dtERPSetting.Rows[0]["ERP_Name"].ToString(), "", strServiceName, pRequestKey: argpRequestKey); objRequest = (iMESCIO.SCI.ERP.Request.SCI_Request_department_get)argSCI_Object; int intloopTimes = 0; do { // 迴圈執行超過5次直接跳出迴圈並回傳錯誤訊息,Add By KevinChang if (intloopTimes >= 5) { throw new Exception("[%THE NUMBER OF SUBCONTRACTS IS SET TOO LITTLE TO CAUSE THE LOOP TO EXECUTE MORE THAN FIVE TIMES%]"); break; } OutXml = string.Empty; OutXml = LoadXmlFileForTest("department.get"); try { if (string.IsNullOrEmpty(OutXml)) { // ----- Call ERP Web Service ----- using (var ws = new iMESCore.Base.Invoke.wsERP_EAI.IntegrationEntry()) { ws.Url = ERP_URL; OutXml = ws.invokeSrv(InXml); } // 2017-05-03, Joe, 轉換單引號 OutXml = OutXml.Replace("'", "''"); } } catch (Exception ex) { OutXml = ex.Message; throw ex; } finally { // 需等到取得所有資料後,再處理後面之動作,故統一將請求完之ResponseXML放入容器內 colResponseXML.Add(OutXml); } XmlDoc.LoadXml(OutXml); // ----- 執行ERP交易完畢紀錄TransactionLog ----- string argstrException = null; modAutoRunLibrary.addTransactionLog(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPDepartmentBasis", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), "success", "ERP", strServiceName, strException: argstrException); // 將ERP拋回的資料轉成物件 objResponse.ParseXmlToObject(OutXml); if (objResponse.srvcode == null == false && objResponse.srvcode.Equals("000") && objResponse.code == null == false && objResponse.code.Equals("0")) { objRequest = new iMESCIO.SCI.ERP.Request.SCI_Request_department_get(); objRequest.data_time = objResponse.data_time; // 第二次後請求需為回傳之最後拋轉時間 objRequest.page_size = strPageSize; objRequest.key_condition = Strings.Replace(objResponse.key_condition, "''", "'"); // 第二次後代入從ERP收到之keyCondition object argSCI_Object1 = objRequest; string argpRequestKey1 = "Null"; InXml = CombineRequestXMLbyCDO(ref argSCI_Object1, dtERPSetting.Rows[0]["ERP_Name"].ToString(), "", strServiceName, pRequestKey: argpRequestKey1); objRequest = (iMESCIO.SCI.ERP.Request.SCI_Request_department_get)argSCI_Object1; xmlNodeCnt = XmlDoc.SelectSingleNode("/response/payload/param/data_response/datainfo/parameter/data"); strCnt = xmlNodeCnt.Attributes.GetNamedItem("cnt").Value; strTTcnt = xmlNodeCnt.Attributes.GetNamedItem("tt_cnt").Value; } else { chkStatus = false; aryReturnMessage.Add(OutXml); // 2017-06-26, Joe, 如是中台層的錯誤要往外拋 break; } intloopTimes += 1; } while ((strCnt ?? "") != (strTTcnt ?? "")); // 寫入log table TreatWriteLogTable(colResponseXML, strServiceName); // 寫入MES DB if (chkStatus) { foreach (string strOutXML in colResponseXML) { objResponse.ParseXmlToObject(strOutXML); if (WriteToMESDepartmentBasis(objResponse, ref aryReturnMessage) < 0) { if (aryReturnMessage.Count == 0) // 避免不明原因,執行FAIL又沒收集到項目. { aryReturnMessage.Add(strServiceName + ", 部門主檔拋轉執行失敗!!"); } } } } } catch (Exception EX_AUT) { aryReturnMessage.Add("EX_AUT.Exception" + '\n' + EX_AUT.Message.ToString()); OutXml = EX_AUT.Message.ToString(); results = "fail"; // 執行ERP交易完畢寫入Log string argstrException = null; modAutoRunLibrary.addTransactionLog_ErrorCode(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPDepartmentBasis", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), results, "ERP", strServiceName, LogClass: "AutoRun", strException: argstrException); } finally { // -------------------------------------------------- // 回傳執行結果:succces 或 fail(ReturnMessage) // -------------------------------------------------- if (aryReturnMessage.Count == 0) { funMESCallERPDepartmentBasisRet = "success"; results = "success"; } else { // 組合執行錯誤字串: Chr(10)分隔 strReturnMessage = ArrayList2String(ref aryReturnMessage); if ((strReturnMessage ?? "") == defString) { // 當錯誤字串組合失敗。補上 strReturnMessage = "ReturnMessage收集失敗!!"; } // tblMESAutoRunLog.ReturnMessage 長度4000限制. string strTemp = ""; if (strReturnMessage.Length > 4000) { // 自 strReturnMessage 中截取0-3991碼. strTemp = strReturnMessage.Substring(0, 3991) + "..."; } else { strTemp = strReturnMessage; } // 更新log table異常資訊 // Dim nodeID As XmlNode = XmlDoc.SelectSingleNode("/response/reqid") UpdateLogTableErrorInfo(colResponseXML, strServiceName, strTemp); // //fail; funMESCallERPDepartmentBasisRet = "fail;" + strTemp; } // ===manties:0095454 AutoRun addTransactionLog位置錯誤 需移至Finally 2021/07/06 // 執行ERP交易完畢寫入Log string argstrException = null; modAutoRunLibrary.addTransactionLog(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPDepartmentBasis", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), results, "ERP", strServiceName, strException: argstrException); // === //if (daTemp != null) // daTemp.Dispose(); if (drTemp != null) drTemp.Close(); } } while (false); // -------------------------------------------------- // 當執行失敗,寄送 Email。必須有設定參數一。 // -------------------------------------------------- IDbConnection argcnnTemp = null; try { if (aryReturnMessage.Count > 0 && Conversions.ToBoolean(Operators.ConditionalCompareObjectNotEqual(colParameters["Parameter01"], "", false))) { strSubject = "[AUT]部門主檔-基本資料抛轉失敗! "; strBody = Strings.Replace(strReturnMessage, Conversions.ToString('\n'), "
", Compare: CompareMethod.Text); argcnnTemp = CreateConnection(strConnectionString); // 寄送 Email if (ERP2MES_MailNotice(ref argcnnTemp, ref aryReturnMessage, strSubject, strGroupNo, CInput(strBody)) < 0) { // '寄送不成功, ReturnMessage 再增加1項. // 'ProductIntegration += Chr(10) & aryReturnMessage.Item(aryReturnMessage.Count - 1).ToString // 寄送不成功, ReturnMessage 再增加1項. // tblMESAutoRunLog.ReturnMessage 長度4000限制. if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(funMESCallERPDepartmentBasisRet.ToString().Length, 4000, false))) { string strTemp = ""; strTemp = strReturnMessage; if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(strTemp + aryReturnMessage[aryReturnMessage.Count - 1].ToString().Length, 4000, false))) { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); } else { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); // 自 strTemp 中截取0-3991碼. strTemp = strTemp.Substring(0, 3991) + "..."; } // //fail; funMESCallERPDepartmentBasisRet = "fail;" + strTemp; } } } } catch (Exception) { throw; } finally { CloseConnection(argcnnTemp); } return funMESCallERPDepartmentBasisRet; } // ======================================================================================================================== // 程式名稱:funMESCallERPShiftBasis // 傳入參數:colParameters // 傳回參數:success(成功), fail(失敗) // 用 途:班別主檔整合 // 撰寫人員:敬翔 // 撰寫日期:2017/02/08 // ======================================================================================================================== private object funMESCallERPShiftBasis(Collection colParameters = null) { object funMESCallERPShiftBasisRet = default(object); var drTemp = default(DbDataReader); string strSQL; var XmlDoc = new XmlDocument(); //var daTemp = default(System.Data.OleDb.OleDbDataAdapter); var CollectionSQL = new Collection(); var colResponseXML = new Collection(); var arriveTime = DateTime.Now; string strServiceName = "shift.get"; // =========================================================== // 宣告 AutoRunJob設定及執行記錄 變數 // =========================================================== string strParameter01 = ""; // 參數一,預設此功能fail通知EMAIL群組。 string strPageSize = "500"; // 參數二,分包筆數 string strDate; // 參數三,手動重收時填上時間,如沒填則以log tableERP拋回的最後執行時間為主 // AutorunJob拋轉資訊 string strReturnMessage = ""; // 錯誤訊息(tblMESAutoRunLog.ReturnMessage),Chr(10)分隔錯誤項目。 var aryReturnMessage = new ArrayList(); // Catch Error Message (Exception及MES判定錯誤訊息)。 string strSubject, strBody; // 寄送通知資訊 XmlNode node = null; string strReqid = ""; string strCnt = defString; string strTTcnt = ""; var datArriveTime = DateTime.Now; do { try { // Parameter01為傳入參數,作為SheetType,若無此值則不進行下面的程式 if (!(colParameters["Parameter01"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter01"])))) { strParameter01 = colParameters["Parameter01"].ToString().Trim(); } else { aryReturnMessage.Add(TranslateMsg("Mail GroupNo [%NOT SET%]!", strLanguageMode, strResourceDir)); break; } // 分包筆數必須為數值型態,Add by KevinChang if (Information.IsNumeric(colParameters["Parameter02"])) { if (!(colParameters["Parameter02"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter02"])))) { // 每封包筆數不可小於500筆,Add by KevinChang if (Conversions.ToInteger(colParameters["Parameter02"]) < 500) { strPageSize = "500"; } else { strPageSize = colParameters["Parameter02"].ToString().Trim(); } } } // Parameter03為傳入參數,作為ProductionDate,若無此值則用昨天當日期 if (!(colParameters["Parameter03"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter03"])))) { strDate = GetDate(Conversions.ToString(colParameters["Parameter03"]), "Parameter03"); } else { // 20170316 edit liyujn strDate = GetERPTransactionDate(strServiceName); } // 取得erp資訊 if (!GetERPSetting(ref dtERPSetting, pEAIType: 1)) { aryReturnMessage.Add(TranslateMsg("[%PleaseCheck%] EAI ERP Setting Info [%CONFIGSETTING%]!", strLanguageMode, strResourceDir)); break; } var objResponse = new iMESCIO.SCI.ERP.Response.SCI_Response_shift_get(); XmlNode xmlNodeCnt; bool chkStatus = true; // 抓取其它status為0之資料且塞入colResponseXML GetReTransData(strServiceName, ref colResponseXML); // 判斷『當前回傳筆數』=『應回傳筆數』時才代表為最後一次請求,執行後才進行後續動作 var objMaster = new iMESCIO.SCI.ERP.Request.SCI_Request_shift_get(); objMaster.data_time = strDate; objMaster.page_size = strPageSize; objMaster.key_condition = ""; object argSCI_Object = objMaster; string argpRequestKey = "Null"; InXml = CombineRequestXMLbyCDO(ref argSCI_Object, dtERPSetting.Rows[0]["ERP_Name"].ToString(), "", "shift.get", pRequestKey: argpRequestKey); objMaster = (iMESCIO.SCI.ERP.Request.SCI_Request_shift_get)argSCI_Object; int intloopTimes = 0; do { // 迴圈執行超過5次直接跳出迴圈並回傳錯誤訊息,Add By KevinChang if (intloopTimes >= 5) { throw new Exception("[%THE NUMBER OF SUBCONTRACTS IS SET TOO LITTLE TO CAUSE THE LOOP TO EXECUTE MORE THAN FIVE TIMES%]"); break; } OutXml = string.Empty; OutXml = LoadXmlFileForTest("shift.get"); try { if (string.IsNullOrEmpty(OutXml)) { // ----- Call ERP Web Service ----- using (var ws = new iMESCore.Base.Invoke.wsERP_EAI.IntegrationEntry()) { ws.Url = ERP_URL; OutXml = ws.invokeSrv(InXml); } // 2017-05-03, Joe, 轉換單引號 OutXml = OutXml.Replace("'", "''"); } } catch (Exception ex) { OutXml = ex.Message; throw ex; } finally { // 需等到取得所有資料後,再處理後面之動作,故統一將請求完之ResponseXML放入容器內 colResponseXML.Add(OutXml); } XmlDoc.LoadXml(OutXml); string argstrException = null; modAutoRunLibrary.addTransactionLog(InXml, OutXml, DateTime.Now.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPShiftBasis", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), "success", "ERP", strServiceName, strException: argstrException); // 將ERP拋回的資料轉成物件 objResponse.ParseXmlToObject(OutXml); if (objResponse.srvcode == null == false && objResponse.srvcode.Equals("000") && objResponse.code == null == false && objResponse.code.Equals("0")) { objMaster = new iMESCIO.SCI.ERP.Request.SCI_Request_shift_get(); objMaster.data_time = objResponse.data_time; // 第二次後請求需為回傳之最後拋轉時間 objMaster.page_size = strPageSize; objMaster.key_condition = Strings.Replace(objResponse.key_condition, "''", "'"); // 第二次後代入從ERP收到之keyCondition object argSCI_Object1 = objMaster; string argpRequestKey1 = "Null"; InXml = CombineRequestXMLbyCDO(ref argSCI_Object1, dtERPSetting.Rows[0]["ERP_Name"].ToString(), "", "shift.get", pRequestKey: argpRequestKey1); objMaster = (iMESCIO.SCI.ERP.Request.SCI_Request_shift_get)argSCI_Object1; xmlNodeCnt = XmlDoc.SelectSingleNode("/response/payload/param/data_response/datainfo/parameter/data"); strCnt = xmlNodeCnt.Attributes.GetNamedItem("cnt").Value; strTTcnt = xmlNodeCnt.Attributes.GetNamedItem("tt_cnt").Value; } else { chkStatus = false; aryReturnMessage.Add(OutXml); // 2017-06-26, Joe, 如是中台層的錯誤要往外拋 break; } intloopTimes += 1; } while ((strCnt ?? "") != (strTTcnt ?? "")); // 寫入Log Table TreatWriteLogTable(colResponseXML, strServiceName); // 寫入MES DB if (chkStatus) { foreach (string strOutXML in colResponseXML) { objResponse.ParseXmlToObject(strOutXML); if (WriteShiftBasis(objResponse, ref aryReturnMessage) < 0) { if (aryReturnMessage.Count == 0) // 避免不明原因,執行FAIL又沒收集到項目. { aryReturnMessage.Add(TranslateMsg("shift_get, [%INVOKE FAIL%]!", strLanguageMode, strResourceDir)); } } } } } // CollectionSQL = Nothing // XmlDoc = Nothing catch (Exception EX_AUT) { aryReturnMessage.Add("EX_AUT.Exception" + '\n' + EX_AUT.Message.ToString()); OutXml = EX_AUT.Message.ToString(); results = "fail"; // ----- 執行ERP交易完畢紀錄TransactionLog ----- string argstrException = null; modAutoRunLibrary.addTransactionLog_ErrorCode(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "MES", "MESCallERPShiftBasis", Environment.MachineName, "AutoRun", arriveTime.ToString("yyyy/MM/dd HH:mm:ss"), results, "", strServiceName, LogClass: "AutoRun", strException: argstrException); // 2013/02/05, Hank, Send Email colParameters.Add(funMESCallERPShiftBasisRet, "EmailBody"); SendJobFailEmail(colParameters); } finally { // -------------------------------------------------- // 回傳執行結果:succces 或 fail(ReturnMessage) // -------------------------------------------------- if (aryReturnMessage.Count == 0) { funMESCallERPShiftBasisRet = "success"; results = "success"; } else { // 組合執行錯誤字串: Chr(10)分隔 strReturnMessage = ArrayList2String(ref aryReturnMessage); if ((strReturnMessage ?? "") == defString) { // 當錯誤字串組合失敗。補上 strReturnMessage = "ReturnMessage收集失敗!!"; } // tblMESAutoRunLog.ReturnMessage 長度4000限制. string strTemp = ""; if (strReturnMessage.Length > 4000) { // 自 strReturnMessage 中截取0-3991碼. strTemp = strReturnMessage.Substring(0, 3991) + "..."; } else { strTemp = strReturnMessage; } // 更新log table異常資訊 // Dim nodeID As XmlNode = XmlDoc.SelectSingleNode("/response/reqid") UpdateLogTableErrorInfo(colResponseXML, strServiceName, strTemp); // //fail; funMESCallERPShiftBasisRet = CombineFailMsg("0000-999999", strTemp); } // ===manties:0095454 AutoRun addTransactionLog位置錯誤 需移至Finally 2021/07/06 // ----- 執行ERP交易完畢紀錄TransactionLog ----- string argstrException = null; modAutoRunLibrary.addTransactionLog(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "MES", "MESCallERPShiftBasis", Environment.MachineName, "AutoRun", arriveTime.ToString("yyyy/MM/dd HH:mm:ss"), results, "", strServiceName, strException: argstrException); // === //if (daTemp != null) // daTemp.Dispose(); if (drTemp != null) drTemp.Close(); } } while (false); // 當執行失敗 寄送 Email 必須有設定參數一 IDbConnection argcnnTemp = null; try { if (aryReturnMessage.Count > 0 && Conversions.ToBoolean(Operators.ConditionalCompareObjectNotEqual(colParameters["Parameter01"], "", false))) { strSubject = "[AUT]班別-基本資料拋轉失敗! "; strBody = Strings.Replace(strReturnMessage, Conversions.ToString('\n'), "
", Compare: CompareMethod.Text); argcnnTemp = CreateConnection(strConnectionString); // 寄送 Email if (ERP2MES_MailNotice(ref argcnnTemp, ref aryReturnMessage, strSubject, Conversions.ToString(colParameters["Parameter01"]), CInput(strBody)) < 0) { // '寄送不成功, ReturnMessage 再增加1項. // 'ProductIntegration += Chr(10) & aryReturnMessage.Item(aryReturnMessage.Count - 1).ToString // 寄送不成功, ReturnMessage 再增加1項. // tblMESAutoRunLog.ReturnMessage 長度4000限制. if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(funMESCallERPShiftBasisRet.ToString().Length, 4000, false))) { string strTemp = ""; strTemp = strReturnMessage; if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(strTemp + aryReturnMessage[aryReturnMessage.Count - 1].ToString().Length, 4000, false))) { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); } else { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); // 自 strTemp 中截取0-3991碼. strTemp = strTemp.Substring(0, 3991) + "..."; } // //fail; funMESCallERPShiftBasisRet = CombineFailMsg("0000-999999", strTemp); } } } } catch (Exception) { throw; } finally { CloseConnection(argcnnTemp); } return funMESCallERPShiftBasisRet; } // ======================================================================================================================== // 程式名稱:funMESCallERPOPBasis // 傳入參數:colParameters // 傳回參數:success(成功), fail(失敗) // 用 途:作業站主檔整合 // 撰寫人員:敬翔 // 撰寫日期:2017/02/08 // ======================================================================================================================== private object funMESCallERPOPBasis(Collection colParameters = null) { object funMESCallERPOPBasisRet = default(object); var drTemp = default(DbDataReader); string strSQL; var XmlDoc = new XmlDocument(); //var daTemp = default(System.Data.OleDb.OleDbDataAdapter); var CollectionSQL = new Collection(); var colResponseXML = new Collection(); var arriveTime = DateTime.Now; string strServiceName = "op.get"; // =========================================================== // 宣告 AutoRunJob設定及執行記錄 變數 // =========================================================== string strParameter01 = ""; // 參數一,預設此功能fail通知EMAIL群組。 string strPageSize = "500"; // 參數二,分包筆數 string strDate; // 參數三,手動重收時填上時間,如沒填則以log tableERP拋回的最後執行時間為主 // AutorunJob拋轉資訊 string strReturnMessage = ""; // 錯誤訊息(tblMESAutoRunLog.ReturnMessage),Chr(10)分隔錯誤項目。 var aryReturnMessage = new ArrayList(); // Catch Error Message (Exception及MES判定錯誤訊息)。 string strSubject, strBody; // 寄送通知資訊 XmlNode node = null; string strReqid = ""; string strCnt = defString; string strTTcnt = ""; var datArriveTime = DateTime.Now; do { try { // Parameter01為傳入參數,作為SheetType,若無此值則不進行下面的程式 if (!(colParameters["Parameter01"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter01"])))) { strParameter01 = colParameters["Parameter01"].ToString().Trim(); } else { aryReturnMessage.Add(TranslateMsg("Mail GroupNo [%NOT SET%]([%PARAMETER01%])!", strLanguageMode, strResourceDir)); // ===== 2021/05/18 Elvis 92880 break; } // 分包筆數必須為數值型態,Add by KevinChang if (Information.IsNumeric(colParameters["Parameter02"])) { if (!(colParameters["Parameter02"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter02"])))) { // 每封包筆數不可小於500筆,Add by KevinChang if (Conversions.ToInteger(colParameters["Parameter02"]) < 500) { strPageSize = "500"; } else { strPageSize = colParameters["Parameter02"].ToString().Trim(); } } } // Parameter03為傳入參數,作為ProductionDate,若無此值則用昨天當日期 if (!(colParameters["Parameter03"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter03"])))) { strDate = GetDate(Conversions.ToString(colParameters["Parameter03"]), "Parameter03"); } else { // 20170316 edit liyujn strDate = GetERPTransactionDate(strServiceName); } // 取得erp資訊 if (!GetERPSetting(ref dtERPSetting, pEAIType: 1)) { aryReturnMessage.Add(TranslateMsg("[%PleaseCheck%] EAI ERP Setting Info [%CONFIGSETTING%]!", strLanguageMode, strResourceDir)); break; } var objResponse = new iMESCIO.SCI.ERP.Response.SCI_Response_op_get(); XmlNode xmlNodeCnt; bool chkStatus = true; // 抓取其它status為0之資料且塞入colResponseXML GetReTransData(strServiceName, ref colResponseXML); // 判斷『當前回傳筆數』=『應回傳筆數』時才代表為最後一次請求,執行後才進行後續動作 var objMaster = new iMESCIO.SCI.ERP.Request.SCI_Request_op_get(); objMaster.data_time = strDate; objMaster.page_size = strPageSize; objMaster.key_condition = ""; object argSCI_Object = objMaster; string argpRequestKey = "Null"; InXml = CombineRequestXMLbyCDO(ref argSCI_Object, dtERPSetting.Rows[0]["ERP_Name"].ToString(), "", "op.get", pRequestKey: argpRequestKey); objMaster = (iMESCIO.SCI.ERP.Request.SCI_Request_op_get)argSCI_Object; int intloopTimes = 0; do { // 迴圈執行超過5次直接跳出迴圈並回傳錯誤訊息,Add By KevinChang if (intloopTimes >= 5) { throw new Exception("[%THE NUMBER OF SUBCONTRACTS IS SET TOO LITTLE TO CAUSE THE LOOP TO EXECUTE MORE THAN FIVE TIMES%]"); break; } OutXml = string.Empty; OutXml = LoadXmlFileForTest("op.get"); try { if (string.IsNullOrEmpty(OutXml)) { // ----- Call ERP Web Service ----- using (var ws = new iMESCore.Base.Invoke.wsERP_EAI.IntegrationEntry()) { ws.Url = ERP_URL; OutXml = ws.invokeSrv(InXml); } // 2017-05-03, Joe, 轉換單引號 OutXml = OutXml.Replace("'", "''"); } } catch (Exception ex) { OutXml = ex.Message; throw ex; } finally { // 需等到取得所有資料後,再處理後面之動作,故統一將請求完之ResponseXML放入容器內 colResponseXML.Add(OutXml); } XmlDoc.LoadXml(OutXml); string argstrException = null; modAutoRunLibrary.addTransactionLog(InXml, OutXml, DateTime.Now.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPOPBasis", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), "success", "ERP", strServiceName, strException: argstrException); // 將ERP拋回的資料轉成物件 objResponse.ParseXmlToObject(OutXml); if (objResponse.srvcode == null == false && objResponse.srvcode.Equals("000") && objResponse.code == null == false && objResponse.code.Equals("0")) { objMaster = new iMESCIO.SCI.ERP.Request.SCI_Request_op_get(); objMaster.data_time = objResponse.data_time; // 第二次後請求需為回傳之最後拋轉時間 objMaster.page_size = strPageSize; objMaster.key_condition = Strings.Replace(objResponse.key_condition, "''", "'"); // 第二次後代入從ERP收到之keyCondition object argSCI_Object1 = objMaster; string argpRequestKey1 = "Null"; InXml = CombineRequestXMLbyCDO(ref argSCI_Object1, dtERPSetting.Rows[0]["ERP_Name"].ToString(), "", "op.get", pRequestKey: argpRequestKey1); objMaster = (iMESCIO.SCI.ERP.Request.SCI_Request_op_get)argSCI_Object1; xmlNodeCnt = XmlDoc.SelectSingleNode("/response/payload/param/data_response/datainfo/parameter/data"); strCnt = xmlNodeCnt.Attributes.GetNamedItem("cnt").Value; strTTcnt = xmlNodeCnt.Attributes.GetNamedItem("tt_cnt").Value; } else { chkStatus = false; aryReturnMessage.Add(OutXml); // 2017-06-26, Joe, 如是中台層的錯誤要往外拋 break; } intloopTimes += 1; } while ((strCnt ?? "") != (strTTcnt ?? "")); // 寫入Log Table TreatWriteLogTable(colResponseXML, strServiceName); // 寫入MES DB if (chkStatus) { foreach (string strOutXML in colResponseXML) { objResponse.ParseXmlToObject(strOutXML); if (WriteOPBasis(objResponse, ref aryReturnMessage) < 0) { if (aryReturnMessage.Count == 0) // 避免不明原因,執行FAIL又沒收集到項目. { aryReturnMessage.Add(TranslateMsg("op_get, [%INVOKE FAIL%]!", strLanguageMode, strResourceDir)); } } } } } // CollectionSQL = Nothing // XmlDoc = Nothing catch (Exception EX_AUT) { aryReturnMessage.Add("EX_AUT.Exception" + '\n' + EX_AUT.Message.ToString()); OutXml = EX_AUT.Message.ToString(); // ----- 執行ERP交易完畢紀錄TransactionLog ----- string argstrException = null; modAutoRunLibrary.addTransactionLog_ErrorCode(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "MES", "MESCallERPOPBasis", Environment.MachineName, "AutoRun", arriveTime.ToString("yyyy/MM/dd HH:mm:ss"), "fail", "", "CreateMESCallERPOPBasis", LogClass: "AutoRun", strException: argstrException); // 2013/02/05, Hank, Send Email colParameters.Add(funMESCallERPOPBasisRet, "EmailBody"); SendJobFailEmail(colParameters); } finally { // -------------------------------------------------- // 回傳執行結果:succces 或 fail(ReturnMessage) // -------------------------------------------------- if (aryReturnMessage.Count == 0) { funMESCallERPOPBasisRet = "success"; } else { // 組合執行錯誤字串: Chr(10)分隔 strReturnMessage = ArrayList2String(ref aryReturnMessage); if ((strReturnMessage ?? "") == defString) { // 當錯誤字串組合失敗。補上 strReturnMessage = "ReturnMessage收集失敗!!"; } // tblMESAutoRunLog.ReturnMessage 長度4000限制. string strTemp = ""; if (strReturnMessage.Length > 4000) { // 自 strReturnMessage 中截取0-3991碼. strTemp = strReturnMessage.Substring(0, 3991) + "..."; } else { strTemp = strReturnMessage; } // 更新log table異常資訊 // Dim nodeID As XmlNode = XmlDoc.SelectSingleNode("/response/reqid") UpdateLogTableErrorInfo(colResponseXML, strServiceName, strTemp); // //fail; funMESCallERPOPBasisRet = "fail;" + strTemp; } // ----- 執行ERP交易完畢紀錄TransactionLog ----- string argstrException = null; modAutoRunLibrary.addTransactionLog(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "MES", "MESCallERPOPBasis", Environment.MachineName, "AutoRun", arriveTime.ToString("yyyy/MM/dd HH:mm:ss"), "fail", "", "CreateMESCallERPOPBasis", strException: argstrException); //if (daTemp != null) // daTemp.Dispose(); if (drTemp != null) drTemp.Close(); } } while (false); // 當執行失敗 寄送 Email 必須有設定參數一 IDbConnection argcnnTemp = null; try { if (aryReturnMessage.Count > 0 && Conversions.ToBoolean(Operators.ConditionalCompareObjectNotEqual(colParameters["Parameter01"], "", false))) { strSubject = "[AUT]作業站-基本資料抛轉失敗! "; strBody = Strings.Replace(strReturnMessage, Conversions.ToString('\n'), "
", Compare: CompareMethod.Text); argcnnTemp = CreateConnection(strConnectionString); // 寄送 Email if (ERP2MES_MailNotice(ref argcnnTemp, ref aryReturnMessage, strSubject, Conversions.ToString(colParameters["Parameter01"]), CInput(strBody)) < 0) { // '寄送不成功, ReturnMessage 再增加1項. // 'ProductIntegration += Chr(10) & aryReturnMessage.Item(aryReturnMessage.Count - 1).ToString // 寄送不成功, ReturnMessage 再增加1項. // tblMESAutoRunLog.ReturnMessage 長度4000限制. if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(funMESCallERPOPBasisRet.ToString().Length, 4000, false))) { string strTemp = ""; strTemp = strReturnMessage; if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(strTemp + aryReturnMessage[aryReturnMessage.Count - 1].ToString().Length, 4000, false))) { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); } else { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); // 自 strTemp 中截取0-3991碼. strTemp = strTemp.Substring(0, 3991) + "..."; } // //fail; funMESCallERPOPBasisRet = "fail;" + strTemp; } } } } catch (Exception) { throw; } finally { CloseConnection(argcnnTemp); } return funMESCallERPOPBasisRet; } // ======================================================================================================================== // 程式名稱:funMESCallERPOPGroupBasis // 傳入參數:colParameters // 傳回參數:success(成功), fail(失敗) // 用 途:工作站主檔整合 // 撰寫人員:敬翔 // 撰寫日期:2017/02/08 // ======================================================================================================================== private object funMESCallERPOPGroupBasis(Collection colParameters = null) { object funMESCallERPOPGroupBasisRet = default(object); var drTemp = default(DbDataReader); string strSQL; var XmlDoc = new XmlDocument(); //var daTemp = default(System.Data.OleDb.OleDbDataAdapter); var CollectionSQL = new Collection(); var colResponseXML = new Collection(); var arriveTime = DateTime.Now; string strServiceName = "workstation.get"; // =========================================================== // 宣告 AutoRunJob設定及執行記錄 變數 // =========================================================== string strParameter01 = ""; // 參數一,預設此功能fail通知EMAIL群組。 string strPageSize = "500"; // 參數二,分包筆數 string strDate; // 參數三,手動重收時填上時間,如沒填則以log tableERP拋回的最後執行時間為主 // AutorunJob拋轉資訊 string strReturnMessage = ""; // 錯誤訊息(tblMESAutoRunLog.ReturnMessage),Chr(10)分隔錯誤項目。 var aryReturnMessage = new ArrayList(); // Catch Error Message (Exception及MES判定錯誤訊息)。 string strSubject, strBody; // 寄送通知資訊 XmlNode node = null; string strReqid = ""; string strCnt = defString; string strTTcnt = ""; var datArriveTime = DateTime.Now; do { try { // Parameter01為傳入參數,作為E-mail,若無此值則不進行下面的程式 if (!(colParameters["Parameter01"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter01"])))) { strParameter01 = colParameters["Parameter01"].ToString().Trim(); } else { aryReturnMessage.Add(TranslateMsg("Mail GroupNo [%NOT SET%]([%PARAMETER01%])!", strLanguageMode, strResourceDir)); // ===== 2021/05/18 Elvis 92880 break; } // 分包筆數必須為數值型態,Add by KevinChang if (Information.IsNumeric(colParameters["Parameter02"])) { if (!(colParameters["Parameter02"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter02"])))) { // 每封包筆數不可小於500筆,Add by KevinChang if (Conversions.ToInteger(colParameters["Parameter02"]) < 500) { strPageSize = "500"; } else { strPageSize = colParameters["Parameter02"].ToString().Trim(); } } } // Parameter03為傳入參數,作為ProductionDate,若無此值則用昨天當日期 if (!(colParameters["Parameter03"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter03"])))) { strDate = GetDate(Conversions.ToString(colParameters["Parameter03"]), "Parameter03"); } else { // 20170316 edit liyujn strDate = GetERPTransactionDate(strServiceName); } // 取得erp資訊 if (!GetERPSetting(ref dtERPSetting, pEAIType: 1)) { aryReturnMessage.Add(TranslateMsg("[%PleaseCheck%] EAI ERP Setting Info [%CONFIGSETTING%]!", strLanguageMode, strResourceDir)); break; } var objResponse = new iMESCIO.SCI.ERP.Response.SCI_Response_workstation_get(); XmlNode xmlNodeCnt; bool chkStatus = true; // 抓取其它status為0之資料且塞入colResponseXML GetReTransData(strServiceName, ref colResponseXML); // 判斷『當前回傳筆數』=『應回傳筆數』時才代表為最後一次請求,執行後才進行後續動作 var objMaster = new iMESCIO.SCI.ERP.Request.SCI_Request_workstation_get(); objMaster.data_time = strDate; objMaster.page_size = strPageSize; objMaster.key_condition = ""; object argSCI_Object = objMaster; string argpRequestKey = "Null"; InXml = CombineRequestXMLbyCDO(ref argSCI_Object, dtERPSetting.Rows[0]["ERP_Name"].ToString(), "", "workstation.get", pRequestKey: argpRequestKey); objMaster = (iMESCIO.SCI.ERP.Request.SCI_Request_workstation_get)argSCI_Object; int intloopTimes = 0; do { // 迴圈執行超過5次直接跳出迴圈並回傳錯誤訊息,Add By KevinChang if (intloopTimes >= 5) { throw new Exception("[%THE NUMBER OF SUBCONTRACTS IS SET TOO LITTLE TO CAUSE THE LOOP TO EXECUTE MORE THAN FIVE TIMES%]"); break; } OutXml = string.Empty; OutXml = LoadXmlFileForTest("workstation.get"); try { if (string.IsNullOrEmpty(OutXml)) { // ----- Call ERP Web Service ----- using (var ws = new iMESCore.Base.Invoke.wsERP_EAI.IntegrationEntry()) { ws.Url = ERP_URL; OutXml = ws.invokeSrv(InXml); } // 2017-05-03, Joe, 轉換單引號 OutXml = OutXml.Replace("'", "''"); } } catch (Exception ex) { OutXml = ex.Message; throw ex; } finally { // 需等到取得所有資料後,再處理後面之動作,故統一將請求完之ResponseXML放入容器內 colResponseXML.Add(OutXml); } XmlDoc.LoadXml(OutXml); string argstrException = null; modAutoRunLibrary.addTransactionLog(InXml, OutXml, DateTime.Now.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPOPGroupBasis", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), "success", "ERP", strServiceName, strException: argstrException); // 將ERP拋回的資料轉成物件 objResponse.ParseXmlToObject(OutXml); if (objResponse.srvcode == null == false && objResponse.srvcode.Equals("000") && objResponse.code == null == false && objResponse.code.Equals("0")) { objMaster = new iMESCIO.SCI.ERP.Request.SCI_Request_workstation_get(); objMaster.data_time = objResponse.data_time; // 第二次後請求需為回傳之最後拋轉時間 objMaster.page_size = strPageSize; objMaster.key_condition = Strings.Replace(objResponse.key_condition, "''", "'"); // 第二次後代入從ERP收到之keyCondition object argSCI_Object1 = objMaster; string argpRequestKey1 = "Null"; InXml = CombineRequestXMLbyCDO(ref argSCI_Object1, dtERPSetting.Rows[0]["ERP_Name"].ToString(), "", "workstation.get", pRequestKey: argpRequestKey1); objMaster = (iMESCIO.SCI.ERP.Request.SCI_Request_workstation_get)argSCI_Object1; xmlNodeCnt = XmlDoc.SelectSingleNode("/response/payload/param/data_response/datainfo/parameter/data"); strCnt = xmlNodeCnt.Attributes.GetNamedItem("cnt").Value; strTTcnt = xmlNodeCnt.Attributes.GetNamedItem("tt_cnt").Value; } else { chkStatus = false; aryReturnMessage.Add(OutXml); // 2017-06-26, Joe, 如是中台層的錯誤要往外拋 break; } intloopTimes += 1; } while ((strCnt ?? "") != (strTTcnt ?? "")); // 寫入Log Table TreatWriteLogTable(colResponseXML, strServiceName); // 寫入MES DB if (chkStatus) { foreach (string strOutXML in colResponseXML) { objResponse.ParseXmlToObject(strOutXML); if (WriteOPGroupBasis(objResponse, ref aryReturnMessage) < 0) { if (aryReturnMessage.Count == 0) // 避免不明原因,執行FAIL又沒收集到項目. { aryReturnMessage.Add(TranslateMsg("workstation_get, [%INVOKE FAIL%]!", strLanguageMode, strResourceDir)); } } } } } // CollectionSQL = Nothing // XmlDoc = Nothing catch (Exception EX_AUT) { aryReturnMessage.Add("EX_AUT.Exception" + '\n' + EX_AUT.Message.ToString()); OutXml = EX_AUT.Message.ToString(); results = "fail"; // ----- 執行ERP交易完畢紀錄TransactionLog ----- string argstrException = null; modAutoRunLibrary.addTransactionLog_ErrorCode(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "MES", "MESCallERPOPGroupBasis", Environment.MachineName, "AutoRun", arriveTime.ToString("yyyy/MM/dd HH:mm:ss"), results, "", "CreateMESCallERPOPGroupBasis", LogClass: "AutoRun", strException: argstrException); // 2013/02/05, Hank, Send Email colParameters.Add(funMESCallERPOPGroupBasisRet, "EmailBody"); SendJobFailEmail(colParameters); } finally { // -------------------------------------------------- // 回傳執行結果:succces 或 fail(ReturnMessage) // -------------------------------------------------- if (aryReturnMessage.Count == 0) { funMESCallERPOPGroupBasisRet = "success"; results = "success"; } else { // 組合執行錯誤字串: Chr(10)分隔 strReturnMessage = ArrayList2String(ref aryReturnMessage); if ((strReturnMessage ?? "") == defString) { // 當錯誤字串組合失敗。補上 strReturnMessage = "ReturnMessage收集失敗!!"; } // tblMESAutoRunLog.ReturnMessage 長度4000限制. string strTemp = ""; if (strReturnMessage.Length > 4000) { // 自 strReturnMessage 中截取0-3991碼. strTemp = strReturnMessage.Substring(0, 3991) + "..."; } else { strTemp = strReturnMessage; } // 更新log table異常資訊 // Dim nodeID As XmlNode = XmlDoc.SelectSingleNode("/response/reqid") UpdateLogTableErrorInfo(colResponseXML, strServiceName, strTemp); // //fail; funMESCallERPOPGroupBasisRet = CombineFailMsg("0000-999999", strTemp); } // ===manties:0095454 AutoRun addTransactionLog位置錯誤 需移至Finally 2021/07/06 // ----- 執行ERP交易完畢紀錄TransactionLog ----- string argstrException = null; modAutoRunLibrary.addTransactionLog(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "MES", "MESCallERPOPGroupBasis", Environment.MachineName, "AutoRun", arriveTime.ToString("yyyy/MM/dd HH:mm:ss"), results, "", "CreateMESCallERPOPGroupBasis", strException: argstrException); // === //if (daTemp != null) // daTemp.Dispose(); if (drTemp != null) drTemp.Close(); } } while (false); // 當執行失敗 寄送 Email 必須有設定參數一 IDbConnection argcnnTemp = null; try { if (aryReturnMessage.Count > 0 && Conversions.ToBoolean(Operators.ConditionalCompareObjectNotEqual(colParameters["Parameter01"], "", false))) { strSubject = "[AUT]工作站-基本資料抛轉失敗! "; strBody = Strings.Replace(strReturnMessage, Conversions.ToString('\n'), "
", Compare: CompareMethod.Text); argcnnTemp = CreateConnection(strConnectionString); // 寄送 Email if (ERP2MES_MailNotice(ref argcnnTemp, ref aryReturnMessage, strSubject, Conversions.ToString(colParameters["Parameter01"]), CInput(strBody)) < 0) { // '寄送不成功, ReturnMessage 再增加1項. // 'ProductIntegration += Chr(10) & aryReturnMessage.Item(aryReturnMessage.Count - 1).ToString // 寄送不成功, ReturnMessage 再增加1項. // tblMESAutoRunLog.ReturnMessage 長度4000限制. if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(funMESCallERPOPGroupBasisRet.ToString().Length, 4000, false))) { string strTemp = ""; strTemp = strReturnMessage; if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(strTemp + aryReturnMessage[aryReturnMessage.Count - 1].ToString().Length, 4000, false))) { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); } else { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); // 自 strTemp 中截取0-3991碼. strTemp = strTemp.Substring(0, 3991) + "..."; } // //fail; funMESCallERPOPGroupBasisRet = CombineFailMsg("0000-999999", strTemp); } } } } catch (Exception) { throw; } finally { CloseConnection(argcnnTemp); } return funMESCallERPOPGroupBasisRet; } // ======================================================================================================================== // 程式名稱:funMESCallERPEquipmentProductivity // 傳入參數:colParameters // 傳回參數:success(成功), fail(失敗) // 用 途:資源行事曆-基本資料拋轉 // 撰寫人員:敬翔 // 撰寫日期:2017/02/23 // ======================================================================================================================== private object funMESCallERPEquipmentProductivity(Collection colParameters = null) { object funMESCallERPEquipmentProductivityRet = default(object); var drTemp = default(DbDataReader); string strSQL; var XmlDoc = new XmlDocument(); //var daTemp = default(System.Data.OleDb.OleDbDataAdapter); var CollectionSQL = new Collection(); var colResponseXML = new Collection(); var arriveTime = DateTime.Now; string strServiceName = "resource.calendar.get"; // =========================================================== // 宣告 AutoRunJob設定及執行記錄 變數 // =========================================================== string strParameter01 = ""; // 參數一,預設此功能fail通知EMAIL群組。 string strPageSize = "500"; // 參數二,分包筆數 string strDate; // 參數三,手動重收時填上時間,如沒填則以log tableERP拋回的最後執行時間為主 // AutorunJob拋轉資訊 string strReturnMessage = ""; // 錯誤訊息(tblMESAutoRunLog.ReturnMessage),Chr(10)分隔錯誤項目。 var aryReturnMessage = new ArrayList(); // Catch Error Message (Exception及MES判定錯誤訊息)。 string strSubject, strBody; // 寄送通知資訊 XmlNode node = null; string strReqid = ""; string strCnt = defString; string strTTcnt = ""; var datArriveTime = DateTime.Now; do { try { // Parameter01為傳入參數,作為E-mail,若無此值則不進行下面的程式 if (!(colParameters["Parameter01"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter01"])))) { strParameter01 = colParameters["Parameter01"].ToString().Trim(); } else { aryReturnMessage.Add(TranslateMsg("Mail GroupNo [%NOT SET%]!", strLanguageMode, strResourceDir)); break; } // 分包筆數必須為數值型態,Add by KevinChang if (Information.IsNumeric(colParameters["Parameter02"])) { if (!(colParameters["Parameter02"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter02"])))) { // 每封包筆數不可小於500筆,Add by KevinChang if (Conversions.ToInteger(colParameters["Parameter02"]) < 500) { strPageSize = "500"; } else { strPageSize = colParameters["Parameter02"].ToString().Trim(); } } } // Parameter03為傳入參數,作為ProductionDate,若無此值則用昨天當日期 if (!(colParameters["Parameter03"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter03"])))) { strDate = GetDate(Conversions.ToString(colParameters["Parameter03"]), "Parameter03"); } else { // 20170316 edit liyujn strDate = GetERPTransactionDate(strServiceName); } // 取得erp資訊 if (!GetERPSetting(ref dtERPSetting, pEAIType: 1)) { aryReturnMessage.Add(TranslateMsg("[%PleaseCheck%] EAI ERP Setting Info [%CONFIGSETTING%]!", strLanguageMode, strResourceDir)); break; } var objResponse = new iMESCIO.SCI.ERP.Response.SCI_Response_resource_calendar_get(); XmlNode xmlNodeCnt; bool chkStatus = true; // 抓取其它status為0之資料且塞入colResponseXML GetReTransData(strServiceName, ref colResponseXML); // 判斷『當前回傳筆數』=『應回傳筆數』時才代表為最後一次請求,執行後才進行後續動作 var objMaster = new iMESCIO.SCI.ERP.Request.SCI_Request_resource_calendar_get(); objMaster.data_time = strDate; objMaster.page_size = strPageSize; objMaster.key_condition = ""; object argSCI_Object = objMaster; string argpRequestKey = "Null"; InXml = CombineRequestXMLbyCDO(ref argSCI_Object, dtERPSetting.Rows[0]["ERP_Name"].ToString(), "", "resource.calendar.get", pRequestKey: argpRequestKey); objMaster = (iMESCIO.SCI.ERP.Request.SCI_Request_resource_calendar_get)argSCI_Object; int intloopTimes = 0; do { // 迴圈執行超過5次直接跳出迴圈並回傳錯誤訊息,Add By KevinChang if (intloopTimes >= 5) { throw new Exception("[%THE NUMBER OF SUBCONTRACTS IS SET TOO LITTLE TO CAUSE THE LOOP TO EXECUTE MORE THAN FIVE TIMES%]"); break; } OutXml = string.Empty; OutXml = LoadXmlFileForTest("resource.calendar.get"); try { if (string.IsNullOrEmpty(OutXml)) { // ----- Call ERP Web Service ----- using (var ws = new iMESCore.Base.Invoke.wsERP_EAI.IntegrationEntry()) { ws.Url = ERP_URL; OutXml = ws.invokeSrv(InXml); } // 2017-05-03, Joe, 轉換單引號 OutXml = OutXml.Replace("'", "''"); } } catch (Exception ex) { OutXml = ex.Message; throw ex; } finally { // 需等到取得所有資料後,再處理後面之動作,故統一將請求完之ResponseXML放入容器內 colResponseXML.Add(OutXml); } XmlDoc.LoadXml(OutXml); string argstrException = null; modAutoRunLibrary.addTransactionLog(InXml, OutXml, DateTime.Now.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPEquipmentProductivity", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), "success", "ERP", strServiceName, strException: argstrException); // 將ERP拋回的資料轉成物件 objResponse.ParseXmlToObject(OutXml); if (objResponse.srvcode == null == false && objResponse.srvcode.Equals("000") && objResponse.code == null == false && objResponse.code.Equals("0")) { objMaster = new iMESCIO.SCI.ERP.Request.SCI_Request_resource_calendar_get(); objMaster.data_time = objResponse.data_time; // 第二次後請求需為回傳之最後拋轉時間 objMaster.page_size = strPageSize; objMaster.key_condition = Strings.Replace(objResponse.key_condition, "''", "'"); // 第二次後代入從ERP收到之keyCondition object argSCI_Object1 = objMaster; string argpRequestKey1 = "Null"; InXml = CombineRequestXMLbyCDO(ref argSCI_Object1, dtERPSetting.Rows[0]["ERP_Name"].ToString(), "", "resource.calendar.get", pRequestKey: argpRequestKey1); objMaster = (iMESCIO.SCI.ERP.Request.SCI_Request_resource_calendar_get)argSCI_Object1; xmlNodeCnt = XmlDoc.SelectSingleNode("/response/payload/param/data_response/datainfo/parameter/data"); strCnt = xmlNodeCnt.Attributes.GetNamedItem("cnt").Value; strTTcnt = xmlNodeCnt.Attributes.GetNamedItem("tt_cnt").Value; } else { chkStatus = false; aryReturnMessage.Add(OutXml); // 2017-06-26, Joe, 如是中台層的錯誤要往外拋 break; } intloopTimes += 1; } while ((strCnt ?? "") != (strTTcnt ?? "")); // 寫入Log Table TreatWriteLogTable(colResponseXML, strServiceName); // 寫入MES DB if (chkStatus) { foreach (string strOutXML in colResponseXML) { objResponse.ParseXmlToObject(strOutXML); if (WriteEquipmentProductivity(objResponse, ref aryReturnMessage) < 0) { if (aryReturnMessage.Count == 0) // 避免不明原因,執行FAIL又沒收集到項目. { aryReturnMessage.Add(TranslateMsg("resource.calendar.get, [%INVOKE FAIL%]!", strLanguageMode, strResourceDir)); } } } } } // CollectionSQL = Nothing // XmlDoc = Nothing catch (Exception EX_AUT) { aryReturnMessage.Add("EX_AUT.Exception" + '\n' + EX_AUT.Message.ToString()); OutXml = EX_AUT.Message.ToString(); results = "fail"; // ----- 執行ERP交易完畢紀錄TransactionLog ----- string argstrException = null; modAutoRunLibrary.addTransactionLog_ErrorCode(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "MES", "funMESCallERPEquipmentProductivity", Environment.MachineName, "AutoRun", arriveTime.ToString("yyyy/MM/dd HH:mm:ss"), results, "", "CreateMESCallERPEquipmentProductivity", LogClass: "AutoRun", strException: argstrException); // 2013/02/05, Hank, Send Email colParameters.Add(funMESCallERPEquipmentProductivityRet, "EmailBody"); SendJobFailEmail(colParameters); } finally { // -------------------------------------------------- // 回傳執行結果:succces 或 fail(ReturnMessage) // -------------------------------------------------- if (aryReturnMessage.Count == 0) { funMESCallERPEquipmentProductivityRet = "success"; results = "success"; } else { // 組合執行錯誤字串: Chr(10)分隔 strReturnMessage = ArrayList2String(ref aryReturnMessage); if ((strReturnMessage ?? "") == defString) { // 當錯誤字串組合失敗。補上 strReturnMessage = "ReturnMessage收集失敗!!"; } // tblMESAutoRunLog.ReturnMessage 長度4000限制. string strTemp = ""; if (strReturnMessage.Length > 4000) { // 自 strReturnMessage 中截取0-3991碼. strTemp = strReturnMessage.Substring(0, 3991) + "..."; } else { strTemp = strReturnMessage; } // 更新log table異常資訊 // Dim nodeID As XmlNode = XmlDoc.SelectSingleNode("/response/reqid") UpdateLogTableErrorInfo(colResponseXML, strServiceName, strTemp); // //fail; funMESCallERPEquipmentProductivityRet = "fail;" + strTemp; } // ===manties:0095454 AutoRun addTransactionLog位置錯誤 需移至Finally 2021/07/06 // ----- 執行ERP交易完畢紀錄TransactionLog ----- string argstrException = null; modAutoRunLibrary.addTransactionLog(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "MES", "funMESCallERPEquipmentProductivity", Environment.MachineName, "AutoRun", arriveTime.ToString("yyyy/MM/dd HH:mm:ss"), results, "", "CreateMESCallERPEquipmentProductivity", strException: argstrException); // === //if (daTemp != null) // daTemp.Dispose(); if (drTemp != null) drTemp.Close(); } } while (false); // 當執行失敗 寄送 Email 必須有設定參數一 IDbConnection argcnnTemp = null; try { if (aryReturnMessage.Count > 0 && Conversions.ToBoolean(Operators.ConditionalCompareObjectNotEqual(colParameters["Parameter01"], "", false))) { strSubject = "[AUT]資源行事曆-基本資料抛轉失敗! "; strBody = Strings.Replace(strReturnMessage, Conversions.ToString('\n'), "
", Compare: CompareMethod.Text); argcnnTemp = CreateConnection(strConnectionString); // 寄送 Email if (ERP2MES_MailNotice(ref argcnnTemp, ref aryReturnMessage, strSubject, Conversions.ToString(colParameters["Parameter01"]), CInput(strBody)) < 0) { // '寄送不成功, ReturnMessage 再增加1項. // 'ProductIntegration += Chr(10) & aryReturnMessage.Item(aryReturnMessage.Count - 1).ToString // 寄送不成功, ReturnMessage 再增加1項. // tblMESAutoRunLog.ReturnMessage 長度4000限制. if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(funMESCallERPEquipmentProductivityRet.ToString().Length, 4000, false))) { string strTemp = ""; strTemp = strReturnMessage; if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(strTemp + aryReturnMessage[aryReturnMessage.Count - 1].ToString().Length, 4000, false))) { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); } else { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); // 自 strTemp 中截取0-3991碼. strTemp = strTemp.Substring(0, 3991) + "..."; } // //fail; funMESCallERPEquipmentProductivityRet = "fail;" + strTemp; } } } } catch (Exception) { throw; } finally { CloseConnection(argcnnTemp); } return funMESCallERPEquipmentProductivityRet; } // ======================================================================================================================== // 程式名稱:funMESCallERPAccessoryBasis // 傳入參數:colParameters // 傳回參數:success(成功), fail(失敗) // 用 途:模治具-基本資料抛轉 // 撰寫人員:敬翔 // 撰寫日期:2017/03/21 // ======================================================================================================================== private object funMESCallERPAccessoryBasis(Collection colParameters = null) { object funMESCallERPAccessoryBasisRet = default(object); var drTemp = default(DbDataReader); string strSQL; var XmlDoc = new XmlDocument(); //var daTemp = default(System.Data.OleDb.OleDbDataAdapter); var CollectionSQL = new Collection(); var colResponseXML = new Collection(); var arriveTime = DateTime.Now; string strServiceName = "mold.fixture.get"; // =========================================================== // 宣告 AutoRunJob設定及執行記錄 變數 // =========================================================== string strParameter01 = ""; // 參數一,預設此功能fail通知EMAIL群組。 string strPageSize = "500"; // 參數二,分包筆數 string strDate; // 參數三,手動重收時填上時間,如沒填則以log tableERP拋回的最後執行時間為主 // AutorunJob拋轉資訊 string strReturnMessage = ""; // 錯誤訊息(tblMESAutoRunLog.ReturnMessage),Chr(10)分隔錯誤項目。 var aryReturnMessage = new ArrayList(); // Catch Error Message (Exception及MES判定錯誤訊息)。 string strSubject, strBody; // 寄送通知資訊 XmlNode node = null; string strReqid = ""; string strCnt = defString; string strTTcnt = ""; var datArriveTime = DateTime.Now; do { try { // Parameter01為傳入參數,作為SheetType,若無此值則不進行下面的程式 if (!(colParameters["Parameter01"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter01"])))) { strParameter01 = colParameters["Parameter01"].ToString().Trim(); } else { aryReturnMessage.Add(TranslateMsg("Mail GroupNo [%NOT SET%]!", strLanguageMode, strResourceDir)); break; } // 分包筆數必須為數值型態,Add by KevinChang if (Information.IsNumeric(colParameters["Parameter02"])) { if (!(colParameters["Parameter02"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter02"])))) { // 每封包筆數不可小於500筆,Add by KevinChang if (Conversions.ToInteger(colParameters["Parameter02"]) < 500) { strPageSize = "500"; } else { strPageSize = colParameters["Parameter02"].ToString().Trim(); } } } // Parameter03為傳入參數,作為ProductionDate,若無此值則用昨天當日期 if (!(colParameters["Parameter03"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter03"])))) { strDate = GetDate(Conversions.ToString(colParameters["Parameter03"]), "Parameter03"); } else { // 20170316 edit liyujn strDate = GetERPTransactionDate(strServiceName); } // 取得erp資訊 if (!GetERPSetting(ref dtERPSetting, pEAIType: 1)) { aryReturnMessage.Add(TranslateMsg("[%PleaseCheck%] EAI ERP Setting Info [%CONFIGSETTING%]!", strLanguageMode, strResourceDir)); break; } var objResponse = new iMESCIO.SCI.ERP.Response.SCI_Response_mold_fixture_get(); XmlNode xmlNodeCnt; bool chkStatus = true; // 抓取其它status為0之資料且塞入colResponseXML GetReTransData(strServiceName, ref colResponseXML); // 判斷『當前回傳筆數』=『應回傳筆數』時才代表為最後一次請求,執行後才進行後續動作 var objMaster = new iMESCIO.SCI.ERP.Request.SCI_Request_mold_fixture_get(); objMaster.data_time = strDate; objMaster.page_size = strPageSize; objMaster.key_condition = ""; object argSCI_Object = objMaster; string argpRequestKey = "Null"; InXml = CombineRequestXMLbyCDO(ref argSCI_Object, dtERPSetting.Rows[0]["ERP_Name"].ToString(), "", "mold.fixture.get", pRequestKey: argpRequestKey); objMaster = (iMESCIO.SCI.ERP.Request.SCI_Request_mold_fixture_get)argSCI_Object; int intloopTimes = 0; do { // 迴圈執行超過5次直接跳出迴圈並回傳錯誤訊息,Add By KevinChang if (intloopTimes >= 5) { throw new Exception("[%THE NUMBER OF SUBCONTRACTS IS SET TOO LITTLE TO CAUSE THE LOOP TO EXECUTE MORE THAN FIVE TIMES%]"); break; } OutXml = string.Empty; OutXml = LoadXmlFileForTest("mold.fixture.get"); try { if (string.IsNullOrEmpty(OutXml)) { // ----- Call ERP Web Service ----- using (var ws = new iMESCore.Base.Invoke.wsERP_EAI.IntegrationEntry()) { ws.Url = ERP_URL; OutXml = ws.invokeSrv(InXml); } // 2017-05-03, Joe, 轉換單引號 OutXml = OutXml.Replace("'", "''"); } } catch (Exception ex) { OutXml = ex.Message; throw ex; } finally { // 需等到取得所有資料後,再處理後面之動作,故統一將請求完之ResponseXML放入容器內 colResponseXML.Add(OutXml); } XmlDoc.LoadXml(OutXml); string argstrException = null; modAutoRunLibrary.addTransactionLog(InXml, OutXml, DateTime.Now.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPAccessoryBasis", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), "success", "ERP", strServiceName, strException: argstrException); // 將ERP拋回的資料轉成物件 objResponse.ParseXmlToObject(OutXml); if (objResponse.srvcode == null == false && objResponse.srvcode.Equals("000") && objResponse.code == null == false && objResponse.code.Equals("0")) { objMaster = new iMESCIO.SCI.ERP.Request.SCI_Request_mold_fixture_get(); objMaster.data_time = objResponse.data_time; // 第二次後請求需為回傳之最後拋轉時間 objMaster.page_size = strPageSize; objMaster.key_condition = Strings.Replace(objResponse.key_condition, "''", "'"); // 第二次後代入從ERP收到之keyCondition object argSCI_Object1 = objMaster; string argpRequestKey1 = "Null"; InXml = CombineRequestXMLbyCDO(ref argSCI_Object1, dtERPSetting.Rows[0]["ERP_Name"].ToString(), "", "mold.fixture.get", pRequestKey: argpRequestKey1); objMaster = (iMESCIO.SCI.ERP.Request.SCI_Request_mold_fixture_get)argSCI_Object1; xmlNodeCnt = XmlDoc.SelectSingleNode("/response/payload/param/data_response/datainfo/parameter/data"); strCnt = xmlNodeCnt.Attributes.GetNamedItem("cnt").Value; strTTcnt = xmlNodeCnt.Attributes.GetNamedItem("tt_cnt").Value; } else { chkStatus = false; aryReturnMessage.Add(OutXml); // 2017-06-26, Joe, 如是中台層的錯誤要往外拋 break; } intloopTimes += 1; } while ((strCnt ?? "") != (strTTcnt ?? "")); // 寫入Log Table TreatWriteLogTable(colResponseXML, strServiceName); // 寫入MES DB if (chkStatus) { foreach (string strOutXML in colResponseXML) { objResponse.ParseXmlToObject(strOutXML); if (WriteAccessoryBasis(objResponse, ref aryReturnMessage) < 0) { if (aryReturnMessage.Count == 0) // 避免不明原因,執行FAIL又沒收集到項目. { aryReturnMessage.Add(TranslateMsg("accessory_get, [%INVOKE FAIL%]!", strLanguageMode, strResourceDir)); } } } } } // CollectionSQL = Nothing // XmlDoc = Nothing catch (Exception EX_AUT) { aryReturnMessage.Add("EX_AUT.Exception" + '\n' + EX_AUT.Message.ToString()); OutXml = EX_AUT.Message.ToString(); results = "fail"; // ----- 執行ERP交易完畢紀錄TransactionLog ----- string argstrException = null; modAutoRunLibrary.addTransactionLog_ErrorCode(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "MES", "funMESCallERPAccessoryBasis", Environment.MachineName, "AutoRun", arriveTime.ToString("yyyy/MM/dd HH:mm:ss"), results, "", "CreateMESCallERPAccessoryBasis", LogClass: "AutoRun", strException: argstrException); // 2013/02/05, Hank, Send Email colParameters.Add(funMESCallERPAccessoryBasisRet, "EmailBody"); SendJobFailEmail(colParameters); } finally { // -------------------------------------------------- // 回傳執行結果:succces 或 fail(ReturnMessage) // -------------------------------------------------- if (aryReturnMessage.Count == 0) { funMESCallERPAccessoryBasisRet = "success"; results = "success"; } else { // 組合執行錯誤字串: Chr(10)分隔 strReturnMessage = ArrayList2String(ref aryReturnMessage); if ((strReturnMessage ?? "") == defString) { // 當錯誤字串組合失敗。補上 strReturnMessage = "ReturnMessage收集失敗!!"; } // tblMESAutoRunLog.ReturnMessage 長度4000限制. string strTemp = ""; if (strReturnMessage.Length > 4000) { // 自 strReturnMessage 中截取0-3991碼. strTemp = strReturnMessage.Substring(0, 3991) + "..."; } else { strTemp = strReturnMessage; } // 更新log table異常資訊 // Dim nodeID As XmlNode = XmlDoc.SelectSingleNode("/response/reqid") UpdateLogTableErrorInfo(colResponseXML, strServiceName, strTemp); // //fail; funMESCallERPAccessoryBasisRet = CombineFailMsg("0000-999999", strTemp); } // ===manties:0095454 AutoRun addTransactionLog位置錯誤 需移至Finally 2021/07/06 // ----- 執行ERP交易完畢紀錄TransactionLog ----- string argstrException = null; modAutoRunLibrary.addTransactionLog(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "MES", "funMESCallERPAccessoryBasis", Environment.MachineName, "AutoRun", arriveTime.ToString("yyyy/MM/dd HH:mm:ss"), results, "", "CreateMESCallERPAccessoryBasis", strException: argstrException); // === //if (daTemp != null) // daTemp.Dispose(); if (drTemp != null) drTemp.Close(); } } while (false); // 當執行失敗 寄送 Email 必須有設定參數一 IDbConnection argcnnTemp = null; try { if (aryReturnMessage.Count > 0 && Conversions.ToBoolean(Operators.ConditionalCompareObjectNotEqual(colParameters["Parameter01"], "", false))) { strSubject = "[AUT]模治具-基本資料抛轉失敗! "; strBody = Strings.Replace(strReturnMessage, Conversions.ToString('\n'), "
", Compare: CompareMethod.Text); argcnnTemp = CreateConnection(strConnectionString); // 寄送 Email if (ERP2MES_MailNotice(ref argcnnTemp, ref aryReturnMessage, strSubject, Conversions.ToString(colParameters["Parameter01"]), CInput(strBody)) < 0) { // '寄送不成功, ReturnMessage 再增加1項. // 'ProductIntegration += Chr(10) & aryReturnMessage.Item(aryReturnMessage.Count - 1).ToString // 寄送不成功, ReturnMessage 再增加1項. // tblMESAutoRunLog.ReturnMessage 長度4000限制. if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(funMESCallERPAccessoryBasisRet.ToString().Length, 4000, false))) { string strTemp = ""; strTemp = strReturnMessage; if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(strTemp + aryReturnMessage[aryReturnMessage.Count - 1].ToString().Length, 4000, false))) { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); } else { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); // 自 strTemp 中截取0-3991碼. strTemp = strTemp.Substring(0, 3991) + "..."; } // //fail; funMESCallERPAccessoryBasisRet = CombineFailMsg("0000-999999", strTemp); } } } } catch (Exception) { throw; } finally { CloseConnection(argcnnTemp); } return funMESCallERPAccessoryBasisRet; } // ======================================================================================================================== // 程式名稱:funMESCallERPUserBasis // 傳入參數:colParameters // 傳回參數:success(成功), fail(失敗) // 用 途:使用者主檔整合 // 撰寫人員:KunYuan // 撰寫日期:2017/06/01 // ======================================================================================================================== private object funMESCallERPUserBasis(Collection colParameters = null) { object funMESCallERPUserBasisRet = default(object); var drTemp = default(DbDataReader); string strSQL; var XmlDoc = new XmlDocument(); //var daTemp = default(System.Data.OleDb.OleDbDataAdapter); var CollectionSQL = new Collection(); var colResponseXML = new Collection(); var arriveTime = DateTime.Now; string strServiceName = "user.get"; // =========================================================== // 宣告 AutoRunJob設定及執行記錄 變數 // =========================================================== string strParameter01 = ""; // 參數一,預設此功能fail通知EMAIL群組。 string strPageSize = "500"; // 參數二,分包筆數 string strDate; // 參數三,手動重收時填上時間,如沒填則以log tableERP拋回的最後執行時間為主 // AutorunJob拋轉資訊 string strReturnMessage = ""; // 錯誤訊息(tblMESAutoRunLog.ReturnMessage),Chr(10)分隔錯誤項目。 var aryReturnMessage = new ArrayList(); // Catch Error Message (Exception及MES判定錯誤訊息)。 string strSubject, strBody; // 寄送通知資訊 XmlNode node = null; string strReqid = ""; string strCnt = defString; string strTTcnt = ""; var datArriveTime = DateTime.Now; do { try { // Parameter01為傳入參數,作為SheetType,若無此值則不進行下面的程式 if (!(colParameters["Parameter01"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter01"])))) { strParameter01 = colParameters["Parameter01"].ToString().Trim(); } else { aryReturnMessage.Add(TranslateMsg("Mail GroupNo [%NOT SET%]([%PARAMETER01%])!", strLanguageMode, strResourceDir)); // ===== 2021/05/18 Elvis 92880 break; } // 分包筆數必須為數值型態,Add by KevinChang if (Information.IsNumeric(colParameters["Parameter02"])) { if (!(colParameters["Parameter02"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter02"])))) { // 每封包筆數不可小於500筆,Add by KevinChang if (Conversions.ToInteger(colParameters["Parameter02"]) < 500) { strPageSize = "500"; } else { strPageSize = colParameters["Parameter02"].ToString().Trim(); } } } // Parameter03為傳入參數,作為ProductionDate,若無此值則用昨天當日期 if (!(colParameters["Parameter03"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter03"])))) { strDate = GetDate(Conversions.ToString(colParameters["Parameter03"]), "Parameter03"); } else { // 20170316 edit liyujn strDate = GetERPTransactionDate(strServiceName); } // 取得erp資訊 if (!GetERPSetting(ref dtERPSetting, pEAIType: 1)) { aryReturnMessage.Add(TranslateMsg("[%PleaseCheck%] EAI ERP Setting Info [%CONFIGSETTING%]!", strLanguageMode, strResourceDir)); break; } var objResponse = new iMESCIO.SCI.ERP.Response.SCI_Response_user_get(); XmlNode xmlNodeCnt; bool chkStatus = true; // 抓取其它status為0之資料且塞入colResponseXML GetReTransData(strServiceName, ref colResponseXML); // 判斷『當前回傳筆數』=『應回傳筆數』時才代表為最後一次請求,執行後才進行後續動作 var objMaster = new iMESCIO.SCI.ERP.Request.SCI_Request_user_get(); objMaster.data_time = strDate; objMaster.page_size = strPageSize; objMaster.key_condition = ""; object argSCI_Object = objMaster; string argpRequestKey = "Null"; InXml = CombineRequestXMLbyCDO(ref argSCI_Object, dtERPSetting.Rows[0]["ERP_Name"].ToString(), "", "user.get", pRequestKey: argpRequestKey); objMaster = (iMESCIO.SCI.ERP.Request.SCI_Request_user_get)argSCI_Object; int intloopTimes = 0; do { // 迴圈執行超過5次直接跳出迴圈並回傳錯誤訊息,Add By KevinChang if (intloopTimes >= 5) { throw new Exception("[%THE NUMBER OF SUBCONTRACTS IS SET TOO LITTLE TO CAUSE THE LOOP TO EXECUTE MORE THAN FIVE TIMES%]"); break; } OutXml = string.Empty; OutXml = LoadXmlFileForTest(strServiceName); try { if (string.IsNullOrEmpty(OutXml)) { // ----- Call ERP Web Service ----- using (var ws = new iMESCore.Base.Invoke.wsERP_EAI.IntegrationEntry()) { ws.Url = ERP_URL; OutXml = ws.invokeSrv(InXml); } // 2017-05-03, Joe, 轉換單引號 OutXml = OutXml.Replace("'", "''"); } } catch (Exception ex) { OutXml = ex.Message; throw ex; } finally { // 需等到取得所有資料後,再處理後面之動作,故統一將請求完之ResponseXML放入容器內 colResponseXML.Add(OutXml); } XmlDoc.LoadXml(OutXml); string argstrException = null; modAutoRunLibrary.addTransactionLog(InXml, OutXml, DateTime.Now.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPUserBasis", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), "success", "ERP", strServiceName, strException: argstrException); // 將ERP拋回的資料轉成物件 objResponse.ParseXmlToObject(OutXml); if (objResponse.srvcode == null == false && objResponse.srvcode.Equals("000") && objResponse.code == null == false && objResponse.code.Equals("0")) { objMaster = new iMESCIO.SCI.ERP.Request.SCI_Request_user_get(); objMaster.data_time = objResponse.data_time; // 第二次後請求需為回傳之最後拋轉時間 objMaster.page_size = strPageSize; objMaster.key_condition = Strings.Replace(objResponse.key_condition, "''", "'"); // 第二次後代入從ERP收到之keyCondition object argSCI_Object1 = objMaster; string argpRequestKey1 = "Null"; InXml = CombineRequestXMLbyCDO(ref argSCI_Object1, dtERPSetting.Rows[0]["ERP_Name"].ToString(), "", "user.get", pRequestKey: argpRequestKey1); objMaster = (iMESCIO.SCI.ERP.Request.SCI_Request_user_get)argSCI_Object1; xmlNodeCnt = XmlDoc.SelectSingleNode("/response/payload/param/data_response/datainfo/parameter/data"); strCnt = xmlNodeCnt.Attributes.GetNamedItem("cnt").Value; strTTcnt = xmlNodeCnt.Attributes.GetNamedItem("tt_cnt").Value; } else { chkStatus = false; aryReturnMessage.Add(OutXml); // 2017-06-26, Joe, 如是中台層的錯誤要往外拋 break; } intloopTimes += 1; } while ((strCnt ?? "") != (strTTcnt ?? "")); // 寫入Log Table TreatWriteLogTable(colResponseXML, strServiceName); // 寫入MES DB if (chkStatus) { foreach (string strOutXML in colResponseXML) { objResponse.ParseXmlToObject(strOutXML); if (WriteUserBasis(objResponse, ref aryReturnMessage) < 0) { if (aryReturnMessage.Count == 0) // 避免不明原因,執行FAIL又沒收集到項目. { aryReturnMessage.Add(TranslateMsg("user_get, [%INVOKE FAIL%]!", strLanguageMode, strResourceDir)); } } } } } catch (Exception EX_AUT) { aryReturnMessage.Add("EX_AUT.Exception" + '\n' + EX_AUT.Message.ToString()); OutXml = EX_AUT.Message.ToString(); // ----- 執行ERP交易完畢紀錄TransactionLog ----- string argstrException = null; modAutoRunLibrary.addTransactionLog_ErrorCode(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "MES", "MESCallERPUserBasis", Environment.MachineName, "AutoRun", arriveTime.ToString("yyyy/MM/dd HH:mm:ss"), "fail", "", "CreateMESCallERPUserBasis", LogClass: "AutoRun", strException: argstrException); // 2013/02/05, Hank, Send Email colParameters.Add(funMESCallERPUserBasisRet, "EmailBody"); SendJobFailEmail(colParameters); } finally { // -------------------------------------------------- // 回傳執行結果:succces 或 fail(ReturnMessage) // -------------------------------------------------- if (aryReturnMessage.Count == 0) { funMESCallERPUserBasisRet = "success"; } else { // 組合執行錯誤字串: Chr(10)分隔 strReturnMessage = ArrayList2String(ref aryReturnMessage); if ((strReturnMessage ?? "") == defString) { // 當錯誤字串組合失敗。補上 strReturnMessage = "ReturnMessage收集失敗!!"; } // tblMESAutoRunLog.ReturnMessage 長度4000限制. string strTemp = ""; if (strReturnMessage.Length > 4000) { // 自 strReturnMessage 中截取0-3991碼. strTemp = strReturnMessage.Substring(0, 3991) + "..."; } else { strTemp = strReturnMessage; } // 更新log table異常資訊 // Dim nodeID As XmlNode = XmlDoc.SelectSingleNode("/response/reqid") UpdateLogTableErrorInfo(colResponseXML, strServiceName, strTemp); // //fail; funMESCallERPUserBasisRet = CombineFailMsg("0000-999999", strTemp); } // ----- 執行ERP交易完畢紀錄TransactionLog ----- string argstrException = null; modAutoRunLibrary.addTransactionLog(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "MES", "MESCallERPUserBasis", Environment.MachineName, "AutoRun", arriveTime.ToString("yyyy/MM/dd HH:mm:ss"), "fail", "", "CreateMESCallERPUserBasis", strException: argstrException); //if (daTemp != null) // daTemp.Dispose(); if (drTemp != null) drTemp.Close(); } } while (false); // 當執行失敗 寄送 Email 必須有設定參數一 IDbConnection argcnnTemp = null; try { if (aryReturnMessage.Count > 0 && Conversions.ToBoolean(Operators.ConditionalCompareObjectNotEqual(colParameters["Parameter01"], "", false))) { strSubject = "[AUT]使用者-基本資料抛轉失敗! "; strBody = Strings.Replace(strReturnMessage, Conversions.ToString('\n'), "
", Compare: CompareMethod.Text); argcnnTemp = CreateConnection(strConnectionString); // 寄送 Email if (ERP2MES_MailNotice(ref argcnnTemp, ref aryReturnMessage, strSubject, Conversions.ToString(colParameters["Parameter01"]), CInput(strBody)) < 0) { // '寄送不成功, ReturnMessage 再增加1項. // 'ProductIntegration += Chr(10) & aryReturnMessage.Item(aryReturnMessage.Count - 1).ToString // 寄送不成功, ReturnMessage 再增加1項. // tblMESAutoRunLog.ReturnMessage 長度4000限制. if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(funMESCallERPUserBasisRet.ToString().Length, 4000, false))) { string strTemp = ""; strTemp = strReturnMessage; if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(strTemp + aryReturnMessage[aryReturnMessage.Count - 1].ToString().Length, 4000, false))) { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); } else { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); // 自 strTemp 中截取0-3991碼. strTemp = strTemp.Substring(0, 3991) + "..."; } // //fail; funMESCallERPUserBasisRet = CombineFailMsg("0000-999999", strTemp); } } } } catch (Exception) { throw; } finally { CloseConnection(argcnnTemp); } return funMESCallERPUserBasisRet; } // ======================================================================================================================== // 程式名稱:funMESCallERPDeleteLogData // 傳入參數:colParameters // 傳回參數:success(成功), fail(失敗) // 用 途:刪除拋轉資料 // 撰寫人員:敬翔 // 撰寫日期:2017/02/08 // ======================================================================================================================== private object funMESCallERPDeleteLogData(Collection colParameters = null) { object funMESCallERPDeleteLogDataRet = default(object); var drTemp = default(DbDataReader); string strSQL; var XmlDoc = new XmlDocument(); //var daTemp = default(System.Data.OleDb.OleDbDataAdapter); var CollectionSQL = new Collection(); var arriveTime = DateTime.Now; string strDay = ""; // 刪除天數 string strDate = ""; // 刪除日期 string strDeleteDay = ""; // 刪除此參數日期前的資料 string strParameter01 = ""; string strReturnMessage = ""; // 錯誤訊息(tblMESAutoRunLog.ReturnMessage),Chr(10)分隔錯誤項目。 var aryReturnMessage = new ArrayList(); // Catch Error Message (Exception及MES判定錯誤訊息)。 string strSubject, strBody; // 寄送通知資訊 var colResponseXML = new Collection(); do { try { // Parameter01為傳入參數,作為E-mail,若無此值則不進行下面的程式 if (!(colParameters["Parameter01"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter01"])))) { strParameter01 = colParameters["Parameter01"].ToString().Trim(); } else { aryReturnMessage.Add(TranslateMsg("Mail GroupNo [%NOT SET%]!", strLanguageMode, strResourceDir)); break; } // Parameter05為傳入參數,作為刪除日期 if (!(colParameters["Parameter05"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter05"])))) { // yyyyMd if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(colParameters["Parameter05"].ToString().Length, 6, false))) { strDate = Conversions.ToString(colParameters["Parameter05"].ToString().Substring(0, 4) + "/0" + colParameters["Parameter05"].ToString().Substring(4, 1) + "/0" + colParameters["Parameter05"].ToString().Substring(5, 1)); } // yyyyMMdd else if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(colParameters["Parameter05"].ToString().Length, 8, false))) { strDate = Conversions.ToString(colParameters["Parameter05"].ToString().Substring(0, 4) + "/" + colParameters["Parameter05"].ToString().Substring(4, 2) + "/" + colParameters["Parameter05"].ToString().Substring(6, 2)); } // yyyy/MM/dd else if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(colParameters["Parameter05"].ToString().Length, 10, false))) { strDate = colParameters["Parameter05"].ToString().Trim(); } } else { // 沒輸入則取當前日期 strDate = DateTime.Now.ToString("yyyy/MM/dd"); } // Parameter04為傳入參數,作為刪除天數 if (!Information.IsNumeric(colParameters["Parameter04"])) { // 預設取30天 30天前全刪 strDay = 30.ToString(); } else if (!(colParameters["Parameter04"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter04"]))) & Conversions.ToDouble(Strings.Trim(Conversions.ToString(colParameters["Parameter04"]))) > 0d) { strDay = colParameters["Parameter04"].ToString().Trim(); } else { aryReturnMessage.Add(TranslateMsg("Parameter 04, [%INVOKE FAIL%]!", strLanguageMode, strResourceDir)); break; } strDate = Strings.FormatDateTime(Conversions.ToDate(strDate), Microsoft.VisualBasic.DateFormat.ShortDate); strDeleteDay = DateAndTime.DateAdd("D", -Convert.ToInt32(strDay), strDate).ToString("yyyy/MM/dd"); // 刪除LogTable strSQL = "delete TBLERPTRANSACTIONXMLLOG_BASIS where to_char(CreateDate,'yyyy/MM/dd') < '" + strDeleteDay + "'"; ExecuteSQLNoneQuery(strDataBaseType, strConnectionString, ref strSQL); } catch (Exception ex) { funMESCallERPDeleteLogDataRet = "fail;" + ex.Message; OutXml = ex.Message; aryReturnMessage.Add(OutXml); results = "fail"; // ----- 執行ERP交易完畢紀錄TransactionLog ----- string argstrException = null; modAutoRunLibrary.addTransactionLog_ErrorCode(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "MES", "MESCallERPDeleteLogData", Environment.MachineName, "AutoRun", arriveTime.ToString("yyyy/MM/dd HH:mm:ss"), results, "", "CreateMESCallERPDeleteLogData", LogClass: "AutoRun", strException: argstrException); // 2013/02/05, Hank, Send Email colParameters.Add(funMESCallERPShiftBasis(), "EmailBody"); SendJobFailEmail(colParameters); } finally { // -------------------------------------------------- // 回傳執行結果:succces 或 fail(ReturnMessage) // -------------------------------------------------- if (aryReturnMessage.Count == 0) { funMESCallERPDeleteLogDataRet = "success"; results = "success"; } else { // 組合執行錯誤字串: Chr(10)分隔 strReturnMessage = ArrayList2String(ref aryReturnMessage); if ((strReturnMessage ?? "") == defString) { // 當錯誤字串組合失敗。補上 strReturnMessage = "ReturnMessage收集失敗!!"; } // tblMESAutoRunLog.ReturnMessage 長度4000限制. string strTemp = ""; if (strReturnMessage.Length > 4000) { // 自 strReturnMessage 中截取0-3991碼. strTemp = strReturnMessage.Substring(0, 3991) + "..."; } else { strTemp = strReturnMessage; } // 更新log table異常資訊 // Dim nodeID As XmlNode = XmlDoc.SelectSingleNode("/response/reqid") // UpdateLogTableErrorInfo(colResponseXML, "", strTemp) // //fail; funMESCallERPDeleteLogDataRet = "fail;" + strTemp; } // ===manties:0095454 AutoRun addTransactionLog位置錯誤 需移至Finally 2021/07/06 // ----- 執行ERP交易完畢紀錄TransactionLog ----- string argstrException = null; modAutoRunLibrary.addTransactionLog(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "MES", "MESCallERPDeleteLogData", Environment.MachineName, "AutoRun", arriveTime.ToString("yyyy/MM/dd HH:mm:ss"), results, "", "CreateMESCallERPDeleteLogData", strException: argstrException); // === //if (daTemp != null) // daTemp.Dispose(); if (drTemp != null) drTemp.Close(); } } while (false); // 當執行失敗 寄送 Email 必須有設定參數一 IDbConnection argcnnTemp = null; try { if (aryReturnMessage.Count > 0 && Conversions.ToBoolean(Operators.ConditionalCompareObjectNotEqual(colParameters["Parameter01"], "", false))) { strSubject = "[AUT]刪除拋轉資料-抛轉失敗! "; strBody = Strings.Replace(strReturnMessage, Conversions.ToString('\n'), "
", Compare: CompareMethod.Text); argcnnTemp = CreateConnection(strConnectionString); // 寄送 Email if (ERP2MES_MailNotice(ref argcnnTemp, ref aryReturnMessage, strSubject, Conversions.ToString(colParameters["Parameter01"]), CInput(strBody)) < 0) { // '寄送不成功, ReturnMessage 再增加1項. // 'ProductIntegration += Chr(10) & aryReturnMessage.Item(aryReturnMessage.Count - 1).ToString // 寄送不成功, ReturnMessage 再增加1項. // tblMESAutoRunLog.ReturnMessage 長度4000限制. if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(funMESCallERPDeleteLogDataRet.ToString().Length, 4000, false))) { string strTemp = ""; strTemp = strReturnMessage; if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(strTemp + aryReturnMessage[aryReturnMessage.Count - 1].ToString().Length, 4000, false))) { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); } else { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); // 自 strTemp 中截取0-3991碼. strTemp = strTemp.Substring(0, 3991) + "..."; } // //fail; funMESCallERPDeleteLogDataRet = "fail;" + strTemp; } } } } catch (Exception) { throw; } finally { CloseConnection(argcnnTemp); } return funMESCallERPDeleteLogDataRet; } // ======================================================================================================================== // 程式名稱:GetReTransData // 傳入參數:serviceName:服務名稱 colResponseXML:ResponseXML容器 Collection // 用 途:置TBLERPTRANSACTIONXMLLOG_BASIS取得重拋資料 // 撰寫人員:崑源 // 撰寫日期:2017/03/16 // ======================================================================================================================== private void GetReTransData(string serviceName, ref Collection colResponseXML) { string strSQL = ""; var cn = default(IDbConnection); try { strSQL = "SELECT ERP2MESXML FROM TBLERPTRANSACTIONXMLLOG_BASIS WHERE STATUS = '0' AND SERVICENAME = '" + serviceName + "' ORDER BY ERPTRANSACTIONDATE "; string argstrConnectionString = Conversions.ToString(ConnectionString); cn = CreateConnection(argstrConnectionString); //cmd = CreateCommand("", cn); string argDataBaseType = Conversions.ToString(DataBaseType); //cmd.CommandText = SQLCommandTuning(argDataBaseType, ref strSQL); using (var dr = ExecuteSQLQuery_Reader(SQLCommandTuning(argDataBaseType, ref strSQL), cn)) { while (dr.Read()) colResponseXML.Add(Strings.Replace(dr["ERP2MESXML"].ToString(), "'", "''")); } } catch (Exception ex) { throw; } finally { CloseConnection(cn); } } #endregion #region ---ERP to MES 處理Function--- // ======================================================================================================================== // 程式名稱:WriteProductOrMaterailBasis // 傳入參數:objResponse(response CDO物件)、aryReturnMessage(回傳訊息參考) // 傳回參數:-1:fail,0:Success // 用 途:寫入產品或物料主檔 // 撰寫人員:05876 崑源 // 撰寫日期:2017/02/08 // ======================================================================================================================== private int WriteProductOrMaterailBasis(iMESCIO.SCI.ERP.Response.SCI_Response_item_get objResponse, ref ArrayList aryReturnMessage) { int WriteProductOrMaterailBasisRet = default(int); // 2017-06-05, Joe, ERP拋過來的料件資訊全部都寫入物料主檔中,如料件是屬產品的(A)則另外寫入產品主檔 WriteProductOrMaterailBasisRet = -1; // Return -1:fail,0:Success // =========================================================== // 宣告 DB相關 變數 // =========================================================== var drTemp = default(DbDataReader); IDbConnection cnnMES = null; Collection colSQL_2MES = new Collection(), colSQL_2MES_Rows = new Collection(); // MES正式異動資料(主要). string strSQL; string strSQLCol; string strSQLVal; // 每筆中介交易記錄 string strIfWhereCond_PK; string strMES_Result; string strMES_MESSAGE; // 錯誤訊息(中介表.MES_MESSAGE),Chr(10)分隔錯誤項目。 var aryMES_Message = new ArrayList(); // 收集單筆中介交易記錄的錯誤記錄, Exception及MES判定錯誤訊息。 try { cnnMES = CreateConnection(strConnectionString); // 宣告拋轉資料使用變數 string strERP_ProductNo, strERP_MaterialNo, strERP_ProductVersion, strERP_status, strERP_UnitNo, strERP_ItemName, strErpNo, strERP_SpecNo, strERP_LotManage = default(string); DataRow drChk; string strERP_ProductNo_MaterialNo; //item_sort值為空值時,item_no 暫存, 19245 // 預設值 string strProductType = "PRODUCT"; // 給予預設值"PRODUCT",若不存在則自動新增產品類別. int intIssueState = 0; int intCurVersion = 0; // Dim strSpecNo As String = "N/A" string strMaterialType = "MATERIL"; // 給予預設值"MATERIL",若不存在則自動新增物料類別. int intPutInPlace = 3; // 投料點:預設為3(工單). int intCountWay = 1; // 計量方法:預設為1(實際用量). int intCheckLotNo = 1; // 物料批號檢查:預設為0(不檢查批號). var aryProductType = new ArrayList(); // 記錄產品類別是否新增 var aryMaterialType = new ArrayList(); // 記錄物料類別是否新增 var aryUnitNo = new ArrayList(); // 記錄單位主檔是否新增 do { try { bool exitTry2 = false; for (int intRow = 0, loopTo = objResponse.item_get.Count - 1; intRow <= loopTo; intRow++) { if (string.IsNullOrWhiteSpace(objResponse.item_get[intRow].item_sort)) { // 0129695, item_sort值為空值時, tran_status="D" 不回報錯誤,且同步刪除物料主檔及產品主檔中該物料編號, 19245, 2023/08/29 int intchkMaterial_Product = 0; // 取出欄位資料 strERP_ProductNo_MaterialNo = objResponse.item_get[intRow].item_no.Trim().ToUpper(); strERP_status = objResponse.item_get[intRow].tran_status.Trim().ToUpper(); if (strERP_status == "D") { // 檢查是否有此物料設定 drChk = GetMaterialBasis(strERP_ProductNo_MaterialNo, cnnMES, aryMES_Message); if (drChk != null) { if (!(drChk["MaterialNo"] is DBNull)) { // ----------------------------------------------------------- // 物料編號使用狀況檢查 // ----------------------------------------------------------- if (ProductIntegration_ChkforDelMaterialNo(ref cnnMES, ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_ProductNo_MaterialNo) < 0) { exitTry2 = true; break; // GoTo lblExitTry_2_NextRow } if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drChk["IssueState"], 0, false))) { // ----------------------------------------------------------- // 刪除MES物料相關設定 // ----------------------------------------------------------- if (ProductIntegration_DelMaterial(ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_ProductNo_MaterialNo) < 0) { exitTry2 = true; break; // GoTo lblExitTry_2_NextRow } } else { // ----------------------------------------------------------- // 作廢MES物料設定 // ----------------------------------------------------------- strSQL = "Update tblMTLMaterialBasis Set " + " IssueState=-1" + " Where MaterialNo='" + strERP_ProductNo_MaterialNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } } // aryMES_Message.Add(TranslateMsg("[%MATERIALNO%]item_no): " & strERP_ProductNo_MaterialNo & ", [%IS NOT EXIST%], [%NOT ALLOW TO DELETE%]!!")) // 刪除有可能會在資料庫中取不到資料,因為同一個交易還沒有commit; else intchkMaterial_Product = ProductIntegration_DelMaterial(ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_ProductNo_MaterialNo); } else intchkMaterial_Product = -1; //沒有物料編號 // 檢查是否有此產品設定 if (string.IsNullOrWhiteSpace(objResponse.item_get[intRow].item_ver)) //判斷version是否為空 { strERP_ProductVersion = Interaction.IIf(string.IsNullOrWhiteSpace(objResponse.item_get[intRow].item_ver), "1", objResponse.item_get[intRow].item_ver).ToString().Trim(); strSQL = "Select ProductNo,IssueState From tblPRDProductBasis " + " Where ProductNo ='" + strERP_ProductNo_MaterialNo + "'" + " And ProductVersion='" + strERP_ProductVersion + "'"; drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); if (drTemp.Read()) { if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], 0, false))) { // ----------------------------------------------------------- // 先刪除MES產品相關設定 // ----------------------------------------------------------- if (ProductIntegration_DelProduct(ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_ProductNo_MaterialNo, strERP_ProductVersion) < 0) { exitTry2 = true; break; // GoTo lblExitTry_2_NextRow } } else { // ----------------------------------------------------------- // 作廢MES產品設定 // ----------------------------------------------------------- strSQL = "Update tblPRDProductBasis Set " + " IssueState=-1" + " Where ProductNo='" + strERP_ProductNo_MaterialNo + "'" + " And ProductVersion='" + strERP_ProductVersion + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } } // aryMES_Message.Add(TranslateMsg("[%PRODUCTNO%](item_no): " & strERP_ProductNo_MaterialNo & ", [%PRODUCTVERSION%](item_ver): " & strERP_ProductVersion & ", [%IS NOT EXIST%], [%NOT ALLOW TO DELETE%]!!")) // 刪除有可能會在資料庫中取不到資料,因為同一個交易還沒有commit; else intchkMaterial_Product = ProductIntegration_DelProduct(ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_ProductNo_MaterialNo, strERP_ProductVersion); drTemp.Close(); //cmmTemp.Dispose(); } else intchkMaterial_Product = -1; //沒有產品 if (intchkMaterial_Product != 0) { exitTry2 = true; break; // GoTo lblExitTry_2_NextRow } } else { aryMES_Message.Add(TranslateMsg("item_sort" + " [%Is Empty%]!", strLanguageMode, strResourceDir)); } break; } if (objResponse.item_get[intRow].item_sort.Equals("A")) // 處理產品類型 { // ----------------------------------------------------------- // 固定檢查ProductType='PRODUCT'資料,若不存在則自動新增。 // ----------------------------------------------------------- // If AddProductType(cnnMES, colSQL_2MES, colSQL_2MES_Rows, aryMES_Message, strProductType, strERPCreator, DateTime.Now, "AutoRun建立") < 0 Then Exit Try if (aryProductType.IndexOf(strProductType) == -1) { if (AddProductType(ref cnnMES, ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strProductType, strERPCreator, DateTime.Now, "AutoRun建立") < 0) { exitTry2 = true; break; } else { aryProductType.Add(strProductType); } } // ----------------------------------------------------------- // 取出各欄位資料 // ----------------------------------------------------------- strERP_ProductNo = objResponse.item_get[intRow].item_no.Trim().ToUpper(); strErpNo = objResponse.item_get[intRow].item_no.Trim(); // 記錄原始之ERP編號 strERP_ProductVersion = Interaction.IIf(string.IsNullOrWhiteSpace(objResponse.item_get[intRow].item_ver), "1", objResponse.item_get[intRow].item_ver).ToString().Trim(); strERP_status = objResponse.item_get[intRow].tran_status.Trim().ToUpper(); if (string.IsNullOrEmpty(objResponse.item_get[intRow].production_unit_no)) { strERP_UnitNo = "N/A"; } else // 單位有傳入才作檢查 { string strUnitNo = objResponse.item_get[intRow].production_unit_no.Trim(); strERP_UnitNo = objResponse.item_get[intRow].production_unit_no.Trim().ToLower(); // ----------------------------------------------------------- // 檢查UnitNo資料,若不存在則自動新增。 // ----------------------------------------------------------- if (aryUnitNo.IndexOf(strERP_UnitNo) == -1) { if (AddUnitNo(ref cnnMES, ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strUnitNo, strERPCreator, DateTime.Now, "AutoRun建立") < 0) { exitTry2 = true; break; } else { aryUnitNo.Add(strERP_UnitNo); } } } strERP_ItemName = Conversions.ToString(Interaction.IIf(string.IsNullOrWhiteSpace(objResponse.item_get[intRow].item_name), "N/A", objResponse.item_get[intRow].item_name)); strERP_SpecNo = Conversions.ToString(Interaction.IIf(string.IsNullOrWhiteSpace(objResponse.item_get[intRow].item_spec), "N/A", objResponse.item_get[intRow].item_spec)); // 檢查是否有此產品設定 strSQL = "Select ProductNo,IssueState From tblPRDProductBasis " + " Where ProductNo='" + strERP_ProductNo + "'" + " And ProductVersion='" + strERP_ProductVersion + "'"; //cmmTemp = new IDbCommand(strSQL, cnnMES); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); bool exitTry = false; switch (strERP_status ?? "") { case "AU": // 有資料修改沒資料新增 { if (!drTemp.Read()) { intIssueState = 0; // ----------------------------------------------------------- // 產品編號合理性檢查 // 2019/07/22 Eric 啟用檢查 // ----------------------------------------------------------- if (ProductIntegration_ChkValid_ProductNo(ref cnnMES, ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_ProductNo, strERP_ProductVersion) < 0) { exitTry2 = exitTry = true; break; // GoTo lblExitTry_2_NextRow } // ----------------------------------------------------------- // 新增MES產品設定 // ----------------------------------------------------------- strSQLCol = "Insert Into tblPRDProductBasis " + "(ProductNo,ProductVersion,ProductName,ProductType," + " UnitNo,UnitType,ItemSpec,Description," + " IssueState,CurVersion,Creator,CreateDate,ERPNo,QCCategory"; strSQLVal = ") Values('" + strERP_ProductNo + "','" + strERP_ProductVersion + "','" + strERP_ItemName + "','" + strProductType + "','" + strERP_UnitNo + "','" + strERP_UnitNo + "','" + strERP_SpecNo + "','AutoRun建立'," + intIssueState + "," + intCurVersion + ",'" + strERPCreator + "'," + "To_Date('" + Strings.Format(DateTime.Now, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'), '" + strErpNo + "', 'N/A'"; if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined01)) { strSQLCol += ",User_Defined01"; strSQLVal += ",'" + objResponse.item_get[intRow].user_defined01.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined02)) { strSQLCol += ",User_Defined02"; strSQLVal += ",'" + objResponse.item_get[intRow].user_defined02.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined03)) { strSQLCol += ",User_Defined03"; strSQLVal += ",'" + objResponse.item_get[intRow].user_defined03.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined04)) { strSQLCol += ",User_Defined04"; strSQLVal += ",'" + objResponse.item_get[intRow].user_defined04.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined05)) { strSQLCol += ",User_Defined05"; strSQLVal += ",'" + objResponse.item_get[intRow].user_defined05.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined06)) { strSQLCol += ",User_Defined06"; strSQLVal += ",'" + objResponse.item_get[intRow].user_defined06.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined07)) { strSQLCol += ",User_Defined07"; strSQLVal += ",'" + objResponse.item_get[intRow].user_defined07.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined08)) { strSQLCol += ",User_Defined08"; strSQLVal += ",'" + objResponse.item_get[intRow].user_defined08.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined09)) { strSQLCol += ",User_Defined09"; strSQLVal += ",'" + objResponse.item_get[intRow].user_defined09.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined10)) { strSQLCol += ",User_Defined10"; strSQLVal += ",'" + objResponse.item_get[intRow].user_defined10.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined11)) { strSQLCol += ",User_Defined11"; strSQLVal += "," + double.Parse(objResponse.item_get[intRow].user_defined11) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined12)) { strSQLCol += ",User_Defined12"; strSQLVal += "," + double.Parse(objResponse.item_get[intRow].user_defined12) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined13)) { strSQLCol += ",User_Defined13"; strSQLVal += "," + double.Parse(objResponse.item_get[intRow].user_defined13) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined14)) { strSQLCol += ",User_Defined14"; strSQLVal += "," + double.Parse(objResponse.item_get[intRow].user_defined14) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined15)) { strSQLCol += ",User_Defined15"; strSQLVal += "," + double.Parse(objResponse.item_get[intRow].user_defined15) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined16)) { strSQLCol += ",User_Defined16"; strSQLVal += "," + double.Parse(objResponse.item_get[intRow].user_defined16) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined17)) { strSQLCol += ",User_Defined17"; strSQLVal += "," + double.Parse(objResponse.item_get[intRow].user_defined17) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined18)) { strSQLCol += ",User_Defined18"; strSQLVal += "," + double.Parse(objResponse.item_get[intRow].user_defined18) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined19)) { strSQLCol += ",User_Defined19"; strSQLVal += "," + double.Parse(objResponse.item_get[intRow].user_defined19) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined20)) { strSQLCol += ",User_Defined20"; strSQLVal += "," + double.Parse(objResponse.item_get[intRow].user_defined20) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined21)) { strSQLCol += ",User_Defined21"; strSQLVal += ",To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined21).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined22)) { strSQLCol += ",User_Defined22"; strSQLVal += ",To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined22).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined23)) { strSQLCol += ",User_Defined23"; strSQLVal += ",To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined23).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined24)) { strSQLCol += ",User_Defined24"; strSQLVal += ",To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined24).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined25)) { strSQLCol += ",User_Defined25"; strSQLVal += ",To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined25).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined26)) { strSQLCol += ",User_Defined26"; strSQLVal += ",To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined26).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined27)) { strSQLCol += ",User_Defined27"; strSQLVal += ",To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined27).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined28)) { strSQLCol += ",User_Defined28"; strSQLVal += ",To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined28).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined29)) { strSQLCol += ",User_Defined29"; strSQLVal += ",To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined29).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined30)) { strSQLCol += ",User_Defined30"; strSQLVal += ",To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined30).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined31)) { strSQLCol += ",User_Defined31"; strSQLVal += ",'" + objResponse.item_get[intRow].user_defined31.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined32)) { strSQLCol += ",User_Defined32"; strSQLVal += ",'" + objResponse.item_get[intRow].user_defined32.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined33)) { strSQLCol += ",User_Defined33"; strSQLVal += "," + double.Parse(objResponse.item_get[intRow].user_defined33) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined34)) { strSQLCol += ",User_Defined34"; strSQLVal += "," + double.Parse(objResponse.item_get[intRow].user_defined34) + ""; } // 2017-05-22, Joe, Add 圖號 if (!string.IsNullOrEmpty(objResponse.item_get[intRow].graph_no)) { strSQLCol += ",GraphNo"; strSQLVal += ",'" + objResponse.item_get[intRow].graph_no.Trim() + "'"; } strSQL = strSQLCol + strSQLVal + ")"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } else { // ----------------------------------------------------------- // 修改MES產品設定 // ----------------------------------------------------------- // 2017-06-02, Joe, 修改時如原狀態為-1變更為0,其他不異動 if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], -1, false))) { intIssueState = 0; } else { intIssueState = Conversions.ToInteger(drTemp["IssueState"]); } // 2017-06-08, Joe, 修改為異動CurVersion strSQL = "Update tblPRDProductBasis Set " + " IssueState = " + intIssueState + " , ProductName = '" + strERP_ItemName + "', UnitNo = '" + strERP_UnitNo + "', UnitType = '" + strERP_UnitNo + "' " + " ,ProductType = '" + strProductType + "', ItemSpec = '" + strERP_SpecNo + "', ERPNo = '" + strErpNo + "' "; if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined01)) { strSQL += ",User_Defined01='" + objResponse.item_get[intRow].user_defined01.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined02)) { strSQL += ",User_Defined02='" + objResponse.item_get[intRow].user_defined02.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined03)) { strSQL += ",User_Defined03='" + objResponse.item_get[intRow].user_defined03.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined04)) { strSQL += ",User_Defined04='" + objResponse.item_get[intRow].user_defined04.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined05)) { strSQL += ",User_Defined05='" + objResponse.item_get[intRow].user_defined05.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined06)) { strSQL += ",User_Defined06='" + objResponse.item_get[intRow].user_defined06.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined07)) { strSQL += ",User_Defined07='" + objResponse.item_get[intRow].user_defined07.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined08)) { strSQL += ",User_Defined08='" + objResponse.item_get[intRow].user_defined08.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined09)) { strSQL += ",User_Defined09='" + objResponse.item_get[intRow].user_defined09.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined10)) { strSQL += ",User_Defined10='" + objResponse.item_get[intRow].user_defined10.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined11)) { strSQL += ",User_Defined11=" + double.Parse(objResponse.item_get[intRow].user_defined11) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined12)) { strSQL += ",User_Defined12=" + double.Parse(objResponse.item_get[intRow].user_defined12) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined13)) { strSQL += ",User_Defined13=" + double.Parse(objResponse.item_get[intRow].user_defined13) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined14)) { strSQL += ",User_Defined14=" + double.Parse(objResponse.item_get[intRow].user_defined14) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined15)) { strSQL += ",User_Defined15=" + double.Parse(objResponse.item_get[intRow].user_defined15) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined16)) { strSQL += ",User_Defined16=" + double.Parse(objResponse.item_get[intRow].user_defined16) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined17)) { strSQL += ",User_Defined17=" + double.Parse(objResponse.item_get[intRow].user_defined17) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined18)) { strSQL += ",User_Defined18=" + double.Parse(objResponse.item_get[intRow].user_defined18) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined19)) { strSQL += ",User_Defined19=" + double.Parse(objResponse.item_get[intRow].user_defined19) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined20)) { strSQL += ",User_Defined20=" + double.Parse(objResponse.item_get[intRow].user_defined20) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined21)) { strSQL += ",User_Defined21=To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined21).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined22)) { strSQL += ",User_Defined22=To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined22).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined23)) { strSQL += ",User_Defined23=To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined23).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined24)) { strSQL += ",User_Defined24=To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined24).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined25)) { strSQL += ",User_Defined25=To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined25).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined26)) { strSQL += ",User_Defined26=To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined26).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined27)) { strSQL += ",User_Defined27=To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined27).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined28)) { strSQL += ",User_Defined28=To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined28).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined29)) { strSQL += ",User_Defined29=To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined29).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined30)) { strSQL += ",User_Defined30=To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined30).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined31)) { strSQL += ",User_Defined31='" + objResponse.item_get[intRow].user_defined31.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined32)) { strSQL += ",User_Defined32='" + objResponse.item_get[intRow].user_defined32.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined33)) { strSQL += ",User_Defined33=" + double.Parse(objResponse.item_get[intRow].user_defined33) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined34)) { strSQL += ",User_Defined34=" + double.Parse(objResponse.item_get[intRow].user_defined34) + " "; } // 2017-05-22, Joe, Add 圖號 if (!string.IsNullOrEmpty(objResponse.item_get[intRow].graph_no)) { strSQL += ",GraphNo='" + objResponse.item_get[intRow].graph_no.Trim() + "'"; } strSQL += " Where ProductNo='" + strERP_ProductNo + "' And ProductVersion='" + strERP_ProductVersion + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } drTemp.Close(); //cmmTemp.Dispose(); break; } case "D": // D:刪除 { if (drTemp.Read()) { if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], 0, false))) { // ----------------------------------------------------------- // 先刪除MES產品相關設定 // ----------------------------------------------------------- if (ProductIntegration_DelProduct(ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_ProductNo, strERP_ProductVersion) < 0) { exitTry2 = exitTry = true; break; // GoTo lblExitTry_2_NextRow } } else { // ----------------------------------------------------------- // 作廢MES產品設定 // ----------------------------------------------------------- strSQL = "Update tblPRDProductBasis Set " + " IssueState=-1" + " Where ProductNo='" + strERP_ProductNo + "'" + " And ProductVersion='" + strERP_ProductVersion + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } } // aryMES_Message.Add(TranslateMsg("[%PRODUCTNO%](item_no): " & strERP_ProductNo & ", [%PRODUCTVERSION%](item_ver): " & strERP_ProductVersion & ", [%IS NOT EXIST%], [%NOT ALLOW TO DELETE%]!!")) // 刪除有可能會在資料庫中取不到資料,因為同一個交易還沒有commit; else if (ProductIntegration_DelProduct(ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_ProductNo, strERP_ProductVersion) < 0) { exitTry2 = exitTry = true; break; } drTemp.Close(); //cmmTemp.Dispose(); break; } default: { aryMES_Message.Add(TranslateMsg("[%PRODUCTNO%](item_no): " + strERP_ProductNo + ",[%TRANSTATUS%](tran_status):" + strERP_status + " [%INVALID%], [%NOT ALLOWED TO EXECUTE%]!!", strLanguageMode, strResourceDir)); break; } } if (exitTry) { break; } } // ElseIf objResponse.item_get(intRow).item_sort.Equals("M") Then '處理物料類型 // ----------------------------------------------------------- // 固定檢查MaterialType='MATERIL'資料,若不存在則自動新增。 // ----------------------------------------------------------- // If AddMaterialType(cnnMES, colSQL_2MES, colSQL_2MES_Rows, aryMES_Message, strMaterialType, strERPCreator, DateTime.Now, "AutoRun建立") < 0 Then Exit Try //****************产品物料系统参数判断开始****************** //如果item_sort是A的情况且产品物料同时并存的系统参数设定为0时,type为A只写入产品的资料,其他只写入物料 //prdOrMaterial值为1-只写入产品资料,无需写入物料;0-系统参数设定为1,同时写入(保持原有逻辑); int prdOrMaterial = GetProductOrMaterailByParameter(objResponse.item_get[intRow].item_sort); if (prdOrMaterial == 1) { WriteProductOrMaterailBasisRet = 0; continue; } //****************产品物料系统参数判断结束****************** if (aryMaterialType.IndexOf(strMaterialType) == -1) { if (AddMaterialType(ref cnnMES, ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strMaterialType, strERPCreator, DateTime.Now, "AutoRun建立") < 0) { exitTry2 = true; break; } else { aryMaterialType.Add(strMaterialType); } } // ----------------------------------------------------------- // 取出各欄位資料 // ----------------------------------------------------------- strERP_MaterialNo = objResponse.item_get[intRow].item_no.Trim().ToUpper(); strERP_status = objResponse.item_get[intRow].tran_status.Trim().ToUpper(); strErpNo = objResponse.item_get[intRow].item_no.Trim(); // 記錄原始之ERP編號 if (string.IsNullOrEmpty(objResponse.item_get[intRow].unit_no)) { strERP_UnitNo = "N/A"; } else // 單位有傳入才作檢查 { string strUnitNo = objResponse.item_get[intRow].production_unit_no.Trim(); strERP_UnitNo = objResponse.item_get[intRow].unit_no.Trim().ToLower(); // ----------------------------------------------------------- // 檢查UnitNo資料,若不存在則自動新增。 // ----------------------------------------------------------- if (aryUnitNo.IndexOf(strERP_UnitNo) == -1) { if (AddUnitNo(ref cnnMES, ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strUnitNo, strERPCreator, DateTime.Now, "AutoRun建立") < 0) { exitTry2 = true; break; } else { aryUnitNo.Add(strERP_UnitNo); } } } strERP_ItemName = Conversions.ToString(Interaction.IIf(string.IsNullOrEmpty(objResponse.item_get[intRow].item_name), "N/A", objResponse.item_get[intRow].item_name)); strERP_SpecNo = Conversions.ToString(Interaction.IIf(string.IsNullOrWhiteSpace(objResponse.item_get[intRow].item_spec), "N/A", objResponse.item_get[intRow].item_spec)); // 2019/07/08 Eric Mantis:59382 Lot_manage 欄位 批號管理 目前 T100 會拋轉 1,2,3 ,但是 MES 目前只有0/1 拋轉時並未轉換 // 0(False):不管控物料批號,系統將視物料批號為N/A。 // 1(True):管控物料批號,所有之進料、退料、扣料動作都必須輸入物料批號。 if (!string.IsNullOrWhiteSpace(objResponse.item_get[intRow].lot_manage)) { // 91087: [605][CP+FT] E10ICD整合問題_E10ICD拋轉批號查核(lot_manage)欄位值調整,MES須同步對應"是否檢查批號(CheckLotNo)"欄位 if (objResponse.item_get[intRow].lot_manage.Equals("Y") | objResponse.item_get[intRow].lot_manage.Equals("N")) { if (objResponse.item_get[intRow].lot_manage.Equals("Y") == true) { strERP_LotManage = "1"; } else if (objResponse.item_get[intRow].lot_manage.Equals("N") == true) { strERP_LotManage = "0"; } } else { strERP_LotManage = "0"; } } else { strERP_LotManage = "0"; } // If Not String.IsNullOrWhiteSpace(objResponse.item_get(intRow).lot_manage) Then // If objResponse.item_get(intRow).lot_manage.Equals("Y") Or objResponse.item_get(intRow).lot_manage.Equals("N") Then // strERP_LotManage = IIf(objResponse.item_get(intRow).lot_manage.Equals("N"), "0", "1") // Else // strERP_LotManage = objResponse.item_get(intRow).lot_manage // End If // Else // strERP_LotManage = "0" // End If // 檢查是否有此物料設定 drChk = GetMaterialBasis(strERP_MaterialNo, cnnMES, aryMES_Message); if (drChk == null) { exitTry2 = true; break; } // GoTo lblExitTry_2_NextRow 'fail bool exitTry1 = false; switch (strERP_status ?? "") { case "AU": // 有資料修改沒資料新增 { if (drChk["MaterialNo"] is DBNull) { // 2019/10/25 Eric Mantis:60113 調整成物料自動核准 intIssueState = 2; // ----------------------------------------------------------- // 物料編號合理性檢查 // 2019/07/22 Eric 啟用檢查 // ----------------------------------------------------------- if (ProductIntegration_ChkValid_MaterialNo(ref cnnMES, ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_MaterialNo) < 0) { exitTry2 = exitTry1 = true; break; // GoTo lblExitTry_2_NextRow } // ----------------------------------------------------------- // 新增MES物料設定 // MaterialName,MaterialSpec 必要欄位填"N/A". // ----------------------------------------------------------- strSQLCol = "Insert Into tblMTLMaterialBasis " + "(MaterialNo, MaterialName, MaterialSpec, MaterialType," + " PutInPlace, CountWay, CheckLotNo, UnitType, UnitNo, Description," + " IssueState, Creator, CreateDate, ERPNo, QCCategory"; strSQLVal = ") Values('" + strERP_MaterialNo + "','" + strERP_ItemName + "','" + strERP_SpecNo + "','" + strMaterialType + "'," + intPutInPlace + "," + intCountWay + "," + strERP_LotManage + ",'" + strERP_UnitNo + "','" + strERP_UnitNo + "','AutoRun建立'," + intIssueState + ",'" + strERPCreator + "'," + "To_Date('" + Strings.Format(DateTime.Now, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'), '" + strErpNo + "', 'N/A'"; if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined01)) { strSQLCol += ",User_Defined01"; strSQLVal += ",'" + objResponse.item_get[intRow].user_defined01.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined02)) { strSQLCol += ",User_Defined02"; strSQLVal += ",'" + objResponse.item_get[intRow].user_defined02.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined03)) { strSQLCol += ",User_Defined03"; strSQLVal += ",'" + objResponse.item_get[intRow].user_defined03.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined04)) { strSQLCol += ",User_Defined04"; strSQLVal += ",'" + objResponse.item_get[intRow].user_defined04.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined05)) { strSQLCol += ",User_Defined05"; strSQLVal += ",'" + objResponse.item_get[intRow].user_defined05.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined06)) { strSQLCol += ",User_Defined06"; strSQLVal += ",'" + objResponse.item_get[intRow].user_defined06.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined07)) { strSQLCol += ",User_Defined07"; strSQLVal += ",'" + objResponse.item_get[intRow].user_defined07.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined08)) { strSQLCol += ",User_Defined08"; strSQLVal += ",'" + objResponse.item_get[intRow].user_defined08.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined09)) { strSQLCol += ",User_Defined09"; strSQLVal += ",'" + objResponse.item_get[intRow].user_defined09.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined10)) { strSQLCol += ",User_Defined10"; strSQLVal += ",'" + objResponse.item_get[intRow].user_defined10.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined11)) { strSQLCol += ",User_Defined11"; strSQLVal += "," + double.Parse(objResponse.item_get[intRow].user_defined11) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined12)) { strSQLCol += ",User_Defined12"; strSQLVal += "," + double.Parse(objResponse.item_get[intRow].user_defined12) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined13)) { strSQLCol += ",User_Defined13"; strSQLVal += "," + double.Parse(objResponse.item_get[intRow].user_defined13) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined14)) { strSQLCol += ",User_Defined14"; strSQLVal += "," + double.Parse(objResponse.item_get[intRow].user_defined14) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined15)) { strSQLCol += ",User_Defined15"; strSQLVal += "," + double.Parse(objResponse.item_get[intRow].user_defined15) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined16)) { strSQLCol += ",User_Defined16"; strSQLVal += "," + double.Parse(objResponse.item_get[intRow].user_defined16) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined17)) { strSQLCol += ",User_Defined17"; strSQLVal += "," + double.Parse(objResponse.item_get[intRow].user_defined17) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined18)) { strSQLCol += ",User_Defined18"; strSQLVal += "," + double.Parse(objResponse.item_get[intRow].user_defined18) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined19)) { strSQLCol += ",User_Defined19"; strSQLVal += "," + double.Parse(objResponse.item_get[intRow].user_defined19) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined20)) { strSQLCol += ",User_Defined20"; strSQLVal += "," + double.Parse(objResponse.item_get[intRow].user_defined20) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined21)) { strSQLCol += ",User_Defined21"; strSQLVal += ",To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined21).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined22)) { strSQLCol += ",User_Defined22"; strSQLVal += ",To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined22).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined23)) { strSQLCol += ",User_Defined23"; strSQLVal += ",To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined23).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined24)) { strSQLCol += ",User_Defined24"; strSQLVal += ",To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined24).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined25)) { strSQLCol += ",User_Defined25"; strSQLVal += ",To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined25).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined26)) { strSQLCol += ",User_Defined26"; strSQLVal += ",To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined26).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined27)) { strSQLCol += ",User_Defined27"; strSQLVal += ",To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined27).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined28)) { strSQLCol += ",User_Defined28"; strSQLVal += ",To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined28).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined29)) { strSQLCol += ",User_Defined29"; strSQLVal += ",To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined29).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined30)) { strSQLCol += ",User_Defined30"; strSQLVal += ",To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined30).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined31)) { strSQLCol += ",User_Defined31"; strSQLVal += ",'" + objResponse.item_get[intRow].user_defined31.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined32)) { strSQLCol += ",User_Defined32"; strSQLVal += ",'" + objResponse.item_get[intRow].user_defined32.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined33)) { strSQLCol += ",User_Defined33"; strSQLVal += "," + double.Parse(objResponse.item_get[intRow].user_defined33) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined34)) { strSQLCol += ",User_Defined34"; strSQLVal += "," + double.Parse(objResponse.item_get[intRow].user_defined34) + ""; } // 2017-05-22, Joe, Add 圖號 if (!string.IsNullOrEmpty(objResponse.item_get[intRow].graph_no)) { strSQLCol += ",GraphNo"; strSQLVal += ",'" + objResponse.item_get[intRow].graph_no.Trim() + "'"; } strSQL = strSQLCol + strSQLVal + ")"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } else { // ----------------------------------------------------------- // 修改MES物料設定 // ----------------------------------------------------------- // 2017-06-02, Joe, 修改時如原狀態為-1變更為0,其他不異動 if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drChk["IssueState"], -1, false))) { intIssueState = 0; } else { intIssueState = Conversions.ToInteger(drChk["IssueState"]); } strSQL = "Update tblMTLMaterialBasis Set " + " IssueState = " + intIssueState + " , MaterialName = '" + strERP_ItemName + "', UnitType = '" + strERP_UnitNo + "', UnitNo = '" + strERP_UnitNo + "'" + ",CHECKLOTNO='" + strERP_LotManage + "',ERPNo='" + strErpNo + "' "; if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined01)) { strSQL += ",User_Defined01='" + objResponse.item_get[intRow].user_defined01.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined02)) { strSQL += ",User_Defined02='" + objResponse.item_get[intRow].user_defined02.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined03)) { strSQL += ",User_Defined03='" + objResponse.item_get[intRow].user_defined03.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined04)) { strSQL += ",User_Defined04='" + objResponse.item_get[intRow].user_defined04.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined05)) { strSQL += ",User_Defined05='" + objResponse.item_get[intRow].user_defined05.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined06)) { strSQL += ",User_Defined06='" + objResponse.item_get[intRow].user_defined06.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined07)) { strSQL += ",User_Defined07='" + objResponse.item_get[intRow].user_defined07.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined08)) { strSQL += ",User_Defined08='" + objResponse.item_get[intRow].user_defined08.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined09)) { strSQL += ",User_Defined09='" + objResponse.item_get[intRow].user_defined09.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined10)) { strSQL += ",User_Defined10='" + objResponse.item_get[intRow].user_defined10.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined11)) { strSQL += ",User_Defined11=" + double.Parse(objResponse.item_get[intRow].user_defined11) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined12)) { strSQL += ",User_Defined12=" + double.Parse(objResponse.item_get[intRow].user_defined12) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined13)) { strSQL += ",User_Defined13=" + double.Parse(objResponse.item_get[intRow].user_defined13) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined14)) { strSQL += ",User_Defined14=" + double.Parse(objResponse.item_get[intRow].user_defined14) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined15)) { strSQL += ",User_Defined15=" + double.Parse(objResponse.item_get[intRow].user_defined15) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined16)) { strSQL += ",User_Defined16=" + double.Parse(objResponse.item_get[intRow].user_defined16) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined17)) { strSQL += ",User_Defined17=" + double.Parse(objResponse.item_get[intRow].user_defined17) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined18)) { strSQL += ",User_Defined18=" + double.Parse(objResponse.item_get[intRow].user_defined18) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined19)) { strSQL += ",User_Defined19=" + double.Parse(objResponse.item_get[intRow].user_defined19) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined20)) { strSQL += ",User_Defined20=" + double.Parse(objResponse.item_get[intRow].user_defined20) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined21)) { strSQL += ",User_Defined21=To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined21).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined22)) { strSQL += ",User_Defined22=To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined22).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined23)) { strSQL += ",User_Defined23=To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined23).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined24)) { strSQL += ",User_Defined24=To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined24).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined25)) { strSQL += ",User_Defined25=To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined25).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined26)) { strSQL += ",User_Defined26=To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined26).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined27)) { strSQL += ",User_Defined27=To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined27).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined28)) { strSQL += ",User_Defined28=To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined28).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined29)) { strSQL += ",User_Defined29=To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined29).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined30)) { strSQL += ",User_Defined30=To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined30).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined31)) { strSQL += ",User_Defined31='" + objResponse.item_get[intRow].user_defined31.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined32)) { strSQL += ",User_Defined32='" + objResponse.item_get[intRow].user_defined32.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined33)) { strSQL += ",User_Defined33=" + double.Parse(objResponse.item_get[intRow].user_defined33) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined34)) { strSQL += ",User_Defined34=" + double.Parse(objResponse.item_get[intRow].user_defined34) + " "; } // 2017-05-22, Joe, Add 圖號 if (!string.IsNullOrEmpty(objResponse.item_get[intRow].graph_no)) { strSQL += ",GraphNo='" + objResponse.item_get[intRow].graph_no.Trim() + "'"; } strSQL += " Where MaterialNo='" + strERP_MaterialNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } break; } case "D": // D:刪除 { // 檢查是否有此物料設定 drChk = GetMaterialBasis(strERP_MaterialNo, cnnMES, aryMES_Message); if (drChk == null) { exitTry2 = exitTry1 = true; break; } // GoTo lblExitTry_2_NextRow 'fail if (!(drChk["MaterialNo"] is DBNull)) { // ----------------------------------------------------------- // 物料編號使用狀況檢查 // ----------------------------------------------------------- if (ProductIntegration_ChkforDelMaterialNo(ref cnnMES, ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_MaterialNo) < 0) { exitTry2 = exitTry1 = true; break; // GoTo lblExitTry_2_NextRow } if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drChk["IssueState"], 0, false))) { // ----------------------------------------------------------- // 刪除MES物料相關設定 // ----------------------------------------------------------- if (ProductIntegration_DelMaterial(ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_MaterialNo) < 0) { exitTry2 = exitTry1 = true; break; // GoTo lblExitTry_2_NextRow } } else { // ----------------------------------------------------------- // 作廢MES物料設定 // ----------------------------------------------------------- strSQL = "Update tblMTLMaterialBasis Set " + " IssueState=-1" + " Where MaterialNo='" + strERP_MaterialNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } } // aryMES_Message.Add(TranslateMsg("[%MATERIALNO%]item_no): " & strERP_MaterialNo & ", [%IS NOT EXIST%], [%NOT ALLOW TO DELETE%]!!")) // 刪除有可能會在資料庫中取不到資料,因為同一個交易還沒有commit; else if (ProductIntegration_DelMaterial(ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_MaterialNo) < 0) { exitTry2 = exitTry1 = true; break; // GoTo lblExitTry_2_NextRow } break; } default: { aryMES_Message.Add(TranslateMsg("[%MATERIALNO%]item_no): " + strERP_MaterialNo + ",[%TRANSTATUS%](tran_status):" + strERP_status + " [%INVALID%], [%NOT ALLOWED TO EXECUTE%]!!", strLanguageMode, strResourceDir)); break; } } if (exitTry1) { break; } } if (exitTry2) { break; // End If } } catch (Exception EX_drIF) { strMES_Result = "9"; aryMES_Message.Add("WriteProductOrMaterailBasis.Exception" + '\n' + EX_drIF.Message); } finally { // =============================================================================== // 判定 MES_Result 處理結果 (成功回寫1, 失敗回寫9). // =============================================================================== if (aryMES_Message.Count == 0) { strMES_Result = "1"; // -------------------------------------------------- // MES資料庫異動 // -------------------------------------------------- if (colSQL_2MES.Count > 0) { ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colSQL_2MES, colSQL_2MES_Rows); } } // 組合執行錯誤字串: Chr(10)分隔 strMES_MESSAGE = ArrayList2String(ref aryMES_Message); // MES_Message長度4000限制, 截取0-3996碼加"...". if (strMES_MESSAGE.Length > 4000) strMES_MESSAGE = strMES_MESSAGE.Substring(0, 3996) + "..."; // ---取消前面收集SQL--- colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); // 當該筆交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 if (aryMES_Message.Count > 0) { foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); } } } while (false); // //return 0 : Success WriteProductOrMaterailBasisRet = 0; } catch (Exception ex) { aryMES_Message.Add("WriteProductOrMaterailBasis,Finally:" + ex.Message); // 當該筆交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); throw; } finally { if (drTemp != null) drTemp.Close(); CloseConnection(cnnMES); } return WriteProductOrMaterailBasisRet; } // ======================================================================================================================== // 程式名稱:WriteMaterialVendorBasis // 傳入參數:objResponse(response CDO物件)、aryReturnMessage(回傳訊息參考) // 傳回參數:-1:fail,0:Success // 用 途:寫入物料供應商主檔 // 撰寫人員:05876 崑源 // 撰寫日期:2017/02/08 // ======================================================================================================================== private int WriteVendorBasis(iMESCIO.SCI.ERP.Response.SCI_Response_supplier_get objResponse, ref ArrayList aryReturnMessage) { int WriteVendorBasisRet = default(int); WriteVendorBasisRet = -1; // Return -1:fail,0:Success // =========================================================== // 宣告 DB相關 變數 // =========================================================== var drTemp = default(DbDataReader); IDbConnection cnnMES = null; var colSQL_2MES = new Collection(); // MES正式異動資料(主要). string strSQL; // 每筆中介交易記錄 string strIfWhereCond_PK; string strMES_Result; string strMES_MESSAGE; // 錯誤訊息(中介表.MES_MESSAGE),Chr(10)分隔錯誤項目。 var aryMES_Message = new ArrayList(); // 收集單筆中介交易記錄的錯誤記錄, Exception及MES判定錯誤訊息。 try { cnnMES = CreateConnection(strConnectionString); // 宣告拋轉資料使用變數 string strERP_VendorNo, strERP_VendorName, strERP_status, strErpNo; // 預設值 int intIssueState = 0; try { for (int intRow = 0, loopTo = objResponse.supplier_get.Count - 1; intRow <= loopTo; intRow++) { // ----------------------------------------------------------- // 取出各欄位資料 // ----------------------------------------------------------- strERP_VendorNo = objResponse.supplier_get[intRow].supplier_no.Trim().ToUpper(); strERP_status = objResponse.supplier_get[intRow].tran_status.Trim().ToUpper(); strErpNo = objResponse.supplier_get[intRow].supplier_no.Trim(); // 記錄原始之ERP編號 strERP_VendorName = objResponse.supplier_get[intRow].supplier_name.Trim(); strERP_VendorName = Conversions.ToString(Interaction.IIf(string.IsNullOrWhiteSpace(strERP_VendorName), "N/A", strERP_VendorName)); // 一、檢查是否有此物料供應商設定 strSQL = "Select VendorNo,IssueState From tblMTLMaterialVendor " + " Where VendorNo='" + strERP_VendorNo + "'"; //cmmTemp = new IDbCommand(strSQL, cnnMES); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); switch (strERP_status ?? "") { case "AU": // 有資料修改沒資料新增 { if (!drTemp.Read()) { intIssueState = 0; // 新增物料供應商 strSQL = "Insert Into tblMTLMaterialVendor (VendorNo,VendorName,IssueState,Description,Creator,CreateDate,ERPNo)"; strSQL += " Values('" + strERP_VendorNo + "','" + strERP_VendorName + "'," + intIssueState + ",'AutoRun建立','" + strERPCreator + "',To_Date('" + Strings.Format(DateTime.Now, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'), '" + strErpNo + "')"; colSQL_2MES.Add(strSQL); // 聯絡人資訊 var supplirLists = objResponse.supplier_get[intRow].supplier_detail; if (supplirLists != null) { foreach (iMESCIO.SCI.ERP.Response.SCI_supplier_detail detail in supplirLists) { string strContractorName = Conversions.ToString(Interaction.IIf(string.IsNullOrWhiteSpace(detail.contractor_name), "N/A", detail.contractor_name)); strSQL = "INSERT INTO TBLMTLMATERIALVENDORCONTACTOR (VENDORNO, CONTACTORNAME, TELNO, FAXNO, TITLE, ADDRESS, EMAIL, DESCRIPTION) VALUES "; strSQL += "('" + strERP_VendorNo + "', '" + strContractorName + "','" + detail.telephone_number + "','" + detail.fax_no + "','" + detail.title + "','" + detail.address + "','" + detail.email + "','" + detail.remark + "')"; colSQL_2MES.Add(strSQL); } } } else { // 2017-06-02, Joe, 修改時如原狀態為-1變更為0,其他不異動 if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], -1, false))) { intIssueState = 0; } else { intIssueState = Conversions.ToInteger(drTemp["IssueState"]); } // 修改MES物料供應商設定 strSQL = "Update tblMTLMaterialVendor Set IssueState = " + intIssueState + ", VendorName = '" + strERP_VendorName + "', ERPNo = '" + strErpNo + "' " + " Where VendorNo='" + strERP_VendorNo + "'"; colSQL_2MES.Add(strSQL); // 聯絡人資訊一律重新新增 colSQL_2MES.Add("DELETE FROM TBLMTLMATERIALVENDORCONTACTOR WHERE VendorNo='" + strERP_VendorNo + "'"); var supplirLists = objResponse.supplier_get[intRow].supplier_detail; if (supplirLists != null) { foreach (iMESCIO.SCI.ERP.Response.SCI_supplier_detail detail in supplirLists) { string strContractorName = Conversions.ToString(Interaction.IIf(string.IsNullOrWhiteSpace(detail.contractor_name), "N/A", detail.contractor_name)); strSQL = "INSERT INTO TBLMTLMATERIALVENDORCONTACTOR (VENDORNO, CONTACTORNAME, TELNO, FAXNO, TITLE, ADDRESS, EMAIL, DESCRIPTION) VALUES "; strSQL += "('" + strERP_VendorNo + "', '" + strContractorName + "','" + detail.telephone_number + "','" + detail.fax_no + "','" + detail.title + "','" + detail.address + "','" + detail.email + "','" + detail.remark + "')"; colSQL_2MES.Add(strSQL); } } } break; } case "D": // D:刪除 { if (drTemp.Read()) { if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], 0, false))) { // ----------------------------------------------------------- // 刪除MES物料供應商相關設定 // ----------------------------------------------------------- // 1. 刪除Contactor strSQL = "Delete From TBLMTLMATERIALVENDORCONTACTOR Where VendorNo='" + strERP_VendorNo + "'"; colSQL_2MES.Add(strSQL); // 2. 刪除物料供應商主檔 strSQL = "Delete From TBLMTLMATERIALVENDOR Where VendorNo ='" + strERP_VendorNo + "'"; colSQL_2MES.Add(strSQL); } else { // ----------------------------------------------------------- // 作廢MES供應商設定 // ----------------------------------------------------------- strSQL = "Update TBLMTLMATERIALVENDOR Set IssueState=-1 Where VendorNo='" + strERP_VendorNo + "'"; colSQL_2MES.Add(strSQL); } } else { // 刪除有可能會在資料庫中取不到資料,因為同一個交易還沒有commit; // 刪除MES物料供應商相關設定 // ----------------------------------------------------------- // 1. 刪除Contactor strSQL = "Delete From TBLMTLMATERIALVENDORCONTACTOR Where VendorNo='" + strERP_VendorNo + "'"; colSQL_2MES.Add(strSQL); // 2. 刪除物料供應商主檔 strSQL = "Delete From TBLMTLMATERIALVENDOR Where VendorNo ='" + strERP_VendorNo + "'"; colSQL_2MES.Add(strSQL); } break; } } drTemp.Close(); //cmmTemp.Dispose(); // 二、檢查是否有此設備供應商設定 strSQL = "Select VendorNo,IssueState From TBLEQPVENDOR Where VendorNo='" + strERP_VendorNo + "'"; //cmmTemp = new IDbCommand(strSQL, cnnMES); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); switch (strERP_status ?? "") { case "AU": // 有資料修改沒資料新增 { if (!drTemp.Read()) { intIssueState = 0; // 新增設備供應商 strSQL = "Insert Into TBLEQPVENDOR (VendorNo,VendorName,IssueState,Description,Creator,CreateDate,ERPNo)"; strSQL += " Values('" + strERP_VendorNo + "','" + strERP_VendorName + "'," + intIssueState + ",'AutoRun建立','" + strERPCreator + "',To_Date('" + Strings.Format(DateTime.Now, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'), '" + strErpNo + "')"; colSQL_2MES.Add(strSQL); // 聯絡人資訊 var supplirLists = objResponse.supplier_get[intRow].supplier_detail; if (supplirLists != null) { foreach (iMESCIO.SCI.ERP.Response.SCI_supplier_detail detail in supplirLists) { string strContractorName = Conversions.ToString(Interaction.IIf(string.IsNullOrWhiteSpace(detail.contractor_name), "N/A", detail.contractor_name)); strSQL = "INSERT INTO TBLEQPVENDORCONTACTOR (VENDORNO, CONTACTORNAME, TELNO, FAXNO, TITLE, ADDRESS, EMAIL, DESCRIPTION) VALUES "; strSQL += "('" + strERP_VendorNo + "', '" + strContractorName + "','" + detail.telephone_number + "','" + detail.fax_no + "','" + detail.title + "','" + detail.address + "','" + detail.email + "','" + detail.remark + "')"; colSQL_2MES.Add(strSQL); } } } else { // 2017-06-02, Joe, 修改時如原狀態為-1變更為0,其他不異動 if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], -1, false))) { intIssueState = 0; } else { intIssueState = Conversions.ToInteger(drTemp["IssueState"]); } // 修改MES設備供應商設定 strSQL = "Update TBLEQPVENDOR Set IssueState = " + intIssueState + ", VendorName = '" + strERP_VendorName + "' " + " Where VendorNo='" + strERP_VendorNo + "'"; colSQL_2MES.Add(strSQL); // 聯絡人資訊一律重新新增 colSQL_2MES.Add("DELETE FROM TBLEQPVENDORCONTACTOR WHERE VendorNo='" + strERP_VendorNo + "'"); var supplirLists = objResponse.supplier_get[intRow].supplier_detail; if (supplirLists != null) { foreach (iMESCIO.SCI.ERP.Response.SCI_supplier_detail detail in supplirLists) { string strContractorName = Conversions.ToString(Interaction.IIf(string.IsNullOrWhiteSpace(detail.contractor_name), "N/A", detail.contractor_name)); strSQL = "INSERT INTO TBLEQPVENDORCONTACTOR (VENDORNO, CONTACTORNAME, TELNO, FAXNO, TITLE, ADDRESS, EMAIL, DESCRIPTION) VALUES "; strSQL += "('" + strERP_VendorNo + "', '" + strContractorName + "','" + detail.telephone_number + "','" + detail.fax_no + "','" + detail.title + "','" + detail.address + "','" + detail.email + "','" + detail.remark + "')"; colSQL_2MES.Add(strSQL); } } } break; } case "D": { if (drTemp.Read()) { if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], 0, false))) { // ----------------------------------------------------------- // 刪除MES設備供應商相關設定 // ----------------------------------------------------------- // 1. 刪除Contactor strSQL = "Delete From TBLEQPVENDORCONTACTOR Where VendorNo='" + strERP_VendorNo + "'"; colSQL_2MES.Add(strSQL); // 2. 刪除設備供應商主檔 strSQL = "Delete From TBLEQPVENDOR Where VendorNo ='" + strERP_VendorNo + "'"; colSQL_2MES.Add(strSQL); } else { // ----------------------------------------------------------- // 作廢MES供應商設定 // ----------------------------------------------------------- strSQL = "Update TBLEQPVENDOR Set IssueState=-1 Where VendorNo='" + strERP_VendorNo + "'"; colSQL_2MES.Add(strSQL); } } else { // 刪除有可能會在資料庫中取不到資料,因為同一個交易還沒有commit; // 刪除MES設備供應商相關設定 // ----------------------------------------------------------- // 1. 刪除Contactor strSQL = "Delete From TBLEQPVENDORCONTACTOR Where VendorNo='" + strERP_VendorNo + "'"; colSQL_2MES.Add(strSQL); // 2. 刪除設備供應商主檔 strSQL = "Delete From TBLEQPVENDOR Where VendorNo ='" + strERP_VendorNo + "'"; colSQL_2MES.Add(strSQL); } break; } } drTemp.Close(); //cmmTemp.Dispose(); // 三、檢查是否有此外包商設定 strSQL = "Select SUBCONTRACTORNO,IssueState From TBLENTSUBCONTRACTOR Where SUBCONTRACTORNO='" + strERP_VendorNo + "'"; //cmmTemp = new IDbCommand(strSQL, cnnMES); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); switch (strERP_status ?? "") { case "AU": // 有資料修改沒資料新增 { if (!drTemp.Read()) { intIssueState = 0; // 新增外包商 strSQL = "Insert Into TBLENTSUBCONTRACTOR (SUBCONTRACTORNO,SUBCONTRACTORNAME,IssueState,Description,Creator,CreateDate,ERPNo)"; strSQL += " Values('" + strERP_VendorNo + "','" + strERP_VendorName + "'," + intIssueState + ",'AutoRun建立','" + strERPCreator + "',To_Date('" + Strings.Format(DateTime.Now, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'), '" + strErpNo + "')"; colSQL_2MES.Add(strSQL); // 聯絡人資訊 var supplirLists = objResponse.supplier_get[intRow].supplier_detail; if (supplirLists != null) { foreach (iMESCIO.SCI.ERP.Response.SCI_supplier_detail detail in supplirLists) { string strContractorName = Conversions.ToString(Interaction.IIf(string.IsNullOrWhiteSpace(detail.contractor_name), "N/A", detail.contractor_name)); strSQL = "INSERT INTO TBLENTSUBCONTRACTORCONT (SUBCONTRACTORNO, CONTACTORNAME, TELNO, FAXNO, TITLE, ADDRESS, EMAIL, DESCRIPTION) VALUES "; strSQL += "('" + strERP_VendorNo + "', '" + strContractorName + "','" + detail.telephone_number + "','" + detail.fax_no + "','" + detail.title + "','" + detail.address + "','" + detail.email + "','" + detail.remark + "')"; colSQL_2MES.Add(strSQL); } } } else { // 2017-06-02, Joe, 修改時如原狀態為-1變更為0,其他不異動 if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], -1, false))) { intIssueState = 0; } else { intIssueState = Conversions.ToInteger(drTemp["IssueState"]); } // 修改MES外包商設定 strSQL = "Update TBLENTSUBCONTRACTOR Set IssueState = " + intIssueState + ", SUBCONTRACTORNAME = '" + strERP_VendorName + "' " + " Where SUBCONTRACTORNO='" + strERP_VendorNo + "'"; colSQL_2MES.Add(strSQL); // 聯絡人資訊一律重新新增 colSQL_2MES.Add("DELETE FROM TBLENTSUBCONTRACTORCONT WHERE SUBCONTRACTORNO='" + strERP_VendorNo + "'"); // 聯絡人資訊 var supplirLists = objResponse.supplier_get[intRow].supplier_detail; if (supplirLists != null) { foreach (iMESCIO.SCI.ERP.Response.SCI_supplier_detail detail in supplirLists) { string strContractorName = Conversions.ToString(Interaction.IIf(string.IsNullOrWhiteSpace(detail.contractor_name), "N/A", detail.contractor_name)); strSQL = "INSERT INTO TBLENTSUBCONTRACTORCONT (SUBCONTRACTORNO, CONTACTORNAME, TELNO, FAXNO, TITLE, ADDRESS, EMAIL, DESCRIPTION) VALUES "; strSQL += "('" + strERP_VendorNo + "', '" + strContractorName + "','" + detail.telephone_number + "','" + detail.fax_no + "','" + detail.title + "','" + detail.address + "','" + detail.email + "','" + detail.remark + "')"; colSQL_2MES.Add(strSQL); } } } break; } case "D": { if (drTemp.Read()) { if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], 0, false))) { // ----------------------------------------------------------- // 刪除MES外包商相關設定 // ----------------------------------------------------------- // 1. 刪除Contactor strSQL = "Delete From TBLENTSUBCONTRACTORCONT Where SUBCONTRACTORNO='" + strERP_VendorNo + "'"; colSQL_2MES.Add(strSQL); // 2. 刪除外包商主檔 strSQL = "Delete From TBLENTSUBCONTRACTOR Where SUBCONTRACTORNO ='" + strERP_VendorNo + "'"; colSQL_2MES.Add(strSQL); } else { // ----------------------------------------------------------- // 作廢MES供應商設定 // ----------------------------------------------------------- strSQL = "Update TBLENTSUBCONTRACTOR Set IssueState=-1 Where SUBCONTRACTORNO='" + strERP_VendorNo + "'"; colSQL_2MES.Add(strSQL); } } else { // 刪除有可能會在資料庫中取不到資料,因為同一個交易還沒有commit; // ----------------------------------------------------------- // 刪除MES外包商相關設定 // ----------------------------------------------------------- // 1. 刪除Contactor strSQL = "Delete From TBLENTSUBCONTRACTORCONT Where SUBCONTRACTORNO='" + strERP_VendorNo + "'"; colSQL_2MES.Add(strSQL); // 2. 刪除外包商主檔 strSQL = "Delete From TBLENTSUBCONTRACTOR Where SUBCONTRACTORNO ='" + strERP_VendorNo + "'"; colSQL_2MES.Add(strSQL); } break; } } drTemp.Close(); //cmmTemp.Dispose(); } } catch (Exception ex) { strMES_Result = "9"; aryMES_Message.Add("Exception" + '\n' + ex.Message); } finally { // =============================================================================== // 判定 MES_Result 處理結果 (成功回寫1, 失敗回寫9). // =============================================================================== if (aryMES_Message.Count == 0) { strMES_Result = "1"; // -------------------------------------------------- // MES資料庫異動 // -------------------------------------------------- if (colSQL_2MES.Count > 0) { ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, colSQL_2MES); } } // 組合執行錯誤字串: Chr(10)分隔 strMES_MESSAGE = ArrayList2String(ref aryMES_Message); // MES_Message長度4000限制, 截取0-3996碼加"...". if (strMES_MESSAGE.Length > 4000) strMES_MESSAGE = strMES_MESSAGE.Substring(0, 3996) + "..."; // ---取消前面收集SQL--- colSQL_2MES.Clear(); // 當該筆交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 if (aryMES_Message.Count > 0) { foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); } } // //return 0 : Success WriteVendorBasisRet = 0; } catch (Exception ex) { aryMES_Message.Add(ex.Message); // 當該筆中介交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); throw; } finally { if (drTemp != null) drTemp.Close(); CloseConnection(cnnMES); } return WriteVendorBasisRet; } // ======================================================================================================================== // 程式名稱:WriteMaterialVendorMapBasis // 傳入參數:objResponse(response CDO物件)、aryReturnMessage(回傳訊息參考) // 傳回參數:-1:fail,0:Success // 用 途:寫入物料供應商主檔對應 // 撰寫人員:05876 崑源 // 撰寫日期:2017/02/08 // ======================================================================================================================== private int WriteMaterialVendorMapBasis(iMESCIO.SCI.ERP.Response.SCI_Response_item_supplier_get objResponse, ref ArrayList aryReturnMessage) { int WriteMaterialVendorMapBasisRet = default(int); WriteMaterialVendorMapBasisRet = -1; // Return -1:fail,0:Success // =========================================================== // 宣告 DB相關 變數 // =========================================================== IDbConnection cnnMES = null; var colSQL_2MES = new Collection(); // MES正式異動資料(主要). string strSQL; // 每筆中介交易記錄 string strIfWhereCond_PK; string strMES_Result; string strMES_MESSAGE; // 錯誤訊息(中介表.MES_MESSAGE),Chr(10)分隔錯誤項目。 var aryMES_Message = new ArrayList(); // 收集單筆中介交易記錄的錯誤記錄, Exception及MES判定錯誤訊息。 try { // 宣告拋轉資料使用變數 string strERP_VendorNo, strERP_Description, strERP_MTLNo, strERP_status; DataRow drChkMTL, drChkVendor; cnnMES = CreateConnection(strConnectionString); do { try { bool exitTry = false; for (int intRow = 0, loopTo = objResponse.item_supplier_get.Count - 1; intRow <= loopTo; intRow++) { if (string.IsNullOrWhiteSpace(objResponse.item_supplier_get[intRow].item_sort)) { aryMES_Message.Add(TranslateMsg("item_sort" + " [%Is Empty%]!", strLanguageMode, strResourceDir)); break; } // ----------------------------------------------------------- // 取出各欄位資料 // ----------------------------------------------------------- strERP_VendorNo = objResponse.item_supplier_get[intRow].supplier_no.Trim().ToUpper(); strERP_status = objResponse.item_supplier_get[intRow].tran_status.Trim().ToUpper(); strERP_MTLNo = objResponse.item_supplier_get[intRow].item_no.Trim().ToUpper(); strERP_Description = objResponse.item_supplier_get[intRow].remark; // 2017-06-13, Joe, 因料件所有資料都會寫入物料主檔,所以這裡不用卡M的全部都收 // If objResponse.item_supplier_get(intRow).item_sort.Equals("M") Then '處理物料類型 // 1-1.檢查是否有此物料設定 drChkMTL = GetMaterialBasis(strERP_MTLNo, cnnMES, aryMES_Message); if (drChkMTL == null) { exitTry = true; break; } // GoTo lblExitTry_2_NextRow 'fail if (drChkMTL["MaterialNo"] is DBNull) { aryMES_Message.Add(TranslateMsg("[%MATERIALNO%]" + strERP_MTLNo + ",[%IS NOT EXIST%] [%MATERIALBASIS%], [%NOT ALLOWED TO EXECUTE%]!!", strLanguageMode, strResourceDir)); exitTry = true; break; } // 1-2.檢查是否有此供應商設定 drChkVendor = GetVendorBasis(strERP_VendorNo, cnnMES, aryMES_Message); if (drChkVendor == null) { exitTry = true; break; } if (drChkVendor["VendorNo"] is DBNull) { aryMES_Message.Add(TranslateMsg("[%VENDORNO%]" + strERP_VendorNo + ",[%IS NOT EXIST%] [%SUPPLIERBASIS%], [%NOT ALLOWED TO EXECUTE%]!!", strLanguageMode, strResourceDir)); exitTry = true; break; } switch (strERP_status ?? "") { case "AU": { // ----------------------------------------------------------- // 新增MES物料供應商對應設定 (一律先刪除再新增) // ----------------------------------------------------------- strSQL = "DELETE FROM tblMTLMaterialVendorMap WHERE VendorNo = '" + strERP_VendorNo + "' AND MaterialNo = '" + strERP_MTLNo + "'"; colSQL_2MES.Add(strSQL); strSQL = "Insert Into tblMTLMaterialVendorMap " + "(VendorNo,MaterialNo,Description)"; strSQL += " Values('" + strERP_VendorNo + "','" + strERP_MTLNo + "','" + strERP_Description + "')"; colSQL_2MES.Add(strSQL); break; } case "D": // D:刪除 { // ----------------------------------------------------------- // 先刪除ME供應商對應相關設定 // ----------------------------------------------------------- strSQL = "Delete From tblMTLMaterialVendorMap " + "Where VendorNo='" + strERP_VendorNo + "'AND MaterialNo = '" + strERP_MTLNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES.Add(strSQL); break; } default: { aryMES_Message.Add(TranslateMsg("[%VENDORNO%](supplier_no): " + strERP_VendorNo + ",[%TRANSTATUS%](tran_status):" + strERP_status + " [%INVALID%], [%NOT ALLOWED TO EXECUTE%]!!", strLanguageMode, strResourceDir)); break; } } } if (exitTry) { break; // End If } } catch (Exception ex) { strMES_Result = "9"; aryMES_Message.Add("Exception" + '\n' + ex.Message); } finally { // =============================================================================== // 判定 MES_Result 處理結果 (成功回寫1, 失敗回寫9). // =============================================================================== if (aryMES_Message.Count == 0) { strMES_Result = "1"; // -------------------------------------------------- // MES資料庫異動 // -------------------------------------------------- if (colSQL_2MES.Count > 0) { ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, colSQL_2MES); } } // 組合執行錯誤字串: Chr(10)分隔 strMES_MESSAGE = ArrayList2String(ref aryMES_Message); // MES_Message長度4000限制, 截取0-3996碼加"...". if (strMES_MESSAGE.Length > 4000) strMES_MESSAGE = strMES_MESSAGE.Substring(0, 3996) + "..."; // ---取消前面收集SQL--- colSQL_2MES.Clear(); // 當該筆交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 if (aryMES_Message.Count > 0) { foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); } } } while (false); // //return 0 : Success WriteMaterialVendorMapBasisRet = 0; } catch (Exception ex) { aryMES_Message.Add(ex.Message); // 當該筆中介交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); throw; } finally { CloseConnection(cnnMES); } return WriteMaterialVendorMapBasisRet; } // ======================================================================================================================== // 程式名稱:WriteEquipmentBasis // 傳入參數:objResponse(response CDO物件)、aryReturnMessage(回傳訊息參考) // 傳回參數:-1:fail,0:Success // 用 途:寫入設備主檔 // 撰寫人員:05876 崑源 // 撰寫日期:2017/02/08 // ======================================================================================================================== private int WriteEquipmentBasis(ref iMESCIO.SCI.ERP.Response.SCI_Response_machine_get objResponse, ref ArrayList aryReturnMessage) { int WriteEquipmentBasisRet = default(int); WriteEquipmentBasisRet = -1; // Return -1:fail,0:Success // =========================================================== // 宣告 DB相關 變數 // =========================================================== var drTemp = default(DbDataReader); IDbConnection cnnMES = null; Collection colSQL_2MES = new Collection(), colSQL_2MES_Rows = new Collection(); // MES正式異動資料(主要). string strSQL; // 每筆中介交易記錄 string strIfWhereCond_PK; string strMES_Result; string strMES_MESSAGE; // 錯誤訊息(中介表.MES_MESSAGE),Chr(10)分隔錯誤項目。 var aryMES_Message = new ArrayList(); // 收集單筆中介交易記錄的錯誤記錄, Exception及MES判定錯誤訊息。 var aryEquipmentType = new ArrayList(); // 記錄是否已新增過 try { // 宣告拋轉資料使用變數 string strERP_EQPNo, strERP_EQPType, strERP_ResType, strERP_AssetNo, strERP_Description, strERP_status, strERP_MaxTime, strErpNo, strErp_EquipmentName, strErp_SupplierNo; // 預設值 int intIssueState = 0; cnnMES = CreateConnection(strConnectionString); do { try { bool exitTry1 = false; for (int intRow = 0, loopTo = objResponse.machine_get.Count - 1; intRow <= loopTo; intRow++) { // ----------------------------------------------------------- // 取出各欄位資料 // ----------------------------------------------------------- strERP_EQPNo = objResponse.machine_get[intRow].machine_no.Trim().ToUpper(); strErpNo = objResponse.machine_get[intRow].machine_no.Trim(); // 記錄原始之ERP編號 // 2017.03.01 崑源,設備類型依舊有整合方式,寫死為"EQPTYPE"且判斷ERP傳來的資源類型若為0、1或未傳時再處理 // 20170324 edit lijyun↓ // strERP_ResType = objResponse.machine_get(intRow).resource_type.Trim if (objResponse.machine_get[intRow].resource_type == null) { strERP_ResType = ""; } else { strERP_ResType = objResponse.machine_get[intRow].resource_type.Trim(); } // 20170324 edit lijyun↑ strERP_EQPType = "EQPTYPE"; if (!string.IsNullOrWhiteSpace(strERP_ResType)) { if (!(strERP_ResType.Equals("0") | strERP_ResType.Equals("1"))) { continue; } } // 20170324 edit lijyun↓ // strERP_AssetNo = objResponse.machine_get(intRow).belongings_no.Trim.ToUpper if (objResponse.machine_get[intRow].belongings_no == null) { strERP_AssetNo = ""; } else { strERP_AssetNo = objResponse.machine_get[intRow].belongings_no.Trim().ToUpper(); } // 20170324 edit lijyun↑ strERP_status = objResponse.machine_get[intRow].tran_status.Trim().ToUpper(); strERP_Description = objResponse.machine_get[intRow].remark.Trim(); // 20170316 edit lijyun↓ if (objResponse.machine_get[intRow].machine_capacity == null) { strERP_MaxTime = ""; } else { strERP_MaxTime = objResponse.machine_get[intRow].machine_capacity.Trim(); double tmpValue; if (double.TryParse(strERP_MaxTime, out tmpValue)) { if (tmpValue < 1.0d | tmpValue > 24.0d) { strERP_MaxTime = "1"; } } } // 20170316 edit lijyun↑ // 2017/02/22 modi KY:新增『設備名稱』及『設備供應商』欄位 strErp_EquipmentName = objResponse.machine_get[intRow].machine_name.Trim(); if (objResponse.machine_get[intRow].supplier_no == null) { strErp_SupplierNo = "N/A"; } else if (string.IsNullOrEmpty(objResponse.machine_get[intRow].supplier_no.Trim())) { strErp_SupplierNo = "N/A"; } else { strErp_SupplierNo = objResponse.machine_get[intRow].supplier_no.Trim().ToUpper(); } // ----------------------------------------------------------- // 固定檢查EquipmnetTyp資料,若不存在則自動新增。 // ----------------------------------------------------------- // 20170314 edit lijyun↓ // If AddEquipmentType(cnnMES, colSQL_2MES, colSQL_2MES_Rows, aryMES_Message, strERP_EQPType, strERPCreator, DateTime.Now, "AutoRun建立") < 0 Then Exit Try if (aryEquipmentType.IndexOf(strERP_EQPType) == -1) { if (AddEquipmentType(ref cnnMES, ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_EQPType, strERPCreator, DateTime.Now, "AutoRun建立") < 0) { exitTry1 = true; break; } else { aryEquipmentType.Add(strERP_EQPType); } } // 20170314 edit lijyun↑ // 檢查是否有此作業站設定 strSQL = "Select EquipmentNo,IssueState From tblEQPEquipmentBasis " + " Where EquipmentNo='" + strERP_EQPNo + "'"; //cmmTemp = new IDbCommand(strSQL, cnnMES); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); bool exitTry = false; switch (strERP_status ?? "") { case "AU": // 有資料修改沒資料新增 { if (!drTemp.Read()) { intIssueState = 0; // ----------------------------------------------------------- // 新增MES設備主檔設定 // ----------------------------------------------------------- // 2017-05-31, Add EquipmentClass預設為GENERAL // 2017-06-02, Joe, LoadPort預設為-1 strSQL = "Insert Into tblEQPEquipmentBasis " + "(EquipmentNo,EquipmentType,Capacity," + "EngineerGroupNo,LoadPort," + "AutoFlag,Eacontroller,EQPRecipe," + "IssueState,Creator,CreateDate,ERPNo,EquipmentName," + "EquipmentClass "; if (!string.IsNullOrEmpty(strERP_AssetNo)) { strSQL += ",AssetNo"; } if (!string.IsNullOrEmpty(strERP_Description)) { strSQL += ",Description"; } if (!string.IsNullOrEmpty(strERP_MaxTime)) { strSQL += ",MaxTime"; } if (!string.IsNullOrEmpty(strErp_SupplierNo)) { strSQL += ",VendorNo"; } strSQL += ")"; strSQL += " Values('" + strERP_EQPNo + "','" + strERP_EQPType + "',-1," + "'N/A',-1,0,'N/A',0," + intIssueState + ",'" + strERPCreator + "'," + "To_Date('" + Strings.Format(DateTime.Now, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'), '" + strErpNo + "', '" + strErp_EquipmentName + "' " + ",'GENERAL' "; if (!string.IsNullOrEmpty(strERP_AssetNo)) { strSQL += ",'" + strERP_AssetNo + "'"; } if (!string.IsNullOrEmpty(strERP_Description)) { strSQL += ",'" + strERP_Description + "'"; } if (!string.IsNullOrEmpty(strERP_MaxTime)) { strSQL += ",'" + strERP_MaxTime + "'"; } if (!string.IsNullOrEmpty(strErp_SupplierNo)) { strSQL += ",'" + strErp_SupplierNo + "'"; } strSQL += ")"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } else { // ----------------------------------------------------------- // 修改MES設備設定 // ----------------------------------------------------------- // 2017-06-02, Joe, 修改時如原狀態為-1變更為0,其他不異動 if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], -1, false))) { intIssueState = 0; } else { intIssueState = Conversions.ToInteger(drTemp["IssueState"]); } // 2019/07/22 Eric 當ERP未傳入machine_capacity,不更新欄位MaxTime if (string.IsNullOrEmpty(strERP_MaxTime)) { strSQL = "Update tblEQPEquipmentBasis Set IssueState = " + intIssueState + ",EquipmentType = '" + strERP_EQPType + "',AssetNo = '" + strERP_AssetNo + "'" + ",Description='" + strERP_Description + "', EquipmentName ='" + strErp_EquipmentName + "' " + ",ERPNo = '" + strErpNo + "'" + " Where EquipmentNo='" + strERP_EQPNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } else { strSQL = "Update tblEQPEquipmentBasis Set IssueState = " + intIssueState + ",EquipmentType = '" + strERP_EQPType + "',AssetNo = '" + strERP_AssetNo + "'" + ",Description='" + strERP_Description + "', MaxTime = '" + strERP_MaxTime + "', EquipmentName ='" + strErp_EquipmentName + "' " + ",ERPNo = '" + strErpNo + "'" + " Where EquipmentNo='" + strERP_EQPNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } } drTemp.Close(); //cmmTemp.Dispose(); break; } case "D": // D:刪除 { if (drTemp.Read()) { if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], 0, false))) { // ----------------------------------------------------------- // 先刪除MES產品相關設定 // ----------------------------------------------------------- if (ResourcesIntegration_DelEquipment(ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_EQPNo) < 0) { exitTry1 = exitTry = true; break; } } else { // ----------------------------------------------------------- // 作廢MES產品設定 // ----------------------------------------------------------- strSQL = "Update tblEQPEquipmentBasis Set " + " IssueState = -1" + " Where EquipmentNo='" + strERP_EQPNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } } // aryMES_Message.Add(TranslateMsg("[%EQUIPMENTNO%](machine_no): " & strERP_EQPNo & ", [%IS NOT EXIST%], [%NOT ALLOW TO DELETE%]!!")) // 刪除有可能會在資料庫中取不到資料,因為同一個交易還沒有commit; // ----------------------------------------------------------- // 先刪除MES產品相關設定 // ----------------------------------------------------------- else if (ResourcesIntegration_DelEquipment(ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_EQPNo) < 0) { exitTry1 = exitTry = true; break; } drTemp.Close(); //cmmTemp.Dispose(); break; } default: { aryMES_Message.Add(TranslateMsg("[%EQUIPMENTNO%](machine_no): " + strERP_EQPNo + ", [%TRANSTATUS%](tran_status):" + strERP_status + " [%INVALID%], [%NOT ALLOWED TO EXECUTE%]!!", strLanguageMode, strResourceDir)); break; } } if (exitTry) { break; } } if (exitTry1) { break; } } catch (Exception ex) { strMES_Result = "9"; aryMES_Message.Add("Exception" + '\n' + ex.Message); } finally { // =============================================================================== // 判定 MES_Result 處理結果 (成功回寫1, 失敗回寫9). // =============================================================================== if (aryMES_Message.Count == 0) { strMES_Result = "1"; // MES資料庫異動 if (colSQL_2MES.Count > 0) { ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colSQL_2MES, colSQL_2MES_Rows); } } // 組合執行錯誤字串: Chr(10)分隔 strMES_MESSAGE = ArrayList2String(ref aryMES_Message); // MES_Message長度4000限制, 截取0-3996碼加"...". if (strMES_MESSAGE.Length > 4000) strMES_MESSAGE = strMES_MESSAGE.Substring(0, 3996) + "..."; // ---取消前面收集SQL--- colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); // 當該筆交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 if (aryMES_Message.Count > 0) { foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); } } } while (false); // //return 0 : Success WriteEquipmentBasisRet = 0; } catch (Exception ex) { aryMES_Message.Add(ex.Message); // 當該筆中介交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); throw; } finally { if (drTemp != null) drTemp.Close(); CloseConnection(cnnMES); } return WriteEquipmentBasisRet; } // ======================================================================================================================== // 程式名稱:WriteToMESCustomerBasis // 傳入參數:objResponse(response CDO物件)、aryReturnMessage(回傳訊息參考) // 傳回參數:-1:fail,0:Success // 用 途:寫入客戶主檔 // 撰寫人員:Lijyun // 撰寫日期:2017/02/08 // ======================================================================================================================== private int WriteToMESCustomerBasis(iMESCIO.SCI.ERP.Response.SCI_Response_customer_get objResponse, ref ArrayList aryReturnMessage) { int WriteToMESCustomerBasisRet = default(int); WriteToMESCustomerBasisRet = -1; // Return -1:fail,0:Success // =========================================================== // 宣告 DB相關 變數 // =========================================================== var drTemp = default(DbDataReader); IDbConnection cnnMES = null; Collection colSQL_2MES = new Collection(), colSQL_2MES_Rows = new Collection(); // MES正式異動資料(主要). string strSQL; // 每筆中介交易記錄 string strIfWhereCond_PK; string strMES_Result; string strMES_MESSAGE; // 錯誤訊息(中介表.MES_MESSAGE),Chr(10)分隔錯誤項目。 var aryMES_Message = new ArrayList(); // 收集單筆中介交易記錄的錯誤記錄, Exception及MES判定錯誤訊息。 var datNow = DateTime.Now; // Now try { // 宣告拋轉資料使用變數 string strERP_CustomerNo, strERP_CustomerName, strERP_CustomerSName, str_ERPNo, strERP_status; // 預設值 int intIssueState = 0; // reset datNow = DateTime.Now; // Now strIfWhereCond_PK = ""; strMES_Result = "9"; // 預設值 9 (MES處理結果, 成功回寫1, 失敗回寫9). strMES_MESSAGE = ""; // 錯誤訊息 aryMES_Message.Clear(); colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); cnnMES = CreateConnection(strConnectionString); do { try { bool exitTry1 = false; for (int intRow = 0, loopTo = objResponse.customer_get.Count - 1; intRow <= loopTo; intRow++) { // ----------------------------------------------------------- // 取出各欄位資料 // ----------------------------------------------------------- strERP_CustomerNo = objResponse.customer_get[intRow].customer_no.ToString().Trim().ToUpper(); strERP_status = objResponse.customer_get[intRow].tran_status.ToString().Trim().ToUpper(); strERP_CustomerName = objResponse.customer_get[intRow].customer_name.Trim().ToUpper(); if (strERP_CustomerName == null || string.IsNullOrEmpty(strERP_CustomerName.Trim())) strERP_CustomerName = "N/A"; strERP_CustomerSName = objResponse.customer_get[intRow].customer_shortname; if (strERP_CustomerSName == null || string.IsNullOrEmpty(strERP_CustomerSName.Trim())) strERP_CustomerSName = strERP_CustomerName; str_ERPNo = objResponse.customer_get[intRow].customer_no.ToString().Trim(); // 檢查是否有此供應商設定 strSQL = "Select CustomerNo,IssueState From tblENTCustomerBasis " + " Where CustomerNo='" + strERP_CustomerNo + "'"; //cmmTemp = new IDbCommand(strSQL, cnnMES); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); bool exitTry = false; switch (strERP_status ?? "") { case "AU": // 有資料修改沒資料新增 { if (!drTemp.Read()) { intIssueState = 0; // ----------------------------------------------------------- // 新增MES客戶設定 // ----------------------------------------------------------- if (string.IsNullOrEmpty(strERP_CustomerNo)) { aryMES_Message.Add(TranslateMsg("[%CustomerNo%](customer_no):" + strERP_CustomerNo + " [%Is Empty%]! ", strLanguageMode, strResourceDir)); } else if (string.IsNullOrEmpty(strERP_CustomerName)) { aryMES_Message.Add(TranslateMsg("[%CustomerNo%](customer_no):" + strERP_CustomerNo + ",[%CustomerName%](customer_name),[%Is Empty%]! ", strLanguageMode, strResourceDir)); } else if (string.IsNullOrEmpty(strERP_CustomerSName)) { aryMES_Message.Add(TranslateMsg("[%CustomerNo%](customer_no):" + strERP_CustomerNo + ",[%CustomerSName%](customer_shortname),[%Is Empty%]! ", strLanguageMode, strResourceDir)); } else { strSQL = "Insert Into tblENTCustomerBasis " + "(CustomerNo,CustomerName,CustomerSName,IssueState,ERPNo," + " Creator,CreateDate)"; strSQL += " Values('" + strERP_CustomerNo + "','" + strERP_CustomerName + "','" + strERP_CustomerSName + "'," + intIssueState + ",'" + str_ERPNo + "','" + strERPCreator + "'," + "To_Date('" + Strings.Format(datNow, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'))"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } } else { // aryMES_Message.Add("客戶編號(customer_no):" & objReponse.customer_no & ", 已存在MES, 不允許新增!!") // ----------------------------------------------------------- // 修改MES客戶設定 // ----------------------------------------------------------- // 2017-06-02, Joe, 修改時如原狀態為-1變更為0,其他不異動 if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], -1, false))) { intIssueState = 0; } else { intIssueState = Conversions.ToInteger(drTemp["IssueState"]); } strSQL = "Update tblENTCustomerBasis Set " + " IssueState = " + intIssueState + ",CUSTOMERNAME = '" + strERP_CustomerName + "',CUSTOMERSNAME = '" + strERP_CustomerSName + "',ERPNo = '" + str_ERPNo + "'" + " Where CustomerNo='" + strERP_CustomerNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } drTemp.Close(); //cmmTemp.Dispose(); break; } case "D": // D:刪除 { if (drTemp.Read()) { if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], 0, false))) { // ----------------------------------------------------------- // 先刪除MES客戶相關設定 // ----------------------------------------------------------- // Del detail if (CustVendorIntegration_DelCustomer(ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_CustomerNo) < 0) { // GoTo lblExitTry_2_NextRow exitTry1 = exitTry = true; break; } } else { // ----------------------------------------------------------- // 作廢MES客戶設定 // ----------------------------------------------------------- strSQL = "Update tblENTCustomerBasis Set " + " IssueState=-1" + " Where CustomerNo='" + strERP_CustomerNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } } // aryMES_Message.Add(TranslateMsg("[%CustomerNo%] : " & strERP_CustomerNo & " [%IS NOT EXIST%]!")) // 刪除有可能會在資料庫中取不到資料,因為同一個交易還沒有commit; // ----------------------------------------------------------- // 先刪除MES客戶相關設定 // ----------------------------------------------------------- else if (CustVendorIntegration_DelCustomer(ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_CustomerNo) < 0) { // GoTo lblExitTry_2_NextRow exitTry1 = exitTry = true; break; } drTemp.Close(); break; } default: { aryMES_Message.Add(TranslateMsg("[%CustomerNo%](customer_no):" + strERP_CustomerNo + ",ERP [%Status%] : " + strERP_status + " [%INVALID%], [%IS NOT ALLOWED TO EXECUTE%]!", strLanguageMode, strResourceDir)); break; } } if (exitTry) { break; } } if (exitTry1) { break; } } catch (Exception EX_drIF) { strMES_Result = "9"; aryMES_Message.Add("EX_drIF.Exception" + '\n' + EX_drIF.Message); } finally { // =============================================================================== // 判定 MES_Result 處理結果 (成功回寫1, 失敗回寫9). // =============================================================================== if (aryMES_Message.Count == 0) { strMES_Result = "1"; // -------------------------------------------------- // MES資料庫異動 // -------------------------------------------------- if (colSQL_2MES.Count > 0) { ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colSQL_2MES, colSQL_2MES_Rows); } } // 組合執行錯誤字串: Chr(10)分隔 strMES_MESSAGE = ArrayList2String(ref aryMES_Message); // MES_Message長度4000限制, 截取0-3996碼加"...". if (strMES_MESSAGE.Length > 4000) strMES_MESSAGE = strMES_MESSAGE.Substring(0, 3996) + "..."; // ---取消前面收集SQL--- colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); // 當該筆交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 if (aryMES_Message.Count > 0) { foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); } } } while (false); // //return 0 : Success WriteToMESCustomerBasisRet = 0; } catch (Exception ex) { aryMES_Message.Add(ex.Message); // 當該筆中介交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); throw; } finally { if (drTemp != null) drTemp.Close(); CloseConnection(cnnMES); } return WriteToMESCustomerBasisRet; } // ======================================================================================================================== // 程式名稱:WriteToMESInventoryBasis // 傳入參數:objResponse(response CDO物件)、aryReturnMessage(回傳訊息參考) // 傳回參數:-1:fail,0:Success // 用 途:寫入庫房主檔 // 撰寫人員:Lijyun // 撰寫日期:2017/02/08 // ======================================================================================================================== private int WriteToMESInventoryBasis(iMESCIO.SCI.ERP.Response.SCI_Response_warehouse_get objResponse, ref ArrayList aryReturnMessage) { int WriteToMESInventoryBasisRet = default(int); WriteToMESInventoryBasisRet = -1; // Return -1:fail,0:Success // =========================================================== // 宣告 DB相關 變數 // =========================================================== var drTemp = default(DbDataReader); IDbConnection cnnMES = null; Collection colSQL_2MES = new Collection(), colSQL_2MES_Rows = new Collection(); // MES正式異動資料(主要). string strSQL; System.Data.OleDb.OleDbDataAdapter daSMD; DataSet dsSMD; // 每筆中介交易記錄 string strIfWhereCond_PK; string strMES_Result; string strMES_MESSAGE; // 錯誤訊息(中介表.MES_MESSAGE),Chr(10)分隔錯誤項目。 var aryMES_Message = new ArrayList(); // 收集單筆中介交易記錄的錯誤記錄, Exception及MES判定錯誤訊息。 var datNow = DateTime.Now; // Now var aryFactoryNo = new ArrayList(); // 記錄是否新增過工廠編號 try { cnnMES = CreateConnection(strConnectionString); // 宣告拋轉資料使用變數 string strERP_INVNo, strERP_INVName, strERP_FactoryNo, strERP_WarehouseType, str_ERPNo, strERP_status; // 預設值 int intIssueState = 0; // reset datNow = DateTime.Now; // Now strIfWhereCond_PK = ""; strMES_Result = "9"; // 預設值 9 (MES處理結果, 成功回寫1, 失敗回寫9). strMES_MESSAGE = ""; // 錯誤訊息 strERP_WarehouseType = ""; // 預設為空 aryMES_Message.Clear(); colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); do { try { bool exitTry1 = false; for (int intRow = 0, loopTo = objResponse.warehouse_get.Count - 1; intRow <= loopTo; intRow++) { // ----------------------------------------------------------- // 取出各欄位資料 // ----------------------------------------------------------- strERP_INVNo = objResponse.warehouse_get[intRow].warehouse_no.ToString().Trim().ToUpper(); strERP_FactoryNo = objResponse.warehouse_get[intRow].factory_no.ToString().Trim().ToUpper(); if (objResponse.warehouse_get[intRow].warehouse_name == null || string.IsNullOrEmpty(objResponse.warehouse_get[intRow].warehouse_name.ToString().Trim())) { strERP_INVName = "N/A"; } else { strERP_INVName = objResponse.warehouse_get[intRow].warehouse_name.ToString().Trim().ToUpper(); } strERP_status = objResponse.warehouse_get[intRow].tran_status.ToString().Trim().ToUpper(); if (string.IsNullOrEmpty(objResponse.warehouse_get[intRow].warehouse_type) || string.IsNullOrEmpty(strERP_WarehouseType.ToString().Trim())) { strERP_WarehouseType = 1.ToString(); } else { strERP_WarehouseType = objResponse.warehouse_get[intRow].warehouse_type.ToString().Trim().ToUpper(); } str_ERPNo = objResponse.warehouse_get[intRow].warehouse_no.ToString().Trim(); // 20170313 edit lijyun↓ // 檢查是否有此工廠編號 // strSQL = "Select * From tblSMDFactoryBasis Where FactoryNo Is Not Null " & // " And FactoryNo = '" & objResponse.warehouse_get(intRow).factory_no & "'" // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnMES) // drTemp = ExecuteSQLQuery_Reader // If String.IsNullOrEmpty(strERP_FactoryNo) Then // aryMES_Message.Add(TranslateMsg("ERP[%FactoryNo%](factory_no):" & strERP_FactoryNo & " [%Is Empty%]!")) // Exit For // Else // If Not drTemp.Read Then // strSQL = "Insert Into tblSMDFactoryBasis " & // "(FactoryNo,Description,FabCode," & // "IssueState,Creator,CreateDate)" // strSQL += " Values('" & objResponse.warehouse_get(intRow).factory_no & "','','',2,'" & strERPCreator & "'," & // "To_Date('" & Format(datNow, "yyyy/MM/dd H:mm:ss") & "','YYYY/MM/DD HH24:MI:SS'))" // Call ExecuteSQLNoneQuery(strDataBaseType, strConnectionString, strSQL) // End If // drTemp.Close() // cmmTemp.Dispose() // End If // ----------------------------------------------------------- // 固定檢查FactoryBasis資料,若不存在則自動新增。 // ----------------------------------------------------------- if (aryFactoryNo.IndexOf(strERP_FactoryNo) == -1) { if (AddFactoryNo(ref cnnMES, ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_FactoryNo, strERPCreator, DateTime.Now, "AutoRun建立") < 0) { exitTry1 = true; break; } else { aryFactoryNo.Add(strERP_FactoryNo); } } // 20170313 edit lijyun↑ // 檢查是否有此庫房設定 strSQL = "Select InventoryNo,IssueState From tblINVInventoryBasis " + " Where InventoryNo='" + strERP_INVNo + "'"; //cmmTemp = new IDbCommand(strSQL, cnnMES); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); bool exitTry = false; switch (strERP_status ?? "") { case "AU": // 有資料修改沒資料新增 { if (!drTemp.Read()) { intIssueState = 0; // ----------------------------------------------------------- // 新增MES庫房設定 // ----------------------------------------------------------- if (string.IsNullOrEmpty(strERP_INVNo)) { aryMES_Message.Add(TranslateMsg("[%InventoryNo%](warehouse_no):" + strERP_INVNo + " [%Is Empty%]!", strLanguageMode, strResourceDir)); } else if (string.IsNullOrEmpty(strERP_INVName)) { aryMES_Message.Add(TranslateMsg("[%InventoryNo%](warehouse_no):" + strERP_INVNo + ",[%InventoryName%](warehouse_name):" + strERP_INVName + " [%Is Empty%]!", strLanguageMode, strResourceDir)); } else if (string.IsNullOrEmpty(strERP_FactoryNo)) { aryMES_Message.Add(TranslateMsg("[%InventoryNo%](warehouse_no):" + strERP_INVNo + ",ERP[%FactoryNo%](factory_no):" + strERP_FactoryNo + " [%Is Empty%]!", strLanguageMode, strResourceDir)); } else { strSQL = "Insert Into tblINVInventoryBasis " + "(InventoryNo,InventoryName,InventoryType,InventoryClass,FactoryNo," + "IssueState,ERPNO,Creator,CreateDate)"; strSQL += " Values('" + strERP_INVNo + "','" + strERP_INVName + "','" + strERP_WarehouseType + "',0,'" + strERP_FactoryNo + "'," + intIssueState + ",'" + str_ERPNo + "','" + strERPCreator + "'," + "To_Date('" + Strings.Format(datNow, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'))"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } } else { // aryMES_Message.Add("庫房編號(inaa001):" & strERP_INVNo & ", 已存在MES, 不允許新增!!") // ERPws標準功能不論IssueState為何皆允許修改. // ----------------------------------------------------------- // 修改MES庫房設定 // ----------------------------------------------------------- // 2017-06-02, Joe, 修改時如原狀態為-1變更為0,其他不異動 if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], -1, false))) { intIssueState = 0; } else { intIssueState = Conversions.ToInteger(drTemp["IssueState"]); } strSQL = "Update tblINVInventoryBasis Set " + " IssueState = " + intIssueState + " ,INVENTORYNAME = '" + strERP_INVName + "'" + " ,FACTORYNO = '" + strERP_FactoryNo + "'" + " ,ERPNo = '" + str_ERPNo + "'"; // 2017/05/22 KunYuan:倉庫類型修改時暫不處理 // If strERP_WarehouseType <> "" Then // strSQL += " ,INVENTORYTYPE = " & strERP_WarehouseType // End If strSQL += " Where InventoryNo='" + strERP_INVNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } drTemp.Close(); //cmmTemp.Dispose(); break; } case "D": // D:刪除 { if (drTemp.Read()) { if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], 0, false))) { // ----------------------------------------------------------- // 先刪除MES庫房相關設定 // ----------------------------------------------------------- if (InventoryIntegration_DelInventory(ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_INVNo) < 0) { // GoTo lblExitTry_2_NextRow exitTry1 = exitTry = true; break; } } else { // ----------------------------------------------------------- // 作廢MES產品設定 // ----------------------------------------------------------- strSQL = "Update tblINVInventoryBasis Set " + " IssueState = -1" + " Where InventoryNo='" + strERP_INVNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } } // aryMES_Message.Add(TranslateMsg("[%InventoryNo%] : " & strERP_INVNo & " [%IS NOT EXIST%]!")) // 刪除有可能會在資料庫中取不到資料,因為同一個交易還沒有commit; // ----------------------------------------------------------- // 先刪除MES庫房相關設定 // ----------------------------------------------------------- else if (InventoryIntegration_DelInventory(ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_INVNo) < 0) { // GoTo lblExitTry_2_NextRow exitTry1 = exitTry = true; break; } drTemp.Close(); break; } default: { aryMES_Message.Add(TranslateMsg("[%InventoryNo%](warehouse_no):" + strERP_INVNo + ",ERP [%Status%] : " + strERP_status + " [%INVALID%],[%IS NOT ALLOWED TO EXECUTE%]!", strLanguageMode, strResourceDir)); break; } } if (exitTry) { break; } } if (exitTry1) { break; } } catch (Exception EX_drIF) { strMES_Result = "9"; aryMES_Message.Add("EX_drIF.Exception" + '\n' + EX_drIF.Message); } finally { // =============================================================================== // 判定 MES_Result 處理結果 (成功回寫1, 失敗回寫9). // =============================================================================== if (aryMES_Message.Count == 0) { strMES_Result = "1"; // -------------------------------------------------- // MES資料庫異動 // -------------------------------------------------- if (colSQL_2MES.Count > 0) { ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colSQL_2MES, colSQL_2MES_Rows); } } // 組合執行錯誤字串: Chr(10)分隔 strMES_MESSAGE = ArrayList2String(ref aryMES_Message); // MES_Message長度4000限制, 截取0-3996碼加"...". if (strMES_MESSAGE.Length > 4000) strMES_MESSAGE = strMES_MESSAGE.Substring(0, 3996) + "..."; // ---取消前面收集SQL--- colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); // 當該筆交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 if (aryMES_Message.Count > 0) { foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); } } } while (false); // //return 0 : Success WriteToMESInventoryBasisRet = 0; } catch (Exception ex) { aryMES_Message.Add(ex.Message); // 當該筆中介交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); throw; } finally { if (drTemp != null) drTemp.Close(); CloseConnection(cnnMES); } return WriteToMESInventoryBasisRet; } // ======================================================================================================================== // 程式名稱:WriteToMESLocatorBasis // 傳入參數:objResponse(response CDO物件)、aryReturnMessage(回傳訊息參考) // 傳回參數:-1:fail,0:Success // 用 途:寫入儲位主檔 // 撰寫人員:Lijyun // 撰寫日期:2017/02/08 // ======================================================================================================================== private int WriteToMESLocatorBasis(iMESCIO.SCI.ERP.Response.SCI_Response_storage_spaces_get objResponse, ref ArrayList aryReturnMessage) { int WriteToMESLocatorBasisRet = default(int); WriteToMESLocatorBasisRet = -1; // Return -1:fail,0:Success // =========================================================== // 宣告 DB相關 變數 // =========================================================== var drTemp = default(DbDataReader); IDbConnection cnnMES = null; Collection colSQL_2MES = new Collection(), colSQL_2MES_Rows = new Collection(); // MES正式異動資料(主要). string strSQL; // 每筆中介交易記錄 string strIfWhereCond_PK; string strMES_Result; string strMES_MESSAGE; // 錯誤訊息(中介表.MES_MESSAGE),Chr(10)分隔錯誤項目。 var aryMES_Message = new ArrayList(); // 收集單筆中介交易記錄的錯誤記錄, Exception及MES判定錯誤訊息。 var datNow = DateTime.Now; // Now try { cnnMES = CreateConnection(strConnectionString); // 宣告拋轉資料使用變數 string strERP_INVNo, strERP_Locator, strERP_FactoryNo, strERP_status, str_ERPNo; string strERP_LocatorName; // 預設值 int intIssueState = 0; // reset datNow = DateTime.Now; // Now strIfWhereCond_PK = ""; strMES_Result = "9"; // 預設值 9 (MES處理結果, 成功回寫1, 失敗回寫9). strMES_MESSAGE = ""; // 錯誤訊息 aryMES_Message.Clear(); colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); do { try { bool exitTry1 = false; for (int intRow = 0, loopTo = objResponse.storage_spaces_get.Count - 1; intRow <= loopTo; intRow++) { // ----------------------------------------------------------- // 取出各欄位資料 // ----------------------------------------------------------- strERP_INVNo = objResponse.storage_spaces_get[intRow].warehouse_no.ToString().Trim().ToUpper(); strERP_Locator = objResponse.storage_spaces_get[intRow].storage_spaces_no.ToString().Trim().ToUpper(); if (string.IsNullOrEmpty(strERP_Locator.Trim())) strERP_Locator = "N/A"; strERP_LocatorName = objResponse.storage_spaces_get[intRow].storage_spaces_name.ToString().Trim().ToUpper(); if (string.IsNullOrEmpty(strERP_LocatorName.Trim())) strERP_LocatorName = "N/A"; strERP_status = objResponse.storage_spaces_get[intRow].tran_status.ToString().Trim().ToUpper(); str_ERPNo = objResponse.storage_spaces_get[intRow].storage_spaces_no.ToString().Trim(); strSQL = "Select InventoryNo,IssueState From tblINVInventoryBasis " + " Where InventoryNo='" + strERP_INVNo + "'"; //cmmTemp = new IDbCommand(strSQL, cnnMES); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); if (!drTemp.Read()) { aryMES_Message.Add(TranslateMsg("[%InventoryNo%](warehouse_no):" + strERP_INVNo + " [%Is Not Exist%]!", strLanguageMode, strResourceDir)); drTemp.Close(); //cmmTemp.Dispose(); exitTry1 = true; break; } // 檢查是否有此儲位設定 strSQL = "Select InventoryNo,IssueState From tblINVLocatorBasis " + " Where InventoryNo='" + strERP_INVNo + "'" + " And LocatorNo='" + strERP_Locator + "'"; //cmmTemp = new IDbCommand(strSQL, cnnMES); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); bool exitTry = false; switch (strERP_status ?? "") { case "AU": // 有資料修改沒資料新增 { if (!drTemp.Read()) { intIssueState = 0; // ----------------------------------------------------------- // 新增MES儲位設定 // ----------------------------------------------------------- if (string.IsNullOrEmpty(strERP_INVNo)) { aryMES_Message.Add(TranslateMsg("[%LocatorNo%](storage_spaces_no):" + strERP_Locator + ",[%InventoryNo%](warehouse_no):" + strERP_INVNo + " [%Is Empty%]!", strLanguageMode, strResourceDir)); } else if (string.IsNullOrEmpty(strERP_Locator)) { aryMES_Message.Add(TranslateMsg("[%InventoryNo%](warehouse_no):" + strERP_INVNo + ",[%LocatorNo%](storage_spaces_no):" + strERP_Locator + " [%Is Empty%]!", strLanguageMode, strResourceDir)); } else if (strERP_LocatorName != "N/A") { strSQL = "Insert Into tblINVLocatorBasis " + "(LocatorNo,LocatorName,InventoryNo," + "IssueState,ERPNO,Creator,CreateDate)"; strSQL += " Values('" + strERP_Locator + "','" + strERP_LocatorName + "','" + strERP_INVNo + "'," + intIssueState + ",'" + str_ERPNo + "','" + strERPCreator + "'," + "To_Date('" + Strings.Format(datNow, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'))"; } else { strSQL = "Insert Into tblINVLocatorBasis " + "(LocatorNo,InventoryNo," + "IssueState,ERPNO,Creator,CreateDate)"; strSQL += " Values('" + strERP_Locator + "','" + strERP_INVNo + "'," + intIssueState + ",'" + str_ERPNo + "','" + strERPCreator + "'," + "To_Date('" + Strings.Format(datNow, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'))"; } colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } else { // aryMES_Message.Add("庫房編號(inab001):" & strERP_INVNo & ",儲位編號(inab002):" & strERP_Locator & ", 已存在MES, 不允許新增!!") // ERPws標準功能不論IssueState為何皆允許修改. // ----------------------------------------------------------- // 修改MES產品設定 // ----------------------------------------------------------- // MES已存在之資料IssueState如果是-1,ERP資料再次拋轉時,IssueState則更新為"0". // 2017-06-02, Joe, 修改時如原狀態為-1變更為0,其他不異動 if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], -1, false))) { intIssueState = 0; } else { intIssueState = Conversions.ToInteger(drTemp["IssueState"]); } strSQL = "Update tblINVLocatorBasis Set " + " IssueState = " + intIssueState + " ,ERPNo ='" + str_ERPNo + "'" + " Where InventoryNo='" + strERP_INVNo + "'" + " And LocatorNo='" + strERP_Locator + "'"; if (strERP_LocatorName != "N/A") { strSQL += "And LocatorName='" + strERP_LocatorName + "'"; } colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } break; } case "D": // D:刪除 { if (drTemp.Read()) { if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], 0, false))) { // ----------------------------------------------------------- // 先刪除MES產品相關設定 // ----------------------------------------------------------- if (LocatorIntegration_DelLocator(ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_INVNo, strERP_Locator) < 0) { // GoTo lblExitTry_2_NextRow exitTry1 = exitTry = true; break; } } else { // ----------------------------------------------------------- // 作廢MES產品設定 // ----------------------------------------------------------- strSQL = "Update tblINVLocatorBasis Set " + " IssueState = -1" + " Where InventoryNo='" + strERP_INVNo + "'" + " And LocatorNo='" + strERP_Locator + "'"; if (strERP_LocatorName != "N/A") { strSQL += "And LocatorName='" + strERP_LocatorName + "'"; } colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } } // aryMES_Message.Add(TranslateMsg("[%LocatorNo%](storage_spaces_no):" & strERP_Locator & "[%IS NOT EXIST%]!!")) // 刪除有可能會在資料庫中取不到資料,因為同一個交易還沒有commit; // ----------------------------------------------------------- // 先刪除MES產品相關設定 // ----------------------------------------------------------- else if (LocatorIntegration_DelLocator(ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_INVNo, strERP_Locator) < 0) { // GoTo lblExitTry_2_NextRow exitTry1 = exitTry = true; break; } drTemp.Close(); break; } default: { aryMES_Message.Add(TranslateMsg("[%LocatorNo%](storage_spaces_no):" + strERP_Locator + ",ERP [%Status%] : " + strERP_status + " [%INVALID%],[%IS NOT ALLOWED TO EXECUTE%]!", strLanguageMode, strResourceDir)); break; } } if (exitTry) { break; } } if (exitTry1) { break; } } catch (Exception EX_drIF) { strMES_Result = "9"; aryMES_Message.Add("EX_drIF.Exception" + '\n' + EX_drIF.Message); } finally { // =============================================================================== // 判定 MES_Result 處理結果 (成功回寫1, 失敗回寫9). // =============================================================================== if (aryMES_Message.Count == 0) { strMES_Result = "1"; // -------------------------------------------------- // MES資料庫異動 // -------------------------------------------------- if (colSQL_2MES.Count > 0) { ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colSQL_2MES, colSQL_2MES_Rows); } } // 組合執行錯誤字串: Chr(10)分隔 strMES_MESSAGE = ArrayList2String(ref aryMES_Message); // MES_Message長度4000限制, 截取0-3996碼加"...". if (strMES_MESSAGE.Length > 4000) strMES_MESSAGE = strMES_MESSAGE.Substring(0, 3996) + "..."; // ---取消前面收集SQL--- colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); // 當該筆交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 if (aryMES_Message.Count > 0) { foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); } } } while (false); // //return 0 : Success WriteToMESLocatorBasisRet = 0; } catch (Exception ex) { aryMES_Message.Add(ex.Message); // 當該筆中介交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); throw; } finally { if (drTemp != null) drTemp.Close(); CloseConnection(cnnMES); } return WriteToMESLocatorBasisRet; } // ======================================================================================================================== // 程式名稱:WriteToMESDepartmentBasis // 傳入參數:objResponse(response CDO物件)、aryReturnMessage(回傳訊息參考) // 傳回參數:-1:fail,0:Success // 用 途:寫入部門主檔 // 撰寫人員:Lijyun // 撰寫日期:2017/02/08 // ======================================================================================================================== private int WriteToMESDepartmentBasis(iMESCIO.SCI.ERP.Response.SCI_Response_department_get objResponse, ref ArrayList aryReturnMessage) { int WriteToMESDepartmentBasisRet = default(int); WriteToMESDepartmentBasisRet = -1; // Return -1:fail,0:Success // =========================================================== // 宣告 DB相關 變數 // =========================================================== var drTemp = default(DbDataReader); IDbConnection cnnMES = null; Collection colSQL_2MES = new Collection(), colSQL_2MES_Rows = new Collection(); // MES正式異動資料(主要). string strSQL; // 每筆中介交易記錄 string strIfWhereCond_PK; string strMES_Result; string strMES_MESSAGE; // 錯誤訊息(中介表.MES_MESSAGE),Chr(10)分隔錯誤項目。 var aryMES_Message = new ArrayList(); // 收集單筆中介交易記錄的錯誤記錄, Exception及MES判定錯誤訊息。 var datNow = DateTime.Now; // Now try { cnnMES = CreateConnection(strConnectionString); // 宣告拋轉資料使用變數 string strERP_DepartmentNo, strERP_DepartmentName, strERP_DepartmentSName, str_ERPNo, strERP_status; // 預設值 int intIssueState = 0; // reset datNow = DateTime.Now; // Now strIfWhereCond_PK = ""; strMES_Result = "9"; // 預設值 9 (MES處理結果, 成功回寫1, 失敗回寫9). strMES_MESSAGE = ""; // 錯誤訊息 aryMES_Message.Clear(); colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); do { try { bool exitTry1 = false; for (int intRow = 0, loopTo = objResponse.department_get.Count - 1; intRow <= loopTo; intRow++) { // ----------------------------------------------------------- // 取出各欄位資料 // ----------------------------------------------------------- strERP_DepartmentNo = objResponse.department_get[intRow].department_no.ToString().Trim().ToUpper(); strERP_status = objResponse.department_get[intRow].tran_status.ToString().Trim().ToUpper(); strERP_DepartmentName = objResponse.department_get[intRow].department_name.ToString().Trim().ToUpper(); if (string.IsNullOrEmpty(strERP_DepartmentName)) strERP_DepartmentName = strERP_DepartmentNo; // 20170324 edit lijyun↓ // strERP_DepartmentSName = objResponse.department_get(intRow).department_shortname.ToString.Trim.ToUpper // If IsNothing(objResponse.department_get(intRow).department_shortname) Then // strERP_DepartmentSName = "" // End If if (string.IsNullOrWhiteSpace(objResponse.department_get[intRow].department_shortname)) { if (string.IsNullOrWhiteSpace(strERP_DepartmentName)) { strERP_DepartmentSName = "N/A"; } else { strERP_DepartmentSName = strERP_DepartmentName; } } else { strERP_DepartmentSName = objResponse.department_get[intRow].department_shortname.ToString().Trim(); } // 20170324 edit lijyun↑ str_ERPNo = objResponse.department_get[intRow].department_no.ToString().Trim(); // 檢查是否有此作業站設定 strSQL = "Select DepartmentNo,IssueState From tblUSRDepartmentBasis " + " Where DepartmentNo='" + strERP_DepartmentNo + "'"; //cmmTemp = new IDbCommand(strSQL, cnnMES); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); bool exitTry = false; switch (strERP_status ?? "") { case "AU": // 有資料修改沒資料新增 { if (!drTemp.Read()) { intIssueState = 0; // ----------------------------------------------------------- // 新增MES部門設定 // ----------------------------------------------------------- if (string.IsNullOrEmpty(strERP_DepartmentNo)) { aryMES_Message.Add(TranslateMsg("[%DepartmentNo%](department_no):" + strERP_DepartmentNo + " [%Is Empty%]!", strLanguageMode, strResourceDir)); } else if (string.IsNullOrEmpty(strERP_DepartmentName)) { aryMES_Message.Add(TranslateMsg("[%DepartmentNo%](department_no):" + strERP_DepartmentNo + ",[%DepartmentName%](department_name):" + strERP_DepartmentName + " [%Is Empty%]!", strLanguageMode, strResourceDir)); } else if (string.IsNullOrEmpty(strERP_DepartmentSName)) { aryMES_Message.Add(TranslateMsg("[%DepartmentNo%](department_no):" + strERP_DepartmentNo + ",[%DepartmentSName%](department_shortname):" + strERP_DepartmentSName + " [%Is Empty%]!", strLanguageMode, strResourceDir)); } else { strSQL = "Insert Into tblUSRDepartmentBasis " + "(DepartmentNo,DepartmentName,DepartmentSName," + "IssueState,ERPNO,Creator,CreateDate)"; strSQL += " Values('" + strERP_DepartmentNo + "','" + strERP_DepartmentName + "','" + strERP_DepartmentSName + "'," + intIssueState + ",'" + str_ERPNo + "','" + strERPCreator + "'," + "To_Date('" + Strings.Format(datNow, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'))"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } } else { // aryMES_Message.Add("部門編號(ooef001):" & strERP_DepartmentNo & ", 已存在MES, 不允許新增!!") // ERPws標準功能不論IssueState為何皆允許修改. // ----------------------------------------------------------- // 修改MES部門設定 // ----------------------------------------------------------- // 修改部門,因目前中介表定義欄位沒有需修改的,僅針對交易記錄判斷此產品在MES簽核狀態檢查是否需作變更。 // 2017-06-02, Joe, 修改時如原狀態為-1變更為0,其他不異動 if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], -1, false))) { intIssueState = 0; } else { intIssueState = Conversions.ToInteger(drTemp["IssueState"]); } strSQL = "Update tblUSRDepartmentBasis Set " + " IssueState = " + intIssueState + " ,DEPARTMENTNAME = '" + strERP_DepartmentName + "'" + " ,DEPARTMENTSNAME = '" + strERP_DepartmentSName + "'" + " ,ERPNo = '" + str_ERPNo + "'" + " Where DepartmentNo='" + strERP_DepartmentNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } drTemp.Close(); //cmmTemp.Dispose(); break; } case "D": // D:刪除 { if (drTemp.Read()) { if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], 0, false))) { // ----------------------------------------------------------- // 先刪除MES部門相關設定 // ----------------------------------------------------------- if (DepartmentIntegration_DelDepartment(ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_DepartmentNo) < 0) { // GoTo lblExitTry_2_NextRow exitTry1 = exitTry = true; break; } } else { // ----------------------------------------------------------- // 作廢MES部門設定 // ----------------------------------------------------------- strSQL = "Update tblUSRDepartmentBasis Set " + " IssueState=-1" + " Where DepartmentNo='" + strERP_DepartmentNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } } // aryMES_Message.Add(TranslateMsg("[%DepartmentNo%] : " & strERP_DepartmentNo & " [%IS NOT EXIST%]!")) // 刪除有可能會在資料庫中取不到資料,因為同一個交易還沒有commit; // ----------------------------------------------------------- // 先刪除MES部門相關設定 // ----------------------------------------------------------- else if (DepartmentIntegration_DelDepartment(ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_DepartmentNo) < 0) { // GoTo lblExitTry_2_NextRow exitTry1 = exitTry = true; break; } drTemp.Close(); break; } default: { aryMES_Message.Add(TranslateMsg("[%DepartmentNo%](department_no):" + strERP_DepartmentNo + ",ERP [%Status%] : " + strERP_status + " [%INVALID%],[%IS NOT ALLOWED TO EXECUTE%]!", strLanguageMode, strResourceDir)); break; } } if (exitTry) { break; } } if (exitTry1) { break; } } catch (Exception EX_drIF) { strMES_Result = "9"; aryMES_Message.Add("EX_drIF.Exception" + '\n' + EX_drIF.Message); } finally { // =============================================================================== // 判定 MES_Result 處理結果 (成功回寫1, 失敗回寫9). // =============================================================================== if (aryMES_Message.Count == 0) { strMES_Result = "1"; // -------------------------------------------------- // MES資料庫異動 // -------------------------------------------------- if (colSQL_2MES.Count > 0) { ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colSQL_2MES, colSQL_2MES_Rows); } } // 組合執行錯誤字串: Chr(10)分隔 strMES_MESSAGE = ArrayList2String(ref aryMES_Message); // MES_Message長度4000限制, 截取0-3996碼加"...". if (strMES_MESSAGE.Length > 4000) strMES_MESSAGE = strMES_MESSAGE.Substring(0, 3996) + "..."; // ---取消前面收集SQL--- colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); // 當該筆交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 if (aryMES_Message.Count > 0) { foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); } } } while (false); // //return 0 : Success WriteToMESDepartmentBasisRet = 0; } catch (Exception ex) { aryMES_Message.Add(ex.Message); // 當該筆中介交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); throw; } finally { if (drTemp != null) drTemp.Close(); CloseConnection(cnnMES); } return WriteToMESDepartmentBasisRet; } // ======================================================================================================================== // 程式名稱:WriteShiftBasis // 傳入參數:objResponse(response CDO物件)、aryReturnMessage(回傳訊息參考) // 傳回參數:-1:fail,0:Success // 用 途:寫入班別主檔 // 撰寫人員:敬翔 // 撰寫日期:2017/02/08 // ======================================================================================================================== private int WriteShiftBasis(iMESCIO.SCI.ERP.Response.SCI_Response_shift_get objResponse, ref ArrayList aryReturnMessage) { int WriteShiftBasisRet = default(int); WriteShiftBasisRet = -1; // Return -1:fail,0:Success // =========================================================== // 宣告 DB相關 變數 // =========================================================== DbDataReader drTemp; IDbConnection cnnMES = null; Collection colSQL_2MES = new Collection(), colSQL_2MES_Rows = new Collection(); // MES正式異動資料(主要). string strSQL; string strERPCreator = "ERP"; // 每筆中介交易記錄 string strIfWhereCond_PK; string strMES_Result; string strMES_MESSAGE; // 錯誤訊息(中介表.MES_MESSAGE),Chr(10)分隔錯誤項目。 var aryMES_Message = new ArrayList(); // 收集單筆中介交易記錄的錯誤記錄, Exception及MES判定錯誤訊息。 var datNow = DateTime.Now; // Now var aryDepartmentNo = new ArrayList(); // 記錄是否新增過部門編號 try { cnnMES = CreateConnection(strConnectionString); // 宣告拋轉資料使用變數 string strERP_Status, strERP_ShiftNo, strERP_DepartmentNo, strDepartmentNo, strERP_ShiftName, strERP_CreateDate, strERP_Creator, strERP_Description, strERP_FromTime = default(string), strERP_FromTime2, strERP_ToTime, strERP_ToTime2, strERP_ERPNo; // 預設值 int intIssueState = 0; // reset strIfWhereCond_PK = ""; strMES_Result = "9"; // 預設值 9 (MES處理結果, 成功回寫1, 失敗回寫9). strMES_MESSAGE = ""; // 錯誤訊息 aryMES_Message.Clear(); colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); do { try { bool exitTry = false; for (int intRow = 0, loopTo = objResponse.shift_get.Count - 1; intRow <= loopTo; intRow++) { // ----------------------------------------------------------- // 取出各欄位資料 // ----------------------------------------------------------- strERP_ShiftNo = objResponse.shift_get[intRow].shift_no.Trim().ToUpper(); // strERP_DepartmentNo = objResponse.shift_get(intRow).department_no.Trim.ToUpper // 20170313 edit liyun↓ // 20170316, Joe, Modify 應先判斷如ERP無傳值給*,有傳值才塞入變數中 if (objResponse.shift_get[intRow].department_no == null) { strERP_DepartmentNo = "*"; } else if (string.IsNullOrEmpty(objResponse.shift_get[intRow].department_no)) { strERP_DepartmentNo = "*"; } else { strERP_DepartmentNo = objResponse.shift_get[intRow].department_no.Trim(); } strERP_ShiftName = objResponse.shift_get[intRow].shift_name.Trim().ToUpper(); // 20170316, Joe, Modify 改用IsNullOrEmpty if (string.IsNullOrEmpty(strERP_ShiftName)) strERP_ShiftName = strERP_ShiftNo; // 20170313 edit liyun↑ strERP_Description = objResponse.description; // 20170324 edit lijyun↓ if (objResponse.shift_get[intRow].date_s == null) { strERP_FromTime2 = "2000/01/01 00:00:00"; } else { strERP_FromTime = DateTime.Now.ToString("yyyyMMdd") + objResponse.shift_get[intRow].date_s; strERP_FromTime2 = Strings.Left(strERP_FromTime, 4) + "/" + Strings.Mid(strERP_FromTime, 5, 2) + "/" + Strings.Mid(strERP_FromTime, 7, 2) + " " + DateTimeConversion(objResponse.shift_get[intRow].date_s); } // 結束時間小於開始時間代表 日期為隔日 if (objResponse.shift_get[intRow].date_e == null) { strERP_ToTime2 = "2000/01/01 00:00:00"; } else { if (Operators.CompareString(objResponse.shift_get[intRow].date_e, strERP_FromTime, false) < 0) { strERP_ToTime = Conversions.ToDouble(DateTime.Now.ToString("yyyyMMdd")) + 1d + objResponse.shift_get[intRow].date_e; } else { strERP_ToTime = DateTime.Now.ToString("yyyyMMdd") + objResponse.shift_get[intRow].date_e; } strERP_ToTime2 = Strings.Left(strERP_ToTime, 4) + "/" + Strings.Mid(strERP_ToTime, 5, 2) + "/" + Strings.Mid(strERP_ToTime, 7, 2) + " " + DateTimeConversion(objResponse.shift_get[intRow].date_e); } // 20170324 edit lijyun↑ strERP_ERPNo = objResponse.shift_get[intRow].shift_no; strERP_Status = objResponse.shift_get[intRow].tran_status.Trim().ToUpper(); // 20170315 edit lijyun↓ if (strERP_DepartmentNo != "*") { // ----------------------------------------------------------- // 固定檢查DepartmentNo資料,若不存在則自動新增。 // ----------------------------------------------------------- if (aryDepartmentNo.IndexOf(strERP_DepartmentNo) == -1) { if (AddDepartmentNo(ref cnnMES, ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_DepartmentNo, strERPCreator, DateTime.Now, "AutoRun建立") < 0) { exitTry = true; break; } else { aryDepartmentNo.Add(strERP_DepartmentNo); } } } // 20170315 edit lijyun↑ // 檢查是否有此班別設定 strSQL = "Select DepartmentNo,ShiftNo,IssueState From tblUSRShiftBasis " + " Where DepartmentNo='" + strERP_DepartmentNo + "'" + " And ShiftNo='" + strERP_ShiftNo + "'"; //cmmTemp = new IDbCommand(strSQL, cnnMES); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); switch (strERP_Status ?? "") { case "AU": // 有資料修改沒資料新增 { if (!drTemp.Read()) { intIssueState = 0; // ----------------------------------------------------------- // 新增MES班別設定 // ----------------------------------------------------------- strSQL = "Insert Into tblUSRShiftBasis " + "(DepartmentNo,ShiftNo,ShiftName," + " Description,Creator,IssueState,ERPNo,FromTime,ToTime,CreateDate)"; strSQL += " Values('" + strERP_DepartmentNo + "','" + strERP_ShiftNo + "','" + strERP_ShiftName + "', 'AutoRun建立' ,'" + strERPCreator + "', '" + intIssueState + "','" + strERP_ERPNo + "'," + "To_Date('" + strERP_FromTime2 + "','YYYY/MM/DD HH24:MI:SS') ," + "To_Date('" + strERP_ToTime2 + "','YYYY/MM/DD HH24:MI:SS') ," + "To_Date('" + Strings.Format(DateTime.Now, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'))"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } else { // ----------------------------------------------------------- // 修改MES班別設定 // ----------------------------------------------------------- // If drTemp("IssueState") <> 2 Then // MES已存在之資料IssueState如果是-1,ERP資料再次拋轉時,IssueState則更新為"0". // 2017-06-02, Joe, 修改時如原狀態為-1變更為0,其他不異動 if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], -1, false))) { intIssueState = 0; } else { intIssueState = Conversions.ToInteger(drTemp["IssueState"]); } strSQL = "Update tblUSRShiftBasis Set " + " IssueState = " + intIssueState + " ,ShiftName = '" + strERP_ShiftName + "',FromTime = " + " To_Date('" + strERP_FromTime2 + "','YYYY/MM/DD HH24:MI:SS') ,ToTime = " + " To_Date('" + strERP_ToTime2 + "','YYYY/MM/DD HH24:MI:SS') ,CreateDate = " + "To_Date('" + Strings.Format(DateTime.Now, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')" + " ,ERPNo = '" + strERP_ERPNo + "'" + " Where ShiftNo='" + strERP_ShiftNo + "' And DepartmentNo='" + strERP_DepartmentNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); // End If } drTemp.Close(); //cmmTemp.Dispose(); break; } case "D": // D:刪除 { if (drTemp.Read()) { if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], 0, false))) { // ----------------------------------------------------------- // 刪除MES班別設定 // ----------------------------------------------------------- strSQL = "Delete tblUSRShiftBasis " + " Where DepartmentNo='" + strERP_DepartmentNo + "'" + " And ShiftNo='" + strERP_ShiftNo + "' And DepartmentNo='" + strERP_DepartmentNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); } else { // ----------------------------------------------------------- // 作廢MES班別設定 // ----------------------------------------------------------- strSQL = "Update tblUSRShiftBasis Set " + " IssueState = -1" + " Where DepartmentNo='" + strERP_DepartmentNo + "'" + " And ShiftNo='" + strERP_ShiftNo + "' And DepartmentNo='" + strERP_DepartmentNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } } else { // aryMES_Message.Add(TranslateMsg("[%shiftno%](shift_no): " & strERP_ShiftNo & " [%IS NOT EXIST%]!")) // 刪除有可能會在資料庫中取不到資料,因為同一個交易還沒有commit; // ----------------------------------------------------------- // 刪除MES班別設定 // ----------------------------------------------------------- strSQL = "Delete tblUSRShiftBasis " + " Where DepartmentNo='" + strERP_DepartmentNo + "'" + " And ShiftNo='" + strERP_ShiftNo + "' And DepartmentNo='" + strERP_DepartmentNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); } drTemp.Close(); break; } default: { aryMES_Message.Add(TranslateMsg("[%shiftno%](shift_no): " + strERP_ShiftNo + " ,ERP [%Status%] : " + strERP_Status + " [%INVALID%], [%IS NOT ALLOWED TO EXECUTE%]!", strLanguageMode, strResourceDir)); break; } } } if (exitTry) { break; } } catch (Exception ex) { strMES_Result = "9"; aryMES_Message.Add("Exception" + '\n' + ex.Message); } finally { // =============================================================================== // 判定 MES_Result 處理結果 (成功回寫1, 失敗回寫9). // =============================================================================== if (aryMES_Message.Count == 0) { strMES_Result = "1"; // -------------------------------------------------- // MES資料庫異動 // -------------------------------------------------- if (colSQL_2MES.Count > 0) { ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colSQL_2MES, colSQL_2MES_Rows); } } // 組合執行錯誤字串: Chr(10)分隔 strMES_MESSAGE = ArrayList2String(ref aryMES_Message); // MES_Message長度4000限制, 截取0-3996碼加"...". if (strMES_MESSAGE.Length > 4000) strMES_MESSAGE = strMES_MESSAGE.Substring(0, 3996) + "..."; // ---取消前面收集SQL--- colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); // 當該筆交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 if (aryMES_Message.Count > 0) { foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); } } } while (false); // //return 0 : Success WriteShiftBasisRet = 0; } catch (Exception ex) { aryMES_Message.Add(ex.Message); // 當該筆中介交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); throw; } finally { // If Not drTemp Is Nothing Then drTemp.Close() CloseConnection(cnnMES); } return WriteShiftBasisRet; } // ======================================================================================================================== // 程式名稱:WriteOPBasis // 傳入參數:objResponse(response CDO物件)、aryReturnMessage(回傳訊息參考) // 傳回參數:-1:fail,0:Success // 用 途:寫入作業站主檔 // 撰寫人員:敬翔 // 撰寫日期:2017/02/08 // ======================================================================================================================== private int WriteOPBasis(iMESCIO.SCI.ERP.Response.SCI_Response_op_get objResponse, ref ArrayList aryReturnMessage) { int WriteOPBasisRet = default(int); WriteOPBasisRet = -1; // Return -1:fail,0:Success // =========================================================== // 宣告 DB相關 變數 // =========================================================== DbDataReader drTemp; IDbConnection cnnMES = null; Collection colSQL_2MES = new Collection(), colSQL_2MES_Rows = new Collection(); // MES正式異動資料(主要). string strSQL; string strERPCreator = "ERP"; // 每筆中介交易記錄 string strIfWhereCond_PK; string strMES_Result; string strMES_MESSAGE; // 錯誤訊息(中介表.MES_MESSAGE),Chr(10)分隔錯誤項目。 var aryMES_Message = new ArrayList(); // 收集單筆中介交易記錄的錯誤記錄, Exception及MES判定錯誤訊息。 var aryOPType = new ArrayList(); // 記錄是否已新增過作業站類別 try { cnnMES = CreateConnection(strConnectionString); // 宣告拋轉資料使用變數 string strERP_Status, strERP_OPNo, strERP_OPName, strERP_CreateDate, strERP_Description, strERP_ERPNo, str_OPType, strERP_OSOption; // 預設值 int intIssueState = 0; // reset strIfWhereCond_PK = ""; strMES_Result = "9"; // 預設值 9 (MES處理結果, 成功回寫1, 失敗回寫9). strMES_MESSAGE = ""; // 錯誤訊息 aryMES_Message.Clear(); colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); do { try { // 2019/07/02 Shih Kai, Mantis:0059229, 因作業站區段固定寫入N/A, // 在新增作業站資料時,檢查是否有N/A的區段,若沒有則同時新增一筆N/A的區段資料 if (AddOPProductionSegment(ref cnnMES, ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, "N/A", strERPCreator, DateTime.Now, "AutoRun建立") < 0) { break; } bool exitTry = false; for (int intRow = 0, loopTo = objResponse.op_get.Count - 1; intRow <= loopTo; intRow++) { // ----------------------------------------------------------- // 取出各欄位資料 // ----------------------------------------------------------- strERP_OPNo = objResponse.op_get[intRow].op_no.Trim().ToUpper(); strERP_OPName = objResponse.op_get[intRow].op_name.Trim().ToUpper(); strERP_OPName = Conversions.ToString(Interaction.IIf(string.IsNullOrWhiteSpace(strERP_OPName), strERP_OPNo, strERP_OPName)); strERP_Description = objResponse.description; strERP_ERPNo = objResponse.op_get[intRow].op_no; strERP_Status = objResponse.op_get[intRow].tran_status.Trim().ToUpper(); strERP_OSOption = Conversions.ToString(Interaction.IIf(objResponse.op_get[intRow].outsourcing_type == "Y", "1", "0")); // ERP回傳是否委外為Y/N,MES DB為1/0,Add By KevinChang 20170426 str_OPType = "OP"; // ----------------------------------------------------------- // 固定檢查OPGroup資料,若不存在則自動新增。 // ----------------------------------------------------------- if (aryOPType.IndexOf(str_OPType) == -1) { if (AddOPType(ref cnnMES, ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, str_OPType, strERPCreator, DateTime.Now, "AutoRun建立") < 0) { exitTry = true; break; } else { aryOPType.Add(str_OPType); } } // 檢查是否有此作業站設定 strSQL = "Select OPNo,IssueState From tblOPBasis " + " Where OPNo='" + strERP_OPNo + "'"; //cmmTemp = new IDbCommand(strSQL, cnnMES); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); switch (strERP_Status ?? "") { case "AU": // 有資料修改沒資料新增 { if (!drTemp.Read()) { intIssueState = 0; // ----------------------------------------------------------- // 新增MES作業站設定 // ----------------------------------------------------------- strSQL = "Insert Into tblOPBasis " + "(OPNo,OPName,OPShortName,OPType,OPClass,PSNo,StdunitRunTime,CountOPUnitQTY,STDQueueTime," + " Description,Creator,IssueState,ERPNo,CreateDate,PrintOutOnRunCard,OSOption)"; // 91094: [605][CP+FT] E10ICD整合問題_作業站主檔拋轉時,寫入生產區段資料比照TipTop/WorkFlow方式取得區段編號資料 strSQL += " Values('" + strERP_OPNo + "','" + strERP_OPName + "','" + strERP_OPName + "','" + str_OPType + "',0, '" + objSetting["defPSNo"] + "',1,1,1, 'AutoRun建立' ,'" + strERPCreator + "', '" + intIssueState + "','" + strERP_ERPNo + "'," + "To_Date('" + Strings.Format(DateTime.Now, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),1," + strERP_OSOption + ")"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } else { // ----------------------------------------------------------- // 修改MES作業站設定 // ----------------------------------------------------------- // 2017-06-02, Joe, 修改時如原狀態為-1變更為0,其他不異動 if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], -1, false))) { intIssueState = 0; } else { intIssueState = Conversions.ToInteger(drTemp["IssueState"]); } // MES已存在之資料IssueState如果是-1,ERP資料再次拋轉時,IssueState則更新為"0". strSQL = "Update tblOPBasis Set " + " IssueState = " + intIssueState + ", OPName = '" + strERP_OPName + "' , OSOption = " + strERP_OSOption + ", ERPNo = '" + strERP_ERPNo + "' Where OPNo='" + strERP_OPNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); // strSQL = "Update tblWIPEquipmentProductivity Set " & // " NormalOperation = '" & strERP_NormalOperation & "', WarrantyNo = '" & strERP_WarrantyNo & "' ,Description = 'AutoRun建立',Status = '" & strERP_Status & "',StartTime = " & // "To_Date('" & strERP_FromTime & "','YYYY/MM/DD HH24:MI:SS') ,EndTime = " & // "To_Date('" & strERP_ToTime & "','YYYY/MM/DD HH24:MI:SS')" } drTemp.Close(); //cmmTemp.Dispose(); break; } case "D": // D:刪除 { if (drTemp.Read()) { if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], 0, false))) { // ----------------------------------------------------------- // 刪除MES作業站設定 // ----------------------------------------------------------- strSQL = "Delete tblOPBasis " + " Where OPNo='" + strERP_OPNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); } else { // ----------------------------------------------------------- // 作廢MES作業站設定 // ----------------------------------------------------------- strSQL = "Update tblOPBasis Set " + " IssueState=-1" + " Where OPNo='" + strERP_OPNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); } } else { // aryMES_Message.Add(TranslateMsg("[%OPno%](op_no): " & strERP_OPNo & " [%IS NOT EXIST%]!")) // 刪除有可能會在資料庫中取不到資料,因為同一個交易還沒有commit; // ----------------------------------------------------------- // 刪除MES作業站設定 // ----------------------------------------------------------- strSQL = "Delete tblOPBasis " + " Where OPNo='" + strERP_OPNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); } drTemp.Close(); break; } default: { aryMES_Message.Add(TranslateMsg("[%OPno%](op_no): " + strERP_OPNo + ",ERP [%Status%] : " + strERP_Status + " [%INVALID%], [%IS NOT ALLOWED TO EXECUTE%]!", strLanguageMode, strResourceDir)); break; } } } if (exitTry) { break; } } catch (Exception ex) { strMES_Result = "9"; aryMES_Message.Add("Exception" + '\n' + ex.Message); } finally { // =============================================================================== // 判定 MES_Result 處理結果 (成功回寫1, 失敗回寫9). // =============================================================================== if (aryMES_Message.Count == 0) { strMES_Result = "1"; // -------------------------------------------------- // MES資料庫異動 // -------------------------------------------------- if (colSQL_2MES.Count > 0) { ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colSQL_2MES, colSQL_2MES_Rows); } } // 組合執行錯誤字串: Chr(10)分隔 strMES_MESSAGE = ArrayList2String(ref aryMES_Message); // MES_Message長度4000限制, 截取0-3996碼加"...". if (strMES_MESSAGE.Length > 4000) strMES_MESSAGE = strMES_MESSAGE.Substring(0, 3996) + "..."; // ---取消前面收集SQL--- colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); // 當該筆交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 if (aryMES_Message.Count > 0) { foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); } } } while (false); // //return 0 : Success WriteOPBasisRet = 0; } catch (Exception ex) { aryMES_Message.Add(ex.Message); // 當該筆中介交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); throw; } finally { // If Not drTemp Is Nothing Then drTemp.Close() CloseConnection(cnnMES); } return WriteOPBasisRet; } // ======================================================================================================================== // 程式名稱:WriteOPGroupBasis // 傳入參數:objResponse(response CDO物件)、aryReturnMessage(回傳訊息參考) // 傳回參數:-1:fail,0:Success // 用 途:寫入工作站主檔 // 撰寫人員:敬翔 // 撰寫日期:2017/02/08 // ======================================================================================================================== private int WriteOPGroupBasis(iMESCIO.SCI.ERP.Response.SCI_Response_workstation_get objResponse, ref ArrayList aryReturnMessage) { int WriteOPGroupBasisRet = default(int); WriteOPGroupBasisRet = -1; // Return -1:fail,0:Success // =========================================================== // 宣告 DB相關 變數 // =========================================================== DbDataReader drTemp; IDbConnection cnnMES = null; Collection colSQL_2MES = new Collection(), colSQL_2MES_Rows = new Collection(); // MES正式異動資料(主要). string strSQL; string strERPCreator = "ERP"; // 每筆中介交易記錄 string strIfWhereCond_PK; string strMES_Result; string strMES_MESSAGE; // 錯誤訊息(中介表.MES_MESSAGE),Chr(10)分隔錯誤項目。 var aryMES_Message = new ArrayList(); // 收集單筆中介交易記錄的錯誤記錄, Exception及MES判定錯誤訊息。 try { cnnMES = CreateConnection(strConnectionString); // 宣告拋轉資料使用變數 string strERP_Status, strERP_WorkStationNo, strERP_WorkStationName, strERP_CreateDate, strERP_Description, strERP_ERPNo; // 預設值 int intIssueState = 0; // reset strIfWhereCond_PK = ""; strMES_Result = "9"; // 預設值 9 (MES處理結果, 成功回寫1, 失敗回寫9). strMES_MESSAGE = ""; // 錯誤訊息 aryMES_Message.Clear(); colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); try { for (int intRow = 0, loopTo = objResponse.workstation_get.Count - 1; intRow <= loopTo; intRow++) { // ----------------------------------------------------------- // 取出各欄位資料 // ----------------------------------------------------------- strERP_WorkStationNo = objResponse.workstation_get[intRow].workstation_no.Trim().ToUpper(); strERP_WorkStationName = objResponse.workstation_get[intRow].workstation_name.Trim().ToUpper(); if (strERP_WorkStationName == null || string.IsNullOrEmpty(strERP_WorkStationName)) { strERP_WorkStationName = strERP_WorkStationNo; } strERP_Description = objResponse.description; strERP_ERPNo = objResponse.workstation_get[intRow].workstation_no; strERP_Status = objResponse.workstation_get[intRow].tran_status.Trim().ToUpper(); // 檢查是否有此作業站設定 strSQL = "Select OPGroupNo From tblOPGroupBasis " + " Where OPGroupNo='" + strERP_WorkStationNo + "'"; //cmmTemp = new IDbCommand(strSQL, cnnMES); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); switch (strERP_Status ?? "") { case "AU": // 有資料修改沒資料新增 { if (!drTemp.Read()) { // ----------------------------------------------------------- // 新增MES作業站設定 // ----------------------------------------------------------- strSQL = "Insert Into tblOPGroupBasis " + "(OPGroupNo,OPGroupName," + " Description,Creator,ERPNo,CreateDate)"; strSQL += " Values('" + strERP_WorkStationNo + "','" + strERP_WorkStationName + "', 'AutoRun建立' ,'" + strERPCreator + "','" + strERP_ERPNo + "'," + "To_Date('" + Strings.Format(DateTime.Now, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'))"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } else { // ----------------------------------------------------------- // 修改MES作業站設定() // ----------------------------------------------------------- // MES已存在之資料IssueState如果是-1,ERP資料再次拋轉時,IssueState則更新為"0". strSQL = "Update tblOPGroupBasis Set " + " OPGroupName = '" + strERP_WorkStationName + "'" + ",ERPNo = '" + strERP_ERPNo + "'" + " Where OPGroupNo='" + strERP_WorkStationNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } drTemp.Close(); //cmmTemp.Dispose(); break; } case "D": // D:刪除 { // If drTemp.Read Then // ----------------------------------------------------------- // 刪除MES作業站群組設定 // ----------------------------------------------------------- strSQL = "Delete tblOPGroupBasis " + " Where OPGroupNo='" + strERP_WorkStationNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // 2017-06-02, Joe, 要一併刪除Detail資訊 strSQL = "Delete tblOPGroupDetail " + " Where OPGroupNo='" + strERP_WorkStationNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // Else // aryMES_Message.Add(TranslateMsg("[%opgroupno%](workstation_no): " & strERP_WorkStationNo & " [%IS NOT EXIST%]!")) // 刪除有可能會在資料庫中取不到資料,因為同一個交易還沒有commit; // End If drTemp.Close(); break; } default: { aryMES_Message.Add(TranslateMsg("[%opgroupno%](workstation_no): " + strERP_WorkStationNo + ",ERP [%Status%] : " + strERP_Status + " [%INVALID%], [%IS NOT ALLOWED TO EXECUTE%]!", strLanguageMode, strResourceDir)); break; } } } } catch (Exception ex) { strMES_Result = "9"; aryMES_Message.Add("Exception" + '\n' + ex.Message); } finally { // =============================================================================== // 判定 MES_Result 處理結果 (成功回寫1, 失敗回寫9). // =============================================================================== if (aryMES_Message.Count == 0) { strMES_Result = "1"; // -------------------------------------------------- // MES資料庫異動 // -------------------------------------------------- if (colSQL_2MES.Count > 0) { ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colSQL_2MES, colSQL_2MES_Rows); } } // 組合執行錯誤字串: Chr(10)分隔 strMES_MESSAGE = ArrayList2String(ref aryMES_Message); // MES_Message長度4000限制, 截取0-3996碼加"...". if (strMES_MESSAGE.Length > 4000) strMES_MESSAGE = strMES_MESSAGE.Substring(0, 3996) + "..."; // ---取消前面收集SQL--- colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); // 當該筆交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 if (aryMES_Message.Count > 0) { foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); } } // //return 0 : Success WriteOPGroupBasisRet = 0; } catch (Exception ex) { aryMES_Message.Add(ex.Message); // 當該筆中介交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); throw; } finally { // If Not drTemp Is Nothing Then drTemp.Close() CloseConnection(cnnMES); } return WriteOPGroupBasisRet; } // ======================================================================================================================== // 程式名稱:WriteEquipmentProductivity(資源行事曆) // 傳入參數:objResponse(response CDO物件)、aryReturnMessage(回傳訊息參考) // 傳回參數:-1:fail,0:Success // 用 途:寫入機台產能資料表 // 撰寫人員:敬翔 // 撰寫日期:2017/02/23 // ======================================================================================================================== private int WriteEquipmentProductivity(iMESCIO.SCI.ERP.Response.SCI_Response_resource_calendar_get objResponse, ref ArrayList aryReturnMessage) { int WriteEquipmentProductivityRet = default(int); WriteEquipmentProductivityRet = -1; // Return -1:fail,0:Success // =========================================================== // 宣告 DB相關 變數 // =========================================================== DbDataReader drTemp; IDbConnection cnnMES = null; Collection colSQL_2MES = new Collection(), colSQL_2MES_Rows = new Collection(); // MES正式異動資料(主要). string strSQL; string strERPCreator = "ERP"; // 每筆中介交易記錄 string strIfWhereCond_PK; string strMES_Result; string strMES_MESSAGE; // 錯誤訊息(中介表.MES_MESSAGE),Chr(10)分隔錯誤項目。 var aryMES_Message = new ArrayList(); // 收集單筆中介交易記錄的錯誤記錄, Exception及MES判定錯誤訊息。 var datNow = DateTime.Now; // Now var aryResourceNo = new ArrayList(); // 記錄是否新增過設備主檔 var aryWorkStationNo = new ArrayList(); // 記錄是否新增過作業站群組 try { cnnMES = CreateConnection(strConnectionString); // 宣告拋轉資料使用變數 string strERP_ResourceNo, strERP_Date, strERP_FromTime, strERP_FromTime2, strERP_ToTime, strERP_ToTime2, strERP_NormalOperation, strERP_WorkStationNo, strERP_WarrantyNo, strERP_Remark, strERP_Status, strERP_CreateDate, strERP_Creator, strERP_ERPNo, str_WorkStationNo, strERP_TranStatus; // 預設值 目前機台產能資料表無IssueState欄位 // Dim intIssueState As Integer = 0 // reset strIfWhereCond_PK = ""; strMES_Result = "9"; // 預設值 9 (MES處理結果, 成功回寫1, 失敗回寫9). strMES_MESSAGE = ""; // 錯誤訊息 aryMES_Message.Clear(); colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); do { try { bool exitTry = false; for (int intRow = 0, loopTo = objResponse.resource_calendar_get.Count - 1; intRow <= loopTo; intRow++) { // ----------------------------------------------------------- // 取出各欄位資料 // ----------------------------------------------------------- strERP_ResourceNo = objResponse.resource_calendar_get[intRow].resource_no.Trim().ToUpper(); strERP_Date = objResponse.resource_calendar_get[intRow].date.Trim().ToUpper(); strERP_FromTime = strERP_Date + objResponse.resource_calendar_get[intRow].datetime_s; strERP_FromTime2 = Strings.Left(strERP_FromTime, 4) + "/" + Strings.Mid(strERP_FromTime, 5, 2) + "/" + Strings.Mid(strERP_FromTime, 7, 2) + " " + DateTimeConversion(objResponse.resource_calendar_get[intRow].datetime_s); if (Operators.CompareString(objResponse.resource_calendar_get[intRow].datetime_e, objResponse.resource_calendar_get[intRow].datetime_s, false) < 0) { strERP_ToTime2 = Conversions.ToString(DateAndTime.DateAdd("d", +1, strERP_FromTime2)) + objResponse.resource_calendar_get[intRow].datetime_e + DateTimeConversion(objResponse.resource_calendar_get[intRow].datetime_e); } else { strERP_ToTime = strERP_Date + objResponse.resource_calendar_get[intRow].datetime_e; strERP_ToTime2 = Strings.Left(strERP_ToTime, 4) + "/" + Strings.Mid(strERP_ToTime, 5, 2) + "/" + Strings.Mid(strERP_ToTime, 7, 2) + " " + DateTimeConversion(objResponse.resource_calendar_get[intRow].datetime_e); } strERP_NormalOperation = objResponse.resource_calendar_get[intRow].normal_operation; strERP_WorkStationNo = objResponse.resource_calendar_get[intRow].workstation_no.Trim().ToUpper(); strERP_WarrantyNo = objResponse.resource_calendar_get[intRow].warranty_no.Trim().ToUpper(); strERP_Remark = objResponse.resource_calendar_get[intRow].remark.Trim().ToUpper(); strERP_Status = objResponse.resource_calendar_get[intRow].status.Trim().ToUpper(); strERP_ERPNo = objResponse.resource_calendar_get[intRow].resource_no; strERP_TranStatus = objResponse.resource_calendar_get[intRow].tran_status.Trim().ToUpper(); str_WorkStationNo = objResponse.resource_calendar_get[intRow].workstation_no.Trim(); // '檢查是否有此作業站群組 // strSQL = "Select OPGroupNo From tblOPGroupBasis " & // " Where OPGroupNo='" & strERP_WorkStationNo & "'" // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnMES) // drTemp = ExecuteSQLQuery_Reader // If Not drTemp.Read Then // '無此作業站群組 執行新增 // strSQL = "Insert Into tblOPGroupBasis " & // "(OPGroupNo,OPGroupName," & " Description,Creator,ERPNo,CreateDate)" // strSQL += " Values('" & strERP_WorkStationNo & "','N/A', 'AutoRun建立' ,'" & strERPCreator & "','" & strERP_WorkStationNo & "'," & // "To_Date('" & Format(DateTime.Now, "yyyy/MM/dd H:mm:ss") & "','YYYY/MM/DD HH24:MI:SS'))" // colSQL_2MES.Add(strSQL) // colSQL_2MES_Rows.Add(1) // End If // ----------------------------------------------------------- // 固定檢查Equipment資料,若不存在則自動新增。 // ----------------------------------------------------------- if (aryResourceNo.IndexOf(strERP_ResourceNo) == -1) { if (AddOPGroup(ref cnnMES, ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_ResourceNo, strERPCreator, DateTime.Now, "AutoRun建立") < 0) { exitTry = true; break; } else { aryResourceNo.Add(strERP_ResourceNo); } } // ----------------------------------------------------------- // 固定檢查OPGroup資料,若不存在則自動新增。 // ----------------------------------------------------------- if (aryWorkStationNo.IndexOf(str_WorkStationNo) == -1) { if (AddOPGroup(ref cnnMES, ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, str_WorkStationNo, strERPCreator, DateTime.Now, "AutoRun建立") < 0) { exitTry = true; break; } else { aryWorkStationNo.Add(str_WorkStationNo); } } // 檢查是否有此機台產能設定 strSQL = "Select EquipmentNo From tblWIPEquipmentProductivity " + " Where EquipmentNo='" + strERP_ResourceNo + "'"; //cmmTemp = new IDbCommand(strSQL, cnnMES); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); switch (strERP_TranStatus ?? "") { case "AU": // 有資料修改沒資料新增 { if (!drTemp.Read()) { // ----------------------------------------------------------- // 新增MES機台產能設定 // ----------------------------------------------------------- strSQL = "Insert Into tblWIPEquipmentProductivity " + "(EquipmentNo," + " NormalOperation,OPGroupNo,WarrantyNo,Description,Status,Creator,ERPNo,StartTime,EndTime,CreateDate)"; strSQL += " Values('" + strERP_ResourceNo + "','" + strERP_NormalOperation + "','" + strERP_WorkStationNo + "','" + strERP_WarrantyNo + "', 'AutoRun建立' ,'" + strERP_Status + "','" + strERPCreator + "','" + strERP_ERPNo + "'," + "To_Date('" + strERP_FromTime2 + "','YYYY/MM/DD HH24:MI:SS') ," + "To_Date('" + strERP_ToTime2 + "','YYYY/MM/DD HH24:MI:SS') ," + "To_Date('" + Strings.Format(datNow, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'))"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } else { // ----------------------------------------------------------- // 修改MES機台產能設定 // -------------- // MES已存在之資料,ERP資料再次拋轉時,更新資料 strSQL = "Update tblWIPEquipmentProductivity Set " + " NormalOperation = '" + strERP_NormalOperation + "', WarrantyNo = '" + strERP_WarrantyNo + "' ,Description = 'AutoRun建立',Status = '" + strERP_Status + "',StartTime = " + "To_Date('" + strERP_FromTime2 + "','YYYY/MM/DD HH24:MI:SS') ,EndTime = " + "To_Date('" + strERP_ToTime2 + "','YYYY/MM/DD HH24:MI:SS')" + ",ERPNo = '" + strERP_ERPNo + "'"; strSQL += " Where EquipmentNo ='" + strERP_ResourceNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } drTemp.Close(); //cmmTemp.Dispose(); break; } case "D": // D:刪除 { // If drTemp.Read Then strSQL = "Delete tblWIPEquipmentProductivity " + " Where EquipmentNo ='" + strERP_ResourceNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // Else // aryMES_Message.Add(TranslateMsg("[%resourceno%](resource_no): " & strERP_ResourceNo & " [%IS NOT EXIST%]!")) // 刪除有可能會在資料庫中取不到資料,因為同一個交易還沒有commit; // End If drTemp.Close(); break; } default: { aryMES_Message.Add(TranslateMsg("[%resourceno%](resource_no): " + strERP_ResourceNo + ",ERP [%Status%] : " + strERP_Status + " [%INVALID%], [%IS NOT ALLOWED TO EXECUTE%]!", strLanguageMode, strResourceDir)); break; } } } if (exitTry) { break; } } catch (Exception ex) { strMES_Result = "9"; aryMES_Message.Add("Exception" + '\n' + ex.Message); } finally { // =============================================================================== // 判定 MES_Result 處理結果 (成功回寫1, 失敗回寫9). // =============================================================================== if (aryMES_Message.Count == 0) { strMES_Result = "1"; // -------------------------------------------------- // MES資料庫異動 // -------------------------------------------------- if (colSQL_2MES.Count > 0) { ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colSQL_2MES, colSQL_2MES_Rows); } } // 組合執行錯誤字串: Chr(10)分隔 strMES_MESSAGE = ArrayList2String(ref aryMES_Message); // MES_Message長度4000限制, 截取0-3996碼加"...". if (strMES_MESSAGE.Length > 4000) strMES_MESSAGE = strMES_MESSAGE.Substring(0, 3996) + "..."; // ---取消前面收集SQL--- colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); // 當該筆交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 if (aryMES_Message.Count > 0) { foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); } } } while (false); // //return 0 : Success WriteEquipmentProductivityRet = 0; } catch (Exception ex) { aryMES_Message.Add(ex.Message); // 當該筆中介交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); throw; } finally { // If Not drTemp Is Nothing Then drTemp.Close() CloseConnection(cnnMES); } return WriteEquipmentProductivityRet; } // ======================================================================================================================== // 程式名稱:WriteAccessoryBasis // 傳入參數:objResponse(response CDO物件)、aryReturnMessage(回傳訊息參考) // 傳回參數:-1:fail,0:Success // 用 途:寫入工作站主檔 // 撰寫人員:敬翔 // 撰寫日期:2017/02/08 // ======================================================================================================================== private int WriteAccessoryBasis(iMESCIO.SCI.ERP.Response.SCI_Response_mold_fixture_get objResponse, ref ArrayList aryReturnMessage) { int WriteAccessoryBasisRet = default(int); WriteAccessoryBasisRet = -1; // Return -1:fail,0:Success // =========================================================== // 宣告 DB相關 變數 // =========================================================== DbDataReader drTemp; IDbConnection cnnMES = null; Collection colSQL_2MES = new Collection(), colSQL_2MES_Rows = new Collection(); // MES正式異動資料(主要). string strSQL; string strERPCreator = "ERP"; // 每筆中介交易記錄 string strIfWhereCond_PK; string strMES_Result; string strMES_MESSAGE; // 錯誤訊息(中介表.MES_MESSAGE),Chr(10)分隔錯誤項目。 var aryMES_Message = new ArrayList(); // 收集單筆中介交易記錄的錯誤記錄, Exception及MES判定錯誤訊息。 ArrayList aryVendorNo = new ArrayList(), aryAccessoryType = new ArrayList(), aryAccessoryCategory = new ArrayList(); // 記錄是否已新增 try { cnnMES = CreateConnection(strConnectionString); // 宣告拋轉資料使用變數 string strERP_Status, strERP_AccessoryNo, strERP_SupplierNo, strERP_Asset, strERP_ModelNo, strERP_CreateDate, strERP_Description, strERP_ERPNo; string strERP_AccessoryType = "ACC"; string strERP_AccessoryCategory = "ACCCAT"; // 預設值 int intIssueState = 0; // reset strIfWhereCond_PK = ""; strMES_Result = "9"; // 預設值 9 (MES處理結果, 成功回寫1, 失敗回寫9). strMES_MESSAGE = ""; // 錯誤訊息 aryMES_Message.Clear(); colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); do { try { bool exitTry = false; for (int intRow = 0, loopTo = objResponse.details.Count - 1; intRow <= loopTo; intRow++) { // ----------------------------------------------------------- // 取出各欄位資料 // ----------------------------------------------------------- strERP_AccessoryNo = objResponse.details[intRow].mold_fixture_no.Trim().ToUpper(); // 2017-05-04, Joe, ERP沒傳供應商給N/A strERP_SupplierNo = objResponse.details[intRow].supplier_no.Trim().ToUpper(); if (string.IsNullOrEmpty(strERP_SupplierNo)) strERP_SupplierNo = "N/A"; strERP_Description = objResponse.details[intRow].remark.Trim().ToUpper(); strERP_Asset = objResponse.details[intRow].belongings_no.Trim().ToUpper(); strERP_Status = objResponse.details[intRow].tran_status.Trim().ToUpper(); strERP_Description = objResponse.description; strERP_ERPNo = objResponse.details[intRow].mold_fixture_no; strERP_ModelNo = ""; if (!string.IsNullOrWhiteSpace(objResponse.details[intRow].model_no)) { strERP_ModelNo = objResponse.details[intRow].model_no.Trim().ToUpper(); } // ----------------------------------------------------------- // 固定檢查AccessoryCategory資料,若不存在則自動新增。 // ----------------------------------------------------------- if (aryAccessoryCategory.IndexOf(strERP_AccessoryCategory) == -1) { if (AddAccessoryCategory(ref cnnMES, ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_AccessoryCategory, strERPCreator, DateTime.Now, "AutoRun建立") < 0) { exitTry = true; break; } else { aryAccessoryCategory.Add(strERP_AccessoryCategory); } } // ----------------------------------------------------------- // 固定檢查AccessoryType資料,若不存在則自動新增。 // ----------------------------------------------------------- if (aryAccessoryType.IndexOf(strERP_AccessoryType) == -1) { if (AddAccessoryType(ref cnnMES, ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_AccessoryType, strERPCreator, DateTime.Now, "AutoRun建立") < 0) { exitTry = true; break; } else { aryAccessoryType.Add(strERP_AccessoryType); } } // ----------------------------------------------------------- // 固定檢查Vendor資料,若不存在則自動新增。 // ----------------------------------------------------------- if (strERP_SupplierNo != "N/A" && aryVendorNo.IndexOf(strERP_SupplierNo) == -1) { if (AddVendorNo(ref cnnMES, ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_SupplierNo, strERPCreator, DateTime.Now, "AutoRun建立") < 0) { exitTry = true; break; } else { aryVendorNo.Add(strERP_SupplierNo); } } // 檢查是否有此模治具設定 strSQL = "Select AccessoryNo From tblEQPAccessoryBasis " + " Where AccessoryNo='" + strERP_AccessoryNo + "'"; //cmmTemp = new IDbCommand(strSQL, cnnMES); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); switch (strERP_Status ?? "") { case "AU": // 有資料修改沒資料新增 { if (!drTemp.Read()) { intIssueState = 0; // ----------------------------------------------------------- // 新增MES模治具設定 // ----------------------------------------------------------- strSQL = "Insert Into tblEQPAccessoryBasis " + "(AccessoryNo,AccessoryType,AccessoryCategory,VendorNo,ModelNo," + " Description,Creator,CreateDate, " + "IssueState,AssetNo, " + " AccessoryVersion,CurVersion,ERPNo)"; strSQL += " Values('" + strERP_AccessoryNo + "','" + strERP_AccessoryType + "','" + strERP_AccessoryCategory + "','" + strERP_SupplierNo + "', '" + strERP_ModelNo + "', " + "'AutoRun建立' ,'" + strERPCreator + "',To_Date('" + Strings.Format(DateTime.Now, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'), " + " '" + intIssueState + "','" + strERP_Asset + "','01','0','" + strERP_ERPNo + "')"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } else { // ----------------------------------------------------------- // 修改MES模治具設定() // ----------------------------------------------------------- // MES已存在之資料IssueState如果是-1,ERP資料再次拋轉時,IssueState則更新為"0". // 2017-06-02, Joe, 修改時如原狀態為-1變更為0,其他不異動 if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], -1, false))) { intIssueState = 0; } else { intIssueState = Conversions.ToInteger(drTemp["IssueState"]); } strSQL = "Update tblEQPAccessoryBasis Set " + " IssueState = " + intIssueState + " ,ERPNo = '" + strERP_ERPNo + "'" + " Where AccessoryNo='" + strERP_AccessoryNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } drTemp.Close(); //cmmTemp.Dispose(); break; } case "D": // D:刪除 { if (drTemp.Read()) { if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], 0, false))) { // 刪除MES模治具設定 strSQL = "Delete tblEQPAccessoryBasis " + " Where AccessoryNo='" + strERP_AccessoryNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); } else { // 作廢MES模治具設定 strSQL = "Update tblEQPAccessoryBasis Set " + " IssueState = -1" + " Where AccessoryNo='" + strERP_AccessoryNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); } } else { strSQL = "Delete tblEQPAccessoryBasis " + " Where AccessoryNo='" + strERP_AccessoryNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); } drTemp.Close(); break; } default: { aryMES_Message.Add(TranslateMsg("[%opgroupno%](Accessory_No): " + strERP_AccessoryNo + ",ERP [%Status%] : " + strERP_Status + " [%INVALID%], [%IS NOT ALLOWED TO EXECUTE%]!", strLanguageMode, strResourceDir)); break; } } } if (exitTry) { break; } } catch (Exception ex) { strMES_Result = "9"; aryMES_Message.Add("Exception" + '\n' + ex.Message); } finally { // =============================================================================== // 判定 MES_Result 處理結果 (成功回寫1, 失敗回寫9). // =============================================================================== if (aryMES_Message.Count == 0) { strMES_Result = "1"; // -------------------------------------------------- // MES資料庫異動 // -------------------------------------------------- if (colSQL_2MES.Count > 0) { ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colSQL_2MES, colSQL_2MES_Rows); } } // 組合執行錯誤字串: Chr(10)分隔 strMES_MESSAGE = ArrayList2String(ref aryMES_Message); // MES_Message長度4000限制, 截取0-3996碼加"...". if (strMES_MESSAGE.Length > 4000) strMES_MESSAGE = strMES_MESSAGE.Substring(0, 3996) + "..."; // ---取消前面收集SQL--- colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); // 當該筆交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 if (aryMES_Message.Count > 0) { foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); } } } while (false); // //return 0 : Success WriteAccessoryBasisRet = 0; } catch (Exception ex) { aryMES_Message.Add(ex.Message); // 當該筆中介交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); throw; } finally { // If Not drTemp Is Nothing Then drTemp.Close() CloseConnection(cnnMES); } return WriteAccessoryBasisRet; } private int AddOPGroup(ref IDbConnection cnnTemp, ref Collection colSQL, ref Collection colSQL_Rows, ref ArrayList aryErrorMessage, string strWorkStationNo, string strCreator, DateTime datCreateDate, string strDescription = "") { int AddOPGroupRet = default(int); AddOPGroupRet = -1; // Return -1:fail,0:Success var drTemp = default(DbDataReader); string strSQL; string strERP_WorkStationNo; try { strERP_WorkStationNo = strWorkStationNo.ToUpper(); strSQL = "Select OPGroupNo From tblOPGroupBasis " + " Where OPGroupNo Is Not Null And OPGroupNo='" + strERP_WorkStationNo + "'"; //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (!drTemp.Read()) { // 新增OPGroupBasis主檔 strSQL = "Insert Into tblOPGroupBasis " + "(OPGroupNo,OPGroupName,Description,Creator,ERPNo,CreateDate)"; strSQL += " Values('" + strERP_WorkStationNo + "','N/A', 'AutoRun建立' ,'" + strERPCreator + "','" + strWorkStationNo + "'," + "To_Date('" + Strings.Format(datCreateDate, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'))"; colSQL.Add(strSQL); colSQL_Rows.Add(1); } drTemp.Close(); //cmmTemp.Dispose(); // Return AddOPGroupRet = 0; } catch (Exception ex) { aryErrorMessage.Add(ex.Message.ToString()); throw; } finally { if (drTemp != null) drTemp.Dispose(); } return AddOPGroupRet; } private int addEquipment(ref IDbConnection cnnTemp, ref Collection colSQL, ref Collection colSQL_Rows, ref ArrayList aryErrorMessage, string strEquipmentNo, string strCreator, DateTime dateCreateDate, string strDescription = "") { int addEquipmentRet = default(int); addEquipmentRet = -1; // Return -1:fail,0:Success var drTemp = default(DbDataReader); string strSQL; var strERP_EquipmentNo = default(string); int intIssueState = 0; try { strERP_EquipmentNo = strERP_EquipmentNo.ToUpper(); strSQL = "Select EquipmentNo From tblEQPEquipmentBasis " + " Where EquipmentNo Is Not Null And EquipmentNo='" + strERP_EquipmentNo + "'"; //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (!drTemp.Read()) { // 新增Equipment主檔 strSQL = "Insert Into tblEQPEquipmentBasis " + "(EquipmentNo,EquipmentName,EquipmentType,Capacity,EquipmentClass,VendorNo," + "Description,EngineerGroupNo,AssetNo,LoadPort," + "AutoFlag,Eacontroller,EQPRecipe," + "IssueState,Creator,CreateDate)"; strSQL += " Values('" + strERP_EquipmentNo + "','N/A','N/A',-1,'GENERAL','N/A','AutoRun建立','N/A','',-1," + "1,'N/A',0," + intIssueState + ",'" + strERPCreator + "'," + "To_Date('" + Strings.Format(dateCreateDate, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'))"; colSQL.Add(strSQL); colSQL_Rows.Add(1); } drTemp.Close(); //cmmTemp.Dispose(); // Return addEquipmentRet = 0; } catch (Exception ex) { aryErrorMessage.Add(ex.Message.ToString()); throw; } finally { if (drTemp != null) drTemp.Dispose(); } return addEquipmentRet; } private int AddFactoryNo(ref IDbConnection cnnTemp, ref Collection colSQL, ref Collection colSQL_Rows, ref ArrayList aryErrorMessage, string strFactoryNo, string strCreator, DateTime datCreateDate, string strDescription = "") { int AddFactoryNoRet = default(int); AddFactoryNoRet = -1; // Return -1:fail,0:Success var drTemp = default(DbDataReader); string strSQL; string strERP_FactoryNo; do { try { strERP_FactoryNo = strFactoryNo.ToUpper(); // 檢查是否有此工廠編號 strSQL = "Select * From tblSMDFactoryBasis Where FactoryNo Is Not Null " + " And FactoryNo = '" + strERP_FactoryNo + "'"; //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (string.IsNullOrEmpty(strERP_FactoryNo)) { aryErrorMessage.Add(TranslateMsg("ERP[%FactoryNo%](factory_no):" + strERP_FactoryNo + " [%Is Empty%]!", strLanguageMode, strResourceDir)); break; } else { if (!drTemp.Read()) { // 新增SMDFactoryBasis主檔 strSQL = "Insert Into tblSMDFactoryBasis " + "(FactoryNo,Description,FabCode,IssueState,Creator,CreateDate)"; strSQL += " Values('" + strERP_FactoryNo + "','','',2,'" + strERPCreator + "'," + "To_Date('" + Strings.Format(datCreateDate, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'))"; colSQL.Add(strSQL); colSQL_Rows.Add(1); } drTemp.Close(); //cmmTemp.Dispose(); } // Return AddFactoryNoRet = 0; } catch (Exception ex) { aryErrorMessage.Add(ex.Message.ToString()); throw; } finally { if (drTemp != null) drTemp.Dispose(); } } while (false); return AddFactoryNoRet; } private int AddDepartmentNo(ref IDbConnection cnnTemp, ref Collection colSQL, ref Collection colSQL_Rows, ref ArrayList aryErrorMessage, string strDepartmentNo, string strCreator, DateTime datCreateDate, string strDescription = "") { int AddDepartmentNoRet = default(int); AddDepartmentNoRet = -1; // Return -1:fail,0:Success var drTemp = default(DbDataReader); string strSQL; string strERP_DepartmentNo; try { strERP_DepartmentNo = strDepartmentNo.ToUpper(); // 檢查部門編號是否存在 strSQL = "Select DepartmentNo From tblUSRDepartmentBasis " + " Where DepartmentNo='" + strERP_DepartmentNo + "'"; //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (!drTemp.Read()) { // 無此部門編號 執行新增 strSQL = "Insert Into tblUSRDepartmentBasis " + "(DepartmentNo,DepartmentName,DepartmentSName," + "IssueState,ERPNO,Creator,CreateDate)"; strSQL += " Values('" + strERP_DepartmentNo + "','" + strERP_DepartmentNo + "','N/A',2,'" + strDepartmentNo + "','" + strERPCreator + "'," + "To_Date('" + Strings.Format(datCreateDate, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'))"; colSQL.Add(strSQL); colSQL_Rows.Add(1); } drTemp.Close(); //cmmTemp.Dispose(); // Return AddDepartmentNoRet = 0; } catch (Exception ex) { aryErrorMessage.Add(ex.Message.ToString()); throw; } finally { if (drTemp != null) drTemp.Dispose(); } return AddDepartmentNoRet; } private int AddUnitNo(ref IDbConnection cnnTemp, ref Collection colSQL, ref Collection colSQL_Rows, ref ArrayList aryErrorMessage, string strUnitNo, string strCreator, DateTime dateCreateDate, string strDescription = "") { int AddUnitNoRet = default(int); AddUnitNoRet = -1; // Return -1:fail,0:Success var drTemp = default(DbDataReader); string strSQL; string strERP_UnitNo; try { strERP_UnitNo = strUnitNo.ToLower(); // 檢查單位設定是否存在 strSQL = "Select UnitType From tblSYSUnitBasis " + " Where UnitNo='" + strERP_UnitNo + "'"; //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (!drTemp.Read()) { // 無此單位編號 執行新增 // 2017-09-01, Joe, 將ERP原始UnitNo記錄到單位主檔中 strSQL = "Insert Into tblSysUnitBasis " + "(UnitNo, UnitType, SystemUnit, TransferRate, IssueState, Description, Creator, CreateDate,ERPNo) " + " Values('" + strERP_UnitNo + "','" + strERP_UnitNo + "','" + strERP_UnitNo + "',1,0,'AutoRun建立','" + strCreator + "', To_Date('" + Strings.Format(dateCreateDate, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')" + ",'" + strUnitNo + "')"; colSQL.Add(strSQL); colSQL_Rows.Add(1); } drTemp.Close(); //cmmTemp.Dispose(); // Return AddUnitNoRet = 0; } catch (Exception ex) { aryErrorMessage.Add(ex.Message.ToString()); throw; } finally { if (drTemp != null) drTemp.Dispose(); } return AddUnitNoRet; } private int AddVendorNo(ref IDbConnection cnnTemp, ref Collection colSQL, ref Collection colSQL_Rows, ref ArrayList aryErrorMessage, string strVendorNo, string strCreator, DateTime datCreateDate, string strDescription = "") { int AddVendorNoRet = default(int); AddVendorNoRet = -1; // Return -1:fail,0:Success var drTemp = default(DbDataReader); string strSQL; try { // 檢查部門編號是否存在 strSQL = "Select VendorNo From tblEQPVendor " + " Where VendorNo='" + strVendorNo + "'"; //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (!drTemp.Read()) { // 無此供應商編號 執行新增 strSQL = "Insert Into tblEQPVendor " + "(VendorNo,VendorName,Description," + "IssueState,ERPNO,Creator,CreateDate)"; strSQL += " Values('" + strVendorNo.ToUpper() + "','N/A','AutoRun建立',0,'" + strVendorNo + "','" + strERPCreator + "'," + "To_Date('" + Strings.Format(datCreateDate, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'))"; colSQL.Add(strSQL); colSQL_Rows.Add(1); } drTemp.Close(); //cmmTemp.Dispose(); // Return AddVendorNoRet = 0; } catch (Exception ex) { aryErrorMessage.Add(ex.Message.ToString()); throw; } finally { if (drTemp != null) drTemp.Dispose(); } return AddVendorNoRet; } private int AddAccessoryCategory(ref IDbConnection cnnTemp, ref Collection colSQL, ref Collection colSQL_Rows, ref ArrayList aryErrorMessage, string strAccessoryCategory, string strCreator, DateTime datCreateDate, string strDescription = "") { int AddAccessoryCategoryRet = default(int); AddAccessoryCategoryRet = -1; // Return -1:fail,0:Success var drTemp = default(DbDataReader); string strSQL; try { // 檢查部門編號是否存在 strSQL = "Select AccessoryCategory From tblEQPAccessoryCategory " + " Where AccessoryCategory='" + strAccessoryCategory + "'"; //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (!drTemp.Read()) { // 無此模治具類種類 執行新增 strSQL = "Insert Into tblEQPAccessoryCategory " + "(AccessoryCategory,Description," + "IssueState,Creator,CreateDate)"; strSQL += " Values('" + strAccessoryCategory.ToUpper() + "','AutoRun建立',0,'" + strERPCreator + "'," + "To_Date('" + Strings.Format(datCreateDate, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'))"; colSQL.Add(strSQL); colSQL_Rows.Add(1); } drTemp.Close(); //cmmTemp.Dispose(); // Return AddAccessoryCategoryRet = 0; } catch (Exception ex) { aryErrorMessage.Add(ex.Message.ToString()); throw; } finally { if (drTemp != null) drTemp.Dispose(); } return AddAccessoryCategoryRet; } private int AddAccessoryType(ref IDbConnection cnnTemp, ref Collection colSQL, ref Collection colSQL_Rows, ref ArrayList aryErrorMessage, string strAccessoryType, string strCreator, DateTime datCreateDate, string strDescription = "") { int AddAccessoryTypeRet = default(int); AddAccessoryTypeRet = -1; // Return -1:fail,0:Success var drTemp = default(DbDataReader); string strSQL; try { // 檢查模治具類別是否存在 strSQL = "Select AccessoryType From tblEQPAccessoryType " + " Where AccessoryType='" + strAccessoryType + "'"; //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (!drTemp.Read()) { // 無此模治具類別 執行新增 strSQL = "Insert Into tblEQPAccessoryType " + "(AccessoryType,Description," + "IssueState,Creator,CreateDate)"; strSQL += " Values('" + strAccessoryType.ToUpper() + "','AutoRun建立',0,'" + strERPCreator + "'," + "To_Date('" + Strings.Format(datCreateDate, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'))"; colSQL.Add(strSQL); colSQL_Rows.Add(1); } drTemp.Close(); //cmmTemp.Dispose(); // Return AddAccessoryTypeRet = 0; } catch (Exception ex) { aryErrorMessage.Add(ex.Message.ToString()); throw; } finally { if (drTemp != null) drTemp.Dispose(); } return AddAccessoryTypeRet; } // ======================================================================================================================== // 程式名稱:DateTimeConversion // 傳入參數:時分/時分秒 // 傳回參數:時分/時分秒 // 用 途:Ex: 24:00:00 => 23:59:59 // Ex: 24:00 => 23:59 // Ex: 00:01 => 00:00 // Ex: 00:00:01 => 00:00:00 // 撰寫人員:06475 lijyun // 撰寫日期:2017/03/22 // ======================================================================================================================== private string DateTimeConversion(string strDateTime) { string DateTimeConversionRet = default(string); string strDateTimeTemp; strDateTimeTemp = strDateTime; try { if (strDateTime.Length == 8) // hhmmss { if (Strings.Left(strDateTime, 2) == "24") { strDateTimeTemp = "23:59:59"; // ElseIf strDateTime = "00:00:01" Then // strDateTimeTemp = "00:00:00" } } else if (strDateTime.Length == 5) // hhmm { if (Strings.Left(strDateTime, 2) == "24") { strDateTimeTemp = "23:59"; // ElseIf strDateTime = "00:01" Then // strDateTimeTemp = "00:00" } } DateTimeConversionRet = strDateTimeTemp; } catch (Exception ex) { throw; } finally { } return DateTimeConversionRet; } // ======================================================================================================================== // 程式名稱:WriteUserBasis // 傳入參數:objResponse(response CDO物件)、aryReturnMessage(回傳訊息參考) // 傳回參數:-1:fail,0:Success // 用 途:寫入使用者主檔 // 撰寫人員:KunYuan // 撰寫日期:2017/06/01 // ======================================================================================================================== private int WriteUserBasis(iMESCIO.SCI.ERP.Response.SCI_Response_user_get objResponse, ref ArrayList aryReturnMessage) { int WriteUserBasisRet = default(int); WriteUserBasisRet = -1; // Return -1:fail,0:Success // =========================================================== // 宣告 DB相關 變數 // =========================================================== DbDataReader drTemp; IDbConnection cnnMES = null; Collection colSQL = new Collection(), colSQL_Rows = new Collection(); // MES正式異動資料(主要). string strSQL; string strERPCreator = "ERP"; // 每筆中介交易記錄 string strMES_Result; string strMES_MESSAGE; // 錯誤訊息(中介表.MES_MESSAGE),Chr(10)分隔錯誤項目。 var aryMES_Message = new ArrayList(); // 收集單筆中介交易記錄的錯誤記錄, Exception及MES判定錯誤訊息。 try { cnnMES = CreateConnection(strConnectionString); // 宣告拋轉資料使用變數 string strERP_EmployeeNo, strERP_EmployeeName, strERP_DepartNo, strERP_Email, strERP_Remark, strERP_Status, strPassword, strErpNo; // 預設值 int intIssueState = 0; string strUserLevel = "2"; // 使用者等級預設『End User』 // reset strMES_Result = "9"; // 預設值 9 (MES處理結果, 成功回寫1, 失敗回寫9). strMES_MESSAGE = ""; // 錯誤訊息 aryMES_Message.Clear(); colSQL.Clear(); colSQL_Rows.Clear(); try { for (int intRow = 0, loopTo = objResponse.user_get.Count - 1; intRow <= loopTo; intRow++) { // ----------------------------------------------------------- // 取出各欄位資料 // ----------------------------------------------------------- strERP_EmployeeNo = objResponse.user_get[intRow].employee_no.Trim().ToUpper(); strERP_EmployeeName = objResponse.user_get[intRow].employee_name.Trim(); strERP_Status = objResponse.user_get[intRow].tran_status.Trim(); strErpNo = objResponse.user_get[intRow].employee_no.Trim(); if (!string.IsNullOrWhiteSpace(objResponse.user_get[intRow].department_no)) { strERP_DepartNo = objResponse.user_get[intRow].department_no.Trim().ToUpper(); } else { strERP_DepartNo = ""; } if (!string.IsNullOrWhiteSpace(objResponse.user_get[intRow].email)) { strERP_Email = objResponse.user_get[intRow].email.Trim(); } else { strERP_Email = ""; } if (!string.IsNullOrWhiteSpace(objResponse.user_get[intRow].remark)) { strERP_Remark = objResponse.user_get[intRow].remark.Trim(); } else { strERP_Remark = ""; } // 密碼:預設同使用者編號 strPassword = Strings.StrReverse(Convert.ToBase64String(Encoding.ASCII.GetBytes(Strings.StrReverse(modWIN.PasswordEncoding(ref strERP_EmployeeNo))))); // 檢查是否有此使用者 strSQL = "Select UserNo, IssueState From tblUSRUserBasis Where UserNo='" + strERP_EmployeeNo + "'"; //cmmTemp = new IDbCommand(strSQL, cnnMES); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); switch (strERP_Status ?? "") { case "AU": // 有資料修改沒資料新增 { if (!drTemp.Read()) { intIssueState = 0; strSQL = "INSERT INTO TBLUSRUSERBASIS (USERNO, USERNAME, USERLEVEL, PASSWORD, CREATOR," + "CREATEDATE, DESCRIPTION, ISSUESTATE, USERTYPE, DEPARTMENTNO," + "EMAILADDRESS, CHANGEDATE, RESETPASSWORD, ERPNO) "; strSQL += " Values ('" + strERP_EmployeeNo + "','" + strERP_EmployeeName + "','" + strUserLevel + "','" + strPassword + "','" + strERPCreator + "'," + "To_Date('" + Strings.Format(DateTime.Now, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),'" + strERP_Remark + "'," + intIssueState + ",0, '" + strERP_DepartNo + "'," + "'" + strERP_Email + "', To_Date('" + Strings.Format(DateTime.Now, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),0, '" + strErpNo + "')"; colSQL.Add(strSQL); colSQL_Rows.Add(1); } else { // 2017-06-02, Joe, 修改時如原狀態為-1變更為0,其他不異動 if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], -1, false))) { intIssueState = 0; } else { intIssueState = Conversions.ToInteger(drTemp["IssueState"]); } strSQL = "UPDATE TBLUSRUSERBASIS SET ISSUESTATE = " + intIssueState + " ,USERNAME = '" + strERP_EmployeeName + "' , DESCRIPTION = '" + strERP_Remark + "'" + ", DEPARTMENTNO = '" + strERP_DepartNo + "', EMAILADDRESS = '" + strERP_Email + "', ERPNo='" + strErpNo + "' WHERE USERNO ='" + strERP_EmployeeNo + "'"; colSQL.Add(strSQL); colSQL_Rows.Add(1); } drTemp.Close(); //cmmTemp.Dispose(); break; } case "D": // D:刪除 { if (drTemp.Read()) { if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], 0, false))) { // 刪除MES作業站設定 strSQL = "Delete tblUSRUserBasis Where UserNo='" + strERP_EmployeeNo + "'"; colSQL.Add(strSQL); colSQL_Rows.Add(-1); } else { // 作廢MES作業站設定 strSQL = "Update tblOPBasis Set IssueState=-1 Where UserNo='" + strERP_EmployeeNo + "'"; colSQL.Add(strSQL); colSQL_Rows.Add(-1); } } else { // 刪除有可能會在資料庫中取不到資料,因為同一個交易還沒有commit strSQL = "Delete tblUSRUserBasis Where UserNo='" + strERP_EmployeeNo + "'"; colSQL.Add(strSQL); colSQL_Rows.Add(-1); } drTemp.Close(); break; } default: { aryMES_Message.Add(TranslateMsg("[%USERNO%](employee_no): " + strERP_EmployeeNo + ",ERP [%Status%] : " + strERP_Status + " [%INVALID%], [%IS NOT ALLOWED TO EXECUTE%]!", strLanguageMode, strResourceDir)); break; } } } } catch (Exception ex) { strMES_Result = "9"; aryMES_Message.Add("Exception" + '\n' + ex.Message); } finally { // =============================================================================== // 判定 MES_Result 處理結果 (成功回寫1, 失敗回寫9). // =============================================================================== if (aryMES_Message.Count == 0) { strMES_Result = "1"; // -------------------------------------------------- // MES資料庫異動 // -------------------------------------------------- if (colSQL.Count > 0) { ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colSQL, colSQL_Rows); } } // 組合執行錯誤字串: Chr(10)分隔 strMES_MESSAGE = ArrayList2String(ref aryMES_Message); // MES_Message長度4000限制, 截取0-3996碼加"...". if (strMES_MESSAGE.Length > 4000) strMES_MESSAGE = strMES_MESSAGE.Substring(0, 3996) + "..."; // ---取消前面收集SQL--- colSQL.Clear(); colSQL_Rows.Clear(); // 當該筆交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 if (aryMES_Message.Count > 0) { foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); } } // //return 0 : Success WriteUserBasisRet = 0; } catch (Exception ex) { aryMES_Message.Add(ex.Message); // 當該筆中介交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); throw; } finally { CloseConnection(cnnMES); } return WriteUserBasisRet; } #endregion #region ---E10ICD iMES與E10整合--- private object funMESCallERPCustomerBasis_E10ICD(Collection colParameters = null) { object funMESCallERPCustomerBasis_E10ICDRet = default(object); var XmlDoc = new XmlDocument(); var drTemp = default(DbDataReader); //var daTemp = default(System.Data.OleDb.OleDbDataAdapter); var CollectionSQL = new Collection(); string strSQL; string strServiceName = "customer.get"; string strGroupNo = ""; // 使用者群組 string strPageSize = "500"; // 分包筆數 string strDate = string.Empty; // 日期迄(如無指定則帶今天) var arriveTime = DateTime.Now; string strCustomerNo, strERP_CustomerNo, strERP_status; string strSubject, strBody; // 寄送通知資訊 // AutorunJob拋轉資訊 string strReturnMessage = ""; // 錯誤訊息(tblMESAutoRunLog.ReturnMessage),Chr(10)分隔錯誤項目。 var aryReturnMessage = new ArrayList(); // Catch Error Message (Exception及MES判定錯誤訊息)。 var colResponseXML = new Collection(); do { try { // ParameterXX參數說明 // 01:Mail通知群組(GroupNo) // 02:分包筆數 // 03:手動重收時填上時間,如沒填則以log tableERP拋回的最後執行時間為主 // Parameter01為傳入參數,作為GroupNo,若無此值則不進行下面的程式 if (!(colParameters["Parameter01"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter01"])))) { strGroupNo = colParameters["Parameter01"].ToString().Trim(); } else { aryReturnMessage.Add(TranslateMsg("Mail GroupNo [%NOT SET%]([%PARAMETER01%])!", strLanguageMode, strResourceDir)); // ===== 2021/05/18 Elvis 92880 break; } // 分包筆數必須為數值型態,Add by KevinChang if (Information.IsNumeric(colParameters["Parameter02"])) { if (!(colParameters["Parameter02"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter02"])))) { // 每封包筆數不可小於500筆,Add by KevinChang if (Conversions.ToInteger(colParameters["Parameter02"]) < 500) { strPageSize = "500"; } else { strPageSize = colParameters["Parameter02"].ToString().Trim(); } } } // Parameter03為傳入參數,作為手動重收時填上時間,若無此值則以log tableERP拋回的最後執行時間為主 if (!(colParameters["Parameter03"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter03"])))) { strDate = GetDate(Conversions.ToString(colParameters["Parameter03"]), "Parameter03"); } else { // 20170316 edit liyujn strDate = GetERPTransactionDate(strServiceName); } // 取得erp資訊 if (!GetERPSetting(ref dtERPSetting, pEAIType: 1)) { aryReturnMessage.Add("Can not found ERP ERP Setting Info (ERP_TYPE = 1)!"); break; } var objResponse = new iMESCIO.SCI.ERP.Response_E10ICD.SCI_Response_customer_get(); XmlNode xmlNodeCnt; string strCnt; string strTTcnt; bool chkStatus = true; // 抓取其它status為0之資料且塞入colResponseXML GetReTransData(strServiceName, ref colResponseXML); // 判斷『當前回傳筆數』=『應回傳筆數』時才代表為最後一次請求,執行後才進行後續動作 var objRequest = new iMESCIO.SCI.ERP.Request_E10ICD.SCI_Request_customer_get(); objRequest.page_size = strPageSize; objRequest.data_time = strDate; objRequest.key_condition = ""; // ---- InXml ----- object argSCI_Object = objRequest; string argpRequestKey = "Null"; InXml = CombineRequestXMLbyCDO(ref argSCI_Object, dtERPSetting.Rows[0]["ERP_Name"].ToString(), "", strServiceName, pRequestKey: argpRequestKey); objRequest = (iMESCIO.SCI.ERP.Request_E10ICD.SCI_Request_customer_get)argSCI_Object; int intloopTimes = 0; do { // 迴圈執行超過5次直接跳出迴圈並回傳錯誤訊息 if (intloopTimes >= 5) { throw new Exception("[%THE NUMBER OF SUBCONTRACTS IS SET TOO LITTLE TO CAUSE THE LOOP TO EXECUTE MORE THAN FIVE TIMES%]"); break; } OutXml = string.Empty; OutXml = LoadXmlFileForTest("customer.get"); try { if (string.IsNullOrEmpty(OutXml)) { // ----- Call ERP Web Service ----- using (var ws = new iMESCore.Base.Invoke.wsERP_EAI.IntegrationEntry()) { ws.Url = ERP_URL; OutXml = ws.invokeSrv(InXml); } // 2017-05-03, Joe, 轉換單引號 OutXml = OutXml.Replace("'", "''"); OutXml = OutXml.Replace("'", "''"); } } catch (Exception ex) { OutXml = ex.Message; throw ex; } finally { // 需等到取得所有資料後,再處理後面之動作,故統一將請求完之ResponseXML放入容器內 colResponseXML.Add(OutXml); } XmlDoc.LoadXml(OutXml); // ----- 執行ERP交易完畢紀錄TransactionLog ----- string argstrException = null; modAutoRunLibrary.addTransactionLog(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPCustomerBasis_E10ICD", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), "success", "ERP", strServiceName, strException: argstrException); // 將ERP拋回的資料轉成物件 objResponse.ParseXmlToObject(OutXml); if (objResponse.srvcode == null == false && objResponse.srvcode.Equals("000") && objResponse.code == null == false && objResponse.code.Equals("0")) { objRequest = new iMESCIO.SCI.ERP.Request_E10ICD.SCI_Request_customer_get(); objRequest.data_time = objResponse.data_time; // 第二次後請求需為回傳之最後拋轉時間 objRequest.key_condition = Strings.Replace(objResponse.key_condition, "''", "'"); // 第二次後待入從ERP收到之keyCondition objRequest.page_size = strPageSize; object argSCI_Object1 = objRequest; string argpRequestKey1 = "Null"; InXml = CombineRequestXMLbyCDO(ref argSCI_Object1, dtERPSetting.Rows[0]["ERP_Name"].ToString(), "", strServiceName, pRequestKey: argpRequestKey1); objRequest = (iMESCIO.SCI.ERP.Request_E10ICD.SCI_Request_customer_get)argSCI_Object1; xmlNodeCnt = XmlDoc.SelectSingleNode("/response/payload/param/data_response/datainfo/parameter/data"); strCnt = xmlNodeCnt.Attributes.GetNamedItem("cnt").Value; strTTcnt = xmlNodeCnt.Attributes.GetNamedItem("tt_cnt").Value; } else { chkStatus = false; aryReturnMessage.Add(OutXml); // 2017-06-26, Joe, 如是中台層的錯誤要往外拋 break; } intloopTimes += 1; } while ((strCnt ?? "") != (strTTcnt ?? "")); // 寫入log table TreatWriteLogTable(colResponseXML, strServiceName); // 寫入MES DB if (chkStatus) { foreach (string strOutXML in colResponseXML) { objResponse.ParseXmlToObject(strOutXML); if (WriteToMESCustomerBasis_E10ICD(objResponse, ref aryReturnMessage) < 0) { if (aryReturnMessage.Count == 0) // 避免不明原因,執行FAIL又沒收集到項目. { aryReturnMessage.Add(strServiceName + ", 客戶主檔拋轉執行失敗!!"); } } } } } catch (Exception EX_AUT) { aryReturnMessage.Add("EX_AUT.Exception" + '\n' + EX_AUT.Message.ToString()); OutXml = EX_AUT.Message.ToString(); results = "fail"; // 執行ERP交易完畢寫入Log string argstrException = null; modAutoRunLibrary.addTransactionLog_ErrorCode(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPCustomerBasis_E10ICD", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), results, "ERP", strServiceName, LogClass: "AutoRun", strException: argstrException); } finally { // -------------------------------------------------- // 回傳執行結果:succces 或 fail(ReturnMessage) // -------------------------------------------------- if (aryReturnMessage.Count == 0) { funMESCallERPCustomerBasis_E10ICDRet = "success"; results = "success"; } else { // 組合執行錯誤字串: Chr(10)分隔 strReturnMessage = ArrayList2String(ref aryReturnMessage); if ((strReturnMessage ?? "") == defString) { // 當錯誤字串組合失敗。補上 strReturnMessage = "ReturnMessage收集失敗!!"; } // tblMESAutoRunLog.ReturnMessage 長度4000限制. string strTemp = ""; if (strReturnMessage.Length > 4000) { // 自 strReturnMessage 中截取0-3991碼. strTemp = strReturnMessage.Substring(0, 3991) + "..."; } else { strTemp = strReturnMessage; } // 更新log table異常資訊 // Dim nodeID As XmlNode = XmlDoc.SelectSingleNode("/response/reqid") UpdateLogTableErrorInfo(colResponseXML, strServiceName, strTemp); // //fail; funMESCallERPCustomerBasis_E10ICDRet = "fail;" + strTemp; } // ===manties:0095454 AutoRun addTransactionLog位置錯誤 需移至Finally 2021/07/06 // 執行ERP交易完畢寫入Log string argstrException = null; modAutoRunLibrary.addTransactionLog(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPCustomerBasis_E10ICD", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), results, "ERP", strServiceName, strException: argstrException); // === //if (daTemp != null) // daTemp.Dispose(); if (drTemp != null) drTemp.Close(); } } while (false); // -------------------------------------------------- // 當執行失敗,寄送 Email。必須有設定參數一。 // -------------------------------------------------- IDbConnection argcnnTemp = null; try { if (aryReturnMessage.Count > 0 && Conversions.ToBoolean(Operators.ConditionalCompareObjectNotEqual(colParameters["Parameter01"], "", false))) { strSubject = "[AUT]客戶主檔-基本資料抛轉失敗! "; strBody = Strings.Replace(strReturnMessage, Conversions.ToString('\n'), "
", Compare: CompareMethod.Text); argcnnTemp = CreateConnection(strConnectionString); // 寄送 Email if (ERP2MES_MailNotice(ref argcnnTemp, ref aryReturnMessage, strSubject, strGroupNo, CInput(strBody)) < 0) { // '寄送不成功, ReturnMessage 再增加1項. // 'ProductIntegration += Chr(10) & aryReturnMessage.Item(aryReturnMessage.Count - 1).ToString // 寄送不成功, ReturnMessage 再增加1項. // tblMESAutoRunLog.ReturnMessage 長度4000限制. if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(funMESCallERPCustomerBasis_E10ICDRet.ToString().Length, 4000, false))) { string strTemp = ""; strTemp = strReturnMessage; if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(strTemp + aryReturnMessage[aryReturnMessage.Count - 1].ToString().Length, 4000, false))) { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); } else { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); // 自 strTemp 中截取0-3991碼. strTemp = strTemp.Substring(0, 3991) + "..."; } // //fail; funMESCallERPCustomerBasis_E10ICDRet = "fail;" + strTemp; } } } } catch (Exception) { throw; } finally { CloseConnection(argcnnTemp); } return funMESCallERPCustomerBasis_E10ICDRet; } private object funMESCallERPVendorBasis_E10ICD(Collection colParameters = null) { object funMESCallERPVendorBasis_E10ICDRet = default(object); var XmlDoc = new XmlDocument(); var CollectionSQL = new Collection(); // =========================================================== // 宣告 AutoRunJob設定及執行記錄 變數 // =========================================================== string strParameter01 = ""; // 參數一,預設此功能fail通知EMAIL群組。 string strPageSize = "500"; // 參數二,分包筆數 string strDate; // 參數三,手動重收時填上時間,如沒填則以log tableERP拋回的最後執行時間為主 string strSubject, strBody; // 寄送通知資訊 string strServiceName = "supplier.get"; // AutorunJob拋轉資訊 string strReturnMessage = ""; // 錯誤訊息(tblMESAutoRunLog.ReturnMessage),Chr(10)分隔錯誤項目。 var aryReturnMessage = new ArrayList(); // Catch Error Message (Exception及MES判定錯誤訊息)。 var colResponseXML = new Collection(); // ===== string strException = ""; // Exception XML字串 string strMessage = ""; // Message XML字串 var arrException = new List(); // Exception XML字串 var arrMessage = new List(); // Message XML字串 // ===== do { try { // Parameter01為參數一 // 作為Mail通知群組(GroupNo),放在最前面防止連線失敗無法寄送通知。 if (!(colParameters["Parameter01"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter01"])))) { strParameter01 = colParameters["Parameter01"].ToString().Trim(); } else { aryReturnMessage.Add(TranslateMsg("Mail GroupNo [%NOT SET%]([%PARAMETER01%])!", strLanguageMode, strResourceDir)); // ===== 2021/05/18 Elvis 92880 break; } // 分包筆數必須為數值型態,Add by KevinChang if (Information.IsNumeric(colParameters["Parameter02"])) { if (!(colParameters["Parameter02"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter02"])))) { // 每封包筆數不可小於500筆,Add by KevinChang if (Conversions.ToInteger(colParameters["Parameter02"]) < 500) { strPageSize = "500"; } else { strPageSize = colParameters["Parameter02"].ToString().Trim(); } } } if (!(colParameters["Parameter03"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter03"])))) { strDate = GetDate(Conversions.ToString(colParameters["Parameter03"]), "Parameter03"); } else { // 20170316 edit liyujn strDate = GetERPTransactionDate(strServiceName); } // 取得erp資訊 if (!GetERPSetting(ref dtERPSetting, pEAIType: 1)) { aryReturnMessage.Add(TranslateMsg("[%PleaseCheck%] EAI ERP Setting Info [%CONFIGSETTING%]!", strLanguageMode, strResourceDir)); break; } var objResponse = new iMESCIO.SCI.ERP.Response_E10ICD.SCI_Response_supplier_get(); // Dim colResponseXML As New Collection XmlNode xmlNodeCnt; string strCnt; string strTTcnt; bool chkStatus = true; // 抓取其它status為0之資料且塞入colResponseXML GetReTransData(strServiceName, ref colResponseXML); // 判斷『當前回傳筆數』=『應回傳筆數』時才代表為最後一次請求,執行後才進行後續動作 var objMaster = new iMESCIO.SCI.ERP.Request_E10ICD.SCI_Request_supplier_get(); objMaster.data_time = strDate; objMaster.page_size = strPageSize; objMaster.key_condition = ""; object argSCI_Object = objMaster; string argpRequestKey = "Null"; InXml = CombineRequestXMLbyCDO(ref argSCI_Object, dtERPSetting.Rows[0]["ERP_Name"].ToString(), "", strServiceName, pRequestKey: argpRequestKey); objMaster = (iMESCIO.SCI.ERP.Request_E10ICD.SCI_Request_supplier_get)argSCI_Object; int intloopTimes = 0; do { // 迴圈執行超過5次直接跳出迴圈並回傳錯誤訊息 if (intloopTimes >= 5) { throw new Exception("[%THE NUMBER OF SUBCONTRACTS IS SET TOO LITTLE TO CAUSE THE LOOP TO EXECUTE MORE THAN FIVE TIMES%]"); break; } OutXml = string.Empty; OutXml = LoadXmlFileForTest(strServiceName); try { if (string.IsNullOrEmpty(OutXml)) { // ----- Call ERP Web Service ----- using (var ws = new iMESCore.Base.Invoke.wsERP_EAI.IntegrationEntry()) { ws.Url = ERP_URL; OutXml = ws.invokeSrv(InXml); } // 2017-05-03, Joe, 轉換單引號 OutXml = OutXml.Replace("'", "''"); OutXml = OutXml.Replace("'", "''"); } } catch (Exception ex) { // OutXml = ex.Message // =====Elvis ,0091128: [605][CP+FT] E10ICD整合問題_AutoRun主檔拋轉的ERP交易紀錄exception時紀錄不正確 modAutoRunLibrary.combineException(ref arrException, sysmsg: ex.Message, mesmsg: "[%CallERPVendorFail%]", stack: ex.StackTrace); string argReturnValue = ""; string argResult = "fail"; ExceptionXML = modAutoRunLibrary.CombineXMLResponse(strIdentity, argReturnValue, arrException, argResult, arrMessage); // ===== throw ex; } finally { // 需等到取得所有資料後,再處理後面之動作,故統一將請求完之ResponseXML放入容器內 colResponseXML.Add(OutXml); } XmlDoc.LoadXml(OutXml); // 執行ERP交易完畢寫入Log string argstrException = null; modAutoRunLibrary.addTransactionLog(InXml, OutXml, DateTime.Now.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPVendorBasis_E10ICD", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), "success", "ERP", strServiceName, strException: argstrException); // 將ERP拋回的資料轉成物件 objResponse.ParseXmlToObject(OutXml); if (objResponse.srvcode == null == false && objResponse.srvcode.Equals("000") && objResponse.code == null == false && objResponse.code.Equals("0")) { objMaster = new iMESCIO.SCI.ERP.Request_E10ICD.SCI_Request_supplier_get(); objMaster.data_time = objResponse.data_time; // 第二次後請求需為回傳之最後拋轉時間 objMaster.page_size = strPageSize; objMaster.key_condition = Strings.Replace(objResponse.key_condition, "''", "'"); // 第二次後待入從ERP收到之keyCondition object argSCI_Object1 = objMaster; string argpRequestKey1 = "Null"; InXml = CombineRequestXMLbyCDO(ref argSCI_Object1, dtERPSetting.Rows[0]["ERP_Name"].ToString(), "", strServiceName, pRequestKey: argpRequestKey1); objMaster = (iMESCIO.SCI.ERP.Request_E10ICD.SCI_Request_supplier_get)argSCI_Object1; xmlNodeCnt = XmlDoc.SelectSingleNode("/response/payload/param/data_response/datainfo/parameter/data"); strCnt = xmlNodeCnt.Attributes.GetNamedItem("cnt").Value; strTTcnt = xmlNodeCnt.Attributes.GetNamedItem("tt_cnt").Value; } else { chkStatus = false; aryReturnMessage.Add(OutXml); // 2017-06-26, Joe, 如是中台層的錯誤要往外拋 break; } intloopTimes += 1; } while ((strCnt ?? "") != (strTTcnt ?? "")); // 寫入log table TreatWriteLogTable(colResponseXML, strServiceName); // 寫入MES DB if (chkStatus == true) { foreach (string strOutXML in colResponseXML) { objResponse.ParseXmlToObject(strOutXML); if (WriteVendorBasis(objResponse, ref aryReturnMessage) < 0) { if (aryReturnMessage.Count == 0) // 避免不明原因,執行FAIL又沒收集到項目. { aryReturnMessage.Add(TranslateMsg("supplier_get, [%INVOKE FAIL%]!", strLanguageMode, strResourceDir)); } } } } } catch (Exception EX_AUT) { aryReturnMessage.Add("EX_AUT.Exception" + '\n' + EX_AUT.Message.ToString()); // OutXml = EX_AUT.Message.ToString // '執行ERP交易完畢寫入Log // addTransactionLog(InXml, OutXml, DateTime.Now.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPVendorBasis_E10ICD", // My.Computer.Name, gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), "fail", "ERP", strServiceName) // =====Elvis ,0091128: [605][CP+FT] E10ICD整合問題_AutoRun主檔拋轉的ERP交易紀錄exception時紀錄不正確 modAutoRunLibrary.combineException(ref arrException, sysmsg: EX_AUT.Message.ToString(), mesmsg: "[%CallERPVendorFail%]", stack: EX_AUT.StackTrace.ToString()); string argReturnValue = ""; string argResult = "fail"; strException = modAutoRunLibrary.CombineXMLResponse(strIdentity, argReturnValue, arrException, argResult, arrMessage); // 執行ERP交易完畢寫入Log results = "fail"; modAutoRunLibrary.addTransactionLog_ErrorCode(InXml, OutXml, DateTime.Now.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPVendorBasis_E10ICD", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), results, "ERP", strServiceName, strException, LogClass: "AutoRun"); } // ===== finally { // -------------------------------------------------- // 回傳執行結果:succces 或 fail(ReturnMessage) // -------------------------------------------------- if (aryReturnMessage.Count == 0) { funMESCallERPVendorBasis_E10ICDRet = "success"; results = "success"; } else { // 組合執行錯誤字串: Chr(10)分隔 strReturnMessage = ArrayList2String(ref aryReturnMessage); if ((strReturnMessage ?? "") == defString) { // 當錯誤字串組合失敗。補上 strReturnMessage = "ReturnMessage收集失敗!!"; } // tblMESAutoRunLog.ReturnMessage 長度4000限制. string strTemp = ""; if (strReturnMessage.Length > 4000) { // 自 strReturnMessage 中截取0-3991碼. strTemp = strReturnMessage.Substring(0, 3991) + "..."; } else { strTemp = strReturnMessage; } // 更新log table異常資訊 // Dim nodeID As XmlNode = XmlDoc.SelectSingleNode("/response/reqid") UpdateLogTableErrorInfo(colResponseXML, strServiceName, strTemp); // //fail; funMESCallERPVendorBasis_E10ICDRet = CombineFailMsg("0000-999999", strTemp); } // ===manties:0095454 AutoRun addTransactionLog位置錯誤 需移至Finally 2021/07/06 // 執行ERP交易完畢寫入Log modAutoRunLibrary.addTransactionLog(InXml, OutXml, DateTime.Now.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPVendorBasis_E10ICD", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), results, "ERP", strServiceName, strException); } } // === while (false); // -------------------------------------------------- // 當執行失敗,寄送 Email。必須有設定參數一。 // -------------------------------------------------- IDbConnection argcnnTemp = null; try { if (aryReturnMessage.Count > 0 && Conversions.ToBoolean(Operators.ConditionalCompareObjectNotEqual(colParameters["Parameter01"], "", false))) { strSubject = "[AUT]料件供應商-基本資料抛轉失敗! "; strBody = Strings.Replace(strReturnMessage, Conversions.ToString('\n'), "
", Compare: CompareMethod.Text); // 寄送 Email argcnnTemp = CreateConnection(strConnectionString); if (ERP2MES_MailNotice(ref argcnnTemp, ref aryReturnMessage, strSubject, strParameter01, CInput(strBody)) < 0) { // '寄送不成功, ReturnMessage 再增加1項. // 'ProductIntegration += Chr(10) & aryReturnMessage.Item(aryReturnMessage.Count - 1).ToString // 寄送不成功, ReturnMessage 再增加1項. // tblMESAutoRunLog.ReturnMessage 長度4000限制. if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(funMESCallERPVendorBasis_E10ICDRet.ToString().Length, 4000, false))) { string strTemp = ""; strTemp = strReturnMessage; if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(strTemp + aryReturnMessage[aryReturnMessage.Count - 1].ToString().Length, 4000, false))) { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); } else { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); // 自 strTemp 中截取0-3991碼. strTemp = strTemp.Substring(0, 3991) + "..."; } // //fail; funMESCallERPVendorBasis_E10ICDRet = CombineFailMsg("0000-999999", strTemp); } } } } catch (Exception) { throw; } finally { CloseConnection(argcnnTemp); } return funMESCallERPVendorBasis_E10ICDRet; } private object funMESCallERPEquipmentBasis_E10ICD(Collection colParameters = null) { object funMESCallERPEquipmentBasis_E10ICDRet = default(object); var XmlDoc = new XmlDocument(); var CollectionSQL = new Collection(); // =========================================================== // 宣告 AutoRunJob設定及執行記錄 變數 // =========================================================== string strParameter01 = ""; // 參數一,預設此功能fail通知EMAIL群組。 string strPageSize = "500"; // 參數二,分包筆數 string strDate; // 參數三,手動重收時填上時間,如沒填則以log tableERP拋回的最後執行時間為主 string strSubject, strBody; // 寄送通知資訊 string strServiceName = "machine.get"; // AutorunJob拋轉資訊 string strReturnMessage = ""; // 錯誤訊息(tblMESAutoRunLog.ReturnMessage),Chr(10)分隔錯誤項目。 var aryReturnMessage = new ArrayList(); // Catch Error Message (Exception及MES判定錯誤訊息)。 var colResponseXML = new Collection(); do { try { // Parameter01為參數一 // 作為Mail通知群組(GroupNo),放在最前面防止連線失敗無法寄送通知。 if (!(colParameters["Parameter01"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter01"])))) { strParameter01 = colParameters["Parameter01"].ToString().Trim(); } else { aryReturnMessage.Add(TranslateMsg("Mail GroupNo [%NOT SET%]([%PARAMETER01%])!", strLanguageMode, strResourceDir)); // ===== 2021/05/18 Elvis 92880 break; } // 分包筆數必須為數值型態,Add by KevinChang if (Information.IsNumeric(colParameters["Parameter02"])) { if (!(colParameters["Parameter02"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter02"])))) { // 每封包筆數不可小於500筆,Add by KevinChang if (Conversions.ToInteger(colParameters["Parameter02"]) < 500) { strPageSize = "500"; } else { strPageSize = colParameters["Parameter02"].ToString().Trim(); } } } if (!(colParameters["Parameter03"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter03"])))) { strDate = GetDate(Conversions.ToString(colParameters["Parameter03"]), "Parameter03"); } else { // 20170316 edit liyujn strDate = GetERPTransactionDate(strServiceName); } // 取得erp資訊 if (!GetERPSetting(ref dtERPSetting, pEAIType: 1)) { aryReturnMessage.Add(TranslateMsg("[%PleaseCheck%] EAI ERP Setting Info [%CONFIGSETTING%]!", strLanguageMode, strResourceDir)); break; } var objResponse = new iMESCIO.SCI.ERP.Response_E10ICD.SCI_Response_machine_get(); // Dim colResponseXML As New Collection XmlNode xmlNodeCnt; string strCnt; string strTTcnt; bool chkStatus = true; // 抓取其它status為0之資料且塞入colResponseXML GetReTransData(strServiceName, ref colResponseXML); // 判斷『當前回傳筆數』=『應回傳筆數』時才代表為最後一次請求,執行後才進行後續動作 var objMaster = new iMESCIO.SCI.ERP.Request_E10ICD.SCI_Request_machine_get(); objMaster.data_time = strDate; objMaster.page_size = strPageSize; objMaster.key_condition = ""; object argSCI_Object = objMaster; string argpRequestKey = "Null"; InXml = CombineRequestXMLbyCDO(ref argSCI_Object, dtERPSetting.Rows[0]["ERP_Name"].ToString(), "", strServiceName, pRequestKey: argpRequestKey); objMaster = (iMESCIO.SCI.ERP.Request_E10ICD.SCI_Request_machine_get)argSCI_Object; int intloopTimes = 0; do { // 迴圈執行超過5次直接跳出迴圈並回傳錯誤訊息,Add By KevinChang if (intloopTimes >= 5) { throw new Exception("[%THE NUMBER OF SUBCONTRACTS IS SET TOO LITTLE TO CAUSE THE LOOP TO EXECUTE MORE THAN FIVE TIMES%]"); break; } OutXml = string.Empty; OutXml = LoadXmlFileForTest(strServiceName); try { if (string.IsNullOrEmpty(OutXml)) { // ----- Call ERP Web Service ----- using (var ws = new iMESCore.Base.Invoke.wsERP_EAI.IntegrationEntry()) { ws.Url = ERP_URL; OutXml = ws.invokeSrv(InXml); } // 2017-05-03, Joe, 轉換單引號 OutXml = OutXml.Replace("'", "''"); OutXml = OutXml.Replace("'", "''"); } } catch (Exception ex) { OutXml = ex.Message; throw ex; } finally { // 需等到取得所有資料後,再處理後面之動作,故統一將請求完之ResponseXML放入容器內 colResponseXML.Add(OutXml); } XmlDoc.LoadXml(OutXml); // 執行ERP交易完畢寫入Log string argstrException = null; modAutoRunLibrary.addTransactionLog(InXml, OutXml, DateTime.Now.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPEquipmentBasis_E10ICD", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), "success", "ERP", strServiceName, strException: argstrException); // 將ERP拋回的資料轉成物件 objResponse.ParseXmlToObject(OutXml); if (objResponse.srvcode == null == false && objResponse.srvcode.Equals("000") && objResponse.code == null == false && objResponse.code.Equals("0")) { objMaster = new iMESCIO.SCI.ERP.Request_E10ICD.SCI_Request_machine_get(); objMaster.data_time = objResponse.data_time; // 第二次後請求需為回傳之最後拋轉時間 objMaster.page_size = strPageSize; objMaster.key_condition = Strings.Replace(objResponse.key_condition, "''", "'"); // 第二次後代入從ERP收到之keyCondition object argSCI_Object1 = objMaster; string argpRequestKey1 = "Null"; InXml = CombineRequestXMLbyCDO(ref argSCI_Object1, dtERPSetting.Rows[0]["ERP_Name"].ToString(), "", strServiceName, pRequestKey: argpRequestKey1); objMaster = (iMESCIO.SCI.ERP.Request_E10ICD.SCI_Request_machine_get)argSCI_Object1; xmlNodeCnt = XmlDoc.SelectSingleNode("/response/payload/param/data_response/datainfo/parameter/data"); strCnt = xmlNodeCnt.Attributes.GetNamedItem("cnt").Value; strTTcnt = xmlNodeCnt.Attributes.GetNamedItem("tt_cnt").Value; } else { chkStatus = false; aryReturnMessage.Add(OutXml); // 2017-06-26, Joe, 如是中台層的錯誤要往外拋 break; } intloopTimes += 1; } while ((strCnt ?? "") != (strTTcnt ?? "")); // 寫入log table TreatWriteLogTable(colResponseXML, strServiceName); // 寫入MES DB if (chkStatus == true) { foreach (string strOutXML in colResponseXML) { objResponse.ParseXmlToObject(strOutXML); if (WriteEquipmentBasis_E10ICD(ref objResponse, ref aryReturnMessage) < 0) { if (aryReturnMessage.Count == 0) // 避免不明原因,執行FAIL又沒收集到項目. { aryReturnMessage.Add(TranslateMsg("machine_get, [%INVOKE FAIL%]!", strLanguageMode, strResourceDir)); } } } } } catch (Exception EX_AUT) { aryReturnMessage.Add("EX_AUT.Exception" + '\n' + EX_AUT.Message.ToString()); OutXml = EX_AUT.Message.ToString(); results = "fail"; // 執行ERP交易完畢寫入Log string argstrException = null; modAutoRunLibrary.addTransactionLog_ErrorCode(InXml, OutXml, DateTime.Now.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPEquipmentBasis_E10ICD", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), results, "ERP", strServiceName, LogClass: "AutoRun", strException: argstrException); } finally { // -------------------------------------------------- // 回傳執行結果:succces 或 fail(ReturnMessage) // -------------------------------------------------- if (aryReturnMessage.Count == 0) { funMESCallERPEquipmentBasis_E10ICDRet = "success"; results = "success"; } else { // 組合執行錯誤字串: Chr(10)分隔 strReturnMessage = ArrayList2String(ref aryReturnMessage); if ((strReturnMessage ?? "") == defString) { // 當錯誤字串組合失敗。補上 strReturnMessage = "ReturnMessage收集失敗!!"; } // tblMESAutoRunLog.ReturnMessage 長度4000限制. string strTemp = ""; if (strReturnMessage.Length > 4000) { // 自 strReturnMessage 中截取0-3991碼. strTemp = strReturnMessage.Substring(0, 3991) + "..."; } else { strTemp = strReturnMessage; } // 更新log table異常資訊 // Dim nodeID As XmlNode = XmlDoc.SelectSingleNode("/response/reqid") UpdateLogTableErrorInfo(colResponseXML, strServiceName, strTemp); // //fail; funMESCallERPEquipmentBasis_E10ICDRet = "fail;" + strTemp; } // ===manties:0095454 AutoRun addTransactionLog位置錯誤 需移至Finally 2021/07/06 // 執行ERP交易完畢寫入Log string argstrException = null; modAutoRunLibrary.addTransactionLog(InXml, OutXml, DateTime.Now.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPEquipmentBasis_E10ICD", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), results, "ERP", strServiceName, strException: argstrException); } } // === while (false); // -------------------------------------------------- // 當執行失敗,寄送 Email。必須有設定參數一。 // -------------------------------------------------- IDbConnection argcnnTemp = null; try { if (aryReturnMessage.Count > 0 && Conversions.ToBoolean(Operators.ConditionalCompareObjectNotEqual(colParameters["Parameter01"], "", false))) { strSubject = "[AUT]設備-基本資料抛轉失敗! "; strBody = Strings.Replace(strReturnMessage, Conversions.ToString('\n'), "
", Compare: CompareMethod.Text); // 寄送 Email argcnnTemp = CreateConnection(strConnectionString); if (ERP2MES_MailNotice(ref argcnnTemp, ref aryReturnMessage, strSubject, strParameter01, CInput(strBody)) < 0) { // 寄送不成功, ReturnMessage 再增加1項. // tblMESAutoRunLog.ReturnMessage 長度4000限制. if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(funMESCallERPEquipmentBasis_E10ICDRet.ToString().Length, 4000, false))) { string strTemp = ""; strTemp = strReturnMessage; if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(strTemp + aryReturnMessage[aryReturnMessage.Count - 1].ToString().Length, 4000, false))) { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); } else { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); // 自 strTemp 中截取0-3991碼. strTemp = strTemp.Substring(0, 3991) + "..."; } // //fail; funMESCallERPEquipmentBasis_E10ICDRet = "fail;" + strTemp; } } } } catch (Exception) { throw; } finally { CloseConnection(argcnnTemp); } return funMESCallERPEquipmentBasis_E10ICDRet; } private object funMESCallERPInventoryBasis_E10ICD(Collection colParameters = null) { object funMESCallERPInventoryBasis_E10ICDRet = default(object); var XmlDoc = new XmlDocument(); var drTemp = default(DbDataReader); //var daTemp = default(System.Data.OleDb.OleDbDataAdapter); var CollectionSQL = new Collection(); string strSQL; string strServiceName = "warehouse.get"; string strGroupNo = ""; // 使用者群組 string strPageSize = "500"; // 分包筆數 string strDate = string.Empty; // 日期迄(如無指定則帶今天) var arriveTime = DateTime.Now; string strCustomerNo, strERP_CustomerNo, strERP_status; string strSubject, strBody; // 寄送通知資訊 // AutorunJob拋轉資訊 string strReturnMessage = ""; // 錯誤訊息(tblMESAutoRunLog.ReturnMessage),Chr(10)分隔錯誤項目。 var aryReturnMessage = new ArrayList(); // Catch Error Message (Exception及MES判定錯誤訊息)。 var colResponseXML = new Collection(); do { try { // ParameterXX參數說明 // 01:Mail通知群組(GroupNo) // 02:分包筆數 // 03:手動重收時填上時間,如沒填則以log tableERP拋回的最後執行時間為主 // Parameter01為傳入參數,作為GroupNo,若無此值則不進行下面的程式 if (!(colParameters["Parameter01"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter01"])))) { strGroupNo = colParameters["Parameter01"].ToString().Trim(); } else { aryReturnMessage.Add(TranslateMsg("Mail GroupNo [%NOT SET%]([%PARAMETER01%])!", strLanguageMode, strResourceDir)); // ===== 2021/05/18 Elvis 92880 break; } // 分包筆數必須為數值型態,Add by KevinChang if (Information.IsNumeric(colParameters["Parameter02"])) { if (!(colParameters["Parameter02"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter02"])))) { // 每封包筆數不可小於500筆,Add by KevinChang if (Conversions.ToInteger(colParameters["Parameter02"]) < 500) { strPageSize = "500"; } else { strPageSize = colParameters["Parameter02"].ToString().Trim(); } } } // Parameter03為傳入參數,作為手動重收時填上時間,若無此值則以log tableERP拋回的最後執行時間為主 if (!(colParameters["Parameter03"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter03"])))) { strDate = GetDate(Conversions.ToString(colParameters["Parameter03"]), "Parameter03"); } else { // 20170316 edit liyujn strDate = GetERPTransactionDate(strServiceName); } // 取得erp資訊 if (!GetERPSetting(ref dtERPSetting, pEAIType: 1)) { aryReturnMessage.Add("Can not found EAI ERP Setting Info (EAI_TYPE = 1)!"); break; } var objResponse = new iMESCIO.SCI.ERP.Response_E10ICD.SCI_Response_warehouse_get(); XmlNode xmlNodeCnt; string strCnt; string strTTcnt; bool chkStatus = true; // 抓取其它status為0之資料且塞入colResponseXML GetReTransData(strServiceName, ref colResponseXML); // 判斷『當前回傳筆數』=『應回傳筆數』時才代表為最後一次請求,執行後才進行後續動作 var objRequest = new iMESCIO.SCI.ERP.Request_E10ICD.SCI_Request_warehouse_get(); objRequest.page_size = strPageSize; objRequest.data_time = strDate; objRequest.key_condition = ""; // ---- InXml ----- object argSCI_Object = objRequest; string argpRequestKey = "Null"; InXml = CombineRequestXMLbyCDO(ref argSCI_Object, dtERPSetting.Rows[0]["ERP_Name"].ToString(), "", strServiceName, pRequestKey: argpRequestKey); objRequest = (iMESCIO.SCI.ERP.Request_E10ICD.SCI_Request_warehouse_get)argSCI_Object; int intloopTimes = 0; do { // 迴圈執行超過5次直接跳出迴圈並回傳錯誤訊息 if (intloopTimes >= 5) { throw new Exception("[%THE NUMBER OF SUBCONTRACTS IS SET TOO LITTLE TO CAUSE THE LOOP TO EXECUTE MORE THAN FIVE TIMES%]"); break; } OutXml = string.Empty; OutXml = LoadXmlFileForTest("warehouse.get"); try { if (string.IsNullOrEmpty(OutXml)) { // ----- Call ERP Web Service ----- using (var ws = new iMESCore.Base.Invoke.wsERP_EAI.IntegrationEntry()) { ws.Url = ERP_URL; OutXml = ws.invokeSrv(InXml); } // 2017-05-03, Joe, 轉換單引號 OutXml = OutXml.Replace("'", "''"); OutXml = OutXml.Replace("'", "''"); } } catch (Exception ex) { OutXml = ex.Message; throw ex; } finally { // 需等到取得所有資料後,再處理後面之動作,故統一將請求完之ResponseXML放入容器內 colResponseXML.Add(OutXml); } XmlDoc.LoadXml(OutXml); // ----- 執行ERP交易完畢紀錄TransactionLog ----- string argstrException = null; modAutoRunLibrary.addTransactionLog(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPInventoryBasis_E10ICD", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), "success", "ERP", strServiceName, strException: argstrException); // 將ERP拋回的資料轉成物件 objResponse.ParseXmlToObject(OutXml); if (objResponse.srvcode == null == false && objResponse.srvcode.Equals("000") && objResponse.code == null == false && objResponse.code.Equals("0")) { objRequest = new iMESCIO.SCI.ERP.Request_E10ICD.SCI_Request_warehouse_get(); objRequest.data_time = objResponse.data_time; // 第二次後請求需為回傳之最後拋轉時間 objRequest.page_size = strPageSize; objRequest.key_condition = Strings.Replace(objResponse.key_condition, "''", "'"); // 第二次後代入從ERP收到之keyCondition object argSCI_Object1 = objRequest; string argpRequestKey1 = "Null"; InXml = CombineRequestXMLbyCDO(ref argSCI_Object1, dtERPSetting.Rows[0]["ERP_Name"].ToString(), "", strServiceName, pRequestKey: argpRequestKey1); objRequest = (iMESCIO.SCI.ERP.Request_E10ICD.SCI_Request_warehouse_get)argSCI_Object1; xmlNodeCnt = XmlDoc.SelectSingleNode("/response/payload/param/data_response/datainfo/parameter/data"); strCnt = xmlNodeCnt.Attributes.GetNamedItem("cnt").Value; strTTcnt = xmlNodeCnt.Attributes.GetNamedItem("tt_cnt").Value; } else { chkStatus = false; aryReturnMessage.Add(OutXml); // 2017-06-26, Joe, 如是中台層的錯誤要往外拋 break; } intloopTimes += 1; } while ((strCnt ?? "") != (strTTcnt ?? "")); // 寫入log table TreatWriteLogTable(colResponseXML, strServiceName); // 寫入MES DB if (chkStatus) { foreach (string strOutXML in colResponseXML) { objResponse.ParseXmlToObject(strOutXML); if (WriteToMESInventoryBasis_E10ICD(objResponse, ref aryReturnMessage) < 0) { if (aryReturnMessage.Count == 0) // 避免不明原因,執行FAIL又沒收集到項目. { aryReturnMessage.Add(strServiceName + ", 庫房主檔拋轉執行失敗!!"); } } } } } catch (Exception EX_AUT) { aryReturnMessage.Add("EX_AUT.Exception" + '\n' + EX_AUT.Message.ToString()); OutXml = EX_AUT.Message.ToString(); // 執行ERP交易完畢寫入Log string argstrException = null; modAutoRunLibrary.addTransactionLog_ErrorCode(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPInventoryBasis_E10ICD", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), "fail", "ERP", strServiceName, LogClass: "AutoRun", strException: argstrException); } finally { // -------------------------------------------------- // 回傳執行結果:succces 或 fail(ReturnMessage) // -------------------------------------------------- if (aryReturnMessage.Count == 0) { funMESCallERPInventoryBasis_E10ICDRet = "success"; } else { // 組合執行錯誤字串: Chr(10)分隔 strReturnMessage = ArrayList2String(ref aryReturnMessage); if ((strReturnMessage ?? "") == defString) { // 當錯誤字串組合失敗。補上 strReturnMessage = "ReturnMessage收集失敗!!"; } // tblMESAutoRunLog.ReturnMessage 長度4000限制. string strTemp = ""; if (strReturnMessage.Length > 4000) { // 自 strReturnMessage 中截取0-3991碼. strTemp = strReturnMessage.Substring(0, 3991) + "..."; } else { strTemp = strReturnMessage; } // 更新log table異常資訊 // Dim nodeID As XmlNode = XmlDoc.SelectSingleNode("/response/reqid") UpdateLogTableErrorInfo(colResponseXML, strServiceName, strTemp); // //fail; funMESCallERPInventoryBasis_E10ICDRet = "fail;" + strTemp; } // 執行ERP交易完畢寫入Log string argstrException = null; modAutoRunLibrary.addTransactionLog(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPInventoryBasis_E10ICD", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), "fail", "ERP", strServiceName, strException: argstrException); //if (daTemp != null) // daTemp.Dispose(); if (drTemp != null) drTemp.Close(); } } while (false); // -------------------------------------------------- // 當執行失敗,寄送 Email。必須有設定參數一。 // -------------------------------------------------- IDbConnection argcnnTemp = null; try { if (aryReturnMessage.Count > 0 && Conversions.ToBoolean(Operators.ConditionalCompareObjectNotEqual(colParameters["Parameter01"], "", false))) { strSubject = "[AUT]庫房主檔-基本資料抛轉失敗! "; strBody = Strings.Replace(strReturnMessage, Conversions.ToString('\n'), "
", Compare: CompareMethod.Text); argcnnTemp = CreateConnection(strConnectionString); // 寄送 Email if (ERP2MES_MailNotice(ref argcnnTemp, ref aryReturnMessage, strSubject, strGroupNo, CInput(strBody)) < 0) { // '寄送不成功, ReturnMessage 再增加1項. // 'ProductIntegration += Chr(10) & aryReturnMessage.Item(aryReturnMessage.Count - 1).ToString // 寄送不成功, ReturnMessage 再增加1項. // tblMESAutoRunLog.ReturnMessage 長度4000限制. if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(funMESCallERPInventoryBasis_E10ICDRet.ToString().Length, 4000, false))) { string strTemp = ""; strTemp = strReturnMessage; if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(strTemp + aryReturnMessage[aryReturnMessage.Count - 1].ToString().Length, 4000, false))) { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); } else { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); // 自 strTemp 中截取0-3991碼. strTemp = strTemp.Substring(0, 3991) + "..."; } // //fail; funMESCallERPInventoryBasis_E10ICDRet = "fail;" + strTemp; } } } } catch (Exception) { throw; } finally { CloseConnection(argcnnTemp); } return funMESCallERPInventoryBasis_E10ICDRet; } private object funMESCallERPLocatorBasis_E10ICD(Collection colParameters = null) { object funMESCallERPLocatorBasis_E10ICDRet = default(object); var XmlDoc = new XmlDocument(); var drTemp = default(DbDataReader); //var daTemp = default(System.Data.OleDb.OleDbDataAdapter); var CollectionSQL = new Collection(); string strSQL; string strServiceName = "storage.spaces.get"; string strGroupNo = ""; // 使用者群組 string strPageSize = "500"; // 分包筆數 string strDate = string.Empty; // 日期迄(如無指定則帶今天) var arriveTime = DateTime.Now; string strCustomerNo, strERP_CustomerNo, strERP_status; string strSubject, strBody; // 寄送通知資訊 // AutorunJob拋轉資訊 string strReturnMessage = ""; // 錯誤訊息(tblMESAutoRunLog.ReturnMessage),Chr(10)分隔錯誤項目。 var aryReturnMessage = new ArrayList(); // Catch Error Message (Exception及MES判定錯誤訊息)。 var colResponseXML = new Collection(); do { try { // ParameterXX參數說明 // 01:Mail通知群組(GroupNo) // 02:分包筆數 // 03:手動重收時填上時間,如沒填則以log tableERP拋回的最後執行時間為主 // Parameter01為傳入參數,作為GroupNo,若無此值則不進行下面的程式 if (!(colParameters["Parameter01"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter01"])))) { strGroupNo = colParameters["Parameter01"].ToString().Trim(); } else { aryReturnMessage.Add(TranslateMsg("Mail GroupNo [%NOT SET%]([%PARAMETER01%])!", strLanguageMode, strResourceDir)); // ===== 2021/05/18 Elvis 92880 break; } // 分包筆數必須為數值型態,Add by KevinChang if (Information.IsNumeric(colParameters["Parameter02"])) { if (!(colParameters["Parameter02"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter02"])))) { // 每封包筆數不可小於500筆,Add by KevinChang if (Conversions.ToInteger(colParameters["Parameter02"]) < 500) { strPageSize = "500"; } else { strPageSize = colParameters["Parameter02"].ToString().Trim(); } } } // Parameter03為傳入參數,作為手動重收時填上時間,若無此值則以log tableERP拋回的最後執行時間為主 if (!(colParameters["Parameter03"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter03"])))) { strDate = GetDate(Conversions.ToString(colParameters["Parameter03"]), "Parameter03"); } else { // 20170316 edit liyujn strDate = GetERPTransactionDate(strServiceName); } // 取得erp資訊 if (!GetERPSetting(ref dtERPSetting, pEAIType: 1)) { aryReturnMessage.Add("Can not found EAI ERP Setting Info (EAI_TYPE = 1)!"); break; } var objResponse = new iMESCIO.SCI.ERP.Response_E10ICD.SCI_Response_storage_spaces_get(); XmlNode xmlNodeCnt; string strCnt; string strTTcnt; bool chkStatus = true; // 抓取其它status為0之資料且塞入colResponseXML GetReTransData(strServiceName, ref colResponseXML); // 判斷『當前回傳筆數』=『應回傳筆數』時才代表為最後一次請求,執行後才進行後續動作 var objRequest = new iMESCIO.SCI.ERP.Request_E10ICD.SCI_Request_storage_spaces_get(); objRequest.page_size = strPageSize; objRequest.data_time = strDate; objRequest.key_condition = ""; // ---- InXml ----- object argSCI_Object = objRequest; string argpRequestKey = "Null"; InXml = CombineRequestXMLbyCDO(ref argSCI_Object, dtERPSetting.Rows[0]["ERP_Name"].ToString(), "", strServiceName, pRequestKey: argpRequestKey); objRequest = (iMESCIO.SCI.ERP.Request_E10ICD.SCI_Request_storage_spaces_get)argSCI_Object; int intloopTimes = 0; do { // 迴圈執行超過5次直接跳出迴圈並回傳錯誤訊息,Add By KevinChang if (intloopTimes >= 5) { throw new Exception("[%THE NUMBER OF SUBCONTRACTS IS SET TOO LITTLE TO CAUSE THE LOOP TO EXECUTE MORE THAN FIVE TIMES%]"); break; } OutXml = string.Empty; OutXml = LoadXmlFileForTest("storage.space.get"); try { if (string.IsNullOrEmpty(OutXml)) { // ----- Call ERP Web Service ----- using (var ws = new iMESCore.Base.Invoke.wsERP_EAI.IntegrationEntry()) { ws.Url = ERP_URL; OutXml = ws.invokeSrv(InXml); } // 2017-05-03, Joe, 轉換單引號 OutXml = OutXml.Replace("'", "''"); OutXml = OutXml.Replace("'", "''"); } } catch (Exception ex) { OutXml = ex.Message; throw ex; } finally { // 需等到取得所有資料後,再處理後面之動作,故統一將請求完之ResponseXML放入容器內 colResponseXML.Add(OutXml); } XmlDoc.LoadXml(OutXml); // ----- 執行ERP交易完畢紀錄TransactionLog ----- string argstrException = null; modAutoRunLibrary.addTransactionLog(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPLocatorBasis_E10ICD", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), "success", "ERP", strServiceName, strException: argstrException); // 將ERP拋回的資料轉成物件 objResponse.ParseXmlToObject(OutXml); if (objResponse.srvcode == null == false && objResponse.srvcode.Equals("000") && objResponse.code == null == false && objResponse.code.Equals("0")) { objRequest = new iMESCIO.SCI.ERP.Request_E10ICD.SCI_Request_storage_spaces_get(); objRequest.data_time = objResponse.data_time; // 第二次後請求需為回傳之最後拋轉時間 objRequest.page_size = strPageSize; objRequest.key_condition = Strings.Replace(objResponse.key_condition, "''", "'"); // 第二次後代入從ERP收到之keyCondition object argSCI_Object1 = objRequest; string argpRequestKey1 = "Null"; InXml = CombineRequestXMLbyCDO(ref argSCI_Object1, dtERPSetting.Rows[0]["ERP_Name"].ToString(), "", strServiceName, pRequestKey: argpRequestKey1); objRequest = (iMESCIO.SCI.ERP.Request_E10ICD.SCI_Request_storage_spaces_get)argSCI_Object1; xmlNodeCnt = XmlDoc.SelectSingleNode("/response/payload/param/data_response/datainfo/parameter/data"); strCnt = xmlNodeCnt.Attributes.GetNamedItem("cnt").Value; strTTcnt = xmlNodeCnt.Attributes.GetNamedItem("tt_cnt").Value; } else { chkStatus = false; aryReturnMessage.Add(OutXml); // 2017-06-26, Joe, 如是中台層的錯誤要往外拋 break; } intloopTimes += 1; } while ((strCnt ?? "") != (strTTcnt ?? "")); // 寫入log table TreatWriteLogTable(colResponseXML, strServiceName); // 寫入MES DB if (chkStatus) { foreach (string strOutXML in colResponseXML) { objResponse.ParseXmlToObject(strOutXML); if (WriteToMESLocatorBasis_E10ICD(objResponse, ref aryReturnMessage) < 0) { if (aryReturnMessage.Count == 0) // 避免不明原因,執行FAIL又沒收集到項目. { aryReturnMessage.Add(strServiceName + ", 儲位主檔拋轉執行失敗!!"); } } } } } catch (Exception EX_AUT) { aryReturnMessage.Add("EX_AUT.Exception" + '\n' + EX_AUT.Message.ToString()); OutXml = EX_AUT.Message.ToString(); // 執行ERP交易完畢寫入Log results = "fail"; string argstrException = null; modAutoRunLibrary.addTransactionLog_ErrorCode(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPLocatorBasis_E10ICD", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), results, "ERP", strServiceName, LogClass: "AutoRun", strException: argstrException); } finally { // -------------------------------------------------- // 回傳執行結果:succces 或 fail(ReturnMessage) // -------------------------------------------------- if (aryReturnMessage.Count == 0) { funMESCallERPLocatorBasis_E10ICDRet = "success"; results = "success"; } else { // 組合執行錯誤字串: Chr(10)分隔 strReturnMessage = ArrayList2String(ref aryReturnMessage); if ((strReturnMessage ?? "") == defString) { // 當錯誤字串組合失敗。補上 strReturnMessage = "ReturnMessage收集失敗!!"; } // tblMESAutoRunLog.ReturnMessage 長度4000限制. string strTemp = ""; if (strReturnMessage.Length > 4000) { // 自 strReturnMessage 中截取0-3991碼. strTemp = strReturnMessage.Substring(0, 3991) + "..."; } else { strTemp = strReturnMessage; } // 更新log table異常資訊 // Dim nodeID As XmlNode = XmlDoc.SelectSingleNode("/response/reqid") UpdateLogTableErrorInfo(colResponseXML, strServiceName, strTemp); // //fail; funMESCallERPLocatorBasis_E10ICDRet = "fail;" + strTemp; } // ===manties:0095454 AutoRun addTransactionLog位置錯誤 需移至Finally 2021/07/06 // 執行ERP交易完畢寫入Log string argstrException = null; modAutoRunLibrary.addTransactionLog(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPLocatorBasis_E10ICD", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), results, "ERP", strServiceName, strException: argstrException); // === //if (daTemp != null) // daTemp.Dispose(); if (drTemp != null) drTemp.Close(); } } while (false); // -------------------------------------------------- // 當執行失敗,寄送 Email。必須有設定參數一。 // -------------------------------------------------- IDbConnection argcnnTemp = null; try { if (aryReturnMessage.Count > 0 && Conversions.ToBoolean(Operators.ConditionalCompareObjectNotEqual(colParameters["Parameter01"], "", false))) { strSubject = "[AUT]儲位主檔-基本資料抛轉失敗! "; strBody = Strings.Replace(strReturnMessage, Conversions.ToString('\n'), "
", Compare: CompareMethod.Text); argcnnTemp = CreateConnection(strConnectionString); // 寄送 Email if (ERP2MES_MailNotice(ref argcnnTemp, ref aryReturnMessage, strSubject, strGroupNo, CInput(strBody)) < 0) { // '寄送不成功, ReturnMessage 再增加1項. // 'ProductIntegration += Chr(10) & aryReturnMessage.Item(aryReturnMessage.Count - 1).ToString // 寄送不成功, ReturnMessage 再增加1項. // tblMESAutoRunLog.ReturnMessage 長度4000限制. if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(funMESCallERPLocatorBasis_E10ICDRet.ToString().Length, 4000, false))) { string strTemp = ""; strTemp = strReturnMessage; if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(strTemp + aryReturnMessage[aryReturnMessage.Count - 1].ToString().Length, 4000, false))) { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); } else { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); // 自 strTemp 中截取0-3991碼. strTemp = strTemp.Substring(0, 3991) + "..."; } // //fail; funMESCallERPLocatorBasis_E10ICDRet = "fail;" + strTemp; } } } } catch (Exception) { throw; } finally { CloseConnection(argcnnTemp); } return funMESCallERPLocatorBasis_E10ICDRet; } private object funMESCallERPPRDMTLBasis_E10ICD(Collection colParameters = null) { object funMESCallERPPRDMTLBasis_E10ICDRet = default(object); var XmlDoc = new XmlDocument(); var CollectionSQL = new Collection(); // =========================================================== // 宣告 AutoRunJob設定及執行記錄 變數 // =========================================================== string strParameter01 = ""; // 參數一,預設此功能fail通知EMAIL群組。 string strPageSize = "500"; // 參數二,分包筆數 string strDate; // 參數三,手動重收時填上時間,如沒填則以log tableERP拋回的最後執行時間為主 string strSubject, strBody; // 寄送通知資訊 string strServiceName = "item.get.e10icd"; // AutorunJob拋轉資訊 string strReturnMessage = ""; // 錯誤訊息(tblMESAutoRunLog.ReturnMessage),Chr(10)分隔錯誤項目。 var aryReturnMessage = new ArrayList(); // Catch Error Message (Exception及MES判定錯誤訊息)。 var colResponseXML = new Collection(); do { try { // Parameter01為參數一 // 作為Mail通知群組(GroupNo),放在最前面防止連線失敗無法寄送通知。 if (!(colParameters["Parameter01"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter01"])))) { strParameter01 = colParameters["Parameter01"].ToString().Trim(); } else { aryReturnMessage.Add(TranslateMsg("Mail GroupNo [%NOT SET%]([%PARAMETER01%])!", strLanguageMode, strResourceDir)); // ===== 2021/05/18 Elvis 92880 break; } // 分包筆數必須為數值型態,Add by KevinChang if (Information.IsNumeric(colParameters["Parameter02"])) { if (!(colParameters["Parameter02"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter02"])))) { // 每封包筆數不可小於500筆,Add by KevinChang if (Conversions.ToInteger(colParameters["Parameter02"]) < 500) { strPageSize = "500"; } else { strPageSize = colParameters["Parameter02"].ToString().Trim(); } } } if (!(colParameters["Parameter03"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter03"])))) { strDate = GetDate(Conversions.ToString(colParameters["Parameter03"]), "Parameter03"); } else { // 20170316 edit liyujn strDate = GetERPTransactionDate(strServiceName); } // 取得erp資訊 if (!GetERPSetting(ref dtERPSetting, pEAIType: 1)) { aryReturnMessage.Add(TranslateMsg("[%PleaseCheck%] EAI ERP Setting Info [%CONFIGSETTING%]!", strLanguageMode, strResourceDir)); break; } var objResponse = new iMESCIO.SCI.ERP.Response_E10ICD.SCI_Response_item_get(); XmlNode xmlNodeCnt; string strCnt; string strTTcnt; bool chkStatus = true; // 抓取其它status為0之資料且塞入colResponseXML GetReTransData(strServiceName, ref colResponseXML); // 判斷『當前回傳筆數』=『應回傳筆數』時才代表為最後一次請求,執行後才進行後續動作 var objMaster = new iMESCIO.SCI.ERP.Request_E10ICD.SCI_Request_item_get(); objMaster.data_time = strDate; objMaster.key_condition = ""; objMaster.page_size = strPageSize; object argSCI_Object = objMaster; string argpRequestKey = "Null"; InXml = CombineRequestXMLbyCDO(ref argSCI_Object, dtERPSetting.Rows[0]["ERP_Name"].ToString(), "", strServiceName, pRequestKey: argpRequestKey); objMaster = (iMESCIO.SCI.ERP.Request_E10ICD.SCI_Request_item_get)argSCI_Object; int intloopTimes = 0; do { // 迴圈執行超過5次直接跳出迴圈並回傳錯誤訊息,Add by KevinChang if (intloopTimes >= 5) { throw new Exception("[%THE NUMBER OF SUBCONTRACTS IS SET TOO LITTLE TO CAUSE THE LOOP TO EXECUTE MORE THAN FIVE TIMES%]"); break; } // 先確認是否有測試檔案,有的話就讀取出xml OutXml = string.Empty; OutXml = LoadXmlFileForTest(strServiceName); try { if (string.IsNullOrEmpty(OutXml)) { // ----- Call ERP Web Service ----- using (var ws = new iMESCore.Base.Invoke.wsERP_EAI.IntegrationEntry()) { ws.Url = ERP_URL; OutXml = ws.invokeSrv(InXml); } // 2017-05-03, Joe, 轉換單引號 OutXml = OutXml.Replace("'", "''"); // 2021/4/6 Steven 替換 ' OutXml = OutXml.Replace("'", "''"); } } catch (Exception ex) { OutXml = ex.Message; throw ex; } finally { // 需等到取得所有資料後,再處理後面之動作,故統一將請求完之ResponseXML放入容器內 colResponseXML.Add(OutXml); } XmlDoc.LoadXml(OutXml); // 執行ERP交易完畢寫入Log string argstrException = null; modAutoRunLibrary.addTransactionLog(InXml, OutXml, DateTime.Now.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPProductBasis", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), "success", "ERP", strServiceName, strException: argstrException); // 將ERP拋回的資料轉成物件 objResponse.ParseXmlToObject(OutXml); if (objResponse.srvcode == null == false && objResponse.srvcode.Equals("000") && objResponse.code == null == false && objResponse.code.Equals("0")) { objMaster = new iMESCIO.SCI.ERP.Request_E10ICD.SCI_Request_item_get(); objMaster.data_time = objResponse.data_time; // 第二次後請求需為回傳之最後拋轉時間 objMaster.key_condition = Strings.Replace(objResponse.key_condition, "''", "'"); // 第二次後待入從ERP收到之keyCondition objMaster.page_size = strPageSize; object argSCI_Object1 = objMaster; string argpRequestKey1 = "Null"; InXml = CombineRequestXMLbyCDO(ref argSCI_Object1, dtERPSetting.Rows[0]["ERP_Name"].ToString(), "", strServiceName, pRequestKey: argpRequestKey1); objMaster = (iMESCIO.SCI.ERP.Request_E10ICD.SCI_Request_item_get)argSCI_Object1; xmlNodeCnt = XmlDoc.SelectSingleNode("/response/payload/param/data_response/datainfo/parameter/data"); strCnt = xmlNodeCnt.Attributes.GetNamedItem("cnt").Value; strTTcnt = xmlNodeCnt.Attributes.GetNamedItem("tt_cnt").Value; } else { chkStatus = false; aryReturnMessage.Add(OutXml); // 2017-06-26, Joe, 如是中台層的錯誤要往外拋 break; } intloopTimes += 1; } while ((strCnt ?? "") != (strTTcnt ?? "")); // 寫入log table TreatWriteLogTable_E10ICD(colResponseXML, strServiceName); // 寫入MES DB if (chkStatus) { foreach (string strOutXML in colResponseXML) { objResponse.ParseXmlToObject(strOutXML); if (WriteProductOrMaterailBasis_E10ICD(objResponse, ref aryReturnMessage) < 0) { if (aryReturnMessage.Count == 0) // 避免不明原因,執行FAIL又沒收集到項目. { aryReturnMessage.Add(TranslateMsg("item_get, [%INVOKE FAIL%]!", strLanguageMode, strResourceDir)); } } } } } catch (Exception EX_AUT) { aryReturnMessage.Add("EX_AUT.Exception" + '\n' + EX_AUT.Message.ToString()); OutXml = EX_AUT.Message.ToString(); results = "fail"; // 執行ERP交易完畢寫入Log string argstrException = null; modAutoRunLibrary.addTransactionLog_ErrorCode(InXml, OutXml, DateTime.Now.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPProductBasis", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), results, "ERP", strServiceName, LogClass: "AutoRun", strException: argstrException); } finally { // -------------------------------------------------- // 回傳執行結果:succces 或 fail(ReturnMessage) // -------------------------------------------------- if (aryReturnMessage.Count == 0) { funMESCallERPPRDMTLBasis_E10ICDRet = "success"; results = "success"; } else { // 組合執行錯誤字串: Chr(10)分隔 strReturnMessage = ArrayList2String(ref aryReturnMessage); if ((strReturnMessage ?? "") == defString) { // 當錯誤字串組合失敗。補上 strReturnMessage = "ReturnMessage收集失敗!!"; } // tblMESAutoRunLog.ReturnMessage 長度4000限制. string strTemp = ""; if (strReturnMessage.Length > 4000) { // 自 strReturnMessage 中截取0-3991碼. strTemp = strReturnMessage.Substring(0, 3991) + "..."; } else { strTemp = strReturnMessage; } // 更新log table異常資訊 // Dim nodeID As XmlNode = XmlDoc.SelectSingleNode("/response/reqid") // UpdateLogTableErrorInfo(nodeID.InnerText, strTemp) UpdateLogTableErrorInfo(colResponseXML, strServiceName, strTemp); // //fail; funMESCallERPPRDMTLBasis_E10ICDRet = CombineFailMsg("0000-999999", strTemp); } // ===manties:0095454 AutoRun addTransactionLog位置錯誤 需移至Finally 2021/07/06 // 執行ERP交易完畢寫入Log string argstrException = null; modAutoRunLibrary.addTransactionLog(InXml, OutXml, DateTime.Now.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPProductBasis", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), results, "ERP", strServiceName, strException: argstrException); } } // === while (false); // -------------------------------------------------- // 當執行失敗,寄送 Email。必須有設定參數一。 // -------------------------------------------------- IDbConnection argcnnTemp = null; try { if (aryReturnMessage.Count > 0 && Conversions.ToBoolean(Operators.ConditionalCompareObjectNotEqual(colParameters["Parameter01"], "", false))) { strSubject = "[AUT]料件-基本資料抛轉失敗! "; strBody = Strings.Replace(strReturnMessage, Conversions.ToString('\n'), "
", Compare: CompareMethod.Text); // 寄送 Email argcnnTemp = CreateConnection(strConnectionString); if (ERP2MES_MailNotice(ref argcnnTemp, ref aryReturnMessage, strSubject, strParameter01, CInput(strBody)) < 0) { // '寄送不成功, ReturnMessage 再增加1項. // 'ProductIntegration += Chr(10) & aryReturnMessage.Item(aryReturnMessage.Count - 1).ToString // 寄送不成功, ReturnMessage 再增加1項. // tblMESAutoRunLog.ReturnMessage 長度4000限制. if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(funMESCallERPPRDMTLBasis_E10ICDRet.ToString().Length, 4000, false))) { string strTemp = ""; strTemp = strReturnMessage; if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(strTemp + aryReturnMessage[aryReturnMessage.Count - 1].ToString().Length, 4000, false))) { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); } else { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); // 自 strTemp 中截取0-3991碼. strTemp = strTemp.Substring(0, 3991) + "..."; } // //fail; funMESCallERPPRDMTLBasis_E10ICDRet = "fail;" + strTemp; } } } } catch (Exception) { throw; } finally { CloseConnection(argcnnTemp); } return funMESCallERPPRDMTLBasis_E10ICDRet; } private object funMESCallERPOPBasis_E10ICD(Collection colParameters = null) { object funMESCallERPOPBasis_E10ICDRet = default(object); var drTemp = default(DbDataReader); string strSQL; var XmlDoc = new XmlDocument(); //var daTemp = default(System.Data.OleDb.OleDbDataAdapter); var CollectionSQL = new Collection(); var colResponseXML = new Collection(); var arriveTime = DateTime.Now; string strServiceName = "op.get.e10icd"; // =========================================================== // 宣告 AutoRunJob設定及執行記錄 變數 // =========================================================== string strParameter01 = ""; // 參數一,預設此功能fail通知EMAIL群組。 string strPageSize = "500"; // 參數二,分包筆數 string strDate; // 參數三,手動重收時填上時間,如沒填則以log tableERP拋回的最後執行時間為主 // AutorunJob拋轉資訊 string strReturnMessage = ""; // 錯誤訊息(tblMESAutoRunLog.ReturnMessage),Chr(10)分隔錯誤項目。 var aryReturnMessage = new ArrayList(); // Catch Error Message (Exception及MES判定錯誤訊息)。 string strSubject, strBody; // 寄送通知資訊 XmlNode node = null; string strReqid = ""; string strCnt = defString; string strTTcnt = ""; var datArriveTime = DateTime.Now; do { try { // Parameter01為傳入參數,作為SheetType,若無此值則不進行下面的程式 if (!(colParameters["Parameter01"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter01"])))) { strParameter01 = colParameters["Parameter01"].ToString().Trim(); } else { aryReturnMessage.Add(TranslateMsg("Mail GroupNo [%NOT SET%]([%PARAMETER01%])!", strLanguageMode, strResourceDir)); // ===== 2021/05/18 Elvis 92880 break; } // 分包筆數必須為數值型態,Add by KevinChang if (Information.IsNumeric(colParameters["Parameter02"])) { if (!(colParameters["Parameter02"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter02"])))) { // 每封包筆數不可小於500筆,Add by KevinChang if (Conversions.ToInteger(colParameters["Parameter02"]) < 500) { strPageSize = "500"; } else { strPageSize = colParameters["Parameter02"].ToString().Trim(); } } } // Parameter03為傳入參數,作為ProductionDate,若無此值則用昨天當日期 if (!(colParameters["Parameter03"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter03"])))) { strDate = GetDate(Conversions.ToString(colParameters["Parameter03"]), "Parameter03"); } else { // 20170316 edit liyujn strDate = GetERPTransactionDate(strServiceName); } // 取得erp資訊 if (!GetERPSetting(ref dtERPSetting, pEAIType: 1)) { aryReturnMessage.Add(TranslateMsg("[%PleaseCheck%] EAI ERP Setting Info [%CONFIGSETTING%]!", strLanguageMode, strResourceDir)); break; } var objResponse = new iMESCIO.SCI.ERP.Response_E10ICD.SCI_Response_op_get(); XmlNode xmlNodeCnt; bool chkStatus = true; // 抓取其它status為0之資料且塞入colResponseXML GetReTransData(strServiceName, ref colResponseXML); // 判斷『當前回傳筆數』=『應回傳筆數』時才代表為最後一次請求,執行後才進行後續動作 var objMaster = new iMESCIO.SCI.ERP.Request_E10ICD.SCI_Request_op_get(); objMaster.data_time = strDate; objMaster.page_size = strPageSize; objMaster.key_condition = ""; object argSCI_Object = objMaster; string argpRequestKey = "Null"; InXml = CombineRequestXMLbyCDO(ref argSCI_Object, dtERPSetting.Rows[0]["ERP_Name"].ToString(), "", "op.get.e10icd", pRequestKey: argpRequestKey); objMaster = (iMESCIO.SCI.ERP.Request_E10ICD.SCI_Request_op_get)argSCI_Object; int intloopTimes = 0; do { // 迴圈執行超過5次直接跳出迴圈並回傳錯誤訊息,Add By KevinChang if (intloopTimes >= 5) { throw new Exception("[%THE NUMBER OF SUBCONTRACTS IS SET TOO LITTLE TO CAUSE THE LOOP TO EXECUTE MORE THAN FIVE TIMES%]"); break; } OutXml = string.Empty; OutXml = LoadXmlFileForTest("op.get.e10icd"); try { if (string.IsNullOrEmpty(OutXml)) { // ----- Call ERP Web Service ----- using (var ws = new iMESCore.Base.Invoke.wsERP_EAI.IntegrationEntry()) { ws.Url = ERP_URL; OutXml = ws.invokeSrv(InXml); } // 2017-05-03, Joe, 轉換單引號 OutXml = OutXml.Replace("'", "''"); OutXml = OutXml.Replace("'", "''"); } } catch (Exception ex) { OutXml = ex.Message; throw ex; } finally { // 需等到取得所有資料後,再處理後面之動作,故統一將請求完之ResponseXML放入容器內 colResponseXML.Add(OutXml); } XmlDoc.LoadXml(OutXml); string argstrException = null; modAutoRunLibrary.addTransactionLog(InXml, OutXml, DateTime.Now.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPOPBasis_E10ICD", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), "success", "ERP", strServiceName, strException: argstrException); // 將ERP拋回的資料轉成物件 objResponse.ParseXmlToObject(OutXml); if (objResponse.srvcode == null == false && objResponse.srvcode.Equals("000") && objResponse.code == null == false && objResponse.code.Equals("0")) { objMaster = new iMESCIO.SCI.ERP.Request_E10ICD.SCI_Request_op_get(); objMaster.data_time = objResponse.data_time; // 第二次後請求需為回傳之最後拋轉時間 objMaster.page_size = strPageSize; objMaster.key_condition = Strings.Replace(objResponse.key_condition, "''", "'"); // 第二次後代入從ERP收到之keyCondition object argSCI_Object1 = objMaster; string argpRequestKey1 = "Null"; InXml = CombineRequestXMLbyCDO(ref argSCI_Object1, dtERPSetting.Rows[0]["ERP_Name"].ToString(), "", "op.get.e10icd", pRequestKey: argpRequestKey1); objMaster = (iMESCIO.SCI.ERP.Request_E10ICD.SCI_Request_op_get)argSCI_Object1; xmlNodeCnt = XmlDoc.SelectSingleNode("/response/payload/param/data_response/datainfo/parameter/data"); strCnt = xmlNodeCnt.Attributes.GetNamedItem("cnt").Value; strTTcnt = xmlNodeCnt.Attributes.GetNamedItem("tt_cnt").Value; } else { chkStatus = false; aryReturnMessage.Add(OutXml); // 2017-06-26, Joe, 如是中台層的錯誤要往外拋 break; } intloopTimes += 1; } while ((strCnt ?? "") != (strTTcnt ?? "")); // 寫入Log Table TreatWriteLogTable_E10ICD(colResponseXML, strServiceName); // 寫入MES DB if (chkStatus) { foreach (string strOutXML in colResponseXML) { objResponse.ParseXmlToObject(strOutXML); if (WriteOPBasis_E10ICD(objResponse, ref aryReturnMessage) < 0) { if (aryReturnMessage.Count == 0) // 避免不明原因,執行FAIL又沒收集到項目. { aryReturnMessage.Add(TranslateMsg("op_get, [%INVOKE FAIL%]!", strLanguageMode, strResourceDir)); } } } } } // CollectionSQL = Nothing // XmlDoc = Nothing catch (Exception EX_AUT) { aryReturnMessage.Add("EX_AUT.Exception" + '\n' + EX_AUT.Message.ToString()); OutXml = EX_AUT.Message.ToString(); results = "fail"; // ----- 執行ERP交易完畢紀錄TransactionLog ----- string argstrException = null; modAutoRunLibrary.addTransactionLog_ErrorCode(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "MES", "MESCallERPOPBasis_E10ICD", Environment.MachineName, "AutoRun", arriveTime.ToString("yyyy/MM/dd HH:mm:ss"), results, "", "CreateMESCallERPOPBasis", LogClass: "AutoRun", strException: argstrException); // 2013/02/05, Hank, Send Email colParameters.Add(funMESCallERPOPBasis_E10ICDRet, "EmailBody"); SendJobFailEmail(colParameters); } finally { // -------------------------------------------------- // 回傳執行結果:succces 或 fail(ReturnMessage) // -------------------------------------------------- if (aryReturnMessage.Count == 0) { funMESCallERPOPBasis_E10ICDRet = "success"; results = "success"; } else { // 組合執行錯誤字串: Chr(10)分隔 strReturnMessage = ArrayList2String(ref aryReturnMessage); if ((strReturnMessage ?? "") == defString) { // 當錯誤字串組合失敗。補上 strReturnMessage = "ReturnMessage收集失敗!!"; } // tblMESAutoRunLog.ReturnMessage 長度4000限制. string strTemp = ""; if (strReturnMessage.Length > 4000) { // 自 strReturnMessage 中截取0-3991碼. strTemp = strReturnMessage.Substring(0, 3991) + "..."; } else { strTemp = strReturnMessage; } // 更新log table異常資訊 // Dim nodeID As XmlNode = XmlDoc.SelectSingleNode("/response/reqid") UpdateLogTableErrorInfo(colResponseXML, strServiceName, strTemp); // //fail; funMESCallERPOPBasis_E10ICDRet = "fail;" + strTemp; } // ===manties:0095454 AutoRun addTransactionLog位置錯誤 需移至Finally 2021/07/06 // ----- 執行ERP交易完畢紀錄TransactionLog ----- string argstrException = null; modAutoRunLibrary.addTransactionLog(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "MES", "MESCallERPOPBasis_E10ICD", Environment.MachineName, "AutoRun", arriveTime.ToString("yyyy/MM/dd HH:mm:ss"), results, "", "CreateMESCallERPOPBasis", strException: argstrException); // === //if (daTemp != null) // daTemp.Dispose(); if (drTemp != null) drTemp.Close(); } } while (false); // 當執行失敗 寄送 Email 必須有設定參數一 IDbConnection argcnnTemp = null; try { if (aryReturnMessage.Count > 0 && Conversions.ToBoolean(Operators.ConditionalCompareObjectNotEqual(colParameters["Parameter01"], "", false))) { strSubject = "[AUT]作業站-基本資料抛轉失敗! "; strBody = Strings.Replace(strReturnMessage, Conversions.ToString('\n'), "
", Compare: CompareMethod.Text); argcnnTemp = CreateConnection(strConnectionString); // 寄送 Email if (ERP2MES_MailNotice(ref argcnnTemp, ref aryReturnMessage, strSubject, Conversions.ToString(colParameters["Parameter01"]), CInput(strBody)) < 0) { // '寄送不成功, ReturnMessage 再增加1項. // 'ProductIntegration += Chr(10) & aryReturnMessage.Item(aryReturnMessage.Count - 1).ToString // 寄送不成功, ReturnMessage 再增加1項. // tblMESAutoRunLog.ReturnMessage 長度4000限制. if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(funMESCallERPOPBasis_E10ICDRet.ToString().Length, 4000, false))) { string strTemp = ""; strTemp = strReturnMessage; if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(strTemp + aryReturnMessage[aryReturnMessage.Count - 1].ToString().Length, 4000, false))) { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); } else { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); // 自 strTemp 中截取0-3991碼. strTemp = strTemp.Substring(0, 3991) + "..."; } // //fail; funMESCallERPOPBasis_E10ICDRet = "fail;" + strTemp; } } } } catch (Exception) { throw; } finally { CloseConnection(argcnnTemp); } return funMESCallERPOPBasis_E10ICDRet; } private object funMESCallERPOPGroupBasis_E10ICD(Collection colParameters = null) { object funMESCallERPOPGroupBasis_E10ICDRet = default(object); var drTemp = default(DbDataReader); string strSQL; var XmlDoc = new XmlDocument(); //var daTemp = default(System.Data.OleDb.OleDbDataAdapter); var CollectionSQL = new Collection(); var colResponseXML = new Collection(); var arriveTime = DateTime.Now; string strServiceName = "workstation.get"; // =========================================================== // 宣告 AutoRunJob設定及執行記錄 變數 // =========================================================== string strParameter01 = ""; // 參數一,預設此功能fail通知EMAIL群組。 string strPageSize = "500"; // 參數二,分包筆數 string strDate; // 參數三,手動重收時填上時間,如沒填則以log tableERP拋回的最後執行時間為主 // AutorunJob拋轉資訊 string strReturnMessage = ""; // 錯誤訊息(tblMESAutoRunLog.ReturnMessage),Chr(10)分隔錯誤項目。 var aryReturnMessage = new ArrayList(); // Catch Error Message (Exception及MES判定錯誤訊息)。 string strSubject, strBody; // 寄送通知資訊 XmlNode node = null; string strReqid = ""; string strCnt = defString; string strTTcnt = ""; var datArriveTime = DateTime.Now; do { try { // Parameter01為傳入參數,作為E-mail,若無此值則不進行下面的程式 if (!(colParameters["Parameter01"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter01"])))) { strParameter01 = colParameters["Parameter01"].ToString().Trim(); } else { aryReturnMessage.Add(TranslateMsg("Mail GroupNo [%NOT SET%]([%PARAMETER01%])!", strLanguageMode, strResourceDir)); // ===== 2021/05/18 Elvis 92880 break; } // 分包筆數必須為數值型態,Add by KevinChang if (Information.IsNumeric(colParameters["Parameter02"])) { if (!(colParameters["Parameter02"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter02"])))) { // 每封包筆數不可小於500筆,Add by KevinChang if (Conversions.ToInteger(colParameters["Parameter02"]) < 500) { strPageSize = "500"; } else { strPageSize = colParameters["Parameter02"].ToString().Trim(); } } } // Parameter03為傳入參數,作為ProductionDate,若無此值則用昨天當日期 if (!(colParameters["Parameter03"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter03"])))) { strDate = GetDate(Conversions.ToString(colParameters["Parameter03"]), "Parameter03"); } else { // 20170316 edit liyujn strDate = GetERPTransactionDate(strServiceName); } // 取得erp資訊 if (!GetERPSetting(ref dtERPSetting, pEAIType: 1)) { aryReturnMessage.Add(TranslateMsg("[%PleaseCheck%] EAI ERP Setting Info [%CONFIGSETTING%]!", strLanguageMode, strResourceDir)); break; } var objResponse = new iMESCIO.SCI.ERP.Response_E10ICD.SCI_Response_workstation_get(); XmlNode xmlNodeCnt; bool chkStatus = true; // 抓取其它status為0之資料且塞入colResponseXML GetReTransData(strServiceName, ref colResponseXML); // 判斷『當前回傳筆數』=『應回傳筆數』時才代表為最後一次請求,執行後才進行後續動作 var objMaster = new iMESCIO.SCI.ERP.Request_E10ICD.SCI_Request_workstation_get(); objMaster.data_time = strDate; objMaster.page_size = strPageSize; objMaster.key_condition = ""; object argSCI_Object = objMaster; string argpRequestKey = "Null"; InXml = CombineRequestXMLbyCDO(ref argSCI_Object, dtERPSetting.Rows[0]["ERP_Name"].ToString(), "", "workstation.get", pRequestKey: argpRequestKey); objMaster = (iMESCIO.SCI.ERP.Request_E10ICD.SCI_Request_workstation_get)argSCI_Object; int intloopTimes = 0; do { // 迴圈執行超過5次直接跳出迴圈並回傳錯誤訊息,Add By KevinChang if (intloopTimes >= 5) { throw new Exception("[%THE NUMBER OF SUBCONTRACTS IS SET TOO LITTLE TO CAUSE THE LOOP TO EXECUTE MORE THAN FIVE TIMES%]"); break; } OutXml = string.Empty; OutXml = LoadXmlFileForTest("workstation.get"); try { if (string.IsNullOrEmpty(OutXml)) { // ----- Call ERP Web Service ----- using (var ws = new iMESCore.Base.Invoke.wsERP_EAI.IntegrationEntry()) { ws.Url = ERP_URL; OutXml = ws.invokeSrv(InXml); } // 2017-05-03, Joe, 轉換單引號 OutXml = OutXml.Replace("'", "''"); OutXml = OutXml.Replace("'", "''"); } } catch (Exception ex) { OutXml = ex.Message; throw ex; } finally { // 需等到取得所有資料後,再處理後面之動作,故統一將請求完之ResponseXML放入容器內 colResponseXML.Add(OutXml); } XmlDoc.LoadXml(OutXml); string argstrException = null; modAutoRunLibrary.addTransactionLog(InXml, OutXml, DateTime.Now.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPOPGroupBasis_E10ICD", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), "success", "ERP", strServiceName, strException: argstrException); // 將ERP拋回的資料轉成物件 objResponse.ParseXmlToObject(OutXml); if (objResponse.srvcode == null == false && objResponse.srvcode.Equals("000") && objResponse.code == null == false && objResponse.code.Equals("0")) { objMaster = new iMESCIO.SCI.ERP.Request_E10ICD.SCI_Request_workstation_get(); objMaster.data_time = objResponse.data_time; // 第二次後請求需為回傳之最後拋轉時間 objMaster.page_size = strPageSize; objMaster.key_condition = Strings.Replace(objResponse.key_condition, "''", "'"); // 第二次後代入從ERP收到之keyCondition object argSCI_Object1 = objMaster; string argpRequestKey1 = "Null"; InXml = CombineRequestXMLbyCDO(ref argSCI_Object1, dtERPSetting.Rows[0]["ERP_Name"].ToString(), "", "workstation.get", pRequestKey: argpRequestKey1); objMaster = (iMESCIO.SCI.ERP.Request_E10ICD.SCI_Request_workstation_get)argSCI_Object1; xmlNodeCnt = XmlDoc.SelectSingleNode("/response/payload/param/data_response/datainfo/parameter/data"); strCnt = xmlNodeCnt.Attributes.GetNamedItem("cnt").Value; strTTcnt = xmlNodeCnt.Attributes.GetNamedItem("tt_cnt").Value; } else { chkStatus = false; aryReturnMessage.Add(OutXml); // 2017-06-26, Joe, 如是中台層的錯誤要往外拋 break; } intloopTimes += 1; } while ((strCnt ?? "") != (strTTcnt ?? "")); // 寫入Log Table TreatWriteLogTable(colResponseXML, strServiceName); // 寫入MES DB if (chkStatus) { foreach (string strOutXML in colResponseXML) { objResponse.ParseXmlToObject(strOutXML); if (WriteOPGroupBasis_E10ICD(objResponse, ref aryReturnMessage) < 0) { if (aryReturnMessage.Count == 0) // 避免不明原因,執行FAIL又沒收集到項目. { aryReturnMessage.Add(TranslateMsg("workstation_get, [%INVOKE FAIL%]!", strLanguageMode, strResourceDir)); } } } } } // CollectionSQL = Nothing // XmlDoc = Nothing catch (Exception EX_AUT) { aryReturnMessage.Add("EX_AUT.Exception" + '\n' + EX_AUT.Message.ToString()); OutXml = EX_AUT.Message.ToString(); results = "fail"; // ----- 執行ERP交易完畢紀錄TransactionLog ----- string argstrException = null; modAutoRunLibrary.addTransactionLog_ErrorCode(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "MES", "MESCallERPOPGroupBasis", Environment.MachineName, "AutoRun", arriveTime.ToString("yyyy/MM/dd HH:mm:ss"), results, "", "CreateMESCallERPOPGroupBasis", LogClass: "AutoRun", strException: argstrException); // 2013/02/05, Hank, Send Email colParameters.Add(funMESCallERPOPGroupBasis_E10ICDRet, "EmailBody"); SendJobFailEmail(colParameters); } finally { // -------------------------------------------------- // 回傳執行結果:succces 或 fail(ReturnMessage) // -------------------------------------------------- if (aryReturnMessage.Count == 0) { funMESCallERPOPGroupBasis_E10ICDRet = "success"; results = "success"; } else { // 組合執行錯誤字串: Chr(10)分隔 strReturnMessage = ArrayList2String(ref aryReturnMessage); if ((strReturnMessage ?? "") == defString) { // 當錯誤字串組合失敗。補上 strReturnMessage = "ReturnMessage收集失敗!!"; } // tblMESAutoRunLog.ReturnMessage 長度4000限制. string strTemp = ""; if (strReturnMessage.Length > 4000) { // 自 strReturnMessage 中截取0-3991碼. strTemp = strReturnMessage.Substring(0, 3991) + "..."; } else { strTemp = strReturnMessage; } // 更新log table異常資訊 // Dim nodeID As XmlNode = XmlDoc.SelectSingleNode("/response/reqid") UpdateLogTableErrorInfo(colResponseXML, strServiceName, strTemp); // //fail; funMESCallERPOPGroupBasis_E10ICDRet = CombineFailMsg("0000-999999", strTemp); } // ===manties:0095454 AutoRun addTransactionLog位置錯誤 需移至Finally 2021/07/06 // ----- 執行ERP交易完畢紀錄TransactionLog ----- string argstrException = null; modAutoRunLibrary.addTransactionLog(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "MES", "MESCallERPOPGroupBasis", Environment.MachineName, "AutoRun", arriveTime.ToString("yyyy/MM/dd HH:mm:ss"), results, "", "CreateMESCallERPOPGroupBasis", strException: argstrException); // === //if (daTemp != null) // daTemp.Dispose(); if (drTemp != null) drTemp.Close(); } } while (false); // 當執行失敗 寄送 Email 必須有設定參數一 IDbConnection argcnnTemp = null; try { if (aryReturnMessage.Count > 0 && Conversions.ToBoolean(Operators.ConditionalCompareObjectNotEqual(colParameters["Parameter01"], "", false))) { strSubject = "[AUT]工作站-基本資料抛轉失敗! "; strBody = Strings.Replace(strReturnMessage, Conversions.ToString('\n'), "
", Compare: CompareMethod.Text); argcnnTemp = CreateConnection(strConnectionString); // 寄送 Email if (ERP2MES_MailNotice(ref argcnnTemp, ref aryReturnMessage, strSubject, Conversions.ToString(colParameters["Parameter01"]), CInput(strBody)) < 0) { // '寄送不成功, ReturnMessage 再增加1項. // 'ProductIntegration += Chr(10) & aryReturnMessage.Item(aryReturnMessage.Count - 1).ToString // 寄送不成功, ReturnMessage 再增加1項. // tblMESAutoRunLog.ReturnMessage 長度4000限制. if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(funMESCallERPOPGroupBasis_E10ICDRet.ToString().Length, 4000, false))) { string strTemp = ""; strTemp = strReturnMessage; if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(strTemp + aryReturnMessage[aryReturnMessage.Count - 1].ToString().Length, 4000, false))) { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); } else { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); // 自 strTemp 中截取0-3991碼. strTemp = strTemp.Substring(0, 3991) + "..."; } // //fail; funMESCallERPOPGroupBasis_E10ICDRet = CombineFailMsg("0000-999999", strTemp); } } } } catch (Exception) { throw; } finally { CloseConnection(argcnnTemp); } return funMESCallERPOPGroupBasis_E10ICDRet; } private object funMESCallERPDepartmentBasis_E10ICD(Collection colParameters = null) { object funMESCallERPDepartmentBasis_E10ICDRet = default(object); var XmlDoc = new XmlDocument(); var drTemp = default(DbDataReader); //var daTemp = default(System.Data.OleDb.OleDbDataAdapter); var CollectionSQL = new Collection(); string strSQL; string strServiceName = "department.get"; string strGroupNo = ""; // 使用者群組 string strPageSize = "500"; // 分包筆數 string strDate = string.Empty; // 日期迄(如無指定則帶今天) var arriveTime = DateTime.Now; string strCustomerNo, strERP_CustomerNo, strERP_status; string strSubject, strBody; // 寄送通知資訊 // AutorunJob拋轉資訊 string strReturnMessage = ""; // 錯誤訊息(tblMESAutoRunLog.ReturnMessage),Chr(10)分隔錯誤項目。 var aryReturnMessage = new ArrayList(); // Catch Error Message (Exception及MES判定錯誤訊息)。 var colResponseXML = new Collection(); do { try { // ParameterXX參數說明 // 01:Mail通知群組(GroupNo) // 02:分包筆數 // 03:手動重收時填上時間,如沒填則以log tableERP拋回的最後執行時間為主 // Parameter01為傳入參數,作為GroupNo,若無此值則不進行下面的程式 if (!(colParameters["Parameter01"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter01"])))) { strGroupNo = colParameters["Parameter01"].ToString().Trim(); } else { aryReturnMessage.Add(TranslateMsg("Mail GroupNo [%NOT SET%]([%PARAMETER01%])!", strLanguageMode, strResourceDir)); // ===== 2021/05/18 Elvis 92880 break; } // 分包筆數必須為數值型態,Add by KevinChang if (Information.IsNumeric(colParameters["Parameter02"])) { if (!(colParameters["Parameter02"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter02"])))) { // 每封包筆數不可小於500筆,Add by KevinChang if (Conversions.ToInteger(colParameters["Parameter02"]) < 500) { strPageSize = "500"; } else { strPageSize = colParameters["Parameter02"].ToString().Trim(); } } } // Parameter03為傳入參數,作為手動重收時填上時間,若無此值則以log tableERP拋回的最後執行時間為主 if (!(colParameters["Parameter03"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter03"])))) { strDate = GetDate(Conversions.ToString(colParameters["Parameter03"]), "Parameter03"); } else { // 20170316 edit liyujn strDate = GetERPTransactionDate(strServiceName); } // 取得erp資訊 if (!GetERPSetting(ref dtERPSetting, pEAIType: 1)) { aryReturnMessage.Add("Can not found EAI ERP Setting Info (EAI_TYPE = 1)!"); break; } var objResponse = new iMESCIO.SCI.ERP.Response_E10ICD.SCI_Response_department_get(); XmlNode xmlNodeCnt; string strCnt; string strTTcnt; bool chkStatus = true; // 抓取其它status為0之資料且塞入colResponseXML GetReTransData(strServiceName, ref colResponseXML); // 判斷『當前回傳筆數』=『應回傳筆數』時才代表為最後一次請求,執行後才進行後續動作 var objRequest = new iMESCIO.SCI.ERP.Request_E10ICD.SCI_Request_department_get(); objRequest.page_size = strPageSize; objRequest.data_time = strDate; objRequest.key_condition = ""; // ---- InXml ----- object argSCI_Object = objRequest; string argpRequestKey = "Null"; InXml = CombineRequestXMLbyCDO(ref argSCI_Object, dtERPSetting.Rows[0]["ERP_Name"].ToString(), "", strServiceName, pRequestKey: argpRequestKey); objRequest = (iMESCIO.SCI.ERP.Request_E10ICD.SCI_Request_department_get)argSCI_Object; int intloopTimes = 0; do { // 迴圈執行超過5次直接跳出迴圈並回傳錯誤訊息,Add By KevinChang if (intloopTimes >= 5) { throw new Exception("[%THE NUMBER OF SUBCONTRACTS IS SET TOO LITTLE TO CAUSE THE LOOP TO EXECUTE MORE THAN FIVE TIMES%]"); break; } OutXml = string.Empty; OutXml = LoadXmlFileForTest("department.get"); try { if (string.IsNullOrEmpty(OutXml)) { // ----- Call ERP Web Service ----- using (var ws = new iMESCore.Base.Invoke.wsERP_EAI.IntegrationEntry()) { ws.Url = ERP_URL; OutXml = ws.invokeSrv(InXml); } // 2017-05-03, Joe, 轉換單引號 OutXml = OutXml.Replace("'", "''"); OutXml = OutXml.Replace("'", "''"); } } catch (Exception ex) { OutXml = ex.Message; throw ex; } finally { // 需等到取得所有資料後,再處理後面之動作,故統一將請求完之ResponseXML放入容器內 colResponseXML.Add(OutXml); } XmlDoc.LoadXml(OutXml); // ----- 執行ERP交易完畢紀錄TransactionLog ----- string argstrException = null; modAutoRunLibrary.addTransactionLog(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPDepartmentBasis_E10ICD", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), "success", "ERP", strServiceName, strException: argstrException); // 將ERP拋回的資料轉成物件 objResponse.ParseXmlToObject(OutXml); if (objResponse.srvcode == null == false && objResponse.srvcode.Equals("000") && objResponse.code == null == false && objResponse.code.Equals("0")) { objRequest = new iMESCIO.SCI.ERP.Request_E10ICD.SCI_Request_department_get(); objRequest.data_time = objResponse.data_time; // 第二次後請求需為回傳之最後拋轉時間 objRequest.page_size = strPageSize; objRequest.key_condition = Strings.Replace(objResponse.key_condition, "''", "'"); // 第二次後代入從ERP收到之keyCondition object argSCI_Object1 = objRequest; string argpRequestKey1 = "Null"; InXml = CombineRequestXMLbyCDO(ref argSCI_Object1, dtERPSetting.Rows[0]["ERP_Name"].ToString(), "", strServiceName, pRequestKey: argpRequestKey1); objRequest = (iMESCIO.SCI.ERP.Request_E10ICD.SCI_Request_department_get)argSCI_Object1; xmlNodeCnt = XmlDoc.SelectSingleNode("/response/payload/param/data_response/datainfo/parameter/data"); strCnt = xmlNodeCnt.Attributes.GetNamedItem("cnt").Value; strTTcnt = xmlNodeCnt.Attributes.GetNamedItem("tt_cnt").Value; } else { chkStatus = false; aryReturnMessage.Add(OutXml); // 2017-06-26, Joe, 如是中台層的錯誤要往外拋 break; } intloopTimes += 1; } while ((strCnt ?? "") != (strTTcnt ?? "")); // 寫入log table TreatWriteLogTable(colResponseXML, strServiceName); // 寫入MES DB if (chkStatus) { foreach (string strOutXML in colResponseXML) { objResponse.ParseXmlToObject(strOutXML); if (WriteToMESDepartmentBasis_E10ICD(objResponse, ref aryReturnMessage) < 0) { if (aryReturnMessage.Count == 0) // 避免不明原因,執行FAIL又沒收集到項目. { aryReturnMessage.Add(strServiceName + ", 部門主檔拋轉執行失敗!!"); } } } } } catch (Exception EX_AUT) { aryReturnMessage.Add("EX_AUT.Exception" + '\n' + EX_AUT.Message.ToString()); OutXml = EX_AUT.Message.ToString(); results = "fail"; // 執行ERP交易完畢寫入Log string argstrException = null; modAutoRunLibrary.addTransactionLog_ErrorCode(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPDepartmentBasis_E10ICD", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), results, "ERP", strServiceName, LogClass: "AutoRun", strException: argstrException); } finally { // -------------------------------------------------- // 回傳執行結果:succces 或 fail(ReturnMessage) // -------------------------------------------------- if (aryReturnMessage.Count == 0) { funMESCallERPDepartmentBasis_E10ICDRet = "success"; results = "success"; } else { // 組合執行錯誤字串: Chr(10)分隔 strReturnMessage = ArrayList2String(ref aryReturnMessage); if ((strReturnMessage ?? "") == defString) { // 當錯誤字串組合失敗。補上 strReturnMessage = "ReturnMessage收集失敗!!"; } // tblMESAutoRunLog.ReturnMessage 長度4000限制. string strTemp = ""; if (strReturnMessage.Length > 4000) { // 自 strReturnMessage 中截取0-3991碼. strTemp = strReturnMessage.Substring(0, 3991) + "..."; } else { strTemp = strReturnMessage; } // 更新log table異常資訊 // Dim nodeID As XmlNode = XmlDoc.SelectSingleNode("/response/reqid") UpdateLogTableErrorInfo(colResponseXML, strServiceName, strTemp); // //fail; funMESCallERPDepartmentBasis_E10ICDRet = "fail;" + strTemp; } // ===manties:0095454 AutoRun addTransactionLog位置錯誤 需移至Finally 2021/07/06 // 執行ERP交易完畢寫入Log string argstrException = null; modAutoRunLibrary.addTransactionLog(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPDepartmentBasis_E10ICD", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), results, "ERP", strServiceName, strException: argstrException); // === //if (daTemp != null) // daTemp.Dispose(); if (drTemp != null) drTemp.Close(); } } while (false); // -------------------------------------------------- // 當執行失敗,寄送 Email。必須有設定參數一。 // -------------------------------------------------- IDbConnection argcnnTemp = null; try { if (aryReturnMessage.Count > 0 && Conversions.ToBoolean(Operators.ConditionalCompareObjectNotEqual(colParameters["Parameter01"], "", false))) { strSubject = "[AUT]部門主檔-基本資料抛轉失敗! "; strBody = Strings.Replace(strReturnMessage, Conversions.ToString('\n'), "
", Compare: CompareMethod.Text); argcnnTemp = CreateConnection(strConnectionString); // 寄送 Email if (ERP2MES_MailNotice(ref argcnnTemp, ref aryReturnMessage, strSubject, strGroupNo, CInput(strBody)) < 0) { // '寄送不成功, ReturnMessage 再增加1項. // 'ProductIntegration += Chr(10) & aryReturnMessage.Item(aryReturnMessage.Count - 1).ToString // 寄送不成功, ReturnMessage 再增加1項. // tblMESAutoRunLog.ReturnMessage 長度4000限制. if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(funMESCallERPDepartmentBasis_E10ICDRet.ToString().Length, 4000, false))) { string strTemp = ""; strTemp = strReturnMessage; if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(strTemp + aryReturnMessage[aryReturnMessage.Count - 1].ToString().Length, 4000, false))) { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); } else { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); // 自 strTemp 中截取0-3991碼. strTemp = strTemp.Substring(0, 3991) + "..."; } // //fail; funMESCallERPDepartmentBasis_E10ICDRet = "fail;" + strTemp; } } } } catch (Exception) { throw; } finally { CloseConnection(argcnnTemp); } return funMESCallERPDepartmentBasis_E10ICDRet; } private object funMESCallERPUserBasis_E10ICD(Collection colParameters = null) { object funMESCallERPUserBasis_E10ICDRet = default(object); var drTemp = default(DbDataReader); string strSQL; var XmlDoc = new XmlDocument(); //var daTemp = default(System.Data.OleDb.OleDbDataAdapter); var CollectionSQL = new Collection(); var colResponseXML = new Collection(); var arriveTime = DateTime.Now; string strServiceName = "user.get"; // =========================================================== // 宣告 AutoRunJob設定及執行記錄 變數 // =========================================================== string strParameter01 = ""; // 參數一,預設此功能fail通知EMAIL群組。 string strPageSize = "500"; // 參數二,分包筆數 string strDate; // 參數三,手動重收時填上時間,如沒填則以log tableERP拋回的最後執行時間為主 // AutorunJob拋轉資訊 string strReturnMessage = ""; // 錯誤訊息(tblMESAutoRunLog.ReturnMessage),Chr(10)分隔錯誤項目。 var aryReturnMessage = new ArrayList(); // Catch Error Message (Exception及MES判定錯誤訊息)。 string strSubject, strBody; // 寄送通知資訊 XmlNode node = null; string strReqid = ""; string strCnt = defString; string strTTcnt = ""; var datArriveTime = DateTime.Now; do { try { // Parameter01為傳入參數,作為SheetType,若無此值則不進行下面的程式 if (!(colParameters["Parameter01"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter01"])))) { strParameter01 = colParameters["Parameter01"].ToString().Trim(); } else { aryReturnMessage.Add(TranslateMsg("Mail GroupNo [%NOT SET%]([%PARAMETER01%])!", strLanguageMode, strResourceDir)); // ===== 2021/05/18 Elvis 92880 break; } // 分包筆數必須為數值型態,Add by KevinChang if (Information.IsNumeric(colParameters["Parameter02"])) { if (!(colParameters["Parameter02"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter02"])))) { // 每封包筆數不可小於500筆,Add by KevinChang if (Conversions.ToInteger(colParameters["Parameter02"]) < 500) { strPageSize = "500"; } else { strPageSize = colParameters["Parameter02"].ToString().Trim(); } } } // Parameter03為傳入參數,作為ProductionDate,若無此值則用昨天當日期 if (!(colParameters["Parameter03"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter03"])))) { strDate = GetDate(Conversions.ToString(colParameters["Parameter03"]), "Parameter03"); } else { // 20170316 edit liyujn strDate = GetERPTransactionDate(strServiceName); } // 取得erp資訊 if (!GetERPSetting(ref dtERPSetting, pEAIType: 1)) { aryReturnMessage.Add(TranslateMsg("[%PleaseCheck%] EAI ERP Setting Info [%CONFIGSETTING%]!", strLanguageMode, strResourceDir)); break; } var objResponse = new iMESCIO.SCI.ERP.Response_E10ICD.SCI_Response_user_get(); XmlNode xmlNodeCnt; bool chkStatus = true; // 抓取其它status為0之資料且塞入colResponseXML GetReTransData(strServiceName, ref colResponseXML); // 判斷『當前回傳筆數』=『應回傳筆數』時才代表為最後一次請求,執行後才進行後續動作 var objMaster = new iMESCIO.SCI.ERP.Request_E10ICD.SCI_Request_user_get(); objMaster.data_time = strDate; objMaster.page_size = strPageSize; objMaster.key_condition = ""; object argSCI_Object = objMaster; string argpRequestKey = "Null"; InXml = CombineRequestXMLbyCDO(ref argSCI_Object, dtERPSetting.Rows[0]["ERP_Name"].ToString(), "", "user.get", pRequestKey: argpRequestKey); objMaster = (iMESCIO.SCI.ERP.Request_E10ICD.SCI_Request_user_get)argSCI_Object; int intloopTimes = 0; do { // 迴圈執行超過5次直接跳出迴圈並回傳錯誤訊息,Add By KevinChang if (intloopTimes >= 5) { throw new Exception("[%THE NUMBER OF SUBCONTRACTS IS SET TOO LITTLE TO CAUSE THE LOOP TO EXECUTE MORE THAN FIVE TIMES%]"); break; } OutXml = string.Empty; OutXml = LoadXmlFileForTest(strServiceName); try { if (string.IsNullOrEmpty(OutXml)) { // ----- Call ERP Web Service ----- using (var ws = new iMESCore.Base.Invoke.wsERP_EAI.IntegrationEntry()) { ws.Url = ERP_URL; OutXml = ws.invokeSrv(InXml); } // 2017-05-03, Joe, 轉換單引號 OutXml = OutXml.Replace("'", "''"); OutXml = OutXml.Replace("'", "''"); } } catch (Exception ex) { OutXml = ex.Message; throw ex; } finally { // 需等到取得所有資料後,再處理後面之動作,故統一將請求完之ResponseXML放入容器內 colResponseXML.Add(OutXml); } XmlDoc.LoadXml(OutXml); string argstrException = null; modAutoRunLibrary.addTransactionLog(InXml, OutXml, DateTime.Now.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPUserBasis_E10ICD", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), "success", "ERP", strServiceName, strException: argstrException); // 將ERP拋回的資料轉成物件 objResponse.ParseXmlToObject(OutXml); if (objResponse.srvcode == null == false && objResponse.srvcode.Equals("000") && objResponse.code == null == false && objResponse.code.Equals("0")) { objMaster = new iMESCIO.SCI.ERP.Request_E10ICD.SCI_Request_user_get(); objMaster.data_time = objResponse.data_time; // 第二次後請求需為回傳之最後拋轉時間 objMaster.page_size = strPageSize; objMaster.key_condition = Strings.Replace(objResponse.key_condition, "''", "'"); // 第二次後代入從ERP收到之keyCondition object argSCI_Object1 = objMaster; string argpRequestKey1 = "Null"; InXml = CombineRequestXMLbyCDO(ref argSCI_Object1, dtERPSetting.Rows[0]["ERP_Name"].ToString(), "", "user.get", pRequestKey: argpRequestKey1); objMaster = (iMESCIO.SCI.ERP.Request_E10ICD.SCI_Request_user_get)argSCI_Object1; xmlNodeCnt = XmlDoc.SelectSingleNode("/response/payload/param/data_response/datainfo/parameter/data"); strCnt = xmlNodeCnt.Attributes.GetNamedItem("cnt").Value; strTTcnt = xmlNodeCnt.Attributes.GetNamedItem("tt_cnt").Value; } else { chkStatus = false; aryReturnMessage.Add(OutXml); // 2017-06-26, Joe, 如是中台層的錯誤要往外拋 break; } intloopTimes += 1; } while ((strCnt ?? "") != (strTTcnt ?? "")); // 寫入Log Table TreatWriteLogTable(colResponseXML, strServiceName); // 寫入MES DB if (chkStatus) { foreach (string strOutXML in colResponseXML) { objResponse.ParseXmlToObject(strOutXML); if (WriteUserBasis_E10ICD(objResponse, ref aryReturnMessage) < 0) { if (aryReturnMessage.Count == 0) // 避免不明原因,執行FAIL又沒收集到項目. { aryReturnMessage.Add(TranslateMsg("user_get, [%INVOKE FAIL%]!", strLanguageMode, strResourceDir)); } } } } } catch (Exception EX_AUT) { aryReturnMessage.Add("EX_AUT.Exception" + '\n' + EX_AUT.Message.ToString()); OutXml = EX_AUT.Message.ToString(); results = "fail"; // ----- 執行ERP交易完畢紀錄TransactionLog ----- string argstrException = null; modAutoRunLibrary.addTransactionLog_ErrorCode(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "MES", "MESCallERPUserBasis_E10ICD", Environment.MachineName, "AutoRun", arriveTime.ToString("yyyy/MM/dd HH:mm:ss"), results, "", "CreateMESCallERPUserBasis", LogClass: "AutoRun", strException: argstrException); // 2013/02/05, Hank, Send Email colParameters.Add(funMESCallERPUserBasis_E10ICDRet, "EmailBody"); SendJobFailEmail(colParameters); } finally { // -------------------------------------------------- // 回傳執行結果:succces 或 fail(ReturnMessage) // -------------------------------------------------- if (aryReturnMessage.Count == 0) { funMESCallERPUserBasis_E10ICDRet = "success"; results = "success"; } else { // 組合執行錯誤字串: Chr(10)分隔 strReturnMessage = ArrayList2String(ref aryReturnMessage); if ((strReturnMessage ?? "") == defString) { // 當錯誤字串組合失敗。補上 strReturnMessage = "ReturnMessage收集失敗!!"; } // tblMESAutoRunLog.ReturnMessage 長度4000限制. string strTemp = ""; if (strReturnMessage.Length > 4000) { // 自 strReturnMessage 中截取0-3991碼. strTemp = strReturnMessage.Substring(0, 3991) + "..."; } else { strTemp = strReturnMessage; } // 更新log table異常資訊 // Dim nodeID As XmlNode = XmlDoc.SelectSingleNode("/response/reqid") UpdateLogTableErrorInfo(colResponseXML, strServiceName, strTemp); // //fail; funMESCallERPUserBasis_E10ICDRet = CombineFailMsg("0000-999999", strTemp); } // ----- 執行ERP交易完畢紀錄TransactionLog ----- // ===manties:0095454 AutoRun addTransactionLog位置錯誤 需移至Finally 2021/07/06 string argstrException = null; modAutoRunLibrary.addTransactionLog(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "MES", "MESCallERPUserBasis_E10ICD", Environment.MachineName, "AutoRun", arriveTime.ToString("yyyy/MM/dd HH:mm:ss"), results, "", "CreateMESCallERPUserBasis", strException: argstrException); // === //if (daTemp != null) // daTemp.Dispose(); if (drTemp != null) drTemp.Close(); } } while (false); // 當執行失敗 寄送 Email 必須有設定參數一 IDbConnection argcnnTemp = null; try { if (aryReturnMessage.Count > 0 && Conversions.ToBoolean(Operators.ConditionalCompareObjectNotEqual(colParameters["Parameter01"], "", false))) { strSubject = "[AUT]使用者-基本資料抛轉失敗! "; strBody = Strings.Replace(strReturnMessage, Conversions.ToString('\n'), "
", Compare: CompareMethod.Text); argcnnTemp = CreateConnection(strConnectionString); // 寄送 Email if (ERP2MES_MailNotice(ref argcnnTemp, ref aryReturnMessage, strSubject, Conversions.ToString(colParameters["Parameter01"]), CInput(strBody)) < 0) { // '寄送不成功, ReturnMessage 再增加1項. // 'ProductIntegration += Chr(10) & aryReturnMessage.Item(aryReturnMessage.Count - 1).ToString // 寄送不成功, ReturnMessage 再增加1項. // tblMESAutoRunLog.ReturnMessage 長度4000限制. if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(funMESCallERPUserBasis_E10ICDRet.ToString().Length, 4000, false))) { string strTemp = ""; strTemp = strReturnMessage; if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(strTemp + aryReturnMessage[aryReturnMessage.Count - 1].ToString().Length, 4000, false))) { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); } else { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); // 自 strTemp 中截取0-3991碼. strTemp = strTemp.Substring(0, 3991) + "..."; } // //fail; funMESCallERPUserBasis_E10ICDRet = CombineFailMsg("0000-999999", strTemp); } } } } catch (Exception) { throw; } finally { CloseConnection(argcnnTemp); } return funMESCallERPUserBasis_E10ICDRet; } #endregion #region ---E10ICD to MES 處理Function--- private int WriteToMESCustomerBasis_E10ICD(iMESCIO.SCI.ERP.Response_E10ICD.SCI_Response_customer_get objResponse, ref ArrayList aryReturnMessage) { int WriteToMESCustomerBasis_E10ICDRet = default(int); WriteToMESCustomerBasis_E10ICDRet = -1; // Return -1:fail,0:Success // =========================================================== // 宣告 DB相關 變數 // =========================================================== var drTemp = default(DbDataReader); IDbConnection cnnMES = null; Collection colSQL_2MES = new Collection(), colSQL_2MES_Rows = new Collection(); // MES正式異動資料(主要). string strSQL; // 每筆中介交易記錄 string strIfWhereCond_PK; string strMES_Result; string strMES_MESSAGE; // 錯誤訊息(中介表.MES_MESSAGE),Chr(10)分隔錯誤項目。 var aryMES_Message = new ArrayList(); // 收集單筆中介交易記錄的錯誤記錄, Exception及MES判定錯誤訊息。 var datNow = DateTime.Now; // Now try { cnnMES = CreateConnection(strConnectionString); // 宣告拋轉資料使用變數 string strERP_CustomerNo, strERP_CustomerName, strERP_CustomerSName, str_ERPNo, strERP_status; // 預設值 int intIssueState = 0; // reset datNow = DateTime.Now; // Now strIfWhereCond_PK = ""; strMES_Result = "9"; // 預設值 9 (MES處理結果, 成功回寫1, 失敗回寫9). strMES_MESSAGE = ""; // 錯誤訊息 aryMES_Message.Clear(); colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); do { try { bool exitTry1 = false; for (int intRow = 0, loopTo = objResponse.customer_get.Count - 1; intRow <= loopTo; intRow++) { // ----------------------------------------------------------- // 取出各欄位資料 // ----------------------------------------------------------- strERP_CustomerNo = objResponse.customer_get[intRow].customer_no.ToString().Trim().ToUpper(); strERP_status = objResponse.customer_get[intRow].tran_status.ToString().Trim().ToUpper(); strERP_CustomerName = objResponse.customer_get[intRow].customer_name.Trim().ToUpper(); if (strERP_CustomerName == null || string.IsNullOrEmpty(strERP_CustomerName.Trim())) strERP_CustomerName = "N/A"; strERP_CustomerSName = objResponse.customer_get[intRow].customer_shortname; if (strERP_CustomerSName == null || string.IsNullOrEmpty(strERP_CustomerSName.Trim())) strERP_CustomerSName = strERP_CustomerName; str_ERPNo = objResponse.customer_get[intRow].customer_no.ToString().Trim(); // 檢查是否有此供應商設定 strSQL = "Select CustomerNo,IssueState From tblENTCustomerBasis " + " Where CustomerNo='" + strERP_CustomerNo + "'"; //cmmTemp = new IDbCommand(strSQL, cnnMES); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); bool exitTry = false; switch (strERP_status ?? "") { case "AU": // 有資料修改沒資料新增 { if (!drTemp.Read()) { intIssueState = 0; // ----------------------------------------------------------- // 新增MES客戶設定 // ----------------------------------------------------------- if (string.IsNullOrEmpty(strERP_CustomerNo)) { aryMES_Message.Add(TranslateMsg("[%CustomerNo%](customer_no):" + strERP_CustomerNo + " [%Is Empty%]! ", strLanguageMode, strResourceDir)); } else if (string.IsNullOrEmpty(strERP_CustomerName)) { aryMES_Message.Add(TranslateMsg("[%CustomerNo%](customer_no):" + strERP_CustomerNo + ",[%CustomerName%](customer_name),[%Is Empty%]! ", strLanguageMode, strResourceDir)); } else if (string.IsNullOrEmpty(strERP_CustomerSName)) { aryMES_Message.Add(TranslateMsg("[%CustomerNo%](customer_no):" + strERP_CustomerNo + ",[%CustomerSName%](customer_shortname),[%Is Empty%]! ", strLanguageMode, strResourceDir)); } else { strSQL = "Insert Into tblENTCustomerBasis " + "(CustomerNo,CustomerName,CustomerSName,IssueState,ERPNo," + " Creator,CreateDate)"; strSQL += " Values('" + strERP_CustomerNo + "','" + strERP_CustomerName + "','" + strERP_CustomerSName + "'," + intIssueState + ",'" + str_ERPNo + "','" + strERPCreator + "'," + "To_Date('" + Strings.Format(datNow, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'))"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } } else { // aryMES_Message.Add("客戶編號(customer_no):" & objReponse.customer_no & ", 已存在MES, 不允許新增!!") // ----------------------------------------------------------- // 修改MES客戶設定 // ----------------------------------------------------------- // 2017-06-02, Joe, 修改時如原狀態為-1變更為0,其他不異動 if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], -1, false))) { intIssueState = 0; } else { intIssueState = Conversions.ToInteger(drTemp["IssueState"]); } strSQL = "Update tblENTCustomerBasis Set " + " IssueState = " + intIssueState + ",CUSTOMERNAME = '" + strERP_CustomerName + "',CUSTOMERSNAME = '" + strERP_CustomerSName + "',ERPNo = '" + str_ERPNo + "'" + " Where CustomerNo='" + strERP_CustomerNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } drTemp.Close(); //cmmTemp.Dispose(); break; } case "D": // D:刪除 { if (drTemp.Read()) { if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], 0, false))) { // ----------------------------------------------------------- // 先刪除MES客戶相關設定 // ----------------------------------------------------------- // Del detail if (CustVendorIntegration_DelCustomer(ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_CustomerNo) < 0) { // GoTo lblExitTry_2_NextRow exitTry1 = exitTry = true; break; } } else { // ----------------------------------------------------------- // 作廢MES客戶設定 // ----------------------------------------------------------- strSQL = "Update tblENTCustomerBasis Set " + " IssueState=-1" + " Where CustomerNo='" + strERP_CustomerNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } } // aryMES_Message.Add(TranslateMsg("[%CustomerNo%] : " & strERP_CustomerNo & " [%IS NOT EXIST%]!")) // 刪除有可能會在資料庫中取不到資料,因為同一個交易還沒有commit; // ----------------------------------------------------------- // 先刪除MES客戶相關設定 // ----------------------------------------------------------- else if (CustVendorIntegration_DelCustomer(ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_CustomerNo) < 0) { // GoTo lblExitTry_2_NextRow exitTry1 = exitTry = true; break; } drTemp.Close(); break; } default: { aryMES_Message.Add(TranslateMsg("[%CustomerNo%](customer_no):" + strERP_CustomerNo + ",ERP [%Status%] : " + strERP_status + " [%INVALID%], [%IS NOT ALLOWED TO EXECUTE%]!", strLanguageMode, strResourceDir)); break; } } if (exitTry) { break; } } if (exitTry1) { break; } } catch (Exception EX_drIF) { strMES_Result = "9"; aryMES_Message.Add("EX_drIF.Exception" + '\n' + EX_drIF.Message); } finally { // =============================================================================== // 判定 MES_Result 處理結果 (成功回寫1, 失敗回寫9). // =============================================================================== if (aryMES_Message.Count == 0) { strMES_Result = "1"; // -------------------------------------------------- // MES資料庫異動 // -------------------------------------------------- if (colSQL_2MES.Count > 0) { ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colSQL_2MES, colSQL_2MES_Rows); } } // 組合執行錯誤字串: Chr(10)分隔 strMES_MESSAGE = ArrayList2String(ref aryMES_Message); // MES_Message長度4000限制, 截取0-3996碼加"...". if (strMES_MESSAGE.Length > 4000) strMES_MESSAGE = strMES_MESSAGE.Substring(0, 3996) + "..."; // ---取消前面收集SQL--- colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); // 當該筆交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 if (aryMES_Message.Count > 0) { foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); } } } while (false); // //return 0 : Success WriteToMESCustomerBasis_E10ICDRet = 0; } catch (Exception ex) { aryMES_Message.Add(ex.Message); // 當該筆中介交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); throw; } finally { if (drTemp != null) drTemp.Close(); CloseConnection(cnnMES); } return WriteToMESCustomerBasis_E10ICDRet; } private int WriteVendorBasis(iMESCIO.SCI.ERP.Response_E10ICD.SCI_Response_supplier_get objResponse, ref ArrayList aryReturnMessage) { int WriteVendorBasisRet = default(int); WriteVendorBasisRet = -1; // Return -1:fail,0:Success // =========================================================== // 宣告 DB相關 變數 // =========================================================== var drTemp = default(DbDataReader); IDbConnection cnnMES = null; var colSQL_2MES = new Collection(); // MES正式異動資料(主要). string strSQL; // 每筆中介交易記錄 string strIfWhereCond_PK; string strMES_Result; string strMES_MESSAGE; // 錯誤訊息(中介表.MES_MESSAGE),Chr(10)分隔錯誤項目。 var aryMES_Message = new ArrayList(); // 收集單筆中介交易記錄的錯誤記錄, Exception及MES判定錯誤訊息。 try { cnnMES = CreateConnection(strConnectionString); // 宣告拋轉資料使用變數 string strERP_VendorNo, strERP_VendorName, strERP_status, strErpNo; // 預設值 int intIssueState = 0; try { for (int intRow = 0, loopTo = objResponse.supplier_get.Count - 1; intRow <= loopTo; intRow++) { // ----------------------------------------------------------- // 取出各欄位資料 // ----------------------------------------------------------- strERP_VendorNo = objResponse.supplier_get[intRow].supplier_no.Trim().ToUpper(); strERP_status = objResponse.supplier_get[intRow].tran_status.Trim().ToUpper(); strErpNo = objResponse.supplier_get[intRow].supplier_no.Trim(); // 記錄原始之ERP編號 strERP_VendorName = objResponse.supplier_get[intRow].supplier_name.Trim(); strERP_VendorName = Conversions.ToString(Interaction.IIf(string.IsNullOrWhiteSpace(strERP_VendorName), "N/A", strERP_VendorName)); // 一、檢查是否有此物料供應商設定 strSQL = "Select VendorNo,IssueState From tblMTLMaterialVendor " + " Where VendorNo='" + strERP_VendorNo + "'"; //cmmTemp = new IDbCommand(strSQL, cnnMES); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); switch (strERP_status ?? "") { case "AU": // 有資料修改沒資料新增 { if (!drTemp.Read()) { intIssueState = 0; // 新增物料供應商 strSQL = "Insert Into tblMTLMaterialVendor (VendorNo,VendorName,IssueState,Description,Creator,CreateDate,ERPNo)"; strSQL += " Values('" + strERP_VendorNo + "','" + strERP_VendorName + "'," + intIssueState + ",'AutoRun建立','" + strERPCreator + "',To_Date('" + Strings.Format(DateTime.Now, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'), '" + strErpNo + "')"; colSQL_2MES.Add(strSQL); // 聯絡人資訊 var supplirLists = objResponse.supplier_get[intRow].supplier_detail; if (supplirLists != null) { foreach (iMESCIO.SCI.ERP.Response_E10ICD.SCI_supplier_detail detail in supplirLists) { string strContractorName = Conversions.ToString(Interaction.IIf(string.IsNullOrWhiteSpace(detail.contractor_name), "N/A", detail.contractor_name)); strSQL = "INSERT INTO TBLMTLMATERIALVENDORCONTACTOR (VENDORNO, CONTACTORNAME, TELNO, FAXNO, TITLE, ADDRESS, EMAIL, DESCRIPTION) VALUES "; strSQL += "('" + strERP_VendorNo + "', '" + strContractorName + "','" + detail.telephone_number + "','" + detail.fax_no + "','" + detail.title + "','" + detail.address + "','" + detail.email + "','" + detail.remark + "')"; colSQL_2MES.Add(strSQL); } } } else { // 2017-06-02, Joe, 修改時如原狀態為-1變更為0,其他不異動 if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], -1, false))) { intIssueState = 0; } else { intIssueState = Conversions.ToInteger(drTemp["IssueState"]); } // 修改MES物料供應商設定 strSQL = "Update tblMTLMaterialVendor Set IssueState = " + intIssueState + ", VendorName = '" + strERP_VendorName + "', ERPNo = '" + strErpNo + "' " + " Where VendorNo='" + strERP_VendorNo + "'"; colSQL_2MES.Add(strSQL); // 聯絡人資訊一律重新新增 colSQL_2MES.Add("DELETE FROM TBLMTLMATERIALVENDORCONTACTOR WHERE VendorNo='" + strERP_VendorNo + "'"); var supplirLists = objResponse.supplier_get[intRow].supplier_detail; if (supplirLists != null) { foreach (iMESCIO.SCI.ERP.Response_E10ICD.SCI_supplier_detail detail in supplirLists) { string strContractorName = Conversions.ToString(Interaction.IIf(string.IsNullOrWhiteSpace(detail.contractor_name), "N/A", detail.contractor_name)); strSQL = "INSERT INTO TBLMTLMATERIALVENDORCONTACTOR (VENDORNO, CONTACTORNAME, TELNO, FAXNO, TITLE, ADDRESS, EMAIL, DESCRIPTION) VALUES "; strSQL += "('" + strERP_VendorNo + "', '" + strContractorName + "','" + detail.telephone_number + "','" + detail.fax_no + "','" + detail.title + "','" + detail.address + "','" + detail.email + "','" + detail.remark + "')"; colSQL_2MES.Add(strSQL); } } } break; } case "D": // D:刪除 { if (drTemp.Read()) { if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], 0, false))) { // ----------------------------------------------------------- // 刪除MES物料供應商相關設定 // ----------------------------------------------------------- // 1. 刪除Contactor strSQL = "Delete From TBLMTLMATERIALVENDORCONTACTOR Where VendorNo='" + strERP_VendorNo + "'"; colSQL_2MES.Add(strSQL); // 2. 刪除物料供應商主檔 strSQL = "Delete From TBLMTLMATERIALVENDOR Where VendorNo ='" + strERP_VendorNo + "'"; colSQL_2MES.Add(strSQL); } else { // ----------------------------------------------------------- // 作廢MES供應商設定 // ----------------------------------------------------------- strSQL = "Update TBLMTLMATERIALVENDOR Set IssueState=-1 Where VendorNo='" + strERP_VendorNo + "'"; colSQL_2MES.Add(strSQL); } } else { // 刪除有可能會在資料庫中取不到資料,因為同一個交易還沒有commit; // 刪除MES物料供應商相關設定 // ----------------------------------------------------------- // 1. 刪除Contactor strSQL = "Delete From TBLMTLMATERIALVENDORCONTACTOR Where VendorNo='" + strERP_VendorNo + "'"; colSQL_2MES.Add(strSQL); // 2. 刪除物料供應商主檔 strSQL = "Delete From TBLMTLMATERIALVENDOR Where VendorNo ='" + strERP_VendorNo + "'"; colSQL_2MES.Add(strSQL); } break; } } drTemp.Close(); //cmmTemp.Dispose(); // 二、檢查是否有此設備供應商設定 strSQL = "Select VendorNo,IssueState From TBLEQPVENDOR Where VendorNo='" + strERP_VendorNo + "'"; //cmmTemp = new IDbCommand(strSQL, cnnMES); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); switch (strERP_status ?? "") { case "AU": // 有資料修改沒資料新增 { if (!drTemp.Read()) { intIssueState = 0; // 新增設備供應商 strSQL = "Insert Into TBLEQPVENDOR (VendorNo,VendorName,IssueState,Description,Creator,CreateDate,ERPNo)"; strSQL += " Values('" + strERP_VendorNo + "','" + strERP_VendorName + "'," + intIssueState + ",'AutoRun建立','" + strERPCreator + "',To_Date('" + Strings.Format(DateTime.Now, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'), '" + strErpNo + "')"; colSQL_2MES.Add(strSQL); // 聯絡人資訊 var supplirLists = objResponse.supplier_get[intRow].supplier_detail; if (supplirLists != null) { foreach (iMESCIO.SCI.ERP.Response_E10ICD.SCI_supplier_detail detail in supplirLists) { string strContractorName = Conversions.ToString(Interaction.IIf(string.IsNullOrWhiteSpace(detail.contractor_name), "N/A", detail.contractor_name)); strSQL = "INSERT INTO TBLEQPVENDORCONTACTOR (VENDORNO, CONTACTORNAME, TELNO, FAXNO, TITLE, ADDRESS, EMAIL, DESCRIPTION) VALUES "; strSQL += "('" + strERP_VendorNo + "', '" + strContractorName + "','" + detail.telephone_number + "','" + detail.fax_no + "','" + detail.title + "','" + detail.address + "','" + detail.email + "','" + detail.remark + "')"; colSQL_2MES.Add(strSQL); } } } else { // 2017-06-02, Joe, 修改時如原狀態為-1變更為0,其他不異動 if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], -1, false))) { intIssueState = 0; } else { intIssueState = Conversions.ToInteger(drTemp["IssueState"]); } // 修改MES設備供應商設定 strSQL = "Update TBLEQPVENDOR Set IssueState = " + intIssueState + ", VendorName = '" + strERP_VendorName + "' " + " Where VendorNo='" + strERP_VendorNo + "'"; colSQL_2MES.Add(strSQL); // 聯絡人資訊一律重新新增 colSQL_2MES.Add("DELETE FROM TBLEQPVENDORCONTACTOR WHERE VendorNo='" + strERP_VendorNo + "'"); var supplirLists = objResponse.supplier_get[intRow].supplier_detail; if (supplirLists != null) { foreach (iMESCIO.SCI.ERP.Response_E10ICD.SCI_supplier_detail detail in supplirLists) { string strContractorName = Conversions.ToString(Interaction.IIf(string.IsNullOrWhiteSpace(detail.contractor_name), "N/A", detail.contractor_name)); strSQL = "INSERT INTO TBLEQPVENDORCONTACTOR (VENDORNO, CONTACTORNAME, TELNO, FAXNO, TITLE, ADDRESS, EMAIL, DESCRIPTION) VALUES "; strSQL += "('" + strERP_VendorNo + "', '" + strContractorName + "','" + detail.telephone_number + "','" + detail.fax_no + "','" + detail.title + "','" + detail.address + "','" + detail.email + "','" + detail.remark + "')"; colSQL_2MES.Add(strSQL); } } } break; } case "D": { if (drTemp.Read()) { if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], 0, false))) { // ----------------------------------------------------------- // 刪除MES設備供應商相關設定 // ----------------------------------------------------------- // 1. 刪除Contactor strSQL = "Delete From TBLEQPVENDORCONTACTOR Where VendorNo='" + strERP_VendorNo + "'"; colSQL_2MES.Add(strSQL); // 2. 刪除設備供應商主檔 strSQL = "Delete From TBLEQPVENDOR Where VendorNo ='" + strERP_VendorNo + "'"; colSQL_2MES.Add(strSQL); } else { // ----------------------------------------------------------- // 作廢MES供應商設定 // ----------------------------------------------------------- strSQL = "Update TBLEQPVENDOR Set IssueState=-1 Where VendorNo='" + strERP_VendorNo + "'"; colSQL_2MES.Add(strSQL); } } else { // 刪除有可能會在資料庫中取不到資料,因為同一個交易還沒有commit; // 刪除MES設備供應商相關設定 // ----------------------------------------------------------- // 1. 刪除Contactor strSQL = "Delete From TBLEQPVENDORCONTACTOR Where VendorNo='" + strERP_VendorNo + "'"; colSQL_2MES.Add(strSQL); // 2. 刪除設備供應商主檔 strSQL = "Delete From TBLEQPVENDOR Where VendorNo ='" + strERP_VendorNo + "'"; colSQL_2MES.Add(strSQL); } break; } } drTemp.Close(); //cmmTemp.Dispose(); // 三、檢查是否有此外包商設定 strSQL = "Select SUBCONTRACTORNO,IssueState From TBLENTSUBCONTRACTOR Where SUBCONTRACTORNO='" + strERP_VendorNo + "'"; //cmmTemp = new IDbCommand(strSQL, cnnMES); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); switch (strERP_status ?? "") { case "AU": // 有資料修改沒資料新增 { if (!drTemp.Read()) { intIssueState = 0; // 新增外包商 strSQL = "Insert Into TBLENTSUBCONTRACTOR (SUBCONTRACTORNO,SUBCONTRACTORNAME,IssueState,Description,Creator,CreateDate,ERPNo)"; strSQL += " Values('" + strERP_VendorNo + "','" + strERP_VendorName + "'," + intIssueState + ",'AutoRun建立','" + strERPCreator + "',To_Date('" + Strings.Format(DateTime.Now, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'), '" + strErpNo + "')"; colSQL_2MES.Add(strSQL); // 聯絡人資訊 var supplirLists = objResponse.supplier_get[intRow].supplier_detail; if (supplirLists != null) { foreach (iMESCIO.SCI.ERP.Response_E10ICD.SCI_supplier_detail detail in supplirLists) { string strContractorName = Conversions.ToString(Interaction.IIf(string.IsNullOrWhiteSpace(detail.contractor_name), "N/A", detail.contractor_name)); strSQL = "INSERT INTO TBLENTSUBCONTRACTORCONT (SUBCONTRACTORNO, CONTACTORNAME, TELNO, FAXNO, TITLE, ADDRESS, EMAIL, DESCRIPTION) VALUES "; strSQL += "('" + strERP_VendorNo + "', '" + strContractorName + "','" + detail.telephone_number + "','" + detail.fax_no + "','" + detail.title + "','" + detail.address + "','" + detail.email + "','" + detail.remark + "')"; colSQL_2MES.Add(strSQL); } } } else { // 2017-06-02, Joe, 修改時如原狀態為-1變更為0,其他不異動 if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], -1, false))) { intIssueState = 0; } else { intIssueState = Conversions.ToInteger(drTemp["IssueState"]); } // 修改MES外包商設定 strSQL = "Update TBLENTSUBCONTRACTOR Set IssueState = " + intIssueState + ", SUBCONTRACTORNAME = '" + strERP_VendorName + "' " + " Where SUBCONTRACTORNO='" + strERP_VendorNo + "'"; colSQL_2MES.Add(strSQL); // 聯絡人資訊一律重新新增 colSQL_2MES.Add("DELETE FROM TBLENTSUBCONTRACTORCONT WHERE SUBCONTRACTORNO='" + strERP_VendorNo + "'"); // 聯絡人資訊 var supplirLists = objResponse.supplier_get[intRow].supplier_detail; if (supplirLists != null) { foreach (iMESCIO.SCI.ERP.Response_E10ICD.SCI_supplier_detail detail in supplirLists) { string strContractorName = Conversions.ToString(Interaction.IIf(string.IsNullOrWhiteSpace(detail.contractor_name), "N/A", detail.contractor_name)); strSQL = "INSERT INTO TBLENTSUBCONTRACTORCONT (SUBCONTRACTORNO, CONTACTORNAME, TELNO, FAXNO, TITLE, ADDRESS, EMAIL, DESCRIPTION) VALUES "; strSQL += "('" + strERP_VendorNo + "', '" + strContractorName + "','" + detail.telephone_number + "','" + detail.fax_no + "','" + detail.title + "','" + detail.address + "','" + detail.email + "','" + detail.remark + "')"; colSQL_2MES.Add(strSQL); } } } break; } case "D": { if (drTemp.Read()) { if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], 0, false))) { // ----------------------------------------------------------- // 刪除MES外包商相關設定 // ----------------------------------------------------------- // 1. 刪除Contactor strSQL = "Delete From TBLENTSUBCONTRACTORCONT Where SUBCONTRACTORNO='" + strERP_VendorNo + "'"; colSQL_2MES.Add(strSQL); // 2. 刪除外包商主檔 strSQL = "Delete From TBLENTSUBCONTRACTOR Where SUBCONTRACTORNO ='" + strERP_VendorNo + "'"; colSQL_2MES.Add(strSQL); } else { // ----------------------------------------------------------- // 作廢MES供應商設定 // ----------------------------------------------------------- strSQL = "Update TBLENTSUBCONTRACTOR Set IssueState=-1 Where SUBCONTRACTORNO='" + strERP_VendorNo + "'"; colSQL_2MES.Add(strSQL); } } else { // 刪除有可能會在資料庫中取不到資料,因為同一個交易還沒有commit; // ----------------------------------------------------------- // 刪除MES外包商相關設定 // ----------------------------------------------------------- // 1. 刪除Contactor strSQL = "Delete From TBLENTSUBCONTRACTORCONT Where SUBCONTRACTORNO='" + strERP_VendorNo + "'"; colSQL_2MES.Add(strSQL); // 2. 刪除外包商主檔 strSQL = "Delete From TBLENTSUBCONTRACTOR Where SUBCONTRACTORNO ='" + strERP_VendorNo + "'"; colSQL_2MES.Add(strSQL); } break; } } drTemp.Close(); //cmmTemp.Dispose(); } } catch (Exception ex) { strMES_Result = "9"; aryMES_Message.Add("Exception" + '\n' + ex.Message); } finally { // =============================================================================== // 判定 MES_Result 處理結果 (成功回寫1, 失敗回寫9). // =============================================================================== if (aryMES_Message.Count == 0) { strMES_Result = "1"; // -------------------------------------------------- // MES資料庫異動 // -------------------------------------------------- if (colSQL_2MES.Count > 0) { ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, colSQL_2MES); } } // 組合執行錯誤字串: Chr(10)分隔 strMES_MESSAGE = ArrayList2String(ref aryMES_Message); // MES_Message長度4000限制, 截取0-3996碼加"...". if (strMES_MESSAGE.Length > 4000) strMES_MESSAGE = strMES_MESSAGE.Substring(0, 3996) + "..."; // ---取消前面收集SQL--- colSQL_2MES.Clear(); // 當該筆交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 if (aryMES_Message.Count > 0) { foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); } } // //return 0 : Success WriteVendorBasisRet = 0; } catch (Exception ex) { aryMES_Message.Add(ex.Message); // 當該筆中介交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); throw; } finally { if (drTemp != null) drTemp.Close(); CloseConnection(cnnMES); } return WriteVendorBasisRet; } private int WriteEquipmentBasis_E10ICD(ref iMESCIO.SCI.ERP.Response_E10ICD.SCI_Response_machine_get objResponse, ref ArrayList aryReturnMessage) { int WriteEquipmentBasis_E10ICDRet = default(int); WriteEquipmentBasis_E10ICDRet = -1; // Return -1:fail,0:Success // =========================================================== // 宣告 DB相關 變數 // =========================================================== var drTemp = default(DbDataReader); IDbConnection cnnMES = null; Collection colSQL_2MES = new Collection(), colSQL_2MES_Rows = new Collection(); // MES正式異動資料(主要). string strSQL; // 每筆中介交易記錄 string strIfWhereCond_PK; string strMES_Result; string strMES_MESSAGE; // 錯誤訊息(中介表.MES_MESSAGE),Chr(10)分隔錯誤項目。 var aryMES_Message = new ArrayList(); // 收集單筆中介交易記錄的錯誤記錄, Exception及MES判定錯誤訊息。 var aryEquipmentType = new ArrayList(); // 記錄是否已新增過 try { cnnMES = CreateConnection(strConnectionString); // 宣告拋轉資料使用變數 string strERP_EQPNo, strERP_EQPType, strERP_ResType, strERP_AssetNo, strERP_Description, strERP_status, strERP_MaxTime, strErpNo, strErp_EquipmentName, strErp_SupplierNo; // 預設值 int intIssueState = 0; do { try { bool exitTry1 = false; for (int intRow = 0, loopTo = objResponse.machine_get.Count - 1; intRow <= loopTo; intRow++) { // ----------------------------------------------------------- // 取出各欄位資料 // ----------------------------------------------------------- strERP_EQPNo = objResponse.machine_get[intRow].machine_no.Trim().ToUpper(); strErpNo = objResponse.machine_get[intRow].machine_no.Trim(); // 記錄原始之ERP編號 // 2017.03.01 崑源,設備類型依舊有整合方式,寫死為"EQPTYPE"且判斷ERP傳來的資源類型若為0、1或未傳時再處理 // 20170324 edit lijyun↓ // strERP_ResType = objResponse.machine_get(intRow).resource_type.Trim if (objResponse.machine_get[intRow].resource_type == null) { strERP_ResType = ""; } else { strERP_ResType = objResponse.machine_get[intRow].resource_type.Trim(); } // 20170324 edit lijyun↑ strERP_EQPType = "EQPTYPE"; if (!string.IsNullOrWhiteSpace(strERP_ResType)) { if (!(strERP_ResType.Equals("0") | strERP_ResType.Equals("1"))) { continue; } } // 20170324 edit lijyun↓ // strERP_AssetNo = objResponse.machine_get(intRow).belongings_no.Trim.ToUpper if (objResponse.machine_get[intRow].belongings_no == null) { strERP_AssetNo = ""; } else { strERP_AssetNo = objResponse.machine_get[intRow].belongings_no.Trim().ToUpper(); } // 20170324 edit lijyun↑ strERP_status = objResponse.machine_get[intRow].tran_status.Trim().ToUpper(); strERP_Description = objResponse.machine_get[intRow].remark.Trim(); // 20170316 edit lijyun↓ if (objResponse.machine_get[intRow].machine_capacity == null) { strERP_MaxTime = ""; } else { strERP_MaxTime = objResponse.machine_get[intRow].machine_capacity.Trim(); double tmpValue; tmpValue = double.Parse(strERP_MaxTime); if (tmpValue < 1.0d | tmpValue > 24.0d) { strERP_MaxTime = "1"; } } // 20170316 edit lijyun↑ // 2017/02/22 modi KY:新增『設備名稱』及『設備供應商』欄位 strErp_EquipmentName = objResponse.machine_get[intRow].machine_name.Trim(); if (objResponse.machine_get[intRow].supplier_no == null) { strErp_SupplierNo = "N/A"; } else if (string.IsNullOrEmpty(objResponse.machine_get[intRow].supplier_no.Trim())) { strErp_SupplierNo = "N/A"; } else { strErp_SupplierNo = objResponse.machine_get[intRow].supplier_no.Trim().ToUpper(); } // ----------------------------------------------------------- // 固定檢查EquipmnetTyp資料,若不存在則自動新增。 // ----------------------------------------------------------- // 20170314 edit lijyun↓ // If AddEquipmentType(cnnMES, colSQL_2MES, colSQL_2MES_Rows, aryMES_Message, strERP_EQPType, strERPCreator, DateTime.Now, "AutoRun建立") < 0 Then Exit Try if (aryEquipmentType.IndexOf(strERP_EQPType) == -1) { if (AddEquipmentType(ref cnnMES, ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_EQPType, strERPCreator, DateTime.Now, "AutoRun建立") < 0) { exitTry1 = true; break; } else { aryEquipmentType.Add(strERP_EQPType); } } // 20170314 edit lijyun↑ // 檢查是否有此作業站設定 strSQL = "Select EquipmentNo,IssueState From tblEQPEquipmentBasis " + " Where EquipmentNo='" + strERP_EQPNo + "'"; //cmmTemp = new IDbCommand(strSQL, cnnMES); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); bool exitTry = false; switch (strERP_status ?? "") { case "AU": // 有資料修改沒資料新增 { if (!drTemp.Read()) { intIssueState = 0; // ----------------------------------------------------------- // 新增MES設備主檔設定 // ----------------------------------------------------------- // 2017-05-31, Add EquipmentClass預設為GENERAL // 2017-06-02, Joe, LoadPort預設為-1 strSQL = "Insert Into tblEQPEquipmentBasis " + "(EquipmentNo,EquipmentType,Capacity," + "EngineerGroupNo,LoadPort," + "AutoFlag,Eacontroller,EQPRecipe," + "IssueState,Creator,CreateDate,ERPNo,EquipmentName," + "EquipmentClass "; if (!string.IsNullOrEmpty(strERP_AssetNo)) { strSQL += ",AssetNo"; } if (!string.IsNullOrEmpty(strERP_Description)) { strSQL += ",Description"; } if (!string.IsNullOrEmpty(strERP_MaxTime)) { strSQL += ",MaxTime"; } if (!string.IsNullOrEmpty(strErp_SupplierNo)) { strSQL += ",VendorNo"; } strSQL += ")"; strSQL += " Values('" + strERP_EQPNo + "','" + strERP_EQPType + "',-1," + "'N/A',-1,0,'N/A',0," + intIssueState + ",'" + strERPCreator + "'," + "To_Date('" + Strings.Format(DateTime.Now, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'), '" + strErpNo + "', '" + strErp_EquipmentName + "' " + ",'GENERAL' "; if (!string.IsNullOrEmpty(strERP_AssetNo)) { strSQL += ",'" + strERP_AssetNo + "'"; } if (!string.IsNullOrEmpty(strERP_Description)) { strSQL += ",'" + strERP_Description + "'"; } if (!string.IsNullOrEmpty(strERP_MaxTime)) { strSQL += ",'" + strERP_MaxTime + "'"; } if (!string.IsNullOrEmpty(strErp_SupplierNo)) { strSQL += ",'" + strErp_SupplierNo + "'"; } strSQL += ")"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } else { // ----------------------------------------------------------- // 修改MES設備設定 // ----------------------------------------------------------- // 2017-06-02, Joe, 修改時如原狀態為-1變更為0,其他不異動 if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], -1, false))) { intIssueState = 0; } else { intIssueState = Conversions.ToInteger(drTemp["IssueState"]); } // 2019/07/22 Eric 當ERP未傳入machine_capacity,不更新欄位MaxTime if (string.IsNullOrEmpty(strERP_MaxTime)) { strSQL = "Update tblEQPEquipmentBasis Set IssueState = " + intIssueState + ",EquipmentType = '" + strERP_EQPType + "',AssetNo = '" + strERP_AssetNo + "'" + ",Description='" + strERP_Description + "', EquipmentName ='" + strErp_EquipmentName + "' " + ",ERPNo = '" + strErpNo + "'" + " Where EquipmentNo='" + strERP_EQPNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } else { strSQL = "Update tblEQPEquipmentBasis Set IssueState = " + intIssueState + ",EquipmentType = '" + strERP_EQPType + "',AssetNo = '" + strERP_AssetNo + "'" + ",Description='" + strERP_Description + "', MaxTime = '" + strERP_MaxTime + "', EquipmentName ='" + strErp_EquipmentName + "' " + ",ERPNo = '" + strErpNo + "'" + " Where EquipmentNo='" + strERP_EQPNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } } drTemp.Close(); //cmmTemp.Dispose(); break; } case "D": // D:刪除 { if (drTemp.Read()) { if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], 0, false))) { // ----------------------------------------------------------- // 先刪除MES產品相關設定 // ----------------------------------------------------------- if (ResourcesIntegration_DelEquipment(ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_EQPNo) < 0) { exitTry1 = exitTry = true; break; } } else { // ----------------------------------------------------------- // 作廢MES產品設定 // ----------------------------------------------------------- strSQL = "Update tblEQPEquipmentBasis Set " + " IssueState = -1" + " Where EquipmentNo='" + strERP_EQPNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } } // aryMES_Message.Add(TranslateMsg("[%EQUIPMENTNO%](machine_no): " & strERP_EQPNo & ", [%IS NOT EXIST%], [%NOT ALLOW TO DELETE%]!!")) // 刪除有可能會在資料庫中取不到資料,因為同一個交易還沒有commit; // ----------------------------------------------------------- // 先刪除MES產品相關設定 // ----------------------------------------------------------- else if (ResourcesIntegration_DelEquipment(ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_EQPNo) < 0) { exitTry1 = exitTry = true; break; } drTemp.Close(); //cmmTemp.Dispose(); break; } default: { aryMES_Message.Add(TranslateMsg("[%EQUIPMENTNO%](machine_no): " + strERP_EQPNo + ", [%TRANSTATUS%](tran_status):" + strERP_status + " [%INVALID%], [%NOT ALLOWED TO EXECUTE%]!!", strLanguageMode, strResourceDir)); break; } } if (exitTry) { break; } } if (exitTry1) { break; } } catch (Exception ex) { strMES_Result = "9"; aryMES_Message.Add("Exception" + '\n' + ex.Message); } finally { // =============================================================================== // 判定 MES_Result 處理結果 (成功回寫1, 失敗回寫9). // =============================================================================== if (aryMES_Message.Count == 0) { strMES_Result = "1"; // MES資料庫異動 if (colSQL_2MES.Count > 0) { ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colSQL_2MES, colSQL_2MES_Rows); } } // 組合執行錯誤字串: Chr(10)分隔 strMES_MESSAGE = ArrayList2String(ref aryMES_Message); // MES_Message長度4000限制, 截取0-3996碼加"...". if (strMES_MESSAGE.Length > 4000) strMES_MESSAGE = strMES_MESSAGE.Substring(0, 3996) + "..."; // ---取消前面收集SQL--- colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); // 當該筆交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 if (aryMES_Message.Count > 0) { foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); } } } while (false); // //return 0 : Success WriteEquipmentBasis_E10ICDRet = 0; } catch (Exception ex) { aryMES_Message.Add(ex.Message); // 當該筆中介交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); throw; } finally { if (drTemp != null) drTemp.Close(); CloseConnection(cnnMES); } return WriteEquipmentBasis_E10ICDRet; } private int WriteToMESInventoryBasis_E10ICD(iMESCIO.SCI.ERP.Response_E10ICD.SCI_Response_warehouse_get objResponse, ref ArrayList aryReturnMessage) { int WriteToMESInventoryBasis_E10ICDRet = default(int); WriteToMESInventoryBasis_E10ICDRet = -1; // Return -1:fail,0:Success // =========================================================== // 宣告 DB相關 變數 // =========================================================== var drTemp = default(DbDataReader); IDbConnection cnnMES = null; Collection colSQL_2MES = new Collection(), colSQL_2MES_Rows = new Collection(); // MES正式異動資料(主要). string strSQL; //System.Data.OleDb.OleDbDataAdapter daSMD; DataSet dsSMD; // 每筆中介交易記錄 string strIfWhereCond_PK; string strMES_Result; string strMES_MESSAGE; // 錯誤訊息(中介表.MES_MESSAGE),Chr(10)分隔錯誤項目。 var aryMES_Message = new ArrayList(); // 收集單筆中介交易記錄的錯誤記錄, Exception及MES判定錯誤訊息。 var datNow = DateTime.Now; // Now var aryFactoryNo = new ArrayList(); // 記錄是否新增過工廠編號 try { cnnMES = CreateConnection(strConnectionString); // 宣告拋轉資料使用變數 string strERP_INVNo, strERP_INVName, strERP_FactoryNo, strERP_WarehouseType, str_ERPNo, strERP_status; // 預設值 int intIssueState = 0; // reset datNow = DateTime.Now; // Now strIfWhereCond_PK = ""; strMES_Result = "9"; // 預設值 9 (MES處理結果, 成功回寫1, 失敗回寫9). strMES_MESSAGE = ""; // 錯誤訊息 strERP_WarehouseType = ""; // 預設為空 aryMES_Message.Clear(); colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); do { try { bool exitTry1 = false; for (int intRow = 0, loopTo = objResponse.warehouse_get.Count - 1; intRow <= loopTo; intRow++) { // ----------------------------------------------------------- // 取出各欄位資料 // ----------------------------------------------------------- strERP_INVNo = objResponse.warehouse_get[intRow].warehouse_no.ToString().Trim().ToUpper(); strERP_FactoryNo = objResponse.warehouse_get[intRow].factory_no.ToString().Trim().ToUpper(); if (objResponse.warehouse_get[intRow].warehouse_name == null || string.IsNullOrEmpty(objResponse.warehouse_get[intRow].warehouse_name.ToString().Trim())) { strERP_INVName = "N/A"; } else { strERP_INVName = objResponse.warehouse_get[intRow].warehouse_name.ToString().Trim().ToUpper(); } strERP_status = objResponse.warehouse_get[intRow].tran_status.ToString().Trim().ToUpper(); if (string.IsNullOrEmpty(objResponse.warehouse_get[intRow].warehouse_type) || string.IsNullOrEmpty(strERP_WarehouseType.ToString().Trim())) { strERP_WarehouseType = 1.ToString(); } else { strERP_WarehouseType = objResponse.warehouse_get[intRow].warehouse_type.ToString().Trim().ToUpper(); } str_ERPNo = objResponse.warehouse_get[intRow].warehouse_no.ToString().Trim(); // 20170313 edit lijyun↓ // 檢查是否有此工廠編號 // strSQL = "Select * From tblSMDFactoryBasis Where FactoryNo Is Not Null " & // " And FactoryNo = '" & objResponse.warehouse_get(intRow).factory_no & "'" // cmmTemp = New OleDb.OleDbCommand(strSQL, cnnMES) // drTemp = ExecuteSQLQuery_Reader // If String.IsNullOrEmpty(strERP_FactoryNo) Then // aryMES_Message.Add(TranslateMsg("ERP[%FactoryNo%](factory_no):" & strERP_FactoryNo & " [%Is Empty%]!")) // Exit For // Else // If Not drTemp.Read Then // strSQL = "Insert Into tblSMDFactoryBasis " & // "(FactoryNo,Description,FabCode," & // "IssueState,Creator,CreateDate)" // strSQL += " Values('" & objResponse.warehouse_get(intRow).factory_no & "','','',2,'" & strERPCreator & "'," & // "To_Date('" & Format(datNow, "yyyy/MM/dd H:mm:ss") & "','YYYY/MM/DD HH24:MI:SS'))" // Call ExecuteSQLNoneQuery(strDataBaseType, strConnectionString, strSQL) // End If // drTemp.Close() // cmmTemp.Dispose() // End If // ----------------------------------------------------------- // 固定檢查FactoryBasis資料,若不存在則自動新增。 // ----------------------------------------------------------- if (aryFactoryNo.IndexOf(strERP_FactoryNo) == -1) { if (AddFactoryNo(ref cnnMES, ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_FactoryNo, strERPCreator, DateTime.Now, "AutoRun建立") < 0) { exitTry1 = true; break; } else { aryFactoryNo.Add(strERP_FactoryNo); } } // 20170313 edit lijyun↑ // 檢查是否有此庫房設定 strSQL = "Select InventoryNo,IssueState From tblINVInventoryBasis " + " Where InventoryNo='" + strERP_INVNo + "'"; //cmmTemp = new IDbCommand(strSQL, cnnMES); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); bool exitTry = false; switch (strERP_status ?? "") { case "AU": // 有資料修改沒資料新增 { if (!drTemp.Read()) { intIssueState = 0; // ----------------------------------------------------------- // 新增MES庫房設定 // ----------------------------------------------------------- if (string.IsNullOrEmpty(strERP_INVNo)) { aryMES_Message.Add(TranslateMsg("[%InventoryNo%](warehouse_no):" + strERP_INVNo + " [%Is Empty%]!", strLanguageMode, strResourceDir)); } else if (string.IsNullOrEmpty(strERP_INVName)) { aryMES_Message.Add(TranslateMsg("[%InventoryNo%](warehouse_no):" + strERP_INVNo + ",[%InventoryName%](warehouse_name):" + strERP_INVName + " [%Is Empty%]!", strLanguageMode, strResourceDir)); } else if (string.IsNullOrEmpty(strERP_FactoryNo)) { aryMES_Message.Add(TranslateMsg("[%InventoryNo%](warehouse_no):" + strERP_INVNo + ",ERP[%FactoryNo%](factory_no):" + strERP_FactoryNo + " [%Is Empty%]!", strLanguageMode, strResourceDir)); } else { strSQL = "Insert Into tblINVInventoryBasis " + "(InventoryNo,InventoryName,InventoryType,InventoryClass,FactoryNo," + "IssueState,ERPNO,Creator,CreateDate)"; strSQL += " Values('" + strERP_INVNo + "','" + strERP_INVName + "','" + strERP_WarehouseType + "',0,'" + strERP_FactoryNo + "'," + intIssueState + ",'" + str_ERPNo + "','" + strERPCreator + "'," + "To_Date('" + Strings.Format(datNow, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'))"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } } else { // aryMES_Message.Add("庫房編號(inaa001):" & strERP_INVNo & ", 已存在MES, 不允許新增!!") // ERPws標準功能不論IssueState為何皆允許修改. // ----------------------------------------------------------- // 修改MES庫房設定 // ----------------------------------------------------------- // 2017-06-02, Joe, 修改時如原狀態為-1變更為0,其他不異動 if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], -1, false))) { intIssueState = 0; } else { intIssueState = Conversions.ToInteger(drTemp["IssueState"]); } strSQL = "Update tblINVInventoryBasis Set " + " IssueState = " + intIssueState + " ,INVENTORYNAME = '" + strERP_INVName + "'" + " ,FACTORYNO = '" + strERP_FactoryNo + "'" + " ,ERPNo = '" + str_ERPNo + "'"; // 2017/05/22 KunYuan:倉庫類型修改時暫不處理 // If strERP_WarehouseType <> "" Then // strSQL += " ,INVENTORYTYPE = " & strERP_WarehouseType // End If strSQL += " Where InventoryNo='" + strERP_INVNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } drTemp.Close(); //cmmTemp.Dispose(); break; } case "D": // D:刪除 { if (drTemp.Read()) { if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], 0, false))) { // ----------------------------------------------------------- // 先刪除MES庫房相關設定 // ----------------------------------------------------------- if (InventoryIntegration_DelInventory(ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_INVNo) < 0) { // GoTo lblExitTry_2_NextRow exitTry1 = exitTry = true; break; } } else { // ----------------------------------------------------------- // 作廢MES產品設定 // ----------------------------------------------------------- strSQL = "Update tblINVInventoryBasis Set " + " IssueState = -1" + " Where InventoryNo='" + strERP_INVNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } } // aryMES_Message.Add(TranslateMsg("[%InventoryNo%] : " & strERP_INVNo & " [%IS NOT EXIST%]!")) // 刪除有可能會在資料庫中取不到資料,因為同一個交易還沒有commit; // ----------------------------------------------------------- // 先刪除MES庫房相關設定 // ----------------------------------------------------------- else if (InventoryIntegration_DelInventory(ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_INVNo) < 0) { // GoTo lblExitTry_2_NextRow exitTry1 = exitTry = true; break; } drTemp.Close(); break; } default: { aryMES_Message.Add(TranslateMsg("[%InventoryNo%](warehouse_no):" + strERP_INVNo + ",ERP [%Status%] : " + strERP_status + " [%INVALID%],[%IS NOT ALLOWED TO EXECUTE%]!", strLanguageMode, strResourceDir)); break; } } if (exitTry) { break; } } if (exitTry1) { break; } } catch (Exception EX_drIF) { strMES_Result = "9"; aryMES_Message.Add("EX_drIF.Exception" + '\n' + EX_drIF.Message); } finally { // =============================================================================== // 判定 MES_Result 處理結果 (成功回寫1, 失敗回寫9). // =============================================================================== if (aryMES_Message.Count == 0) { strMES_Result = "1"; // -------------------------------------------------- // MES資料庫異動 // -------------------------------------------------- if (colSQL_2MES.Count > 0) { ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colSQL_2MES, colSQL_2MES_Rows); } } // 組合執行錯誤字串: Chr(10)分隔 strMES_MESSAGE = ArrayList2String(ref aryMES_Message); // MES_Message長度4000限制, 截取0-3996碼加"...". if (strMES_MESSAGE.Length > 4000) strMES_MESSAGE = strMES_MESSAGE.Substring(0, 3996) + "..."; // ---取消前面收集SQL--- colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); // 當該筆交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 if (aryMES_Message.Count > 0) { foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); } } } while (false); // //return 0 : Success WriteToMESInventoryBasis_E10ICDRet = 0; } catch (Exception ex) { aryMES_Message.Add(ex.Message); // 當該筆中介交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); throw; } finally { if (drTemp != null) drTemp.Close(); CloseConnection(cnnMES); } return WriteToMESInventoryBasis_E10ICDRet; } private int WriteToMESLocatorBasis_E10ICD(iMESCIO.SCI.ERP.Response_E10ICD.SCI_Response_storage_spaces_get objResponse, ref ArrayList aryReturnMessage) { int WriteToMESLocatorBasis_E10ICDRet = default(int); WriteToMESLocatorBasis_E10ICDRet = -1; // Return -1:fail,0:Success // =========================================================== // 宣告 DB相關 變數 // =========================================================== var drTemp = default(DbDataReader); IDbConnection cnnMES = null; Collection colSQL_2MES = new Collection(), colSQL_2MES_Rows = new Collection(); // MES正式異動資料(主要). string strSQL; // 每筆中介交易記錄 string strIfWhereCond_PK; string strMES_Result; string strMES_MESSAGE; // 錯誤訊息(中介表.MES_MESSAGE),Chr(10)分隔錯誤項目。 var aryMES_Message = new ArrayList(); // 收集單筆中介交易記錄的錯誤記錄, Exception及MES判定錯誤訊息。 var datNow = DateTime.Now; // Now try { cnnMES = CreateConnection(strConnectionString); // 宣告拋轉資料使用變數 string strERP_INVNo, strERP_Locator, strERP_FactoryNo, strERP_status, str_ERPNo; // 預設值 int intIssueState = 0; // reset datNow = DateTime.Now; // Now strIfWhereCond_PK = ""; strMES_Result = "9"; // 預設值 9 (MES處理結果, 成功回寫1, 失敗回寫9). strMES_MESSAGE = ""; // 錯誤訊息 aryMES_Message.Clear(); colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); do { try { bool exitTry1 = false; for (int intRow = 0, loopTo = objResponse.storage_spaces_get.Count - 1; intRow <= loopTo; intRow++) { // ----------------------------------------------------------- // 取出各欄位資料 // ----------------------------------------------------------- strERP_INVNo = objResponse.storage_spaces_get[intRow].warehouse_no.ToString().Trim().ToUpper(); strERP_Locator = objResponse.storage_spaces_get[intRow].storage_spaces_no.ToString().Trim().ToUpper(); if (string.IsNullOrEmpty(strERP_Locator.Trim())) strERP_Locator = "N/A"; strERP_status = objResponse.storage_spaces_get[intRow].tran_status.ToString().Trim().ToUpper(); str_ERPNo = objResponse.storage_spaces_get[intRow].storage_spaces_no.ToString().Trim(); strSQL = "Select InventoryNo,IssueState From tblINVInventoryBasis " + " Where InventoryNo='" + strERP_INVNo + "'"; //cmmTemp = new IDbCommand(strSQL, cnnMES); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); if (!drTemp.Read()) { aryMES_Message.Add(TranslateMsg("[%InventoryNo%](warehouse_no):" + strERP_INVNo + " [%Is Not Exist%]!", strLanguageMode, strResourceDir)); drTemp.Close(); //cmmTemp.Dispose(); exitTry1 = true; break; } // 檢查是否有此儲位設定 strSQL = "Select InventoryNo,IssueState From tblINVLocatorBasis " + " Where InventoryNo='" + strERP_INVNo + "'" + " And LocatorNo='" + strERP_Locator + "'"; //cmmTemp = new IDbCommand(strSQL, cnnMES); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); bool exitTry = false; switch (strERP_status ?? "") { case "AU": // 有資料修改沒資料新增 { if (!drTemp.Read()) { intIssueState = 0; // ----------------------------------------------------------- // 新增MES儲位設定 // ----------------------------------------------------------- if (string.IsNullOrEmpty(strERP_INVNo)) { aryMES_Message.Add(TranslateMsg("[%LocatorNo%](storage_spaces_no):" + strERP_Locator + ",[%InventoryNo%](warehouse_no):" + strERP_INVNo + " [%Is Empty%]!", strLanguageMode, strResourceDir)); } else if (string.IsNullOrEmpty(strERP_Locator)) { aryMES_Message.Add(TranslateMsg("[%InventoryNo%](warehouse_no):" + strERP_INVNo + ",[%LocatorNo%](storage_spaces_no):" + strERP_Locator + " [%Is Empty%]!", strLanguageMode, strResourceDir)); } else { strSQL = "Insert Into tblINVLocatorBasis " + "(LocatorNo,InventoryNo," + "IssueState,ERPNO,Creator,CreateDate)"; strSQL += " Values('" + strERP_Locator + "','" + strERP_INVNo + "'," + intIssueState + ",'" + str_ERPNo + "','" + strERPCreator + "'," + "To_Date('" + Strings.Format(datNow, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'))"; } colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } else { // aryMES_Message.Add("庫房編號(inab001):" & strERP_INVNo & ",儲位編號(inab002):" & strERP_Locator & ", 已存在MES, 不允許新增!!") // ERPws標準功能不論IssueState為何皆允許修改. // ----------------------------------------------------------- // 修改MES產品設定 // ----------------------------------------------------------- // MES已存在之資料IssueState如果是-1,ERP資料再次拋轉時,IssueState則更新為"0". // 2017-06-02, Joe, 修改時如原狀態為-1變更為0,其他不異動 if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], -1, false))) { intIssueState = 0; } else { intIssueState = Conversions.ToInteger(drTemp["IssueState"]); } strSQL = "Update tblINVLocatorBasis Set " + " IssueState = " + intIssueState + " ,ERPNo ='" + str_ERPNo + "'" + " Where InventoryNo='" + strERP_INVNo + "'" + " And LocatorNo='" + strERP_Locator + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } break; } case "D": // D:刪除 { if (drTemp.Read()) { if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], 0, false))) { // ----------------------------------------------------------- // 先刪除MES產品相關設定 // ----------------------------------------------------------- if (LocatorIntegration_DelLocator(ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_INVNo, strERP_Locator) < 0) { // GoTo lblExitTry_2_NextRow exitTry1 = exitTry = true; break; } } else { // ----------------------------------------------------------- // 作廢MES產品設定 // ----------------------------------------------------------- strSQL = "Update tblINVLocatorBasis Set " + " IssueState = -1" + " Where InventoryNo='" + strERP_INVNo + "'" + " And LocatorNo='" + strERP_Locator + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } } // aryMES_Message.Add(TranslateMsg("[%LocatorNo%](storage_spaces_no):" & strERP_Locator & "[%IS NOT EXIST%]!!")) // 刪除有可能會在資料庫中取不到資料,因為同一個交易還沒有commit; // ----------------------------------------------------------- // 先刪除MES產品相關設定 // ----------------------------------------------------------- else if (LocatorIntegration_DelLocator(ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_INVNo, strERP_Locator) < 0) { // GoTo lblExitTry_2_NextRow exitTry1 = exitTry = true; break; } drTemp.Close(); break; } default: { aryMES_Message.Add(TranslateMsg("[%LocatorNo%](storage_spaces_no):" + strERP_Locator + ",ERP [%Status%] : " + strERP_status + " [%INVALID%],[%IS NOT ALLOWED TO EXECUTE%]!", strLanguageMode, strResourceDir)); break; } } if (exitTry) { break; } } if (exitTry1) { break; } } catch (Exception EX_drIF) { strMES_Result = "9"; aryMES_Message.Add("EX_drIF.Exception" + '\n' + EX_drIF.Message); } finally { // =============================================================================== // 判定 MES_Result 處理結果 (成功回寫1, 失敗回寫9). // =============================================================================== if (aryMES_Message.Count == 0) { strMES_Result = "1"; // -------------------------------------------------- // MES資料庫異動 // -------------------------------------------------- if (colSQL_2MES.Count > 0) { ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colSQL_2MES, colSQL_2MES_Rows); } } // 組合執行錯誤字串: Chr(10)分隔 strMES_MESSAGE = ArrayList2String(ref aryMES_Message); // MES_Message長度4000限制, 截取0-3996碼加"...". if (strMES_MESSAGE.Length > 4000) strMES_MESSAGE = strMES_MESSAGE.Substring(0, 3996) + "..."; // ---取消前面收集SQL--- colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); // 當該筆交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 if (aryMES_Message.Count > 0) { foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); } } } while (false); // //return 0 : Success WriteToMESLocatorBasis_E10ICDRet = 0; } catch (Exception ex) { aryMES_Message.Add(ex.Message); // 當該筆中介交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); throw; } finally { if (drTemp != null) drTemp.Close(); CloseConnection(cnnMES); } return WriteToMESLocatorBasis_E10ICDRet; } private int WriteOPBasis_E10ICD(iMESCIO.SCI.ERP.Response_E10ICD.SCI_Response_op_get objResponse, ref ArrayList aryReturnMessage) { int WriteOPBasis_E10ICDRet = default(int); WriteOPBasis_E10ICDRet = -1; // Return -1:fail,0:Success // =========================================================== // 宣告 DB相關 變數 // =========================================================== DbDataReader drTemp; IDbConnection cnnMES = null; Collection colSQL_2MES = new Collection(), colSQL_2MES_Rows = new Collection(); // MES正式異動資料(主要). string strSQL; string strERPCreator = "ERP"; // 每筆中介交易記錄 string strIfWhereCond_PK; string strMES_Result; string strMES_MESSAGE; // 錯誤訊息(中介表.MES_MESSAGE),Chr(10)分隔錯誤項目。 var aryMES_Message = new ArrayList(); // 收集單筆中介交易記錄的錯誤記錄, Exception及MES判定錯誤訊息。 var aryOPType = new ArrayList(); // 記錄是否已新增過作業站類別 try { cnnMES = CreateConnection(strConnectionString); // 宣告拋轉資料使用變數 string strERP_Status, strERP_OPNo, strERP_OPName, strERP_CreateDate, strERP_Description, strERP_ERPNo, str_OPType, strERP_OSOption; // 預設值 int intIssueState = 0; // reset strIfWhereCond_PK = ""; strMES_Result = "9"; // 預設值 9 (MES處理結果, 成功回寫1, 失敗回寫9). strMES_MESSAGE = ""; // 錯誤訊息 aryMES_Message.Clear(); colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); do { try { // 2019/07/02 Shih Kai, Mantis:0059229, 因作業站區段固定寫入N/A, // 在新增作業站資料時,檢查是否有N/A的區段,若沒有則同時新增一筆N/A的區段資料 if (AddOPProductionSegment(ref cnnMES, ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, "N/A", strERPCreator, DateTime.Now, "AutoRun建立") < 0) { break; } bool exitTry = false; for (int intRow = 0, loopTo = objResponse.op_get.Count - 1; intRow <= loopTo; intRow++) { // ----------------------------------------------------------- // 取出各欄位資料 // ----------------------------------------------------------- strERP_OPNo = objResponse.op_get[intRow].op_no.Trim().ToUpper(); strERP_OPName = objResponse.op_get[intRow].op_name.Trim().ToUpper(); strERP_OPName = Conversions.ToString(Interaction.IIf(string.IsNullOrWhiteSpace(strERP_OPName), strERP_OPNo, strERP_OPName)); strERP_Description = objResponse.description; strERP_ERPNo = objResponse.op_get[intRow].op_no; strERP_Status = objResponse.op_get[intRow].tran_status.Trim().ToUpper(); strERP_OSOption = Conversions.ToString(Interaction.IIf(objResponse.op_get[intRow].outsourcing_type == "Y", "1", "0")); // ERP回傳是否委外為Y/N,MES DB為1/0,Add By KevinChang 20170426 str_OPType = "OP"; // ----------------------------------------------------------- // 固定檢查OPGroup資料,若不存在則自動新增。 // ----------------------------------------------------------- if (aryOPType.IndexOf(str_OPType) == -1) { if (AddOPType(ref cnnMES, ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, str_OPType, strERPCreator, DateTime.Now, "AutoRun建立") < 0) { exitTry = true; break; } else { aryOPType.Add(str_OPType); } } // 檢查是否有此作業站設定 strSQL = "Select OPNo,IssueState From tblOPBasis " + " Where OPNo='" + strERP_OPNo + "'"; //cmmTemp = new IDbCommand(strSQL, cnnMES); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); switch (strERP_Status ?? "") { case "AU": // 有資料修改沒資料新增 { if (!drTemp.Read()) { intIssueState = 0; // ----------------------------------------------------------- // 新增MES作業站設定 // ----------------------------------------------------------- strSQL = "Insert Into tblOPBasis " + "(OPNo,OPName,OPShortName,OPType,OPClass,PSNo,StdunitRunTime,CountOPUnitQTY,STDQueueTime," + " Description,Creator,IssueState,ERPNo,CreateDate,PrintOutOnRunCard,OSOption)"; // 91094: [605][CP+FT] E10ICD整合問題_作業站主檔拋轉時,寫入生產區段資料比照TipTop/WorkFlow方式取得區段編號資料 strSQL += " Values('" + strERP_OPNo + "','" + strERP_OPName + "','" + strERP_OPName + "','" + str_OPType + "',0, '" + objSetting["defPSNo"] + "',1,1,1, 'AutoRun建立' ,'" + strERPCreator + "', '" + intIssueState + "','" + strERP_ERPNo + "'," + "To_Date('" + Strings.Format(DateTime.Now, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),1," + strERP_OSOption + ")"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } else { // ----------------------------------------------------------- // 修改MES作業站設定 // ----------------------------------------------------------- // 2017-06-02, Joe, 修改時如原狀態為-1變更為0,其他不異動 if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], -1, false))) { intIssueState = 0; } else { intIssueState = Conversions.ToInteger(drTemp["IssueState"]); } // MES已存在之資料IssueState如果是-1,ERP資料再次拋轉時,IssueState則更新為"0". strSQL = "Update tblOPBasis Set " + " IssueState = " + intIssueState + ", OPName = '" + strERP_OPName + "' , OSOption = " + strERP_OSOption + ", ERPNo = '" + strERP_ERPNo + "' Where OPNo='" + strERP_OPNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); // strSQL = "Update tblWIPEquipmentProductivity Set " & // " NormalOperation = '" & strERP_NormalOperation & "', WarrantyNo = '" & strERP_WarrantyNo & "' ,Description = 'AutoRun建立',Status = '" & strERP_Status & "',StartTime = " & // "To_Date('" & strERP_FromTime & "','YYYY/MM/DD HH24:MI:SS') ,EndTime = " & // "To_Date('" & strERP_ToTime & "','YYYY/MM/DD HH24:MI:SS')" } drTemp.Close(); //cmmTemp.Dispose(); break; } case "D": // D:刪除 { if (drTemp.Read()) { if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], 0, false))) { // ----------------------------------------------------------- // 刪除MES作業站設定 // ----------------------------------------------------------- strSQL = "Delete tblOPBasis " + " Where OPNo='" + strERP_OPNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); } else { // ----------------------------------------------------------- // 作廢MES作業站設定 // ----------------------------------------------------------- strSQL = "Update tblOPBasis Set " + " IssueState=-1" + " Where OPNo='" + strERP_OPNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); } } else { // aryMES_Message.Add(TranslateMsg("[%OPno%](op_no): " & strERP_OPNo & " [%IS NOT EXIST%]!")) // 刪除有可能會在資料庫中取不到資料,因為同一個交易還沒有commit; // ----------------------------------------------------------- // 刪除MES作業站設定 // ----------------------------------------------------------- strSQL = "Delete tblOPBasis " + " Where OPNo='" + strERP_OPNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); } drTemp.Close(); break; } default: { aryMES_Message.Add(TranslateMsg("[%OPno%](op_no): " + strERP_OPNo + ",ERP [%Status%] : " + strERP_Status + " [%INVALID%], [%IS NOT ALLOWED TO EXECUTE%]!", strLanguageMode, strResourceDir)); break; } } } if (exitTry) { break; } } catch (Exception ex) { strMES_Result = "9"; aryMES_Message.Add("Exception" + '\n' + ex.Message); } finally { // =============================================================================== // 判定 MES_Result 處理結果 (成功回寫1, 失敗回寫9). // =============================================================================== if (aryMES_Message.Count == 0) { strMES_Result = "1"; // -------------------------------------------------- // MES資料庫異動 // -------------------------------------------------- if (colSQL_2MES.Count > 0) { ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colSQL_2MES, colSQL_2MES_Rows); } } // 組合執行錯誤字串: Chr(10)分隔 strMES_MESSAGE = ArrayList2String(ref aryMES_Message); // MES_Message長度4000限制, 截取0-3996碼加"...". if (strMES_MESSAGE.Length > 4000) strMES_MESSAGE = strMES_MESSAGE.Substring(0, 3996) + "..."; // ---取消前面收集SQL--- colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); // 當該筆交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 if (aryMES_Message.Count > 0) { foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); } } } while (false); // //return 0 : Success WriteOPBasis_E10ICDRet = 0; } catch (Exception ex) { aryMES_Message.Add(ex.Message); // 當該筆中介交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); throw; } finally { // If Not drTemp Is Nothing Then drTemp.Close() CloseConnection(cnnMES); } return WriteOPBasis_E10ICDRet; } private int WriteOPGroupBasis_E10ICD(iMESCIO.SCI.ERP.Response_E10ICD.SCI_Response_workstation_get objResponse, ref ArrayList aryReturnMessage) { int WriteOPGroupBasis_E10ICDRet = default(int); WriteOPGroupBasis_E10ICDRet = -1; // Return -1:fail,0:Success // =========================================================== // 宣告 DB相關 變數 // =========================================================== DbDataReader drTemp; IDbConnection cnnMES = null; Collection colSQL_2MES = new Collection(), colSQL_2MES_Rows = new Collection(); // MES正式異動資料(主要). string strSQL; string strERPCreator = "ERP"; // 每筆中介交易記錄 string strIfWhereCond_PK; string strMES_Result; string strMES_MESSAGE; // 錯誤訊息(中介表.MES_MESSAGE),Chr(10)分隔錯誤項目。 var aryMES_Message = new ArrayList(); // 收集單筆中介交易記錄的錯誤記錄, Exception及MES判定錯誤訊息。 try { cnnMES = CreateConnection(strConnectionString); // 宣告拋轉資料使用變數 string strERP_Status, strERP_WorkStationNo, strERP_WorkStationName, strERP_CreateDate, strERP_Description, strERP_ERPNo; // 預設值 int intIssueState = 0; // reset strIfWhereCond_PK = ""; strMES_Result = "9"; // 預設值 9 (MES處理結果, 成功回寫1, 失敗回寫9). strMES_MESSAGE = ""; // 錯誤訊息 aryMES_Message.Clear(); colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); try { for (int intRow = 0, loopTo = objResponse.workstation_get.Count - 1; intRow <= loopTo; intRow++) { // ----------------------------------------------------------- // 取出各欄位資料 // ----------------------------------------------------------- strERP_WorkStationNo = objResponse.workstation_get[intRow].workstation_no.Trim().ToUpper(); strERP_WorkStationName = objResponse.workstation_get[intRow].workstation_name.Trim().ToUpper(); if (strERP_WorkStationName == null || string.IsNullOrEmpty(strERP_WorkStationName)) { strERP_WorkStationName = strERP_WorkStationNo; } strERP_Description = objResponse.description; strERP_ERPNo = objResponse.workstation_get[intRow].workstation_no; strERP_Status = objResponse.workstation_get[intRow].tran_status.Trim().ToUpper(); // 檢查是否有此作業站設定 strSQL = "Select OPGroupNo From tblOPGroupBasis " + " Where OPGroupNo='" + strERP_WorkStationNo + "'"; //cmmTemp = new IDbCommand(strSQL, cnnMES); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); switch (strERP_Status ?? "") { case "AU": // 有資料修改沒資料新增 { if (!drTemp.Read()) { // ----------------------------------------------------------- // 新增MES作業站設定 // ----------------------------------------------------------- strSQL = "Insert Into tblOPGroupBasis " + "(OPGroupNo,OPGroupName," + " Description,Creator,ERPNo,CreateDate)"; strSQL += " Values('" + strERP_WorkStationNo + "','" + strERP_WorkStationName + "', 'AutoRun建立' ,'" + strERPCreator + "','" + strERP_ERPNo + "'," + "To_Date('" + Strings.Format(DateTime.Now, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'))"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } else { // ----------------------------------------------------------- // 修改MES作業站設定() // ----------------------------------------------------------- // MES已存在之資料IssueState如果是-1,ERP資料再次拋轉時,IssueState則更新為"0". strSQL = "Update tblOPGroupBasis Set " + " OPGroupName = '" + strERP_WorkStationName + "'" + ",ERPNo = '" + strERP_ERPNo + "'" + " Where OPGroupNo='" + strERP_WorkStationNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } drTemp.Close(); //cmmTemp.Dispose(); break; } case "D": // D:刪除 { // If drTemp.Read Then // ----------------------------------------------------------- // 刪除MES作業站群組設定 // ----------------------------------------------------------- strSQL = "Delete tblOPGroupBasis " + " Where OPGroupNo='" + strERP_WorkStationNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // 2017-06-02, Joe, 要一併刪除Detail資訊 strSQL = "Delete tblOPGroupDetail " + " Where OPGroupNo='" + strERP_WorkStationNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); // Else // aryMES_Message.Add(TranslateMsg("[%opgroupno%](workstation_no): " & strERP_WorkStationNo & " [%IS NOT EXIST%]!")) // 刪除有可能會在資料庫中取不到資料,因為同一個交易還沒有commit; // End If drTemp.Close(); break; } default: { aryMES_Message.Add(TranslateMsg("[%opgroupno%](workstation_no): " + strERP_WorkStationNo + ",ERP [%Status%] : " + strERP_Status + " [%INVALID%], [%IS NOT ALLOWED TO EXECUTE%]!", strLanguageMode, strResourceDir)); break; } } } } catch (Exception ex) { strMES_Result = "9"; aryMES_Message.Add("Exception" + '\n' + ex.Message); } finally { // =============================================================================== // 判定 MES_Result 處理結果 (成功回寫1, 失敗回寫9). // =============================================================================== if (aryMES_Message.Count == 0) { strMES_Result = "1"; // -------------------------------------------------- // MES資料庫異動 // -------------------------------------------------- if (colSQL_2MES.Count > 0) { ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colSQL_2MES, colSQL_2MES_Rows); } } // 組合執行錯誤字串: Chr(10)分隔 strMES_MESSAGE = ArrayList2String(ref aryMES_Message); // MES_Message長度4000限制, 截取0-3996碼加"...". if (strMES_MESSAGE.Length > 4000) strMES_MESSAGE = strMES_MESSAGE.Substring(0, 3996) + "..."; // ---取消前面收集SQL--- colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); // 當該筆交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 if (aryMES_Message.Count > 0) { foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); } } // //return 0 : Success WriteOPGroupBasis_E10ICDRet = 0; } catch (Exception ex) { aryMES_Message.Add(ex.Message); // 當該筆中介交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); throw; } finally { // If Not drTemp Is Nothing Then drTemp.Close() CloseConnection(cnnMES); } return WriteOPGroupBasis_E10ICDRet; } private int WriteToMESDepartmentBasis_E10ICD(iMESCIO.SCI.ERP.Response_E10ICD.SCI_Response_department_get objResponse, ref ArrayList aryReturnMessage) { int WriteToMESDepartmentBasis_E10ICDRet = default(int); WriteToMESDepartmentBasis_E10ICDRet = -1; // Return -1:fail,0:Success // =========================================================== // 宣告 DB相關 變數 // =========================================================== var drTemp = default(DbDataReader); IDbConnection cnnMES = null; Collection colSQL_2MES = new Collection(), colSQL_2MES_Rows = new Collection(); // MES正式異動資料(主要). string strSQL; // 每筆中介交易記錄 string strIfWhereCond_PK; string strMES_Result; string strMES_MESSAGE; // 錯誤訊息(中介表.MES_MESSAGE),Chr(10)分隔錯誤項目。 var aryMES_Message = new ArrayList(); // 收集單筆中介交易記錄的錯誤記錄, Exception及MES判定錯誤訊息。 var datNow = DateTime.Now; // Now try { cnnMES = CreateConnection(strConnectionString); // 宣告拋轉資料使用變數 string strERP_DepartmentNo, strERP_DepartmentName, strERP_DepartmentSName, str_ERPNo, strERP_status; // 預設值 int intIssueState = 0; // reset datNow = DateTime.Now; // Now strIfWhereCond_PK = ""; strMES_Result = "9"; // 預設值 9 (MES處理結果, 成功回寫1, 失敗回寫9). strMES_MESSAGE = ""; // 錯誤訊息 aryMES_Message.Clear(); colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); do { try { bool exitTry1 = false; for (int intRow = 0, loopTo = objResponse.department_get.Count - 1; intRow <= loopTo; intRow++) { // ----------------------------------------------------------- // 取出各欄位資料 // ----------------------------------------------------------- strERP_DepartmentNo = objResponse.department_get[intRow].department_no.ToString().Trim().ToUpper(); strERP_status = objResponse.department_get[intRow].tran_status.ToString().Trim().ToUpper(); strERP_DepartmentName = objResponse.department_get[intRow].department_name.ToString().Trim().ToUpper(); if (string.IsNullOrEmpty(strERP_DepartmentName)) strERP_DepartmentName = strERP_DepartmentNo; // 20170324 edit lijyun↓ // strERP_DepartmentSName = objResponse.department_get(intRow).department_shortname.ToString.Trim.ToUpper // If IsNothing(objResponse.department_get(intRow).department_shortname) Then // strERP_DepartmentSName = "" // End If if (string.IsNullOrWhiteSpace(objResponse.department_get[intRow].department_shortname)) { if (string.IsNullOrWhiteSpace(strERP_DepartmentName)) { strERP_DepartmentSName = "N/A"; } else { strERP_DepartmentSName = strERP_DepartmentName; } } else { strERP_DepartmentSName = objResponse.department_get[intRow].department_shortname.ToString().Trim(); } // 20170324 edit lijyun↑ str_ERPNo = objResponse.department_get[intRow].department_no.ToString().Trim(); // 檢查是否有此作業站設定 strSQL = "Select DepartmentNo,IssueState From tblUSRDepartmentBasis " + " Where DepartmentNo='" + strERP_DepartmentNo + "'"; //cmmTemp = new IDbCommand(strSQL, cnnMES); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); bool exitTry = false; switch (strERP_status ?? "") { case "AU": // 有資料修改沒資料新增 { if (!drTemp.Read()) { intIssueState = 0; // ----------------------------------------------------------- // 新增MES部門設定 // ----------------------------------------------------------- if (string.IsNullOrEmpty(strERP_DepartmentNo)) { aryMES_Message.Add(TranslateMsg("[%DepartmentNo%](department_no):" + strERP_DepartmentNo + " [%Is Empty%]!", strLanguageMode, strResourceDir)); } else if (string.IsNullOrEmpty(strERP_DepartmentName)) { aryMES_Message.Add(TranslateMsg("[%DepartmentNo%](department_no):" + strERP_DepartmentNo + ",[%DepartmentName%](department_name):" + strERP_DepartmentName + " [%Is Empty%]!", strLanguageMode, strResourceDir)); } else if (string.IsNullOrEmpty(strERP_DepartmentSName)) { aryMES_Message.Add(TranslateMsg("[%DepartmentNo%](department_no):" + strERP_DepartmentNo + ",[%DepartmentSName%](department_shortname):" + strERP_DepartmentSName + " [%Is Empty%]!", strLanguageMode, strResourceDir)); } else { strSQL = "Insert Into tblUSRDepartmentBasis " + "(DepartmentNo,DepartmentName,DepartmentSName," + "IssueState,ERPNO,Creator,CreateDate)"; strSQL += " Values('" + strERP_DepartmentNo + "','" + strERP_DepartmentName + "','" + strERP_DepartmentSName + "'," + intIssueState + ",'" + str_ERPNo + "','" + strERPCreator + "'," + "To_Date('" + Strings.Format(datNow, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'))"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } } else { // aryMES_Message.Add("部門編號(ooef001):" & strERP_DepartmentNo & ", 已存在MES, 不允許新增!!") // ERPws標準功能不論IssueState為何皆允許修改. // ----------------------------------------------------------- // 修改MES部門設定 // ----------------------------------------------------------- // 修改部門,因目前中介表定義欄位沒有需修改的,僅針對交易記錄判斷此產品在MES簽核狀態檢查是否需作變更。 // 2017-06-02, Joe, 修改時如原狀態為-1變更為0,其他不異動 if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], -1, false))) { intIssueState = 0; } else { intIssueState = Conversions.ToInteger(drTemp["IssueState"]); } strSQL = "Update tblUSRDepartmentBasis Set " + " IssueState = " + intIssueState + " ,DEPARTMENTNAME = '" + strERP_DepartmentName + "'" + " ,DEPARTMENTSNAME = '" + strERP_DepartmentSName + "'" + " ,ERPNo = '" + str_ERPNo + "'" + " Where DepartmentNo='" + strERP_DepartmentNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } drTemp.Close(); //cmmTemp.Dispose(); break; } case "D": // D:刪除 { if (drTemp.Read()) { if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], 0, false))) { // ----------------------------------------------------------- // 先刪除MES部門相關設定 // ----------------------------------------------------------- if (DepartmentIntegration_DelDepartment(ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_DepartmentNo) < 0) { // GoTo lblExitTry_2_NextRow exitTry1 = exitTry = true; break; } } else { // ----------------------------------------------------------- // 作廢MES部門設定 // ----------------------------------------------------------- strSQL = "Update tblUSRDepartmentBasis Set " + " IssueState=-1" + " Where DepartmentNo='" + strERP_DepartmentNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } } // aryMES_Message.Add(TranslateMsg("[%DepartmentNo%] : " & strERP_DepartmentNo & " [%IS NOT EXIST%]!")) // 刪除有可能會在資料庫中取不到資料,因為同一個交易還沒有commit; // ----------------------------------------------------------- // 先刪除MES部門相關設定 // ----------------------------------------------------------- else if (DepartmentIntegration_DelDepartment(ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_DepartmentNo) < 0) { // GoTo lblExitTry_2_NextRow exitTry1 = exitTry = true; break; } drTemp.Close(); break; } default: { aryMES_Message.Add(TranslateMsg("[%DepartmentNo%](department_no):" + strERP_DepartmentNo + ",ERP [%Status%] : " + strERP_status + " [%INVALID%],[%IS NOT ALLOWED TO EXECUTE%]!", strLanguageMode, strResourceDir)); break; } } if (exitTry) { break; } } if (exitTry1) { break; } } catch (Exception EX_drIF) { strMES_Result = "9"; aryMES_Message.Add("EX_drIF.Exception" + '\n' + EX_drIF.Message); } finally { // =============================================================================== // 判定 MES_Result 處理結果 (成功回寫1, 失敗回寫9). // =============================================================================== if (aryMES_Message.Count == 0) { strMES_Result = "1"; // -------------------------------------------------- // MES資料庫異動 // -------------------------------------------------- if (colSQL_2MES.Count > 0) { ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colSQL_2MES, colSQL_2MES_Rows); } } // 組合執行錯誤字串: Chr(10)分隔 strMES_MESSAGE = ArrayList2String(ref aryMES_Message); // MES_Message長度4000限制, 截取0-3996碼加"...". if (strMES_MESSAGE.Length > 4000) strMES_MESSAGE = strMES_MESSAGE.Substring(0, 3996) + "..."; // ---取消前面收集SQL--- colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); // 當該筆交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 if (aryMES_Message.Count > 0) { foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); } } } while (false); // //return 0 : Success WriteToMESDepartmentBasis_E10ICDRet = 0; } catch (Exception ex) { aryMES_Message.Add(ex.Message); // 當該筆中介交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); throw; } finally { if (drTemp != null) drTemp.Close(); CloseConnection(cnnMES); } return WriteToMESDepartmentBasis_E10ICDRet; } private int WriteUserBasis_E10ICD(iMESCIO.SCI.ERP.Response_E10ICD.SCI_Response_user_get objResponse, ref ArrayList aryReturnMessage) { int WriteUserBasis_E10ICDRet = default(int); WriteUserBasis_E10ICDRet = -1; // Return -1:fail,0:Success // =========================================================== // 宣告 DB相關 變數 // =========================================================== DbDataReader drTemp; IDbConnection cnnMES = null; Collection colSQL = new Collection(), colSQL_Rows = new Collection(); // MES正式異動資料(主要). string strSQL; string strERPCreator = "ERP"; // 每筆中介交易記錄 string strMES_Result; string strMES_MESSAGE; // 錯誤訊息(中介表.MES_MESSAGE),Chr(10)分隔錯誤項目。 var aryMES_Message = new ArrayList(); // 收集單筆中介交易記錄的錯誤記錄, Exception及MES判定錯誤訊息。 try { cnnMES = CreateConnection(strConnectionString); // 宣告拋轉資料使用變數 string strERP_EmployeeNo, strERP_EmployeeName, strERP_DepartNo, strERP_Email, strERP_Remark, strERP_Status, strPassword, strErpNo; // 預設值 int intIssueState = 0; string strUserLevel = "2"; // 使用者等級預設『End User』 // reset strMES_Result = "9"; // 預設值 9 (MES處理結果, 成功回寫1, 失敗回寫9). strMES_MESSAGE = ""; // 錯誤訊息 aryMES_Message.Clear(); colSQL.Clear(); colSQL_Rows.Clear(); try { for (int intRow = 0, loopTo = objResponse.user_get.Count - 1; intRow <= loopTo; intRow++) { // ----------------------------------------------------------- // 取出各欄位資料 // ----------------------------------------------------------- strERP_EmployeeNo = objResponse.user_get[intRow].employee_no.Trim().ToUpper(); strERP_EmployeeName = objResponse.user_get[intRow].employee_name.Trim(); strERP_Status = objResponse.user_get[intRow].tran_status.Trim(); strErpNo = objResponse.user_get[intRow].employee_no.Trim(); if (!string.IsNullOrWhiteSpace(objResponse.user_get[intRow].department_no)) { strERP_DepartNo = objResponse.user_get[intRow].department_no.Trim().ToUpper(); } else { strERP_DepartNo = ""; } if (!string.IsNullOrWhiteSpace(objResponse.user_get[intRow].email)) { strERP_Email = objResponse.user_get[intRow].email.Trim(); } else { strERP_Email = ""; } if (!string.IsNullOrWhiteSpace(objResponse.user_get[intRow].remark)) { strERP_Remark = objResponse.user_get[intRow].remark.Trim(); } else { strERP_Remark = ""; } // 密碼:預設同使用者編號 strPassword = Strings.StrReverse(Convert.ToBase64String(Encoding.ASCII.GetBytes(Strings.StrReverse(modWIN.PasswordEncoding(ref strERP_EmployeeNo))))); // 檢查是否有此使用者 strSQL = "Select UserNo, IssueState From tblUSRUserBasis Where UserNo='" + strERP_EmployeeNo + "'"; //cmmTemp = new IDbCommand(strSQL, cnnMES); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); switch (strERP_Status ?? "") { case "AU": // 有資料修改沒資料新增 { if (!drTemp.Read()) { intIssueState = 0; strSQL = "INSERT INTO TBLUSRUSERBASIS (USERNO, USERNAME, USERLEVEL, PASSWORD, CREATOR," + "CREATEDATE, DESCRIPTION, ISSUESTATE, USERTYPE, DEPARTMENTNO," + "EMAILADDRESS, CHANGEDATE, RESETPASSWORD, ERPNO) "; strSQL += " Values ('" + strERP_EmployeeNo + "','" + strERP_EmployeeName + "','" + strUserLevel + "','" + strPassword + "','" + strERPCreator + "'," + "To_Date('" + Strings.Format(DateTime.Now, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),'" + strERP_Remark + "'," + intIssueState + ",0, '" + strERP_DepartNo + "'," + "'" + strERP_Email + "', To_Date('" + Strings.Format(DateTime.Now, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),0, '" + strErpNo + "')"; colSQL.Add(strSQL); colSQL_Rows.Add(1); } else { // 2017-06-02, Joe, 修改時如原狀態為-1變更為0,其他不異動 if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], -1, false))) { intIssueState = 0; } else { intIssueState = Conversions.ToInteger(drTemp["IssueState"]); } strSQL = "UPDATE TBLUSRUSERBASIS SET ISSUESTATE = " + intIssueState + " ,USERNAME = '" + strERP_EmployeeName + "' , DESCRIPTION = '" + strERP_Remark + "'" + ", DEPARTMENTNO = '" + strERP_DepartNo + "', EMAILADDRESS = '" + strERP_Email + "', ERPNo='" + strErpNo + "' WHERE USERNO ='" + strERP_EmployeeNo + "'"; colSQL.Add(strSQL); colSQL_Rows.Add(1); } drTemp.Close(); //cmmTemp.Dispose(); break; } case "D": // D:刪除 { if (drTemp.Read()) { if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], 0, false))) { // 刪除MES作業站設定 strSQL = "Delete tblUSRUserBasis Where UserNo='" + strERP_EmployeeNo + "'"; colSQL.Add(strSQL); colSQL_Rows.Add(-1); } else { // 作廢MES作業站設定 strSQL = "Update tblOPBasis Set IssueState=-1 Where UserNo='" + strERP_EmployeeNo + "'"; colSQL.Add(strSQL); colSQL_Rows.Add(-1); } } else { // 刪除有可能會在資料庫中取不到資料,因為同一個交易還沒有commit strSQL = "Delete tblUSRUserBasis Where UserNo='" + strERP_EmployeeNo + "'"; colSQL.Add(strSQL); colSQL_Rows.Add(-1); } drTemp.Close(); break; } default: { aryMES_Message.Add(TranslateMsg("[%USERNO%](employee_no): " + strERP_EmployeeNo + ",ERP [%Status%] : " + strERP_Status + " [%INVALID%], [%IS NOT ALLOWED TO EXECUTE%]!", strLanguageMode, strResourceDir)); break; } } } } catch (Exception ex) { strMES_Result = "9"; aryMES_Message.Add("Exception" + '\n' + ex.Message); } finally { // =============================================================================== // 判定 MES_Result 處理結果 (成功回寫1, 失敗回寫9). // =============================================================================== if (aryMES_Message.Count == 0) { strMES_Result = "1"; // -------------------------------------------------- // MES資料庫異動 // -------------------------------------------------- if (colSQL.Count > 0) { ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colSQL, colSQL_Rows); } } // 組合執行錯誤字串: Chr(10)分隔 strMES_MESSAGE = ArrayList2String(ref aryMES_Message); // MES_Message長度4000限制, 截取0-3996碼加"...". if (strMES_MESSAGE.Length > 4000) strMES_MESSAGE = strMES_MESSAGE.Substring(0, 3996) + "..."; // ---取消前面收集SQL--- colSQL.Clear(); colSQL_Rows.Clear(); // 當該筆交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 if (aryMES_Message.Count > 0) { foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); } } // //return 0 : Success WriteUserBasis_E10ICDRet = 0; } catch (Exception ex) { aryMES_Message.Add(ex.Message); // 當該筆中介交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); throw; } finally { CloseConnection(cnnMES); } return WriteUserBasis_E10ICDRet; } private int WriteProductOrMaterailBasis_E10ICD(iMESCIO.SCI.ERP.Response_E10ICD.SCI_Response_item_get objResponse, ref ArrayList aryReturnMessage) { int WriteProductOrMaterailBasis_E10ICDRet = default(int); // 2017-06-05, Joe, ERP拋過來的料件資訊全部都寫入物料主檔中,如料件是屬產品的(A)則另外寫入產品主檔 WriteProductOrMaterailBasis_E10ICDRet = -1; // Return -1:fail,0:Success // =========================================================== // 宣告 DB相關 變數 // =========================================================== var drTemp = default(DbDataReader); IDbConnection cnnMES = null; Collection colSQL_2MES = new Collection(), colSQL_2MES_Rows = new Collection(); // MES正式異動資料(主要). string strSQL; string strSQLCol; string strSQLVal; // 每筆中介交易記錄 string strIfWhereCond_PK; string strMES_Result; string strMES_MESSAGE; // 錯誤訊息(中介表.MES_MESSAGE),Chr(10)分隔錯誤項目。 var aryMES_Message = new ArrayList(); // 收集單筆中介交易記錄的錯誤記錄, Exception及MES判定錯誤訊息。 try { cnnMES = CreateConnection(strConnectionString); // 宣告拋轉資料使用變數 string strERP_ProductNo, strERP_MaterialNo, strERP_ProductVersion, strERP_status, strERP_UnitNo, strERP_ItemName, strErpNo, strERP_SpecNo, strERP_LotManage = default(string); DataRow drChk; // 預設值 string strProductType = "PRODUCT"; // 給予預設值"PRODUCT",若不存在則自動新增產品類別. int intIssueState = 0; int intCurVersion = 0; // Dim strSpecNo As String = "N/A" string strMaterialType = "MATERIL"; // 給予預設值"MATERIL",若不存在則自動新增物料類別. int intPutInPlace = 3; // 投料點:預設為3(工單). int intCountWay = 1; // 計量方法:預設為1(實際用量). int intCheckLotNo = 1; // 物料批號檢查:預設為0(不檢查批號). var aryProductType = new ArrayList(); // 記錄產品類別是否新增 var aryMaterialType = new ArrayList(); // 記錄物料類別是否新增 var aryUnitNo = new ArrayList(); // 記錄單位主檔是否新增 do { try { bool exitTry2 = false; for (int intRow = 0, loopTo = objResponse.item_get.Count - 1; intRow <= loopTo; intRow++) { if (string.IsNullOrWhiteSpace(objResponse.item_get[intRow].item_sort)) { aryMES_Message.Add(TranslateMsg("item_sort" + " [%Is Empty%]!", strLanguageMode, strResourceDir)); break; } // ----- MO Property ----- '2021/3/18 Steven 0089390: [605]iMES與E10整合_第一階段_ICD行業_物料設定/ 產品設定 DataRow drData; var dtPRDProperty = new DataTable("PRDProperty"); dtPRDProperty.Columns.Add("ProductNo", Type.GetType("System.String")); dtPRDProperty.Columns.Add("PropertyNo", Type.GetType("System.String")); dtPRDProperty.Columns.Add("DefaultValue", Type.GetType("System.String")); dtPRDProperty.Columns.Add("ProductVersion", Type.GetType("System.String")); var dtMTLProperty = new DataTable("MTLProperty"); dtMTLProperty.Columns.Add("PropertyNo", Type.GetType("System.String")); dtMTLProperty.Columns.Add("DefaultValue", Type.GetType("System.String")); if (objResponse.item_get[intRow].item_sort.Equals("A")) // 處理產品類型 { // ----------------------------------------------------------- // 固定檢查ProductType='PRODUCT'資料,若不存在則自動新增。 // ----------------------------------------------------------- // If AddProductType(cnnMES, colSQL_2MES, colSQL_2MES_Rows, aryMES_Message, strProductType, strERPCreator, DateTime.Now, "AutoRun建立") < 0 Then Exit Try if (aryProductType.IndexOf(strProductType) == -1) { if (AddProductType(ref cnnMES, ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strProductType, strERPCreator, DateTime.Now, "AutoRun建立") < 0) { exitTry2 = true; break; } else { aryProductType.Add(strProductType); } } // ----------------------------------------------------------- // 取出各欄位資料 // ----------------------------------------------------------- strERP_ProductNo = objResponse.item_get[intRow].item_no.Trim().ToUpper(); strErpNo = objResponse.item_get[intRow].item_no.Trim(); // 記錄原始之ERP編號 strERP_ProductVersion = Interaction.IIf(string.IsNullOrWhiteSpace(objResponse.item_get[intRow].item_ver), "1", objResponse.item_get[intRow].item_ver).ToString().Trim(); strERP_status = objResponse.item_get[intRow].tran_status.Trim().ToUpper(); if (string.IsNullOrEmpty(objResponse.item_get[intRow].production_unit_no)) { strERP_UnitNo = "N/A"; } else // 單位有傳入才作檢查 { string strUnitNo = objResponse.item_get[intRow].production_unit_no.Trim(); strERP_UnitNo = objResponse.item_get[intRow].production_unit_no.Trim().ToLower(); // ----------------------------------------------------------- // 檢查UnitNo資料,若不存在則自動新增。 // ----------------------------------------------------------- if (aryUnitNo.IndexOf(strERP_UnitNo) == -1) { if (AddUnitNo(ref cnnMES, ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strUnitNo, strERPCreator, DateTime.Now, "AutoRun建立") < 0) { exitTry2 = true; break; } else { aryUnitNo.Add(strERP_UnitNo); } } } strERP_ItemName = Conversions.ToString(Interaction.IIf(string.IsNullOrWhiteSpace(objResponse.item_get[intRow].item_name), "N/A", objResponse.item_get[intRow].item_name)); strERP_SpecNo = Conversions.ToString(Interaction.IIf(string.IsNullOrWhiteSpace(objResponse.item_get[intRow].item_spec), "N/A", objResponse.item_get[intRow].item_spec)); // 檢查是否有此產品設定 strSQL = "Select ProductNo,IssueState From tblPRDProductBasis " + " Where ProductNo='" + strERP_ProductNo + "'" + " And ProductVersion='" + strERP_ProductVersion + "'"; //cmmTemp = new IDbCommand(strSQL, cnnMES); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); bool exitTry = false; switch (strERP_status ?? "") { case "AU": // 有資料修改沒資料新增 { if (!drTemp.Read()) { intIssueState = 0; // ----------------------------------------------------------- // 產品編號合理性檢查 // 2019/07/22 Eric 啟用檢查 // ----------------------------------------------------------- if (ProductIntegration_ChkValid_ProductNo(ref cnnMES, ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_ProductNo, strERP_ProductVersion) < 0) { exitTry2 = exitTry = true; break; // GoTo lblExitTry_2_NextRow } // ----------------------------------------------------------- // 新增MES產品設定 // ----------------------------------------------------------- strSQLCol = "Insert Into tblPRDProductBasis " + "(ProductNo,ProductVersion,ProductName,ProductType," + " UnitNo,UnitType,ItemSpec,Description," + " IssueState,CurVersion,Creator,CreateDate,ERPNo,QCCategory"; strSQLVal = ") Values('" + strERP_ProductNo + "','" + strERP_ProductVersion + "','" + strERP_ItemName + "','" + strProductType + "','" + strERP_UnitNo + "','" + strERP_UnitNo + "','" + strERP_SpecNo + "','AutoRun建立'," + intIssueState + "," + intCurVersion + ",'" + strERPCreator + "'," + "To_Date('" + Strings.Format(DateTime.Now, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'), '" + strErpNo + "', 'N/A'"; if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined01)) { strSQLCol += ",User_Defined01"; strSQLVal += ",'" + objResponse.item_get[intRow].user_defined01.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined02)) { strSQLCol += ",User_Defined02"; strSQLVal += ",'" + objResponse.item_get[intRow].user_defined02.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined03)) { strSQLCol += ",User_Defined03"; strSQLVal += ",'" + objResponse.item_get[intRow].user_defined03.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined04)) { strSQLCol += ",User_Defined04"; strSQLVal += ",'" + objResponse.item_get[intRow].user_defined04.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined05)) { strSQLCol += ",User_Defined05"; strSQLVal += ",'" + objResponse.item_get[intRow].user_defined05.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined06)) { strSQLCol += ",User_Defined06"; strSQLVal += ",'" + objResponse.item_get[intRow].user_defined06.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined07)) { strSQLCol += ",User_Defined07"; strSQLVal += ",'" + objResponse.item_get[intRow].user_defined07.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined08)) { strSQLCol += ",User_Defined08"; strSQLVal += ",'" + objResponse.item_get[intRow].user_defined08.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined09)) { strSQLCol += ",User_Defined09"; strSQLVal += ",'" + objResponse.item_get[intRow].user_defined09.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined10)) { strSQLCol += ",User_Defined10"; strSQLVal += ",'" + objResponse.item_get[intRow].user_defined10.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined11)) { strSQLCol += ",User_Defined11"; strSQLVal += "," + double.Parse(objResponse.item_get[intRow].user_defined11) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined12)) { strSQLCol += ",User_Defined12"; strSQLVal += "," + double.Parse(objResponse.item_get[intRow].user_defined12) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined13)) { strSQLCol += ",User_Defined13"; strSQLVal += "," + double.Parse(objResponse.item_get[intRow].user_defined13) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined14)) { strSQLCol += ",User_Defined14"; strSQLVal += "," + double.Parse(objResponse.item_get[intRow].user_defined14) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined15)) { strSQLCol += ",User_Defined15"; strSQLVal += "," + double.Parse(objResponse.item_get[intRow].user_defined15) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined16)) { strSQLCol += ",User_Defined16"; strSQLVal += "," + double.Parse(objResponse.item_get[intRow].user_defined16) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined17)) { strSQLCol += ",User_Defined17"; strSQLVal += "," + double.Parse(objResponse.item_get[intRow].user_defined17) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined18)) { strSQLCol += ",User_Defined18"; strSQLVal += "," + double.Parse(objResponse.item_get[intRow].user_defined18) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined19)) { strSQLCol += ",User_Defined19"; strSQLVal += "," + double.Parse(objResponse.item_get[intRow].user_defined19) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined20)) { strSQLCol += ",User_Defined20"; strSQLVal += "," + double.Parse(objResponse.item_get[intRow].user_defined20) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined21)) { strSQLCol += ",User_Defined21"; strSQLVal += ",To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined21).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined22)) { strSQLCol += ",User_Defined22"; strSQLVal += ",To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined22).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined23)) { strSQLCol += ",User_Defined23"; strSQLVal += ",To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined23).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined24)) { strSQLCol += ",User_Defined24"; strSQLVal += ",To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined24).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined25)) { strSQLCol += ",User_Defined25"; strSQLVal += ",To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined25).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined26)) { strSQLCol += ",User_Defined26"; strSQLVal += ",To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined26).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined27)) { strSQLCol += ",User_Defined27"; strSQLVal += ",To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined27).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined28)) { strSQLCol += ",User_Defined28"; strSQLVal += ",To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined28).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined29)) { strSQLCol += ",User_Defined29"; strSQLVal += ",To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined29).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined30)) { strSQLCol += ",User_Defined30"; strSQLVal += ",To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined30).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined31)) { strSQLCol += ",User_Defined31"; strSQLVal += ",'" + objResponse.item_get[intRow].user_defined31.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined32)) { strSQLCol += ",User_Defined32"; strSQLVal += ",'" + objResponse.item_get[intRow].user_defined32.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined33)) { strSQLCol += ",User_Defined33"; strSQLVal += "," + double.Parse(objResponse.item_get[intRow].user_defined33) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined34)) { strSQLCol += ",User_Defined34"; strSQLVal += "," + double.Parse(objResponse.item_get[intRow].user_defined34) + ""; } // 2017-05-22, Joe, Add 圖號 if (!string.IsNullOrEmpty(objResponse.item_get[intRow].graph_no)) { strSQLCol += ",GraphNo"; strSQLVal += ",'" + objResponse.item_get[intRow].graph_no.Trim() + "'"; } strSQL = strSQLCol + strSQLVal + ")"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); // add MO Property'2021/03/18 0089390: [605]iMES與E10整合_第一階段_ICD行業_物料設定/ 產品設定 if (!(objResponse.item_get[intRow].item_property_detail == null)) { foreach (SCI_prd_property_detail objProperty in objResponse.item_get[intRow].item_property_detail) { if (!string.IsNullOrEmpty(objProperty.property_no.ToString()) && !string.IsNullOrEmpty(objProperty.property_value.ToString())) { drData = dtPRDProperty.NewRow(); drData["ProductNo"] = strERP_ProductNo.ToUpper(); drData["ProductVersion"] = strERP_ProductVersion; drData["PropertyNo"] = objProperty.property_no; drData["DefaultValue"] = objProperty.property_value; dtPRDProperty.Rows.Add(drData); } } } if (dtPRDProperty.Rows.Count > 0) { foreach (DataRow drP in dtPRDProperty.Rows) { strSQL = Conversions.ToString("insert into tblprdproductproperty(productno,productversion,propertyno,defaultvalue,issuestate) values('" + strERP_ProductNo.ToUpper() + "','" + strERP_ProductVersion + "','" + drP["PropertyNo"] + "','" + drP["DefaultValue"] + "',2)"); colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } } } else { // ----------------------------------------------------------- // 修改MES產品設定 // ----------------------------------------------------------- // 2017-06-02, Joe, 修改時如原狀態為-1變更為0,其他不異動 if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], -1, false))) { intIssueState = 0; } else { intIssueState = Conversions.ToInteger(drTemp["IssueState"]); } // 2017-06-08, Joe, 修改為異動CurVersion strSQL = "Update tblPRDProductBasis Set " + " IssueState = " + intIssueState + " , ProductName = '" + strERP_ItemName + "', UnitNo = '" + strERP_UnitNo + "', UnitType = '" + strERP_UnitNo + "' " + " ,ProductType = '" + strProductType + "', ItemSpec = '" + strERP_SpecNo + "', ERPNo = '" + strErpNo + "' "; if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined01)) { strSQL += ",User_Defined01='" + objResponse.item_get[intRow].user_defined01.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined02)) { strSQL += ",User_Defined02='" + objResponse.item_get[intRow].user_defined02.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined03)) { strSQL += ",User_Defined03='" + objResponse.item_get[intRow].user_defined03.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined04)) { strSQL += ",User_Defined04='" + objResponse.item_get[intRow].user_defined04.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined05)) { strSQL += ",User_Defined05='" + objResponse.item_get[intRow].user_defined05.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined06)) { strSQL += ",User_Defined06='" + objResponse.item_get[intRow].user_defined06.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined07)) { strSQL += ",User_Defined07='" + objResponse.item_get[intRow].user_defined07.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined08)) { strSQL += ",User_Defined08='" + objResponse.item_get[intRow].user_defined08.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined09)) { strSQL += ",User_Defined09='" + objResponse.item_get[intRow].user_defined09.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined10)) { strSQL += ",User_Defined10='" + objResponse.item_get[intRow].user_defined10.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined11)) { strSQL += ",User_Defined11=" + double.Parse(objResponse.item_get[intRow].user_defined11) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined12)) { strSQL += ",User_Defined12=" + double.Parse(objResponse.item_get[intRow].user_defined12) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined13)) { strSQL += ",User_Defined13=" + double.Parse(objResponse.item_get[intRow].user_defined13) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined14)) { strSQL += ",User_Defined14=" + double.Parse(objResponse.item_get[intRow].user_defined14) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined15)) { strSQL += ",User_Defined15=" + double.Parse(objResponse.item_get[intRow].user_defined15) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined16)) { strSQL += ",User_Defined16=" + double.Parse(objResponse.item_get[intRow].user_defined16) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined17)) { strSQL += ",User_Defined17=" + double.Parse(objResponse.item_get[intRow].user_defined17) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined18)) { strSQL += ",User_Defined18=" + double.Parse(objResponse.item_get[intRow].user_defined18) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined19)) { strSQL += ",User_Defined19=" + double.Parse(objResponse.item_get[intRow].user_defined19) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined20)) { strSQL += ",User_Defined20=" + double.Parse(objResponse.item_get[intRow].user_defined20) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined21)) { strSQL += ",User_Defined21=To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined21).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined22)) { strSQL += ",User_Defined22=To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined22).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined23)) { strSQL += ",User_Defined23=To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined23).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined24)) { strSQL += ",User_Defined24=To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined24).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined25)) { strSQL += ",User_Defined25=To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined25).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined26)) { strSQL += ",User_Defined26=To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined26).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined27)) { strSQL += ",User_Defined27=To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined27).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined28)) { strSQL += ",User_Defined28=To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined28).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined29)) { strSQL += ",User_Defined29=To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined29).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined30)) { strSQL += ",User_Defined30=To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined30).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined31)) { strSQL += ",User_Defined31='" + objResponse.item_get[intRow].user_defined31.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined32)) { strSQL += ",User_Defined32='" + objResponse.item_get[intRow].user_defined32.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined33)) { strSQL += ",User_Defined33=" + double.Parse(objResponse.item_get[intRow].user_defined33) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined34)) { strSQL += ",User_Defined34=" + double.Parse(objResponse.item_get[intRow].user_defined34) + " "; } // 2017-05-22, Joe, Add 圖號 if (!string.IsNullOrEmpty(objResponse.item_get[intRow].graph_no)) { strSQL += ",GraphNo='" + objResponse.item_get[intRow].graph_no.Trim() + "'"; } strSQL += " Where ProductNo='" + strERP_ProductNo + "' And ProductVersion='" + strERP_ProductVersion + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); // add MO Property'2021/03/18 0089390: [605]iMES與E10整合_第一階段_ICD行業_物料設定/ 產品設定 if (!(objResponse.item_get[intRow].item_property_detail == null)) { foreach (SCI_prd_property_detail objProperty in objResponse.item_get[intRow].item_property_detail) { if (!string.IsNullOrEmpty(objProperty.property_no.ToString()) && !string.IsNullOrEmpty(objProperty.property_value.ToString())) { drData = dtPRDProperty.NewRow(); drData["ProductNo"] = strERP_ProductNo.ToUpper(); drData["ProductVersion"] = strERP_ProductVersion; drData["PropertyNo"] = objProperty.property_no; drData["DefaultValue"] = objProperty.property_value; dtPRDProperty.Rows.Add(drData); } } } // 2021/3/18 Steven 0089390: [605]iMES與E10整合_第一階段_ICD行業_物料設定/ 產品設定 if (dtPRDProperty.Rows.Count > 0) { foreach (DataRow drP in dtPRDProperty.Rows) { strSQL = Conversions.ToString("delete from tblprdproductproperty where productno ='" + drP["ProductNo"] + "'and productversion = '" + drP["ProductVersion"] + "' and propertyno = '" + drP["PropertyNo"] + "'"); colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); //2023/11/3,Ning,149604: 汇涌进项目:正式区,产品工单同步接口问题, 因產品屬性未必原有存在這筆資料, 故Rows不可限制為1 strSQL = Conversions.ToString("insert into tblprdproductproperty(productno,productversion,propertyno,defaultvalue,issuestate) values('" + drP["ProductNo"] + "','" + drP["ProductVersion"] + "','" + drP["PropertyNo"] + "','" + drP["DefaultValue"] + "',2)"); colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } } } drTemp.Close(); //cmmTemp.Dispose(); break; } case "D": // D:刪除 { if (drTemp.Read()) { if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], 0, false))) { // ----------------------------------------------------------- // 先刪除MES產品相關設定 // ----------------------------------------------------------- if (ProductIntegration_DelProduct(ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_ProductNo, strERP_ProductVersion) < 0) { exitTry2 = exitTry = true; break; // GoTo lblExitTry_2_NextRow } } else { // ----------------------------------------------------------- // 作廢MES產品設定 // ----------------------------------------------------------- strSQL = "Update tblPRDProductBasis Set " + " IssueState=-1" + " Where ProductNo='" + strERP_ProductNo + "'" + " And ProductVersion='" + strERP_ProductVersion + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } } // aryMES_Message.Add(TranslateMsg("[%PRODUCTNO%](item_no): " & strERP_ProductNo & ", [%PRODUCTVERSION%](item_ver): " & strERP_ProductVersion & ", [%IS NOT EXIST%], [%NOT ALLOW TO DELETE%]!!")) // 刪除有可能會在資料庫中取不到資料,因為同一個交易還沒有commit; else if (ProductIntegration_DelProduct(ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_ProductNo, strERP_ProductVersion) < 0) { exitTry2 = exitTry = true; break; } drTemp.Close(); //cmmTemp.Dispose(); break; } default: { aryMES_Message.Add(TranslateMsg("[%PRODUCTNO%](item_no): " + strERP_ProductNo + ",[%TRANSTATUS%](tran_status):" + strERP_status + " [%INVALID%], [%NOT ALLOWED TO EXECUTE%]!!", strLanguageMode, strResourceDir)); break; } } if (exitTry) { break; } } // ElseIf objResponse.item_get(intRow).item_sort.Equals("M") Then '處理物料類型 // ----------------------------------------------------------- // 固定檢查MaterialType='MATERIL'資料,若不存在則自動新增。 // ----------------------------------------------------------- // If AddMaterialType(cnnMES, colSQL_2MES, colSQL_2MES_Rows, aryMES_Message, strMaterialType, strERPCreator, DateTime.Now, "AutoRun建立") < 0 Then Exit Try //****************产品物料系统参数判断开始****************** //如果item_sort是A的情况且产品物料同时并存的系统参数设定为0时,type为A只写入产品的资料,其他只写入物料 //prdOrMaterial值为1-只写入产品资料,无需写入物料;0-系统参数设定为1,同时写入(保持原有逻辑); int prdOrMaterial = GetProductOrMaterailByParameter(objResponse.item_get[intRow].item_sort); if (prdOrMaterial == 1) { WriteProductOrMaterailBasis_E10ICDRet = 0; continue; } //****************产品物料系统参数判断结束****************** if (aryMaterialType.IndexOf(strMaterialType) == -1) { if (AddMaterialType(ref cnnMES, ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strMaterialType, strERPCreator, DateTime.Now, "AutoRun建立") < 0) { exitTry2 = true; break; } else { aryMaterialType.Add(strMaterialType); } } // ----------------------------------------------------------- // 取出各欄位資料 // ----------------------------------------------------------- strERP_MaterialNo = objResponse.item_get[intRow].item_no.Trim().ToUpper(); strERP_status = objResponse.item_get[intRow].tran_status.Trim().ToUpper(); strErpNo = objResponse.item_get[intRow].item_no.Trim(); // 記錄原始之ERP編號 if (string.IsNullOrEmpty(objResponse.item_get[intRow].unit_no)) { strERP_UnitNo = "N/A"; } else // 單位有傳入才作檢查 { string strUnitNo = objResponse.item_get[intRow].production_unit_no.Trim(); strERP_UnitNo = objResponse.item_get[intRow].unit_no.Trim().ToLower(); // ----------------------------------------------------------- // 檢查UnitNo資料,若不存在則自動新增。 // ----------------------------------------------------------- if (aryUnitNo.IndexOf(strERP_UnitNo) == -1) { if (AddUnitNo(ref cnnMES, ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strUnitNo, strERPCreator, DateTime.Now, "AutoRun建立") < 0) { exitTry2 = true; break; } else { aryUnitNo.Add(strERP_UnitNo); } } } strERP_ItemName = Conversions.ToString(Interaction.IIf(string.IsNullOrEmpty(objResponse.item_get[intRow].item_name), "N/A", objResponse.item_get[intRow].item_name)); strERP_SpecNo = Conversions.ToString(Interaction.IIf(string.IsNullOrWhiteSpace(objResponse.item_get[intRow].item_spec), "N/A", objResponse.item_get[intRow].item_spec)); // 2019/07/08 Eric Mantis:59382 Lot_manage 欄位 批號管理 目前 T100 會拋轉 1,2,3 ,但是 MES 目前只有0/1 拋轉時並未轉換 // 0(False):不管控物料批號,系統將視物料批號為N/A。 // 1(True):管控物料批號,所有之進料、退料、扣料動作都必須輸入物料批號。 if (!string.IsNullOrWhiteSpace(objResponse.item_get[intRow].lot_manage)) { // 91087: [605][CP+FT] E10ICD整合問題_E10ICD拋轉批號查核(lot_manage)欄位值調整,MES須同步對應"是否檢查批號(CheckLotNo)"欄位 if (objResponse.item_get[intRow].lot_manage.Equals("Y") | objResponse.item_get[intRow].lot_manage.Equals("N")) { if (objResponse.item_get[intRow].lot_manage.Equals("Y") == true) { strERP_LotManage = "1"; } else if (objResponse.item_get[intRow].lot_manage.Equals("N") == true) { strERP_LotManage = "0"; } } else { strERP_LotManage = "0"; } } else { strERP_LotManage = "0"; } // If Not String.IsNullOrWhiteSpace(objResponse.item_get(intRow).lot_manage) Then // If objResponse.item_get(intRow).lot_manage.Equals("Y") Or objResponse.item_get(intRow).lot_manage.Equals("N") Then // strERP_LotManage = IIf(objResponse.item_get(intRow).lot_manage.Equals("N"), "0", "1") // Else // strERP_LotManage = objResponse.item_get(intRow).lot_manage // End If // Else // strERP_LotManage = "0" // End If // 檢查是否有此物料設定 drChk = GetMaterialBasis(strERP_MaterialNo, cnnMES, aryMES_Message); if (drChk == null) { exitTry2 = true; break; } // GoTo lblExitTry_2_NextRow 'fail bool exitTry1 = false; switch (strERP_status ?? "") { case "AU": // 有資料修改沒資料新增 { if (drChk["MaterialNo"] is DBNull) { // 2019/10/25 Eric Mantis:60113 調整成物料自動核准 intIssueState = 2; // ----------------------------------------------------------- // 物料編號合理性檢查 // 2019/07/22 Eric 啟用檢查 // ----------------------------------------------------------- if (ProductIntegration_ChkValid_MaterialNo(ref cnnMES, ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_MaterialNo) < 0) { exitTry2 = exitTry1 = true; break; // GoTo lblExitTry_2_NextRow } // ----------------------------------------------------------- // 新增MES物料設定 // MaterialName,MaterialSpec 必要欄位填"N/A". // ----------------------------------------------------------- strSQLCol = "Insert Into tblMTLMaterialBasis " + "(MaterialNo, MaterialName, MaterialSpec, MaterialType," + " PutInPlace, CountWay, CheckLotNo, UnitType, UnitNo, Description," + " IssueState, Creator, CreateDate, ERPNo, QCCategory"; strSQLVal = ") Values('" + strERP_MaterialNo + "','" + strERP_ItemName + "','" + strERP_SpecNo + "','" + strMaterialType + "'," + intPutInPlace + "," + intCountWay + "," + strERP_LotManage + ",'" + strERP_UnitNo + "','" + strERP_UnitNo + "','AutoRun建立'," + intIssueState + ",'" + strERPCreator + "'," + "To_Date('" + Strings.Format(DateTime.Now, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'), '" + strErpNo + "', 'N/A'"; if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined01)) { strSQLCol += ",User_Defined01"; strSQLVal += ",'" + objResponse.item_get[intRow].user_defined01.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined02)) { strSQLCol += ",User_Defined02"; strSQLVal += ",'" + objResponse.item_get[intRow].user_defined02.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined03)) { strSQLCol += ",User_Defined03"; strSQLVal += ",'" + objResponse.item_get[intRow].user_defined03.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined04)) { strSQLCol += ",User_Defined04"; strSQLVal += ",'" + objResponse.item_get[intRow].user_defined04.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined05)) { strSQLCol += ",User_Defined05"; strSQLVal += ",'" + objResponse.item_get[intRow].user_defined05.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined06)) { strSQLCol += ",User_Defined06"; strSQLVal += ",'" + objResponse.item_get[intRow].user_defined06.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined07)) { strSQLCol += ",User_Defined07"; strSQLVal += ",'" + objResponse.item_get[intRow].user_defined07.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined08)) { strSQLCol += ",User_Defined08"; strSQLVal += ",'" + objResponse.item_get[intRow].user_defined08.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined09)) { strSQLCol += ",User_Defined09"; strSQLVal += ",'" + objResponse.item_get[intRow].user_defined09.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined10)) { strSQLCol += ",User_Defined10"; strSQLVal += ",'" + objResponse.item_get[intRow].user_defined10.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined11)) { strSQLCol += ",User_Defined11"; strSQLVal += "," + double.Parse(objResponse.item_get[intRow].user_defined11) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined12)) { strSQLCol += ",User_Defined12"; strSQLVal += "," + double.Parse(objResponse.item_get[intRow].user_defined12) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined13)) { strSQLCol += ",User_Defined13"; strSQLVal += "," + double.Parse(objResponse.item_get[intRow].user_defined13) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined14)) { strSQLCol += ",User_Defined14"; strSQLVal += "," + double.Parse(objResponse.item_get[intRow].user_defined14) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined15)) { strSQLCol += ",User_Defined15"; strSQLVal += "," + double.Parse(objResponse.item_get[intRow].user_defined15) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined16)) { strSQLCol += ",User_Defined16"; strSQLVal += "," + double.Parse(objResponse.item_get[intRow].user_defined16) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined17)) { strSQLCol += ",User_Defined17"; strSQLVal += "," + double.Parse(objResponse.item_get[intRow].user_defined17) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined18)) { strSQLCol += ",User_Defined18"; strSQLVal += "," + double.Parse(objResponse.item_get[intRow].user_defined18) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined19)) { strSQLCol += ",User_Defined19"; strSQLVal += "," + double.Parse(objResponse.item_get[intRow].user_defined19) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined20)) { strSQLCol += ",User_Defined20"; strSQLVal += "," + double.Parse(objResponse.item_get[intRow].user_defined20) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined21)) { strSQLCol += ",User_Defined21"; strSQLVal += ",To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined21).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined22)) { strSQLCol += ",User_Defined22"; strSQLVal += ",To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined22).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined23)) { strSQLCol += ",User_Defined23"; strSQLVal += ",To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined23).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined24)) { strSQLCol += ",User_Defined24"; strSQLVal += ",To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined24).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined25)) { strSQLCol += ",User_Defined25"; strSQLVal += ",To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined25).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined26)) { strSQLCol += ",User_Defined26"; strSQLVal += ",To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined26).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined27)) { strSQLCol += ",User_Defined27"; strSQLVal += ",To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined27).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined28)) { strSQLCol += ",User_Defined28"; strSQLVal += ",To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined28).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined29)) { strSQLCol += ",User_Defined29"; strSQLVal += ",To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined29).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined30)) { strSQLCol += ",User_Defined30"; strSQLVal += ",To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined30).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined31)) { strSQLCol += ",User_Defined31"; strSQLVal += ",'" + objResponse.item_get[intRow].user_defined31.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined32)) { strSQLCol += ",User_Defined32"; strSQLVal += ",'" + objResponse.item_get[intRow].user_defined32.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined33)) { strSQLCol += ",User_Defined33"; strSQLVal += "," + double.Parse(objResponse.item_get[intRow].user_defined33) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined34)) { strSQLCol += ",User_Defined34"; strSQLVal += "," + double.Parse(objResponse.item_get[intRow].user_defined34) + ""; } // 2017-05-22, Joe, Add 圖號 if (!string.IsNullOrEmpty(objResponse.item_get[intRow].graph_no)) { strSQLCol += ",GraphNo"; strSQLVal += ",'" + objResponse.item_get[intRow].graph_no.Trim() + "'"; } strSQL = strSQLCol + strSQLVal + ")"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); // 2023/11/9,Ning,149996: [607.3] E10 AutoRun funMESCallERPPRDMTLBasis_E10ICD if (!(objResponse.item_get[intRow].item_property_detail == null)) { foreach (SCI_prd_property_detail objProperty in objResponse.item_get[intRow].item_property_detail) { if (!string.IsNullOrEmpty(objProperty.property_no.ToString()) && !string.IsNullOrEmpty(objProperty.property_value.ToString())) { drData = dtMTLProperty.NewRow(); drData["PropertyNo"] = objProperty.property_no; drData["DefaultValue"] = objProperty.property_value; dtMTLProperty.Rows.Add(drData); } } } if (dtMTLProperty.Rows.Count > 0) { foreach (DataRow drP in dtMTLProperty.Rows) { strSQL = "Insert into tblMTLMaterialProperty(Material,PropertyNo,DefaultValue,IssueState) values('" + strERP_MaterialNo + "','" + drP["PropertyNo"] + "','" + drP["DefaultValue"] + "',2)"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } } } else { // ----------------------------------------------------------- // 修改MES物料設定 // ----------------------------------------------------------- // 2017-06-02, Joe, 修改時如原狀態為-1變更為0,其他不異動 if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drChk["IssueState"], -1, false))) { intIssueState = 0; } else { intIssueState = Conversions.ToInteger(drChk["IssueState"]); } strSQL = "Update tblMTLMaterialBasis Set " + " IssueState = " + intIssueState + " , MaterialName = '" + strERP_ItemName + "', UnitType = '" + strERP_UnitNo + "', UnitNo = '" + strERP_UnitNo + "'" + ",CHECKLOTNO='" + strERP_LotManage + "',ERPNo='" + strErpNo + "' "; if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined01)) { strSQL += ",User_Defined01='" + objResponse.item_get[intRow].user_defined01.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined02)) { strSQL += ",User_Defined02='" + objResponse.item_get[intRow].user_defined02.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined03)) { strSQL += ",User_Defined03='" + objResponse.item_get[intRow].user_defined03.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined04)) { strSQL += ",User_Defined04='" + objResponse.item_get[intRow].user_defined04.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined05)) { strSQL += ",User_Defined05='" + objResponse.item_get[intRow].user_defined05.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined06)) { strSQL += ",User_Defined06='" + objResponse.item_get[intRow].user_defined06.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined07)) { strSQL += ",User_Defined07='" + objResponse.item_get[intRow].user_defined07.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined08)) { strSQL += ",User_Defined08='" + objResponse.item_get[intRow].user_defined08.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined09)) { strSQL += ",User_Defined09='" + objResponse.item_get[intRow].user_defined09.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined10)) { strSQL += ",User_Defined10='" + objResponse.item_get[intRow].user_defined10.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined11)) { strSQL += ",User_Defined11=" + double.Parse(objResponse.item_get[intRow].user_defined11) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined12)) { strSQL += ",User_Defined12=" + double.Parse(objResponse.item_get[intRow].user_defined12) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined13)) { strSQL += ",User_Defined13=" + double.Parse(objResponse.item_get[intRow].user_defined13) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined14)) { strSQL += ",User_Defined14=" + double.Parse(objResponse.item_get[intRow].user_defined14) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined15)) { strSQL += ",User_Defined15=" + double.Parse(objResponse.item_get[intRow].user_defined15) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined16)) { strSQL += ",User_Defined16=" + double.Parse(objResponse.item_get[intRow].user_defined16) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined17)) { strSQL += ",User_Defined17=" + double.Parse(objResponse.item_get[intRow].user_defined17) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined18)) { strSQL += ",User_Defined18=" + double.Parse(objResponse.item_get[intRow].user_defined18) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined19)) { strSQL += ",User_Defined19=" + double.Parse(objResponse.item_get[intRow].user_defined19) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined20)) { strSQL += ",User_Defined20=" + double.Parse(objResponse.item_get[intRow].user_defined20) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined21)) { strSQL += ",User_Defined21=To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined21).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined22)) { strSQL += ",User_Defined22=To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined22).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined23)) { strSQL += ",User_Defined23=To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined23).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined24)) { strSQL += ",User_Defined24=To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined24).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined25)) { strSQL += ",User_Defined25=To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined25).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined26)) { strSQL += ",User_Defined26=To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined26).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined27)) { strSQL += ",User_Defined27=To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined27).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined28)) { strSQL += ",User_Defined28=To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined28).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined29)) { strSQL += ",User_Defined29=To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined29).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined30)) { strSQL += ",User_Defined30=To_Date('" + CDate_EAI(objResponse.item_get[intRow].user_defined30).ToString("yyyy/MM/dd HH:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined31)) { strSQL += ",User_Defined31='" + objResponse.item_get[intRow].user_defined31.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined32)) { strSQL += ",User_Defined32='" + objResponse.item_get[intRow].user_defined32.Trim() + "'"; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined33)) { strSQL += ",User_Defined33=" + double.Parse(objResponse.item_get[intRow].user_defined33) + ""; } if (!string.IsNullOrEmpty(objResponse.item_get[intRow].user_defined34)) { strSQL += ",User_Defined34=" + double.Parse(objResponse.item_get[intRow].user_defined34) + " "; } // 2017-05-22, Joe, Add 圖號 if (!string.IsNullOrEmpty(objResponse.item_get[intRow].graph_no)) { strSQL += ",GraphNo='" + objResponse.item_get[intRow].graph_no.Trim() + "'"; } strSQL += " Where MaterialNo='" + strERP_MaterialNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); // 2023/11/9,Ning,149996: [607.3] E10 AutoRun funMESCallERPPRDMTLBasis_E10ICD if (!(objResponse.item_get[intRow].item_property_detail == null)) { foreach (SCI_prd_property_detail objProperty in objResponse.item_get[intRow].item_property_detail) { if (!string.IsNullOrEmpty(objProperty.property_no.ToString()) && !string.IsNullOrEmpty(objProperty.property_value.ToString())) { drData = dtMTLProperty.NewRow(); drData["PropertyNo"] = objProperty.property_no; drData["DefaultValue"] = objProperty.property_value; dtMTLProperty.Rows.Add(drData); } } } if (dtMTLProperty.Rows.Count > 0) { foreach (DataRow drP in dtMTLProperty.Rows) { strSQL = "delete from tblMTLMaterialProperty where Material = '" + strERP_MaterialNo + "' and propertyno = '" + drP["PropertyNo"] + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(-1); strSQL = "Insert into tblMTLMaterialProperty(Material,PropertyNo,DefaultValue,IssueState) values('" + strERP_MaterialNo + "','" + drP["PropertyNo"] + "','" + drP["DefaultValue"] + "',2)"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } } } break; } case "D": // D:刪除 { // 檢查是否有此物料設定 drChk = GetMaterialBasis(strERP_MaterialNo, cnnMES, aryMES_Message); if (drChk == null) { exitTry2 = exitTry1 = true; break; } // GoTo lblExitTry_2_NextRow 'fail if (!(drChk["MaterialNo"] is DBNull)) { // ----------------------------------------------------------- // 物料編號使用狀況檢查 // ----------------------------------------------------------- if (ProductIntegration_ChkforDelMaterialNo(ref cnnMES, ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_MaterialNo) < 0) { exitTry2 = exitTry1 = true; break; // GoTo lblExitTry_2_NextRow } if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drChk["IssueState"], 0, false))) { // ----------------------------------------------------------- // 刪除MES物料相關設定 // ----------------------------------------------------------- if (ProductIntegration_DelMaterial(ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_MaterialNo) < 0) { exitTry2 = exitTry1 = true; break; // GoTo lblExitTry_2_NextRow } } else { // ----------------------------------------------------------- // 作廢MES物料設定 // ----------------------------------------------------------- strSQL = "Update tblMTLMaterialBasis Set " + " IssueState=-1" + " Where MaterialNo='" + strERP_MaterialNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } } // aryMES_Message.Add(TranslateMsg("[%MATERIALNO%]item_no): " & strERP_MaterialNo & ", [%IS NOT EXIST%], [%NOT ALLOW TO DELETE%]!!")) // 刪除有可能會在資料庫中取不到資料,因為同一個交易還沒有commit; else if (ProductIntegration_DelMaterial(ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_MaterialNo) < 0) { exitTry2 = exitTry1 = true; break; // GoTo lblExitTry_2_NextRow } break; } default: { aryMES_Message.Add(TranslateMsg("[%MATERIALNO%]item_no): " + strERP_MaterialNo + ",[%TRANSTATUS%](tran_status):" + strERP_status + " [%INVALID%], [%NOT ALLOWED TO EXECUTE%]!!", strLanguageMode, strResourceDir)); break; } } if (exitTry1) { break; } } if (exitTry2) { break; // End If } } catch (Exception EX_drIF) { strMES_Result = "9"; aryMES_Message.Add("WriteProductOrMaterailBasis_E10ICD.Exception" + '\n' + EX_drIF.Message); } finally { // =============================================================================== // 判定 MES_Result 處理結果 (成功回寫1, 失敗回寫9). // =============================================================================== if (aryMES_Message.Count == 0) { strMES_Result = "1"; // -------------------------------------------------- // MES資料庫異動 // -------------------------------------------------- if (colSQL_2MES.Count > 0) { ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colSQL_2MES, colSQL_2MES_Rows); } } // 組合執行錯誤字串: Chr(10)分隔 strMES_MESSAGE = ArrayList2String(ref aryMES_Message); // MES_Message長度4000限制, 截取0-3996碼加"...". if (strMES_MESSAGE.Length > 4000) strMES_MESSAGE = strMES_MESSAGE.Substring(0, 3996) + "..."; // ---取消前面收集SQL--- colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); // 當該筆交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 if (aryMES_Message.Count > 0) { foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); } } } while (false); // //return 0 : Success WriteProductOrMaterailBasis_E10ICDRet = 0; } catch (Exception ex) { aryMES_Message.Add("WriteProductOrMaterailBasis_E10ICD,Finally:" + ex.Message); // 當該筆交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); throw; } finally { if (drTemp != null) drTemp.Close(); CloseConnection(cnnMES); } return WriteProductOrMaterailBasis_E10ICDRet; } #endregion #region 新增产品物料系统参数判断共用function //根据系统参数value判断写入产品或物料 public int GetProductOrMaterailByParameter(string type) { int GetProductOrMaterailByParameterRet = default(int); DbDataReader drTemp = null; IDbConnection cnnTemp = null; try { cnnTemp = CreateConnection(strConnectionString); string ParameterNo = "ProductMaterialcoexist"; string parametervalue = "0"; string strSQL = "Select ParameterValue From tblSYSParameter Where Upper(ParameterNo) = '" + ParameterNo.ToUpper() + "'"; // //Select data drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (drTemp.Read()) { parametervalue = Conversions.ToString(drTemp["ParameterValue"]); } drTemp.Close(); if (type == "A") { if (parametervalue == "1") { //如果产品物料同时并存的系统参数设为1走原有逻辑不动 GetProductOrMaterailByParameterRet = 0; } else { //如果item_sort是A的情况且产品物料同时并存的系统参数设定为0时,type为A只写入产品的资料,其他只写入物料 GetProductOrMaterailByParameterRet = 1; } } } catch (Exception e1) { GetProductOrMaterailByParameterRet = -1; throw; } finally { CloseConnection(cnnTemp); } return GetProductOrMaterailByParameterRet; } #endregion #region -- 清除過期 MES交易記錄 --- private string funClearMESTransactionLog(Collection colParameters = null) { string funClearMESTransactionLogRet = default(string); var CollectionSQL = new Collection(); string strSQL = string.Empty; ushort intExpriredDays = 7; // 預設過期日7天 string strReturnMessage = ""; // 執行檔Catch訊息(Job Jog)。Chr(10)分隔每個錯誤訊息。 var datEventTime = DateTime.Now; try { // 1.取出AutoRun設定參數. // Parameter01: MES交易記錄過期天數 string strTemp = ""; // Parameter01:MES交易記錄過期天數 if (colParameters["Parameter01"] == null || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter01"])))) { } else { strTemp = Strings.Trim(Conversions.ToString(colParameters["Parameter01"])).ToUpper(); if (modAutoRunLibrary.funChkNumericIsValid(pSourceText: strTemp, AllowMinus: false, AllowZeroValue: false, AllowFloat: false, AllowContainsDot: false)) { intExpriredDays = Convert.ToUInt16(strTemp); } else { throw new Exception("Parameter01(KeepDays) is not valid Nnumeric data!"); } } strSQL = "DELETE FROM tblERPTransactionXmlLog" + " WHERE ID IN (SELECT ID FROM tblERPTransactionLog" + " WHERE CreateDate < to_date(" + " '" + datEventTime.AddDays(0 - intExpriredDays).ToString("yyyy/MM/dd HH:mm:ss") + "'" + " , 'yyyy/mm/dd hh24:mi:ss'))"; CollectionSQL.Add(strSQL); strSQL = "DELETE FROM tblERPTransactionLog" + " WHERE CreateDate < to_date(" + " '" + datEventTime.AddDays(0 - intExpriredDays).ToString("yyyy/MM/dd HH:mm:ss") + "'" + " , 'yyyy/mm/dd hh24:mi:ss')"; CollectionSQL.Add(strSQL); // //2020/06/16 Elvis 0073467: [605]AutoRun 清除過期ERP交易紀錄增加刪除tblERPTransactionXMLlog_Basis strSQL = "DELETE FROM tblERPTransactionXMLlog_Basis" + " WHERE CreateDate < to_date(" + " '" + datEventTime.AddDays(0 - intExpriredDays).ToString("yyyy/MM/dd HH:mm:ss") + "'" + " , 'yyyy/mm/dd hh24:mi:ss')"; CollectionSQL.Add(strSQL); // 2022/05/12 17046 0133203: [6.0.7]出货时默认将各行业包标准BR对应的效能监控 strSQL = "DELETE FROM TBLSYSERRORLOG" + " WHERE RECORDDATE < to_date(" + " '" + datEventTime.AddDays(0 - intExpriredDays).ToString("yyyy/MM/dd HH:mm:ss") + "'" + " , 'yyyy/mm/dd hh24:mi:ss')"; CollectionSQL.Add(strSQL); strSQL = "DELETE FROM TBLSYSEVENTLOG" + " WHERE RECORDDATE < to_date(" + " '" + datEventTime.AddDays(0 - intExpriredDays).ToString("yyyy/MM/dd HH:mm:ss") + "'" + " , 'yyyy/mm/dd hh24:mi:ss')"; CollectionSQL.Add(strSQL); strSQL = "DELETE FROM TBLSYSTRANSACTIONLOG" + " WHERE STARTTIME < to_date(" + " '" + datEventTime.AddDays(0 - intExpriredDays).ToString("yyyy/MM/dd HH:mm:ss") + "'" + " , 'yyyy/mm/dd hh24:mi:ss')"; CollectionSQL.Add(strSQL); // 更新資料庫 ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, CollectionSQL); } catch (Exception ex) { // 錯誤訊息: 截取錯誤訊息+換行符號 if (!string.IsNullOrEmpty(strReturnMessage)) { strReturnMessage += ControlChars.Cr + ex.Message; } else { strReturnMessage += ex.Message; } } if (string.IsNullOrEmpty(strReturnMessage)) { // //回傳Success funClearMESTransactionLogRet = "success"; } else { // Message長度4000限制 if (strReturnMessage.Length > 3996) strReturnMessage = strReturnMessage.Substring(0, 3996) + "..."; funClearMESTransactionLogRet = CombineFailMsg("0000-999999", strReturnMessage); } return funClearMESTransactionLogRet; } #endregion #region ---寫入log table共用Function--- // ======================================================================================================================== // 程式名稱:ComposeERPTransactionXMLLog // 傳入參數:對應table之column變數 // 傳回參數:組合後之SQL // 用 途:組合ERP交易記錄log之SQL // 撰寫人員:05876 崑源 // 撰寫日期:2017/02/08 // ======================================================================================================================== private string ComposeERPTransactionXMLLog(string Id, string BatchId, string ServiceName, string Erp2MesXML = defString, string ERPTransactionDate = defString, int Status = defInteger, string ProcessResult = defString, ArrayList arySQL = null, ArrayList aryParameter = null, int Mode = 0) { string ComposeERPTransactionXMLLogRet = default(string); string strSQLAddField, strSQLAddValue; IDataParameter param; var CollectionParameter = new Collection(); strSQLAddField = "Insert into tblERPTransactionXMLLog_Basis (ID, BatchID, ServiceName "; strSQLAddValue = " Values ('" + Id + "', '" + BatchId + "', '" + ServiceName + "'"; if ((ERPTransactionDate ?? "") != defString && !string.IsNullOrEmpty(ERPTransactionDate)) { var strErpDate = default(string); if (Mode == 0) { if (ERPTransactionDate.Length == 8) // ERP傳回的拋轉最後日期格式為『YYYYMMDD』,需轉換標準日期格式 { strErpDate = Strings.Left(ERPTransactionDate, 4) + "/" + Strings.Mid(ERPTransactionDate, 5, 2) + "/" + Strings.Mid(ERPTransactionDate, 7, 2); } else if (ERPTransactionDate.Length >= 14) // ERP傳回的拋轉最後日期格式為『YYYYMMDDHHMMSS』,需轉換標準日期格式 { strErpDate = Strings.Left(ERPTransactionDate, 4) + "/" + Strings.Mid(ERPTransactionDate, 5, 2) + "/" + Strings.Mid(ERPTransactionDate, 7, 2) + " " + Strings.Mid(ERPTransactionDate, 9, 2) + ":" + Strings.Mid(ERPTransactionDate, 11, 2) + ":" + Strings.Mid(ERPTransactionDate, 13, 2); } } else { strErpDate = ERPTransactionDate; } strSQLAddField = strSQLAddField + ", ERPTransactionDate"; strSQLAddValue = strSQLAddValue + ", To_Date('" + strErpDate + "','YYYY/MM/DD HH24:MI:SS')"; } if (Status != defInteger) { strSQLAddField = strSQLAddField + ", Status "; strSQLAddValue = strSQLAddValue + "," + Status; } if ((ProcessResult ?? "") != defString) { strSQLAddField = strSQLAddField + ", ProcessResult"; strSQLAddValue = strSQLAddValue + ",'" + ProcessResult + "'"; } // 創建日期統一為目前時間 strSQLAddField = strSQLAddField + ",CreateDate"; strSQLAddValue = strSQLAddValue + ", To_Date('" + Strings.Format(DateTime.Now, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')"; if (!(Erp2MesXML == null) & (Erp2MesXML ?? "") != defString) { strSQLAddField = strSQLAddField + ", ERP2MESXML"; if (strDataBaseType == "oracle") { strSQLAddValue += ", :P "; } else if (strDataBaseType == "mssql") { strSQLAddValue += ", @P "; } if (strDataBaseType == "oracle") { param = new OracleParameter(":P", OracleDbType.Clob, Erp2MesXML.Length, ((int)ParameterDirection.Input).ToString()); param.Value = Erp2MesXML; CollectionParameter.Add(param); param = null; } else if (strDataBaseType == "mssql") { param = new SqlParameter("@P", SqlDbType.NText, -1, ParameterDirection.Input, false, 0, 0, null, DataRowVersion.Current, Erp2MesXML); CollectionParameter.Add(param); param = null; } } // //Return arySQL.Add(strSQLAddField + ")" + strSQLAddValue + ")"); aryParameter.Add(CollectionParameter); ComposeERPTransactionXMLLogRet = ""; return ComposeERPTransactionXMLLogRet; } // ======================================================================================================================== // 程式名稱:TreatWriteLogTable // 傳入參數:(1) colResponseXML:所有ResponseXML之集合 // (2) strType:服務名稱 // 傳回參數:無 // 用 途:處理寫入log table // 撰寫人員:05876 崑源 // 撰寫日期:2017/02/08 // ======================================================================================================================== private void TreatWriteLogTable(Collection colResponseXML, string strType) { Collection colLogSQL = new Collection(), colLogSQL_Rows = new Collection(); string lastID = default(string), KeepLog; // 最終請求完成之id ArrayList idList = new ArrayList(), arySQL = new ArrayList(), arySQLParameter = new ArrayList(); var CreateDate = new DateTime(); iMESCIO.SCI.ERP.ERPResponseBase objResponse = null; foreach (string strOutXML in colResponseXML) { switch (strType ?? "") { case "item.get": { objResponse = new iMESCIO.SCI.ERP.Response.SCI_Response_item_get(); break; } case "supplier.get": { objResponse = new iMESCIO.SCI.ERP.Response.SCI_Response_supplier_get(); break; } case "item.supplier.get": { objResponse = new iMESCIO.SCI.ERP.Response.SCI_Response_item_supplier_get(); break; } case "customer.get": { objResponse = new iMESCIO.SCI.ERP.Response.SCI_Response_customer_get(); break; } case "warehouse.get": { objResponse = new iMESCIO.SCI.ERP.Response.SCI_Response_warehouse_get(); break; } case "storage.spaces.get": { objResponse = new iMESCIO.SCI.ERP.Response.SCI_Response_storage_spaces_get(); break; } case "department.get": { objResponse = new iMESCIO.SCI.ERP.Response.SCI_Response_department_get(); break; } case "machine.get": { objResponse = new iMESCIO.SCI.ERP.Response.SCI_Response_machine_get(); break; } case "shift.get": { objResponse = new iMESCIO.SCI.ERP.Response.SCI_Response_shift_get(); break; } case "op.get": { objResponse = new iMESCIO.SCI.ERP.Response.SCI_Response_op_get(); break; } case "workstation.get": { objResponse = new iMESCIO.SCI.ERP.Response.SCI_Response_workstation_get(); break; } case "resource.calendar.get": { objResponse = new iMESCIO.SCI.ERP.Response.SCI_Response_resource_calendar_get(); break; } case "mold.fixture.get": { objResponse = new iMESCIO.SCI.ERP.Response.SCI_Response_mold_fixture_get(); break; } case "user.get": { objResponse = new iMESCIO.SCI.ERP.Response.SCI_Response_user_get(); break; } } XmlDoc.LoadXml(strOutXML); objResponse.ParseXmlToObject(strOutXML); var nodeID = XmlDoc.SelectSingleNode("/response/reqid"); // 20221007,13871,註解此,0119552: [6.0.5]KeepLog 日誌刪除相關式程式碼註解 // KeepLog = AppSettings("keepLog") // If (KeepLog <> "") AndAlso (IsNumeric(KeepLog)) Then // '----- 清除小於保留天數的 TransactionBasis Log ----- // CreateDate = DateAdd(DateInterval.Day, -1 * KeepLog, DateTime.Now) // colLogSQL.Add("delete from TBLERPTRANSACTIONXMLLOG_BASIS where createdate < To_Date('" & Format(CreateDate, "yyyy/MM/dd H:mm:ss") & "','YYYY/MM/DD HH24:MI:SS')") // colLogSQL_Rows.Add(-1) // End If // 判斷當有LOG資料時,先刪除再新增 if (HaveLogData(nodeID.InnerText)) { colLogSQL.Add("DELETE FROM TBLERPTRANSACTIONXMLLOG_BASIS WHERE ID = '" + nodeID.InnerText + "'"); colLogSQL_Rows.Add(-1); } string pData_Time = string.Empty; Type t = objResponse.GetType(); System.Reflection.PropertyInfo pi = t.GetProperty("data_time"); if (pi != null) { pData_Time = pi.GetValue(objResponse).ToString(); } int pStatus = -1; if (objResponse.srvcode != null && objResponse.srvcode.Equals("000") && objResponse != null && objResponse.code.Equals("0")) pStatus = 1; else pStatus = -1; ComposeERPTransactionXMLLog(nodeID.InnerText, nodeID.InnerText, strType, strOutXML, pData_Time, pStatus, objResponse.description, arySQL, arySQLParameter); // Dim strLogSQL As String = ComposeERPTransactionXMLLog(nodeID.InnerText, nodeID.InnerText, strType, strOutXML, pData_Time, pStatus, objResponse.description) // colLogSQL.Add(strLogSQL) // colLogSQL_Rows.Add(1) lastID = nodeID.InnerText; idList.Add(nodeID.InnerText); } // 將所有請求之BatchID設成最終請求完成之id foreach (string strID in idList) { if ((strID ?? "") != (lastID ?? "")) { colLogSQL.Add("UPDATE TBLERPTRANSACTIONXMLLOG_BASIS SET BATCHID = '" + lastID + "' WHERE ID = '" + strID + "'"); colLogSQL_Rows.Add(1); } } // 正式寫入log table if (colLogSQL.Count > 0 || arySQL.Count > 0) { // Call ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colLogSQL, colLogSQL_Rows) string argstrDatabaseType = Conversions.ToString(DataBaseType); Collection argCollectionSQL_Rows = null; ExecuteSQLNoneQuery_CLOB_Multi(argstrDatabaseType, strConnectionString, colLogSQL, arySQL, arySQLParameter, CollectionSQL_Rows: argCollectionSQL_Rows); } } // ======================================================================================================================== // 程式名稱:UpdateLogTableErrorInfo // 傳入參數:(1) strId:reqid // (2) strErrorInfo:錯誤訊息 // 傳回參數:無 // 用 途:更新錯誤訊息 // 撰寫人員:05876 崑源 // 撰寫日期:2017/03/13 // ======================================================================================================================== private void UpdateLogTableErrorInfo(Collection colResponseXML, string strType, string strErrorInfo) { Collection colLogSQL = new Collection(), colLogSQL_Rows = new Collection(); string strSQL; ArrayList arySQL = new ArrayList(), arySQLParameter = new ArrayList(); XmlNode nodeID; string id = string.Empty; string pData_Time = string.Empty; pData_Time = DateTime.Now.ToString("yyyyMMddHHmmss"); foreach (string strOutXML in colResponseXML) { arySQL.Clear(); arySQLParameter.Clear(); colLogSQL.Clear(); colLogSQL_Rows.Clear(); // If colResponseXML.Count > 0 Then // strOutXML = colResponseXML.Item(colResponseXML.Count).ToString try { XmlDoc.LoadXml(strOutXML); nodeID = XmlDoc.SelectSingleNode("/response/reqid"); } catch (Exception ex) { nodeID = null; } // End If if (nodeID == null) { id = Guid.NewGuid().ToString(); } else { id = nodeID.InnerText; } if (HaveLogData(id) == false) // 沒有TBLERPTRANSACTIONXMLLOG_BASIS資料直接寫入錯誤訊息 { // strOutXML = CInput(Microsoft.VisualBasic.Left(strOutXML, 1000)) string argstrInput = Strings.Left(strErrorInfo, 1000); strErrorInfo = CInput(argstrInput); string strLogSQL = ComposeERPTransactionXMLLog(id, id, strType, strOutXML, pData_Time, Conversions.ToInteger("-1"), strErrorInfo, arySQL, arySQLParameter); } // colLogSQL.Add(strLogSQL) // colLogSQL_Rows.Add(1) else { strSQL = "UPDATE TBLERPTRANSACTIONXMLLOG_BASIS SET STATUS = -1, PROCESSRESULT = '" + ChkSingleQuation(strErrorInfo) + "' WHERE ID = '" + id + "'"; colLogSQL.Add(strSQL); colLogSQL_Rows.Add(1); } // 正式寫入log table if (colLogSQL.Count > 0 || arySQL.Count > 0) { // Call ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colLogSQL, colLogSQL_Rows) string argstrDatabaseType = Conversions.ToString(DataBaseType); Collection argCollectionSQL_Rows = null; ExecuteSQLNoneQuery_CLOB_Multi(argstrDatabaseType, strConnectionString, colLogSQL, arySQL, arySQLParameter, CollectionSQL_Rows: argCollectionSQL_Rows); } // Call ExecuteSQLNoneQuery(strDataBaseType, strConnectionString, strSQL) } } // ======================================================================================================================== // 程式名稱:SplitInParts // 傳入參數:(1) s:欲處理字串 // (2) partLength:指定裁切長度 // 傳回參數:無 // 用 途:將字串切成指定長度之陣列 // 撰寫人員:05876 崑源 // 撰寫日期:2017/02/08 // ======================================================================================================================== private IEnumerable SplitInParts(string s, int partLength) { return Enumerable.Range(0, (int)Math.Round(Math.Ceiling(s.Length / (double)partLength))).Select(i => s.Substring(i * partLength, s.Length - i * partLength >= partLength ? partLength : Math.Abs(s.Length - i * partLength))); } /// /// 判斷是否存在相同交易id資料 /// /// req id /// 是否存在相同交易id資料(True / False) /// 2017/3/13 Add by KunYuan public bool HaveLogData(string strID) { bool result = false; var cnnTemp = default(IDbConnection); DbDataReader drTemp; try { cnnTemp = CreateConnection(strConnectionString); string strSQL = "SELECT COUNT(1) AS CNT FROM TBLERPTRANSACTIONXMLLOG_BASIS WHERE ID ='" + strID + "'"; //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); while (drTemp.Read()) { if (Conversions.ToBoolean(!Operators.ConditionalCompareObjectEqual(drTemp["CNT"], "0", false))) result = true; } drTemp.Close(); } catch (Exception ex) { result = false; } finally { CloseConnection(cnnTemp); } return result; } // ======================================================================================================================== // 程式名稱:GetERPTransactionDate // 傳入參數:ServiceName:服務名稱 // 傳回參數:無 // 用 途:取得log tableERP拋回的最後執行時間 // 撰寫人員:06475 lijyun // 撰寫日期:2017/03/16 // ======================================================================================================================== private string GetERPTransactionDate(string ServiceName) { string strSQL; string strERPDate = defString; DbDataReader drTemp = null; IDbConnection cnnMES = null; try { cnnMES = CreateConnection(strConnectionString); strSQL = "SELECT MAX(ERPTRANSACTIONDATE) as ERPTRANSACTIONDATE FROM TBLERPTRANSACTIONXMLLOG_BASIS WHERE SERVICENAME = '" + ServiceName + "'"; //cmmTemp = new IDbCommand(strSQL, cnnMES); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); if (drTemp.Read()) { if (drTemp["ERPTRANSACTIONDATE"] is DBNull) { strERPDate = Strings.Format(DateTime.Now.AddDays(-1), "yyyyMMddHHmmssfff"); } else { strERPDate = Strings.Format(drTemp["ERPTRANSACTIONDATE"], "yyyyMMddHHmmssfff"); } } drTemp.Close(); } catch (Exception) { throw; } finally { if (drTemp != null) drTemp.Close(); CloseConnection(cnnMES); } //cmmTemp.Dispose(); return strERPDate; } private string GetDate(string pValue, string pParameterName) { string GetDateRet = default(string); string strDate = ""; try { if (Information.IsDate(pValue)) { strDate = Strings.Format(Conversions.ToDate(pValue), "yyyyMMddHHmmssfff"); } else { throw new Exception(pParameterName + " value is " + pValue + " DateTime Format is Error!(The format string like: yyyy-MM-dd HH:mm:ss.fff)"); } GetDateRet = strDate; } catch (Exception ex) { throw; } return GetDateRet; } // 2021/3/30 Steven E10ICD 紀錄LOG資料 private void TreatWriteLogTable_E10ICD(Collection colResponseXML, string strType) { Collection colLogSQL = new Collection(), colLogSQL_Rows = new Collection(); string lastID = default(string), KeepLog; // 最終請求完成之id ArrayList idList = new ArrayList(), arySQL = new ArrayList(), arySQLParameter = new ArrayList(); var CreateDate = new DateTime(); iMESCIO.SCI.ERP.ERPResponseBase objResponse = null; foreach (string strOutXML in colResponseXML) { switch (strType ?? "") { case "item.get.e10icd": { objResponse = new iMESCIO.SCI.ERP.Response_E10ICD.SCI_Response_item_get(); break; } case "supplier.get": { objResponse = new iMESCIO.SCI.ERP.Response_E10ICD.SCI_Response_supplier_get(); break; } case "item.supplier.get": { objResponse = new iMESCIO.SCI.ERP.Response_E10ICD.SCI_Response_item_supplier_get(); break; } case "customer.get": { objResponse = new iMESCIO.SCI.ERP.Response_E10ICD.SCI_Response_customer_get(); break; } case "warehouse.get": { objResponse = new iMESCIO.SCI.ERP.Response_E10ICD.SCI_Response_warehouse_get(); break; } case "storage.spaces.get": { objResponse = new iMESCIO.SCI.ERP.Response_E10ICD.SCI_Response_storage_spaces_get(); break; } case "department.get": { objResponse = new iMESCIO.SCI.ERP.Response_E10ICD.SCI_Response_department_get(); break; } case "machine.get": { objResponse = new iMESCIO.SCI.ERP.Response_E10ICD.SCI_Response_machine_get(); break; } case "shift.get": { objResponse = new iMESCIO.SCI.ERP.Response_E10ICD.SCI_Response_shift_get(); break; } case "op.get.e10icd": { objResponse = new iMESCIO.SCI.ERP.Response_E10ICD.SCI_Response_op_get(); break; } case "workstation.get": { objResponse = new iMESCIO.SCI.ERP.Response_E10ICD.SCI_Response_workstation_get(); break; } case "resource.calendar.get": { objResponse = new iMESCIO.SCI.ERP.Response_E10ICD.SCI_Response_resource_calendar_get(); break; } case "mold.fixture.get": { objResponse = new iMESCIO.SCI.ERP.Response_E10ICD.SCI_Response_mold_fixture_get(); break; } case "user.get": { objResponse = new iMESCIO.SCI.ERP.Response_E10ICD.SCI_Response_user_get(); break; } } XmlDoc.LoadXml(strOutXML); objResponse.ParseXmlToObject(strOutXML); var nodeID = XmlDoc.SelectSingleNode("/response/reqid"); // 20221007,13871,註解此,0119552: [6.0.5]KeepLog 日誌刪除相關式程式碼註解 // KeepLog = AppSettings("keepLog") // If (KeepLog <> "") AndAlso (IsNumeric(KeepLog)) Then // '----- 清除小於保留天數的 TransactionBasis Log ----- // CreateDate = DateAdd(DateInterval.Day, -1 * KeepLog, DateTime.Now) // colLogSQL.Add("delete from TBLERPTRANSACTIONXMLLOG_BASIS where createdate < To_Date('" & Format(CreateDate, "yyyy/MM/dd H:mm:ss") & "','YYYY/MM/DD HH24:MI:SS')") // colLogSQL_Rows.Add(-1) // End If // 判斷當有LOG資料時,先刪除再新增 if (HaveLogData(nodeID.InnerText)) { colLogSQL.Add("DELETE FROM TBLERPTRANSACTIONXMLLOG_BASIS WHERE ID = '" + nodeID.InnerText + "'"); colLogSQL_Rows.Add(-1); } string pData_Time = string.Empty; Type t = objResponse.GetType(); System.Reflection.PropertyInfo pi = t.GetProperty("data_time"); if (pi != null) { pData_Time = pi.GetValue(objResponse).ToString(); } int pStatus = -1; if (objResponse.srvcode != null && objResponse.srvcode.Equals("000") && objResponse != null && objResponse.code.Equals("0")) pStatus = 1; else pStatus = -1; ComposeERPTransactionXMLLog(nodeID.InnerText, nodeID.InnerText, strType, strOutXML, pData_Time, pStatus, objResponse.description, arySQL, arySQLParameter); // Dim strLogSQL As String = ComposeERPTransactionXMLLog(nodeID.InnerText, nodeID.InnerText, strType, strOutXML, pData_Time, pStatus, objResponse.description) // colLogSQL.Add(strLogSQL) // colLogSQL_Rows.Add(1) lastID = nodeID.InnerText; idList.Add(nodeID.InnerText); } // 將所有請求之BatchID設成最終請求完成之id foreach (string strID in idList) { if ((strID ?? "") != (lastID ?? "")) { colLogSQL.Add("UPDATE TBLERPTRANSACTIONXMLLOG_BASIS SET BATCHID = '" + lastID + "' WHERE ID = '" + strID + "'"); colLogSQL_Rows.Add(1); } } // 正式寫入log table if (colLogSQL.Count > 0 || arySQL.Count > 0) { // Call ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colLogSQL, colLogSQL_Rows) string argstrDatabaseType = Conversions.ToString(DataBaseType); Collection argCollectionSQL_Rows = null; ExecuteSQLNoneQuery_CLOB_Multi(argstrDatabaseType, strConnectionString, colLogSQL, arySQL, arySQLParameter, CollectionSQL_Rows: argCollectionSQL_Rows); } } #endregion #region 須使用COM_ERP之Function #region get ERP Setting data /// /// 向資料庫取得使用Workflow時的ERP整合設定資訊。 /// /// /// public object GetERPSetting_WF(Collection colParameter = null) { object GetERPSetting_WFRet = default(object); // Gary Lu 20120614:ERP整合設定統一由此函數取得 StringReader tmpStringReader; // 將字串轉換成可讀入DataSet的物件 string strERPSettingTableName; string InXml, OutXml, strIdentity, strParameter, XmlData, XmlSchema; // 呼叫WS的字串參數 var XmlDoc = new XmlDocument(); try { var dsERPSetting_WF = new DataSet(); // 組InXml string argSendTime = Conversions.ToString(DateTime.Now); strIdentity = CombineXMLIdentity(modWIN.gComputerName, modWIN.gUserNo, argSendTime); // 2019/05/15 Edison WorkFlow修正為Workflow 修正取不到ERP SETTING的問題 string argvalue_name = "erpname"; string argname = "ERPName"; string argtype = "String"; string argvalue = "Workflow"; string argdesc = ""; strParameter = CombineXMLParameter(argvalue_name, argname, argtype, argvalue, argdesc); InXml = CombineXMLRequest(strIdentity, strParameter); // 呼叫Web服務執行 // Using wsSYS As New wsSYS.wsSYS // wsSYS.Url = LocalizeWebService(wsSYS.Url.ToString) // wsSYS.EnableDecompression = True // OutXml = wsSYS.LoadERPSetting(InXml) // End Using OutXml = modAutoRunLibrary.InvokeSrv("wsSYS.LoadERPSetting", InXml); // 解讀Web服務的執行結果 XmlDoc.LoadXml(OutXml); if (chkExecutionSuccess(XmlDoc)) { // 讀取取出資料表的名稱 strERPSettingTableName = XmlDoc.GetElementsByTagName("returnvalue").Item(0).SelectNodes("loaderpsetting").Item(0).SelectNodes("name").Item(0).InnerXml; // 取出Schema,dataset讀取Schema可防止Null Field及DateTime的問題 XmlSchema = XmlDoc.DocumentElement.GetElementsByTagName("loaderpsetting").Item(0).SelectNodes("schema").Item(0).InnerXml; if (!string.IsNullOrEmpty(XmlSchema)) { // 將XML讀入String Reader object中,因為Dataset讀入XML時必須透過String Reader物件 tmpStringReader = new StringReader(XmlSchema); dsERPSetting_WF.ReadXmlSchema(tmpStringReader); tmpStringReader.Close(); } // 取出Data XmlData = XmlDoc.DocumentElement.GetElementsByTagName("loaderpsetting").Item(0).SelectNodes("value").Item(0).InnerXml; if (!string.IsNullOrEmpty(XmlData)) { tmpStringReader = new StringReader(XmlData); dsERPSetting_WF.ReadXml(tmpStringReader, XmlReadMode.InferSchema); tmpStringReader.Close(); } if (dsERPSetting_WF.Tables[strERPSettingTableName].Rows.Count > 0) { gERPUser = dsERPSetting_WF.Tables[strERPSettingTableName].Rows[0]["ERP_USER"].ToString(); gERPPassword = dsERPSetting_WF.Tables[strERPSettingTableName].Rows[0]["ERP_PWD"].ToString(); gERPWSURL = dsERPSetting_WF.Tables[strERPSettingTableName].Rows[0]["ERP_WSURL"].ToString(); gERPOraganization = dsERPSetting_WF.Tables[strERPSettingTableName].Rows[0]["ERP_ORG"].ToString(); gERPLanguage = dsERPSetting_WF.Tables[strERPSettingTableName].Rows[0]["ERP_LANG"].ToString(); } else { throw new Exception("funGetERPSetting_WF Fail!"); } } else { throw new Exception("funGetERPSetting_WF Fail!"); } } catch (Exception Ex) { // 發生錯誤時丟回本身的Function Name及系統錯誤訊息 GetERPSetting_WFRet = "fail;" + Ex.Message; } // 發送EMAIL if (colParameter != null) colParameter.Add(GetERPSetting_WFRet, "EmailBody"); return GetERPSetting_WFRet; } /// /// 向資料庫取得使用Workflow時的ERP整合設定資訊。 /// /// /// E10 2021/03/24 Elvis public object GetERPSetting_E10ICD(Collection colParameter = null) { object GetERPSetting_E10ICDRet = default(object); // Gary Lu 20120614:ERP整合設定統一由此函數取得 StringReader tmpStringReader; // 將字串轉換成可讀入DataSet的物件 string strERPSettingTableName; string InXml, OutXml, strIdentity, strParameter, XmlData, XmlSchema; // 呼叫WS的字串參數 var XmlDoc = new XmlDocument(); try { var dsERPSetting_E10ICD = new DataSet(); // 組InXml string argSendTime = Conversions.ToString(DateTime.Now); strIdentity = CombineXMLIdentity(modWIN.gComputerName, modWIN.gUserNo, argSendTime); // 2019/05/15 Edison WorkFlow修正為Workflow 修正取不到ERP SETTING的問題 string argvalue_name = "erpname"; string argname = "ERPName"; string argtype = "String"; string argvalue = "E10ICD"; string argdesc = ""; strParameter = CombineXMLParameter(argvalue_name, argname, argtype, argvalue, argdesc); InXml = CombineXMLRequest(strIdentity, strParameter); // 呼叫Web服務執行 // Using wsSYS As New wsSYS.wsSYS // wsSYS.Url = LocalizeWebService(wsSYS.Url.ToString) // wsSYS.EnableDecompression = True // OutXml = wsSYS.LoadERPSetting(InXml) // End Using OutXml = modAutoRunLibrary.InvokeSrv("wsSYS.LoadERPSetting", InXml); // 解讀Web服務的執行結果 XmlDoc.LoadXml(OutXml); if (chkExecutionSuccess(XmlDoc)) { // 讀取取出資料表的名稱 strERPSettingTableName = XmlDoc.GetElementsByTagName("returnvalue").Item(0).SelectNodes("loaderpsetting").Item(0).SelectNodes("name").Item(0).InnerXml; // 取出Schema,dataset讀取Schema可防止Null Field及DateTime的問題 XmlSchema = XmlDoc.DocumentElement.GetElementsByTagName("loaderpsetting").Item(0).SelectNodes("schema").Item(0).InnerXml; if (!string.IsNullOrEmpty(XmlSchema)) { // 將XML讀入String Reader object中,因為Dataset讀入XML時必須透過String Reader物件 tmpStringReader = new StringReader(XmlSchema); dsERPSetting_E10ICD.ReadXmlSchema(tmpStringReader); tmpStringReader.Close(); } // 取出Data XmlData = XmlDoc.DocumentElement.GetElementsByTagName("loaderpsetting").Item(0).SelectNodes("value").Item(0).InnerXml; if (!string.IsNullOrEmpty(XmlData)) { tmpStringReader = new StringReader(XmlData); dsERPSetting_E10ICD.ReadXml(tmpStringReader, XmlReadMode.InferSchema); tmpStringReader.Close(); } if (dsERPSetting_E10ICD.Tables[strERPSettingTableName].Rows.Count > 0) { gERPUser = dsERPSetting_E10ICD.Tables[strERPSettingTableName].Rows[0]["ERP_USER"].ToString(); gERPPassword = dsERPSetting_E10ICD.Tables[strERPSettingTableName].Rows[0]["ERP_PWD"].ToString(); gERPWSURL = dsERPSetting_E10ICD.Tables[strERPSettingTableName].Rows[0]["ERP_WSURL"].ToString(); gERPOraganization = dsERPSetting_E10ICD.Tables[strERPSettingTableName].Rows[0]["ERP_ORG"].ToString(); gERPLanguage = dsERPSetting_E10ICD.Tables[strERPSettingTableName].Rows[0]["ERP_LANG"].ToString(); } else { throw new Exception("funGetERPSetting_E10ICD Fail!"); } } else { throw new Exception("funGetERPSetting_E10ICD Fail!"); } } catch (Exception Ex) { // 發生錯誤時丟回本身的Function Name及系統錯誤訊息 GetERPSetting_E10ICDRet = "fail;" + Ex.Message; } // 發送EMAIL if (colParameter != null) colParameter.Add(GetERPSetting_E10ICDRet, "EmailBody"); return GetERPSetting_E10ICDRet; } #endregion #endregion #region --- WF ERP Request --- public string cbXMLAccess_WF(string User = null, string Password = null, string ApplicationName = null, string Source = null, string Oraganization = null, string Language = null) { string cbXMLAccess_WFRet = default(string); GetERPSetting_WF(); try { // Gary Lu 20120607:ERPSignIn改由來自資料庫的ERP Setting表 if (User == null) User = gERPUser; if (Password == null) Password = gERPPassword; if (ApplicationName == null) ApplicationName = "MES"; if (Source == null) Source = modWIN.gComputerName; if (Oraganization == null) Oraganization = gERPOraganization; if (Language == null) Language = gERPLanguage; } // MessageBox.Show("get app ERPSignIn " & vbCrLf & GetAppSettings("ERPSignIn")) // Authentication User; Password; Connection Application; Source; Organization Name; Local Language // Dim ary As Array = Split(GetAppSettings("ERPSignIn"), ";") // If String.IsNullOrEmpty(ary(0)) = False Then User = ary(0) // If String.IsNullOrEmpty(ary(1)) = False Then Password = ary(1) // If String.IsNullOrEmpty(ary(2)) = False Then ApplicationName = ary(2) // If String.IsNullOrEmpty(ary(3)) = False Then Source = ary(3) // If String.IsNullOrEmpty(ary(4)) = False Then Oraganization = ary(4) // If String.IsNullOrEmpty(ary(5)) = False Then Language = ary(5) catch (Exception ex) { cbXMLAccess_WFRet = "cbXMLAccess_WF fail;" + ex.Message; } // Dim heserver As Net.IPHostEntry = System.Net.Dns.Resolve(SystemInformation.ComputerName) // Dim curAdd As Net.IPAddress // For Each curAdd In heserver.AddressList // Source = curAdd.ToString // Next cbXMLAccess_WFRet = "" + Oraganization + "" + '\n'; cbXMLAccess_WFRet += "" + User + "" + '\n'; return cbXMLAccess_WFRet; } public string cbXMLParameter_WF(string ReferenceType, string ReferenceCase) { string cbXMLParameter_WFRet = default(string); cbXMLParameter_WFRet = "" + ReferenceType + "" + '\n'; cbXMLParameter_WFRet += "" + ReferenceCase + "" + '\n'; return cbXMLParameter_WFRet; } public string cbXMLField_WF(string name, string value) { string cbXMLField_WFRet = default(string); cbXMLField_WFRet = "<" + name + ">" + value + "" + '\n'; return cbXMLField_WFRet; } public string cbXMLFormHead_WF(string strTableName, string strRecordList) { string cbXMLFormHead_WFRet = default(string); cbXMLFormHead_WFRet = "" + '\n'; cbXMLFormHead_WFRet += "" + strTableName + "" + '\n'; cbXMLFormHead_WFRet += strRecordList; cbXMLFormHead_WFRet += "" + '\n'; return cbXMLFormHead_WFRet; } public string cbXMLFormBody_WF(string strTableName, string strRecordList) { string cbXMLFormBody_WFRet = default(string); cbXMLFormBody_WFRet = "" + '\n'; cbXMLFormBody_WFRet += "" + strTableName + "" + '\n'; cbXMLFormBody_WFRet += strRecordList; cbXMLFormBody_WFRet += "" + '\n'; return cbXMLFormBody_WFRet; } public string cbXMLRecordList_WF(string strTempField) { string cbXMLRecordList_WFRet = default(string); cbXMLRecordList_WFRet = "" + '\n' + strTempField + "" + '\n'; return cbXMLRecordList_WFRet; } public string cbXMLData_WF(string head, string body) { string cbXMLData_WFRet = default(string); cbXMLData_WFRet = "" + '\n'; cbXMLData_WFRet += head; cbXMLData_WFRet += body; cbXMLData_WFRet += "" + '\n'; return cbXMLData_WFRet; } public string cbXMLRequest_WF(string strAccess, string strParameter, string strData) { string cbXMLRequest_WFRet = default(string); cbXMLRequest_WFRet = "" + '\n'; cbXMLRequest_WFRet += strAccess; cbXMLRequest_WFRet += strParameter; cbXMLRequest_WFRet += strData; cbXMLRequest_WFRet += ""; return cbXMLRequest_WFRet; } #region --- E10ICD ERP Request --- public string cbXMLAccess_E10ICD(string User = null, string Password = null, string ApplicationName = null, string Source = null, string Oraganization = null, string Language = null) { string cbXMLAccess_E10ICDRet = default(string); GetERPSetting_E10ICD(); try { // Gary Lu 20120607:ERPSignIn改由來自資料庫的ERP Setting表 if (User == null) User = gERPUser; if (Password == null) Password = gERPPassword; if (ApplicationName == null) ApplicationName = "MES"; if (Source == null) Source = modWIN.gComputerName; if (Oraganization == null) Oraganization = gERPOraganization; if (Language == null) Language = gERPLanguage; } // MessageBox.Show("get app ERPSignIn " & vbCrLf & GetAppSettings("ERPSignIn")) // Authentication User; Password; Connection Application; Source; Organization Name; Local Language // Dim ary As Array = Split(GetAppSettings("ERPSignIn"), ";") // If String.IsNullOrEmpty(ary(0)) = False Then User = ary(0) // If String.IsNullOrEmpty(ary(1)) = False Then Password = ary(1) // If String.IsNullOrEmpty(ary(2)) = False Then ApplicationName = ary(2) // If String.IsNullOrEmpty(ary(3)) = False Then Source = ary(3) // If String.IsNullOrEmpty(ary(4)) = False Then Oraganization = ary(4) // If String.IsNullOrEmpty(ary(5)) = False Then Language = ary(5) catch (Exception ex) { cbXMLAccess_E10ICDRet = "cbXMLAccess_E10ICD fail;" + ex.Message; } // Dim heserver As Net.IPHostEntry = System.Net.Dns.Resolve(SystemInformation.ComputerName) // Dim curAdd As Net.IPAddress // For Each curAdd In heserver.AddressList // Source = curAdd.ToString // Next cbXMLAccess_E10ICDRet = "" + Oraganization + "" + '\n'; cbXMLAccess_E10ICDRet += "" + User + "" + '\n'; return cbXMLAccess_E10ICDRet; } public string cbXMLParameter_E10ICD(string ReferenceType, string ReferenceCase) { string cbXMLParameter_E10ICDRet = default(string); cbXMLParameter_E10ICDRet = "" + ReferenceType + "" + '\n'; cbXMLParameter_E10ICDRet += "" + ReferenceCase + "" + '\n'; return cbXMLParameter_E10ICDRet; } public string cbXMLField_E10ICD(string name, string value) { string cbXMLField_E10ICDRet = default(string); cbXMLField_E10ICDRet = "<" + name + ">" + value + "" + '\n'; return cbXMLField_E10ICDRet; } public string cbXMLFormHead_E10ICD(string strTableName, string strRecordList) { string cbXMLFormHead_E10ICDRet = default(string); cbXMLFormHead_E10ICDRet = "" + '\n'; cbXMLFormHead_E10ICDRet += "" + strTableName + "" + '\n'; cbXMLFormHead_E10ICDRet += strRecordList; cbXMLFormHead_E10ICDRet += "" + '\n'; return cbXMLFormHead_E10ICDRet; } public string cbXMLFormBody_E10ICD(string strTableName, string strRecordList) { string cbXMLFormBody_E10ICDRet = default(string); cbXMLFormBody_E10ICDRet = "" + '\n'; cbXMLFormBody_E10ICDRet += "" + strTableName + "" + '\n'; cbXMLFormBody_E10ICDRet += strRecordList; cbXMLFormBody_E10ICDRet += "" + '\n'; return cbXMLFormBody_E10ICDRet; } public string cbXMLRecordList_E10ICD(string strTempField) { string cbXMLRecordList_E10ICDRet = default(string); cbXMLRecordList_E10ICDRet = "" + '\n' + strTempField + "" + '\n'; return cbXMLRecordList_E10ICDRet; } public string cbXMLData_E10ICD(string head, string body) { string cbXMLData_E10ICDRet = default(string); cbXMLData_E10ICDRet = "" + '\n'; cbXMLData_E10ICDRet += head; cbXMLData_E10ICDRet += body; cbXMLData_E10ICDRet += "" + '\n'; return cbXMLData_E10ICDRet; } public string cbXMLRequest_E10ICD(string strAccess, string strParameter, string strData) { string cbXMLRequest_E10ICDRet = default(string); cbXMLRequest_E10ICDRet = "" + '\n'; cbXMLRequest_E10ICDRet += strAccess; cbXMLRequest_E10ICDRet += strParameter; cbXMLRequest_E10ICDRet += strData; cbXMLRequest_E10ICDRet += ""; return cbXMLRequest_E10ICDRet; } #endregion #endregion #region --- WF ERP Response --- /// /// 檢查ERP處理後結果: ERP執行狀態 /// /// /// /// public bool chkResponseGetException_WF(XmlDocument Xmldoc, ref string result, ref string code, ref string sysmsg, ref string mesmsg, ref string stack) { bool chkResponseGetException_WFRet = default(bool); chkResponseGetException_WFRet = false; do { try { result = Xmldoc.DocumentElement["result"].InnerText; if (result == "success") { chkResponseGetException_WFRet = true; break; } var de = Xmldoc.DocumentElement["exception"]; if (de == null == true) { break; } for (int i = 0, loopTo = de.ChildNodes.Count - 1; i <= loopTo; i++) { if (de.ChildNodes[i].Name == "code") { code = de.ChildNodes.Item(i).InnerText; } if (de.ChildNodes[i].Name == "sysmsg") { sysmsg = de.ChildNodes.Item(i).InnerText; } if (de.ChildNodes[i].Name == "mesmsg") { mesmsg = de.ChildNodes.Item(i).InnerText; } if (de.ChildNodes[i].Name == "stack") { stack = de.ChildNodes.Item(i).InnerText; } } } catch (Exception ex) { throw; } } while (false); return chkResponseGetException_WFRet; } public bool chkResponseContent_WF(XmlDocument Xmldoc, ref string responseValue) { bool chkResponseContent_WFRet = default(bool); try { chkResponseContent_WFRet = false; var de = Xmldoc.DocumentElement["Data"]; if (de == null == true) return chkResponseContent_WFRet; for (int i = 0, loopTo = de.ChildNodes.Count - 1; i <= loopTo; i++) { if (de.ChildNodes.Item(i).Name == "RecordList") { for (int j = 0, loopTo1 = de.ChildNodes.Item(i).ChildNodes.Count - 1; j <= loopTo1; j++) { if (de.ChildNodes.Item(i).ChildNodes[j].Name == "TD002") { responseValue = de.ChildNodes.Item(i).ChildNodes[j].InnerText; } } } } chkResponseContent_WFRet = true; } catch (Exception ex) { chkResponseContent_WFRet = false; } return chkResponseContent_WFRet; } #region --- E10ICD ERP Response --- /// /// 檢查ERP處理後結果: ERP執行狀態 /// /// /// /// public bool chkResponseGetException_E10ICD(XmlDocument Xmldoc, ref string result, ref string code, ref string sysmsg, ref string mesmsg, ref string stack) { bool chkResponseGetException_E10ICDRet = default(bool); chkResponseGetException_E10ICDRet = false; do { try { result = Xmldoc.DocumentElement["result"].InnerText; if (result == "success") { chkResponseGetException_E10ICDRet = true; break; } var de = Xmldoc.DocumentElement["exception"]; if (de == null == true) { break; } for (int i = 0, loopTo = de.ChildNodes.Count - 1; i <= loopTo; i++) { if (de.ChildNodes[i].Name == "code") { code = de.ChildNodes.Item(i).InnerText; } if (de.ChildNodes[i].Name == "sysmsg") { sysmsg = de.ChildNodes.Item(i).InnerText; } if (de.ChildNodes[i].Name == "mesmsg") { mesmsg = de.ChildNodes.Item(i).InnerText; } if (de.ChildNodes[i].Name == "stack") { stack = de.ChildNodes.Item(i).InnerText; } } } catch (Exception ex) { throw; } } while (false); return chkResponseGetException_E10ICDRet; } public bool chkResponseContent_E10ICD(XmlDocument Xmldoc, ref string responseValue) { bool chkResponseContent_E10ICDRet = default(bool); try { chkResponseContent_E10ICDRet = false; var de = Xmldoc.DocumentElement["Data"]; if (de == null == true) return chkResponseContent_E10ICDRet; for (int i = 0, loopTo = de.ChildNodes.Count - 1; i <= loopTo; i++) { if (de.ChildNodes.Item(i).Name == "RecordList") { for (int j = 0, loopTo1 = de.ChildNodes.Item(i).ChildNodes.Count - 1; j <= loopTo1; j++) { if (de.ChildNodes.Item(i).ChildNodes[j].Name == "TD002") { responseValue = de.ChildNodes.Item(i).ChildNodes[j].InnerText; } } } } chkResponseContent_E10ICDRet = true; } catch (Exception ex) { chkResponseContent_E10ICDRet = false; } return chkResponseContent_E10ICDRet; } #endregion #endregion #region EAI標準日期格式轉換String to DateTime #endregion #region MES發料(倒扣料)批次拋轉ERP private object funStartSyncing(Collection colParameters = null) { var obj = new EAIMessageSynchronizer(); string ReturnMessage = "fail"; try { obj.StartSyncing(colParameters); ReturnMessage = "success"; results = "success"; } catch (Exception ex) { if (ex.InnerException == null == false && !string.IsNullOrEmpty(ex.InnerException.Message)) { ReturnMessage = TranslateMsg(ex.InnerException.Message, strLanguageMode, strResourceDir); } else { ReturnMessage = TranslateMsg(ex.Message, strLanguageMode, strResourceDir); } // 紀錄TransactionLog results = "fail"; string argstrException = null; modAutoRunLibrary.addTransactionLog_ErrorCode("", ReturnMessage, DateTime.Now.ToString("yyyyMMddHHmmssss"), "MES", "StartSyncing", Environment.MachineName, "AutoRun", DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), results, ReturnMessage, "issue.wo.item.process", LogClass: "AutoRun", strException: argstrException); if (!string.IsNullOrEmpty(colParameters["Parameter01"].ToString().Trim())) { // 寄送Mail string argFileName = "N/A"; string argEmailSubject = "AutuRunJob : StartSyncing Fail![issue.wo.item.process]"; modAutoRunLibrary.SendMultiEmail(ref argFileName, ref argEmailSubject, ReturnMessage, colParameters["Parameter01"].ToString().Trim()); } } finally { obj = null; // ===manties:0095454 AutoRun addTransactionLog位置錯誤 需移至Finally 2021/07/06 // 紀錄TransactionLog string argstrException = null; modAutoRunLibrary.addTransactionLog("", ReturnMessage, DateTime.Now.ToString("yyyyMMddHHmmssss"), "MES", "StartSyncing", Environment.MachineName, "AutoRun", DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), results, ReturnMessage, "issue.wo.item.process", strException: argstrException); // === } return ReturnMessage; } #endregion #region --- 工時與機時分攤 --- private object funShareEQPTime(Collection colParameters = null) { object funShareEQPTimeRet = default(object); var cnnTemp = default(IDbConnection); //var daTemp = new System.Data.OleDb.OleDbDataAdapter(); var dsTemp = new DataSet(); DbDataReader drTemp; string strSQL, strSQL_Field, strSQL_Value; var datArriveTime = DateTime.Now; var datProductionDateFrom = default(DateTime); var datProductionDateEnd = default(DateTime); string strGroupNo = ""; // 使用者群組 // 2019/12/5,Ning,要更新Cont_Equipment.SummaryFlag的SQL,需全部收集後再更新, 否則第二筆要平攤的就會取不到第一筆的資料了 var colSQL_EQP = new Collection(); try { // ParameterXX參數說明 // 01:彙整日期[yyyy/MM/dd](如無指定則用昨天) // 02:使用者群組 // Parameter01為傳入參數,作為彙整日期,若無此值則用昨天當日期 if (colParameters["Parameter01"] == null || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter01"])))) { datProductionDateFrom = Conversions.ToDate(Strings.Format(DateTime.Now.AddDays(-1), "yyyy/MM/dd")); datProductionDateEnd = Conversions.ToDate(Strings.Format(DateTime.Now, "yyyy/MM/dd")); } else { do { try { datProductionDateFrom = Conversions.ToDate(Strings.Format(DateTime.Parse(colParameters["Parameter01"].ToString().Trim()), "yyyy/MM/dd")); datProductionDateEnd = Conversions.ToDate(Strings.Format(DateTime.Parse(colParameters["Parameter01"].ToString().Trim()).AddDays(1d), "yyyy/MM/dd")); } catch (Exception ex) { funShareEQPTimeRet = "Parse ProductionDate fail(yyyy/MM/dd)!!!(Parameter 01)"; break; } } while (false); } // Parameter02為傳入參數,作為GroupNo,若無此值則不進行下面的程式 if (colParameters["Parameter02"] == null || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter02"])))) { } // funCreateWOWorkReportData_T100,TP,WF,會當成SubFunction呼叫,發Mail通知,統一由主funciton發出. // funShareEQPTime = "User GroupNo not found!!!(Parameter 02)" // Exit Try else { strGroupNo = Strings.Trim(Conversions.ToString(colParameters["Parameter02"])); } cnnTemp = CreateConnection(strConnectionString); // 1.取出結算資料 // -對Lot來看,使用EventTime來重新結算資料,不使用EndTime. // 2019/6/13,Ning,加上SummaryFlag=0的條件 // 2021/06/10 Edison加上ChamerFlag=0的條件(0:主設備,1:子設備) strSQL = "Select A.EquipmentNo,A.StartTime,A.EndTime,A.InputQty,A.OutputQty,A.EventTime, " + " B.LogGroupSerial,B.LotNo,B.MONo,B.OPNo,B.ProductNo,B.ProductVersion " + " From tblWIPCont_Equipment A,tblWIPLotLog_Report B " + " Where A.EventTime>=To_Date('" + Strings.Format(Conversions.ToDate(datProductionDateFrom), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') " + " And A.EventTimeSplit,沒有tblWIPCont_Employee資料. if (string.IsNullOrEmpty(strUserNo)) { strUserNo = "N/A"; } DataRow[] drSel_EQP; drSel_EQP = dsTemp.Tables["tblCont_EQP"].Select(Conversions.ToString("LogGroupSerial='" + drLogGroup["LogGroupSerial"] + "'")); foreach (DataRow drEQP in drSel_EQP) { var colParameter = new Collection(); IDataParameter objParam; // 平攤各設備的時間,以各設備的StartTime做為起始. strMemo = ""; decEQPValue = fuShareEQPTime_OverLap(ref cnnTemp, ref colSQL, ref colSQL_Rows, ref strMemo, Conversions.ToString(drEQP["LotNo"]), drEQP["EquipmentNo"].ToString(), Conversions.ToDate(drEQP["StartTime"]), Conversions.ToDate(drEQP["EndTime"])); if (drEQP["InputQty"] is DBNull || Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drEQP["InputQty"], 0, false))) { decInputQty = 0m; } else { decInputQty = Conversions.ToDecimal(drEQP["InputQty"]); } // 標準機時(用Output來算). decEQPValue_Std = 0m; if (drEQP["OutputQty"] is DBNull) { decOutputQty = 0m; } else { decOutputQty = Conversions.ToDecimal(drEQP["OutputQty"]); strSQL = Conversions.ToString("Select StdUnitEQPTime,CountEQPUnitQty From tblPRDRunTimeSetup " + " Where ProductNo='" + drEQP["ProductNo"] + "' And ProductVersion='" + drEQP["ProductVersion"] + "'" + " And OPNo='" + drEQP["OPNo"] + "' And EquipmentNo='" + drEQP["EquipmentNo"].ToString() + "'" + " And CountEQPUnitQty<>0"); // 分母為0,無法計算,一律存0. //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (drTemp.Read()) { decEQPValue_Std = Conversions.ToDecimal(Strings.Format(Operators.DivideObject(Operators.MultiplyObject(decOutputQty, drTemp["StdUnitEQPTime"]), drTemp["CountEQPUnitQty"]), "0.00")); } drTemp.Close(); //cmmTemp.Dispose(); } // tblWIPCont_Resource_Share strSQL_Field = "Insert into tblWIPCont_Resource_Share " + " (LotNo,MONo,LogGroupSerial,OPNo," + " RESClass,RESItem,RESValue,StdValue,InputQty,OutputQty,UserNo,EventTime,CreateDate,ItemNo "; strSQL_Value = " Values ('" + drEQP["LotNo"] + "','" + drEQP["MONo"].ToString() + "','" + drEQP["LogGroupSerial"].ToString() + "','" + drEQP["OPNo"] + "', 1,'" + drEQP["EquipmentNo"].ToString() + "'," + decEQPValue + "," + decEQPValue_Std + "," + decInputQty + "," + decOutputQty + ",'" + strUserNo + "', To_Date('" + Strings.Format(Interaction.IIf(drEQP["EventTime"] is DBNull, drEQP["EndTime"], drEQP["EventTime"]), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')," + " To_Date('" + Strings.Format(datCreateDate, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')," + intItemNo; // 以CLOB方式儲存. if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(DataBaseType, "oracle", false))) { strSQL_Field = strSQL_Field + ",Memo"; strSQL_Value = strSQL_Value + ",:P"; objParam = new OracleParameter(":P", OracleDbType.Clob); objParam.Value = strMemo; colParameter.Add(objParam); objParam = null; } else if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(DataBaseType, "mssql", false))) { strSQL_Field = strSQL_Field + ",Memo"; strSQL_Value = strSQL_Value + ",@P"; objParam = new SqlParameter("@P", SqlDbType.NVarChar); objParam.Value = strMemo; colParameter.Add(objParam); objParam = null; } strSQL = strSQL_Field + ")" + strSQL_Value + ")"; arrParameter_SQL.Add(strSQL); arrParameter_CLOB.Add(colParameter); intItemNo = (short)(intItemNo + 1); // 2019/6/13,Ning,更新SummaryFlag strSQL = "Update tblWIPCont_Equipment Set SummaryFlag = 1" + " Where LogGroupSerial = '" + drEQP["LogGroupSerial"].ToString() + "' And EquipmentNo = '" + drEQP["EquipmentNo"].ToString() + "'" + " And StartTime = To_Date('" + Strings.Format(drEQP["StartTime"], "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')"; colSQL_EQP.Add(strSQL); } if (arrParameter_SQL.Count > 0) { // 2019/6/11,Ning,不做先刪除, 以便後續重拋時串資料 // 2020/2/14, Ning, 因取消報工單時SummaryFlag會被設為Null, 故資料會重覆滾算, 應先刪後增 // 若結算資料已存在,則先刪除,再存入. strSQL = Conversions.ToString("Delete From tblWIPCont_Resource_Share Where LogGroupSerial='" + drLogGroup["LogGroupSerial"] + "'" + " And RESClass=1"); colSQL.Add(strSQL); colSQL_Rows.Add(-1); ExecuteSQLNoneQuery_CLOB_Multi(strDataBaseType, strConnectionString, colSQL, arrParameter_SQL, arrParameter_CLOB, colSQL_Rows); } } // 更新tblWIPCont_Equipment.SummaryFlag ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, colSQL_EQP); // //Return success funShareEQPTimeRet = "success"; } catch (Exception ex) { funShareEQPTimeRet = CombineFailMsg("0000-999999", ex.Message); } finally { //if (daTemp != null) // daTemp.Dispose(); if (dsTemp != null) dsTemp.Dispose(); try { CloseConnection(cnnTemp); // 寄送Mail if (!string.IsNullOrEmpty(strGroupNo)) { string argFileName = "N/A"; string argEmailSubject = "Share EQP Time [" + Strings.Format(Conversions.ToDate(datProductionDateFrom), "yyyy/MM/dd H:mm:ss") + "~" + Strings.Format(Conversions.ToDate(datProductionDateEnd), "yyyy/MM/dd H:mm:ss") + "]"; string argEmailBody = Conversions.ToString(funShareEQPTimeRet); modAutoRunLibrary.SendMultiEmail(ref argFileName, ref argEmailSubject, argEmailBody, strGroupNo); funShareEQPTimeRet = argEmailBody; } } catch (Exception ex) { funShareEQPTimeRet = "fail_Finally;" + ex.Message; } } return funShareEQPTimeRet; } private decimal fuShareEQPTime_OverLap(ref IDbConnection cnnTemp, ref Collection colSQL, ref Collection colSQL_Rows, ref string strR_Memo, string strLotNo, string strEquipmentNo, DateTime datStartTime, DateTime datEndTime) { decimal fuShareEQPTime_OverLapRet = default(decimal); // 計算機時 //var daTemp = new System.Data.OleDb.OleDbDataAdapter(); var dsTemp = new DataSet(); DbDataReader drTemp; string strSQL; string strEQPMemo = ""; string strStart, strEnd; // L計算起迄 : S----------------------------------------------------------------------------E(設備下機點)----------C(結算點) // L Hold_1st : 3----4 // L Hold_2nd : 8-----9 // L1 : |----------------------- 6 // L1 Hold_1st : |----1 // L1 Hold_2nd : 3----4 // L2 : 5-------------------------------10 // L3 : 2---------------------------7 // L4 : 11--------------------------------| // L4 Hold_1st : 12----------------| // L5 : 13------------------------| // L6 : |------------------------------------------------------------------------------------------------|(未下機) // L6 Wait_1st : |-------------------------------------------------------------------------------------------------------| // L7 : |------------------------------------------------------------------------------------------------|已下機 // L8 : 11-------------------------------------|已下機 try { strEQPMemo = "Cal Time:" + Strings.Format(Conversions.ToDate(datStartTime), "yyyy/MM/dd H:mm:ss") + "~" + Strings.Format(Conversions.ToDate(datEndTime), "yyyy/MM/dd H:mm:ss"); strStart = "To_Date('" + Strings.Format(datStartTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')"; strEnd = "To_Date('" + Strings.Format(datEndTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')"; // 1.取出Overlap的時間段 // 2.StartTime要在範圍內(StartTimestrStart)才有計算的意義,否則會取出多餘的資料. // 2017/10/22,sammi.排除舊資料A.StartTime<>A.EndTime,不可以加此條件,因A.EndTime null的會被排除掉. // 2019/6/13,Ning,加上SummaryFlag=0的條件 // Case1: // L計算起迄 : S---------------------------------------------------------------------E // L1 : |----------------------- 6 strSQL = ""; strSQL += "Select A.StartTime,A.EndTime,A.LogGroupSerial,A.FromLotNo,B.LotNo " + " From tblWIPCont_Equipment A,tblWIPLotLog_Report B " + " Where A.EquipmentNo='" + strEquipmentNo + "'" + " And A.LogGroupSerial=B.LogGroupSerial " + " And Nvl(A.SummaryFlag,0) = 0 " + " And A.StartTime is not Null " + " And A.StartTime <= " + strStart + " And A.EndTime > " + strStart + " And A.EndTime <= " + strEnd; // Case2: // L計算起迄 : S---------------------------------------------------------------------E // L3 : 2---------------------------7 strSQL += " Union "; strSQL += "Select A.StartTime,A.EndTime,A.LogGroupSerial,A.FromLotNo,B.LotNo " + " From tblWIPCont_Equipment A,tblWIPLotLog_Report B " + " Where A.EquipmentNo='" + strEquipmentNo + "'" + " And A.LogGroupSerial=B.LogGroupSerial " + " And Nvl(A.SummaryFlag,0) = 0 " + " And A.StartTime is not Null " + " And A.StartTime >= " + strStart + " And A.EndTime <= " + strEnd; // Case3: // L計算起迄 : S---------------------------------------------------------------------E // L4 : 11------------------------|(未下機) // L8 : 11---------------------已下機 strSQL += " Union "; strSQL += "Select A.StartTime,A.EndTime,A.LogGroupSerial,A.FromLotNo,B.LotNo " + " From tblWIPCont_Equipment A,tblWIPLotLog_Report B " + " Where A.EquipmentNo='" + strEquipmentNo + "'" + " And A.LogGroupSerial=B.LogGroupSerial " + " And Nvl(A.SummaryFlag,0) = 0 " + " And A.StartTime is not Null " + " And A.StartTime >= " + strStart + " And A.StartTime < " + strEnd + " And (A.EndTime is null or A.EndTime >= " + strEnd + ")"; // Case4: // L計算起迄 : S---------------------------------------------------------------------E // L6 : |------------------------------------------------------------------------------------------------|(未下機) // L7 : |--------------------------------------------------------------------------------已下機 strSQL += " Union "; strSQL += "Select A.StartTime,A.EndTime,A.LogGroupSerial,A.FromLotNo,B.LotNo " + " From tblWIPCont_Equipment A,tblWIPLotLog_Report B " + " Where A.EquipmentNo='" + strEquipmentNo + "'" + " And A.LogGroupSerial=B.LogGroupSerial " + " And Nvl(A.SummaryFlag,0) = 0 " + " And A.StartTime is not Null " + " And A.StartTime < " + strStart + " And (A.EndTime is null or A.EndTime >= " + strEnd + ")"; SQLCommandTuning(strDataBaseType, ref strSQL); //cmmTemp = new IDbCommand(strSQL, cnnTemp); //daTemp.SelectCommand = cmmTemp; //daTemp.Fill(dsTemp, "tblEQP"); //cmmTemp.Dispose(); ExecuteSQLQuery_Adapter(strSQL, dsTemp, "tblEQP", cnnTemp); // 2.取得所有切割點 var dtSplitTime = new DataTable("tblSplitTime"); dtSplitTime.Columns.Add("SplitTime", Type.GetType("System.DateTime")); DataRow drAdd; foreach (DataRow drEQP in dsTemp.Tables["tblEQP"].Rows) { // 2.1 修正各段起迄 // StartTime if (DateAndTime.DateDiff(DateInterval.Second, Conversions.ToDate(drEQP["StartTime"]), datStartTime) > 0L) { // 調整StartTime,同StartTime,不需加入切割點. // L計算起迄 : S---------------------------------------------------------------------E // L1 : |----------------------- 6 drEQP["StartTime"] = datStartTime; } else if (DateAndTime.DateDiff(DateInterval.Second, Conversions.ToDate(drEQP["StartTime"]), datStartTime) == 0L) { } // 起始點,不需加入dtSplitTime. // 切割點 // L計算起迄 : S---------------------------------------------------------------------E // L2 : 5-------------------------------10 // L3 : 2---------------------------7 // L4 : 11------------------------| else if (dtSplitTime.Select("SplitTime=#" + Strings.Format(Conversions.ToDate(drEQP["StartTime"]), "yyyy/MM/dd H:mm:ss") + "#").Length == 0) { drAdd = dtSplitTime.NewRow(); drAdd["SplitTime"] = Strings.Format(Conversions.ToDate(drEQP["StartTime"]), "yyyy/MM/dd H:mm:ss"); dtSplitTime.Rows.Add(drAdd); } // EndTime if (drEQP["EndTime"] is DBNull || DateAndTime.DateDiff(DateInterval.Second, datEndTime, Conversions.ToDate(drEQP["EndTime"])) > 0L) { // 調整EndTime,同EndTime,不需加入切割點. // L計算起迄 : S---------------------------------------------------------------------E // L4 : 11------------------------| drEQP["EndTime"] = datEndTime; } // 切割點 // L計算起迄 : S---------------------------------------------------------------------E // L1 : |----------------------- 6 // L2 : 5-------------------------------10 // L3 : 2---------------------------7 else if (dtSplitTime.Select("SplitTime=#" + Strings.Format(Conversions.ToDate(drEQP["EndTime"]), "yyyy/MM/dd H:mm:ss") + "#").Length == 0) { drAdd = dtSplitTime.NewRow(); drAdd["SplitTime"] = Strings.Format(Conversions.ToDate(drEQP["EndTime"]), "yyyy/MM/dd H:mm:ss"); dtSplitTime.Rows.Add(drAdd); } // ----- 將UNDO鎖住 ----- strSQL = "Select distinct LotSerial "; strSQL += "From tblWIPLotLog "; strSQL += "Where LogGroupSerial='" + drEQP["LogGroupSerial"].ToString() + "'"; strSQL = " Update tblWIPReverseHistory Set CommitState=1,CommitDesc='AutoRun,funShareEQPTime' Where LotSerial In (" + strSQL + ")"; colSQL.Add(strSQL); colSQL_Rows.Add(-1); } // 結束點,需加入dtSplitTime. if (dtSplitTime.Select("SplitTime=#" + Strings.Format(Conversions.ToDate(datEndTime), "yyyy/MM/dd H:mm:ss") + "#").Length == 0) { drAdd = dtSplitTime.NewRow(); drAdd["SplitTime"] = Strings.Format(Conversions.ToDate(datEndTime), "yyyy/MM/dd H:mm:ss"); dtSplitTime.Rows.Add(drAdd); } // 3.依切割點依序平攤機時. DataRow[] drSel; DateTime datCal_Start; DateTime datCal_End; decimal decEQPValue = 0m; decimal decSplitValue = 0m; string strSplitMemo; short intSplit = 1; dtSplitTime.DefaultView.Sort = "SplitTime"; datCal_Start = datStartTime; foreach (DataRowView drvSplitTime in dtSplitTime.DefaultView) { datCal_End = Conversions.ToDate(drvSplitTime["SplitTime"]); decSplitValue = 0m; strSplitMemo = ""; short intLotCount = 0; // 平攤Lot數. // 找出平攤Lot數. foreach (DataRow drEQP in dsTemp.Tables["tblEQP"].Rows) { if (DateAndTime.DateDiff(DateInterval.Second, Conversions.ToDate(drEQP["StartTime"]), datCal_Start) >= 0L && DateAndTime.DateDiff(DateInterval.Second, datCal_End, Conversions.ToDate(drEQP["EndTime"])) >= 0L) { // 加入分攤筆數. intLotCount = (short)(intLotCount + 1); // 網狀製程 // -Lot會分佈在不同站,紀錄LogGroupSerial,分母是以OP來區分,相同Lot不同OP,視為多筆. strSplitMemo += ControlChars.CrLf + drEQP["LogGroupSerial"].ToString(); } else { // 排除,不需列入分攤筆數. } } if (intLotCount == 0) { // 2017/10/22,Sammi,不發出Error,讓CO可過帳,發生此Error的原因是Running的舊資料. // Throw New iMESException.MESException("0000-200015", "[%LotNo%]:" & RefLotNo & ControlChars.CrLf & _ // "#" & intSplit & ":" & Format(CDate(datCal_Start), "yyyy/MM/dd H:mm:ss") & "~" & Format(CDate(datCal_End), "yyyy/MM/dd H:mm:ss") & "," & _ // "[%Overlap%] [%LotCount%]=0!") // 2017/10/22,Sammi,不需平攤,用*註記,用以釐清是否為舊資料批. strSplitMemo += ControlChars.CrLf + "*"; // 單位秒. decSplitValue = DateAndTime.DateDiff(DateInterval.Second, datCal_Start, datCal_End); } else { // 單位秒. decSplitValue = (decimal)(DateAndTime.DateDiff(DateInterval.Second, datCal_Start, datCal_End) / (double)intLotCount); } // 總機時 decEQPValue += decSplitValue; strEQPMemo += ControlChars.CrLf + "#" + intSplit + ":" + Strings.Format(Conversions.ToDate(datCal_Start), "yyyy/MM/dd H:mm:ss") + "~" + Strings.Format(Conversions.ToDate(datCal_End), "yyyy/MM/dd H:mm:ss"); if (decSplitValue == 0m) { strEQPMemo += ControlChars.CrLf + "EQP=" + decSplitValue; } else if (intLotCount == 0) { // strEQPMemo += ControlChars.CrLf & "EQP=" & decSplitValue strEQPMemo += ControlChars.CrLf + "EQP=" + Strings.Format(decSplitValue / 60m, "0.00") + "," + DateAndTime.DateDiff(DateInterval.Second, datCal_Start, datCal_End) + "/60"; } else { strEQPMemo += ControlChars.CrLf + "EQP=" + Strings.Format(decSplitValue / 60m, "0.00") + "," + DateAndTime.DateDiff(DateInterval.Second, datCal_Start, datCal_End) + "/" + intLotCount + "/60"; } strEQPMemo += strSplitMemo; datCal_Start = datCal_End; intSplit = (short)(intSplit + 1); } // 機時分攤說明 strR_Memo = strEQPMemo; // 單位分,到小數二位. fuShareEQPTime_OverLapRet = Conversions.ToDecimal(Strings.Format(decEQPValue / 60m, "0.00")); } catch (Exception e1) { throw; } finally { if (dsTemp != null) dsTemp.Dispose(); //if (daTemp != null) // daTemp.Dispose(); } return fuShareEQPTime_OverLapRet; } private object funShareEMPTime(Collection colParameters = null) { object funShareEMPTimeRet = default(object); var cnnTemp = default(IDbConnection); //var daTemp = new System.Data.OleDb.OleDbDataAdapter(); var dsTemp = new DataSet(); DbDataReader drTemp; string strSQL, strSQL_Field, strSQL_Value; var datArriveTime = DateTime.Now; var datProductionDateFrom = default(DateTime); var datProductionDateEnd = default(DateTime); string strGroupNo = ""; // 使用者群組 string strCond = ""; // 條件式 // 2019/12/5,Ning,要更新Cont_Employee_MultiUser.SummaryFlag的SQL,需全部收集後再更新, 否則第二筆要平攤的就會取不到第一筆的資料了 var colSQL_EMP = new Collection(); try { // ParameterXX參數說明 // 01:彙整日期[yyyy/MM/dd](如無指定則用昨天) // 02:使用者群組 // Parameter01為傳入參數,作為彙整日期,若無此值則用昨天當日期 if (colParameters["Parameter01"] == null || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter01"])))) { datProductionDateFrom = Conversions.ToDate(Strings.Format(DateTime.Now.AddDays(-1), "yyyy/MM/dd")); datProductionDateEnd = Conversions.ToDate(Strings.Format(DateTime.Now, "yyyy/MM/dd")); } else { do { try { datProductionDateFrom = Conversions.ToDate(Strings.Format(DateTime.Parse(colParameters["Parameter01"].ToString().Trim()), "yyyy/MM/dd")); datProductionDateEnd = Conversions.ToDate(Strings.Format(DateTime.Parse(colParameters["Parameter01"].ToString().Trim()).AddDays(1d), "yyyy/MM/dd")); } catch (Exception ex) { funShareEMPTimeRet = "Parse ProductionDate fail(yyyy/MM/dd)!!!(Parameter 01)"; break; } } while (false); } // Parameter02為傳入參數,作為GroupNo,若無此值則不進行下面的程式 if (colParameters["Parameter02"] == null || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter02"])))) { } // funCreateWOWorkReportData_T100,TP,WF,會當成SubFunction呼叫,發Mail通知,統一由主funciton發出. // funShareEMPTime = "User GroupNo not found!!!(Parameter 02)" // Exit Try else { strGroupNo = Strings.Trim(Conversions.ToString(colParameters["Parameter02"])); } cnnTemp = CreateConnection(strConnectionString); // 1.取出結算資料 // -對Lot來看,使用EventTime來重新結算資料,不使用CheckOutTime. // -排除Duration=0:整段都是wait. // 2019/6/13,Ning,加上SummaryFlag=0的條件 strSQL = "Select 0 as DelFlag,A.UserNo,A.CheckInTime,A.CheckOutTime,A.Qty,A.EventTime,A.MultiOperatorMode,A.LoginPlaceNo, " + " B.LogGroupSerial,B.LotNo,B.MONo,B.OPNo,B.ProductNo,B.ProductVersion " + " From tblWIPCont_Employee_MultiUser A,tblWIPLotLog_Report B " + " Where A.EventTime>=To_Date('" + Strings.Format(Conversions.ToDate(datProductionDateFrom), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') " + " And A.EventTime 0 "; SQLCommandTuning(strDataBaseType, ref strSQL); //cmmTemp = new IDbCommand(strSQL, cnnTemp); //daTemp.SelectCommand = cmmTemp; //daTemp.Fill(dsTemp, "tblCont_EMP"); //daTemp.Dispose(); //cmmTemp.Dispose(); ExecuteSQLQuery_Adapter(strSQL, dsTemp, "tblCont_EMP", cnnTemp); var dtLogGroup = new DataTable(); dtLogGroup = dsTemp.Tables["tblCont_EMP"].DefaultView.ToTable(true, "LogGroupSerial"); // 2.計算平攤值 // -以一個站一個站的資料計算及commit,若結算資料已存在,則先刪除,再存入. var datCreateDate = DateTime.Now; decimal decEMPValue = 0m; // 計算,單位minute,到小數二位. decimal decEMPValue_Std = 0m; // 計算,單位minute,到小數二位. decimal decQty; string strMemo = ""; short intItemNo = 1; funWriteShareEMPLog("funShareEMPTime Start. Date: " + Strings.Format(datProductionDateFrom, "yyyy/MM/dd") + ". dtLogGroup.Rows.Count: " + dtLogGroup.Rows.Count); foreach (DataRow drLogGroup in dtLogGroup.Rows) { var colSQL = new Collection(); var colSQL_Rows = new Collection(); var arrParameter_SQL = new ArrayList(); var arrParameter_CLOB = new ArrayList(); intItemNo = 1; DataRow[] drSel_EMP; // CheckInTime,Sort很重要,不可變更. drSel_EMP = dsTemp.Tables["tblCont_EMP"].Select(Conversions.ToString("LogGroupSerial='" + drLogGroup["LogGroupSerial"] + "'"), "UserNo,CheckInTime"); // 同一人員同一Lot+OP,可能登錄多台設備或上工時間Overlap(應不可能),將此類資料視為一筆,註記重覆或調整起迄. if (drSel_EMP.Length > 0) { // MultiOperatorMode-0:OP,1:Area,2:EQP if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drSel_EMP[0]["MultiOperatorMode"], 2, false))) { short intUpperBound; intUpperBound = (short)(drSel_EMP.Length - 1); for (short i = 0, loopTo = intUpperBound; i <= loopTo; i++) { // 第一筆預設要使用,不需要比對. if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drSel_EMP[i]["DelFlag"], 0, false))) { for (short j = (short)(i + 1), loopTo1 = intUpperBound; j <= loopTo1; j++) { if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drSel_EMP[j]["DelFlag"], 0, false)) && Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drSel_EMP[i]["UserNo"], drSel_EMP[j]["UserNo"], false))) { // CheckInTime,CheckOutTime if (DateAndTime.DateDiff(DateInterval.Second, Conversions.ToDate(drSel_EMP[i]["CheckOutTime"]), Conversions.ToDate(drSel_EMP[j]["CheckInTime"])) > 0L) { } // 完全沒有重疊,分開計算. else { // 調整CheckOutTime if (DateAndTime.DateDiff(DateInterval.Second, Conversions.ToDate(drSel_EMP[i]["CheckOutTime"]), Conversions.ToDate(drSel_EMP[j]["CheckOutTime"])) > 0L) { drSel_EMP[i]["CheckOutTime"] = drSel_EMP[j]["CheckOutTime"]; } // 數量累加 drSel_EMP[i]["Qty"] = Convert.ToInt32(drSel_EMP[i]["Qty"]) + Convert.ToInt32(drSel_EMP[j]["Qty"]); // Remove drSel_EMP[j]["DelFlag"] = 1; } } } } } } } foreach (DataRow drEMP in drSel_EMP) { if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drEMP["DelFlag"], 0, false))) { var colParameter = new Collection(); IDataParameter objParam; funWriteShareEMPLog(Conversions.ToString("funShareEMPTime_OverLap Start. LotNo: " + drEMP["LotNo"] + ", UserNo: " + drEMP["UserNo"] + ", CheckInTime: " + Strings.Format(drEMP["CheckInTime"], "yyyy/MM/dd H:mm:ss") + ", CheckOutTime: " + Strings.Format(drEMP["CheckOutTime"], "yyyy/MM/dd H:mm:ss"))); // 平攤各人員的時間. strMemo = ""; decEMPValue = fuShareEMPTime_OverLap(ref cnnTemp, ref strMemo, Conversions.ToString(drEMP["LotNo"]), drEMP["UserNo"].ToString(), Conversions.ToDate(drEMP["CheckInTime"]), Conversions.ToDate(drEMP["CheckOutTime"])); funWriteShareEMPLog(Conversions.ToString("funShareEMPTime_OverLap End. LotNo: " + drEMP["LotNo"] + ", UserNo: " + drEMP["UserNo"] + ", CheckInTime: " + Strings.Format(drEMP["CheckInTime"], "yyyy/MM/dd H:mm:ss") + ", CheckOutTime: " + Strings.Format(drEMP["CheckOutTime"], "yyyy/MM/dd H:mm:ss"))); // 標準人時. decEMPValue_Std = 0m; if (drEMP["Qty"] is DBNull || Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drEMP["Qty"], 0, false))) { decQty = 0m; decEMPValue_Std = 0m; } else { decQty = Conversions.ToDecimal(drEMP["Qty"]); strSQL = Conversions.ToString("Select StdUnitEMPTime,CountEQPUnitQty From tblPRDRunTimeSetup " + " Where ProductNo='" + drEMP["ProductNo"] + "' And ProductVersion='" + drEMP["ProductVersion"] + "'" + " And OPNo='" + drEMP["OPNo"] + "'" + " And EquipmentNo In(Select EquipmentNo From tblWIPCont_Equipment Where LogGroupSerial='" + drLogGroup["LogGroupSerial"] + "')" + " And CountEQPUnitQty<>0"); // 分母為0,無法計算,一律存0. //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (drTemp.Read()) { decEMPValue_Std = Conversions.ToDecimal(Strings.Format(Operators.DivideObject(Operators.MultiplyObject(decQty, drTemp["StdUnitEMPTime"]), drTemp["CountEQPUnitQty"]), "0.00")); } drTemp.Close(); //cmmTemp.Dispose(); } // 紀錄. // -RESClass,0:EMP、1:EQP. strSQL_Field = "Insert into tblWIPCont_Resource_Share " + " (LotNo,MONo,LogGroupSerial,OPNo," + " RESClass,RESItem,RESValue,StdValue,InputQty,OutputQty,UserNo,EventTime,CreateDate,ItemNo "; strSQL_Value = Conversions.ToString(" Values ('" + drEMP["LotNo"] + "','" + drEMP["MONo"].ToString() + "','" + drEMP["LogGroupSerial"].ToString() + "','" + drEMP["OPNo"] + "'," + " 0,'EMP'," + decEMPValue + "," + decEMPValue_Std + "," + decQty + "," + decQty + ",'" + drEMP["UserNo"].ToString() + "'," + " To_Date('" + Strings.Format(Interaction.IIf(drEMP["EventTime"] is DBNull, drEMP["CheckOutTime"], drEMP["EventTime"]), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')," + " To_Date('" + Strings.Format(datCreateDate, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')," + intItemNo); // 以CLOB方式儲存. if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(DataBaseType, "oracle", false))) { strSQL_Field = strSQL_Field + ",Memo"; strSQL_Value = strSQL_Value + ",:P"; objParam = new OracleParameter(":P", OracleDbType.Clob); objParam.Value = strMemo; colParameter.Add(objParam); objParam = null; } else if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(DataBaseType, "mssql", false))) { strSQL_Field = strSQL_Field + ",Memo"; strSQL_Value = strSQL_Value + ",@P"; objParam = new SqlParameter("@P", SqlDbType.NVarChar); objParam.Value = strMemo; colParameter.Add(objParam); objParam = null; } strSQL = strSQL_Field + ")" + strSQL_Value + ")"; arrParameter_SQL.Add(strSQL); arrParameter_CLOB.Add(colParameter); // 2018/01/15,Sammi.同一人同一站上、下工多次,結算時EventTime一樣,造成分攤時的錯誤調整(TBLWIPCONT_RESOURCE_SHARE PK重覆問題) intItemNo = (short)(intItemNo + 1); } // 2019/6/13,Ning, 更新 SummaryFlag strSQL = "Update tblWIPCont_Employee_MultiUser Set SummaryFlag = 1" + " Where LogGroupSerial = '" + drEMP["LogGroupSerial"].ToString() + "' And UserNo = '" + drEMP["UserNo"].ToString() + "' And LogInPlaceNo = '" + drEMP["LogInPlaceNo"].ToString() + "'" + " And CheckInTime = To_Date('" + Strings.Format(drEMP["CheckInTime"], "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')"; colSQL_EMP.Add(strSQL); } if (arrParameter_SQL.Count > 0) { // 2019/6/11,Ning,不做先刪除, 以便後續重拋時串資料 // 2020/2/14, Ning, 因取消報工單時SummaryFlag會被設為Null, 故資料會重覆滾算, 應先刪後增 // 若結算資料已存在,則先刪除,再存入. strSQL = Conversions.ToString("Delete From tblWIPCont_Resource_Share Where LogGroupSerial='" + drLogGroup["LogGroupSerial"] + "'" + " And RESClass=0"); colSQL.Add(strSQL); colSQL_Rows.Add(-1); ExecuteSQLNoneQuery_CLOB_Multi(strDataBaseType, strConnectionString, colSQL, arrParameter_SQL, arrParameter_CLOB, colSQL_Rows); } } // 更新tblWIPCont_Employee_MultiUser.SummaryFlag ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, colSQL_EMP); funWriteShareEMPLog("funShareEMPTime End. Date: " + Strings.Format(datProductionDateFrom, "yyyy/MM/dd") + ". dtLogGroup.Rows.Count: " + dtLogGroup.Rows.Count); // //Return success funShareEMPTimeRet = "success"; } catch (Exception ex) { funShareEMPTimeRet = CombineFailMsg("0000-999999", ex.Message); // 2013/02/05, Hank, Send Email colParameters.Add(funShareEMPTimeRet, "EmailBody"); SendJobFailEmail(colParameters); } finally { //if (daTemp != null) // daTemp.Dispose(); if (dsTemp != null) dsTemp.Dispose(); try { CloseConnection(cnnTemp); // 寄送Mail if (!string.IsNullOrEmpty(strGroupNo)) { string argFileName = "N/A"; string argEmailSubject = "Share EMP Time [" + Strings.Format(Conversions.ToDate(datProductionDateFrom), "yyyy/MM/dd H:mm:ss") + "~" + Strings.Format(Conversions.ToDate(datProductionDateEnd), "yyyy/MM/dd H:mm:ss") + "]"; string argEmailBody = Conversions.ToString(funShareEMPTimeRet); modAutoRunLibrary.SendMultiEmail(ref argFileName, ref argEmailSubject, argEmailBody, strGroupNo); funShareEMPTimeRet = argEmailBody; } } catch (Exception ex) { funShareEMPTimeRet = "fail_Finally;" + ex.Message; } } return funShareEMPTimeRet; } private decimal fuShareEMPTime_OverLap(ref IDbConnection cnnTemp, ref string strR_Memo, string strLotNo, string strUserNo, DateTime datCheckInTime, DateTime datCheckOutTime) { decimal fuShareEMPTime_OverLapRet = default(decimal); // 計算人時 //var daTemp = new System.Data.OleDb.OleDbDataAdapter(); var dsTemp = new DataSet(); DbDataReader drTemp; string strSQL; string strEMPMemo = ""; string strStart, strEnd; try { strEMPMemo = "Cal Time:" + Strings.Format(Conversions.ToDate(datCheckInTime), "yyyy/MM/dd H:mm:ss") + "~" + Strings.Format(Conversions.ToDate(datCheckOutTime), "yyyy/MM/dd H:mm:ss"); strStart = "To_Date('" + Strings.Format(datCheckInTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')"; strEnd = "To_Date('" + Strings.Format(datCheckOutTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')"; // 1.取出Overlap的時間段 // 2.CheckInTime要在範圍內(CheckInTimestrStart)才有計算的意義,否則會取出多餘的資料. // 2017/10/22,sammi.排除舊資料A.CheckInTime<>A.CheckOutTime,不可以加此條件,因A.CheckOutTime null的會被排除掉. // 2019/6/13,Ning,加上SummaryFlag=0的條件 // Case1: // L計算起迄 : S---------------------------------------------------------------------E // L1 : |----------------------- 6 strSQL = ""; strSQL += "Select A.CheckInTime,A.CheckOutTime,A.LogGroupSerial,A.FromLotNo,B.LotNo " + " From tblWIPCont_Employee_MultiUser A,tblWIPLotLog_Report B " + " Where A.UserNo='" + strUserNo + "'" + " And A.LogGroupSerial=B.LogGroupSerial " + " And Nvl(A.SummaryFlag,0) = 0 " + " And A.CheckInTime is not Null " + " And A.CheckInTime <= " + strStart + " And A.CheckOutTime > " + strStart + " And A.CheckOutTime <= " + strEnd; // Case2: // L計算起迄 : S---------------------------------------------------------------------E // L3 : 2---------------------------7 strSQL += " Union "; strSQL += "Select A.CheckInTime,A.CheckOutTime,A.LogGroupSerial,A.FromLotNo,B.LotNo " + " From tblWIPCont_Employee_MultiUser A,tblWIPLotLog_Report B " + " Where A.UserNo='" + strUserNo + "'" + " And A.LogGroupSerial=B.LogGroupSerial " + " And Nvl(A.SummaryFlag,0) = 0 " + " And A.CheckInTime is not Null " + " And A.CheckInTime >= " + strStart + " And A.CheckOutTime <= " + strEnd; // Case3-A: // L計算起迄 : S---------------------------------------------------------------------E // L4 : 11------------------------|(未下工) strSQL += " Union "; // 排除Garbage Data:上工時,會針對進站批自動產生tblWIPLotLoginState,Lot還原後,會變成Garbage Data,使用tblWIPLotLoginState時,一定要與tblWIPLotLog_Report一起看,才不會用到Garbage Data. strSQL += "Select A.CheckInTime,A.CheckOutTime,A.LogGroupSerial,'' as FromLotNo,B.LotNo " + " From tblWIPLotLoginState A,tblWIPLotLog_Report B " + " Where A.UserNo='" + strUserNo + "'" + " And A.LogGroupSerial=B.LogGroupSerial " + " And A.CheckInTime is not Null " + " And A.CheckInTime >= " + strStart + " And A.CheckInTime < " + strEnd + " And (A.CheckOutTime is null or A.CheckOutTime >= " + strEnd + ")"; // Case3-B: // L計算起迄 : S---------------------------------------------------------------------E // L8 : 11---------------------已下工 strSQL += " Union "; strSQL += "Select A.CheckInTime,A.CheckOutTime,A.LogGroupSerial,A.FromLotNo,B.LotNo " + " From tblWIPCont_Employee_MultiUser A,tblWIPLotLog_Report B " + " Where A.UserNo='" + strUserNo + "'" + " And A.LogGroupSerial=B.LogGroupSerial " + " And Nvl(A.SummaryFlag,0) = 0 " + " And A.CheckInTime is not Null " + " And A.CheckInTime >= " + strStart + " And A.CheckInTime < " + strEnd + " And (A.CheckOutTime is null or A.CheckOutTime >= " + strEnd + ")"; // Case4-A: // L計算起迄 : S---------------------------------------------------------------------E // L6 : |------------------------------------------------------------------------------------------------|(未下工) strSQL += " Union "; // 排除Garbage Data:上工時,會針對進站批自動產生tblWIPLotLoginState,Lot還原後,會變成Garbage Data,使用tblWIPLotLoginState時,一定要與tblWIPLotLog_Report一起看,才不會用到Garbage Data. strSQL += "Select A.CheckInTime,A.CheckOutTime,A.LogGroupSerial,'' as FromLotNo,B.LotNo " + " From tblWIPLotLoginState A,tblWIPLotLog_Report B " + " Where A.UserNo='" + strUserNo + "'" + " And A.LogGroupSerial=B.LogGroupSerial " + " And A.CheckInTime is not Null " + " And A.CheckInTime < " + strStart + " And (A.CheckOutTime is null or A.CheckOutTime >= " + strEnd + ")"; // Case4-B: // L計算起迄 : S---------------------------------------------------------------------E // L7 : |--------------------------------------------------------------------------------已下工 strSQL += " Union "; strSQL += "Select A.CheckInTime,A.CheckOutTime,A.LogGroupSerial,A.FromLotNo,B.LotNo " + " From tblWIPCont_Employee_MultiUser A,tblWIPLotLog_Report B " + " Where A.UserNo='" + strUserNo + "'" + " And A.LogGroupSerial=B.LogGroupSerial " + " And Nvl(A.SummaryFlag,0) = 0 " + " And A.CheckInTime is not Null " + " And A.CheckInTime < " + strStart + " And (A.CheckOutTime is null or A.CheckOutTime >= " + strEnd + ")"; // Sort strSQL = "Select 0 as DelFlag,T1.* From (" + strSQL + ") T1 Order by LogGroupSerial,CheckInTime "; SQLCommandTuning(strDataBaseType, ref strSQL); //cmmTemp = new IDbCommand(strSQL, cnnTemp); //daTemp.SelectCommand = cmmTemp; //daTemp.Fill(dsTemp, "tblEMP"); //cmmTemp.Dispose(); ExecuteSQLQuery_Adapter(strSQL, dsTemp, "tblEMP", cnnTemp); var dtLogGroup = new DataTable(); dtLogGroup = dsTemp.Tables["tblEMP"].DefaultView.ToTable(true, "LogGroupSerial"); foreach (DataRow drLogGroup in dtLogGroup.Rows) { DataRow[] drSel_EMP; // CheckInTime,Sort很重要,不可變更. drSel_EMP = dsTemp.Tables["tblEMP"].Select(Conversions.ToString("LogGroupSerial='" + drLogGroup["LogGroupSerial"] + "'"), "CheckInTime"); // 同一人員同一Lot+OP,可能登錄多台設備或上工時間Overlap(應不可能),將此類資料視為一筆,註記重覆或調整起迄. if (drSel_EMP.Length > 0) { // MultiOperatorMode-0:OP,1:Area,2:EQP // If drSel_EMP(0)("MultiOperatorMode") = 2 Then short intUpperBound; intUpperBound = (short)(drSel_EMP.Length - 1); for (short i = 0, loopTo = intUpperBound; i <= loopTo; i++) { // 第一筆預設要使用,不需要比對. if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drSel_EMP[i]["DelFlag"], 0, false))) { for (short j = (short)(i + 1), loopTo1 = intUpperBound; j <= loopTo1; j++) { if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drSel_EMP[j]["DelFlag"], 0, false))) { // CheckInTime,CheckOutTime if (drSel_EMP[i]["CheckOutTime"] is DBNull) { } // 不需處理. else if (drSel_EMP[i]["CheckOutTime"] is DBNull && drSel_EMP[j]["CheckOutTime"] is DBNull) { // Remove drSel_EMP[j]["DelFlag"] = 1; } else if (DateAndTime.DateDiff(DateInterval.Second, Conversions.ToDate(drSel_EMP[i]["CheckOutTime"]), Conversions.ToDate(drSel_EMP[j]["CheckInTime"])) > 0L) { } // 完全沒有重疊,分開計算. else { // 調整CheckOutTime if (DateAndTime.DateDiff(DateInterval.Second, Conversions.ToDate(drSel_EMP[i]["CheckOutTime"]), Conversions.ToDate(drSel_EMP[j]["CheckOutTime"])) > 0L) { drSel_EMP[i]["CheckOutTime"] = drSel_EMP[j]["CheckOutTime"]; } // '數量累加 // drSel_EMP(i)("Qty") += drSel_EMP(j)("Qty") // Remove drSel_EMP[j]["DelFlag"] = 1; } } } } } } // End If } // Delete for (int i = dsTemp.Tables["tblEMP"].Rows.Count - 1; i >= 0; i -= 1) { if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dsTemp.Tables["tblEMP"].Rows[i]["DelFlag"], 1, false))) { dsTemp.Tables["tblEMP"].Rows.Remove(dsTemp.Tables["tblEMP"].Rows[i]); } } // 2.取得所有切割點 var dtSplitTime = new DataTable("tblSplitTime"); dtSplitTime.Columns.Add("SplitTime", Type.GetType("System.DateTime")); var dtHoldWait = new DataTable("tblHoldWait"); dtHoldWait.Columns.Add("LotNo", Type.GetType("System.String")); dtHoldWait.Columns.Add("LogGroupSerial", Type.GetType("System.String")); dtHoldWait.Columns.Add("StartTime", Type.GetType("System.DateTime")); dtHoldWait.Columns.Add("EndTime", Type.GetType("System.DateTime")); dtHoldWait.Columns.Add("DType", Type.GetType("System.String")); dtHoldWait.Columns.Add("DTypeNo", Type.GetType("System.String")); DataRow drAdd; foreach (DataRow drEMP in dsTemp.Tables["tblEMP"].Rows) { // 2.1 修正各段起迄 // CheckInTime if (DateAndTime.DateDiff(DateInterval.Second, Conversions.ToDate(drEMP["CheckInTime"]), datCheckInTime) > 0L) { // 調整CheckInTime,同CheckInTime,不需加入切割點. // L計算起迄 : S---------------------------------------------------------------------E // L1 : |----------------------- 6 drEMP["CheckInTime"] = datCheckInTime; } else if (DateAndTime.DateDiff(DateInterval.Second, Conversions.ToDate(drEMP["CheckInTime"]), datCheckInTime) == 0L) { } // 起始點,不需加入dtSplitTime. // 切割點 // L計算起迄 : S---------------------------------------------------------------------E // L2 : 5-------------------------------10 // L3 : 2---------------------------7 // L4 : 11------------------------| else if (dtSplitTime.Select("SplitTime=#" + Strings.Format(Conversions.ToDate(drEMP["CheckInTime"]), "yyyy/MM/dd H:mm:ss") + "#").Length == 0) { drAdd = dtSplitTime.NewRow(); drAdd["SplitTime"] = Strings.Format(Conversions.ToDate(drEMP["CheckInTime"]), "yyyy/MM/dd H:mm:ss"); dtSplitTime.Rows.Add(drAdd); } // CheckOutTime if (drEMP["CheckOutTime"] is DBNull || DateAndTime.DateDiff(DateInterval.Second, datCheckOutTime, Conversions.ToDate(drEMP["CheckOutTime"])) > 0L) { // 調整CheckOutTime,同CheckOutTime,不需加入切割點. // L計算起迄 : S---------------------------------------------------------------------E // L4 : 11------------------------| drEMP["CheckOutTime"] = datCheckOutTime; } // 切割點 // L計算起迄 : S---------------------------------------------------------------------E // L1 : |----------------------- 6 // L2 : 5-------------------------------10 // L3 : 2---------------------------7 else if (dtSplitTime.Select("SplitTime=#" + Strings.Format(Conversions.ToDate(drEMP["CheckOutTime"]), "yyyy/MM/dd H:mm:ss") + "#").Length == 0) { drAdd = dtSplitTime.NewRow(); drAdd["SplitTime"] = Strings.Format(Conversions.ToDate(drEMP["CheckOutTime"]), "yyyy/MM/dd H:mm:ss"); dtSplitTime.Rows.Add(drAdd); } // 2.2 取出每段人時包含的Hold,Wait切割點及排除時間段. // Call funWriteShareEMPLog("fuShareEMPTime_HoldWait Start. LogGroupSerial: " & drEMP("LogGroupSerial")) fuShareEMPTime_HoldWait(ref cnnTemp, ref dtSplitTime, ref dtHoldWait, drEMP["LotNo"].ToString(), drEMP["LogGroupSerial"].ToString(), Conversions.ToDate(drEMP["CheckInTime"]), Conversions.ToDate(drEMP["CheckOutTime"]), drEMP["FromLotNo"].ToString()); // Call funWriteShareEMPLog("fuShareEMPTime_HoldWait End. LogGroupSerial: " & drEMP("LogGroupSerial")) } // 結束點,需加入dtSplitTime. if (dtSplitTime.Select("SplitTime=#" + Strings.Format(Conversions.ToDate(datCheckOutTime), "yyyy/MM/dd H:mm:ss") + "#").Length == 0) { drAdd = dtSplitTime.NewRow(); drAdd["SplitTime"] = Strings.Format(Conversions.ToDate(datCheckOutTime), "yyyy/MM/dd H:mm:ss"); dtSplitTime.Rows.Add(drAdd); } // 3.依切割點依序平攤人時. DataRow[] drSel; DateTime datCal_Start; DateTime datCal_End; decimal decEMPValue = 0m; decimal decSplitValue = 0m; string strSplitMemo; short intSplit = 1; funWriteShareEMPLog("fuShareEMPTime_OverLap, dtSplitTime.Rows.Count: " + dtSplitTime.Rows.Count); dtSplitTime.DefaultView.Sort = "SplitTime"; datCal_Start = datCheckInTime; foreach (DataRowView drvSplitTime in dtSplitTime.DefaultView) { datCal_End = Conversions.ToDate(drvSplitTime["SplitTime"]); decSplitValue = 0m; strSplitMemo = ""; short intLotCount = 0; // 平攤Lot數. // 檢查本身(LotNo)是否被排除 drSel = dtHoldWait.Select("LotNo='" + strLotNo + "'" + "And StartTime<=#" + Strings.Format(Conversions.ToDate(datCal_Start), "yyyy/MM/dd H:mm:ss") + "#" + "And EndTime>=#" + Strings.Format(Conversions.ToDate(datCal_End), "yyyy/MM/dd H:mm:ss") + "#"); if (drSel.Length > 0) { strSplitMemo += ControlChars.CrLf + strLotNo + "," + drSel[0]["DType"].ToString() + "(" + drSel[0]["DTypeNo"].ToString() + "),EMP=0."; } else { // 找出平攤Lot數. foreach (DataRow drEMP in dsTemp.Tables["tblEMP"].Rows) { // 檢查是否被排除 drSel = dtHoldWait.Select(Conversions.ToString("LotNo='" + drEMP["LotNo"] + "'" + "And StartTime<=#" + Strings.Format(Conversions.ToDate(datCal_Start), "yyyy/MM/dd H:mm:ss") + "#" + "And EndTime>=#" + Strings.Format(Conversions.ToDate(datCal_End), "yyyy/MM/dd H:mm:ss") + "#")); if (drSel.Length > 0) { // 排除,不列入分攤筆數. strSplitMemo = Conversions.ToString(strSplitMemo + ControlChars.CrLf + drEMP["LotNo"] + "," + drSel[0]["DType"].ToString() + "(" + drSel[0]["DTypeNo"].ToString() + "),Ex."); } else if (DateAndTime.DateDiff(DateInterval.Second, Conversions.ToDate(drEMP["CheckInTime"]), datCal_Start) >= 0L && DateAndTime.DateDiff(DateInterval.Second, datCal_End, Conversions.ToDate(drEMP["CheckOutTime"])) >= 0L) { // 加入分攤筆數. intLotCount = (short)(intLotCount + 1); // 網狀製程 // -Lot會分佈在不同站,紀錄LogGroupSerial,分母是以OP來區分,相同Lot不同OP,視為多筆. // -同一人員同一Lot+OP,可能登錄多台設備或上工時間Overlap(應不可能),將此類資料視為一筆(已在前面處理). strSplitMemo += ControlChars.CrLf + drEMP["LogGroupSerial"].ToString(); } else { // 排除,不需列入分攤筆數. } } if (intLotCount == 0) { // 2017/10/22,Sammi,不發出Error,讓CO可過帳,發生此Error的原因是Running的舊資料. // Throw New iMESException.MESException("0000-200015", "[%LotNo%]:" & RefLotNo & ControlChars.CrLf & _ // "#" & intSplit & ":" & Format(CDate(datCal_Start), "yyyy/MM/dd H:mm:ss") & "~" & Format(CDate(datCal_End), "yyyy/MM/dd H:mm:ss") & "," & _ // "[%Overlap%] [%LotCount%]=0!") // 2017/10/22,Sammi,不需平攤,用*註記,用以釐清是否為舊資料批. strSplitMemo += ControlChars.CrLf + "*"; // 單位秒. decSplitValue = DateAndTime.DateDiff(DateInterval.Second, datCal_Start, datCal_End); } else { // 單位秒. decSplitValue = (decimal)(DateAndTime.DateDiff(DateInterval.Second, datCal_Start, datCal_End) / (double)intLotCount); } } // 總人時 decEMPValue += decSplitValue; strEMPMemo += ControlChars.CrLf + "#" + intSplit + ":" + Strings.Format(Conversions.ToDate(datCal_Start), "yyyy/MM/dd H:mm:ss") + "~" + Strings.Format(Conversions.ToDate(datCal_End), "yyyy/MM/dd H:mm:ss"); if (decSplitValue == 0m) { strEMPMemo += ControlChars.CrLf + "EMP=" + decSplitValue; } else if (intLotCount == 0) { // strEMPMemo += ControlChars.CrLf & "EMP=" & decSplitValue strEMPMemo += ControlChars.CrLf + "EMP=" + Strings.Format(decSplitValue / 60m, "0.00") + "," + DateAndTime.DateDiff(DateInterval.Second, datCal_Start, datCal_End) + "/60"; } else { strEMPMemo += ControlChars.CrLf + "EMP=" + Strings.Format(decSplitValue / 60m, "0.00") + "," + DateAndTime.DateDiff(DateInterval.Second, datCal_Start, datCal_End) + "/" + intLotCount + "/60"; } strEMPMemo += strSplitMemo; datCal_Start = datCal_End; intSplit = (short)(intSplit + 1); } // 人時分攤說明 strR_Memo = strEMPMemo; // 單位分,到小數二位. fuShareEMPTime_OverLapRet = Conversions.ToDecimal(Strings.Format(decEMPValue / 60m, "0.00")); } catch (Exception e1) { throw; } finally { if (dsTemp != null) dsTemp.Dispose(); //if (daTemp != null) // daTemp.Dispose(); } return fuShareEMPTime_OverLapRet; } private string fuShareEMPTime_HoldWait(ref IDbConnection cnnTemp, ref DataTable dtSplitTime, ref DataTable dtHoldWait, string strLotNo, string strLogGroupSerial, DateTime datStartTime, DateTime datEndTime, string strFromLotNo = "") { // 1.取出每段人時包含的Hold,Wait切割點及排除時間段. DbDataReader drTemp; string strSQL; // L計算起迄 : S---------------------------------------------------------------------E // L Hold_1st : 3----4 // L Hold_2nd : 8-----9 // L1 : |----------------------- 6 // L1 Hold_1st : |----1 // L1 Hold_2nd : 3----4 // L2 : 5-------------------------------10 // L3 : 2---------------------------7 // L4 : 11------------------------| // L4 Hold_1st : 12---------| // L6 : |---------------------------------------------------------------------------------------------------------| // L6 Wait_1st : |-------------------------------------------------------------------------------------------------------| try { DataRow[] drSel; DataRow drAdd; // A:以LotNo找Hold&Wait紀錄. // 1.Hold // E1:CreateDate早於datStartTime,ReleaseDate>datStartTime And ReleaseDate<=datEndTime. // L計算起迄 : S---------------------------------------------------------------------E // L1 Hold_1st : |----1 strSQL = "Select CreateDate,ReleaseDate,ERFNo From tblWIPERFBasis " + " Where ERFSource = 0 And LotNo='" + strLotNo + "'" + " And CreateDateTo_Date('" + Strings.Format(Conversions.ToDate(datStartTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') " + " And ReleaseDate<=To_Date('" + Strings.Format(Conversions.ToDate(datEndTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') " + " Order by ReleaseDate"; SQLCommandTuning(strDataBaseType, ref strSQL); //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); while (drTemp.Read()) { // 切割點 // -CreateDate在外面,不需加入. // -ReleaseDate需加入. if (dtSplitTime.Select("SplitTime=#" + Strings.Format(Conversions.ToDate(drTemp["ReleaseDate"]), "yyyy/MM/dd H:mm:ss") + "#").Length == 0) { drAdd = dtSplitTime.NewRow(); drAdd["SplitTime"] = Strings.Format(Conversions.ToDate(drTemp["ReleaseDate"]), "yyyy/MM/dd H:mm:ss"); dtSplitTime.Rows.Add(drAdd); } // 排除時間段 drAdd = dtHoldWait.NewRow(); drAdd["LotNo"] = strLotNo; drAdd["LogGroupSerial"] = strLogGroupSerial; drAdd["StartTime"] = Strings.Format(Conversions.ToDate(datStartTime), "yyyy/MM/dd H:mm:ss"); drAdd["EndTime"] = Strings.Format(Conversions.ToDate(drTemp["ReleaseDate"]), "yyyy/MM/dd H:mm:ss"); drAdd["DType"] = "H"; drAdd["DTypeNo"] = drTemp["ERFNo"]; dtHoldWait.Rows.Add(drAdd); } drTemp.Close(); //cmmTemp.Dispose(); // E2:CreateDate>=datStartTime,ReleaseDate<=datEndTime. // L計算起迄 : S---------------------------------------------------------------------E // L Hold_1st : 3----4 // L Hold_2nd : 8-----9 // L1 Hold_2nd : 3----4 strSQL = "Select CreateDate,ReleaseDate,ERFNo From tblWIPERFBasis " + " Where ERFSource = 0 And LotNo='" + strLotNo + "'" + " And CreateDate>=To_Date('" + Strings.Format(Conversions.ToDate(datStartTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') " + " And ReleaseDate<=To_Date('" + Strings.Format(Conversions.ToDate(datEndTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') " + " Order by ReleaseDate"; SQLCommandTuning(strDataBaseType, ref strSQL); //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); while (drTemp.Read()) { // 切割點 // -CreateDate需加入. // -ReleaseDate需加入. if (dtSplitTime.Select("SplitTime=#" + Strings.Format(Conversions.ToDate(drTemp["CreateDate"]), "yyyy/MM/dd H:mm:ss") + "#").Length == 0) { drAdd = dtSplitTime.NewRow(); drAdd["SplitTime"] = Strings.Format(Conversions.ToDate(drTemp["CreateDate"]), "yyyy/MM/dd H:mm:ss"); dtSplitTime.Rows.Add(drAdd); } if (dtSplitTime.Select("SplitTime=#" + Strings.Format(Conversions.ToDate(drTemp["ReleaseDate"]), "yyyy/MM/dd H:mm:ss") + "#").Length == 0) { drAdd = dtSplitTime.NewRow(); drAdd["SplitTime"] = Strings.Format(Conversions.ToDate(drTemp["ReleaseDate"]), "yyyy/MM/dd H:mm:ss"); dtSplitTime.Rows.Add(drAdd); } // 排除時間段 drAdd = dtHoldWait.NewRow(); drAdd["LotNo"] = strLotNo; drAdd["LogGroupSerial"] = strLogGroupSerial; drAdd["StartTime"] = Strings.Format(Conversions.ToDate(drTemp["CreateDate"]), "yyyy/MM/dd H:mm:ss"); drAdd["EndTime"] = Strings.Format(Conversions.ToDate(drTemp["ReleaseDate"]), "yyyy/MM/dd H:mm:ss"); drAdd["DType"] = "H"; drAdd["DTypeNo"] = drTemp["ERFNo"]; dtHoldWait.Rows.Add(drAdd); } drTemp.Close(); //cmmTemp.Dispose(); // E3:CreateDate>=datStartTime And CreateDate=datEndTime. // L計算起迄 : S---------------------------------------------------------------------E // L4 Hold_1st : 12---------| strSQL = "Select CreateDate,ReleaseDate,ERFNo From tblWIPERFBasis " + " Where ERFSource = 0 And LotNo='" + strLotNo + "'" + " And CreateDate>=To_Date('" + Strings.Format(Conversions.ToDate(datStartTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') " + " And CreateDate=To_Date('" + Strings.Format(Conversions.ToDate(datEndTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') or ReleaseDate is null) " + " Order by ReleaseDate"; SQLCommandTuning(strDataBaseType, ref strSQL); //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); while (drTemp.Read()) { // 切割點 // -CreateDate需加入. // -ReleaseDate在外面,不需加入. if (dtSplitTime.Select("SplitTime=#" + Strings.Format(Conversions.ToDate(drTemp["CreateDate"]), "yyyy/MM/dd H:mm:ss") + "#").Length == 0) { drAdd = dtSplitTime.NewRow(); drAdd["SplitTime"] = Strings.Format(Conversions.ToDate(drTemp["CreateDate"]), "yyyy/MM/dd H:mm:ss"); dtSplitTime.Rows.Add(drAdd); } // 排除時間段 drAdd = dtHoldWait.NewRow(); drAdd["LotNo"] = strLotNo; drAdd["LogGroupSerial"] = strLogGroupSerial; drAdd["StartTime"] = Strings.Format(Conversions.ToDate(drTemp["CreateDate"]), "yyyy/MM/dd H:mm:ss"); drAdd["EndTime"] = Strings.Format(Conversions.ToDate(datEndTime), "yyyy/MM/dd H:mm:ss"); drAdd["DType"] = "H"; drAdd["DTypeNo"] = drTemp["ERFNo"]; dtHoldWait.Rows.Add(drAdd); } drTemp.Close(); //cmmTemp.Dispose(); // 2018/04/20,sammi.未排除整段時間落在Wait或Hold的. // E4:CreateDate>=datStartTime And CreateDate=datEndTime. // L計算起迄 : S---------------------------------------------------------------------E // L6 Wait_1st : |-------------------------------------------------------------------------------------------------------| strSQL = "Select CreateDate,ReleaseDate,ERFNo From tblWIPERFBasis " + " Where ERFSource = 0 And LotNo='" + strLotNo + "'" + " And CreateDate<=To_Date('" + Strings.Format(Conversions.ToDate(datStartTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') " + " And (ReleaseDate>=To_Date('" + Strings.Format(Conversions.ToDate(datEndTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') or ReleaseDate is null) " + " Order by ReleaseDate"; SQLCommandTuning(strDataBaseType, ref strSQL); //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); while (drTemp.Read()) { // 切割點 // -CreateDate在外面,不需加入. // -ReleaseDate在外面,不需加入. // 排除時間段 drAdd = dtHoldWait.NewRow(); drAdd["LotNo"] = strLotNo; drAdd["LogGroupSerial"] = strLogGroupSerial; drAdd["StartTime"] = Strings.Format(Conversions.ToDate(datStartTime), "yyyy/MM/dd H:mm:ss"); drAdd["EndTime"] = Strings.Format(Conversions.ToDate(datEndTime), "yyyy/MM/dd H:mm:ss"); drAdd["DType"] = "H"; drAdd["DTypeNo"] = drTemp["ERFNo"]; dtHoldWait.Rows.Add(drAdd); } drTemp.Close(); //cmmTemp.Dispose(); // 2.Wait // W1:CreateDate早於datStartTime,ReleaseDate>datStartTime And ReleaseDate<=datEndTime. strSQL = "Select CreateDate,ReleaseDate,WaitNo From tblWIPWaitBasis " + " Where LotNo='" + strLotNo + "'" + " And CreateDateTo_Date('" + Strings.Format(Conversions.ToDate(datStartTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') " + " And ReleaseDate<=To_Date('" + Strings.Format(Conversions.ToDate(datEndTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') " + " Order by ReleaseDate"; SQLCommandTuning(strDataBaseType, ref strSQL); //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); while (drTemp.Read()) { // 切割點 // -CreateDate在外面,不需加入. // -ReleaseDate需加入. if (dtSplitTime.Select("SplitTime=#" + Strings.Format(Conversions.ToDate(drTemp["ReleaseDate"]), "yyyy/MM/dd H:mm:ss") + "#").Length == 0) { drAdd = dtSplitTime.NewRow(); drAdd["SplitTime"] = Strings.Format(Conversions.ToDate(drTemp["ReleaseDate"]), "yyyy/MM/dd H:mm:ss"); dtSplitTime.Rows.Add(drAdd); } // 排除時間段 drAdd = dtHoldWait.NewRow(); drAdd["LotNo"] = strLotNo; drAdd["LogGroupSerial"] = strLogGroupSerial; drAdd["StartTime"] = Strings.Format(Conversions.ToDate(datStartTime), "yyyy/MM/dd H:mm:ss"); drAdd["EndTime"] = Strings.Format(Conversions.ToDate(drTemp["ReleaseDate"]), "yyyy/MM/dd H:mm:ss"); drAdd["DType"] = "W"; drAdd["DTypeNo"] = drTemp["WaitNo"]; dtHoldWait.Rows.Add(drAdd); } drTemp.Close(); //cmmTemp.Dispose(); // W2:CreateDate>=datStartTime,ReleaseDate<=datEndTime. strSQL = "Select CreateDate,ReleaseDate,WaitNo From tblWIPWaitBasis " + " Where LotNo='" + strLotNo + "'" + " And CreateDate>=To_Date('" + Strings.Format(Conversions.ToDate(datStartTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') " + " And ReleaseDate<=To_Date('" + Strings.Format(Conversions.ToDate(datEndTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') " + " Order by ReleaseDate"; SQLCommandTuning(strDataBaseType, ref strSQL); //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); while (drTemp.Read()) { // 切割點 // -CreateDate需加入. // -ReleaseDate需加入. if (dtSplitTime.Select("SplitTime=#" + Strings.Format(Conversions.ToDate(drTemp["CreateDate"]), "yyyy/MM/dd H:mm:ss") + "#").Length == 0) { drAdd = dtSplitTime.NewRow(); drAdd["SplitTime"] = Strings.Format(Conversions.ToDate(drTemp["CreateDate"]), "yyyy/MM/dd H:mm:ss"); dtSplitTime.Rows.Add(drAdd); } if (dtSplitTime.Select("SplitTime=#" + Strings.Format(Conversions.ToDate(drTemp["ReleaseDate"]), "yyyy/MM/dd H:mm:ss") + "#").Length == 0) { drAdd = dtSplitTime.NewRow(); drAdd["SplitTime"] = Strings.Format(Conversions.ToDate(drTemp["ReleaseDate"]), "yyyy/MM/dd H:mm:ss"); dtSplitTime.Rows.Add(drAdd); } // 排除時間段 drAdd = dtHoldWait.NewRow(); drAdd["LotNo"] = strLotNo; drAdd["LogGroupSerial"] = strLogGroupSerial; drAdd["StartTime"] = Strings.Format(Conversions.ToDate(drTemp["CreateDate"]), "yyyy/MM/dd H:mm:ss"); drAdd["EndTime"] = Strings.Format(Conversions.ToDate(drTemp["ReleaseDate"]), "yyyy/MM/dd H:mm:ss"); drAdd["DType"] = "W"; drAdd["DTypeNo"] = drTemp["WaitNo"]; dtHoldWait.Rows.Add(drAdd); } drTemp.Close(); //cmmTemp.Dispose(); // W3:CreateDate>=datStartTime And CreateDate=datEndTime. strSQL = "Select CreateDate,ReleaseDate,WaitNo From tblWIPWaitBasis " + " Where LotNo='" + strLotNo + "'" + " And CreateDate>=To_Date('" + Strings.Format(Conversions.ToDate(datStartTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') " + " And CreateDate=To_Date('" + Strings.Format(Conversions.ToDate(datEndTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') or ReleaseDate is null) " + " Order by ReleaseDate"; SQLCommandTuning(strDataBaseType, ref strSQL); //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); while (drTemp.Read()) { // 切割點 // -CreateDate需加入. // -ReleaseDate在外面,不需加入. if (dtSplitTime.Select("SplitTime=#" + Strings.Format(Conversions.ToDate(drTemp["CreateDate"]), "yyyy/MM/dd H:mm:ss") + "#").Length == 0) { drAdd = dtSplitTime.NewRow(); drAdd["SplitTime"] = Strings.Format(Conversions.ToDate(drTemp["CreateDate"]), "yyyy/MM/dd H:mm:ss"); dtSplitTime.Rows.Add(drAdd); } // 排除時間段 drAdd = dtHoldWait.NewRow(); drAdd["LotNo"] = strLotNo; drAdd["LogGroupSerial"] = strLogGroupSerial; drAdd["StartTime"] = Strings.Format(Conversions.ToDate(drTemp["CreateDate"]), "yyyy/MM/dd H:mm:ss"); drAdd["EndTime"] = Strings.Format(Conversions.ToDate(datEndTime), "yyyy/MM/dd H:mm:ss"); drAdd["DType"] = "W"; drAdd["DTypeNo"] = drTemp["WaitNo"]; dtHoldWait.Rows.Add(drAdd); } drTemp.Close(); //cmmTemp.Dispose(); // W4:CreateDate>=datStartTime And CreateDate=datEndTime. // L計算起迄 : S---------------------------------------------------------------------E // L6 Wait_1st : |-------------------------------------------------------------------------------------------------------| strSQL = "Select CreateDate,ReleaseDate,WaitNo From tblWIPWaitBasis " + " Where LotNo='" + strLotNo + "'" + " And CreateDate<=To_Date('" + Strings.Format(Conversions.ToDate(datStartTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') " + " And (ReleaseDate>=To_Date('" + Strings.Format(Conversions.ToDate(datEndTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') or ReleaseDate is null) " + " Order by ReleaseDate"; SQLCommandTuning(strDataBaseType, ref strSQL); //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); while (drTemp.Read()) { // 切割點 // -CreateDate在外面,不需加入. // -ReleaseDate在外面,不需加入. // 排除時間段 drAdd = dtHoldWait.NewRow(); drAdd["LotNo"] = strLotNo; drAdd["LogGroupSerial"] = strLogGroupSerial; drAdd["StartTime"] = Strings.Format(Conversions.ToDate(datStartTime), "yyyy/MM/dd H:mm:ss"); drAdd["EndTime"] = Strings.Format(Conversions.ToDate(datEndTime), "yyyy/MM/dd H:mm:ss"); drAdd["DType"] = "W"; drAdd["DTypeNo"] = drTemp["WaitNo"]; dtHoldWait.Rows.Add(drAdd); } drTemp.Close(); //cmmTemp.Dispose(); // B:以FromLotNo找Hold&Wait紀錄. if (!string.IsNullOrEmpty(strFromLotNo)) { // 1.Hold // E1:CreateDate早於datStartTime,ReleaseDate>datStartTime And ReleaseDate<=datEndTime. // L計算起迄 : S---------------------------------------------------------------------E // L1 Hold_1st : |----1 strSQL = "Select CreateDate,ReleaseDate,ERFNo From tblWIPERFBasis " + " Where ERFSource = 0 And LotNo='" + strFromLotNo + "'" + " And CreateDateTo_Date('" + Strings.Format(Conversions.ToDate(datStartTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') " + " And ReleaseDate<=To_Date('" + Strings.Format(Conversions.ToDate(datEndTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') " + " Order by ReleaseDate"; SQLCommandTuning(strDataBaseType, ref strSQL); //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); while (drTemp.Read()) { // 切割點 // -CreateDate在外面,不需加入. // -ReleaseDate需加入. if (dtSplitTime.Select("SplitTime=#" + Strings.Format(Conversions.ToDate(drTemp["ReleaseDate"]), "yyyy/MM/dd H:mm:ss") + "#").Length == 0) { drAdd = dtSplitTime.NewRow(); drAdd["SplitTime"] = Strings.Format(Conversions.ToDate(drTemp["ReleaseDate"]), "yyyy/MM/dd H:mm:ss"); dtSplitTime.Rows.Add(drAdd); } // 排除時間段 drAdd = dtHoldWait.NewRow(); drAdd["LotNo"] = strLotNo; drAdd["LogGroupSerial"] = strLogGroupSerial; drAdd["StartTime"] = Strings.Format(Conversions.ToDate(datStartTime), "yyyy/MM/dd H:mm:ss"); drAdd["EndTime"] = Strings.Format(Conversions.ToDate(drTemp["ReleaseDate"]), "yyyy/MM/dd H:mm:ss"); drAdd["DType"] = "H"; drAdd["DTypeNo"] = drTemp["ERFNo"]; dtHoldWait.Rows.Add(drAdd); } drTemp.Close(); //cmmTemp.Dispose(); // E2:CreateDate>=datStartTime,ReleaseDate<=datEndTime. // L計算起迄 : S---------------------------------------------------------------------E // L Hold_1st : 3----4 // L Hold_2nd : 8-----9 // L1 Hold_2nd : 3----4 strSQL = "Select CreateDate,ReleaseDate,ERFNo From tblWIPERFBasis " + " Where ERFSource = 0 And LotNo='" + strFromLotNo + "'" + " And CreateDate>=To_Date('" + Strings.Format(Conversions.ToDate(datStartTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') " + " And ReleaseDate<=To_Date('" + Strings.Format(Conversions.ToDate(datEndTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') " + " Order by ReleaseDate"; SQLCommandTuning(strDataBaseType, ref strSQL); //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); while (drTemp.Read()) { // 切割點 // -CreateDate需加入. // -ReleaseDate需加入. if (dtSplitTime.Select("SplitTime=#" + Strings.Format(Conversions.ToDate(drTemp["CreateDate"]), "yyyy/MM/dd H:mm:ss") + "#").Length == 0) { drAdd = dtSplitTime.NewRow(); drAdd["SplitTime"] = Strings.Format(Conversions.ToDate(drTemp["CreateDate"]), "yyyy/MM/dd H:mm:ss"); dtSplitTime.Rows.Add(drAdd); } if (dtSplitTime.Select("SplitTime=#" + Strings.Format(Conversions.ToDate(drTemp["ReleaseDate"]), "yyyy/MM/dd H:mm:ss") + "#").Length == 0) { drAdd = dtSplitTime.NewRow(); drAdd["SplitTime"] = Strings.Format(Conversions.ToDate(drTemp["ReleaseDate"]), "yyyy/MM/dd H:mm:ss"); dtSplitTime.Rows.Add(drAdd); } // 排除時間段 drAdd = dtHoldWait.NewRow(); drAdd["LotNo"] = strLotNo; drAdd["LogGroupSerial"] = strLogGroupSerial; drAdd["StartTime"] = Strings.Format(Conversions.ToDate(drTemp["CreateDate"]), "yyyy/MM/dd H:mm:ss"); drAdd["EndTime"] = Strings.Format(Conversions.ToDate(drTemp["ReleaseDate"]), "yyyy/MM/dd H:mm:ss"); drAdd["DType"] = "H"; drAdd["DTypeNo"] = drTemp["ERFNo"]; dtHoldWait.Rows.Add(drAdd); } drTemp.Close(); //cmmTemp.Dispose(); // E3:CreateDate>=datStartTime And CreateDate=datEndTime. // L計算起迄 : S---------------------------------------------------------------------E // L4 Hold_1st : 12---------| strSQL = "Select CreateDate,ReleaseDate,ERFNo From tblWIPERFBasis " + " Where ERFSource = 0 And LotNo='" + strFromLotNo + "'" + " And CreateDate>=To_Date('" + Strings.Format(Conversions.ToDate(datStartTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') " + " And CreateDate=To_Date('" + Strings.Format(Conversions.ToDate(datEndTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') or ReleaseDate is null) " + " Order by ReleaseDate"; SQLCommandTuning(strDataBaseType, ref strSQL); //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); while (drTemp.Read()) { // 切割點 // -CreateDate需加入. // -ReleaseDate在外面,不需加入. if (dtSplitTime.Select("SplitTime=#" + Strings.Format(Conversions.ToDate(drTemp["CreateDate"]), "yyyy/MM/dd H:mm:ss") + "#").Length == 0) { drAdd = dtSplitTime.NewRow(); drAdd["SplitTime"] = Strings.Format(Conversions.ToDate(drTemp["CreateDate"]), "yyyy/MM/dd H:mm:ss"); dtSplitTime.Rows.Add(drAdd); } // 排除時間段 drAdd = dtHoldWait.NewRow(); drAdd["LotNo"] = strLotNo; drAdd["LogGroupSerial"] = strLogGroupSerial; drAdd["StartTime"] = Strings.Format(Conversions.ToDate(drTemp["CreateDate"]), "yyyy/MM/dd H:mm:ss"); drAdd["EndTime"] = Strings.Format(Conversions.ToDate(datEndTime), "yyyy/MM/dd H:mm:ss"); drAdd["DType"] = "H"; drAdd["DTypeNo"] = drTemp["ERFNo"]; dtHoldWait.Rows.Add(drAdd); } drTemp.Close(); //cmmTemp.Dispose(); // E4:CreateDate>=datStartTime And CreateDate=datEndTime. // L計算起迄 : S---------------------------------------------------------------------E // L6 Wait_1st : |-------------------------------------------------------------------------------------------------------| strSQL = "Select CreateDate,ReleaseDate,ERFNo From tblWIPERFBasis " + " Where ERFSource = 0 And LotNo='" + strFromLotNo + "'" + " And CreateDate<=To_Date('" + Strings.Format(Conversions.ToDate(datStartTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') " + " And (ReleaseDate>=To_Date('" + Strings.Format(Conversions.ToDate(datEndTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') or ReleaseDate is null) " + " Order by ReleaseDate"; SQLCommandTuning(strDataBaseType, ref strSQL); //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); while (drTemp.Read()) { // 切割點 // -CreateDate在外面,不需加入. // -ReleaseDate在外面,不需加入. // 排除時間段 drAdd = dtHoldWait.NewRow(); drAdd["LotNo"] = strLotNo; drAdd["LogGroupSerial"] = strLogGroupSerial; drAdd["StartTime"] = Strings.Format(Conversions.ToDate(datStartTime), "yyyy/MM/dd H:mm:ss"); drAdd["EndTime"] = Strings.Format(Conversions.ToDate(datEndTime), "yyyy/MM/dd H:mm:ss"); drAdd["DType"] = "H"; drAdd["DTypeNo"] = drTemp["ERFNo"]; dtHoldWait.Rows.Add(drAdd); } drTemp.Close(); //cmmTemp.Dispose(); // 2.Wait // W1:CreateDate早於datStartTime,ReleaseDate>datStartTime And ReleaseDate<=datEndTime. strSQL = "Select CreateDate,ReleaseDate,WaitNo From tblWIPWaitBasis " + " Where LotNo='" + strFromLotNo + "'" + " And CreateDateTo_Date('" + Strings.Format(Conversions.ToDate(datStartTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') " + " And ReleaseDate<=To_Date('" + Strings.Format(Conversions.ToDate(datEndTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') " + " Order by ReleaseDate"; SQLCommandTuning(strDataBaseType, ref strSQL); //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); while (drTemp.Read()) { // 切割點 // -CreateDate在外面,不需加入. // -ReleaseDate需加入. if (dtSplitTime.Select("SplitTime=#" + Strings.Format(Conversions.ToDate(drTemp["ReleaseDate"]), "yyyy/MM/dd H:mm:ss") + "#").Length == 0) { drAdd = dtSplitTime.NewRow(); drAdd["SplitTime"] = Strings.Format(Conversions.ToDate(drTemp["ReleaseDate"]), "yyyy/MM/dd H:mm:ss"); dtSplitTime.Rows.Add(drAdd); } // 排除時間段 drAdd = dtHoldWait.NewRow(); drAdd["LotNo"] = strLotNo; drAdd["LogGroupSerial"] = strLogGroupSerial; drAdd["StartTime"] = Strings.Format(Conversions.ToDate(datStartTime), "yyyy/MM/dd H:mm:ss"); drAdd["EndTime"] = Strings.Format(Conversions.ToDate(drTemp["ReleaseDate"]), "yyyy/MM/dd H:mm:ss"); drAdd["DType"] = "W"; drAdd["DTypeNo"] = drTemp["WaitNo"]; dtHoldWait.Rows.Add(drAdd); } drTemp.Close(); //cmmTemp.Dispose(); // W2:CreateDate>=datStartTime,ReleaseDate<=datEndTime. strSQL = "Select CreateDate,ReleaseDate,WaitNo From tblWIPWaitBasis " + " Where LotNo='" + strFromLotNo + "'" + " And CreateDate>=To_Date('" + Strings.Format(Conversions.ToDate(datStartTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') " + " And ReleaseDate<=To_Date('" + Strings.Format(Conversions.ToDate(datEndTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') " + " Order by ReleaseDate"; SQLCommandTuning(strDataBaseType, ref strSQL); //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); while (drTemp.Read()) { // 切割點 // -CreateDate需加入. // -ReleaseDate需加入. if (dtSplitTime.Select("SplitTime=#" + Strings.Format(Conversions.ToDate(drTemp["CreateDate"]), "yyyy/MM/dd H:mm:ss") + "#").Length == 0) { drAdd = dtSplitTime.NewRow(); drAdd["SplitTime"] = Strings.Format(Conversions.ToDate(drTemp["CreateDate"]), "yyyy/MM/dd H:mm:ss"); dtSplitTime.Rows.Add(drAdd); } if (dtSplitTime.Select("SplitTime=#" + Strings.Format(Conversions.ToDate(drTemp["ReleaseDate"]), "yyyy/MM/dd H:mm:ss") + "#").Length == 0) { drAdd = dtSplitTime.NewRow(); drAdd["SplitTime"] = Strings.Format(Conversions.ToDate(drTemp["ReleaseDate"]), "yyyy/MM/dd H:mm:ss"); dtSplitTime.Rows.Add(drAdd); } // 排除時間段 drAdd = dtHoldWait.NewRow(); drAdd["LotNo"] = strLotNo; drAdd["LogGroupSerial"] = strLogGroupSerial; drAdd["StartTime"] = Strings.Format(Conversions.ToDate(drTemp["CreateDate"]), "yyyy/MM/dd H:mm:ss"); drAdd["EndTime"] = Strings.Format(Conversions.ToDate(drTemp["ReleaseDate"]), "yyyy/MM/dd H:mm:ss"); drAdd["DType"] = "W"; drAdd["DTypeNo"] = drTemp["WaitNo"]; dtHoldWait.Rows.Add(drAdd); } drTemp.Close(); //cmmTemp.Dispose(); // W3:CreateDate>=datStartTime And CreateDate=datEndTime. strSQL = "Select CreateDate,ReleaseDate,WaitNo From tblWIPWaitBasis " + " Where LotNo='" + strFromLotNo + "'" + " And CreateDate>=To_Date('" + Strings.Format(Conversions.ToDate(datStartTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') " + " And CreateDate=To_Date('" + Strings.Format(Conversions.ToDate(datEndTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') or ReleaseDate is null) " + " Order by ReleaseDate"; SQLCommandTuning(strDataBaseType, ref strSQL); //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); while (drTemp.Read()) { // 切割點 // -CreateDate需加入. // -ReleaseDate在外面,不需加入. if (dtSplitTime.Select("SplitTime=#" + Strings.Format(Conversions.ToDate(drTemp["CreateDate"]), "yyyy/MM/dd H:mm:ss") + "#").Length == 0) { drAdd = dtSplitTime.NewRow(); drAdd["SplitTime"] = Strings.Format(Conversions.ToDate(drTemp["CreateDate"]), "yyyy/MM/dd H:mm:ss"); dtSplitTime.Rows.Add(drAdd); } // 排除時間段 drAdd = dtHoldWait.NewRow(); drAdd["LotNo"] = strLotNo; drAdd["LogGroupSerial"] = strLogGroupSerial; drAdd["StartTime"] = Strings.Format(Conversions.ToDate(drTemp["CreateDate"]), "yyyy/MM/dd H:mm:ss"); drAdd["EndTime"] = Strings.Format(Conversions.ToDate(datEndTime), "yyyy/MM/dd H:mm:ss"); drAdd["DType"] = "W"; drAdd["DTypeNo"] = drTemp["WaitNo"]; dtHoldWait.Rows.Add(drAdd); } drTemp.Close(); //cmmTemp.Dispose(); // W4:CreateDate>=datStartTime And CreateDate=datEndTime. // L計算起迄 : S---------------------------------------------------------------------E // L6 Wait_1st : |-------------------------------------------------------------------------------------------------------| strSQL = "Select CreateDate,ReleaseDate,WaitNo From tblWIPWaitBasis " + " Where LotNo='" + strFromLotNo + "'" + " And CreateDate<=To_Date('" + Strings.Format(Conversions.ToDate(datStartTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') " + " And (ReleaseDate>=To_Date('" + Strings.Format(Conversions.ToDate(datEndTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') or ReleaseDate is null) " + " Order by ReleaseDate"; SQLCommandTuning(strDataBaseType, ref strSQL); //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); while (drTemp.Read()) { // 切割點 // -CreateDate在外面,不需加入. // -ReleaseDate在外面,不需加入. // 排除時間段 drAdd = dtHoldWait.NewRow(); drAdd["LotNo"] = strLotNo; drAdd["LogGroupSerial"] = strLogGroupSerial; drAdd["StartTime"] = Strings.Format(Conversions.ToDate(datStartTime), "yyyy/MM/dd H:mm:ss"); drAdd["EndTime"] = Strings.Format(Conversions.ToDate(datEndTime), "yyyy/MM/dd H:mm:ss"); drAdd["DType"] = "W"; drAdd["DTypeNo"] = drTemp["WaitNo"]; dtHoldWait.Rows.Add(drAdd); } drTemp.Close(); //cmmTemp.Dispose(); } } catch { throw; } finally { } return default(string); } private int funWriteShareEMPLog(string WriteTxt) { int funWriteShareEMPLogRet = default(int); funWriteShareEMPLogRet = -1; try { if (!Directory.Exists(AppDomain.CurrentDomain.BaseDirectory + @"\Log")) { Directory.CreateDirectory(AppDomain.CurrentDomain.BaseDirectory + @"\Log"); } var fs = new FileStream(AppDomain.CurrentDomain.BaseDirectory + @"\Log\AutoRun_ShareEMPTime_Log_" + Strings.Format(DateTime.Now, "yyyyMMdd") + ".txt", FileMode.OpenOrCreate, FileAccess.ReadWrite); var w = new StreamWriter(fs); w.BaseStream.Seek(0L, SeekOrigin.End); w.WriteLine(Strings.Format(DateTime.Now, "yyyy/MM/dd HH:mm:ss") + " " + WriteTxt); w.Close(); fs.Close(); funWriteShareEMPLogRet = 0; } catch (Exception e1) { } return funWriteShareEMPLogRet; } #endregion #region ---設備保養工單自動開立--- private string funPMWOAutoCreate_EQPTypeSOP(Collection colParameters = null) { string funPMWOAutoCreate_EQPTypeSOPRet = default(string); var cnnTemp = default(IDbConnection); //var daTemp = default(System.Data.OleDb.OleDbDataAdapter); var colSQL = new Collection(); var colSQL_Rows = new Collection(); var dsTemp = new DataSet(); var dsChamber = new DataSet(); DataRow[] drSel; string strSQL; string strWONo; DateTime datEventTime; int intWOItemNo = 0; bool blnAutoCreateWO, blnLockEquipment, blnAutoEmail, blnCreateAndReleaseWO, blnChkEQPState; DataRow drAdd; var dtSendMail = BuildMailTable(); string strSendMailMSG; string EquipmentNoList = ""; string strEQPSerialNo; int intWOType = 0; // 預防保養工單 string strFailMsg = ""; string ChamberManage = defString; DbDataReader drTemp; try { datEventTime = DateTime.Now; cnnTemp = CreateConnection(strConnectionString); //// 取出已到期的保養計劃(預估保養日PMEstDateTime <= Now) //strSQL = " Select A.*,B.EquipmentNo,B.PMSerialNo,B.PMEstDateTime,B.SerialNo,C.EquipmentName,C.EngineerGroupNo,D.PMSOPName As PMSOPName_Basis" + // " From tblPMEQPTypeSOPBasis A Join tblPMEQPMaintenancePlan B On A.PMEQPSOPNo = B.PMEQPSOPNo" + " Join tblEQPEquipmentBasis C On B.EquipmentNo = C.EquipmentNo " + // " Left Join tblPMSOPBasis D On A.PMSOPNo = D.PMSOPNo" + " Where B.PMEstDateTime <= To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd") + "','YYYY/MM/DD') "; //strSQL = SQLCommandTuning(strDataBaseType, ref strSQL); ////cmmTemp = new IDbCommand(strSQL, cnnTemp); ////daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp); ////daTemp.Fill(dsTemp, "PMEQPMaintenancePlan"); ////daTemp.Dispose(); //ExecuteSQLQuery_Adapter(strSQL, dsTemp, "PMEQPMaintenancePlan", cnnTemp); //取出已到期的保養計劃(預估保養日PMEstDateTime-BeforehandDay <= Now), 若未設提前開單天數(BeforehandDay, 則BeforehandDay會是0) strSQL = " Select A.*,B.EquipmentNo,B.PMSerialNo,B.PMEstDateTime,B.SerialNo,C.EquipmentName,C.EngineerGroupNo,D.PMSOPName As PMSOPName_Basis" + " From tblPMEQPTypeSOPBasis A Join tblPMEQPMaintenancePlan B On A.PMEQPSOPNo = B.PMEQPSOPNo" + " Join tblEQPEquipmentBasis C On B.EquipmentNo = C.EquipmentNo " + " Left Join tblPMSOPBasis D On A.PMSOPNo = D.PMSOPNo" + " Where (B.PMEstDateTime-Nvl(A.Beforehandday,0)) <= To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd") + "','YYYY/MM/DD') "; strSQL = SQLCommandTuning(strDataBaseType, ref strSQL); //cmmTemp = new IDbCommand(strSQL, cnnTemp); //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp); //daTemp.Fill(dsTemp, "PMEQPMaintenancePlan"); //daTemp.Dispose(); ExecuteSQLQuery_Adapter(strSQL, dsTemp, "PMEQPMaintenancePlan", cnnTemp); // 取出設備狀態互斥設定 //cmmTemp.CommandText = "Select * From tblEMSViolateStatusChange"; //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp); //daTemp.Fill(dsTemp, "ViolateStatusChange"); //daTemp.Dispose(); strSQL = "Select * From tblEMSViolateStatusChange"; ExecuteSQLQuery_Adapter(strSQL, dsTemp, "ViolateStatusChange", cnnTemp); // 組出應保養的設備List foreach (DataRow row in dsTemp.Tables["PMEQPMaintenancePlan"].DefaultView.ToTable(true, "EquipmentNo").Rows) EquipmentNoList = Conversions.ToString(EquipmentNoList + row["EquipmentNo"] + ","); EquipmentNoList = EquipmentNoList.TrimEnd(','); // 取出各設備的EMSEquipmentState //cmmTemp.CommandText = "Select * From tblEMSEquipmentState Where EquipmentNo In ('" + Strings.Replace(EquipmentNoList, ",", "','") + "')"; //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp); //daTemp.Fill(dsTemp, "EMSEquipmentState"); //daTemp.Dispose(); strSQL = "Select * From tblEMSEquipmentState Where EquipmentNo In ('" + Strings.Replace(EquipmentNoList, ",", "','") + "')"; ExecuteSQLQuery_Adapter(strSQL, dsTemp, "EMSEquipmentState", cnnTemp); // 2021/10/14 Mantis:0100751 當啟用系統參數:子設備管理,改變設備狀態時,需一併更新設備底下子設備的狀態 strSQL = "Select PARAMETERVALUE from tblSYSParameter where PARAMETERNO = 'ChamberManage'"; //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (drTemp.Read()) { ChamberManage = drTemp["PARAMETERVALUE"].ToString(); } drTemp.Dispose(); // 依每筆設備保養標準作業程序來開立保養工單 foreach (DataRow drEQPSOP in dsTemp.Tables["PMEQPMaintenancePlan"].DefaultView.ToTable(true, new[] { "PMEQPSOPNO", "AutoCreateWO", "CreateAndReleaseWO", "LockEquipment", "AutoEmail" }).Rows) { colSQL.Clear(); colSQL_Rows.Clear(); strWONo = "未開工單"; if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drEQPSOP["AutoCreateWO"], 1, false))) { blnAutoCreateWO = true; } else { blnAutoCreateWO = false; } if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drEQPSOP["CreateAndReleaseWO"], 1, false))) { blnCreateAndReleaseWO = true; } else { blnCreateAndReleaseWO = false; } if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drEQPSOP["LockEquipment"], 1, false))) // 變更機台狀態 { blnLockEquipment = true; } else { blnLockEquipment = false; } if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drEQPSOP["AutoEmail"], 1, false))) // 是否要發送Mail { blnAutoEmail = true; } else { blnAutoEmail = false; } foreach (DataRow drEQP in dsTemp.Tables["PMEQPMaintenancePlan"].Select(Conversions.ToString("PMEQPSOPNO = '" + drEQPSOP["PMEQPSOPNo"] + "'"))) { if (string.IsNullOrEmpty(drEQP["PMSOPName_Basis"].ToString())) { if (!string.IsNullOrEmpty(strFailMsg)) { strFailMsg = Conversions.ToString(strFailMsg + Constants.vbCrLf + "[PMSOPBasis does not exist, PMSOPNo:" + drEQP["PMSOPNo"] + "]"); } else { strFailMsg = Conversions.ToString("[PMSOPBasis does not exist, PMSOPNo:" + drEQP["PMSOPNo"] + "]"); } continue; } // 設備狀態變更處理 blnChkEQPState = true; //設備狀態檢核通過預設為通過, 只有要改變設備狀態且設備狀態互斥時才會被改為false //沒有設提早開單且有要改變設備狀態的, 才做設備狀態變更 if (Conversions.ToInteger(drEQP["BeforehandDay"]) == 0 && blnLockEquipment == true && !string.IsNullOrEmpty(drEQP["EquipmentState"].ToString())) { drSel = dsTemp.Tables["EMSEquipmentState"].Select(Conversions.ToString("EquipmentNo = '" + drEQP["EquipmentNo"] + "'")); if (drSel.Length > 0) { // 狀態互斥則開工單但不下線 if (dsTemp.Tables["ViolateStatusChange"].Select(Conversions.ToString("EquipmentState = " + drSel[0]["EquipmentState"] + " And ViolativeState = " + drEQP["EquipmentState"])).Length > 0) { //continue; blnChkEQPState = false; } else { if (Conversions.ToBoolean(Operators.ConditionalCompareObjectNotEqual(drSel[0]["EquipmentState"], drEQP["EquipmentState"], false))) // 狀態不同才需改變設備狀態 { strEQPSerialNo = InitEQPSerialNo(); if (strEQPSerialNo == "fail") { funPMWOAutoCreate_EQPTypeSOPRet = "fail;[Get InitEQPSerialNo fail]"; return funPMWOAutoCreate_EQPTypeSOPRet; } // Del Same EQPSerialNo strSQL = Conversions.ToString("Delete tblEMSEquipmentStateLog Where EQPSerialNo = '" + drSel[0]["EQPSerialNo"] + "'"); colSQL.Add(strSQL); colSQL_Rows.Add(-1); // Add EMSEquipmentStateLog strSQL = Conversions.ToString(" Insert into tblEMSEquipmentStateLog (EQPSerialNo,EquipmentNo,EquipmentState,EquipmentType,UserNo,StartTime,EndTime,Description) " + " Select EQPSerialNo,EquipmentNo,EquipmentState,EquipmentType,UserNo,StartTime,To_Date('" + Strings.Format(Conversions.ToDate(datEventTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),Description " + " From tblEMSEquipmentState " + " Where EquipmentNo = '" + drEQP["EquipmentNo"] + "'"); colSQL.Add(strSQL); colSQL_Rows.Add(1); // 更新EMSEquipmentState strSQL = Conversions.ToString("Update tblEMSEquipmentState Set " + "EquipmentState = " + drEQP["EquipmentState"] + "," + "StartTime = To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') ," + "EQPSerialNo = '" + strEQPSerialNo + "'," + "Description ='AutoRun'," + "UserNo = 'AutoRun'" + "Where EquipmentNo = '" + drEQP["EquipmentNo"] + "'"); colSQL.Add(strSQL); colSQL_Rows.Add(1); // 若開啟子設備管理,則須更新設備下子設備的設備狀態 if (ChamberManage == "1") { strSQL = "Select EquipmentNo from tblEQPEquipmentBasis Where BELONGEQUIPMENTNO = '" + drEQP["EquipmentNo"].ToString() + "'"; //cmmTemp = new IDbCommand(strSQL, cnnTemp); //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp); dsChamber = new DataSet(); //daTemp.Fill(dsChamber, "ChamberData"); //daTemp.Dispose(); ExecuteSQLQuery_Adapter(strSQL, dsChamber, "ChamberData", cnnTemp); foreach (DataRow dr in dsChamber.Tables["ChamberData"].Rows) { strSQL = "Select * From tblEMSEquipmentState Where EquipmentNo = '" + dr["EquipmentNo"].ToString() + "'"; //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (drTemp.Read()) { // 設備狀態不同才變更 if (Conversions.ToBoolean(Operators.ConditionalCompareObjectNotEqual(drEQP["EquipmentState"], drTemp["EquipmentState"], false))) { strEQPSerialNo = InitEQPSerialNo(); if (strEQPSerialNo == "fail") { funPMWOAutoCreate_EQPTypeSOPRet = "fail;[Get InitEQPSerialNo fail]"; return funPMWOAutoCreate_EQPTypeSOPRet; } // Del Same EQPSerialNo strSQL = Conversions.ToString("Delete tblEMSEquipmentStateLog Where EQPSerialNo = '" + drTemp["EQPSerialNo"] + "'"); colSQL.Add(strSQL); colSQL_Rows.Add(-1); // Add EMSEquipmentStateLog strSQL = Conversions.ToString(" Insert into tblEMSEquipmentStateLog (EQPSerialNo,EquipmentNo,EquipmentState,EquipmentType,UserNo,StartTime,EndTime,Description) " + " Select EQPSerialNo,EquipmentNo,EquipmentState,EquipmentType,UserNo,StartTime,To_Date('" + Strings.Format(Conversions.ToDate(datEventTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),Description " + " From tblEMSEquipmentState " + " Where EquipmentNo = '" + drTemp["EquipmentNo"] + "'"); colSQL.Add(strSQL); colSQL_Rows.Add(1); // 更新EMSEquipmentState strSQL = Conversions.ToString("Update tblEMSEquipmentState Set " + "EquipmentState = " + drEQP["EquipmentState"] + "," + "StartTime = To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') ," + "EQPSerialNo = '" + strEQPSerialNo + "'," + "Description ='AutoRun'," + "UserNo = 'AutoRun'" + "Where EquipmentNo = '" + drTemp["EquipmentNo"] + "'"); colSQL.Add(strSQL); colSQL_Rows.Add(1); } } drTemp.Dispose(); } } } } } } // 2.保養工單開立處理 if (blnAutoCreateWO == true) { if (strWONo == "未開工單") { strWONo = InitPMWONo(); intWOItemNo = 0; strSQL = "Insert into tblPMWoBasis(WONo,WOType,IssueState,CreateDate,Creator,Description) " + " Values ('" + strWONo + "'," + intWOType + ",2,To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),'Auto Run','Auto Run Create')"; colSQL.Add(strSQL); colSQL_Rows.Add(1); } intWOItemNo += 1; // 保養工單開立及自動下線: 需為保養工單開立即下線且不為提前開單(BeforehandDay=0)的工單且設備狀態檢核通過才可直接下線 if (blnCreateAndReleaseWO == true && Conversions.ToInteger(drEQP["BeforehandDay"]) == 0 && blnChkEQPState == true) { // 保養工單開立後直接下線, 狀態為2, ReleaseDate為目前時間 strSQL = "Insert into tblPMWODetail(" + " WONo,WOItemNo,PMSerialNo,EquipmentNo,PMEQPSOPNo,PMSOPNO,PMESTDATETIME,RELEASEDATE,WOStatus,SerialNo)" + " Values('" + strWONo + "'," + intWOItemNo + "," + drEQP["PMSerialNo"] + ",'" + drEQP["EquipmentNo"] + "','" + drEQP["PMEQPSOPNo"] + "','" + drEQP["PMSOPNO"] + "'," + " To_Date('" + Strings.Format(drEQP["PMESTDATETIME"], "yyyy/MM/dd") + "','YYYY/MM/DD')" + ", To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd") + "','YYYY/MM/DD'), 2,'" + drEQP["SerialNo"] + "')"; colSQL.Add(strSQL); colSQL_Rows.Add(1); // ExecuteState=3表示已下線工單, WOReleaseDate為目前時間 strSQL = "Insert into tblPMEQPMaintenancePlanLog(SerialNo,PMSerialNo,EquipmentNo,PMEQPSOPNo,FrequencyNo,PMSOPNo,PMEstDateTime,Creator,CreateDate,Reviser,ReviseDate," + "ExecuteState,PMWONo,PMWoItemNo,WOCreateDate,LogCreator,LogCreateDate,WOReleaseDate) " + " Select SerialNo,PMSerialNo,EquipmentNo,PMEQPSOPNo,FrequencyNo,PMSOPNo,PMEstDateTime,Creator,CreateDate," + " Reviser,ReviseDate,3,'" + strWONo + "'," + intWOItemNo + "," + " To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd") + "','YYYY/MM/DD'),'Auto Run'," + " To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd") + "','YYYY/MM/DD'), " + " To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd") + "','YYYY/MM/DD') " + " From tblPMEQPMaintenancePlan " + " Where SerialNo='" + drEQP["SerialNo"] + "'"; colSQL.Add(strSQL); colSQL_Rows.Add(1); } else { // 保養工單開立後不直接下線, 狀態為1:待料, ReleaseDate為空 strSQL = "Insert into tblPMWODetail(" + " WONo,WOItemNo,PMSerialNo,EquipmentNo,PMEQPSOPNo,PMSOPNO,PMESTDATETIME,WOStatus,SerialNo)" + " Values('" + strWONo + "'," + intWOItemNo + "," + drEQP["PMSerialNo"] + ",'" + drEQP["EquipmentNo"] + "','" + drEQP["PMEQPSOPNo"] + "','" + drEQP["PMSOPNO"] + "'," + " To_Date('" + Strings.Format(drEQP["PMESTDATETIME"], "yyyy/MM/dd") + "','YYYY/MM/DD'),1,'" + drEQP["SerialNo"] + "')"; colSQL.Add(strSQL); colSQL_Rows.Add(1); // ExecuteState=2表示工單開立, WOReleaseDate為空 strSQL = "Insert into tblPMEQPMaintenancePlanLog(SerialNo,PMSerialNo,EquipmentNo,PMEQPSOPNo,FrequencyNo,PMSOPNo,PMEstDateTime,Creator,CreateDate,Reviser,ReviseDate," + "ExecuteState,PMWONo,PMWoItemNo,WOCreateDate,LogCreator,LogCreateDate) " + " Select SerialNo,PMSerialNo,EquipmentNo,PMEQPSOPNo,FrequencyNo,PMSOPNo,PMEstDateTime,Creator,CreateDate," + " Reviser,ReviseDate,2,'" + strWONo + "'," + intWOItemNo + "," + " To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd") + "','YYYY/MM/DD'),'Auto Run'," + " To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd") + "','YYYY/MM/DD') " + " From tblPMEQPMaintenancePlan " + " Where SerialNo='" + drEQP["SerialNo"] + "'"; colSQL.Add(strSQL); colSQL_Rows.Add(1); } // 清除PMEQPMaintancePlan資料 strSQL = Conversions.ToString("Delete From tblPMEQPMaintenancePlan Where SerialNo='" + drEQP["SerialNo"] + "'"); colSQL.Add(strSQL); colSQL_Rows.Add(1); } // 3.Mail發送處理 if (blnAutoEmail == true) { drAdd = dtSendMail.NewRow(); drAdd["WONo"] = strWONo; drAdd["EquipmentNo"] = drEQP["EquipmentNo"] + ""; drAdd["EquipmentName"] = drEQP["EquipmentName"] + ""; drAdd["FrequencyName"] = drEQP["FrequencyName"] + ""; drAdd["PMSOPName"] = drEQP["PMSOPName"] + ""; drAdd["EngineerGroupNo"] = drEQP["EngineerGroupNo"] + ""; dtSendMail.Rows.Add(drAdd); } // 4. 更新設備的PMEqupmentState strSQL = Conversions.ToString("Update tblPMEquipmentState Set SincePMQty = 0, SincePMTimes = 0, LastPMDate = To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')" + " Where EquipmentNo = '" + drEQP["EquipmentNo"] + "'"); colSQL.Add(strSQL); colSQL_Rows.Add(1); } ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colSQL, colSQL_Rows); } dtSendMail = dtSendMail.DefaultView.ToTable(true, new[] { "WONo", "EquipmentNo", "FrequencyName", "PMSOPName", "EngineerGroupNo" }); foreach (DataRow rowGroupNo in dtSendMail.DefaultView.ToTable(true, "EngineerGroupNo").Rows) { strSendMailMSG = "

PM Work Order

"; foreach (DataRow row in dtSendMail.Select(Conversions.ToString("EngineerGroupNo = '" + rowGroupNo["EngineerGroupNo"] + "'"))) { strSendMailMSG = Conversions.ToString(strSendMailMSG + "

WONo: " + row["WONo"] + "

"); strSendMailMSG = Conversions.ToString(strSendMailMSG + "

EquipemntNo: " + row["EquipmentNo"] + "

"); strSendMailMSG = Conversions.ToString(strSendMailMSG + "

PMSOPName: " + row["PMSOPName"] + "

"); strSendMailMSG = Conversions.ToString(strSendMailMSG + "

FrequencyName: " + row["FrequencyName"] + "

"); } if (!string.IsNullOrEmpty(strSendMailMSG)) { strSendMailMSG += ""; string argFileName = "N/A"; string argEmailSubject = "PM Work Order"; modAutoRunLibrary.SendMultiEmail(ref argFileName, ref argEmailSubject, strSendMailMSG, Conversions.ToString(rowGroupNo["EngineerGroupNo"]), GroupType: (modAutoRunLibrary.GroupType)2); } } //當參數1「已開立工單逾保養日自動下線」的值為Y時,需查核透過 Auto Run 所自動開立的預防保養工單(tblPMWoBasis.Creator = Auto Run And tblPMWoBasis.WOType = 0), //若已超過其預定保養日(PMEstDateTime),但該保養工單還未下線(包含這次所開立的保養工單及不排除提早開單的工單),則將該保養工單做下線, //設備狀態則依該保養工單所對應的設備保養標準程序(PM201)中,所設定是否改變設備狀態,來決定要不要改變設備狀態,若設定要變更設備狀態,但設備狀態無法變更時,就不下線該保養工單。 if (colParameters["Parameter01"].ToString() == "Y") { bool blnReleaseWO = true; datEventTime = DateTime.Now; //取出已到期的保養計劃(預估保養日PMEstDateTime <= Now) strSQL = " Select A.*,B.EquipmentNo,B.SerialNo,C.LockEquipment, C.EquipmentState" + " From tblPMWoDetail A Join tblPMWOBasis Basis On A.WONo = Basis.WONo" + " Join tblPMEQPMaintenancePlanLog B On A.WONo = B.PMWONo" + " Join tblPMEQPTypeSOPBasis C On B.PMEQPSOPNo = C.PMEQPSOPNo" + " Where Basis.Creator = 'Auto Run' And A.WOStatus = 1 And B.PMEstDateTime < To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd") + "','YYYY/MM/DD') "; strSQL = SQLCommandTuning(strDataBaseType, ref strSQL); ExecuteSQLQuery_Adapter(strSQL, dsTemp, "OverPMDate", cnnTemp); // 組出應保養的設備List EquipmentNoList = ""; foreach (DataRow row in dsTemp.Tables["OverPMDate"].DefaultView.ToTable(true, "EquipmentNo").Rows) EquipmentNoList = Conversions.ToString(EquipmentNoList + row["EquipmentNo"] + ","); EquipmentNoList = EquipmentNoList.TrimEnd(','); // 取出各設備的EMSEquipmentState if (dsTemp.Tables["EMSEquipmentState"] != null) { dsTemp.Tables.Remove(dsTemp.Tables["EMSEquipmentState"]); } strSQL = "Select * From tblEMSEquipmentState Where EquipmentNo In ('" + Strings.Replace(EquipmentNoList, ",", "','") + "')"; ExecuteSQLQuery_Adapter(strSQL, dsTemp, "EMSEquipmentState", cnnTemp); foreach (DataRow row in dsTemp.Tables["OverPMDate"].Rows) { colSQL.Clear(); colSQL_Rows.Clear(); blnReleaseWO = true; if (row["LockEquipment"].ToString() == "1" && !string.IsNullOrEmpty(row["EquipmentState"].ToString())) //需改變設備狀態 { drSel = dsTemp.Tables["EMSEquipmentState"].Select("EquipmentNo = '" + row["EquipmentNo"] + "'"); if (drSel.Length > 0) { // 設備狀態不相等且互斥則不可下線 if (drSel[0]["EquipmentState"] != row["EquipmentState"] && dsTemp.Tables["ViolateStatusChange"].Select("EquipmentState = " + drSel[0]["EquipmentState"] + " And ViolativeState = " + row["EquipmentState"]).Length > 0) { blnReleaseWO = false; } } } if (blnReleaseWO == true) { strSQL = "Update tblPMWODetail Set WOStatus = 2, ReleaseDate = To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd") + "','YYYY/MM/DD') Where WONo = '" + row["WONo"] + "' And WOItemNo = " + row["WOItemNo"]; colSQL.Add(strSQL); colSQL_Rows.Add(1); strSQL = "Update tblPMEQPMaintenancePlanLog Set ExecuteState = 3, WOReleaseDate = To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd") + "','YYYY/MM/DD') Where SerialNo = '" + row["SerialNo"] + "'"; colSQL.Add(strSQL); colSQL_Rows.Add(1); ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colSQL, colSQL_Rows); } } } if (!string.IsNullOrEmpty(strFailMsg)) { funPMWOAutoCreate_EQPTypeSOPRet = "fail;" + strFailMsg; } else { funPMWOAutoCreate_EQPTypeSOPRet = "success"; } } catch (Exception ex) { funPMWOAutoCreate_EQPTypeSOPRet = CombineFailMsg("0000-999999", ex.Message); } finally { // //釋放資源 if (dsTemp != null) { dsTemp.Dispose(); dsTemp = null; } //if (daTemp != null) //{ // daTemp.Dispose(); // daTemp = null; //} colSQL = null; colSQL_Rows = null; // //Close Connection CloseConnection(cnnTemp); } return funPMWOAutoCreate_EQPTypeSOPRet; } private string funPMWOAutoCreate_FixedQty(Collection colParameters = null) { string funPMWOAutoCreate_FixedQtyRet = default(string); var cnnTemp = default(IDbConnection); //var daTemp = default(System.Data.OleDb.OleDbDataAdapter); var colSQL = new Collection(); var colSQL_Rows = new Collection(); var dsTemp = new DataSet(); DataRow[] drSel; string strSQL; string strWONo; DateTime datEventTime; int intWOItemNo = 0; bool blnAutoCreateWO, blnLockEquipment, blnAutoEmail; DataRow drAdd; var dtSendMail = BuildMailTable(); string strSendMailMSG; string EquipmentNoList = ""; string strEQPSerialNo; int intWOType = 2; // 定量保養工單 string strFailMsg = ""; var dsChamber = new DataSet(); string ChamberManage = defString; DbDataReader drTemp; try { datEventTime = DateTime.Now; cnnTemp = CreateConnection(strConnectionString); // 取出數量已到的設備(SincePMQty >= Quantity) // 2019/12/5, Ning, 改用 Left Join tblPMSOPBasis //2023/3/9,Ning,若有設定寬限數量(tblPMFixedQtyPMBasis.ToleranceQty<>0), 則改成取出已達寬限數量的設備(TypeCode:0 -> EquipmentNo ,1 -> EquipmentType) strSQL = " Select A.*,B.EquipmentNo,B.SincePMQty,C.EquipmentName,C.EngineerGroupNo,D.PMSOPName " + " From tblPMFixedQtyPMBasis A Join tblPMEquipmentState B On A.EquipmentNo = B.EquipmentNo" + " Join tblEQPEquipmentBasis C On A.EquipmentNo = C.EquipmentNo" + " Left Join tblPMSOPBasis D On A.PMSOPNo = D.PMSOPNo" + " Where A.TypeCode = 0 And ((B.SincePMQty >= A.Quantity And A.ToleranceQty = 0) OR (B.SincePMQty >= A.ToleranceQty And A.ToleranceQty <> 0))"; // strSQL = " Select A.*,B.EquipmentNo,B.SincePMQty,C.EquipmentName,C.EngineerGroupNo,D.PMSOPName " & // " From tblPMFixedQtyPMBasis A,tblPMEquipmentState B,tblEQPEquipmentBasis C, tblPMSOPBasis D " & // " Where A.TypeCode = 0 And A.EquipmentNo = B.EquipmentNo And B.EquipmentNo = C.EquipmentNo And A.PMSOPNo = D.PMSOPNo" & // " And B.SincePMQty >= A.Quantity " //cmmTemp = new IDbCommand(strSQL, cnnTemp); //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp); //daTemp.Fill(dsTemp, "PMEQP"); //daTemp.Dispose(); ExecuteSQLQuery_Adapter(strSQL, dsTemp, "PMEQP", cnnTemp); // 取出設備狀態互斥設定 //cmmTemp.CommandText = "Select * From tblEMSViolateStatusChange"; //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp); //daTemp.Fill(dsTemp, "ViolateStatusChange"); //daTemp.Dispose(); strSQL = "Select * From tblEMSViolateStatusChange"; ExecuteSQLQuery_Adapter(strSQL, dsTemp, "ViolateStatusChange", cnnTemp); // 組出應保養的設備List foreach (DataRow drEQP in dsTemp.Tables["PMEQP"].Rows) EquipmentNoList = Conversions.ToString(EquipmentNoList + drEQP["EquipmentNo"] + ","); EquipmentNoList = EquipmentNoList.TrimEnd(','); // 取出各設備的EMSEquipmentState //cmmTemp.CommandText = "Select * From tblEMSEquipmentState Where EquipmentNo In ('" + Strings.Replace(EquipmentNoList, ",", "','") + "')"; //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp); //daTemp.Fill(dsTemp, "EMSEquipmentState"); //daTemp.Dispose(); strSQL = "Select * From tblEMSEquipmentState Where EquipmentNo In ('" + Strings.Replace(EquipmentNoList, ",", "','") + "')"; ExecuteSQLQuery_Adapter(strSQL, dsTemp, "EMSEquipmentState", cnnTemp); strSQL = "Select PARAMETERVALUE from tblSYSParameter where PARAMETERNO = 'ChamberManage'"; //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (drTemp.Read()) { ChamberManage = drTemp["PARAMETERVALUE"].ToString(); } drTemp.Dispose(); // 依每筆設備的定量保養設定來開立保養工單(同一設備類別開一張保養工單) foreach (DataRow drEQPType in dsTemp.Tables["PMEQP"].DefaultView.ToTable(true, new[] { "EquipmentType", "AutoCreateWO", "LockEquipment", "AutoEmail" }).Rows) { colSQL.Clear(); colSQL_Rows.Clear(); strWONo = "未開工單"; if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drEQPType["AutoCreateWO"], 1, false))) { blnAutoCreateWO = true; } else { blnAutoCreateWO = false; } if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drEQPType["LockEquipment"], 1, false))) // 變更機台狀態 { blnLockEquipment = true; } else { blnLockEquipment = false; } if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drEQPType["AutoEmail"], 1, false))) // 是否要發送Mail { blnAutoEmail = true; } else { blnAutoEmail = false; } foreach (DataRow drEQP in dsTemp.Tables["PMEQP"].Select(Conversions.ToString("EquipmentType = '" + drEQPType["EquipmentType"] + "'"))) { if (string.IsNullOrEmpty(drEQP["PMSOPName"].ToString())) { if (!string.IsNullOrEmpty(strFailMsg)) { strFailMsg = Conversions.ToString(strFailMsg + Constants.vbCrLf + "[PMSOPBasis does not exist, PMSOPNo:" + drEQP["PMSOPNo"] + "]"); } else { strFailMsg = Conversions.ToString("[PMSOPBasis does not exist, PMSOPNo:" + drEQP["PMSOPNo"] + "]"); } continue; } // 設備狀態變更處理 if (blnLockEquipment == true && !string.IsNullOrEmpty(drEQP["EquipmentState"].ToString())) { drSel = dsTemp.Tables["EMSEquipmentState"].Select(Conversions.ToString("EquipmentNo = '" + drEQP["EquipmentNo"] + "'")); if (drSel.Length > 0) { // 狀態互斥則續下筆 if (dsTemp.Tables["ViolateStatusChange"].Select(Conversions.ToString("EquipmentState = " + drSel[0]["EquipmentState"] + " And ViolativeState = " + drEQP["EquipmentState"])).Length > 0) { continue; } if (Conversions.ToBoolean(Operators.ConditionalCompareObjectNotEqual(drSel[0]["EquipmentState"], drEQP["EquipmentState"], false))) // 狀態不同才需改變設備狀態 { strEQPSerialNo = InitEQPSerialNo(); if (strEQPSerialNo == "fail") { funPMWOAutoCreate_FixedQtyRet = "fail;[Get InitEQPSerialNo fail]"; return funPMWOAutoCreate_FixedQtyRet; } // Del Same EQPSerialNo strSQL = Conversions.ToString("Delete tblEMSEquipmentStateLog Where EQPSerialNo = '" + drSel[0]["EQPSerialNo"] + "'"); colSQL.Add(strSQL); colSQL_Rows.Add(-1); // Add EMSEquipmentStateLog strSQL = Conversions.ToString(" Insert into tblEMSEquipmentStateLog (EQPSerialNo,EquipmentNo,EquipmentState,EquipmentType,UserNo,StartTime,EndTime,Description) " + " Select EQPSerialNo,EquipmentNo,EquipmentState,EquipmentType,UserNo,StartTime,To_Date('" + Strings.Format(Conversions.ToDate(datEventTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),Description " + " From tblEMSEquipmentState " + " Where EquipmentNo = '" + drEQP["EquipmentNo"] + "'"); colSQL.Add(strSQL); colSQL_Rows.Add(1); // 更新EMSEquipmentState, 以EquipmentState做RowCount查核 strSQL = Conversions.ToString("Update tblEMSEquipmentState Set " + "EquipmentState = " + drEQP["EquipmentState"] + "," + "StartTime = To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') ," + "EQPSerialNo = '" + strEQPSerialNo + "'," + "Description ='AutoRun'," + "UserNo = 'AutoRun'" + "Where EquipmentNo = '" + drEQP["EquipmentNo"] + "' And EquipmentState = " + drSel[0]["EquipmentState"]); colSQL.Add(strSQL); colSQL_Rows.Add(1); // 若開啟子設備管理,則須更新設備下子設備的設備狀態 if (ChamberManage == "1") { strSQL = "Select EquipmentNo from tblEQPEquipmentBasis Where BELONGEQUIPMENTNO = '" + drEQP["EquipmentNo"].ToString() + "'"; //cmmTemp = new IDbCommand(strSQL, cnnTemp); //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp); dsChamber = new DataSet(); //daTemp.Fill(dsChamber, "ChamberData"); //daTemp.Dispose(); ExecuteSQLQuery_Adapter(strSQL, dsChamber, "ChamberData", cnnTemp); foreach (DataRow dr in dsChamber.Tables["ChamberData"].Rows) { strSQL = "Select * From tblEMSEquipmentState Where EquipmentNo = '" + dr["EquipmentNo"].ToString() + "'"; //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (drTemp.Read()) { // 設備狀態不同才變更 if (Conversions.ToBoolean(Operators.ConditionalCompareObjectNotEqual(drEQP["EquipmentState"], drTemp["EquipmentState"], false))) { strEQPSerialNo = InitEQPSerialNo(); if (strEQPSerialNo == "fail") { funPMWOAutoCreate_FixedQtyRet = "fail;[Get InitEQPSerialNo fail]"; return funPMWOAutoCreate_FixedQtyRet; } // Del Same EQPSerialNo strSQL = Conversions.ToString("Delete tblEMSEquipmentStateLog Where EQPSerialNo = '" + drTemp["EQPSerialNo"] + "'"); colSQL.Add(strSQL); colSQL_Rows.Add(-1); // Add EMSEquipmentStateLog strSQL = Conversions.ToString(" Insert into tblEMSEquipmentStateLog (EQPSerialNo,EquipmentNo,EquipmentState,EquipmentType,UserNo,StartTime,EndTime,Description) " + " Select EQPSerialNo,EquipmentNo,EquipmentState,EquipmentType,UserNo,StartTime,To_Date('" + Strings.Format(Conversions.ToDate(datEventTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),Description " + " From tblEMSEquipmentState " + " Where EquipmentNo = '" + drTemp["EquipmentNo"] + "'"); colSQL.Add(strSQL); colSQL_Rows.Add(1); // 更新EMSEquipmentState strSQL = Conversions.ToString("Update tblEMSEquipmentState Set " + "EquipmentState = " + drEQP["EquipmentState"] + "," + "StartTime = To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') ," + "EQPSerialNo = '" + strEQPSerialNo + "'," + "Description ='AutoRun'," + "UserNo = 'AutoRun'" + "Where EquipmentNo = '" + drTemp["EquipmentNo"] + "'"); colSQL.Add(strSQL); colSQL_Rows.Add(1); } } drTemp.Dispose(); } } } } } // 2.保養工單開立處理 if (blnAutoCreateWO == true) { if (strWONo == "未開工單") { strWONo = InitPMWONo(); intWOItemNo = 0; strSQL = "Insert into tblPMWoBasis(WONo,WOType,IssueState,CreateDate,Creator,Description) " + " Values ('" + strWONo + "'," + intWOType + ",2,To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),'Auto Run','Auto Run Create')"; colSQL.Add(strSQL); colSQL_Rows.Add(1); } intWOItemNo += 1; // 保養工單開立後直接下線, WOStatus = 2 // 2020/4/29, Ning, 保養工單開立後不直接下線, 狀態為1:待料 strSQL = "Insert into tblPMWODetail(WONo,WOItemNo,PMSerialNo,EquipmentNo,PMSOPNO,PMESTDATETIME,WOStatus) Values('" + strWONo + "'," + intWOItemNo + "," + intWOItemNo + ",'" + drEQP["EquipmentNo"] + "','" + drEQP["PMSOPNO"] + "'," + " To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd") + "','YYYY/MM/DD'),1)"; colSQL.Add(strSQL); colSQL_Rows.Add(1); } // 3.Mail發送處理 if (blnAutoEmail == true) { drAdd = dtSendMail.NewRow(); drAdd["WONo"] = strWONo; drAdd["EquipmentNo"] = drEQP["EquipmentNo"] + ""; drAdd["EquipmentName"] = drEQP["EquipmentName"] + ""; drAdd["PMSOPName"] = drEQP["PMSOPName"] + ""; drAdd["EngineerGroupNo"] = drEQP["EngineerGroupNo"] + ""; dtSendMail.Rows.Add(drAdd); } // 4. 更新設備的PMEqupmentState strSQL = Conversions.ToString("Update tblPMEquipmentState Set SincePMQty = 0, SincePMTimes = 0, LastPMDate = To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')" + " Where EquipmentNo = '" + drEQP["EquipmentNo"] + "'"); colSQL.Add(strSQL); colSQL_Rows.Add(1); } ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colSQL, colSQL_Rows); } dtSendMail = dtSendMail.DefaultView.ToTable(true, new[] { "WONo", "EquipmentNo", "PMSOPName", "EngineerGroupNo" }); foreach (DataRow rowGroupNo in dtSendMail.DefaultView.ToTable(true, "EngineerGroupNo").Rows) { strSendMailMSG = "

Fixed Qty Work Order

"; foreach (DataRow row in dtSendMail.Select(Conversions.ToString("EngineerGroupNo = '" + rowGroupNo["EngineerGroupNo"] + "'"))) { strSendMailMSG = Conversions.ToString(strSendMailMSG + "

WONo: " + row["WONo"] + "

"); strSendMailMSG = Conversions.ToString(strSendMailMSG + "

EquipemntNo: " + row["EquipmentNo"] + "

"); strSendMailMSG = Conversions.ToString(strSendMailMSG + "

PMSOPName: " + row["PMSOPName"] + "

"); } if (!string.IsNullOrEmpty(strSendMailMSG)) { strSendMailMSG += ""; string argFileName = "N/A"; string argEmailSubject = "Fixed Qty Work Order"; modAutoRunLibrary.SendMultiEmail(ref argFileName, ref argEmailSubject, strSendMailMSG, Conversions.ToString(rowGroupNo["EngineerGroupNo"]), GroupType: (modAutoRunLibrary.GroupType)2); } } if (!string.IsNullOrEmpty(strFailMsg)) { funPMWOAutoCreate_FixedQtyRet = "fail;" + strFailMsg; } else { funPMWOAutoCreate_FixedQtyRet = "success"; } } catch (Exception ex) { funPMWOAutoCreate_FixedQtyRet = CombineFailMsg("0000-999999", ex.Message + ",StackTrace:" + ex.StackTrace + "]"); } finally { // //釋放資源 if (dsTemp != null) { dsTemp.Dispose(); dsTemp = null; } //if (daTemp != null) //{ // daTemp.Dispose(); // daTemp = null; //} colSQL = null; colSQL_Rows = null; // //Close Connection CloseConnection(cnnTemp); } return funPMWOAutoCreate_FixedQtyRet; } private string funPMWOAutoCreate_FixedTimes(Collection colParameters = null) { string funPMWOAutoCreate_FixedTimesRet = default(string); var cnnTemp = default(IDbConnection); //var daTemp = default(System.Data.OleDb.OleDbDataAdapter); var colSQL = new Collection(); var colSQL_Rows = new Collection(); var dsTemp = new DataSet(); DataRow[] drSel; var dsChamber = new DataSet(); string strSQL; string strWONo; DateTime datEventTime; int intWOItemNo = 0; bool blnAutoCreateWO, blnLockEquipment, blnAutoEmail; DataRow drAdd; var dtSendMail = BuildMailTable(); string strSendMailMSG; string EquipmentNoList = ""; string strEQPSerialNo; int intWOType = 3; // 定次定時保養工單 string strFailMsg = ""; string ChamberManage = defString; DbDataReader drTemp; try { datEventTime = DateTime.Now; cnnTemp = CreateConnection(strConnectionString); // 取出定次(QtyType = 0)已到的設備(SincePMTimes >= Quantity) // 2019/12/5, Ning, 改用 Left Join tblPMSOPBasis strSQL = " Select A.*,B.EquipmentNo,B.SincePMQty,C.EquipmentName,C.EngineerGroupNo,D.PMSOPName " + " From tblPMFixedTimesPMBasis A Join tblPMEquipmentState B On A.EquipmentNo = B.EquipmentNo" + " Join tblEQPEquipmentBasis C On A.EquipmentNo = C.EquipmentNo" + " Left Join tblPMSOPBasis D On A.PMSOPNo = D.PMSOPNo" + " Where A.QtyType = 0 And A.TypeCode = 0 And ((B.SincePMTimes >= A.Quantity And A.ToleranceQty = 0) OR (B.SincePMTimes >= A.ToleranceQty And A.ToleranceQty <> 0))"; //cmmTemp = new IDbCommand(strSQL, cnnTemp); //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp); //daTemp.Fill(dsTemp, "PMEQP"); //daTemp.Dispose(); ExecuteSQLQuery_Adapter(strSQL, dsTemp, "PMEQP", cnnTemp); // 取出定時(QtyType = 1, Hours)已到的設備(上次保養至今 >= Quantity) if (strDataBaseType == "oracle") { strSQL = " Select A.*,B.EquipmentNo,B.SincePMQty,C.EquipmentName,C.EngineerGroupNo,D.PMSOPName " + " From tblPMFixedTimesPMBasis A Join tblPMEquipmentState B On A.EquipmentNo = B.EquipmentNo" + " Join tblEQPEquipmentBasis C On A.EquipmentNo = C.EquipmentNo" + " Left Join tblPMSOPBasis D On A.PMSOPNo = D.PMSOPNo" + " Where A.QtyType = 1 And A.TypeCode = 0" + " And ((B.LastPMDate Is Not Null And (To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') - LastPMDate) * 24 >= A.Quantity And A.ToleranceQty = 0) OR" + " (B.LastPMDate Is Not Null And (To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') - LastPMDate) * 24 >= A.ToleranceQty And A.ToleranceQty <> 0))"; } else if (Conversions.ToBoolean(Operators.OrObject(strDataBaseType == "mssql", Operators.ConditionalCompareObjectEqual(DataBaseType, "msaccess", false)))) // SQL與Access語法相同 { strSQL = " Select A.*,B.EquipmentNo,B.SincePMQty,C.EquipmentName,C.EngineerGroupNo,D.PMSOPName " + " From tblPMFixedTimesPMBasis A Join tblPMEquipmentState B On A.EquipmentNo = B.EquipmentNo" + " Join tblEQPEquipmentBasis C On A.EquipmentNo = C.EquipmentNo" + " Left Join tblPMSOPBasis D On A.PMSOPNo = D.PMSOPNo" + " Where A.QtyType = 1 And A.TypeCode = 0" + " And ((B.LastPMDate Is Not Null And DateDiff(hh, LastPMDate, '" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "') >= A.Quantity And A.ToleranceQty = 0) OR" + " (B.LastPMDate Is Not Null And DateDiff(hh, LastPMDate, '" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "') >= A.ToleranceQty And A.ToleranceQty <> 0))"; } //cmmTemp = new IDbCommand(strSQL, cnnTemp); //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp); //daTemp.Fill(dsTemp, "PMEQP"); //daTemp.Dispose(); ExecuteSQLQuery_Adapter(strSQL, dsTemp, "PMEQP", cnnTemp); // 取出定時(QtyType = 2, Minutes)已到的設備(上次保養至今 >= Quantity) if (strDataBaseType == "oracle") { strSQL = " Select A.*,B.EquipmentNo,B.SincePMQty,C.EquipmentName,C.EngineerGroupNo,D.PMSOPName " + " From tblPMFixedTimesPMBasis A Join tblPMEquipmentState B On A.EquipmentNo = B.EquipmentNo" + " Join tblEQPEquipmentBasis C On A.EquipmentNo = C.EquipmentNo" + " Left Join tblPMSOPBasis D On A.PMSOPNo = D.PMSOPNo" + " Where A.QtyType = 2 And A.TypeCode = 0" + " And ((B.LastPMDate Is Not Null And (To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') - LastPMDate)*24*60 >= A.Quantity And A.ToleranceQty = 0) OR" + " (B.LastPMDate Is Not Null And (To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') - LastPMDate)*24*60 >= A.ToleranceQty And A.ToleranceQty <> 0))"; } else if (Conversions.ToBoolean(Operators.OrObject(strDataBaseType == "mssql", Operators.ConditionalCompareObjectEqual(DataBaseType, "msaccess", false)))) // SQL與Access語法相同 { strSQL = " Select A.*,B.EquipmentNo,B.SincePMQty,C.EquipmentName,C.EngineerGroupNo,D.PMSOPName " + " From tblPMFixedTimesPMBasis A Join tblPMEquipmentState B On A.EquipmentNo = B.EquipmentNo" + " Join tblEQPEquipmentBasis C On A.EquipmentNo = C.EquipmentNo" + " Left Join tblPMSOPBasis D On A.PMSOPNo = D.PMSOPNo" + " Where A.QtyType = 2 And A.TypeCode = 0" + " And ((B.LastPMDate Is Not Null And DateDiff(mi, LastPMDate, '" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "') >= A.Quantity And A.ToleranceQty = 0) OR" + " (B.LastPMDate Is Not Null And DateDiff(mi, LastPMDate, '" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "') >= A.ToleranceQty And A.ToleranceQty <> 0))"; } //cmmTemp = new IDbCommand(strSQL, cnnTemp); //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp); //daTemp.Fill(dsTemp, "PMEQP"); //daTemp.Dispose(); ExecuteSQLQuery_Adapter(strSQL, dsTemp, "PMEQP", cnnTemp); // 取出設備狀態互斥設定 //cmmTemp.CommandText = "Select * From tblEMSViolateStatusChange"; //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp); //daTemp.Fill(dsTemp, "ViolateStatusChange"); //daTemp.Dispose(); strSQL = "Select * From tblEMSViolateStatusChange"; ExecuteSQLQuery_Adapter(strSQL, dsTemp, "ViolateStatusChange", cnnTemp); // 組出應保養的設備List foreach (DataRow drEQP in dsTemp.Tables["PMEQP"].Rows) EquipmentNoList = Conversions.ToString(EquipmentNoList + drEQP["EquipmentNo"] + ","); EquipmentNoList = EquipmentNoList.TrimEnd(','); // 取出各設備的EMSEquipmentState //cmmTemp.CommandText = "Select * From tblEMSEquipmentState Where EquipmentNo In ('" + Strings.Replace(EquipmentNoList, ",", "','") + "')"; //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp); //daTemp.Fill(dsTemp, "EMSEquipmentState"); //daTemp.Dispose(); strSQL = "Select * From tblEMSEquipmentState Where EquipmentNo In ('" + Strings.Replace(EquipmentNoList, ",", "','") + "')"; ExecuteSQLQuery_Adapter(strSQL, dsTemp, "EMSEquipmentState", cnnTemp); // 2021/10/14 Mantis:0100751 當啟用系統參數:子設備管理,改變設備狀態時,需一併更新設備底下子設備的狀態 strSQL = "Select PARAMETERVALUE from tblSYSParameter where PARAMETERNO = 'ChamberManage'"; //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (drTemp.Read()) { ChamberManage = drTemp["PARAMETERVALUE"].ToString(); } drTemp.Dispose(); // 依每筆設備的定量保養設定來開立保養工單(同一設備類別開一張保養工單) foreach (DataRow drEQPType in dsTemp.Tables["PMEQP"].DefaultView.ToTable(true, new[] { "EquipmentType", "AutoCreateWO", "LockEquipment", "AutoEmail" }).Rows) { colSQL.Clear(); colSQL_Rows.Clear(); strWONo = "未開工單"; if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drEQPType["AutoCreateWO"], 1, false))) { blnAutoCreateWO = true; } else { blnAutoCreateWO = false; } if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drEQPType["LockEquipment"], 1, false))) // 變更機台狀態 { blnLockEquipment = true; } else { blnLockEquipment = false; } if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drEQPType["AutoEmail"], 1, false))) // 是否要發送Mail { blnAutoEmail = true; } else { blnAutoEmail = false; } foreach (DataRow drEQP in dsTemp.Tables["PMEQP"].Select(Conversions.ToString("EquipmentType = '" + drEQPType["EquipmentType"] + "'"))) { if (string.IsNullOrEmpty(drEQP["PMSOPName"].ToString())) { if (!string.IsNullOrEmpty(strFailMsg)) { strFailMsg = Conversions.ToString(strFailMsg + Constants.vbCrLf + "[PMSOPBasis does not exist, PMSOPNo:" + drEQP["PMSOPNo"] + "]"); } else { strFailMsg = Conversions.ToString("[PMSOPBasis does not exist, PMSOPNo:" + drEQP["PMSOPNo"] + "]"); } continue; } // 設備狀態變更處理 if (blnLockEquipment == true && !string.IsNullOrEmpty(drEQP["EquipmentState"].ToString())) { drSel = dsTemp.Tables["EMSEquipmentState"].Select(Conversions.ToString("EquipmentNo = '" + drEQP["EquipmentNo"] + "'")); if (drSel.Length > 0) { // 狀態互斥則續下筆 if (dsTemp.Tables["ViolateStatusChange"].Select(Conversions.ToString("EquipmentState = " + drSel[0]["EquipmentState"] + " And ViolativeState = " + drEQP["EquipmentState"])).Length > 0) { continue; } if (Conversions.ToBoolean(Operators.ConditionalCompareObjectNotEqual(drSel[0]["EquipmentState"], drEQP["EquipmentState"], false))) // 狀態不同才需改變設備狀態 { strEQPSerialNo = InitEQPSerialNo(); if (strEQPSerialNo == "fail") { funPMWOAutoCreate_FixedTimesRet = "fail;[Get InitEQPSerialNo fail]"; return funPMWOAutoCreate_FixedTimesRet; } // Del Same EQPSerialNo strSQL = Conversions.ToString("Delete tblEMSEquipmentStateLog Where EQPSerialNo = '" + drSel[0]["EQPSerialNo"] + "'"); colSQL.Add(strSQL); colSQL_Rows.Add(-1); // Add EMSEquipmentStateLog strSQL = Conversions.ToString(" Insert into tblEMSEquipmentStateLog (EQPSerialNo,EquipmentNo,EquipmentState,EquipmentType,UserNo,StartTime,EndTime,Description) " + " Select EQPSerialNo,EquipmentNo,EquipmentState,EquipmentType,UserNo,StartTime,To_Date('" + Strings.Format(Conversions.ToDate(datEventTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),Description " + " From tblEMSEquipmentState " + " Where EquipmentNo = '" + drEQP["EquipmentNo"] + "'"); colSQL.Add(strSQL); colSQL_Rows.Add(1); // 更新EMSEquipmentState, 以EquipmentState做RowCount查核 strSQL = Conversions.ToString("Update tblEMSEquipmentState Set " + "EquipmentState = " + drEQP["EquipmentState"] + "," + "StartTime = To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') ," + "EQPSerialNo = '" + strEQPSerialNo + "'," + "Description ='AutoRun'," + "UserNo = 'AutoRun'" + "Where EquipmentNo = '" + drEQP["EquipmentNo"] + "' And EquipmentState = " + drSel[0]["EquipmentState"]); colSQL.Add(strSQL); colSQL_Rows.Add(1); // 若開啟子設備管理,則須更新設備下子設備的設備狀態 if (ChamberManage == "1") { strSQL = "Select EquipmentNo from tblEQPEquipmentBasis Where BELONGEQUIPMENTNO = '" + drEQP["EquipmentNo"].ToString() + "'"; //cmmTemp = new IDbCommand(strSQL, cnnTemp); //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp); //dsChamber = new DataSet(); //daTemp.Fill(dsChamber, "ChamberData"); //daTemp.Dispose(); ExecuteSQLQuery_Adapter(strSQL, dsChamber, "ChamberData", cnnTemp); foreach (DataRow dr in dsChamber.Tables["ChamberData"].Rows) { strSQL = "Select * From tblEMSEquipmentState Where EquipmentNo = '" + dr["EquipmentNo"].ToString() + "'"; //cmmTemp = new IDbCommand(strSQL, cnnTemp); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (drTemp.Read()) { // 設備狀態不同才變更 if (Conversions.ToBoolean(Operators.ConditionalCompareObjectNotEqual(drEQP["EquipmentState"], drTemp["EquipmentState"], false))) { strEQPSerialNo = InitEQPSerialNo(); if (strEQPSerialNo == "fail") { funPMWOAutoCreate_FixedTimesRet = "fail;[Get InitEQPSerialNo fail]"; return funPMWOAutoCreate_FixedTimesRet; } // Del Same EQPSerialNo strSQL = Conversions.ToString("Delete tblEMSEquipmentStateLog Where EQPSerialNo = '" + drTemp["EQPSerialNo"] + "'"); colSQL.Add(strSQL); colSQL_Rows.Add(-1); // Add EMSEquipmentStateLog strSQL = Conversions.ToString(" Insert into tblEMSEquipmentStateLog (EQPSerialNo,EquipmentNo,EquipmentState,EquipmentType,UserNo,StartTime,EndTime,Description) " + " Select EQPSerialNo,EquipmentNo,EquipmentState,EquipmentType,UserNo,StartTime,To_Date('" + Strings.Format(Conversions.ToDate(datEventTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),Description " + " From tblEMSEquipmentState " + " Where EquipmentNo = '" + drTemp["EquipmentNo"] + "'"); colSQL.Add(strSQL); colSQL_Rows.Add(1); // 更新EMSEquipmentState strSQL = Conversions.ToString("Update tblEMSEquipmentState Set " + "EquipmentState = " + drEQP["EquipmentState"] + "," + "StartTime = To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') ," + "EQPSerialNo = '" + strEQPSerialNo + "'," + "Description ='AutoRun'," + "UserNo = 'AutoRun'" + "Where EquipmentNo = '" + drTemp["EquipmentNo"] + "'"); colSQL.Add(strSQL); colSQL_Rows.Add(1); } } drTemp.Dispose(); } } } } } // 2.保養工單開立處理 if (blnAutoCreateWO == true) { if (strWONo == "未開工單") { strWONo = InitPMWONo(); intWOItemNo = 0; strSQL = "Insert into tblPMWoBasis(WONo,WOType,IssueState,CreateDate,Creator,Description) " + " Values ('" + strWONo + "'," + intWOType + ",2,To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'),'Auto Run','Auto Run Create')"; colSQL.Add(strSQL); colSQL_Rows.Add(1); } intWOItemNo += 1; // 保養工單開立後直接下線, WOStatus = 2 // 2020/4/29, Ning, 保養工單開立後不直接下線, 狀態為1:待料 strSQL = "Insert into tblPMWODetail(WONo,WOItemNo,PMSerialNo,EquipmentNo,PMSOPNO,PMESTDATETIME,WOStatus) Values('" + strWONo + "'," + intWOItemNo + "," + intWOItemNo + ",'" + drEQP["EquipmentNo"] + "','" + drEQP["PMSOPNO"] + "'," + " To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd") + "','YYYY/MM/DD'),1)"; colSQL.Add(strSQL); colSQL_Rows.Add(1); } // 3.Mail發送處理 if (blnAutoEmail == true) { drAdd = dtSendMail.NewRow(); drAdd["WONo"] = strWONo; drAdd["EquipmentNo"] = drEQP["EquipmentNo"] + ""; drAdd["EquipmentName"] = drEQP["EquipmentName"] + ""; drAdd["PMSOPName"] = drEQP["PMSOPName"] + ""; drAdd["EngineerGroupNo"] = drEQP["EngineerGroupNo"] + ""; dtSendMail.Rows.Add(drAdd); } // 4. 更新設備的PMEqupmentState strSQL = Conversions.ToString("Update tblPMEquipmentState Set SincePMQty = 0, SincePMTimes = 0, LastPMDate = To_Date('" + Strings.Format(datEventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')" + " Where EquipmentNo = '" + drEQP["EquipmentNo"] + "'"); colSQL.Add(strSQL); colSQL_Rows.Add(1); } ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colSQL, colSQL_Rows); } dtSendMail = dtSendMail.DefaultView.ToTable(true, new[] { "WONo", "EquipmentNo", "PMSOPName", "EngineerGroupNo" }); foreach (DataRow rowGroupNo in dtSendMail.DefaultView.ToTable(true, "EngineerGroupNo").Rows) { strSendMailMSG = "

Fixed Times Work Order

"; foreach (DataRow row in dtSendMail.Select(Conversions.ToString("EngineerGroupNo = '" + rowGroupNo["EngineerGroupNo"] + "'"))) { strSendMailMSG = Conversions.ToString(strSendMailMSG + "

WONo: " + row["WONo"] + "

"); strSendMailMSG = Conversions.ToString(strSendMailMSG + "

EquipemntNo: " + row["EquipmentNo"] + "

"); strSendMailMSG = Conversions.ToString(strSendMailMSG + "

PMSOPName: " + row["PMSOPName"] + "

"); } if (!string.IsNullOrEmpty(strSendMailMSG)) { strSendMailMSG += ""; string argFileName = "N/A"; string argEmailSubject = "Fixed Times Work Order"; modAutoRunLibrary.SendMultiEmail(ref argFileName, ref argEmailSubject, strSendMailMSG, Conversions.ToString(rowGroupNo["EngineerGroupNo"]), GroupType: (modAutoRunLibrary.GroupType)2); } } if (!string.IsNullOrEmpty(strFailMsg)) { funPMWOAutoCreate_FixedTimesRet = "fail;" + strFailMsg; } else { funPMWOAutoCreate_FixedTimesRet = "success"; } } catch (Exception ex) { funPMWOAutoCreate_FixedTimesRet = CombineFailMsg("0000-999999", ex.Message); } finally { // //釋放資源 if (dsTemp != null) { dsTemp.Dispose(); dsTemp = null; } //if (daTemp != null) //{ // daTemp.Dispose(); // daTemp = null; //} colSQL = null; colSQL_Rows = null; // //Close Connection CloseConnection(cnnTemp); } return funPMWOAutoCreate_FixedTimesRet; } private DataTable BuildMailTable() { DataTable BuildMailTableRet = default(DataTable); var dtMail = new DataTable("SendMail"); dtMail.Columns.Add("WONo", typeof(string)); dtMail.Columns.Add("EquipmentNo", typeof(string)); dtMail.Columns.Add("EquipmentName", typeof(string)); dtMail.Columns.Add("EngineerGroupNo", typeof(string)); dtMail.Columns.Add("PMSOPName", typeof(string)); // SOPBasis dtMail.Columns.Add("FrequencyName", typeof(string)); BuildMailTableRet = dtMail; return BuildMailTableRet; } private string InitPMWONo() { string InitPMWONoRet = default(string); // 傳入值: 無 // 傳回值: InitPMEQPSOPNo(成功),fail(失敗), object SerialNo; var cnnTemp = default(IDbConnection); var intSerial = default(int); var strMaxNo = default(string); string strSQL; try { // //Create connection cnnTemp = CreateConnection(strConnectionString); strSQL = "Select Max(WONo) From (select WONo from TBLPMWOBASIS union select WONo from TBLPMWOBASIS_HIS) A Where WONo like 'EW________'"; //cmmTemp = new IDbCommand(strSQL, cnnTemp); SerialNo = ExecuteSQLQuery_Scalar(strSQL, cnnTemp); if (SerialNo == null) { intSerial = 1; } else if (SerialNo is DBNull) { intSerial = 1; } else { strMaxNo = Conversions.ToString(SerialNo); } //cmmTemp.Dispose(); if (intSerial != 1) { // 取出序號 intSerial = Conversions.ToInteger(Strings.Mid(strMaxNo, 7, 4)); if (intSerial == 9999 || Conversions.ToInteger(Strings.Mid(strMaxNo, 5, 2)) != Thread.CurrentThread.CurrentCulture.Calendar.GetMonth(DateTime.Now)) { intSerial = 1; } else { intSerial = intSerial + 1; } } InitPMWONoRet = "EW" + Strings.Mid(Thread.CurrentThread.CurrentCulture.Calendar.GetYear(DateTime.Now).ToString(), 3, 2) + Strings.Format(Thread.CurrentThread.CurrentCulture.Calendar.GetMonth(DateTime.Now), "00") + Strings.Format(intSerial, "0000"); } catch (Exception e1) { InitPMWONoRet = "fail"; throw; } // New Exception("kcPM.InitPMWONo: " & e1.Message) finally { CloseConnection(cnnTemp); } return InitPMWONoRet; } public string InitEQPSerialNo() { string InitEQPSerialNoRet = default(string); // 傳入值: 無 // 傳回值: String(成功),fail(失敗) // 2016-07-22, Joe, 調整原取EQPSerialNo的方式,改為日期+ThreadID // 2017/10/25 OwenLiu, 調整取EQPSerialNo的方式,改為日期+ThreadID+亂數 // 編碼格式: [yyMMddHHmmssfff][ThreadId][nnn] // yyMMddHHmmssfff : 取號當下的日期時間+3碼毫秒 // ThreadId : 執行序Id(2碼數字),自動補0 // nnn: 1~999 的隨機亂數(3碼數字),自動補0 string SerialNo; short intUpperBound = 1; // 亂數的最小值 short intLowerBound = 999; // 亂數的最大值 short intRandomValue = 0; var datEventTime = DateTime.Now; InitEQPSerialNoRet = defString; try { VBMath.Randomize(); intRandomValue = Convert.ToInt16(Math.Floor((intUpperBound - intLowerBound + 1) * VBMath.Rnd()) + intLowerBound); // SerialNo = Format(Now, "yyMMddHHmmssfff") & Right(System.Threading.Thread.CurrentThread.ManagedThreadId.ToString, 3).PadLeft(3, "0") & "01" SerialNo = datEventTime.ToString("yyMMddHHmmssfff"); SerialNo += Strings.Right(Thread.CurrentThread.ManagedThreadId.ToString(), 2).PadLeft(2, '0'); SerialNo += intRandomValue.ToString("000"); InitEQPSerialNoRet = SerialNo; } catch (Exception e1) { InitEQPSerialNoRet = "fail"; throw; } finally { } return InitEQPSerialNoRet; } #endregion #region ---自動下工排程作業--- private string funAutoClockOut(Collection colParameters = null) { string funAutoClockOutRet = default(string); var CollectionSQL = new Collection(); string strSQL = string.Empty; string strReturnMessage = ""; // 執行檔Catch訊息(Job Jog)。Chr(10)分隔每個錯誤訊息。 IDbConnection cn = null; int intShiftCount = 0; string[] strShiftName = new string[] { }; var strShiftSplit = default(string[]); var strShiftInput = default(string); var dbClockOutTime = default(double); string argstrConnectionString = Conversions.ToString(ConnectionString); try { cn = CreateConnection(argstrConnectionString); string strTemp = ""; // Parameter01:班別 // Parameter02:自動下工時間 if (colParameters["Parameter01"] == null || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter01"])))) { } else { strTemp = Strings.Trim(Conversions.ToString(colParameters["Parameter01"])).ToUpper(); strShiftInput = Convert.ToString(strTemp); } if (colParameters["Parameter02"] == null || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter02"])))) { } else { strTemp = Strings.Trim(Conversions.ToString(colParameters["Parameter02"])).ToUpper(); if (modAutoRunLibrary.funChkNumericIsValid(pSourceText: strTemp, AllowMinus: false, AllowZeroValue: false, AllowFloat: true, AllowContainsDot: true)) { if (Convert.ToDouble(strTemp) >= 0d) { dbClockOutTime = Convert.ToDouble(strTemp); } else { dbClockOutTime = 0.5d; } } else { throw new Exception("Parameter02(ClockOutTime) is not valid Nnumeric data!"); } } // ------------------------------------------------ if (strShiftInput != "*") { strShiftSplit = strShiftInput.Split(','); } strSQL = "Select DISTINCT A.ShiftNo From tblUSRShiftBasis A " + " Where(to_char(sysdate,'HH24:MI:SS') < to_char(fromtime,'HH24:MI:SS') Or to_char(sysdate,'HH24:MI:SS') > to_char(totime+" + dbClockOutTime.ToString() + "/24,'HH24:MI:SS') and to_char(totime,'HH24:MI:SS')> to_char(fromtime,'HH24:MI:SS') ) " + " Or (to_char(sysdate,'HH24:MI:SS') < to_char(fromtime,'HH24:MI:SS') And to_char(sysdate,'HH24:MI:SS') > to_char(totime+" + dbClockOutTime.ToString() + "/24,'HH24:MI:SS') and to_char(totime,'HH24:MI:SS')< to_char(fromtime,'HH24:MI:SS') ) "; string argDataBaseType = Conversions.ToString(DataBaseType); //cmd.CommandText = SQLCommandTuning(argDataBaseType, ref strSQL); using (var dr = ExecuteSQLQuery_Reader(SQLCommandTuning(argDataBaseType, ref strSQL), cn)) { if (strShiftInput != "*") { while (dr.Read()) { foreach (var objShiftNo in strShiftSplit) { if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(objShiftNo, dr["ShiftNo"].ToString(), false))) { Array.Resize(ref strShiftName, intShiftCount + 1); strShiftName[intShiftCount] = dr["ShiftNo"].ToString(); intShiftCount += 1; } } } } else { while (dr.Read()) { Array.Resize(ref strShiftName, intShiftCount + 1); strShiftName[intShiftCount] = dr["ShiftNo"].ToString(); intShiftCount += 1; } } } strSQL = " Select 1 As CheckFlag, A.* From tblWIPOperatorState A Where 1 = 1 "; if (strShiftName.Length - 1 >= 0) { strSQL += " And A.ShiftNo = '" + strShiftName[0] + "' "; intShiftCount += 1; } if (strShiftName.Length - 1 > 0) { var loopTo = strShiftName.Length - 1; for (intShiftCount = 1; intShiftCount <= loopTo; intShiftCount++) strSQL += " Or A.ShiftNo = '" + strShiftName[intShiftCount] + "' "; } string argDataBaseType1 = Conversions.ToString(DataBaseType); //cmd.CommandText = SQLCommandTuning(argDataBaseType1, ref strSQL); using (var dr = ExecuteSQLQuery_Reader(SQLCommandTuning(argDataBaseType1, ref strSQL), cn)) { string argSendTime = Conversions.ToString(DateTime.Now); strIdentity = CombineXMLIdentity(modWIN.gComputerName, modWIN.gUserNo, argSendTime); while (dr.Read()) { string argvalue_name = "userno"; string argname = "UserNo"; string argtype = "String"; string argvalue = CInput(dr["UserNo"].ToString()); string argdesc = ""; strParameter = CombineXMLParameter(argvalue_name, argname, argtype, argvalue, argdesc); // 2018/01/04 OwenLiu, 登出時間改用介面上的時間(員工登入時的AP Server時間) string argvalue_name1 = "logoutdate"; string argname1 = "LogoutDate"; string argtype1 = "Date"; string argvalue1 = Strings.Format(DateTime.Now, "yyyy/MM/dd HH:mm:ss"); string argdesc1 = ""; strParameter += CombineXMLParameter(argvalue_name1, argname1, argtype1, argvalue1, argdesc1); // strParameter += CombineXMLParameter("logoutdate", "LogoutDate", "Date", Format(Now, "yyyy/MM/dd HH:mm:ss"), "") string argvalue_name2 = "loginplaceno"; string argname2 = "LoginPlaceNo"; string argtype2 = "String"; string argvalue2 = CInput(dr["LoginPlaceNo"].ToString()); string argdesc2 = ""; strParameter += CombineXMLParameter(argvalue_name2, argname2, argtype2, argvalue2, argdesc2); string argvalue_name3 = "multioperatormode"; string argname3 = "MultiOperatorMode"; string argtype3 = "Integer"; var tmp = dr; string argvalue3 = Conversions.ToString(tmp["MultiOperatorMode"]); string argdesc3 = ""; strParameter += CombineXMLParameter(argvalue_name3, argname3, argtype3, argvalue3, argdesc3); InXml = CombineXMLRequest(strIdentity, strParameter); OutXml = modAutoRunLibrary.InvokeSrv("wsWIP_OperatorState.ExecuteClockOut", InXml); XmlDoc.LoadXml(OutXml); } } ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, CollectionSQL); } catch (Exception ex) { // 錯誤訊息: 截取錯誤訊息+換行符號 if (!string.IsNullOrEmpty(strReturnMessage)) { strReturnMessage += ControlChars.Cr + ex.Message; } else { strReturnMessage += ex.Message; } } finally { CloseConnection(cn); } if (string.IsNullOrEmpty(strReturnMessage)) { // //回傳Success funAutoClockOutRet = "success"; } else { // Message長度4000限制 if (strReturnMessage.Length > 3996) strReturnMessage = strReturnMessage.Substring(0, 3996) + "..."; funAutoClockOutRet = CombineFailMsg("0000-999999", strReturnMessage); } return funAutoClockOutRet; } #endregion #region GuardServer private string funGuardServerSync(Collection colParameters = null) { string funGuardServerSyncRet = default(string); string strReturnMessage = ""; // 執行檔Catch訊息(Job Jog)。Chr(10)分隔每個錯誤訊息。 string path; try { path = modAutoRunLibrary.InvokeSrv_GuardServer(); var gsInfo = GuardServerProvider.Methods.GuardServerSchedule.ExecuteImplement(path); if (gsInfo.Status != GuardServerProvider.Class.LicenseCode.OK && gsInfo.Status != GuardServerProvider.Class.LicenseCode.NotUseGuardServer) { strReturnMessage += gsInfo.Message; } } catch (Exception ex) { if (!string.IsNullOrEmpty(strReturnMessage)) { strReturnMessage += ControlChars.Cr + ex.Message; } else { strReturnMessage += ex.Message; } } if (string.IsNullOrEmpty(strReturnMessage)) { // //回傳Success funGuardServerSyncRet = "success"; } else { // Message長度4000限制 if (strReturnMessage.Length > 3996) strReturnMessage = strReturnMessage.Substring(0, 3996) + "..."; funGuardServerSyncRet = CombineFailMsg("0000-999999", strReturnMessage); } return funGuardServerSyncRet; } #endregion #region SDD201222_01 設備點檢支援可設定頻率 // 預開設備點檢單 // 1. 取出設備主檔(EP104)中已核准,且有設定點檢表的設備,依設備編號由小到大排序後,查核該設備當天是否需要預開點檢單。 // 2. 設備在執行查核是否要預開單前,需先將該設備在tblWIPEQPQCTask(生產設備檢驗任務表)中,狀態為1:已驗及2:待補檢的設備點檢單(Status in (1,2) and QCTaskClass=1)做刪除,(排除BelongDate=CurrentDate的) // 但待補檢的設備點檢單,需在設備線上點檢歷程(tblWIPEQPQCListLog),新增一筆該設備點檢單的記錄,檢驗結果填 -1(tblWIPEQPQCListLog.QCResult = -1)。 // 3. 當該設備所設定的點檢頻率是,「每班檢」或「每日檢」時,才需要做預開單 // 4. 若該設備當天的點檢單,都已預先開立完成(tblWIPEQPQCTask內已有當天該設備點檢頻率的點檢單),則當天就不需再開立,也就是每種點檢頻率,一天只需預開一張點檢單。 // 5. 點檢頻率是「每班檢」時,依該設備所屬區域對應的部門,查出該部門的所有的班別,每一個班別就預開一張設備點檢單。 // 6. 點檢頻率是「每日檢」時,依所設定每日檢的起始時間,預開一張設備點檢單。 // 7. 預先開立的設備點檢單,檢驗任務編號,請比照取得 EQPSerialNo的方式(以 GUID 的方式)取得, // 檢驗任務分類是設備點檢,狀態是未驗(Status=0),並需壓上預計執行時間,寫入tabletblWIPEQPQCTask(生產設備檢驗任務表)。 // 8. 預開點檢單的預計執行時間,就是該點檢單的點檢頻率時間+當天的日期, // 每班檢的點檢單預計執行時間,就以該點檢單是哪個班別(早班或午班或晚班)的點檢單,以那個班別的起始時間為預計執行時間, // 而每日檢的點檢單預計執行時間,則是以該點檢單是,每日的哪個起始時間的點檢單,以該頻率的起始時間為預計執行時間 // 9. 預開點檢單的歸屬日,填入開單當天的日期。 // 10.不需將所有設備的預開單處理,都包在同一個交易一起寫入資料庫內,一台設備做完,就寫入資料庫內。 // 11. 建議此 Job 基本是每天只執行一次,最好是在當天的 00:00 時開始執行,才符合預開設備點檢單的作用。 private string funPreCreateEQPQCList(Collection colParameters = null) { string funPreCreateEQPQCListRet = default(string); var cnnTemp = default(IDbConnection); DbDataReader drTemp; string strSQL; //System.Data.OleDb.OleDbDataAdapter daTemp; string strSQLAddField; string strSQLAddValue; var CollectionSQL = new Collection(); var aryDeleteList = new ArrayList(); DataTable dtEQPQCListSetup = new DataTable(), dtQCTack = new DataTable(), dtShift = new DataTable(); var datCurrentDate = DateTime.Now; DataRow[] drSel; DataRow drAdd; string strQCTaskNo = ""; string strPlanQCTime = ""; try { cnnTemp = CreateConnection(strConnectionString); // 1. 取得各設備的設備點檢卡控設定資料 strSQL = "SELECT A.*,B.QCListNo FROM tblEQPQCListSetup A " + " JOIN tblEQPEquipmentBasis B ON A.EquipmentNo = B.EquipmentNo " + " WHERE B.IssueState = 2 Order By A.EquipmentNo "; //cmmTemp = new IDbCommand(strSQL, cnnTemp); //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp); //daTemp.Fill(dtEQPQCListSetup); //daTemp.Dispose(); //cmmTemp.Dispose(); ExecuteSQLQuery_Adapter(strSQL, dtEQPQCListSetup, cnnTemp); // 2.刪除歸屬日不是今天的資料,並備份其中待補檢的資料到Log表中 foreach (DataRow rL in dtEQPQCListSetup.Rows) { // 2.1 每次執行前都清空集合 CollectionSQL.Clear(); // 2.2 取得各設備的設備點檢卡控設定資料 strSQL = Conversions.ToString("SELECT * FROM tblWIPEQPQCTask " + " Where Status In (0,1,2) And InspType In (1,2) And QCTaskClass = 1 And EquipmentNo = '" + rL["EquipmentNo"] + "' "); //cmmTemp = new IDbCommand(strSQL, cnnTemp); //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp); if (!(dtQCTack == null)) dtQCTack.Clear(); //daTemp.Fill(dtQCTack); //daTemp.Dispose(); //cmmTemp.Dispose(); ExecuteSQLQuery_Adapter(strSQL, dtQCTack, cnnTemp); foreach (DataRow rQT in dtQCTack.Rows) { // 2.3 找出歸屬日不是當日的現況資料 if ((Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(rQT["Status"], 1, false)) || Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(rQT["Status"], 2, false))) && (Strings.Format(Conversions.ToDate(rQT["BelongDate"]), "yyyy/MM/dd") ?? "") != (Strings.Format(Conversions.ToDate(datCurrentDate), "yyyy/MM/dd") ?? "")) { // 2.3.1 將現況表上已驗與待補驗,並且BelongDate(歸屬日)不是當日的資料刪除 if (!aryDeleteList.Contains(rL["EquipmentNo"])) // 避免多次執行同樣的SCRIPT { strSQL = Conversions.ToString(" Delete From tblWIPEQPQCTask Where BelongDate <> To_Date('" + Strings.Format(Conversions.ToDate(datCurrentDate), "yyyy/MM/dd") + "','yyyy/MM/dd') " + " And Status In (1,2) And InspType In (1,2) And QCTaskClass = 1 And EquipmentNo = '" + rL["EquipmentNo"] + "' "); CollectionSQL.Add(strSQL); aryDeleteList.Add(rL["EquipmentNo"]); } // 2.3.2 將待補檢的檢驗單備份到Log表內,QCResult = -1,QCTaskStatus=2 if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(rQT["Status"], 2, false))) { strSQLAddField = " Insert Into tblWIPEQPQCListLog (QCTaskNo,QCListSerial,EquipmentNo,QCListNo,QCResult,QCTaskStatus "; strSQLAddValue = Conversions.ToString(" Values ('" + rQT["QCTaskNo"] + "','" + rQT["QCTaskNo"] + "','" + rL["EquipmentNo"] + "','" + rQT["QCNo"] + "',-1,2 "); if (!string.IsNullOrEmpty(rQT["InspType"].ToString())) { strSQLAddField = strSQLAddField + ",InspType"; strSQLAddValue = Conversions.ToString(strSQLAddValue + "," + rQT["InspType"] + " "); } if (!string.IsNullOrEmpty(rQT["ShiftNo"].ToString())) { strSQLAddField = strSQLAddField + ",ShiftNo"; strSQLAddValue = Conversions.ToString(strSQLAddValue + ",'" + rQT["ShiftNo"] + "' "); } if (!string.IsNullOrEmpty(rQT["LotNo"].ToString())) { strSQLAddField = strSQLAddField + ",LotNo"; strSQLAddValue = Conversions.ToString(strSQLAddValue + ",'" + rQT["LotNo"] + "' "); } if (!string.IsNullOrEmpty(rQT["InspStartTime"].ToString())) { strSQLAddField = strSQLAddField + ",InspStartTime "; strSQLAddValue = strSQLAddValue + ", To_Date('" + Strings.Format(Conversions.ToDate(rQT["InspStartTime"]), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')"; } if (Conversions.ToBoolean(Operators.ConditionalCompareObjectNotEqual(rQT["BelongDate"], defDateTime, false))) { strSQLAddField = strSQLAddField + ",BelongDate "; strSQLAddValue = strSQLAddValue + ", To_Date('" + Strings.Format(Conversions.ToDate(rQT["BelongDate"]), "yyyy/MM/dd") + "','YYYY/MM/DD')"; } if (!string.IsNullOrEmpty(rQT["PlanQCTime"].ToString())) { strSQLAddField = strSQLAddField + ",PlanQCTime "; strSQLAddValue = strSQLAddValue + ", To_Date('" + Strings.Format(Conversions.ToDate(rQT["PlanQCTime"]), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')"; } strSQLAddField = strSQLAddField + ",Creator "; strSQLAddValue = strSQLAddValue + ",'AutoRun' "; strSQLAddField = strSQLAddField + ",CreateDate "; strSQLAddValue = strSQLAddValue + ", To_Date('" + Strings.Format(Conversions.ToDate(datCurrentDate), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')"; strSQL = strSQLAddField + ")" + strSQLAddValue + ")"; CollectionSQL.Add(strSQL); } } } // 3. 「每班檢」或「每日檢」時,才需要做預開單(並且當天尚未存在檢驗單) string InspTypeTmp = rL["InspType"].ToString(); switch (InspTypeTmp) { // 3.1 每班檢 case "1": { // 3.1.1 找出該設備的班別 // 97012: 湖北台基设备做每班检找班别时,设备群组内的设备无法进行班别查找,请调整为可以支持设备群组内的设备做每班点检时可寻找到班别 // Edison 2021/07/29調整找班別的語法,加入設備群組的班別 strSQL = " Select * From tblUSRSHIFTBASIS Where IssueState = 2 And DEPARTMENTNO = ( " + " Select DepartmentNo From tblSMDAreaBasis " + " Where IssueState = 2 And AREANO = (Select ContainAreaNo From tblSMDAreaRelation Where ObjectNo = '" + rL["EquipmentNo"] + "')) " + " UNION " + " Select * From tblUSRSHIFTBASIS Where IssueState = 2 And DEPARTMENTNO = ( " + " Select DepartmentNo From tblSMDAreaBasis " + " Where IssueState = 2 And AREANO = (Select ContainAreaNo From tblSMDAreaRelation Where ObjectNo = " + " (SELECT EQUIPMENTGROUP FROM TBLEQPGROUPDETAIL WHERE EQUIPMENTNO='" + rL["EquipmentNo"] + "' ) )) "; //cmmTemp = new IDbCommand(strSQL, cnnTemp); //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp); if (!(dtShift == null)) dtShift.Clear(); //daTemp.Fill(dtShift); //daTemp.Dispose(); //cmmTemp.Dispose(); ExecuteSQLQuery_Adapter(strSQL, dtShift, cnnTemp); foreach (DataRow rS in dtShift.Rows) { // 3.1.2 若現狀況表中該設備當天不存在此班別檢驗單,則新增一筆 drSel = dtQCTack.Select(Conversions.ToString(" InspType = " + rL["InspType"] + " And BelongDate = #" + Strings.Format(Conversions.ToDate(datCurrentDate), "yyyy/MM/dd") + "# And ShiftNo = '" + rS["ShiftNo"] + "' And Status = 0 ")); if (drSel.Length == 0) { strQCTaskNo = InitEQPSerialNoByGuid(); strSQLAddField = " Insert Into tblWIPEQPQCTask (QCTASKNO, EQUIPMENTNO, QCTASKCLASS, INSPTYPE, QCNO "; strSQLAddValue = Conversions.ToString(" Values ('" + strQCTaskNo + "','" + rL["EquipmentNo"] + "',1,1,'" + rL["QCListNo"] + "' "); strSQLAddField = strSQLAddField + ",ShiftNo"; strSQLAddValue = Conversions.ToString(strSQLAddValue + ",'" + rS["ShiftNo"] + "' "); strSQLAddField = strSQLAddField + ",BelongDate "; strSQLAddValue = strSQLAddValue + ", To_Date('" + Strings.Format(Conversions.ToDate(datCurrentDate), "yyyy/MM/dd") + "','YYYY/MM/DD')"; strSQLAddField = strSQLAddField + ",CreateDate "; strSQLAddValue = strSQLAddValue + ", To_Date('" + Strings.Format(Conversions.ToDate(datCurrentDate), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')"; strPlanQCTime = Strings.Format(Conversions.ToDate(datCurrentDate), "yyyy/MM/dd") + " " + Strings.Format(Conversions.ToDate(rS["FromTime"]), "H:mm:ss"); strSQLAddField = strSQLAddField + ",PlanQCTime "; strSQLAddValue = strSQLAddValue + ", To_Date('" + Strings.Format(Conversions.ToDate(strPlanQCTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')"; strSQL = strSQLAddField + ")" + strSQLAddValue + ")"; CollectionSQL.Add(strSQL); } } break; } // 3.2 每日檢 case "2": { // 3.2.2 若現狀況表中該設備當天不存在每日檢檢驗單,則新增一筆 drSel = dtQCTack.Select(Conversions.ToString(" InspType = " + rL["InspType"] + " And BelongDate = #" + Strings.Format(Conversions.ToDate(datCurrentDate), "yyyy/MM/dd") + "# And Status = 0")); if (drSel.Length == 0) { strQCTaskNo = InitEQPSerialNoByGuid(); strSQLAddField = " Insert Into tblWIPEQPQCTask (QCTASKNO, EQUIPMENTNO, QCTASKCLASS, INSPTYPE, QCNO "; strSQLAddValue = Conversions.ToString(" Values ('" + strQCTaskNo + "','" + rL["EquipmentNo"] + "',1,2,'" + rL["QCListNo"] + "' "); strSQLAddField = strSQLAddField + ",InspStartTime"; strSQLAddValue = Conversions.ToString(strSQLAddValue + ",'" + rL["InspStartTime"] + "' "); strSQLAddField = strSQLAddField + ",BelongDate "; strSQLAddValue = strSQLAddValue + ", To_Date('" + Strings.Format(Conversions.ToDate(datCurrentDate), "yyyy/MM/dd") + "','YYYY/MM/DD')"; strSQLAddField = strSQLAddField + ",CreateDate "; strSQLAddValue = strSQLAddValue + ", To_Date('" + Strings.Format(Conversions.ToDate(datCurrentDate), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')"; strPlanQCTime = Conversions.ToString(Strings.Format(Conversions.ToDate(datCurrentDate), "yyyy/MM/dd") + " " + rL["InspStartTime"]); strSQLAddField = strSQLAddField + ",PlanQCTime "; strSQLAddValue = strSQLAddValue + ", To_Date('" + Strings.Format(Conversions.ToDate(strPlanQCTime), "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')"; strSQL = strSQLAddField + ")" + strSQLAddValue + ")"; CollectionSQL.Add(strSQL); } break; } } if (CollectionSQL.Count > 0) { ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, CollectionSQL); } } funPreCreateEQPQCListRet = "success"; } catch (Exception ex) { funPreCreateEQPQCListRet = CombineFailMsg("0000-999999", ex.Message); colParameters.Add(funPreCreateEQPQCListRet, "EmailBody"); SendJobFailEmail(colParameters); } finally { if (!(dtEQPQCListSetup == null)) dtEQPQCListSetup.Dispose(); if (!(dtQCTack == null)) dtQCTack.Dispose(); if (!(dtShift == null)) dtShift.Dispose(); CloseConnection(cnnTemp); } return funPreCreateEQPQCListRet; } // 待補檢設備點檢單通知 // 1. 參數一,是設定補檢有效時間,單位為小時,可以設定小數;當目前時間-檢驗任務的預計執行時間< 補檢有效時間時,就視為需做通知,所以是在准許時間內的待補檢單才需通知。 // 2. 取出生產設備檢驗任務表(tblWIPEQPQCTask)中,檢驗任務狀態為待補檢的設備點檢單(Status=2 and QCTaskClass=1), // 並檢查每筆待補檢的檢驗任務,是否還在有效的補檢時間內,若是,則此筆的待補檢的檢驗任務需做 mail 通知該設備的工程管理群組人員 // 3. 有效的待補檢檢驗任務的判別方式,是以目前時間減檢驗任務的預計執行時間後,相減後的時間小於參數一所設定的有效時間(小時) // (目前時間-檢驗任務的預計執行時間(分鐘) < 補檢有效時間(分鐘) = 有效的待補檢點檢單),時間的計算都以分鐘來做計算及判定 // 4. 若有有效的時間內的補檢設備點檢單,則依該點檢單的設備編號,找出所屬的工程管理群組,並mail給該管理群組內的人員。 // 5. Mail 的發送以工程管理群組為主,把工程管理群組所要列管的設備下,所有的有效補檢的點檢單,彙整成一封mail 寄出。 private string funAlertAfterEventEQPQCList(Collection colParameters = null) { string funAlertAfterEventEQPQCListRet = default(string); var cnnTemp = default(IDbConnection); //System.Data.OleDb.OleDbDataAdapter daTemp; string strSQL; var CollectionSQL = new Collection(); DataTable dtQCTack = new DataTable(), dtMail = new DataTable(); var datCurrentDate = DateTime.Now; DataRow[] drSel, drSelM; double dblEffectiveTime = 0d; double dblMinDiff = 0d; string strMailBody = ""; System.Windows.Forms.SystemInformation WinFormInfo; modWIN.gComputerName = System.Windows.Forms.SystemInformation.ComputerName; do { try { // ParameterXX參數說明 // 01 補檢有效時間 // Parameter01為傳入參數, 作為補檢有效時間, 若無此值則不進行下面的程式 if (colParameters["Parameter01"] == null || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter01"])))) { funAlertAfterEventEQPQCListRet = CombineFailMsg("0000-200002", "After Event Effective Time not found!!!(Parameter 01)"); break; } else if (Information.IsNumeric(colParameters["Parameter01"])) { dblEffectiveTime = Conversions.ToDouble(Strings.Trim(Conversions.ToString(colParameters["Parameter01"]))); } else { funAlertAfterEventEQPQCListRet = CombineFailMsg("0000-200011", "After Event Effective Time not Numeric!!!(Parameter 01)"); break; } cnnTemp = CreateConnection(strConnectionString); // 1. 取得各設備的設備點檢卡控設定資料 strSQL = " SELECT A.*,B.EngineerGroupNo,B.EquipmentName,C.ShiftName FROM tblWIPEQPQCTask A " + " Join tblEQPEquipmentBasis B ON A.EquipmentNo = B.EquipmentNo " + " Left Join tblUSRShiftBasis C ON A.SHIFTNO = C.SHIFTNO " + " Where a.Status =2 And QCTaskClass=1 Order By InspType,PlanQCTime"; //cmmTemp = new IDbCommand(strSQL, cnnTemp); //daTemp = new System.Data.OleDb.OleDbDataAdapter(cmmTemp); //daTemp.Fill(dtQCTack); //daTemp.Dispose(); //cmmTemp.Dispose(); ExecuteSQLQuery_Adapter(strSQL, dtQCTack, cnnTemp); // 2. 查核每筆待補檢資料是否符合發送mail標準 (當目前時間-檢驗任務的預計執行時間< 補檢有效時間) // 新增是否繼送Mail的查核欄位 dtQCTack.Columns.Add("SendMail", Type.GetType("System.String")); foreach (DataRow rQT in dtQCTack.Rows) { dblMinDiff = DateAndTime.DateDiff("n", Conversions.ToDate(rQT["PlanQCTime"]), Conversions.ToDate(datCurrentDate)); if (dblMinDiff < dblEffectiveTime * 60d) { rQT["SendMail"] = "Y"; } else { rQT["SendMail"] = "N"; } } // 3.依據設備工成群組組成發送Mail內容Table dtMail.Columns.Add("EngineerGroupNo", Type.GetType("System.String")); dtMail.Columns.Add("MailBody", Type.GetType("System.String")); dtMail.Columns.Add("EquipmentNo", Type.GetType("System.String")); string FileName = defString; foreach (DataRow rM in dtQCTack.DefaultView.ToTable(true, "EngineerGroupNo").Rows) { drSel = dtQCTack.Select(Conversions.ToString("EngineerGroupNo = '" + rM["EngineerGroupNo"] + "' And SendMail ='Y' ")); if (drSel.Length > 0) { foreach (DataRow rMB in drSel) { string InspTypeTmp = rMB["InspType"].ToString(); switch (InspTypeTmp) { case "0": { strMailBody = Conversions.ToString(Constants.vbCrLf + "       - " + TranslateMsg("[%LOTINSPECTION%]", strLanguageMode, strResourceDir) + " : " + rMB["LotNo"] + " / " + TranslateMsg("[%QCLISTNO%]", strLanguageMode, strResourceDir) + " : " + rMB["QCNo"]); break; } case "1": { strMailBody = Conversions.ToString(Constants.vbCrLf + "       - " + TranslateMsg("[%SHIFTINSPECTION%]", strLanguageMode, strResourceDir) + " : " + rMB["ShiftName"] + " / " + TranslateMsg("[%QCLISTNO%]", strLanguageMode, strResourceDir) + " : " + rMB["QCNo"]); break; } case "2": { strMailBody = Conversions.ToString(Constants.vbCrLf + "       - " + TranslateMsg("[%DAILYINSPECTION%]", strLanguageMode, strResourceDir) + "   " + rMB["InspStartTime"] + " / " + TranslateMsg("[%QCLISTNO%]", strLanguageMode, strResourceDir) + " : " + rMB["QCNo"]); break; } } drSelM = dtMail.Select(Conversions.ToString(" EquipmentNo = '" + rMB["EquipmentNo"] + "' ")); if (drSelM.Length == 0) { var drAdd = dtMail.NewRow(); drAdd["EngineerGroupNo"] = rMB["EngineerGroupNo"]; drAdd["EquipmentNo"] = rMB["EquipmentNo"]; drAdd["MailBody"] = Constants.vbCrLf + "    " + rMB["EquipmentNo"] + " / " + rMB["EquipmentName"] + strMailBody; dtMail.Rows.Add(drAdd); } else { drSelM[0]["MailBody"] = drSelM[0]["MailBody"] + strMailBody; } } } // 4. 發送Mail drSelM = dtMail.Select(Conversions.ToString(" EngineerGroupNo = '" + rM["EngineerGroupNo"] + "' ")); if (drSelM.Length > 0) { strMailBody = " Dear Receiver, " + Constants.vbCrLf + Constants.vbCrLf + "    " + TranslateMsg("[%EquipmenListedBelowstillhadAlterEventPleaseCheckit%]", strLanguageMode, strResourceDir); foreach (DataRow rSM in drSelM) strMailBody = Conversions.ToString(strMailBody + Constants.vbCrLf + rSM["MailBody"]); string argEmailSubject = TranslateMsg("[%EuipmentInspectionAlterEventMailSubject%]", strLanguageMode, strResourceDir); string argEmailBody = CInput(strMailBody); modAutoRunLibrary.SendMultiEmail(ref FileName, ref argEmailSubject, argEmailBody, Conversions.ToString(rM["EngineerGroupNo"]), GroupType: (modAutoRunLibrary.GroupType)Conversions.ToInteger("2")); } } funAlertAfterEventEQPQCListRet = "success"; } catch (Exception ex) { funAlertAfterEventEQPQCListRet = CombineFailMsg("0000-999999", ex.Message); colParameters.Add(funAlertAfterEventEQPQCListRet, "EmailBody"); SendJobFailEmail(colParameters); } finally { if (!(dtQCTack == null)) dtQCTack.Dispose(); CloseConnection(cnnTemp); } } while (false); return funAlertAfterEventEQPQCListRet; } public string InitEQPSerialNoByGuid() { string InitEQPSerialNoByGuidRet = default(string); // 傳入值: 無 // 傳回值: String(成功),fail(失敗) // 2016-07-22, Joe, 調整原取EQPSerialNo的方式,改為日期+ThreadID // 2017/10/25 OwenLiu, 調整取EQPSerialNo的方式,改為日期+ThreadID+亂數 // 編碼格式: [yyMMddHHmmssfff][ThreadId][nnn] // yyMMddHHmmssfff : 取號當下的日期時間+3碼毫秒 // ThreadId : 執行序Id(2碼數字),自動補0 // nnn: 1~999 的隨機亂數(3碼數字),自動補0 // 2020/02/24 OwenLiu, Mantis:0067661, 調整EQPSerial 的編碼規則 // 每次產生新的GUID再用Base64編碼成字串,在隨機在編碼後的字串固定範圍(2~10字元位置)內加入3碼亂數(自動補0) string SerialNo; short intUpperBound = 999; // 亂數的最大值 short intLowerBound = 1; // 亂數的最小值 short intStartBound = 2; // 亂數的最小值 short intEndBound = 10; // 亂數的最大值 short intRandomValue = 0; short intRandomPosition = 0; var datEventTime = DateTime.Now; InitEQPSerialNoByGuidRet = defString; try { VBMath.Randomize(); intRandomValue = Convert.ToInt16(Math.Floor((intUpperBound - intLowerBound + 1) * VBMath.Rnd()) + intLowerBound); intRandomPosition = Convert.ToInt16(Math.Floor((intStartBound - intEndBound + 1) * VBMath.Rnd()) + intEndBound); string strEQPGuid = Convert.ToBase64String(Guid.NewGuid().ToByteArray()); SerialNo = strEQPGuid.Substring(0, intRandomPosition) + intRandomValue.ToString("000") + strEQPGuid.Substring(intRandomPosition); InitEQPSerialNoByGuidRet = SerialNo; } catch (Exception e1) { InitEQPSerialNoByGuidRet = "fail"; throw; } finally { } return InitEQPSerialNoByGuidRet; } #endregion #region OGSM 駕駛艙 private string CombineFailMsg(string ErrorCode, string Description) { string CombineFailMsgRet = default(string); CombineFailMsgRet = "fail;" + ErrorCode + ";" + Description; return CombineFailMsgRet; } /// /// 解析ErrorLog的Description之ErrorCode,回填ErrorCode與ErrorType(舊資料) /// /// /// 已執行到的時間記錄於Parameter10 /// /// /// 每次取3天份的資料,每次取還未執行的舊資料(3/8~3/10 => 3/5~3/7 => 3/2~3/4) /// 今天為2022/3/29,若Parameter10欄位沒有值, 則取得2022/3/27~2022/3/29 結束後將2022/3/26回填Parameter10 /// 今天為2022/3/29,若Parameter10欄位有值(2022/3/27), 則取得2022/3/25~2022/3/27 結束後將2022/3/24回填Parameter10 /// private string funParseErrorLogErrorCodePast(Collection colParameters = null) { string funParseErrorLogErrorCodePastRet = default(string); string strReturnMessage = ""; // 執行檔Catch訊息(Job Jog)。Chr(10)分隔每個錯誤訊息。 try { if (colParameters["JobNo"] == null || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["JobNo"])))) { funParseErrorLogErrorCodePastRet = CombineFailMsg("0000-999999", "There is no JobNo!"); return funParseErrorLogErrorCodePastRet; } DateTime startDate, endDate; // 已執行到的時間記錄於Parameter10 if (colParameters["Parameter10"] == null || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter10"])))) { endDate = DateTime.Now; startDate = endDate.AddDays(-2); } else { endDate = DateTime.Parse(Conversions.ToString(colParameters["Parameter10"])); startDate = endDate.AddDays(-2); } var dtTemp = new DataTable(); dtTemp = GetErrorLog(startDate, endDate); // 表示時段中的ErrorCode都有填上 if (dtTemp.Rows.Count <= 0) { Collection argCollectionSQL = null; UpdateParameter10(startDate.AddDays(-1), Conversions.ToString(colParameters["JobNo"]), CollectionSQL: argCollectionSQL); funParseErrorLogErrorCodePastRet = "success"; return funParseErrorLogErrorCodePastRet; } // 填上ErrorCode, ErrorType FillInErrorCodeAndErrorType(dtTemp); // update ErrorCode, ErrorType var CollectionSQL = new Collection(); UpdateErrorCodeAndErrorType(dtTemp, ref CollectionSQL); UpdateParameter10(startDate.AddDays(-1), Conversions.ToString(colParameters["JobNo"]), CollectionSQL); ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, CollectionSQL); } catch (Exception ex) { // 錯誤訊息: 截取錯誤訊息+換行符號 if (!string.IsNullOrEmpty(strReturnMessage)) { strReturnMessage += ControlChars.Cr + ex.Message; } else { strReturnMessage += ex.Message; } } if (string.IsNullOrEmpty(strReturnMessage)) { // //回傳Success funParseErrorLogErrorCodePastRet = "success"; } else { // Message長度4000限制 if (strReturnMessage.Length > 3996) strReturnMessage = strReturnMessage.Substring(0, 3996) + "..."; funParseErrorLogErrorCodePastRet = CombineFailMsg("0000-999999", strReturnMessage); } return funParseErrorLogErrorCodePastRet; } private DataTable GetErrorLog(DateTime startDate, DateTime endDate) { var sb = new StringBuilder(); sb.Append("select userid, recorddate, servicename, DESCRIPTION, errorcode, errorType from tblsyserrorlog "); sb.Append("where "); sb.AppendFormat("recorddate >= to_date('{0}','YYYY/MM/DD HH24:MI:SS') and ", Strings.Format(startDate, "yyyy/MM/dd 00:00:00")); sb.AppendFormat("recorddate <= to_date('{0}','YYYY/MM/DD HH24:MI:SS') and ", Strings.Format(endDate, "yyyy/MM/dd 23:59:59")); sb.Append("(errorcode is null or errorcode = '')"); string strSQL = sb.ToString(); var dtTemp = new DataTable(); var dsTemp = new DataSet(); var cnnTemp = default(IDbConnection); //System.Data.OleDb.OleDbDataAdapter daTemp; try { cnnTemp = CreateConnection(strConnectionString); //cmmTemp = new IDbCommand(strSQL, (IDbConnection)cnnTemp); //daTemp = new System.Data.OleDb.OleDbDataAdapter((IDbCommand)cmmTemp); //daTemp.Fill(dsTemp, "errorLog"); ExecuteSQLQuery_Adapter(strSQL, dsTemp, "errorLog", cnnTemp); dtTemp = dsTemp.Tables[0]; } catch (Exception) { throw; } finally { CloseConnection(cnnTemp); } return dtTemp; } private void FillInErrorCodeAndErrorType(DataTable dtTemp) { foreach (DataRow dr in dtTemp.Rows) { string description = dr["DESCRIPTION"].ToString(); if (!description.Contains("")) { dr["ERRORCODE"] = "0000-999999"; dr["ERRORTYPE"] = 2; continue; } // 讀取InXml字串 XmlDoc.LoadXml("" + description + ""); dr["ERRORCODE"] = XmlDoc.DocumentElement.GetElementsByTagName("code").Item(0).InnerText; dr["ERRORTYPE"] = dr["ERRORCODE"].ToString() == "0000-999999" ? 2 : 1; } } private void UpdateErrorCodeAndErrorType(DataTable dtTemp, ref Collection CollectionSQL) { CollectionSQL = new Collection(); string errorCode, errorType; string userid, serviceName; var sb = new StringBuilder(); string strSQL; foreach (DataRow dr in dtTemp.Rows) { errorCode = dr["ERRORCODE"].ToString(); errorType = dr["ERRORTYPE"].ToString(); userid = dr["USERID"].ToString(); serviceName = dr["SERVICENAME"].ToString(); sb.Clear(); sb.AppendFormat("update tblsyserrorlog set errorcode = '{0}', errortype = '{1}' ", errorCode, errorType); sb.AppendFormat("where userid = '{0}' and ", userid); sb.AppendFormat("recorddate = to_date('{0}','YYYY/MM/DD HH24:MI:SS') and ", Strings.Format(dr["RECORDDATE"], "yyyy/MM/dd HH:mm:ss")); sb.AppendFormat("servicename = '{0}'", serviceName); strSQL = sb.ToString(); CollectionSQL.Add(strSQL); } } private void UpdateParameter10(DateTime nextParameter10, string jobNo, Collection CollectionSQL = null) { var sb = new StringBuilder(); sb.AppendFormat("update tblMESAutoRunJob set parameter10 = '{0}' where jobno = '{1}'", Strings.Format(nextParameter10, "yyyy/MM/dd"), jobNo); string strSQL = sb.ToString(); if (CollectionSQL != null) { CollectionSQL.Add(strSQL); return; } CollectionSQL = new Collection(); CollectionSQL.Add(strSQL); ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, CollectionSQL); } /// /// 解析ErrorLog的Description之ErrorCode,回填ErrorCode與ErrorType(新資料) /// /// /// 已執行到的時間記錄於Parameter09 /// /// /// 每次取3天份的資料,每次取還未執行的新資料(3/8~3/10 => 3/11~3/13 => 3/14~3/16) /// 今天為2022/3/29,若Parameter09欄位沒有值, 則取得現時點往回3天份的資料(2022/3/27~2022/3/29) 結束後將2022/3/29回填Parameter09 /// 今天為2022/3/29,若Parameter09欄位有值且差距大於2天(2022/3/25), 則取得2022/3/25~2022/3/27 結束後將2022/3/28回填Parameter09 /// 今天為2022/3/29,若Parameter09欄位有值且差距小於2天(2022/3/27), 則取得2022/3/27~2022/3/29 結束後將2022/3/29回填Parameter09 /// private string funParseErrorLogErrorCodeForward(Collection colParameters = null) { string funParseErrorLogErrorCodeForwardRet = default(string); string strReturnMessage = ""; // 執行檔Catch訊息(Job Jog)。Chr(10)分隔每個錯誤訊息。 try { if (colParameters["JobNo"] == null || string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["JobNo"])))) { funParseErrorLogErrorCodeForwardRet = CombineFailMsg("0000-999999", "There is no JobNo!"); return funParseErrorLogErrorCodeForwardRet; } // 已執行到的時間記錄於Parameter10 DateTime startDate, endDate, nextParameter10; endDate = GetEndDate(Conversions.ToString(colParameters["Parameter10"])); startDate = GetStartDate(Conversions.ToString(colParameters["Parameter10"])); nextParameter10 = GetNextParameter10(Conversions.ToString(colParameters["Parameter10"])); var dtTemp = new DataTable(); dtTemp = GetErrorLog(startDate, endDate); // 表示時段中的ErrorCode都有填上 if (dtTemp.Rows.Count <= 0) { Collection argCollectionSQL = null; UpdateParameter10(nextParameter10, Conversions.ToString(colParameters["JobNo"]), CollectionSQL: argCollectionSQL); funParseErrorLogErrorCodeForwardRet = "success"; return funParseErrorLogErrorCodeForwardRet; } // 填上ErrorCode, ErrorType FillInErrorCodeAndErrorType(dtTemp); // update ErrorCode, ErrorType var CollectionSQL = new Collection(); UpdateErrorCodeAndErrorType(dtTemp, ref CollectionSQL); UpdateParameter10(nextParameter10, Conversions.ToString(colParameters["JobNo"]), CollectionSQL); ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, CollectionSQL); } catch (Exception ex) { // 錯誤訊息: 截取錯誤訊息+換行符號 if (!string.IsNullOrEmpty(strReturnMessage)) { strReturnMessage += ControlChars.Cr + ex.Message; } else { strReturnMessage += ex.Message; } } if (string.IsNullOrEmpty(strReturnMessage)) { // //回傳Success funParseErrorLogErrorCodeForwardRet = "success"; } else { // Message長度4000限制 if (strReturnMessage.Length > 3996) strReturnMessage = strReturnMessage.Substring(0, 3996) + "..."; funParseErrorLogErrorCodeForwardRet = CombineFailMsg("0000-999999", strReturnMessage); } return funParseErrorLogErrorCodeForwardRet; } private DateTime GetStartDate(string parameter10) { if (parameter10 == null || string.IsNullOrEmpty(Strings.Trim(parameter10))) { return DateTime.Now.AddDays(-2); } else { return DateTime.Parse(parameter10); } } private DateTime GetEndDate(string parameter10) { if (parameter10 == null || string.IsNullOrEmpty(Strings.Trim(parameter10))) { return DateTime.Now; } var tempDate = DateTime.Parse(parameter10); if (DateTime.Today.CompareTo(tempDate.AddDays(+2)) <= 0) { return DateTime.Today; } else { return tempDate.AddDays(+2); } } private DateTime GetNextParameter10(string parameter10) { if (parameter10 == null || string.IsNullOrEmpty(Strings.Trim(parameter10))) { return DateTime.Now; } var tempDate = DateTime.Parse(parameter10); if (DateTime.Today.CompareTo(tempDate.AddDays(+2)) <= 0) { return DateTime.Today; } else { return tempDate.AddDays(+3); } } #endregion #region MES與WF與PLM整合_產品與物料整合 /// /// WF產品與物料整合 與E10ICD及T100不同,以item_category區分只處理產品或物料部分 /// /// /// private object funMESCallERPPRDMTLBasis_WF(Collection colParameters = null) { object funMESCallERPPRDMTLBasis_WFRet = default(object); var XmlDoc = new XmlDocument(); var CollectionSQL = new Collection(); // =========================================================== // 宣告 AutoRunJob設定及執行記錄 變數 // =========================================================== string strParameter01 = ""; // 參數一,預設此功能fail通知EMAIL群組。 string strPageSize = "500"; // 參數二,分包筆數 int intRunTime = 5; // 參數三,分包執行次數,預設為5次 var strDate = default(string); // 參數四,手動重收時填上時間,如沒填則以log tableERP拋回的最後執行時間為主 string strSubject, strBody; // 寄送通知資訊 string strServiceName = "item.get_workflow"; // AutorunJob拋轉資訊 string strReturnMessage = ""; // 錯誤訊息(tblMESAutoRunLog.ReturnMessage),Chr(10)分隔錯誤項目。 var aryReturnMessage = new ArrayList(); // Catch Error Message (Exception及MES判定錯誤訊息)。 var colResponseXML = new Collection(); string strKey_Condition = ""; string strRequest_Datetime = ""; do { try { // Parameter01為參數一 // 作為Mail通知群組(GroupNo),放在最前面防止連線失敗無法寄送通知。 if (!(colParameters["Parameter01"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter01"])))) { strParameter01 = colParameters["Parameter01"].ToString().Trim(); } else { aryReturnMessage.Add(TranslateMsg("Mail GroupNo [%NOT SET%]([%PARAMETER01%])!", strLanguageMode, strResourceDir)); // ===== 2021/05/18 Elvis 92880 break; } // Parameter02為參數二 // 分包筆數必須為數值型態,Add by KevinChang strPageSize = "500"; if (Information.IsNumeric(colParameters["Parameter02"])) { if (!(colParameters["Parameter02"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter02"])))) { // 每封包筆數不可小於500筆,Add by KevinChang if (Conversions.ToInteger(colParameters["Parameter02"]) < 500) { strPageSize = "500"; } else { strPageSize = colParameters["Parameter02"].ToString().Trim(); } } } // Parameter03為參數三 // 分包執行次數,預設為5次,必須為數值型態。 if (Information.IsNumeric(colParameters["Parameter03"])) { if (!(colParameters["Parameter03"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter03"])))) { intRunTime = Conversions.ToInteger(colParameters["Parameter03"]); } } // Parameter04為參數四 // 手動重收時填上時間,如沒填則以log tableERP拋回的最後執行時間為主 if (!(colParameters["Parameter04"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter04"])))) { // 2022/10/19 Lena, 日期格式調整為 yyyy/MM/dd HH:mm:ss // strDate = GetDate(colParameters("Parameter04"), "Parameter04") if (Information.IsDate(colParameters["Parameter04"])) { strDate = Strings.Format(Conversions.ToDate(colParameters["Parameter04"]), "yyyy/MM/dd HH:mm:ss"); } else { throw new Exception(Conversions.ToString("Parameter04 value is " + colParameters["Parameter04"] + " DateTime Format is Error!(The format string like: yyyy/MM/dd HH:mm:ss)")); } } else { // strDate = GetERPTransactionDate(strServiceName) string strERPDate; strERPDate = GetERPTransactionDate(strServiceName); if ((strERPDate ?? "") != defString) { strDate = strERPDate; if (strERPDate.Length > 14) { strDate = Strings.Mid(strERPDate, 1, 4) + "/" + Strings.Mid(strERPDate, 5, 2) + "/" + Strings.Mid(strERPDate, 7, 2) + " " + Strings.Mid(strERPDate, 9, 2) + ":" + Strings.Mid(strERPDate, 11, 2) + ":" + Strings.Mid(strERPDate, 13, 2); } } } // 取得erp資訊 GetERPSetting_WF(); // If (Not GetERPSetting(dtERPSetting, "WorkFlow")) Then // aryReturnMessage.Add(TranslateMsg("[%PleaseCheck%] EAI ERP Setting Info [%CONFIGSETTING%]!")) // Exit Try // End If bool chkStatus = true; // 抓取其它status為0之資料且塞入colResponseXML GetReTransData(strServiceName, ref colResponseXML); // 判斷『當前回傳筆數』=『應回傳筆數』時才代表為最後一次請求,執行後才進行後續動作 InXml = CombineRequestXML_item_get_WF("8", strPageSize, strKey_Condition, strDate); int intloopTimes = 0; string strCode = default(string); string strSql_Code = default(string); string strDescription = default(string); do { // 迴圈執行超過intRunTime(預設5)次直接跳出迴圈 if (intloopTimes >= intRunTime) { break; } // 先確認是否有測試檔案,有的話就讀取出xml OutXml = string.Empty; OutXml = LoadXmlFileForTest(strServiceName); try { if (string.IsNullOrEmpty(OutXml)) { // ----- Call ERP Web Service ----- using (var ws = new wsERP_WorkFlow.WFMESService()) { ws.Url = gERPWSURL; OutXml = ws.XMLAdapter(InXml); } // 2017-05-03, Joe, 轉換單引號 OutXml = OutXml.Replace("'", "''"); } } catch (Exception ex) { OutXml = ex.Message; throw ex; } finally { // 需等到取得所有資料後,再處理後面之動作,故統一將請求完之ResponseXML放入容器內 colResponseXML.Add(OutXml); } XmlDoc.LoadXml(OutXml); // 執行ERP交易完畢寫入Log string argstrException = null; // 將ERP拋回的資料轉成物件 modAutoRunLibrary.addTransactionLog(InXml, OutXml, DateTime.Now.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPProductBasis_WF", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), "success", "ERP", strServiceName, strException: argstrException); chkExecutionStatus_WF(XmlDoc, ref strCode, ref strSql_Code, ref strDescription, ref strKey_Condition, ref strRequest_Datetime); if (strCode == "0") { if (string.IsNullOrEmpty(strKey_Condition)) break; InXml = CombineRequestXML_item_get_WF("8", strPageSize, strKey_Condition, strDate); } else { chkStatus = false; aryReturnMessage.Add(OutXml); // 2017-06-26, Joe, 如是中台層的錯誤要往外拋 break; } intloopTimes += 1; } while (true); // 寫入log table TreatWriteLogTable_WF(colResponseXML, strServiceName); // 寫入MES DB if (chkStatus) { foreach (string strOutXML in colResponseXML) { if (WriteProductOrMaterailBasis_WF(strOutXML, ref aryReturnMessage) < 0) { if (aryReturnMessage.Count == 0) // 避免不明原因,執行FAIL又沒收集到項目. { aryReturnMessage.Add(TranslateMsg("item_get, [%INVOKE FAIL%]!", strLanguageMode, strResourceDir)); } } } } } catch (Exception EX_AUT) { aryReturnMessage.Add("EX_AUT.Exception" + '\n' + EX_AUT.Message.ToString()); OutXml = EX_AUT.Message.ToString(); results = "fail"; // 執行ERP交易完畢寫入Log string argstrException = null; modAutoRunLibrary.addTransactionLog_ErrorCode(InXml, OutXml, DateTime.Now.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPProductBasis_WF", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), results, "ERP", strServiceName, LogClass: "AutoRun", strException: argstrException); } finally { // -------------------------------------------------- // 回傳執行結果:succces 或 fail(ReturnMessage) // -------------------------------------------------- if (aryReturnMessage.Count == 0) { funMESCallERPPRDMTLBasis_WFRet = "success"; results = "success"; } else { // 組合執行錯誤字串: Chr(10)分隔 strReturnMessage = ArrayList2String(ref aryReturnMessage); if ((strReturnMessage ?? "") == defString) { // 當錯誤字串組合失敗。補上 strReturnMessage = "ReturnMessage收集失敗!!"; } // tblMESAutoRunLog.ReturnMessage 長度4000限制. string strTemp = ""; if (strReturnMessage.Length > 4000) { // 自 strReturnMessage 中截取0-3991碼. strTemp = strReturnMessage.Substring(0, 3991) + "..."; } else { strTemp = strReturnMessage; } // 更新log table異常資訊 // Dim nodeID As XmlNode = XmlDoc.SelectSingleNode("/response/reqid") // UpdateLogTableErrorInfo(nodeID.InnerText, strTemp) UpdateLogTableErrorInfo(colResponseXML, strServiceName, strTemp); // //fail; funMESCallERPPRDMTLBasis_WFRet = CombineFailMsg("0000-999999", strTemp); } // ===manties:0095454 AutoRun addTransactionLog位置錯誤 需移至Finally 2021/07/06 // 執行ERP交易完畢寫入Log string argstrException = null; modAutoRunLibrary.addTransactionLog(InXml, OutXml, DateTime.Now.ToString("yyyyMMddHHmmssss"), "AutoRun", "funMESCallERPProductBasis_WF", Environment.MachineName, modWIN.gUserNo, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), results, "ERP", strServiceName, strException: argstrException); } } // === while (false); // -------------------------------------------------- // 當執行失敗,寄送 Email。必須有設定參數一。 // -------------------------------------------------- IDbConnection argcnnTemp = null; try { if (aryReturnMessage.Count > 0 && Conversions.ToBoolean(Operators.ConditionalCompareObjectNotEqual(colParameters["Parameter01"], "", false))) { strSubject = "[AUT]料件-基本資料抛轉失敗! "; strBody = Strings.Replace(strReturnMessage, Conversions.ToString('\n'), "
", Compare: CompareMethod.Text); // 寄送 Email argcnnTemp = CreateConnection(strConnectionString); if (ERP2MES_MailNotice(ref argcnnTemp, ref aryReturnMessage, strSubject, strParameter01, CInput(strBody)) < 0) { // '寄送不成功, ReturnMessage 再增加1項. // 'ProductIntegration += Chr(10) & aryReturnMessage.Item(aryReturnMessage.Count - 1).ToString // 寄送不成功, ReturnMessage 再增加1項. // tblMESAutoRunLog.ReturnMessage 長度4000限制. if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(funMESCallERPPRDMTLBasis().ToString().Length, 4000, false))) { string strTemp = ""; strTemp = strReturnMessage; if (Conversions.ToBoolean(Operators.ConditionalCompareObjectLess(strTemp + aryReturnMessage[aryReturnMessage.Count - 1].ToString().Length, 4000, false))) { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); } else { strTemp = Conversions.ToString(strTemp + '\n' + aryReturnMessage[aryReturnMessage.Count - 1]); // 自 strTemp 中截取0-3991碼. strTemp = strTemp.Substring(0, 3991) + "..."; } // //fail; funMESCallERPPRDMTLBasis_WFRet = CombineFailMsg("0000-999999", strTemp); } } } } catch (Exception) { throw; } finally { CloseConnection(argcnnTemp); } return funMESCallERPPRDMTLBasis_WFRet; } /// /// funMESCallERPPRDMTLBasis_WF接口呼叫WF端時的RequestXML /// /// /// /// /// /// /// /// /// /// /// /// public string CombineRequestXML_item_get_WF(string DoAction = "8", string PageSize = "500", string key_condition = "", string request_datetime = "", string User = null, string Password = null, string ApplicationName = null, string Source = null, string Oraganization = null, string Language = null) { string CombineRequestXML_item_get_WFRet = default(string); GetERPSetting_WF(); try { // ERPSignIn改由來自資料庫的ERP Setting表 if (User == null) User = gERPUser; if (Password == null) Password = gERPPassword; if (ApplicationName == null) ApplicationName = "MES"; if (Source == null) Source = modWIN.gComputerName; if (Oraganization == null) Oraganization = gERPOraganization; if (Language == null) Language = gERPLanguage; } catch (Exception ex) { CombineRequestXML_item_get_WFRet = "CombineRequestXML_item_get_WF fail;" + ex.Message; } CombineRequestXML_item_get_WFRet = "" + '\n'; CombineRequestXML_item_get_WFRet += "" + Oraganization + "" + '\n'; CombineRequestXML_item_get_WFRet += "" + DoAction + "" + '\n'; CombineRequestXML_item_get_WFRet += "" + User + "" + '\n'; CombineRequestXML_item_get_WFRet += "" + Password + "" + '\n'; CombineRequestXML_item_get_WFRet += "" + ApplicationName + "" + '\n'; CombineRequestXML_item_get_WFRet += "" + modWIN.gComputerName + "" + '\n'; CombineRequestXML_item_get_WFRet += "" + DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss") + "" + '\n'; CombineRequestXML_item_get_WFRet += "" + strDefLanguage + "" + '\n'; CombineRequestXML_item_get_WFRet += "" + request_datetime + "" + '\n'; CombineRequestXML_item_get_WFRet += "" + PageSize + "" + '\n'; CombineRequestXML_item_get_WFRet += "" + key_condition + "" + '\n'; CombineRequestXML_item_get_WFRet += "" + '\n'; CombineRequestXML_item_get_WFRet += ""; return CombineRequestXML_item_get_WFRet; } /// /// 解析WF(Work Flow)回傳表頭 /// /// 傳入XML /// /// /// /// public bool chkExecutionStatus_WF(XmlDocument Xmldoc, ref string code, ref string sql_code, ref string description, ref string key_condition, ref string request_datetime) { bool chkExecutionStatus_WFRet = default(bool); chkExecutionStatus_WFRet = false; var de = Xmldoc.DocumentElement["execution"]; if (de == null == true) return chkExecutionStatus_WFRet; for (int i = 0, loopTo = de.ChildNodes.Count - 1; i <= loopTo; i++) { if (de.ChildNodes[i].Name == "status") { var cn = de.ChildNodes[i]; code = de.ChildNodes[i].Attributes["code"].Value.ToString(); sql_code = de.ChildNodes[i].Attributes["sql_code"].Value.ToString(); description = de.ChildNodes[i].Attributes["description"].Value.ToString(); chkExecutionStatus_WFRet = true; } } key_condition = ""; if (Xmldoc.DocumentElement.GetElementsByTagName("key_condition").Count > 0) { if (!string.IsNullOrEmpty(Xmldoc.GetElementsByTagName("key_condition").Item(0).InnerText)) { key_condition = Xmldoc.GetElementsByTagName("key_condition").Item(0).InnerText; } } request_datetime = ""; if (Xmldoc.DocumentElement.GetElementsByTagName("request_datetime").Count > 0) { if (!string.IsNullOrEmpty(Xmldoc.GetElementsByTagName("request_datetime").Item(0).InnerText)) { request_datetime = Xmldoc.GetElementsByTagName("request_datetime").Item(0).InnerText; } } return chkExecutionStatus_WFRet; } /// /// 解析item_get_detail Value Tag Detail回傳Dictionary(Of String, String) /// /// /// public DataTable GetXML_DetailValue2Dictionary_WF(XmlDocument Xmldoc) { DataTable GetXML_DetailValue2Dictionary_WFRet = default(DataTable); var dtResult = new DataTable("item_get_detail"); XmlNodeList xmlList; try { // 先加入欄位資訊 if (Xmldoc.DocumentElement.GetElementsByTagName("item_get_detail").Count > 0) { // 2022/10/19 Lena, 修正 ERF 回拋是沒有明細資料時的錯誤. if (Xmldoc.GetElementsByTagName("item_get_detail").Item(0).SelectNodes("value").Count > 0) { xmlList = Xmldoc.GetElementsByTagName("item_get_detail").Item(0).SelectNodes("value"); for (int i = 0; i <= 0; i++) { for (int j = 0, loopTo = xmlList[i].ChildNodes.Count - 1; j <= loopTo; j++) { if (xmlList[i].ChildNodes[j] != null) { if (!dtResult.Columns.Contains(xmlList[i].ChildNodes[j].Name)) { dtResult.Columns.Add(xmlList[i].ChildNodes[j].Name, Type.GetType("System.String")); } } } } // 每個List新增一筆資料 for (int i = 0, loopTo1 = xmlList.Count - 1; i <= loopTo1; i++) { var drAdd = dtResult.NewRow(); for (int j = 0, loopTo2 = xmlList[i].ChildNodes.Count - 1; j <= loopTo2; j++) { if (xmlList[i].ChildNodes[j] != null) { drAdd[xmlList[i].ChildNodes[j].Name] = xmlList[i].ChildNodes[j].InnerText; } else { drAdd[xmlList[i].ChildNodes[j].Name] = ""; } } dtResult.Rows.Add(drAdd); } } } } catch (Exception ex) { throw; } finally { GetXML_DetailValue2Dictionary_WFRet = dtResult; } return GetXML_DetailValue2Dictionary_WFRet; } /// /// 確認分包資料回傳時,是否仍有後續資料,沒有則回傳fale中斷處理 /// /// /// public bool CheckOutXMLData(string OutXML) { bool CheckOutXMLDataRet = default(bool); CheckOutXMLDataRet = false; var XmlDoc = new XmlDocument(); XmlDoc.LoadXml(OutXML); if (XmlDoc.GetElementsByTagName("returnvalue").Item(0).SelectNodes("item_get_detail").Count > 0) { CheckOutXMLDataRet = true; } return CheckOutXMLDataRet; } /// /// 根據XML List內容新增或刪除產品與物料主檔(不同與T100與E10ICD item_category="A" 只處理產品主檔 ,item_category="M"只處理物料主檔) /// /// /// /// private int WriteProductOrMaterailBasis_WF(string OutXML, ref ArrayList aryReturnMessage) { int WriteProductOrMaterailBasis_WFRet = default(int); WriteProductOrMaterailBasis_WFRet = -1; // Return -1:fail,0:Success // =========================================================== // 宣告 DB相關 變數 // =========================================================== var drTemp = default(DbDataReader); IDbConnection cnnMES = null; Collection colSQL_2MES = new Collection(), colSQL_2MES_Rows = new Collection(); // MES正式異動資料(主要). string strSQL; string strSQLCol; string strSQLVal; // 每筆中介交易記錄 string strIfWhereCond_PK; string strMES_Result; string strMES_MESSAGE; // 錯誤訊息(中介表.MES_MESSAGE),Chr(10)分隔錯誤項目。 var aryMES_Message = new ArrayList(); // 收集單筆中介交易記錄的錯誤記錄, Exception及MES判定錯誤訊息。 try { cnnMES = CreateConnection(strConnectionString); // 宣告拋轉資料使用變數 string strERP_ProductNo, strERP_MaterialNo, strERP_ProductVersion, strERP_status, strERP_UnitNo, strERP_ItemName, strErpNo, strERP_SpecNo, strERP_LotManage = default(string); DataRow drChk; // 預設值 string strProductType = "PRODUCT"; // 給予預設值"PRODUCT",若不存在則自動新增產品類別. int intIssueState = 0; int intCurVersion = 0; string strMaterialType = "MATERIL"; // 給予預設值"MATERIL",若不存在則自動新增物料類別. int intPutInPlace = 3; // 投料點:預設為3(工單). int intCountWay = 1; // 計量方法:預設為1(實際用量). int intCheckLotNo = 1; // 物料批號檢查:預設為0(不檢查批號). var aryProductType = new ArrayList(); // 記錄產品類別是否新增 var aryMaterialType = new ArrayList(); // 記錄物料類別是否新增 var aryUnitNo = new ArrayList(); // 記錄單位主檔是否新增 do { try { var XmlDoc = new XmlDocument(); XmlDoc.LoadXml(OutXML); // 將OutXML解析為資料表型態,方便後續新增刪除的處理 var dtDetail = GetXML_DetailValue2Dictionary_WF(XmlDoc); bool exitTry2 = false; for (int intRow = 0, loopTo = dtDetail.Rows.Count - 1; intRow <= loopTo; intRow++) { if (string.IsNullOrWhiteSpace(Conversions.ToString(dtDetail.Rows[intRow]["item_category"]))) { aryMES_Message.Add(TranslateMsg("item_category" + " [%Is Empty%]!", strLanguageMode, strResourceDir)); break; } if (dtDetail.Rows[intRow]["item_category"].Equals("A")) // 處理產品類型 { // ----------------------------------------------------------- // 固定檢查ProductType='PRODUCT'資料,若不存在則自動新增。 // ----------------------------------------------------------- // If AddProductType(cnnMES, colSQL_2MES, colSQL_2MES_Rows, aryMES_Message, strProductType, strERPCreator, DateTime.Now, "AutoRun建立") < 0 Then Exit Try if (aryProductType.IndexOf(strProductType) == -1) { if (AddProductType(ref cnnMES, ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strProductType, strERPCreator, DateTime.Now, "AutoRun建立") < 0) { exitTry2 = true; break; } else { aryProductType.Add(strProductType); } } // ----------------------------------------------------------- // 取出各欄位資料 // ----------------------------------------------------------- strERP_ProductNo = dtDetail.Rows[intRow]["item_no"].ToString().Trim().ToUpper(); strErpNo = dtDetail.Rows[intRow]["item_no"].ToString().Trim(); // 記錄原始之ERP編號 strERP_ProductVersion = Interaction.IIf(string.IsNullOrWhiteSpace(dtDetail.Rows[intRow]["item_ver"].ToString()), "1", dtDetail.Rows[intRow]["item_ver"]).ToString().Trim(); strERP_status = dtDetail.Rows[intRow]["transstatus"].ToString().Trim().ToUpper(); // 2022/10/19 Lena,修正錯誤 if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtDetail.Rows[intRow]["production_unit_no"], "", false))) { strERP_UnitNo = "N/A"; } else // 單位有傳入才作檢查 { string strUnitNo = dtDetail.Rows[intRow]["production_unit_no"].ToString().Trim(); strERP_UnitNo = dtDetail.Rows[intRow]["production_unit_no"].ToString().Trim().ToLower(); // ----------------------------------------------------------- // 檢查UnitNo資料,若不存在則自動新增。 // ----------------------------------------------------------- if (aryUnitNo.IndexOf(strERP_UnitNo) == -1) { if (AddUnitNo(ref cnnMES, ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strUnitNo, strERPCreator, DateTime.Now, "AutoRun建立") < 0) { exitTry2 = true; break; } else { aryUnitNo.Add(strERP_UnitNo); } } } strERP_ItemName = Conversions.ToString(Interaction.IIf(string.IsNullOrWhiteSpace(Conversions.ToString(dtDetail.Rows[intRow]["item_name"])), "N/A", dtDetail.Rows[intRow]["item_name"])); strERP_SpecNo = Conversions.ToString(Interaction.IIf(string.IsNullOrWhiteSpace(Conversions.ToString(dtDetail.Rows[intRow]["specno"])), "N/A", dtDetail.Rows[intRow]["specno"])); // 檢查是否有此產品設定 strSQL = "Select ProductNo,IssueState From tblPRDProductBasis " + " Where ProductNo='" + strERP_ProductNo + "'" + " And ProductVersion='" + strERP_ProductVersion + "'"; //cmmTemp = new IDbCommand(strSQL, cnnMES); drTemp = ExecuteSQLQuery_Reader(strSQL, cnnMES); bool exitTry = false; switch (strERP_status ?? "") { case "AU": // 有資料修改沒資料新增 { if (!drTemp.Read()) { intIssueState = 0; // ----------------------------------------------------------- // 產品編號合理性檢查 // 2019/07/22 Eric 啟用檢查 // ----------------------------------------------------------- if (ProductIntegration_ChkValid_ProductNo(ref cnnMES, ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_ProductNo, strERP_ProductVersion) < 0) { exitTry2 = exitTry = true; break; // GoTo lblExitTry_2_NextRow } // ----------------------------------------------------------- // 新增MES產品設定 // ----------------------------------------------------------- strSQLCol = "Insert Into tblPRDProductBasis " + "(ProductNo,ProductVersion,ProductName,ProductType," + " UnitNo,UnitType,ItemSpec,Description," + " IssueState,CurVersion,Creator,CreateDate,ERPNo,QCCategory"; strSQLVal = ") Values('" + strERP_ProductNo + "','" + strERP_ProductVersion + "','" + strERP_ItemName + "','" + strProductType + "','" + strERP_UnitNo + "','" + strERP_UnitNo + "','" + strERP_SpecNo + "','AutoRun建立'," + intIssueState + "," + intCurVersion + ",'" + strERPCreator + "'," + "To_Date('" + Strings.Format(DateTime.Now, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'), '" + strErpNo + "', 'N/A'"; // 2022/10/19 Lane, 修正欄位名稱錯誤的問題 if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined01"]))) { strSQLCol += ",User_Defined01"; strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined01"].ToString().Trim()), "'")); } if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined02"]))) { strSQLCol += ",User_Defined02"; strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined02"].ToString().Trim()), "'")); } if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined03"]))) { strSQLCol += ",User_Defined03"; strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined03"].ToString().Trim()), "'")); } if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined04"]))) { strSQLCol += ",User_Defined04"; strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined04"].ToString().Trim()), "'")); } if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined05"]))) { strSQLCol += ",User_Defined05"; strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined05"].ToString().Trim()), "'")); } if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined06"]))) { strSQLCol += ",User_Defined06"; strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined06"].ToString().Trim()), "'")); } if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined07"]))) { strSQLCol += ",User_Defined07"; strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined07"].ToString().Trim()), "'")); } if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined08"]))) { strSQLCol += ",User_Defined08"; strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined08"].ToString().Trim()), "'")); } if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined09"]))) { strSQLCol += ",User_Defined09"; strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined09"].ToString().Trim()), "'")); } if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined10"]))) { strSQLCol += ",User_Defined10"; strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined10"].ToString().Trim()), "'")); } // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine11")) Then // strSQLCol += ",User_Defined11" // strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine11").Trim + "'" // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine12")) Then // strSQLCol += ",User_Defined12" // strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine12").Trim + "'" // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine13")) Then // strSQLCol += ",User_Defined13" // strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine13").Trim + "'" // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine14")) Then // strSQLCol += ",User_Defined14" // strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine14").Trim + "'" // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine15")) Then // strSQLCol += ",User_Defined15" // strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine15").Trim + "'" // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine16")) Then // strSQLCol += ",User_Defined16" // strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine16").Trim + "'" // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine17")) Then // strSQLCol += ",User_Defined17" // strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine17").Trim + "'" // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine18")) Then // strSQLCol += ",User_Defined18" // strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine18").Trim + "'" // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine19")) Then // strSQLCol += ",User_Defined19" // strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine19").Trim + "'" // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine20")) Then // strSQLCol += ",User_Defined20" // strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine20").Trim + "'" // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine21")) Then // strSQLCol += ",User_Defined21" // strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine21")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') " // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine22")) Then // strSQLCol += ",User_Defined22" // strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine22")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') " // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine23")) Then // strSQLCol += ",User_Defined23" // strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine23")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') " // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine24")) Then // strSQLCol += ",User_Defined24" // strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine24")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') " // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine25")) Then // strSQLCol += ",User_Defined25" // strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine25")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') " // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine26")) Then // strSQLCol += ",User_Defined26" // strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine26")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') " // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine27")) Then // strSQLCol += ",User_Defined27" // strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine27")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') " // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine28")) Then // strSQLCol += ",User_Defined28" // strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine28")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') " // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine29")) Then // strSQLCol += ",User_Defined29" // strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine29")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') " // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine30")) Then // strSQLCol += ",User_Defined30" // strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine30")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') " // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine31")) Then // strSQLCol += ",User_Defined31" // strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine31").Trim + "'" // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine32")) Then // strSQLCol += ",User_Defined32" // strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine32").Trim + "'" // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine33")) Then // strSQLCol += ",User_Defined33" // strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine33").Trim + "'" // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine34")) Then // strSQLCol += ",User_Defined34" // strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine34").Trim + "'" // End If // 2017-05-22, Joe, Add 圖號 // 2022/10/19 修正欄位名稱的錯誤 if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["graph_no"]))) { strSQLCol += ",GraphNo"; strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["graph_no"].ToString().Trim()), "'")); } strSQL = strSQLCol + strSQLVal + ")"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } else { // ----------------------------------------------------------- // 修改MES產品設定 // ----------------------------------------------------------- // 2017-06-02, Joe, 修改時如原狀態為-1變更為0,其他不異動 if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], -1, false))) { intIssueState = 0; } else { intIssueState = Conversions.ToInteger(drTemp["IssueState"]); } // 2017-06-08, Joe, 修改為異動CurVersion strSQL = "Update tblPRDProductBasis Set " + " IssueState = " + intIssueState + " , ProductName = '" + strERP_ItemName + "', UnitNo = '" + strERP_UnitNo + "', UnitType = '" + strERP_UnitNo + "' " + " ,ProductType = '" + strProductType + "', ItemSpec = '" + strERP_SpecNo + "', ERPNo = '" + strErpNo + "' "; // 2022/10/19 Lena, 修正欄位名稱錯誤的問題 if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined01"]))) { strSQL = Conversions.ToString(strSQL + ",User_Defined01='" + dtDetail.Rows[intRow]["userdefined01"].ToString().Trim() + "'"); } if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined02"]))) { strSQL = Conversions.ToString(strSQL + ",User_Defined02='" + dtDetail.Rows[intRow]["userdefined02"].ToString().Trim() + "'"); } if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined03"]))) { strSQL = Conversions.ToString(strSQL + ",User_Defined03='" + dtDetail.Rows[intRow]["userdefined03"].ToString().Trim() + "'"); } if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined04"]))) { strSQL = Conversions.ToString(strSQL + ",User_Defined04='" + dtDetail.Rows[intRow]["userdefined04"].ToString().Trim() + "'"); } if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined05"]))) { strSQL = Conversions.ToString(strSQL + ",User_Defined05='" + dtDetail.Rows[intRow]["userdefined05"].ToString().Trim() + "'"); } if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined06"]))) { strSQL = Conversions.ToString(strSQL + ",User_Defined06='" + dtDetail.Rows[intRow]["userdefined06"].ToString().Trim() + "'"); } if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined07"]))) { strSQL = Conversions.ToString(strSQL + ",User_Defined07='" + dtDetail.Rows[intRow]["userdefined07"].ToString().Trim() + "'"); } if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined08"]))) { strSQL = Conversions.ToString(strSQL + ",User_Defined08='" + dtDetail.Rows[intRow]["userdefined08"].ToString().Trim() + "'"); } if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined09"]))) { strSQL = Conversions.ToString(strSQL + ",User_Defined09='" + dtDetail.Rows[intRow]["userdefined09"].ToString().Trim() + "'"); } if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined10"]))) { strSQL = Conversions.ToString(strSQL + ",User_Defined10='" + dtDetail.Rows[intRow]["userdefined10"].ToString().Trim() + "'"); } // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine11")) Then // strSQL += ",User_Defined11='" & dtDetail.Rows(intRow)("userdefine11").Trim & "'" // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine12")) Then // strSQL += ",User_Defined12='" & dtDetail.Rows(intRow)("userdefine12").Trim & "'" // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine13")) Then // strSQL += ",User_Defined13='" & dtDetail.Rows(intRow)("userdefine13").Trim & "'" // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine14")) Then // strSQL += ",User_Defined14='" & dtDetail.Rows(intRow)("userdefine14").Trim & "'" // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine15")) Then // strSQL += ",User_Defined15='" & dtDetail.Rows(intRow)("userdefine15").Trim & "'" // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine16")) Then // strSQL += ",User_Defined16='" & dtDetail.Rows(intRow)("userdefine16").Trim & "'" // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine17")) Then // strSQL += ",User_Defined17='" & dtDetail.Rows(intRow)("userdefine17").Trim & "'" // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine18")) Then // strSQL += ",User_Defined18='" & dtDetail.Rows(intRow)("userdefine18").Trim & "'" // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine19")) Then // strSQL += ",User_Defined19='" & dtDetail.Rows(intRow)("userdefine19").Trim & "'" // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine20")) Then // strSQL += ",User_Defined20='" & dtDetail.Rows(intRow)("userdefine20").Trim & "'" // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine21")) Then // strSQL += ",User_Defined21=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine21")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') " // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine22")) Then // strSQL += ",User_Defined22=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine22")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') " // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine23")) Then // strSQL += ",User_Defined23=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine23")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') " // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine24")) Then // strSQL += ",User_Defined24=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine24")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') " // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine25")) Then // strSQL += ",User_Defined25=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine25")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') " // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine26")) Then // strSQL += ",User_Defined26=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine26")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') " // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine27")) Then // strSQL += ",User_Defined27=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine27")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') " // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine28")) Then // strSQL += ",User_Defined28=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine28")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') " // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine29")) Then // strSQL += ",User_Defined29=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine29")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') " // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine30")) Then // strSQL += ",User_Defined30=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine30")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') " // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine31")) Then // strSQL += ",User_Defined31='" + dtDetail.Rows(intRow)("userdefine31").Trim + "'" // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine32")) Then // strSQL += ",User_Defined32='" + dtDetail.Rows(intRow)("userdefine32").Trim + "'" // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine33")) Then // strSQL += ",User_Defined33='" + dtDetail.Rows(intRow)("userdefine33").Trim + "'" // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine34")) Then // strSQL += ",User_Defined34='" + dtDetail.Rows(intRow)("userdefine34").Trim + "'" // End If // 2017-05-22, Joe, Add 圖號 if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["graph_no"]))) { strSQL = Conversions.ToString(strSQL + ",GraphNo='" + dtDetail.Rows[intRow]["graph_no"].ToString().Trim() + "'"); } strSQL += " Where ProductNo='" + strERP_ProductNo + "' And ProductVersion='" + strERP_ProductVersion + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } drTemp.Close(); //cmmTemp.Dispose(); break; } case "D": // D:刪除 { if (drTemp.Read()) { if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drTemp["IssueState"], 0, false))) { // ----------------------------------------------------------- // 先刪除MES產品相關設定 // ----------------------------------------------------------- if (ProductIntegration_DelProduct(ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_ProductNo, strERP_ProductVersion) < 0) { exitTry2 = exitTry = true; break; // GoTo lblExitTry_2_NextRow } } else { // ----------------------------------------------------------- // 作廢MES產品設定 // ----------------------------------------------------------- strSQL = "Update tblPRDProductBasis Set " + " IssueState=-1" + " Where ProductNo='" + strERP_ProductNo + "'" + " And ProductVersion='" + strERP_ProductVersion + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } } // aryMES_Message.Add(TranslateMsg("[%PRODUCTNO%](item_no): " & strERP_ProductNo & ", [%PRODUCTVERSION%](item_ver): " & strERP_ProductVersion & ", [%IS NOT EXIST%], [%NOT ALLOW TO DELETE%]!!")) // 刪除有可能會在資料庫中取不到資料,因為同一個交易還沒有commit; else if (ProductIntegration_DelProduct(ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_ProductNo, strERP_ProductVersion) < 0) { exitTry2 = exitTry = true; break; } drTemp.Close(); //cmmTemp.Dispose(); break; } default: { aryMES_Message.Add(TranslateMsg("[%PRODUCTNO%](item_no): " + strERP_ProductNo + ",[%TRANSTATUS%](tran_status):" + strERP_status + " [%INVALID%], [%NOT ALLOWED TO EXECUTE%]!!", strLanguageMode, strResourceDir)); break; } } if (exitTry) { break; } } else if (dtDetail.Rows[intRow]["item_category"].Equals("M")) // 處理物料類型 { // ----------------------------------------------------------- // 固定檢查MaterialType='MATERIL'資料,若不存在則自動新增。 // ----------------------------------------------------------- // If AddMaterialType(cnnMES, colSQL_2MES, colSQL_2MES_Rows, aryMES_Message, strMaterialType, strERPCreator, DateTime.Now, "AutoRun建立") < 0 Then Exit Try if (aryMaterialType.IndexOf(strMaterialType) == -1) { if (AddMaterialType(ref cnnMES, ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strMaterialType, strERPCreator, DateTime.Now, "AutoRun建立") < 0) { exitTry2 = true; break; } else { aryMaterialType.Add(strMaterialType); } } // ----------------------------------------------------------- // 取出各欄位資料 // ----------------------------------------------------------- strERP_MaterialNo = dtDetail.Rows[intRow]["item_no"].ToString().Trim().ToUpper(); strErpNo = dtDetail.Rows[intRow]["item_no"].ToString().Trim(); // 記錄原始之ERP編號 strERP_ProductVersion = Interaction.IIf(string.IsNullOrWhiteSpace(Conversions.ToString(dtDetail.Rows[intRow]["item_ver"])), "1", dtDetail.Rows[intRow]["item_ver"]).ToString().Trim(); strERP_status = dtDetail.Rows[intRow]["transstatus"].ToString().Trim().ToUpper(); // 2022/10/19 Lena, 修正錯誤 if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(dtDetail.Rows[intRow]["production_unit_no"], "", false))) { strERP_UnitNo = "N/A"; } else // 單位有傳入才作檢查 { string strUnitNo = dtDetail.Rows[intRow]["production_unit_no"].ToString().Trim(); strERP_UnitNo = dtDetail.Rows[intRow]["production_unit_no"].ToString().Trim().ToLower(); // ----------------------------------------------------------- // 檢查UnitNo資料,若不存在則自動新增。 // ----------------------------------------------------------- if (aryUnitNo.IndexOf(strERP_UnitNo) == -1) { if (AddUnitNo(ref cnnMES, ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strUnitNo, strERPCreator, DateTime.Now, "AutoRun建立") < 0) { exitTry2 = true; break; } else { aryUnitNo.Add(strERP_UnitNo); } } } strERP_ItemName = Conversions.ToString(Interaction.IIf(string.IsNullOrWhiteSpace(Conversions.ToString(dtDetail.Rows[intRow]["item_name"])), "N/A", dtDetail.Rows[intRow]["item_name"])); strERP_SpecNo = Conversions.ToString(Interaction.IIf(string.IsNullOrWhiteSpace(Conversions.ToString(dtDetail.Rows[intRow]["specno"])), "N/A", dtDetail.Rows[intRow]["specno"])); // 2019/07/08 Eric Mantis:59382 Lot_manage 欄位 批號管理 目前 T100 會拋轉 1,2,3 ,但是 MES 目前只有0/1 拋轉時並未轉換 // 0(False):不管控物料批號,系統將視物料批號為N/A。 // 1(True):管控物料批號,所有之進料、退料、扣料動作都必須輸入物料批號。 if (!string.IsNullOrWhiteSpace(Conversions.ToString(dtDetail.Rows[intRow]["checklotno"]))) { // 91087: [605][CP+FT] E10ICD整合問題_E10ICD拋轉批號查核(lot_manage)欄位值調整,MES須同步對應"是否檢查批號(CheckLotNo)"欄位 if (dtDetail.Rows[intRow]["checklotno"].Equals("Y") | dtDetail.Rows[intRow]["checklotno"].Equals("N")) { if (dtDetail.Rows[intRow]["checklotno"].Equals("Y") == true) { strERP_LotManage = "1"; } else if (dtDetail.Rows[intRow]["checklotno"].Equals("N") == true) { strERP_LotManage = "0"; } } else { strERP_LotManage = "0"; } } else { strERP_LotManage = "0"; } // 檢查是否有此物料設定 drChk = GetMaterialBasis(strERP_MaterialNo, cnnMES, aryMES_Message); if (drChk == null) { exitTry2 = true; break; } // GoTo lblExitTry_2_NextRow 'fail bool exitTry1 = false; switch (strERP_status ?? "") { case "AU": // 有資料修改沒資料新增 { if (drChk["MaterialNo"] is DBNull) { // 2019/10/25 Eric Mantis:60113 調整成物料自動核准 intIssueState = 2; // ----------------------------------------------------------- // 物料編號合理性檢查 // 2019/07/22 Eric 啟用檢查 // ----------------------------------------------------------- if (ProductIntegration_ChkValid_MaterialNo(ref cnnMES, ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_MaterialNo) < 0) { exitTry2 = exitTry1 = true; break; // GoTo lblExitTry_2_NextRow } // ----------------------------------------------------------- // 新增MES物料設定 // MaterialName,MaterialSpec 必要欄位填"N/A". // ----------------------------------------------------------- strSQLCol = "Insert Into tblMTLMaterialBasis " + "(MaterialNo, MaterialName, MaterialSpec, MaterialType," + " PutInPlace, CountWay, CheckLotNo, UnitType, UnitNo, Description," + " IssueState, Creator, CreateDate, ERPNo, QCCategory"; strSQLVal = ") Values('" + strERP_MaterialNo + "','" + strERP_ItemName + "','" + strERP_SpecNo + "','" + strMaterialType + "'," + intPutInPlace + "," + intCountWay + "," + strERP_LotManage + ",'" + strERP_UnitNo + "','" + strERP_UnitNo + "','AutoRun建立'," + intIssueState + ",'" + strERPCreator + "'," + "To_Date('" + Strings.Format(DateTime.Now, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS'), '" + strErpNo + "', 'N/A'"; // 2022/10/19 Lena, 修正欄位名稱的錯誤 if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined01"]))) { strSQLCol += ",User_Defined01"; strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined01"].ToString().Trim()), "'")); } if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined02"]))) { strSQLCol += ",User_Defined02"; strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined02"].ToString().Trim()), "'")); } if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined03"]))) { strSQLCol += ",User_Defined03"; strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined03"].ToString().Trim()), "'")); } if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined04"]))) { strSQLCol += ",User_Defined04"; strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined04"].ToString().Trim()), "'")); } if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined05"]))) { strSQLCol += ",User_Defined05"; strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined05"].ToString().Trim()), "'")); } if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined06"]))) { strSQLCol += ",User_Defined06"; strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined06"].ToString().Trim()), "'")); } if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined07"]))) { strSQLCol += ",User_Defined07"; strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined07"].ToString().Trim()), "'")); } if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined08"]))) { strSQLCol += ",User_Defined08"; strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined08"].ToString().Trim()), "'")); } if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined09"]))) { strSQLCol += ",User_Defined09"; strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined09"].ToString().Trim()), "'")); } if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined10"]))) { strSQLCol += ",User_Defined10"; strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["userdefined10"].ToString().Trim()), "'")); } // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine11")) Then // strSQLCol += ",User_Defined11" // strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine11").Trim + "'" // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine12")) Then // strSQLCol += ",User_Defined12" // strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine12").Trim + "'" // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine13")) Then // strSQLCol += ",User_Defined13" // strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine13").Trim + "'" // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine14")) Then // strSQLCol += ",User_Defined14" // strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine14").Trim + "'" // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine15")) Then // strSQLCol += ",User_Defined15" // strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine15").Trim + "'" // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine16")) Then // strSQLCol += ",User_Defined16" // strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine16").Trim + "'" // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine17")) Then // strSQLCol += ",User_Defined17" // strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine17").Trim + "'" // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine18")) Then // strSQLCol += ",User_Defined18" // strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine18").Trim + "'" // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine19")) Then // strSQLCol += ",User_Defined19" // strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine19").Trim + "'" // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine20")) Then // strSQLCol += ",User_Defined20" // strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine20").Trim + "'" // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine21")) Then // strSQLCol += ",User_Defined21" // strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine21")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') " // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine22")) Then // strSQLCol += ",User_Defined22" // strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine22")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') " // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine23")) Then // strSQLCol += ",User_Defined23" // strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine23")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') " // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine24")) Then // strSQLCol += ",User_Defined24" // strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine24")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') " // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine25")) Then // strSQLCol += ",User_Defined25" // strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine25")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') " // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine26")) Then // strSQLCol += ",User_Defined26" // strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine26")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') " // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine27")) Then // strSQLCol += ",User_Defined27" // strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine27")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') " // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine28")) Then // strSQLCol += ",User_Defined28" // strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine28")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') " // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine29")) Then // strSQLCol += ",User_Defined29" // strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine29")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') " // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine30")) Then // strSQLCol += ",User_Defined30" // strSQLVal += ",To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine30")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') " // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine31")) Then // strSQLCol += ",User_Defined31" // strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine31").Trim + "'" // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine32")) Then // strSQLCol += ",User_Defined32" // strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine32").Trim + "'" // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine33")) Then // strSQLCol += ",User_Defined33" // strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine33").Trim + "'" // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine34")) Then // strSQLCol += ",User_Defined34" // strSQLVal += ",'" + dtDetail.Rows(intRow)("userdefine34").Trim + "'" // End If // 2017-05-22, Joe, Add 圖號 if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["graph_no"]))) { strSQLCol += ",GraphNo"; strSQLVal = Conversions.ToString(strSQLVal + Operators.AddObject(Operators.AddObject(",'", dtDetail.Rows[intRow]["graph_no"].ToString().Trim()), "'")); } strSQL = strSQLCol + strSQLVal + ")"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } else { // ----------------------------------------------------------- // 修改MES物料設定 // ----------------------------------------------------------- // 2017-06-02, Joe, 修改時如原狀態為-1變更為0,其他不異動 if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drChk["IssueState"], -1, false))) { intIssueState = 0; } else { intIssueState = Conversions.ToInteger(drChk["IssueState"]); } strSQL = "Update tblMTLMaterialBasis Set " + " IssueState = " + intIssueState + " , MaterialName = '" + strERP_ItemName + "', UnitType = '" + strERP_UnitNo + "', UnitNo = '" + strERP_UnitNo + "'" + ",CHECKLOTNO='" + strERP_LotManage + "',ERPNo='" + strErpNo + "' "; // 2022/10/19 Lena, 修正欄位名稱錯誤的問題 if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined01"]))) { strSQL = Conversions.ToString(strSQL + ",User_Defined01='" + dtDetail.Rows[intRow]["userdefined01"].ToString().Trim() + "'"); } if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined02"]))) { strSQL = Conversions.ToString(strSQL + ",User_Defined02='" + dtDetail.Rows[intRow]["userdefined02"].ToString().Trim() + "'"); } if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined03"]))) { strSQL = Conversions.ToString(strSQL + ",User_Defined03='" + dtDetail.Rows[intRow]["userdefined03"].ToString().Trim() + "'"); } if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined04"]))) { strSQL = Conversions.ToString(strSQL + ",User_Defined04='" + dtDetail.Rows[intRow]["userdefined04"].ToString().Trim() + "'"); } if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined05"]))) { strSQL = Conversions.ToString(strSQL + ",User_Defined05='" + dtDetail.Rows[intRow]["userdefined05"].ToString().Trim() + "'"); } if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined06"]))) { strSQL = Conversions.ToString(strSQL + ",User_Defined06='" + dtDetail.Rows[intRow]["userdefined06"].ToString().Trim() + "'"); } if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined07"]))) { strSQL = Conversions.ToString(strSQL + ",User_Defined07='" + dtDetail.Rows[intRow]["userdefined07"].ToString().Trim() + "'"); } if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined08"]))) { strSQL = Conversions.ToString(strSQL + ",User_Defined08='" + dtDetail.Rows[intRow]["userdefined08"].ToString().Trim() + "'"); } if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined09"]))) { strSQL = Conversions.ToString(strSQL + ",User_Defined09='" + dtDetail.Rows[intRow]["userdefined09"].ToString().Trim() + "'"); } if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["userdefined10"]))) { strSQL = Conversions.ToString(strSQL + ",User_Defined10='" + dtDetail.Rows[intRow]["userdefined10"].ToString().Trim() + "'"); } // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine11")) Then // strSQL += ",User_Defined11='" & dtDetail.Rows(intRow)("userdefine11").Trim & "'" // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine12")) Then // strSQL += ",User_Defined12='" & dtDetail.Rows(intRow)("userdefine12").Trim & "'" // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine13")) Then // strSQL += ",User_Defined13='" & dtDetail.Rows(intRow)("userdefine13").Trim & "'" // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine14")) Then // strSQL += ",User_Defined14='" & dtDetail.Rows(intRow)("userdefine14").Trim & "'" // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine15")) Then // strSQL += ",User_Defined15='" & dtDetail.Rows(intRow)("userdefine15").Trim & "'" // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine16")) Then // strSQL += ",User_Defined16='" & dtDetail.Rows(intRow)("userdefine16").Trim & "'" // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine17")) Then // strSQL += ",User_Defined17='" & dtDetail.Rows(intRow)("userdefine17").Trim & "'" // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine18")) Then // strSQL += ",User_Defined18='" & dtDetail.Rows(intRow)("userdefine18").Trim & "'" // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine19")) Then // strSQL += ",User_Defined19='" & dtDetail.Rows(intRow)("userdefine19").Trim & "'" // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine20")) Then // strSQL += ",User_Defined20='" & dtDetail.Rows(intRow)("userdefine20").Trim & "'" // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine21")) Then // strSQL += ",User_Defined21=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine21")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') " // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine22")) Then // strSQL += ",User_Defined22=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine22")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') " // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine23")) Then // strSQL += ",User_Defined23=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine23")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') " // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine24")) Then // strSQL += ",User_Defined24=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine24")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') " // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine25")) Then // strSQL += ",User_Defined25=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine25")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') " // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine26")) Then // strSQL += ",User_Defined26=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine26")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') " // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine27")) Then // strSQL += ",User_Defined27=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine27")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') " // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine28")) Then // strSQL += ",User_Defined28=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine28")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') " // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine29")) Then // strSQL += ",User_Defined29=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine29")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') " // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine30")) Then // strSQL += ",User_Defined30=To_Date('" & CDate_EAI(dtDetail.Rows(intRow)("userdefine30")).ToString("yyyy/MM/dd HH:mm:ss") & "','YYYY/MM/DD HH24:MI:SS') " // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine31")) Then // strSQL += ",User_Defined31='" + dtDetail.Rows(intRow)("userdefine31").Trim + "'" // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine32")) Then // strSQL += ",User_Defined32='" + dtDetail.Rows(intRow)("userdefine32").Trim + "'" // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine33")) Then // strSQL += ",User_Defined33='" + dtDetail.Rows(intRow)("userdefine33").Trim + "'" // End If // If Not String.IsNullOrEmpty(dtDetail.Rows(intRow)("userdefine34")) Then // strSQL += ",User_Defined34='" + dtDetail.Rows(intRow)("userdefine34").Trim + "'" // End If // 2017-05-22, Joe, Add 圖號 if (!string.IsNullOrEmpty(Conversions.ToString(dtDetail.Rows[intRow]["graph_no"]))) { strSQL = Conversions.ToString(strSQL + ",GraphNo='" + dtDetail.Rows[intRow]["graph_no"].ToString().Trim() + "'"); } strSQL += " Where MaterialNo='" + strERP_MaterialNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } break; } case "D": // D:刪除 { // 檢查是否有此物料設定 drChk = GetMaterialBasis(strERP_MaterialNo, cnnMES, aryMES_Message); if (drChk == null) { exitTry2 = exitTry1 = true; break; } // GoTo lblExitTry_2_NextRow 'fail if (!(drChk["MaterialNo"] is DBNull)) { // ----------------------------------------------------------- // 物料編號使用狀況檢查 // ----------------------------------------------------------- if (ProductIntegration_ChkforDelMaterialNo(ref cnnMES, ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_MaterialNo) < 0) { exitTry2 = exitTry1 = true; break; // GoTo lblExitTry_2_NextRow } if (Conversions.ToBoolean(Operators.ConditionalCompareObjectEqual(drChk["IssueState"], 0, false))) { // ----------------------------------------------------------- // 刪除MES物料相關設定 // ----------------------------------------------------------- if (ProductIntegration_DelMaterial(ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_MaterialNo) < 0) { exitTry2 = exitTry1 = true; break; // GoTo lblExitTry_2_NextRow } } else { // ----------------------------------------------------------- // 作廢MES物料設定 // ----------------------------------------------------------- strSQL = "Update tblMTLMaterialBasis Set " + " IssueState=-1" + " Where MaterialNo='" + strERP_MaterialNo + "'"; colSQL_2MES.Add(strSQL); colSQL_2MES_Rows.Add(1); } } // aryMES_Message.Add(TranslateMsg("[%MATERIALNO%]item_no): " & strERP_MaterialNo & ", [%IS NOT EXIST%], [%NOT ALLOW TO DELETE%]!!")) // 刪除有可能會在資料庫中取不到資料,因為同一個交易還沒有commit; else if (ProductIntegration_DelMaterial(ref colSQL_2MES, ref colSQL_2MES_Rows, ref aryMES_Message, strERP_MaterialNo) < 0) { exitTry2 = exitTry1 = true; break; // GoTo lblExitTry_2_NextRow } break; } default: { aryMES_Message.Add(TranslateMsg("[%MATERIALNO%]item_no): " + strERP_MaterialNo + ",[%TRANSTATUS%](tran_status):" + strERP_status + " [%INVALID%], [%NOT ALLOWED TO EXECUTE%]!!", strLanguageMode, strResourceDir)); break; } } if (exitTry1) { break; } } } if (exitTry2) { break; } } catch (Exception EX_drIF) { strMES_Result = "9"; aryMES_Message.Add("WriteProductOrMaterailBasis.Exception" + '\n' + EX_drIF.Message); } finally { // =============================================================================== // 判定 MES_Result 處理結果 (成功回寫1, 失敗回寫9). // =============================================================================== if (aryMES_Message.Count == 0) { strMES_Result = "1"; // -------------------------------------------------- // MES資料庫異動 // -------------------------------------------------- if (colSQL_2MES.Count > 0) { ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colSQL_2MES, colSQL_2MES_Rows); } } // 組合執行錯誤字串: Chr(10)分隔 strMES_MESSAGE = ArrayList2String(ref aryMES_Message); // MES_Message長度4000限制, 截取0-3996碼加"...". if (strMES_MESSAGE.Length > 4000) strMES_MESSAGE = strMES_MESSAGE.Substring(0, 3996) + "..."; // ---取消前面收集SQL--- colSQL_2MES.Clear(); colSQL_2MES_Rows.Clear(); // 當該筆交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 if (aryMES_Message.Count > 0) { foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); } } } while (false); // //return 0 : Success WriteProductOrMaterailBasis_WFRet = 0; } catch (Exception ex) { aryMES_Message.Add("WriteProductOrMaterailBasis,Finally:" + ex.Message); // 當該筆交易記錄處理失敗,必須錯誤訊息匯整記錄(aryMES_Message->aryReturnMessage)。 foreach (string strErr in aryMES_Message) aryReturnMessage.Add(strErr); throw; } finally { if (drTemp != null) drTemp.Close(); CloseConnection(cnnMES); } return WriteProductOrMaterailBasis_WFRet; } private void TreatWriteLogTable_WF(Collection colResponseXML, string strType) { Collection colLogSQL = new Collection(), colLogSQL_Rows = new Collection(); string lastID = default(string), KeepLog; // 最終請求完成之id ArrayList idList = new ArrayList(), arySQL = new ArrayList(), arySQLParameter = new ArrayList(); var CreateDate = new DateTime(); string strCode = default(string); string strSql_Code = default(string); string strDescription = default(string); foreach (string strOutXML in colResponseXML) { XmlDoc.LoadXml(strOutXML); string strKey_Condition = ""; string strRequest_Datetime = ""; chkExecutionStatus_WF(XmlDoc, ref strCode, ref strSql_Code, ref strDescription, ref strKey_Condition, ref strRequest_Datetime); // Dim nodeID As XmlNode = XmlDoc.SelectSingleNode("/response/reqid") // Dim strID As String = InitOPSerial() XmlNode nodeID; string strID = string.Empty; try { XmlDoc.LoadXml(strOutXML); nodeID = XmlDoc.SelectSingleNode("/response/reqid"); } catch (Exception ex) { nodeID = null; } if (nodeID == null) { strID = Guid.NewGuid().ToString(); } else { strID = nodeID.InnerText; } // KeepLog = AppSettings("keepLog") // If (KeepLog <> "") AndAlso (IsNumeric(KeepLog)) Then // '----- 清除小於保留天數的 TransactionBasis Log ----- // CreateDate = DateAdd(DateInterval.Day, -1 * KeepLog, DateTime.Now) // colLogSQL.Add("delete from TBLERPTRANSACTIONXMLLOG_BASIS where createdate < To_Date('" & Format(CreateDate, "yyyy/MM/dd H:mm:ss") & "','YYYY/MM/DD HH24:MI:SS')") // colLogSQL_Rows.Add(-1) // End If // 判斷當有LOG資料時,先刪除再新增 if (HaveLogData(strID)) { colLogSQL.Add("DELETE FROM TBLERPTRANSACTIONXMLLOG_BASIS WHERE ID = '" + strID + "'"); colLogSQL_Rows.Add(-1); } string pData_Time = string.Empty; if (!string.IsNullOrEmpty(strRequest_Datetime.ToString())) { pData_Time = strRequest_Datetime; } int pStatus = -1; if (strCode.Equals("0")) { pStatus = 1; } else { pStatus = -1; } ComposeERPTransactionXMLLog(strID, strID, strType, strOutXML, pData_Time, pStatus, strDescription, arySQL, arySQLParameter, 1); // Dim strLogSQL As String = ComposeERPTransactionXMLLog(nodeID.InnerText, nodeID.InnerText, strType, strOutXML, pData_Time, pStatus, objResponse.description) // colLogSQL.Add(strLogSQL) // colLogSQL_Rows.Add(1) lastID = strID; idList.Add(strID); } // 將所有請求之BatchID設成最終請求完成之id foreach (string strID in idList) { if ((strID ?? "") != (lastID ?? "")) { colLogSQL.Add("UPDATE TBLERPTRANSACTIONXMLLOG_BASIS SET BATCHID = '" + lastID + "' WHERE ID = '" + strID + "'"); colLogSQL_Rows.Add(1); } } // 正式寫入log table if (colLogSQL.Count > 0 || arySQL.Count > 0) { // Call ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, colLogSQL, colLogSQL_Rows) string argstrDatabaseType = Conversions.ToString(DataBaseType); Collection argCollectionSQL_Rows = null; ExecuteSQLNoneQuery_CLOB_Multi(argstrDatabaseType, strConnectionString, colLogSQL, arySQL, arySQLParameter, CollectionSQL_Rows: argCollectionSQL_Rows); } } #endregion #region ---工單用料回拋TP ICD--- private object funWIPMaterialDeductData_TPICD(Collection colParameters = null) { object funWIPMaterialDeductData_TPICDRet = default(object); var cnnTemp = default(IDbConnection); string strSQL; string strAccess = string.Empty; string strParameter = string.Empty; string strMaster = string.Empty; string strDetail = string.Empty; string strTempField = string.Empty; string strTempRecord = string.Empty; var arriveTime = DateTime.Now; string strGroupNo = string.Empty; // Mail通知群組 string strRowCount = "500"; //拋轉ERP筆數 string description = string.Empty; // Response... 錯誤訊息 string responseValue = string.Empty; // Request/Response... 收貨單單號, 成功回傳ERP收貨單號起始~截止單號 // 2021/03/30 Elvis 0087678: [瑞賢] AUTORUN報工--報工失敗,發送郵件新增提供失敗清單 //var ExcelExp = new Infragistics.Win.UltraWinGrid.ExcelExport.UltraGridExcelExporter(); //var workbook = new Infragistics.Documents.Excel.Workbook(); var aryReturnMessage = new ArrayList(); // Catch Error Message (Exception及MES判定錯誤訊息)。 var dsTemp = new DataSet(); var datNow = DateTime.Now; DataTable MTLDeductTemp = null; do { try { cnnTemp = CreateConnection(strConnectionString); // Parameter01為參數一(使用者群組), 可以不設定 if (!(colParameters["Parameter01"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter01"])))) { strGroupNo = colParameters["Parameter01"].ToString().Trim(); //若有設定, 先檢查群組合理性 if (!string.IsNullOrEmpty(strGroupNo) && ERP2MES_MailNoticeChk(ref cnnTemp, ref aryReturnMessage, strGroupNo) < 0) { funWIPMaterialDeductData_TPICDRet = Conversions.ToString("fail;" + aryReturnMessage[0]); return funWIPMaterialDeductData_TPICDRet; // 離開 Function。 } } // 拋轉ERP筆數必須為數值型態 if (Information.IsNumeric(colParameters["Parameter02"])) { if (!(colParameters["Parameter02"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter02"])))) { strRowCount = colParameters["Parameter02"].ToString().Trim(); } } // ---- InXml ----- // // 2023/08/07,Lena, 調整為取出 TipTop ICD 連線資料 strAccess = cbXMLAccess_TP(ERPName: "TIPTOPICD"); // strTempField = ""; strTempRecord = cbXMLRecord_TPICD(strTempField); strParameter = cbXMLParameter_TPICD(strTempRecord); int intItemNo = 1; // 2023/08/09,Lena, 調整為只取2和4的用料拋 ERP if (strDataBaseType != "oracle") { strSQL = "Select TOP " + Conversions.ToInteger(strRowCount) + " * From tblWIPMaterialDeductContent Where ERPFlag = 'N' and PutInPlaceType in (2,4) Order By DeductDate"; } else { strSQL = "Select A.* From (Select * From tblWIPMaterialDeductContent Where ERPFlag = 'N' and PutInPlaceType in (2,4) Order By DeductDate) A Where RowNum <= " + Conversions.ToInteger(strRowCount); } ExecuteSQLQuery_Adapter(strSQL, dsTemp, "MTLDeduct", cnnTemp); //目前的ERP Response string strResponse = ""; if (dsTemp.Tables["MTLDeduct"].Rows.Count > 0) { datNow = DateTime.Now; // strTempField = ""; strTempRecord = cbXMLRecord_TP(strTempField); strMaster = cbXMLMaster_TP("Master", strTempRecord); MTLDeductTemp = dsTemp.Tables["MTLDeduct"].Clone(); //進行中的DataTypeNo int stateType = Conversions.ToInteger(dsTemp.Tables["MTLDeduct"].Rows[0]["DataTypeNo"]); for (int i = 0; i < dsTemp.Tables["MTLDeduct"].Rows.Count; i++) { DataRow drAdd = MTLDeductTemp.NewRow(); foreach (DataColumn dc in MTLDeductTemp.Columns) { drAdd[dc.ColumnName] = dsTemp.Tables["MTLDeduct"].Rows[i][dc.ColumnName]; } MTLDeductTemp.Rows.Add(drAdd); //沒有下一筆 或 下一筆與本筆DataTypeNo不相符,進行組成XML拋ERP if (i + 1 == dsTemp.Tables["MTLDeduct"].Rows.Count || Conversions.ToInteger(dsTemp.Tables["MTLDeduct"].Rows[i + 1]["DataTypeNo"]) != stateType) { if (MTLDeductTemp != null && MTLDeductTemp.Rows.Count > 0) { string strDataType = ""; switch (Conversions.ToInteger(dsTemp.Tables["MTLDeduct"].Rows[i]["DataTypeNo"])) { case 1: //1:物料扣料 strDataType = "[%MaterialDeduct%]"; break; case 2: //2:還原物料扣料 strDataType = "[%UndoMaterialDeduct%]"; break; } // strDetail = fuMaterialDeductDataToDetailContent(MTLDeductTemp, cnnTemp); if (!strDetail.StartsWith(" 0) { strResponse = Strings.Mid(strResponse, 1, Strings.Len(strResponse) - 1); } } dsTemp.Dispose(); //Return success funWIPMaterialDeductData_TPICDRet = "success;" + strResponse + ";"; } catch (Exception ex) { funWIPMaterialDeductData_TPICDRet = CombineFailMsg("0000-999999", ex.Message); string argstrException1 = null; modAutoRunLibrary.addTransactionLog_ErrorCode(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "MES", "WIPMaterialDeductData_TPICD", Environment.MachineName, "AutoRun", arriveTime.ToString("yyyy/MM/dd HH:mm:ss"), "fail", responseValue, "createasft5icd2", LogClass: "AutoRun", strException: argstrException1); } finally { try { if (funWIPMaterialDeductData_TPICDRet.ToString().Substring(0, 7) != "success") { if (dsTemp.Tables["MTLDeduct"] == null) { //未取出dsTemp.Tables["MTLDeduct"]表示非處理資料產生的錯誤, 以Mail內文的方式寄出 string argFileName = "N/A"; string argEmailSubject = "[AUT]" + TranslateMsg("[%FAILEDMATERIALDEDUCTCONTENTTOERP%]", strLanguageMode, strResourceDir) + "。"; string argEmailBody = Conversions.ToString(funWIPMaterialDeductData_TPICDRet); modAutoRunLibrary.SendMultiEmail(ref argFileName, ref argEmailSubject, argEmailBody, strGroupNo); } else { //已有取出dsTemp.Tables["MTLDeduct"]表示是處理資料產生的錯誤, 以Excel作為副檔寄送Mail var dtResult = new DataTable("FailResult"); DataRow drAdd; dtResult.Columns.Add("WOWorkDate", Type.GetType("System.String")); // 拋轉日期 dtResult.Columns.Add("DeductDate", Type.GetType("System.String")); // 扣料日期 dtResult.Columns.Add("LotSerial", Type.GetType("System.String")); // 生產批序號 dtResult.Columns.Add("LogGroupSerial", Type.GetType("System.String")); // 生產批在作業站的Log序號 dtResult.Columns.Add("DataTypeNo", Type.GetType("System.String")); // 1: 扣料 2:倒扣料 dtResult.Columns.Add("LotNo", Type.GetType("System.String")); // 生產批編號 dtResult.Columns.Add("OPNo", Type.GetType("System.String")); // 作業站編號 dtResult.Columns.Add("EquipmentNo", Type.GetType("System.String")); // 設備編號 dtResult.Columns.Add("MaterialLevel", Type.GetType("System.String")); // 物料等級 dtResult.Columns.Add("MaterialNo", Type.GetType("System.String")); // 物枓編號 dtResult.Columns.Add("MaterialLotNo", Type.GetType("System.String")); // 物枓批號 if (MTLDeductTemp != null) { foreach (DataRow drMTLDeduct in MTLDeductTemp.Rows) { drAdd = dtResult.NewRow(); drAdd["WOWorkDate"] = arriveTime.ToString("yyyyMMdd"); drAdd["DeductDate"] = Strings.Format(drMTLDeduct["DeductDate"], "yyyy/MM/dd"); drAdd["LotSerial"] = drMTLDeduct["LotSerial"].ToString(); drAdd["LogGroupSerial"] = drMTLDeduct["LogGroupSerial"].ToString(); drAdd["DataTypeNo"] = drMTLDeduct["DataTypeNo"].ToString(); drAdd["LotNo"] = drMTLDeduct["LotNo"].ToString(); drAdd["OPNo"] = drMTLDeduct["OPNo"].ToString(); drAdd["EquipmentNo"] = drMTLDeduct["EquipmentNo"].ToString(); drAdd["MaterialLevel"] = drMTLDeduct["MaterialLevel"].ToString(); drAdd["MaterialNo"] = drMTLDeduct["MaterialNo"].ToString(); drAdd["MaterialLotNo"] = drMTLDeduct["MaterialLotNo"].ToString(); dtResult.Rows.Add(drAdd); } } string strFillType = "XLS"; //var iugTemp = new iMESUltraGrid.iMESUltraGridControl(); //iugTemp.iMESUltraGrid_InitializeLayOut += iMESUltraGrid_InitializeLayOut; //iugTemp.Identity = "iMES"; //iugTemp.UserNo = "iMES"; //var memStream = new MemoryStream(); //讓最後一列style生效,新增空列 DataRow drEnd = dtResult.NewRow(); dtResult.Rows.Add(drEnd); var dsResult = new DataSet(); dsResult.Tables.Add(dtResult); //iugTemp.iMESUltraGrid.DataSource = dtResult; // 0133391: [跨平台]AutoRunLib移除iMESUltraGrid的使用, 2023/4/21 String ExcelMode = strFillType.ToString().ToUpper(); //"XLSX" , "XLS" byte[] membyte = modAutoRunLibrary.funExcelToByte(dsResult, ExcelMode, strLanguageMode, strResourceDir); //var memStream = new MemoryStream(membyte); //memStream.Seek(0L, SeekOrigin.Begin); //// 將欄位翻譯 //if (!string.IsNullOrEmpty(modWIN.gLanguageMode)) //{ // var ColSaveControl = new Collection(); // ColSaveControl.Add(iugTemp.iMESUltraGrid); // //ChgTranslateName(ColSaveControl, modWIN.gLanguageMode); //} //switch (strFillType.ToString().ToUpper() ?? "") //{ // case "XLS": // { // // 匯出Excel再轉Stream // workbook = ExcelExp.Export(iugTemp.iMESUltraGrid); // iugTemp.iMESUltraGrid, Infragistics.Documents.Excel.WorkbookFormat.Excel97To2003 // workbook.Save(memStream); // memStream.Seek(0L, SeekOrigin.Begin); // break; // } //} // Stream轉成附件檔 //var AttachFile = new byte[(int)(memStream.Length - 1L + 1)]; //double count = 0d; //while (count < memStream.Length) //{ // AttachFile[(int)Math.Round(count)] = Convert.ToByte(memStream.ReadByte()); // count += 1d; //} try { dsResult.Dispose(); } catch (Exception ex) { } // 寄送Mail string argFileName = "ErrorList.xls"; string argEmailSubject = "[AUT]" + TranslateMsg("[%FAILEDMATERIALDEDUCTCONTENTTOERP%]", strLanguageMode, strResourceDir) + "。"; string argEmailBody = Conversions.ToString(funWIPMaterialDeductData_TPICDRet); modAutoRunLibrary.SendMultiEmail(ref argFileName, ref argEmailSubject, argEmailBody, strGroupNo, membyte); funWIPMaterialDeductData_TPICDRet = argEmailBody; } } CloseConnection(cnnTemp); dsTemp.Dispose(); } catch (Exception ex) { funWIPMaterialDeductData_TPICDRet = "fail_Finally;" + ex.Message; } } } while (false); return funWIPMaterialDeductData_TPICDRet; } private string fuMaterialDeductDataToDetailContent(DataTable MTLDeductData, IDbConnection cnnTemp) { string fuMaterialDeductDataToDetailContentRet = defString; DbDataReader drTemp = default(DbDataReader); string strSQL = ""; string strTempField = string.Empty; string strTempRecord = string.Empty; string strDetail = string.Empty; try { foreach (DataRow drMTLDeduct in MTLDeductData.Rows) { strTempField = cbXMLField_TP("status", drMTLDeduct["DataTypeNo"].ToString()); // 1:扣料 2:倒扣料 strTempField += cbXMLField_TP("sfp01", ""); // 填空值 strTempField += cbXMLField_TP("sfp02", Strings.Format(drMTLDeduct["DeductDate"], "yyyy/MM/dd")); // 扣料日期 strTempField += cbXMLField_TP("sfp16", "MES"); // 申請人, 固定填MES if (!(drMTLDeduct["MONo"] is DBNull)) { strTempField += cbXMLField_TP("sfs03", drMTLDeduct["MONo"].ToString()); // 工單編號 } else { strSQL = "Select A.MONo From tblWIPLotBasis A, tblWIPLotState B Where A.BaseLotNo = B.BaseLotNo And B.LotNo = '" + drMTLDeduct["LotNo"].ToString() + "'"; drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (drTemp.Read()) { strTempField += cbXMLField_TP("sfs03", drTemp["MONo"].ToString()); // 工單編號 } else { fuMaterialDeductDataToDetailContentRet = TranslateMsg("[%LotNo%] :" + drMTLDeduct["LotNo"].ToString() + ",[%MONONOTEXIST%]", strLanguageMode, strResourceDir); return fuMaterialDeductDataToDetailContentRet; } drTemp.Close(); } if (drMTLDeduct["MaterialLevel"].ToString() == "0") { strSQL = "Select ERPNo From tblMTLMaterialBasis Where IssueState = 2 And MaterialNo = '" + drMTLDeduct["MaterialNo"].ToString() + "'"; } else { strSQL = "Select ERPNo From tblPRDProductBasis Where IssueState = 2 And Curversion = 1 And ProductNo = '" + drMTLDeduct["MaterialNo"].ToString() + "'"; } drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (drTemp.Read()) { if (drTemp["ERPNo"].ToString() != "") { strTempField += cbXMLField_TP("sfs04", drTemp["ERPNo"].ToString()); // 物料/半成品在ERP的編號 } else { strTempField += cbXMLField_TP("sfs04", drMTLDeduct["MaterialNo"].ToString()); // 物料/半成品在ERP的編號, 若ERPNo沒有值, 則拋MaterialNo } } else { fuMaterialDeductDataToDetailContentRet = TranslateMsg("[%MaterialNo%] :" + drMTLDeduct["MaterialNo"].ToString() + " [%IS NOT EXIST%]", strLanguageMode, strResourceDir); return fuMaterialDeductDataToDetailContentRet; } drTemp.Close(); strTempField += cbXMLField_TP("sfs07", drMTLDeduct["PutinPlaceNo"].ToString()); // 扣料點編號 PutinPlaceNo if (drMTLDeduct["LocatorNo"].ToString() == "N/A") { strTempField += cbXMLField_TP("sfs08", ""); // 儲位, 若為N/A則拋空白 } else { strTempField += cbXMLField_TP("sfs08", drMTLDeduct["LocatorNo"].ToString()); // 儲位 } strTempField += cbXMLField_TP("sfs09", drMTLDeduct["MaterialLotNo"].ToString()); // 物料批號 //2023/10/20,Ning,148374: IC一体化测试 strTempField += cbXMLField_TP("sfs10", drMTLDeduct["OPNo"].ToString()); // 作業站編號 if (drMTLDeduct["MaterialLevel"].ToString() == "0") { strSQL = "Select A.UnitNo, B.DefaultValue From tblMTLMaterialBasis A Left Join tblMTLMaterialProperty B On A.MaterialNo = B.Material And B.IssueState = 2 And Upper(B.PropertyNo) = 'ERPUNITNO'" + " Where A.IssueState = 2 And A.MaterialNo = '" + drMTLDeduct["MaterialNo"].ToString() + "'"; } else { strSQL = "Select A.UnitNo, B.DefaultValue From tblPRDProductBasis A Left Join tblPRDProductProperty B On A.ProductNo = B.ProductNo And A.ProductVersion = B.ProductVersion And B.IssueState = 2 And Upper(B.PropertyNo) = 'ERPUNITNO'" + " Where A.IssueState = 2 And A.CurVersion = 1 And A.ProductNo = '" + drMTLDeduct["MaterialNo"].ToString() + "'"; } drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (drTemp.Read()) { if (drTemp["DefaultValue"].ToString() != "") { strTempField += cbXMLField_TP("sfs30", drTemp["DefaultValue"].ToString()); // 取物料屬性ERPUnitNo 的屬性值 } else { strTempField += cbXMLField_TP("sfs30", drTemp["UnitNo"].ToString()); // 物料屬性值為空, 則物料主檔的UnitNo } } else { fuMaterialDeductDataToDetailContentRet = TranslateMsg("[%MaterialNo%] :" + drMTLDeduct["MaterialNo"].ToString() + " [%IS NOT EXIST%]", strLanguageMode, strResourceDir); return fuMaterialDeductDataToDetailContentRet; } drTemp.Close(); strTempField += cbXMLField_TP("sfs05", drMTLDeduct["DeductQty"].ToString()); //扣料數量(DeductQty) strTempField += cbXMLField_TP("sfsiicd028", ""); //DateCode,填空值 strTempField += cbXMLField_TP("idb05", ""); //刻號,填空值 strTempField += cbXMLField_TP("idb06", ""); //Bin,填空值 strTempField += cbXMLField_TP("idb11", ""); //數量,填空值 strTempField += cbXMLField_TP("idb16", ""); //die數,填空值 strTempRecord += cbXMLRecord_TP(strTempField) + '\n'; } strDetail = cbXMLDetail_TP("sfs_file", strTempRecord); } catch (Exception ex) { throw; } return strDetail; } private Boolean fuMaterialDeductDataThrowTPICD(string InXml, DataTable MTLDeductData, ref string responseValue, ref string description, ref DateTime arriveTime) { Boolean fuMaterialDeductDataThrowTPICDRet = false; string OutXml = ""; var XmlDoc = new XmlDocument(); string code = string.Empty; // Response... code:錯誤碼;非0則為錯誤 (function回傳 success 或 fail) string sqlcode = string.Empty; string responseName = "rva01str"; string strSQL = ""; var CollectionSQL = new Collection(); try { arriveTime = DateTime.Now; responseValue = string.Empty; description = string.Empty; // ----- Call ERP Web Service ----- using (var ws = new wsERP_TP.TIPTOPServiceGateWay()) { ws.Url = gERPWSURL; OutXml = ws.createasft5icd2(InXml); } XmlDoc.LoadXml(OutXml); // ----- 取得ERP執行結果 code, sqlcode, description ----- chkExecutionStatus_TP(XmlDoc, ref code, ref sqlcode, ref description); //2023/08/08,Lena, ERP 回拋的格式變更同TP // ----- 取得收貨單號(起始單號~截止單號) ----- //chkResponseContent_TPICD(XmlDoc, responseName, ref responseValue); chkResponseContent_TP(XmlDoc, responseName, ref responseValue); if (string.IsNullOrEmpty(code) == true) { code = "fail"; } else if (code == "0") code = "success"; else code = "fail"; // Edison 2019/03/22 修正log紀錄位置 string argstrException1 = null; modAutoRunLibrary.addTransactionLog_ErrorCode(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "MES", "WIPMaterialDeductData_TPICD", Environment.MachineName, "AutoRun", arriveTime.ToString("yyyy/MM/dd HH:mm:ss"), code, responseValue, "createasft5icd2", LogClass: "AutoRun", strException: argstrException1); if (code == "success") { foreach (DataRow drMTLDeduct in MTLDeductData.Rows) { strSQL = "Update tblWIPMaterialDeductContent Set ERPFlag = 'Y', ERPNo = '" + responseValue + "'" + " Where LotSerial = '" + drMTLDeduct["LotSerial"].ToString() + "' And LogGroupSerial = '" + drMTLDeduct["LogGroupSerial"].ToString() + "'" + " And DataTypeNo = " + drMTLDeduct["DataTypeNo"] + " And EquipmentNo = '" + drMTLDeduct["EquipmentNo"].ToString() + "'" + " And MaterialLevel = " + drMTLDeduct["MaterialLevel"] + " And MaterialNo = '" + drMTLDeduct["MaterialNo"].ToString() + "' And MaterialLotNo = '" + drMTLDeduct["MaterialLotNo"].ToString() + "'" + " And PutInPlaceType = " + drMTLDeduct["PutInPlaceType"]; CollectionSQL.Add(strSQL); } ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, CollectionSQL); fuMaterialDeductDataThrowTPICDRet = true; } } catch (Exception ex) { fuMaterialDeductDataThrowTPICDRet = false; throw; } return fuMaterialDeductDataThrowTPICDRet; } public bool chkResponseContent_TPICD(XmlDocument Xmldoc, string responseName, ref string responseValue) { bool chkResponseContent_TPICDRet = default(bool); try { chkResponseContent_TPICDRet = false; var de = Xmldoc.DocumentElement["ResponseContent"]; if (de == null == true) return chkResponseContent_TPICDRet; for (int i = 0, loopTo = de.ChildNodes.Count - 1; i <= loopTo; i++) { if (de.ChildNodes.Item(i).Name == "Parameter") { for (int j = 0, loopTo1 = de.ChildNodes.Item(i).ChildNodes.Count - 1; j <= loopTo1; j++) { if (de.ChildNodes.Item(i).ChildNodes[j].Name == "Field") { responseName = de.ChildNodes.Item(i).ChildNodes[j].Attributes["name"].Value; responseValue = de.ChildNodes.Item(i).ChildNodes[j].Attributes["value"].Value; } } } } chkResponseContent_TPICDRet = true; } catch (Exception ex) { chkResponseContent_TPICDRet = false; } return chkResponseContent_TPICDRet; } public string cbXMLParameter_TPICD(string strRecord) { string cbXMLParameter_TPICDRet = default(string); cbXMLParameter_TPICDRet = "" + '\n'; cbXMLParameter_TPICDRet += strRecord + '\n'; return cbXMLParameter_TPICDRet; } public string cbXMLRecord_TPICD(string strField) { string cbXMLRecord_TPICDRet = default(string); cbXMLRecord_TPICDRet = "" + '\n'; cbXMLRecord_TPICDRet += strField; return cbXMLRecord_TPICDRet; } public string cbXMLRequest_TPICD(string strAccess, string strParameter, string strMaster, string strDetail) { string cbXMLRequest_TPICDRet = default(string); cbXMLRequest_TPICDRet = "" + '\n'; cbXMLRequest_TPICDRet += strAccess + '\n'; cbXMLRequest_TPICDRet += "" + '\n'; cbXMLRequest_TPICDRet += strParameter + '\n'; cbXMLRequest_TPICDRet += "" + '\n'; cbXMLRequest_TPICDRet += "" + '\n'; cbXMLRequest_TPICDRet += strMaster + '\n'; cbXMLRequest_TPICDRet += strDetail + '\n'; cbXMLRequest_TPICDRet += "" + '\n'; cbXMLRequest_TPICDRet += "" + '\n'; cbXMLRequest_TPICDRet += "" + '\n'; cbXMLRequest_TPICDRet += "" + '\n'; cbXMLRequest_TPICDRet += "" + '\n'; cbXMLRequest_TPICDRet += ""; return cbXMLRequest_TPICDRet; } #endregion #region ---工單用料回拋E10 ICD--- private object funWIPMaterialDeductData_E10ICD(Collection colParameters = null) { object funWIPMaterialDeductData_E10ICDRet = default(object); var cnnTemp = default(IDbConnection); string strSQL; string strOPGroupError = defString; string strCDOError = defString; string RequestKey = ""; string strGroupNo = string.Empty; //Mail通知群組 string strRowCount = "500"; //拋轉ERP筆數 string strMaterialOut = string.Empty; //領料單單別 string strMaterialReturn = string.Empty; //退料單單別 var arriveTime = DateTime.Now; string description = string.Empty; // Response... 錯誤訊息 string responseValue = string.Empty; // Request/Response... 退料單號, 成功回傳ERP退料單號 var aryReturnMessage = new ArrayList(); // Catch Error Message (Exception及MES判定錯誤訊息)。 var dsTemp = new DataSet(); DataTable MTLDeductTemp = null; DataRow[] OPGroupMTLDeduct = null; do { try { cnnTemp = CreateConnection(strConnectionString); //Parameter01:使用者群組,此功能fail時EMAIL通知群組。 //Parameter02:拋轉ERP筆數,一次拋給 ERP 的生產批報工用料筆數,預設500筆。 //Parameter03:ERP的領料單單別。 //Parameter04:ERP的退料單單別。 // Parameter01:使用者群組, 可以不設定 if (!(colParameters["Parameter01"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter01"])))) { strGroupNo = colParameters["Parameter01"].ToString().Trim(); //若有設定, 先檢查群組合理性 if (!string.IsNullOrEmpty(strGroupNo) && ERP2MES_MailNoticeChk(ref cnnTemp, ref aryReturnMessage, strGroupNo) < 0) { funWIPMaterialDeductData_E10ICDRet = Conversions.ToString("fail;" + aryReturnMessage[0]); return funWIPMaterialDeductData_E10ICDRet; // 離開 Function。 } } // Parameter02:拋轉ERP筆數必須為數值型態 if (Information.IsNumeric(colParameters["Parameter02"])) { if (!(colParameters["Parameter02"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter02"])))) { strRowCount = colParameters["Parameter02"].ToString().Trim(); } } // Parameter03:ERP的領料單單別,若未設定參數值,則回拋錯誤並結束此次作業 if (!(colParameters["Parameter03"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter03"])))) { strMaterialOut = colParameters["Parameter03"].ToString().Trim(); } else { funWIPMaterialDeductData_E10ICDRet = TranslateMsg("[%MATERIALOUTSHEETTYPE%][%NOT SET%]!!", strLanguageMode, strResourceDir); return funWIPMaterialDeductData_E10ICDRet; } // Parameter04:ERP的退料單單別,若未設定參數值,則回拋錯誤並結束此次作業 if (!(colParameters["Parameter04"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter04"])))) { strMaterialReturn = colParameters["Parameter04"].ToString().Trim(); } else { funWIPMaterialDeductData_E10ICDRet = TranslateMsg("[%MATERIALRETURNSHEETTYPE%][%NOT SET%]!!", strLanguageMode, strResourceDir); return funWIPMaterialDeductData_E10ICDRet; } // ---- InXml ----- // 取得ERP資訊 try { if (!GetERPSetting(ref dtERPSetting, "E10ICD", pEAIType: 1, pActiveERP: 1)) { if (!GetERPSetting(ref dtERPSetting, "E10ICD", pEAIType: 1)) { funWIPMaterialDeductData_E10ICDRet = TranslateMsg("[%ERPWSURL%][%not found%]!", strLanguageMode, strResourceDir); return funWIPMaterialDeductData_E10ICDRet; } } } catch (Exception ex) { if (!GetERPSetting(ref dtERPSetting, "E10ICD", pEAIType: 1)) { funWIPMaterialDeductData_E10ICDRet = TranslateMsg("[%ERPWSURL%][%not found%]!", strLanguageMode, strResourceDir); return funWIPMaterialDeductData_E10ICDRet; } } // 2023/08/09,Lena, 調整為只取2和4的用料拋 ERP if (strDataBaseType != "oracle") { strSQL = "Select TOP " + Conversions.ToInteger(strRowCount) + " * From tblWIPMaterialDeductContent Where ERPFlag = 'N' and PutInPlaceType in (2,4) Order By DeductDate"; } else { strSQL = "Select A.* From (Select * From tblWIPMaterialDeductContent Where ERPFlag = 'N' and PutInPlaceType in (2,4) Order By DeductDate) A Where RowNum <= " + Conversions.ToInteger(strRowCount); } ExecuteSQLQuery_Adapter(strSQL, dsTemp, "MTLDeduct", cnnTemp); //目前的ERP Response string strResponse = ""; if (dsTemp.Tables["MTLDeduct"].Rows.Count > 0) { arriveTime = DateTime.Now; MTLDeductTemp = dsTemp.Tables["MTLDeduct"].Clone(); //進行中的DataTypeNo int stateType = Conversions.ToInteger(dsTemp.Tables["MTLDeduct"].Rows[0]["DataTypeNo"]); for (int i = 0; i < dsTemp.Tables["MTLDeduct"].Rows.Count; i++) { DataRow drAdd = MTLDeductTemp.NewRow(); foreach (DataColumn dc in MTLDeductTemp.Columns) { drAdd[dc.ColumnName] = dsTemp.Tables["MTLDeduct"].Rows[i][dc.ColumnName]; } MTLDeductTemp.Rows.Add(drAdd); //沒有下一筆 或 下一筆與本筆DataTypeNo不相符,進行組成XML拋ERP if (i + 1 == dsTemp.Tables["MTLDeduct"].Rows.Count || Conversions.ToInteger(dsTemp.Tables["MTLDeduct"].Rows[i + 1]["DataTypeNo"]) != stateType) { if (MTLDeductTemp != null && MTLDeductTemp.Rows.Count > 0) { int DataTypeNo = Conversions.ToInteger(dsTemp.Tables["MTLDeduct"].Rows[i]["DataTypeNo"]); string SheetType = ""; string strErrorDataType = ""; switch (DataTypeNo) { case 1: //1:物料扣料 SheetType = strMaterialOut; //領料單單別 strErrorDataType = "[%MaterialDeduct%]"; break; case 2: //2:還原物料扣料 SheetType = strMaterialReturn; //退料單單別 strErrorDataType = "[%UndoMaterialDeduct%]"; break; } //得到作業站群組 HashSet OPGroupHs = new HashSet(); DataTable OPGroupMTLDeductTemp = MTLDeductTemp.Copy(); strOPGroupError = fuGetOPGroupNoAndOPGroups(ref OPGroupHs, ref OPGroupMTLDeductTemp, cnnTemp); if (strOPGroupError != defString) { funWIPMaterialDeductData_E10ICDRet = TranslateMsg(strErrorDataType + strOPGroupError, strLanguageMode, strResourceDir); return funWIPMaterialDeductData_E10ICDRet; } foreach (string OPGroupNo in OPGroupHs) { //作業站群組的用料 OPGroupMTLDeduct = OPGroupMTLDeductTemp.Select("OPGroupNo= '" + OPGroupNo + "'"); if (OPGroupMTLDeduct != null && OPGroupMTLDeduct.Length > 0) { // CDO object var objERPrequest = new iMESCIO.SCI.ERP.Request_E10ICD.SCI_Request_issue_wo_inverted(); strCDOError = fuMaterialDeductDataToCDOobject(DataTypeNo, SheetType, OPGroupNo, OPGroupMTLDeduct, ref objERPrequest, ref arriveTime, cnnTemp); if (strCDOError != defString) { funWIPMaterialDeductData_E10ICDRet = TranslateMsg(strErrorDataType + strCDOError, strLanguageMode, strResourceDir); return funWIPMaterialDeductData_E10ICDRet; } object argCDO_Object = objERPrequest; InXml = ""; InXml = CombineRequestXMLbyCDO(ref argCDO_Object, dtERPSetting.Rows[0]["ERP_Name"].ToString(), "", "issue.wo.inverted.e10icd", pRequestKey: RequestKey); objERPrequest = (iMESCIO.SCI.ERP.Request_E10ICD.SCI_Request_issue_wo_inverted)argCDO_Object; // ----- Call ERP Web Service ----- if (!fuMaterialDeductDataThrowE10ICD(InXml, OPGroupMTLDeduct, ref responseValue, ref description, ref arriveTime)) { funWIPMaterialDeductData_E10ICDRet = TranslateMsg("fail;" + strErrorDataType + " [%ERP Return Message%]:" + description, strLanguageMode, strResourceDir); return funWIPMaterialDeductData_E10ICDRet; } else { //ERP成功單號 strResponse += responseValue + ","; } //清除已拋ERP扣料資料 OPGroupMTLDeduct = null; } } if (i + 1 != dsTemp.Tables["MTLDeduct"].Rows.Count) { //更新進行中的DataTypeNo stateType = Conversions.ToInteger(dsTemp.Tables["MTLDeduct"].Rows[i + 1]["DataTypeNo"]); } //清除已拋ERP扣料資料 MTLDeductTemp.Clear(); } } } if (strResponse.Length > 0) { strResponse = Strings.Mid(strResponse, 1, Strings.Len(strResponse) - 1); } } dsTemp.Dispose(); //Return success funWIPMaterialDeductData_E10ICDRet = "success;" + strResponse + ";"; } catch (Exception ex) { funWIPMaterialDeductData_E10ICDRet = CombineFailMsg("0000-999999", ex.Message); string argstrException1 = null; modAutoRunLibrary.addTransactionLog_ErrorCode(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "MES", "WIPMaterialDeductData_E10ICD", Environment.MachineName, "AutoRun", arriveTime.ToString("yyyy/MM/dd HH:mm:ss"), "fail", responseValue, "issue.wo.inverted.e10icd", LogClass: "AutoRun", strException: argstrException1); } finally { try { if (funWIPMaterialDeductData_E10ICDRet.ToString().Substring(0, 7) != "success") { if (dsTemp.Tables["MTLDeduct"] == null) { //未取出dsTemp.Tables["MTLDeduct"]表示非處理資料產生的錯誤, 以Mail內文的方式寄出 string argFileName = "N/A"; string argEmailSubject = "[AUT]"+ TranslateMsg("[%FAILEDMATERIALDEDUCTCONTENTTOERP%]", strLanguageMode, strResourceDir)+"。"; string argEmailBody = Conversions.ToString(funWIPMaterialDeductData_E10ICDRet); modAutoRunLibrary.SendMultiEmail(ref argFileName, ref argEmailSubject, argEmailBody, strGroupNo); } else { //已有取出dsTemp.Tables["MTLDeduct"]表示是處理資料產生的錯誤, 以Excel作為副檔寄送Mail var dtResult = new DataTable("FailResult"); DataRow drAdd; dtResult.Columns.Add("WOWorkDate", Type.GetType("System.String")); // 拋轉日期 dtResult.Columns.Add("DeductDate", Type.GetType("System.String")); // 扣料日期 dtResult.Columns.Add("LotSerial", Type.GetType("System.String")); // 生產批序號 dtResult.Columns.Add("LogGroupSerial", Type.GetType("System.String")); // 生產批在作業站的Log序號 dtResult.Columns.Add("DataTypeNo", Type.GetType("System.String")); // 1: 扣料 2:倒扣料 dtResult.Columns.Add("LotNo", Type.GetType("System.String")); // 生產批編號 dtResult.Columns.Add("OPNo", Type.GetType("System.String")); // 作業站編號 dtResult.Columns.Add("EquipmentNo", Type.GetType("System.String")); // 設備編號 dtResult.Columns.Add("MaterialLevel", Type.GetType("System.String")); // 物料等級 dtResult.Columns.Add("MaterialNo", Type.GetType("System.String")); // 物枓編號 dtResult.Columns.Add("MaterialLotNo", Type.GetType("System.String")); // 物枓批號 DataRow[] MTLDataTemp = null; if (OPGroupMTLDeduct != null) { MTLDataTemp = OPGroupMTLDeduct; } else if (MTLDeductTemp != null) { MTLDataTemp = MTLDeductTemp.Select(); } else { MTLDataTemp = dsTemp.Tables["MTLDeduct"].Select(); } if (MTLDataTemp != null) { foreach (DataRow drMTLDeduct in MTLDataTemp) { drAdd = dtResult.NewRow(); drAdd["WOWorkDate"] = arriveTime.ToString("yyyyMMdd"); drAdd["DeductDate"] = Strings.Format(drMTLDeduct["DeductDate"], "yyyy/MM/dd"); drAdd["LotSerial"] = drMTLDeduct["LotSerial"].ToString(); drAdd["LogGroupSerial"] = drMTLDeduct["LogGroupSerial"].ToString(); drAdd["DataTypeNo"] = drMTLDeduct["DataTypeNo"].ToString(); drAdd["LotNo"] = drMTLDeduct["LotNo"].ToString(); drAdd["OPNo"] = drMTLDeduct["OPNo"].ToString(); drAdd["EquipmentNo"] = drMTLDeduct["EquipmentNo"].ToString(); drAdd["MaterialLevel"] = drMTLDeduct["MaterialLevel"].ToString(); drAdd["MaterialNo"] = drMTLDeduct["MaterialNo"].ToString(); drAdd["MaterialLotNo"] = drMTLDeduct["MaterialLotNo"].ToString(); dtResult.Rows.Add(drAdd); } } string strFillType = "XLS"; //讓最後一列style生效,新增空列 DataRow drEnd = dtResult.NewRow(); dtResult.Rows.Add(drEnd); var dsResult = new DataSet(); dsResult.Tables.Add(dtResult); // 0133391: [跨平台]AutoRunLib移除iMESUltraGrid的使用, 2023/4/21 String ExcelMode = strFillType.ToString().ToUpper(); //"XLSX" , "XLS" byte[] membyte = modAutoRunLibrary.funExcelToByte(dsResult, ExcelMode, strLanguageMode, strResourceDir); try { dsResult.Dispose(); } catch (Exception ex) { } // 寄送Mail string argFileName = "ErrorList.xls"; string argEmailSubject = "[AUT]"+ TranslateMsg("[%FAILEDMATERIALDEDUCTCONTENTTOERP%]", strLanguageMode, strResourceDir) + "。"; string argEmailBody = Conversions.ToString(funWIPMaterialDeductData_E10ICDRet); modAutoRunLibrary.SendMultiEmail(ref argFileName, ref argEmailSubject, argEmailBody, strGroupNo, membyte); funWIPMaterialDeductData_E10ICDRet = argEmailBody; } } CloseConnection(cnnTemp); dsTemp.Dispose(); } catch (Exception ex) { funWIPMaterialDeductData_E10ICDRet = "fail_Finally;" + ex.Message; } } } while (false); return funWIPMaterialDeductData_E10ICDRet; } private string fuGetOPGroupNoAndOPGroups(ref HashSet OPGroupHs, ref DataTable MTLDeductDataTemp, IDbConnection cnnTemp) { string fuGetOPGroupNoAndOPGroupsRet = defString; DbDataReader drTemp = default(DbDataReader); string strSQL = ""; try { if (!MTLDeductDataTemp.Columns.Contains("OPGroupNo")) { MTLDeductDataTemp.Columns.Add("OPGroupNo", Type.GetType("System.String")); //作業站群組 } foreach (DataRow drMTLDeduct in MTLDeductDataTemp.Rows) { strSQL = "Select OPGroupNo,OPNo From tblOPGroupDetail Where OPNo = '" + drMTLDeduct["OPNo"] + "'"; drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (drTemp.Read()) { drMTLDeduct["OPGroupNo"] = drTemp["OPGroupNo"].ToString(); OPGroupHs.Add(drTemp["OPGroupNo"].ToString()); } else { fuGetOPGroupNoAndOPGroupsRet = TranslateMsg("[%OPNo%] :" + drMTLDeduct["OPNo"].ToString() + ",[%OPGROUPNO%][%IS NOT EXIST%]", strLanguageMode, strResourceDir); return fuGetOPGroupNoAndOPGroupsRet; } drTemp.Close(); } } catch (Exception ex) { throw; } return fuGetOPGroupNoAndOPGroupsRet; } private string fuMaterialDeductDataToCDOobject(int DataTypeNo, string SheetType, string OPGroupNo, DataRow[] OPGroupMTLDeduct, ref iMESCIO.SCI.ERP.Request_E10ICD.SCI_Request_issue_wo_inverted objERPrequest, ref DateTime arriveTime, IDbConnection cnnTemp) { string fuMaterialDeductDataToCDOobjectRet = defString; DbDataReader drTemp = default(DbDataReader); string strSQL = ""; var objERPrequest_Detail = new List(); try { arriveTime = DateTime.Now; //Master objERPrequest.doc_type_no = SheetType; //單別 objERPrequest.doc_no = ""; //單據編號,填空值 objERPrequest.create_date = Strings.Format(arriveTime, "yyyyMMdd"); //單據時間,目前時間 //DataTypeNo= 1:物料扣料,2:還原物料扣料 objERPrequest.status = (DataTypeNo == 2) ? "3" : Conversions.ToString(DataTypeNo); //1:扣料(發料)、3:倒扣料(退料) objERPrequest.remark = ""; //備註,填空值 objERPrequest.applicant_no = ""; //領退料人員,填空值 objERPrequest.workstation_no = OPGroupNo; //作業站群組 //Detail for (int i = 0; i < OPGroupMTLDeduct.Length; i++) { var objDetail = new iMESCIO.SCI.ERP.Request_E10ICD.SCI_detail_issue_wo_inverted(); objDetail.seq = Conversions.ToString(i + 1); //序號,從1開始的流水號 //工單編號 if (!(OPGroupMTLDeduct[i]["MONo"] is DBNull)) { objDetail.wo_no = OPGroupMTLDeduct[i]["MONo"].ToString(); //工單單號 } else { strSQL = "Select A.MONo From tblWIPLotBasis A, tblWIPLotState B Where A.BaseLotNo = B.BaseLotNo And B.LotNo = '" + OPGroupMTLDeduct[i]["LotNo"].ToString() + "'"; drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (drTemp.Read()) { objDetail.wo_no = drTemp["MONo"].ToString(); // 工單編號 } else { fuMaterialDeductDataToCDOobjectRet = TranslateMsg("[%LotNo%] :" + OPGroupMTLDeduct[i]["LotNo"].ToString() + ",[%MONONOTEXIST%]", strLanguageMode, strResourceDir); return fuMaterialDeductDataToCDOobjectRet; } drTemp.Close(); } //物料編號 if (OPGroupMTLDeduct[i]["MaterialLevel"].ToString() == "0") { strSQL = "Select ERPNo From tblMTLMaterialBasis Where IssueState = 2 And MaterialNo = '" + OPGroupMTLDeduct[i]["MaterialNo"].ToString() + "'"; } else { strSQL = "Select ERPNo From tblPRDProductBasis Where IssueState = 2 And Curversion = 1 And ProductNo = '" + OPGroupMTLDeduct[i]["MaterialNo"].ToString() + "'"; } drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (drTemp.Read()) { if (drTemp["ERPNo"].ToString() != "") { objDetail.item_no = drTemp["ERPNo"].ToString(); //物料/半成品在ERP的編號 } else { objDetail.item_no = OPGroupMTLDeduct[i]["MaterialNo"].ToString(); //物料/半成品在ERP的編號,若ERPNo沒有值,則拋MaterialNo } } else { fuMaterialDeductDataToCDOobjectRet = TranslateMsg("[%MaterialNo%] :" + OPGroupMTLDeduct[i]["MaterialNo"].ToString() + " [%IS NOT EXIST%]", strLanguageMode, strResourceDir); return fuMaterialDeductDataToCDOobjectRet; } drTemp.Close(); objDetail.qty = OPGroupMTLDeduct[i]["DeductQty"].ToString(); //扣料數量 //物料單位 if (OPGroupMTLDeduct[i]["MaterialLevel"].ToString() == "0") { strSQL = "Select A.UnitNo, B.DefaultValue From tblMTLMaterialBasis A Left Join tblMTLMaterialProperty B On A.MaterialNo = B.Material And B.IssueState = 2 And Upper(B.PropertyNo) = 'ERPUNITNO'" + " Where A.IssueState = 2 And A.MaterialNo = '" + OPGroupMTLDeduct[i]["MaterialNo"].ToString() + "'"; } else { strSQL = "Select A.UnitNo, B.DefaultValue From tblPRDProductBasis A Left Join tblPRDProductProperty B On A.ProductNo = B.ProductNo And A.ProductVersion = B.ProductVersion And B.IssueState = 2 And Upper(B.PropertyNo) = 'ERPUNITNO'" + " Where A.IssueState = 2 And A.CurVersion = 1 And A.ProductNo = '" + OPGroupMTLDeduct[i]["MaterialNo"].ToString() + "'"; } drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (drTemp.Read()) { if (drTemp["DefaultValue"].ToString() != "") { objDetail.unit_no = drTemp["DefaultValue"].ToString(); //取物料屬性ERPUnitNo 的屬性值 } else { objDetail.unit_no = drTemp["UnitNo"].ToString(); //物料屬性值為空,則物料主檔的UnitNo } } else { fuMaterialDeductDataToCDOobjectRet = TranslateMsg("[%MaterialNo%] :" + OPGroupMTLDeduct[i]["MaterialNo"].ToString() + " [%IS NOT EXIST%]", strLanguageMode, strResourceDir); return fuMaterialDeductDataToCDOobjectRet; } drTemp.Close(); objDetail.item_type = ""; //物料等級,填空值 objDetail.input_datetime = Strings.Format(OPGroupMTLDeduct[i]["DeductDate"], "yyyyMMdd"); //扣料日期 objDetail.warehouse_no = OPGroupMTLDeduct[i]["PutinPlaceNo"].ToString(); //扣料點編號 //儲位 if (OPGroupMTLDeduct[i]["LocatorNo"].ToString() == "N/A") { objDetail.location_no = ""; //儲位,若為N/A則拋空白 } else { objDetail.location_no = OPGroupMTLDeduct[i]["LocatorNo"].ToString(); //儲位 } objDetail.lot_no = OPGroupMTLDeduct[i]["MaterialLotNo"].ToString(); //物料批號 objDetail.expiry_date = ""; //有效日期,填空值 objDetail.item_feature_no = ""; //物徵碼,填空值 objDetail.remark = ""; //備註,填空值 objDetail.positive_negative = ""; //正負,填空值 objDetail.replaced_item_no = ""; //被替代的物料編號,若未傳入則以物料編號為默認值,填空值 objDetail.replaced_qty = ""; //被替代的物料數量,填空值 objDetail.replaced_type = ""; //替代料等級,填空值 objDetail.issue_to_type = "3"; //3:MO (工單,Default) objDetail.sub_type = "0"; //0:主料 1:取代 2:替代 objDetail.replaced_item_feature_no = ""; //替代品號特徵碼,填空值 objDetail.op_no = OPGroupMTLDeduct[i]["OPNo"].ToString(); //作業站編號 objERPrequest_Detail.Add(objDetail); } objERPrequest.wo_item_detail = objERPrequest_Detail; } catch (Exception ex) { throw; } return fuMaterialDeductDataToCDOobjectRet; } private Boolean fuMaterialDeductDataThrowE10ICD(string InXml, DataRow[] OPGroupMTLDeduct, ref string responseValue, ref string description, ref DateTime arriveTime) { Boolean fuMaterialDeductDataThrowE10ICDRet = false; string OutXml = ""; var objERPresponse = new iMESCIO.SCI.ERP.Response_E10ICD.SCI_Response_issue_wo_inverted(); string code = string.Empty; // Response... code:錯誤碼;非0則為錯誤 (function回傳 success 或 fail) string strSQL = ""; var CollectionSQL = new Collection(); try { arriveTime = DateTime.Now; responseValue = string.Empty; description = string.Empty; // ----- Call ERP Web Service ----- using (var ws = new iMESCore.Base.Invoke.wsERP_EAI.IntegrationEntry()) { ws.Url = ERP_URL; OutXml = ws.invokeSrv(InXml); } objERPresponse.ParseXmlToObject(OutXml); // ----- 取得ERP執行結果 code,responseValue,description ----- code = objERPresponse.code; responseValue = objERPresponse.return_no; description = objERPresponse.description; if (string.IsNullOrEmpty(code) == true) { code = "fail"; } else if (code == "0") code = "success"; else code = "fail"; // Edison 2019/03/22 修正log紀錄位置 string argstrException1 = null; modAutoRunLibrary.addTransactionLog_ErrorCode(InXml, OutXml, arriveTime.ToString("yyyyMMddHHmmssss"), "MES", "WIPMaterialDeductData_E10ICD", Environment.MachineName, "AutoRun", arriveTime.ToString("yyyy/MM/dd HH:mm:ss"), code, responseValue, "issue.wo.inverted.e10icd", LogClass: "AutoRun", strException: argstrException1); if (code == "success") { foreach (DataRow drMTLDeduct in OPGroupMTLDeduct) { strSQL = "Update tblWIPMaterialDeductContent Set ERPFlag = 'Y', ERPNo = '" + responseValue + "'" + " Where LotSerial = '" + drMTLDeduct["LotSerial"].ToString() + "' And LogGroupSerial = '" + drMTLDeduct["LogGroupSerial"].ToString() + "'" + " And DataTypeNo = " + drMTLDeduct["DataTypeNo"] + " And EquipmentNo = '" + drMTLDeduct["EquipmentNo"].ToString() + "'" + " And MaterialLevel = " + drMTLDeduct["MaterialLevel"] + " And MaterialNo = '" + drMTLDeduct["MaterialNo"].ToString() + "' And MaterialLotNo = '" + drMTLDeduct["MaterialLotNo"].ToString() + "'" + " And PutInPlaceType = " + drMTLDeduct["PutInPlaceType"]; CollectionSQL.Add(strSQL); } ExecuteSQLNoneQuery_UPD(strDataBaseType, strConnectionString, CollectionSQL); fuMaterialDeductDataThrowE10ICDRet = true; } } catch (Exception ex) { fuMaterialDeductDataThrowE10ICDRet = false; throw; } return fuMaterialDeductDataThrowE10ICDRet; } #endregion #region 工单自动结单 private object funProcessERPPendingTrans(Collection colParameters = null) { object funProcessERPPendingTransRet = default(object); var cnnTemp = default(IDbConnection); string strSQL; string strAccess = string.Empty; string strParameter = string.Empty; string strMaster = string.Empty; string strDetail = string.Empty; string strTempField = string.Empty; string strTempRecord = string.Empty; var arriveTime = DateTime.Now; string strGroupNo = string.Empty; // Mail通知群組 string strERPName = string.Empty; //设定的ERP名称 string closeMORet = string.Empty; // Request/Response... 收貨單單號, 成功回傳ERP收貨單號起始~截止單號 // 2021/03/30 Elvis 0087678: [瑞賢] AUTORUN報工--報工失敗,發送郵件新增提供失敗清單 //var ExcelExp = new Infragistics.Win.UltraWinGrid.ExcelExport.UltraGridExcelExporter(); //var workbook = new Infragistics.Documents.Excel.Workbook(); var aryReturnMessage = new ArrayList(); // Catch Error Message (Exception及MES判定錯誤訊息)。 var dsTemp = new DataSet(); var datNow = DateTime.Now; var dtResult = new DataTable("FailResult"); DataRow drAdd; do { try { cnnTemp = CreateConnection(strConnectionString); dtResult.Columns.Add("TransactionID", Type.GetType("System.String")); // 交易編號 dtResult.Columns.Add("TransactionType", Type.GetType("System.String")); // 交易類型 dtResult.Columns.Add("TicketNo", Type.GetType("System.String")); // 單據編號 dtResult.Columns.Add("ERPType", Type.GetType("System.String")); // ERP類型 dtResult.Columns.Add("Creator", Type.GetType("System.String")); // 建立人 dtResult.Columns.Add("CreateDate", Type.GetType("System.String")); // 建立日 dtResult.Columns.Add("FailReason", Type.GetType("System.String")); // 錯誤訊息 // Parameter01為參數一(使用者群組), 可以不設定 if (!(colParameters["Parameter01"] == null) & !string.IsNullOrEmpty(Strings.Trim(Conversions.ToString(colParameters["Parameter01"])))) { strGroupNo = colParameters["Parameter01"].ToString().Trim(); //若有設定, 先檢查群組合理性 if (!string.IsNullOrEmpty(strGroupNo) && ERP2MES_MailNoticeChk(ref cnnTemp, ref aryReturnMessage, strGroupNo) < 0) { funProcessERPPendingTransRet = Conversions.ToString("fail;" + aryReturnMessage[0]); goto exitfun; } } //查询系统当前设置的ERP系统名称,只有workflow才會執行此自動結單功能 strSQL = "select ERP_NAME from TBLSYSERPSETTING where ACTIVEERP = 1"; ExecuteSQLQuery_Adapter(strSQL, dsTemp, "ERPName", cnnTemp); if (dsTemp.Tables["ERPName"].Rows.Count > 0) { strERPName = dsTemp.Tables["ERPName"].Rows[0]["ERP_NAME"].ToString().Trim(); } if (strERPName != "Workflow") { funProcessERPPendingTransRet = Conversions.ToString("fail;" + TranslateMsg("ERP[%IS NOT%]WorkFlow,[%NOTALLOWTOUSEFUNCTION%]", strLanguageMode, strResourceDir)); goto exitfun; } //查询出tblERPPendingTrans表中数据并处理工单结案 strSQL = " select * from tblERPPendingTrans order by CreateDate "; ExecuteSQLQuery_Adapter(strSQL, dsTemp, "ERPPending", cnnTemp); for (int i = 0; i < dsTemp.Tables["ERPPending"].Rows.Count; i++) { string ERPType = string.Empty; string transactionType = string.Empty; ERPType = dsTemp.Tables["ERPPending"].Rows[i]["ERPType"].ToString(); transactionType = dsTemp.Tables["ERPPending"].Rows[i]["TransactionType"].ToString(); if (ERPType == "TP" && transactionType == "1") { try { closeMORet = funMOPendingClose(dsTemp.Tables["ERPPending"].Rows[i]["TicketNo"].ToString()); } catch (Exception ex) { closeMORet = ex.Message; } if (closeMORet != "success") { drAdd = dtResult.NewRow(); drAdd["TransactionID"] = dsTemp.Tables["ERPPending"].Rows[i]["TransactionID"].ToString(); drAdd["TransactionType"] = dsTemp.Tables["ERPPending"].Rows[i]["TransactionType"].ToString(); drAdd["TicketNo"] = dsTemp.Tables["ERPPending"].Rows[i]["TicketNo"].ToString(); drAdd["ERPType"] = dsTemp.Tables["ERPPending"].Rows[i]["ERPType"].ToString(); drAdd["Creator"] = dsTemp.Tables["ERPPending"].Rows[i]["Creator"].ToString(); drAdd["CreateDate"] = Strings.Format(dsTemp.Tables["ERPPending"].Rows[i]["CreateDate"], "yyyy/MM/dd HH:mm:ss"); drAdd["FailReason"] = closeMORet; dtResult.Rows.Add(drAdd); } } } if (dtResult.Rows.Count > 0) { funProcessERPPendingTransRet = "fail;"; foreach (DataRow r in dtResult.Rows) funProcessERPPendingTransRet += Conversions.ToString(TranslateMsg("[%TransactionID%]: " + r["TransactionID"].ToString() + ", [%TicketNo%]: " + r["TicketNo"].ToString() + ", " + r["FailReason"].ToString() + "\r\n", strLanguageMode, strResourceDir)); goto exitfun; } funProcessERPPendingTransRet = "success"; exitfun:; } catch (Exception ex) { funProcessERPPendingTransRet = Conversions.ToString("fail;" + ex.Message); } finally { try { if (strGroupNo != string.Empty) { if (funProcessERPPendingTransRet.ToString().Substring(0, 7) != "success" || dtResult.Rows.Count > 0) { if (dtResult.Rows.Count == 0) { //未取出dsTemp.Tables["MTLDeduct"]表示非處理資料產生的錯誤, 以Mail內文的方式寄出 string argFileName = "N/A"; string argEmailSubject = "[AUT]" + TranslateMsg("[%PROCESSINGERPPENDINGTRANSFAIL%]", strLanguageMode, strResourceDir); string argEmailBody = Conversions.ToString(funProcessERPPendingTransRet); modAutoRunLibrary.SendMultiEmail(ref argFileName, ref argEmailSubject, argEmailBody, strGroupNo); } else { //已有取出dsTemp.Tables["MTLDeduct"]表示是處理資料產生的錯誤, 以Excel作為副檔寄送Mail string strFillType = "XLS"; //讓最後一列style生效,新增空列 DataRow drEnd = dtResult.NewRow(); dtResult.Rows.Add(drEnd); var dsResult = new DataSet(); dsResult.Tables.Add(dtResult); //iugTemp.iMESUltraGrid.DataSource = dtResult; // 0133391: [跨平台]AutoRunLib移除iMESUltraGrid的使用, 2023/4/21 String ExcelMode = strFillType.ToString().ToUpper(); //"XLSX" , "XLS" byte[] membyte = modAutoRunLibrary.funExcelToByte(dsResult, ExcelMode, strLanguageMode, strResourceDir); try { dsResult.Dispose(); } catch (Exception ex) { } // 寄送Mail string argFileName = "ErrorList.xls"; string argEmailSubject = "[AUT]" + TranslateMsg("[%PROCESSINGERPPENDINGTRANSFAIL%]", strLanguageMode, strResourceDir); string argEmailBody = TranslateMsg("[%SOMEMOAUTOCLOSEFAIL%]", strLanguageMode, strResourceDir); modAutoRunLibrary.SendMultiEmail(ref argFileName, ref argEmailSubject, argEmailBody, strGroupNo, membyte); funProcessERPPendingTransRet = argEmailBody; } } } CloseConnection(cnnTemp); dsTemp.Dispose(); dtResult.Dispose(); } catch (Exception ex) { funProcessERPPendingTransRet = "fail_Finally;" + ex.Message; } } } while (false); return funProcessERPPendingTransRet; } // 工單結案 public string funMOPendingClose(string MONo = defString) { DbDataReader drTemp = null; IDbConnection cnnTemp = null; // Dim cmd As OleDb.OleDbCommand string strSQL = string.Empty; string chkMOState_CloseRet = string.Empty; var CollectionSQL = new Collection(); var CollectionRows = new Collection(); DateTime EventTime = DateTime.Now; try { cnnTemp = CreateConnection(strConnectionString); //查询工单是否存在 strSQL = "Select MONO,FromERP,IssueState,MOState From tblOEMOBasis Where MONo = '" + MONo + "'"; drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (drTemp.Read()) { if (Conversions.ToBoolean(Operators.ConditionalCompareObjectNotEqual(drTemp["IssueState"], 2, false))) { chkMOState_CloseRet = TranslateMsg("[%MONONOTAPPROVED%]", strLanguageMode, strResourceDir); goto exitfun; } if (drTemp["MOState"].ToString() == "99") { chkMOState_CloseRet = TranslateMsg("[%MONOCLOSED%]", strLanguageMode, strResourceDir); goto exitfun; //工單已結案 } } else { chkMOState_CloseRet = TranslateMsg("[%MONONOTEXIST%]", strLanguageMode, strResourceDir); goto exitfun; } // 2016/09/08 YF, 因入庫動作並不會將生產批壓成99, 故工單永遠無法結單, 若壓成99又會有重上線問題 // 故能否結工單調整為只判斷是否還有線上的生產批 // 2018/06/07 OwenLiu, Mantis:46288, 增加數量需大於0的檢核 // 2019/12/11 Eric Mantis:65384 排除tblWIPLotBasis.LotStatus=0(未下線)的資料 (為已開立生產批的未下線資料與設定面檢核失敗而未下線成功的資料) strSQL = " SELECT Count(A.LotNo) " + " FROM tblWIPLotState A, " + " (select C.* from tblwiplotbasis C where C.LOTSTATE<>0) B " + " WHERE A.BaseLotNo = B.BaseLotNo " + " AND B.MONo = '" + MONo + "' " + " AND A.Status In (0,1,2,3,4,5) " + " AND A.CurQty > 0 "; // cmd.CommandText = strSQL if (Operators.ConditionalCompareObjectGreater(ExecuteSQLQuery_Scalar(strSQL, cnnTemp), 0, false)) { chkMOState_CloseRet = TranslateMsg("[%HavingLotinWIPInventory%],[%NOTALLOWTOCLOSEMO%]", strLanguageMode, strResourceDir); goto exitfun; } // 82671: [6.0.3]在製品庫仍有數量,ERP仍可執行工單結案 Edison 2020/11/25 strSQL = " SELECT Count(A.LotNo) FROM tblINVWIPInventory_Semi A, tblWIPLotBasis B " + " WHERE A.BaseLotNo = B.BaseLotNo " + " And B.MONo = '" + MONo + "' "; // cmd.CommandText = strSQL if (Operators.ConditionalCompareObjectGreater(ExecuteSQLQuery_Scalar(strSQL, cnnTemp), 0, false)) { chkMOState_CloseRet = TranslateMsg("[%HavingLotinWIPInventory%],[%NOTALLOWTOCLOSEMO%]", strLanguageMode, strResourceDir); goto exitfun; } // cmmTemp.Dispose() //0130980: [6.0.7]0129989: [萬達]工單結案條件確認 strSQL = " SELECT Count(A.BaseLotNo) FROM tblWIPLotBasis A, tblINVWIP_Scrap B WHERE A.BaseLotNo = B.LotNo AND B.SCRAPQTY > 0 AND A.MONo = '" + MONo + "' "; if (Operators.ConditionalCompareObjectGreater(ExecuteSQLQuery_Scalar(strSQL, cnnTemp), 0, false)) { chkMOState_CloseRet = TranslateMsg("[%HavingLotinWIPInventory%],[%NOTALLOWTOCLOSEMO%]", strLanguageMode, strResourceDir); goto exitfun; } strSQL = "SELECT Count(A.BaseLotNo) FROM tblWIPLotBasis A, tblINVWIP_FailBin B WHERE A.BaseLotNo = B.LotNo AND A.MONo = '" + MONo + "' "; if (Operators.ConditionalCompareObjectGreater(ExecuteSQLQuery_Scalar(strSQL, cnnTemp), 0, false)) { chkMOState_CloseRet = TranslateMsg("[%HavingLotinWIPInventory%],[%NOTALLOWTOCLOSEMO%]", strLanguageMode, strResourceDir); goto exitfun; } strSQL = "SELECT Count(A.BaseLotNo) FROM tblWIPLotBasis A, tblINVWIP_ComponentScrap B WHERE A.BaseLotNo = B.LotNo AND B.SCRAPQTY > 0 AND A.MONo = '" + MONo + "' "; if (Operators.ConditionalCompareObjectGreater(ExecuteSQLQuery_Scalar(strSQL, cnnTemp), 0, false)) { chkMOState_CloseRet = TranslateMsg("[%HavingLotinWIPInventory%],[%NOTALLOWTOCLOSEMO%]", strLanguageMode, strResourceDir); goto exitfun; } strSQL = "Update tblOEMOBasis Set MOState = 99, MOCloseDate = To_Date('" + Strings.Format(DateTime.Now, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS') "; strSQL += " ,OrgMOState = " + drTemp["MOState"].ToString() + " Where MONo = '" + MONo + "'"; CollectionSQL.Add(strSQL); CollectionRows.Add(1); strSQL = "Insert into tblERPPendingTransLog Select TRANSACTIONID, TRANSACTIONTYPE, TICKETNO, ERPType, Creator, CreateDate ,sysdate as EventTime from tblERPPendingTrans where TRANSACTIONTYPE = 1 And TICKETNO = '" + MONo + "' "; CollectionSQL.Add(strSQL); CollectionRows.Add(1); strSQL = " Delete from tblERPPendingTrans Where TRANSACTIONTYPE = 1 And TICKETNO = '" + MONo + "' "; CollectionSQL.Add(strSQL); CollectionRows.Add(1); // 0151198: [6.0.7] SDD231107_01-02_ERP 工單結案接口調整, 19245, 2023/12/11 // 1.找出ERPCloseMOClearMTLQty參數值, 是否要清除工單上的還有數量的物料 0:否,不清除 ; 1:是,要清除工單上有剩餘數量的物料。 string strMOClearMTLQty = defString; Double dblMOMTLQty_MIN = 1; strSQL = "Select ParameterValue From tblSYSParameter Where ParameterNo = 'ERPCloseMOClearMTLQty'"; drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (drTemp.Read()) strMOClearMTLQty = drTemp["ParameterValue"].ToString(); drTemp.Close(); if (strMOClearMTLQty == "1") // 要清除 { Decimal decNumber = 0; // 2.找出MOMTLQty_MIN (最低工單物料數量(用於ERP工單結案清除剩餘物料))參數值 strSQL = "Select ParameterValue From tblSYSParameter Where ParameterNo = 'MOMTLQty_MIN'"; drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); if (drTemp.Read()) { //判斷MOMTLQty_MIN是否為數值 if (decimal.TryParse(drTemp["ParameterValue"].ToString(), out decNumber)) dblMOMTLQty_MIN = Convert.ToDouble(drTemp["ParameterValue"]); else { chkMOState_CloseRet = TranslateMsg("[%MOMTLQty_MIN%] [%IS NOT NUMERIC%]", strLanguageMode, strResourceDir); goto exitfun; } } drTemp.Close(); // 取出目前工單的物料數量 strSQL = "Select * From tblOEMOMaterialState Where MONo='" + MONo + "'"; drTemp = ExecuteSQLQuery_Reader(strSQL, cnnTemp); while (drTemp.Read()) { // 小於最低工單物料數量時,就必須要將該物料做清除 if (Convert.ToDouble(drTemp["Qty"]) < dblMOMTLQty_MIN) { strSQL = "Update tblOEMOMaterialState set Qty = 0 Where MONo ='" + drTemp["MONo"].ToString() + "'" + " And MaterialNo = '" + drTemp["MaterialNo"] + "'" + " And MaterialLotNo = '" + drTemp["MaterialLotNo"] + "'" + " And SubstituteMaterialNo = '" + drTemp["SubstituteMaterialNo"] + "'"; CollectionSQL.Add(strSQL); CollectionRows.Add(1); // 將清除前的物料紀錄回tblERPMOMTLStateClearLog strSQL = "Insert Into tblERPMOMTLStateClearLog " + "(MONo, MaterialNo, MaterialLotNo, UnitNo, Qty, MaterialLevel, MaterialType, InputDate, " + "SubstituteMaterialNo, SubstituteMaterialLevel, SubstituteMaterialQty, Description, ExpireDate," + " OpenDate, ManufactureDate, GraceDate, EventDate)"; strSQL += " (Select MONo, MaterialNo, MaterialLotNo, UnitNo, " + drTemp["Qty"] + ", MaterialLevel, MaterialType, InputDate " + ", SubstituteMaterialNo, SubstituteMaterialLevel, SubstituteMaterialQty, Description" + ", ExpireDate, OpenDate, ManufactureDate, GraceDate" + ", To_Date('" + Strings.Format(EventTime, "yyyy/MM/dd H:mm:ss") + "','YYYY/MM/DD HH24:MI:SS')"; // 紀錄資料產生時間(EventTime) strSQL += " From tblOEMOMaterialState"; strSQL += " Where MONo='" + drTemp["MONo"].ToString() + "'" + " And MaterialNo = '" + drTemp["MaterialNo"] + "'" + " And MaterialLotNo = '" + drTemp["MaterialLotNo"] + "'" + " And SubstituteMaterialNo = '" + drTemp["SubstituteMaterialNo"] + "')"; CollectionSQL.Add(strSQL); CollectionRows.Add(1); } } drTemp.Close(); } ExecuteSQLNoneQuery_ChkRowCount(strDataBaseType, strConnectionString, CollectionSQL, CollectionRows); chkMOState_CloseRet = "success"; exitfun:; } catch (Exception e1) { throw; } finally { drTemp.Close(); CloseConnection(cnnTemp); // cmd = Nothing } return chkMOState_CloseRet; } #endregion private string funGetRequestKey(ref object SCI_Object, string pService, string pUserNo, string pServiceName, string pCalledID = defString, string pRequestKey = defString) { string funGetRequestKeyRet = default(string); DataRow[] drERPSetting; string strFilter = ""; do { try { strFilter = "ERP_Name ='" + pService + "' "; if ((pCalledID ?? "") != defString && string.IsNullOrEmpty(pCalledID) == false) strFilter += " And CalledID ='" + pCalledID + "' "; // 取得服務資訊 drERPSetting = dtERPSetting.Select(strFilter); if (drERPSetting == null) break; if (drERPSetting.Length != 1) break; if ((pCalledID ?? "") == defString) { pCalledID = drERPSetting[0]["CalledID"].ToString(); } // 2017-03-17, Joe, 加Parameter for E10 (SCI_Object as iMESCIO.SCI.ERP.ERPRequestBase).enterprise_no = drERPSetting[0]["ERP_ENTID"].ToString(); (SCI_Object as iMESCIO.SCI.ERP.ERPRequestBase).site_no = drERPSetting[0]["ERP_ORG"].ToString(); // 轉XML string RequestHead = ""; RequestHead += ""; string RequestDataKey = "" + drERPSetting[0]["ERP_ENTID"].ToString() + "" + drERPSetting[0]["ERP_ORG"].ToString() + ""; string RequestXML_Body = Conversions.ToString((SCI_Object as iMESCIO.SCI.ERP.ERPRequestBase).ParseXml()); pRequestKey = modAutoRunLibrary.GetRequestKey(RequestHead); funGetRequestKeyRet = pRequestKey; } catch (Exception ex) { throw; } } while (false); return funGetRequestKeyRet; } } }