/// <summary> /// 確定 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void btnOK_Click(object sender, EventArgs e) { try { if (_CSTMMSIqcInfoData == null) { // [00060]{0}沒有資料可顯示! throw new Exception(TextMessage.Error.T00060("")); } if (ttbNewQuantity.Text.IsNullOrTrimEmpty()) { // [00060]{0}沒有資料可顯示! throw new Exception(TextMessage.Error.T00060(lblNewQuantity.Text)); } TransactionStamp txnStamp = new TransactionStamp(User.Identity.Name, ProgramRight, ProgramRight, ApplicationName); using (var cts = CimesTransactionScope.Create()) { var CSTMMSIqcInfoLogData = _CSTMMSIqcInfoData.Fill <CSTMMSIqcInfoLog>(); CSTMMSIqcInfoLogData.InsertToDB(txnStamp.UserID, txnStamp.RecordTime); _CSTMMSIqcInfoData.Quantity = ttbNewQuantity.Text.ToDecimal(); _CSTMMSIqcInfoData.UpdateToDB(); cts.Complete(); } ClearField(); AjaxFocus(ttbIQCRunID); _ProgramInformationBlock.ShowMessage(TextMessage.Hint.T00614("")); } catch (Exception ex) { HandleError(ex); } }
protected void gvToolList_RowDeleting(object sender, GridViewDeleteEventArgs e) { try { CurrentToolData = AllTools[gvToolList.Rows[e.RowIndex].DataItemIndex]; if (CurrentToolData.ActiveFlag == "T") //ActiveFlag的判斷,若曾經啟用過則不可刪除 { throw new Exception(TextMessage.Error.T00714()); } using (CimesTransactionScope cts = CimesTransactionScope.Create()) { CurrentToolData.DeleteFromDB(); AttributeAttributeInfo.DeleteByObjectSIDAndDataClass(CurrentToolData.ID, "ToolAttribute", this.User.Identity.Name, DBCenter.GetSystemTime()); LogCenter.LogToDB(CurrentToolData, LogCenter.LogIndicator.Create(ActionType.Remove, User.Identity.Name, DBCenter.GetSystemTime())); cts.Complete(); } CurrentToolData = null; gvToolList.ResetCloneDataSource(); QueryAllTool(); //BindGridView(); } catch (Exception ex) { HandleError(ex); } }
protected void btnOK_Click(object sender, EventArgs e) { try { if (_ProcessLot == null) { throw new RuleCimesException(TextMessage.Error.T00826(lblBoxNo.Text)); } // 定義交易戳記 var txnStamp = new TransactionStamp(User.Identity.Name, ProgramRight, ProgramRight, ApplicationName); using (var cts = CimesTransactionScope.Create()) { // 將轉為子單元的批號還原,例如可使用於拆包 WIPTxn.Default.ConvertToLot(_ProcessLot, _ComponentList, txnStamp); cts.Complete(); } // 返回定義的預設網頁 ReturnToPortal(); } catch (Exception ex) { HandleError(ex); } }
/// <summary> /// 確認 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void btnOK_Click(object sender, EventArgs e) { try { TransactionStamp txnStamp = new TransactionStamp(User.Identity.Name, ProgramRight, ProgramRight, ApplicationName); //確認模具是否有輸入 ttbToolName.Must(lblToolName); using (var cts = CimesTransactionScope.Create()) { //變更模具上的儲位為Warehouse TMSTransaction.ModifyToolSystemAttribute(_ToolData, "Location", "Warehouse", txnStamp); cts.Complete(); } ClearField(); AjaxFocus(ttbToolName); _ProgramInformationBlock.ShowMessage(TextMessage.Hint.T00614("")); } catch (Exception ex) { HandleError(ex); } }
/// <summary> /// 刪除檢驗資料 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void gvToolReport_RowDeleting(object sender, GridViewDeleteEventArgs e) { try { int index = gvToolReport.Rows[e.RowIndex].DataItemIndex; var removeData = _ToolReports[index]; TransactionStamp txnStamp = new TransactionStamp(User.Identity.Name, ProgramRight, ProgramRight, ApplicationName); using (var cts = CimesTransactionScope.Create()) { removeData.DeleteFromDB(); LogCenter.LogToDB(removeData, LogCenter.LogIndicator.Create(ActionType.Remove, txnStamp.UserID, txnStamp.RecordTime)); cts.Complete(); } //重新取得資料 GetToolReport(_CurrentToolName); } catch (Exception ex) { HandleError(ex); } }
protected void gvQuery_RowDeleting(object sender, GridViewDeleteEventArgs e) { try { int iIndex = gvQuery.Rows[e.RowIndex].DataItemIndex; //避免新增未按下儲存就按其他資料的編輯 string SID, Tag; if (ToolTypeList[iIndex].ActiveFlag == "T") //ActiveFlag的判斷,若曾經啟用過則不可刪除 { removeListAddandDeletRow(); gvQuery.SetDataSource(ToolTypeList); gvQuery.DataBind(); throw new Exception(TextMessage.Error.T00714()); } else { // Delete Data SID = ToolTypeList[iIndex].ID; //避免若新增模式時,按下刪除的button,不作動作 if (SID.Length == 0) { return; } using (CimesTransactionScope cts = CimesTransactionScope.Create()) { if (ToolTypeList[iIndex].DeleteFromDB() == 0) { throw new Exception(TextMessage.Error.T00710("")); } AttributeAttributeInfo.DeleteByObjectSIDAndDataClass(SID, "ToolTypeAttribute", this.User.Identity.Name, DBCenter.GetSystemTime()); cts.Complete(); } _ProgramInformationBlock.ShowMessage(TextMessage.Hint.T00349(ToolTypeList[iIndex].Type)); ToolTypeList.RemoveAt(iIndex); removeListAddandDeletRow(); gvQuery.SetDataSource(ToolTypeList); gvQuery.EditItemIndex = -1; if (gvQuery.CurrentPageIndex > ((ToolTypeList.Count - 1) / gvQuery.PageSize)) { gvQuery.CurrentPageIndex = (ToolTypeList.Count - 1) / gvQuery.PageSize; } gvQuery.DataBind(); DisableSubControl(); uscAttributeSetupGrid.ClearField(); } } catch (Exception ex) { HandleError(ex, CurrentUpdatePanel, string.Empty, MessageShowOptions.OnLabel); } }
private void InsertToolType(int rowIndex) { int index = gvQuery.Rows[rowIndex].DataItemIndex; ArrayList SaveList = new ArrayList(); string sToolType = ((TextBox)gvQuery.Rows[rowIndex].FindControl("ttbType")).Text; RadioButton rbtEnable = (RadioButton)gvQuery.Rows[rowIndex].FindControl("rbEnable"); TextBox ttbDescr = (TextBox)gvQuery.Rows[rowIndex].FindControl("ttbDescription"); //檢查是否有相同名稱存在的資料 sql = "SELECT 1 FROM MES_TOOL_TYPE WHERE TYPE = #[STRING]"; DataView dvCheck = DBCenter.GetDataTable(sql, sToolType).DefaultView;// Query.DoQuery(sql); if (dvCheck != null && dvCheck.Count > 0) { throw new Exception(TextMessage.Error.T00710(sToolType)); } uscAttributeSetupGrid.ValidateCheck(); //新增資料庫 ToolTypeInfo toolTypeData = InfoCenter.Create <ToolTypeInfo>(); toolTypeData.Type = sToolType; toolTypeData.Description = ttbDescr.Text; toolTypeData["TOOLCLASS"] = "CUTTER"; toolTypeData["UPDATETIME"] = DBCenter.GetSystemTime(); toolTypeData["USERID"] = this.User.Identity.Name; if (rbtEnable.Checked == true) { toolTypeData.Status = "Enable"; toolTypeData.ActiveFlag = "T"; } else { toolTypeData.Status = "Disable"; toolTypeData.ActiveFlag = "F"; } //儲存系統屬性 _SystemAttribute.SaveSystemAttribute(toolTypeData); TransactionStamp txnStamp = new TransactionStamp(User.Identity.Name, ProgramRight, ProgramRight, this.ApplicationName); using (CimesTransactionScope cts = CimesTransactionScope.Create()) { toolTypeData.InsertToDB(); uscAttributeSetupGrid.ExcuteTransaction(toolTypeData.ID); //儲存刀壽 SaveToolLife(sToolType, txnStamp.UserID, txnStamp.RecordTime); //儲存刀具圖檔 SaveToolPicture(sToolType, txnStamp.UserID, txnStamp.RecordTime); cts.Complete(); } _ProgramInformationBlock.ShowMessage(TextMessage.Hint.T00695(sToolType)); ToolTypeList[index] = toolTypeData; }
protected void btnOK_Click(object sender, EventArgs e) { try { EquipmentInfo equipmentData = EquipmentInfo.GetEquipmentByName(mEQP.EquipmentName); if (mEQP.Tag != equipmentData.Tag) { throw new RuleCimesException(TextMessage.Error.T00747("")); } string EqpID = ciEquipment.Must(lblEquipment); string Reason = csReason.Must(lblReasonCode).Value; EquipmentStateInfo equipmentState = EquipmentStateInfo.GetEquipmentStateByState(ddlNewState.Must(lblNewState).Text); var txnStamp = new TransactionStamp(User.Identity.Name, ProgramRight, ProgramRight, this.ApplicationName); var rcData = csReason.GetBusinessReason().CategoryReason; txnStamp.CategoryReasonCode = rcData; txnStamp.Description = ttbDesc.Text.Trim(); #region 檢查是否有設定機台變更狀態警報,若有,則發送警報 //使用Function取得ALM設定,可彈性使用 //取得機台狀態警報設定,預設是抓取系統資料設定[EquipStateAlarm] AlarmTypeInfo AlarmType = RuleExtendManager.GetEquipmentChangeStateAlarm(equipmentData, ddlNewState.Must(lblNewState).Text); string ALMsg = @"[Subject:{0}][Content:{1}:{2}; {3}:{4}; {5}:{6}; {7}:{8}; {9}:{10}]"; if (AlarmType != null) { // "[Content:TEST][Subject:TEST]" ALMsg = string.Format(ALMsg, ProgramInformationBlock1.Caption, lblEquipment.Text, mEQP.EquipmentName, lblOldState.Text, mEQP.CurrentState, lblNewState.Text, equipmentState.State, lblReasonCode.Text, rcData.Reason, lblDescription.Text, txnStamp.Description); } #endregion using (var cts = CimesTransactionScope.Create()) { EMSTransaction.ChangeState(equipmentData, equipmentState, txnStamp); RuleExtendManager.EquipmentTxnEnd(equipmentData); cts.Complete(); } #region 發送警報 if (AlarmType != null) { AlarmService WebServiceALM = new AlarmService(); string url = "http://" + Request.Url.Host + Request.ApplicationPath + "/ALM/Services/AlarmService.asmx"; WebServiceALM.Url = url; string ReturnMsg = WebServiceALM.LaunchAlarm(AlarmType.GroupRights, AlarmType.TYPE, ALMsg, txnStamp.RecordTime, "UI", User.Identity.Name); } #endregion Response.Redirect(ciMes.Security.UserSetting.GetPreviousListPage(this), false); } catch (Exception ex) { HandleError(ex); } }
/// <summary> /// 確認 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void btnOK_Click(object sender, EventArgs e) { try { TransactionStamp txnStamp = new TransactionStamp(User.Identity.Name, ProgramRight, ProgramRight, ApplicationName); //確認是否輸入刀具零組件 ttbToolName.Must(lblToolName); //確認是否選擇報廢原因 ddlReason.Must(lblReason); using (var cts = CimesTransactionScope.Create()) { var newStateInfo = ToolStateInfo.GetToolStateByState("SCRAP"); if (newStateInfo == null) { //刀具零組件狀態: {0}不存在,請至配件狀態維護新增此狀態!! throw new Exception(RuleMessage.Error.C10149("SCRAP")); } //因刀具報表需求,所以在報廢時要將使用次數記錄在UDC07 var toolLifeList = CSTToolLifeInfo.GetToolLifeByToolNmae(_ToolData.ToolName); var toolLifeData = toolLifeList.Find(p => p.Head == _ToolData.Head); TMSTransaction.ModifyToolSystemAttribute(_ToolData, "USERDEFINECOL07", toolLifeData.UseCount.ToCimesString(), txnStamp); //變更刀具 GROUPID TMSTransaction.ModifyToolSystemAttribute(_ToolData, "GROUPID", "", txnStamp); //變更IDENTITY為報廢品 TMSTransaction.ModifyToolSystemAttribute(_ToolData, "IDENTITY", "報廢品", txnStamp); //變更狀態為SCRAP TMSTransaction.ChangeToolState(_ToolData, newStateInfo, txnStamp); //註記原因碼 var reasonCategory = InfoCenter.GetBySID <ReasonCategoryInfo>(ddlReason.SelectedValue); txnStamp.CategoryReasonCode = reasonCategory; txnStamp.Description = ""; //備註 TMSTransaction.AddToolComment(_ToolData, txnStamp); cts.Complete(); } ClearField(); AjaxFocus(ttbToolName); _ProgramInformationBlock.ShowMessage(TextMessage.Hint.T00614("")); } catch (Exception ex) { HandleError(ex); } }
protected void btnTempSave_Click(object sender, EventArgs e) { try { if (_DeviceName.IsNullOrEmpty()) { throw new RuleCimesException(TextMessage.Error.T00826(lblDeviceName.Text)); } if (_PackingList.Count == 0 && _RelativePackingList.Count == 0) { throw new RuleCimesException(TextMessage.Error.T00826(lblWorkpiece.Text)); } var txnStamp = new TransactionStamp(User.Identity.Name, ProgramRight, ProgramRight, ApplicationName); using (var cts = CimesTransactionScope.Create()) { //刪除舊的資料 if (!_BatchID.IsNullOrEmpty()) { DBCenter.ExecuteParse("DELETE CST_WIP_PACK_TEMP WHERE BATCHID = #[STRING]", _BatchID); } //產生新的批次ID _BatchID = DBCenter.GetSystemID(); _PackingList.ForEach(p => { var tempInfo = InfoCenter.Create <CSTWIPPackTempInfo>(); tempInfo.DeviceName = _DeviceName; tempInfo.ComponentID = p.ComponentID; tempInfo.SIDE = "L"; tempInfo.BatchID = _BatchID; tempInfo.InsertToDB(txnStamp.UserID, txnStamp.RecordTime); }); _RelativePackingList.ForEach(p => { var tempInfo = InfoCenter.Create <CSTWIPPackTempInfo>(); tempInfo.DeviceName = _RelativeDeviceName; tempInfo.ComponentID = p.ComponentID; tempInfo.SIDE = "R"; tempInfo.BatchID = _BatchID; tempInfo.InsertToDB(txnStamp.UserID, txnStamp.RecordTime); }); //工時 _UserWorkTimeList.ForEach(p => { p.InsertToDB(txnStamp.UserID, txnStamp.RecordTime); }); _UserWorkTimeList.Clear(); cts.Complete(); } ProgramInformationBlock1.ShowMessage(TextMessage.Hint.T00057(GetUIResource("TempSave"))); } catch (Exception ex) { HandleError(ex); } }
protected void btnOK_Click(object sender, EventArgs e) { try { var reasonCategory = ReasonCategoryInfo.GetReasonCategoryByCategoryNameAndReason("CustomizeReason", "ManualMerge"); if (reasonCategory == null) { //[00030]{0}:{1}不存在! throw new CimesException(TextMessage.Error.T00030(GetUIResource("ReasonCode"), "CustomizeReason- ManualMerge")); } var baseLot = _LotDatas.Find(p => p.Status == "WaitMerge"); // 定義交易戳記 var txnStamp = new TransactionStamp(User.Identity.Name, ProgramRight, ProgramRight, ApplicationName); using (var cts = CimesTransactionScope.Create()) { //拆批 var split = SplitLotInfo.CreateSplitLotByLotAndQuantity(baseLot.Lot, baseLot.WorkOrderLot, 0, 0, reasonCategory, ""); var splitIndicator = WIPTxn.SplitIndicator.Create(); WIPTxn.Default.SplitLot(baseLot, split, splitIndicator, txnStamp); //再取一次批號資訊 var newLot = LotInfo.GetLotByLot(split.Lot); //併批與子單元 List <MergeLotInfo> mergeLotList = new List <MergeLotInfo>(); _LotDatas.ForEach(mergelot => { var lstCompData = mergelot.GetLotAllComponents(); var mergeLot = MergeLotInfo.GetMergeLotByLotAndQuantity(mergelot.Lot, lstCompData, reasonCategory, ""); mergeLotList.Add(mergeLot); }); WIPTransaction.MergeLot(newLot, mergeLotList, txnStamp); //再取一次批號資訊 var newMergeLot = LotInfo.GetLotByLot(split.Lot); //將批號狀態變更為wait WIPTransaction.ModifyLotSystemAttribute(newMergeLot, "STATUS", LotDefaultStatus.Wait.ToCimesString(), txnStamp); //將COMPLOT、PROCESS_EQUIP欄位清空,因為這個時間點這個欄位已經沒意義了 WIPTransaction.ModifyLotSystemAttribute(newMergeLot, "COMPLOT", string.Empty, txnStamp); WIPTransaction.ModifyLotSystemAttribute(newMergeLot, "PROCESS_EQUIP", string.Empty, txnStamp); //Dispatch到下一站 WIPTransaction.DispatchLot(newMergeLot, txnStamp); cts.Complete(); } ClearField(); ttbWorkOrderLot.Text = ""; AjaxFocus(ttbWorkOrderLot); _ProgramInformationBlock.ShowMessage(TextMessage.Hint.T00614("")); } catch (Exception ex) { HandleError(ex); } }
protected void btnCopy_Click(object sender, EventArgs e) { try { //取得登入者資訊 var recordTime = DBCenter.GetSystemTime(); var userID = User.Identity.Name; //確認目標料號及機台編號是否已經存在資料 var toolDevices = CSTToolDeviceInfo.GetDataListByDeviceAndEquipmantName(ddlDevice.SelectedItem.Value, ddlEquipment.SelectedItem.Value); if (toolDevices.Count > 0) { //料號({0})及機台({1}) 資料已存在,不可執行複製動作! throw new Exception(RuleMessage.Error.C10117(ddlDevice.SelectedItem.Value, ddlEquipment.SelectedItem.Value)); } using (var cts = CimesTransactionScope.Create()) { //新增一筆CST_TOOL_DEVICE資料 var toolDevice = InfoCenter.Create <CSTToolDeviceInfo>(); toolDevice.DeviceName = ddlDevice.SelectedItem.Value; toolDevice.EquipmentName = ddlEquipment.SelectedItem.Value; toolDevice.Tag = 1; toolDevice.InsertToDB(userID, recordTime); LogCenter.LogToDB(toolDevice, LogCenter.LogIndicator.Create(ActionType.Add, userID, recordTime)); //複製CST_TOOL_DEVICE_DETAIL資料 _ToolDeviceDetails.ForEach(toolDeviceDetail => { var newToolDeviceDetail = InfoCenter.Create <CSTToolDeviceDetailInfo>(); newToolDeviceDetail.EquipmentName = toolDevice.EquipmentName; newToolDeviceDetail.Quantity = toolDeviceDetail.Quantity; newToolDeviceDetail.DeviceName = toolDevice.DeviceName; newToolDeviceDetail.ToolType = toolDeviceDetail.ToolType; newToolDeviceDetail.ToolDeviceSID = toolDevice.ToolDeviceSID; newToolDeviceDetail.InsertToDB(); LogCenter.LogToDB(newToolDeviceDetail, LogCenter.LogIndicator.Create(ActionType.Add, userID, recordTime)); }); cts.Complete(); } //INF-00002:{0}儲存成功! _ProgramInformationBlock.ShowMessage(TextMessage.Hint.T00083(""), MessageShowOptions.OnLabel); LoadControlDefault(); } catch (Exception E) { HandleError(E); } }
/// <summary> /// 確定 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void btnOK_Click(object sender, EventArgs e) { try { TransactionStamp txnStamp = new TransactionStamp(User.Identity.Name, ProgramRight, ProgramRight, ApplicationName); //檢查機台/序號是否有輸入 ttbEquipOrCompLot.Must(lblEquipOrCompLot); using (var cts = CimesTransactionScope.Create()) { string equipmentState = "Wait" + _QCType; #region 更新機台狀態為WaitFAI //只有FAI需要變更機台狀態,如果QCType參數為PPK或PQC,則不需更新機台狀態 if (_QCType.Equals(CustomizeFunction.QCType.FAI.ToCimesString())) { //取得機台狀態資料 var newStateInfo = EquipmentStateInfo.GetEquipmentStateByState(equipmentState); if (newStateInfo == null) { //C00028 無機台狀態{0}的設定資料! throw new CimesException(RuleMessage.Error.C00028(equipmentState)); } //更新機台狀態 EMSTransaction.ChangeState(_EquipData, newStateInfo, txnStamp); } #endregion #region 更新單號狀態為WaitFAI/WaitPPK foreach (DataRow dr in _QCTable.Rows) { var qcInspectionData = InfoCenter.GetBySID <QCInspectionInfo>(dr["QCINSPSID"].ToString()).ChangeTo <QCInspectionInfoEx>(); qcInspectionData.Status = equipmentState; qcInspectionData.ReceiveTime = txnStamp.RecordTime; qcInspectionData.ReceiveUser = txnStamp.UserID; qcInspectionData.UpdateToDB(txnStamp.UserID, txnStamp.RecordTime); } #endregion cts.Complete(); } ClearField(); AjaxFocus(ttbEquipOrCompLot); _ProgramInformationBlock.ShowMessage(TextMessage.Hint.T00614("")); } catch (Exception ex) { HandleError(ex); } }
/// <summary> /// 確定 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void btnOK_Click(object sender, EventArgs e) { try { TransactionStamp txnStamp = new TransactionStamp(User.Identity.Name, ProgramRight, ProgramRight, ApplicationName); //檢查機台是否有輸入 ttbEquipOrCompLot.Must(lblEquipOrCompLot); //確認是否有勾選資料 if (SelectedData() == false) { // [00816]請至少選取一個{0}! throw new Exception(TextMessage.Error.T00816(GetUIResource("SN"))); } using (var cts = CimesTransactionScope.Create()) { #region 更新單號狀態為PPK for (int i = 0; i < gvQC.Rows.Count; i++) { var thisCheckBox = (CheckBox)gvQC.Rows[i].FindControl("ckbSelect"); //只有勾選的資料才要更新單號狀態 if (thisCheckBox.Checked) { DataRow dr = _QCTable.Rows[i]; var qcInspectionData = InfoCenter.GetBySID <QCInspectionInfo>(dr["QCINSPSID"].ToString()).ChangeTo <QCInspectionInfoEx>(); qcInspectionData.Status = _QCType; qcInspectionData.StartTime = DBCenter.GetSystemTime(); qcInspectionData.StartUser = txnStamp.UserID; qcInspectionData.UpdateToDB(txnStamp.UserID, txnStamp.RecordTime); } } #endregion cts.Complete(); } ClearField(); AjaxFocus(ttbEquipOrCompLot); _ProgramInformationBlock.ShowMessage(TextMessage.Hint.T00614("")); } catch (Exception ex) { HandleError(ex); } }
/// <summary> /// 退回 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void btnReject_Click(object sender, EventArgs e) { try { TransactionStamp txnStamp = new TransactionStamp(User.Identity.Name, ProgramRight, ProgramRight, ApplicationName); //檢查機台/序號是否有輸入 ttbEquipOrCompLot.Must(lblEquipOrCompLot); string status = "ToBeSent" + _QCType; using (var cts = CimesTransactionScope.Create()) { #region 更新單號狀態為ToBeSentFAI及設置PASSFLAG = N foreach (DataRow dr in _QCTable.Rows) { var qcInspectionData = InfoCenter.GetBySID <QCInspectionInfo>(dr["QCINSPSID"].ToString()).ChangeTo <QCInspectionInfoEx>(); qcInspectionData.Status = status; qcInspectionData.PassFlag = "N"; qcInspectionData.QCRejectTime = txnStamp.RecordTime; qcInspectionData.QCRejectUser = txnStamp.UserID; qcInspectionData.UpdateToDB(txnStamp.UserID, txnStamp.RecordTime); } #endregion #region 更新機台狀態 //取得機台狀態資料 var newStateInfo = EquipmentStateInfo.GetEquipmentStateByState(status); if (newStateInfo == null) { //C00028 無機台狀態{0}的設定資料! throw new CimesException(RuleMessage.Error.C00028(status)); } //更新機台狀態 EMSTransaction.ChangeState(_EquipData, newStateInfo, txnStamp); #endregion cts.Complete(); } ClearField(); AjaxFocus(ttbEquipOrCompLot); _ProgramInformationBlock.ShowMessage(TextMessage.Hint.T00614("")); } catch (Exception ex) { HandleError(ex); } }
protected void btnOK_Click(object sender, EventArgs e) { try { if (_ProcessLot == null) { throw new RuleCimesException(TextMessage.Error.T00826(lblUnPackingInventoryLot.Text)); } // 定義交易戳記 var txnStamp = new TransactionStamp(User.Identity.Name, ProgramRight, ProgramRight, ApplicationName); using (var cts = CimesTransactionScope.Create()) { // 將入庫批取消完工 WIPTransaction.UndoFinish(_ProcessLot, txnStamp); var unPackingLot = LotInfo.GetLotByLot(ttbBoxNo.Text.Trim()); // 取得拆包Component var lstUnPackingComp = unPackingLot.GetLotAllComponents(); // 將轉為子單元的批號還原,例如可使用於拆包 var txn = WIPTxn.Default.ConvertToLot(unPackingLot, lstUnPackingComp, txnStamp); txn.LotList.ForEach(lot => { //寫入WMSMaster & Detail var wmsMaster = CSTWMSMastInfo.GetMaterialLotDataByMaterialLot(lot["INVLOT"].ToString()); if (wmsMaster == null) { wmsMaster = InfoCenter.Create <CSTWMSMastInfo>(); wmsMaster.Lot = lot["INVLOT"].ToString(); wmsMaster.DeviceName = lot.DeviceName; wmsMaster.RuleName = txnStamp.RuleName; wmsMaster.InsertToDB(txnStamp.UserID, txnStamp.RecordTime); } //理論上只會有一個Comp lot.GetLotAllComponents().ForEach(comp => { var wmsDetail = InfoCenter.Create <CSTWMSDetailInfo>(); wmsDetail.Lot = lot["INVLOT"].ToString(); wmsDetail.ComponentID = comp.ComponentID; wmsDetail.Quantity = comp.ComponentQuantity; wmsDetail.InsertToDB(txnStamp.UserID, txnStamp.RecordTime); }); WIPTransaction.TerminateLot(lot, txnStamp); }); cts.Complete(); } // 返回定義的預設網頁 ReturnToPortal(); } catch (Exception ex) { HandleError(ex); } }
/// <summary> /// 確認 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void btnOK_Click(object sender, EventArgs e) { try { TransactionStamp txnStamp = new TransactionStamp(User.Identity.Name, ProgramRight, ProgramRight, ApplicationName); //確認是否輸入刀具零組件 ttbToolName.Must(lblToolName); //確認是否有選擇變更回廠日 var date = ttbDate.MustDate(lblDate); //取得系統時間 var sysDate = Convert.ToDateTime(DBCenter.GetSystemDateTime().ToString("yyyy/MM/dd")); //確認預定回廠日是否大於等於當天日期 if (date < sysDate) { //變更回廠日必須大於等於{0} ! throw new Exception(RuleMessage.Error.C10170(sysDate.ToString("yyyy/MM/dd"))); } using (var cts = CimesTransactionScope.Create()) { #region 更新[CST_TOOL_REPAIR]的預計回廠日 _ToolRepairData.EstimateDateOfReturn = ttbDate.Text; _ToolRepairData.UpdateToDB(txnStamp.UserID, txnStamp.RecordTime); //新增一筆[CST_TOOL_REPAIR_LOG] LogCenter.LogToDB(_ToolRepairData, LogCenter.LogIndicator.Create(ActionType.Set, txnStamp.UserID, txnStamp.RecordTime)); #endregion //預定回廠日 TMSTransaction.ModifyToolSystemAttribute(_ToolData, "USERDEFINECOL04", ttbDate.Text, txnStamp); cts.Complete(); } ClearField(); AjaxFocus(ttbToolName); _ProgramInformationBlock.ShowMessage(TextMessage.Hint.T00614("")); } catch (Exception ex) { HandleError(ex); } }
private void UpdateToolType(int rowIndex) { int index = gvQuery.Rows[rowIndex].DataItemIndex; string sToolType = ((TextBox)gvQuery.Rows[rowIndex].FindControl("ttbType")).Text; RadioButton rbtEnable = (RadioButton)gvQuery.Rows[rowIndex].FindControl("rbEnable"); TextBox ttbDescr = (TextBox)gvQuery.Rows[rowIndex].FindControl("ttbDescription"); uscAttributeSetupGrid.ValidateCheck(); var toolTypeData = (ToolTypeInfo)ToolTypeList[index].DeepCopy(); toolTypeData.Description = ttbDescr.Text; toolTypeData["UPDATETIME"] = DBCenter.GetSystemTime(); toolTypeData["USERID"] = Page.User.Identity.Name; if (rbtEnable.Checked == true) { toolTypeData.Status = "Enable"; toolTypeData.ActiveFlag = "T"; } else { toolTypeData.Status = "Disable"; } //儲存系統屬性 _SystemAttribute.SaveSystemAttribute(toolTypeData); TransactionStamp txnStamp = new TransactionStamp(User.Identity.Name, ProgramRight, ProgramRight, this.ApplicationName); using (CimesTransactionScope cts = CimesTransactionScope.Create()) { if (toolTypeData.UpdateToDB() == 0) { throw new Exception(TextMessage.Error.T00747("")); } uscAttributeSetupGrid.ExcuteTransaction(toolTypeData.ID, toolTypeData.UserID, toolTypeData.UpdateTime); //處理刀壽 SaveToolLife(sToolType, txnStamp.UserID, txnStamp.RecordTime); //儲存刀具圖檔 SaveToolPicture(sToolType, txnStamp.UserID, txnStamp.RecordTime); cts.Complete(); } _ProgramInformationBlock.ShowMessage(TextMessage.Hint.T00083(sToolType)); ToolTypeList[index] = toolTypeData; }
/// <summary> /// 確認 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void btnOK_Click(object sender, EventArgs e) { try { TransactionStamp txnStamp = new TransactionStamp(User.Identity.Name, ProgramRight, ProgramRight, ApplicationName); using (var cts = CimesTransactionScope.Create()) { if (_SelectLotDatas.Count > 0) { _SelectLotDatas.ForEach(lot => { //將勾選的入庫資料塞到ERP TEMP表 To do... //將入庫單號回寫到INVNO WIPTransaction.ModifyLotSystemAttribute(lot, "INVNO", ttbScrapNo.Text, txnStamp); //將勾選的批號結批 WIPTransaction.TerminateLot(lot, txnStamp); }); #region 更新命名規則 if (_ExecuteNamingSQLList != null && _ExecuteNamingSQLList.Count > 0) { DBCenter.ExecuteSQL(_ExecuteNamingSQLList); } #endregion cts.Complete(); } else { //[00816]請至少選取一個{0}! throw new Exception(TextMessage.Error.T00816(GetUIResource("WorkpieceLot"))); } } ClearField(); _ProgramInformationBlock.ShowMessage(TextMessage.Hint.T00614("")); } catch (Exception ex) { HandleError(ex); } }
/// <summary> /// 確認 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void btnOK_Click(object sender, EventArgs e) { try { TransactionStamp txnStamp = new TransactionStamp(User.Identity.Name, ProgramRight, ProgramRight, ApplicationName); //確認模具是否有輸入 ttbToolName.Must(lblToolName); //確認機台是否有輸入 ttbEquip.Must(lblEquip); using (var cts = CimesTransactionScope.Create()) { //配件上機台 TMSTxn.Default.AddToolToEquipment(new List <ToolInfo>() { _ToolData }, _EquipData, txnStamp); var newStateInfo = ToolStateInfo.GetToolStateByState("USED"); if (newStateInfo == null) { // 模治具狀態:{0}不存在!! throw new Exception(RuleMessage.Error.C10032("USED")); } //變更配件狀態為USED TMSTransaction.ChangeToolState(_ToolData, newStateInfo, txnStamp); cts.Complete(); } ClearField(); AjaxFocus(ttbToolName); _ProgramInformationBlock.ShowMessage(TextMessage.Hint.T00614("")); } catch (Exception ex) { HandleError(ex); } }
/// <summary> /// 確認 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void btnOK_Click(object sender, EventArgs e) { try { TransactionStamp txnStamp = new TransactionStamp(User.Identity.Name, ProgramRight, ProgramRight, ApplicationName); //確認模具是否有輸入 ttbToolName.Must(lblToolName); using (var cts = CimesTransactionScope.Create()) { #region 變更配件狀態為IDLE var newStateInfo = ToolStateInfo.GetToolStateByState("IDLE"); if (newStateInfo == null) { // 模具狀態:{0}不存在!! throw new Exception(RuleMessage.Error.C10027("IDLE")); } TMSTransaction.ChangeToolState(_ToolData, newStateInfo, txnStamp); #endregion //將配件上的鉗修次數重置成0 (MES_TOOL_MAST. USERDEFINECOL01) TMSTransaction.ModifyToolSystemAttribute(_ToolData, "USERDEFINECOL01", "0", txnStamp); //將配件上的降模次數重置成0 (MES_TOOL_MAST. USERDEFINECOL02) TMSTransaction.ModifyToolSystemAttribute(_ToolData, "USERDEFINECOL02", "0", txnStamp); cts.Complete(); } ClearField(); AjaxFocus(ttbToolName); _ProgramInformationBlock.ShowMessage(TextMessage.Hint.T00614("")); } catch (Exception ex) { HandleError(ex); } }
/// <summary> /// 系統事件 : btnPrint Click時觸發 /// 將產生的ReportDocument 匯出成為PDF格式的檔案 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void btnPrint_Click(object sender, EventArgs e) { try { if (toolData == null) { throw new Exception(TextMessage.Error.T00060("")); } _dsReport.Tables.Clear(); // 取得Report資料 _dsReport = GetRunCardDataSource(toolData); _dsReport.AcceptChanges(); TransactionStamp txnStamp = new TransactionStamp(User.Identity.Name, ProgramRight, ProgramRight, ApplicationName); using (var cts = CimesTransactionScope.Create()) { var printLotInfo = InfoCenter.Create <CSTToolLabelPrintLogInfo>(); printLotInfo.ToolName = toolData.ToolName; printLotInfo.RuleName = ProgramRight; printLotInfo.InsertToDB(txnStamp.UserID, txnStamp.RecordTime); cts.Complete(); } if (_dsReport.Tables.Count > 0) { string sPrintProgram = "/CustomizeRule/ToolRule/T022View.aspx"; string sHost = Request.Url.Host; string sApplicationPath = Request.ApplicationPath; string ReportPath = "http://" + sHost + sApplicationPath + sPrintProgram; Session["T022View"] = _dsReport; //開啟查詢工單頁面 string openPrintWindow = "window.open('" + ReportPath + "','pop','resizable: yes; status: no; scrollbars:no; menubar:no;toolbar:no;location:no;dialogLeft:10px;dialogTop:10px;dialogHeight:10px;dialogWidth:10px',false);"; ScriptManager.RegisterStartupScript(UpdatePanel1, UpdatePanel1.GetType(), Guid.NewGuid().ToString(), openPrintWindow, true); } } catch (Exception E) { HandleError(E); } }
protected void gvQuery_RowDeleting(object sender, GridViewDeleteEventArgs e) { try { int dataIndex = gvQuery.Rows[e.RowIndex].DataItemIndex; //取得登入者資訊 var recordTime = DBCenter.GetSystemTime(); var userID = User.Identity.Name; using (CimesTransactionScope cts = CimesTransactionScope.Create()) { //刪除主檔資料 _ToolDevices[dataIndex].DeleteFromDB(); LogCenter.LogToDB(_ToolDevices[dataIndex], LogCenter.LogIndicator.Create(ActionType.Remove, userID, recordTime)); //取得明細資料 var toolDeviceDetails = CSTToolDeviceDetailInfo.GetDataListByToolDeviceSID(_ToolDevices[dataIndex].ToolDeviceSID); toolDeviceDetails.ForEach(toolDeviceDetail => { //刪除明細資料 toolDeviceDetail.DeleteFromDB(); LogCenter.LogToDB(toolDeviceDetail, LogCenter.LogIndicator.Create(ActionType.Remove, userID, recordTime)); }); cts.Complete(); } QueryData(); } catch (Exception E) { HandleError(E); } }
protected void btnOK_Click(object sender, EventArgs e) { try { // 子單元不存在拋錯 if (_ComponentInfo == null) { throw new RuleCimesException(TextMessage.Error.T00045(GetUIResource("Component"))); } // 批號不存在拋錯 if (ProcessLotData == null) { throw new RuleCimesException(TextMessage.Error.T00045(GetUIResource("Lot"))); } // 批號狀態必須為Wait if (ProcessLotData.Status != "Wait") { throw new RuleCimesException(TextMessage.Error.T00424()); } // 原因碼 ddlDefectReason.Must(lblDefectReason); var txnStamp = new TransactionStamp(User.Identity.Name, ProgramRight, ProgramRight, ApplicationName); using (var cts = CimesTransactionScope.Create()) { //取得原因碼資訊 var reasonData = InfoCenter.GetBySID <ReasonCategoryInfo>(ddlDefectReason.SelectedValue); //取得不良子批批號名稱 var splitLotNaming = GetNamingRule("SplitLot", txnStamp.UserID, ProcessLotData); //批號拆子批 var splitLot = SplitLotInfo.CreateSplitLotByLotAndQuantity(ProcessLotData.Lot, splitLotNaming.First[0], new List <ComponentInfo>() { _ComponentInfo }, reasonData, reasonData.Description); WIPTxn.Default.SplitLot(ProcessLotData, splitLot, WIPTxn.SplitIndicator.Create(), txnStamp); if (splitLotNaming.Second != null && splitLotNaming.Second.Count != 0) { DBCenter.ExecuteSQL(splitLotNaming.Second); } //註記不良 var compDefect = ComponentDefectObject.Create(_ComponentInfo, _ComponentInfo.ComponentQuantity, 0, reasonData, ttbDefectDesc.Text.Trim()); WIPTransaction.DefectComponent(splitLot, new List <ComponentDefectObject>() { compDefect }, WIPTransaction.DefectIndicator.Create(), txnStamp); #region 送至待判工作站 //取得目前批號的流程線上版本 RouteVersionInfo RouteVersion = RouteVersionInfo.GetRouteActiveVersion(ProcessLotData.RouteName); //以目前工作站名稱去查詢在所有流程中的序號 var routeOperation = RouteOperationInfo.GetRouteAllOperations(RouteVersion).Find(p => p.OperationName == _JudgeOperationName); //以目前工作站名稱去查詢在所有流程中的序號 var reasonCategory = ReasonCategoryInfo.GetReasonCategoryByCategoryNameAndReason("Common", "OTHER"); var modifyAttrList = new List <ModifyLotAttributeInfo>(); //將批號的UDC01註記不良批 modifyAttrList.Add(ModifyLotAttributeInfo.CreateLotSystemAttributeInfo("USERDEFINECOL01", "Y")); //將批號的UDC02註記工作站序號 modifyAttrList.Add(ModifyLotAttributeInfo.CreateLotSystemAttributeInfo("USERDEFINECOL02", splitLot.OperationSequence)); //將批號的UDC03註記工作站名稱 modifyAttrList.Add(ModifyLotAttributeInfo.CreateLotSystemAttributeInfo("USERDEFINECOL03", splitLot.OperationName)); WIPTransaction.ModifyLotMultipleAttribute(splitLot, modifyAttrList, txnStamp); WIPTransaction.ReassignOperation(splitLot, routeOperation, reasonCategory, reasonCategory.Description, txnStamp); #endregion cts.Complete(); } LoadDefaultControl(); ClearField(); ttbWOLot.Text = ""; AjaxFocus(ttbWOLot); _ProgramInformationBlock.ShowMessage(TextMessage.Hint.T00614("")); } catch (Exception ex) { HandleError(ex); } }
protected void btnOK_Click(object sender, EventArgs e) { try { // 子單元不存在拋錯 if (ComponentInfo == null) { throw new RuleCimesException(TextMessage.Error.T00045(GetUIResource("Component"))); } // 批號不存在拋錯 if (ProcessLotData == null) { throw new RuleCimesException(TextMessage.Error.T00045(GetUIResource("Lot"))); } // 定義交易戳記 var txnStamp = new TransactionStamp(User.Identity.Name, ProgramRight, ProgramRight, ApplicationName); using (var cts = CimesTransactionScope.Create()) { bool inSpec = true; if (_CenterHoleFlag != "N") { gvComponentEDC.Rows.LoopDo <GridViewRow>((p, i) => { // 取得TextBox Control var ttbEDC = p.FindControl("ttbEDC") as TextBox; if (ttbEDC.Text.IsNullOrEmpty()) { throw new RuleCimesException(TextMessage.Error.T00043(GetUIResource("CenterHoleData"))); } // 是否符合規格判斷 var measureVal = ttbEDC.Text.ToDecimal(); if (measureVal > SAICenterHole.Remark02.ToDecimal()) { inSpec = false; } if (measureVal < SAICenterHole.Remark03.ToDecimal()) { inSpec = false; } // 將量測資料記錄到客製表 var edcCompInfo = InfoCenter.Create <CSTEDCComponentInfo>(); edcCompInfo.ComponentID = ComponentInfo.ComponentID; edcCompInfo.Data = measureVal; edcCompInfo.UpSpecification = SAICenterHole.Remark02.ToDecimal(); edcCompInfo.LowSpecification = SAICenterHole.Remark03.ToDecimal(); edcCompInfo.INSPEC = inSpec == true ? "OK" : "NG"; edcCompInfo.Lot = ProcessLotData.Lot; edcCompInfo["LINKSID"] = txnStamp.LinkSID; edcCompInfo["PARAMETER"] = "SC" + (i + 1).ToString(); edcCompInfo.InsertToDB(txnStamp.UserID, txnStamp.RecordTime); }); } if (!ttbTemperature.Text.IsNullOrEmpty()) { // 溫度必須是數值 ttbTemperature.MustDecimal(lblTemperature); // 將量測資料記錄到客製表 var edcCompInfo = InfoCenter.Create <CSTEDCComponentInfo>(); edcCompInfo.ComponentID = ComponentInfo.ComponentID; edcCompInfo.Data = ttbTemperature.Text.ToDecimal(); edcCompInfo.Lot = ProcessLotData.Lot; edcCompInfo["LINKSID"] = txnStamp.LinkSID; edcCompInfo["PARAMETER"] = "Temperature"; edcCompInfo.InsertToDB(txnStamp.UserID, txnStamp.RecordTime); } var lstCompAttr = new List <ModifyAttributeInfo>(); // 紀錄子單元量測時間 lstCompAttr.Add(ModifyAttributeInfo.CreateSystemAttributeInfo("CENTER_HOLE_TIME", txnStamp.RecordTime)); lstCompAttr.Add(ModifyAttributeInfo.CreateSystemAttributeInfo("DMC", ttbWorkpiece.Text.Trim())); if (inSpec) { // 修改子單元系統屬性 lstCompAttr.Add(ModifyAttributeInfo.CreateSystemAttributeInfo("CENTER_HOLE_FLAG", "OK")); WIPTransaction.ModifyLotComponentMultipleAttribute(ProcessLotData, ComponentInfo, lstCompAttr, txnStamp); } else { // 修改子單元系統屬性 lstCompAttr.Add(ModifyAttributeInfo.CreateSystemAttributeInfo("CENTER_HOLE_FLAG", "NG")); WIPTransaction.ModifyLotComponentMultipleAttribute(ProcessLotData, ComponentInfo, lstCompAttr, txnStamp); #region 若不在規格範圍內則拆批至待判站點 var lstSourceLot = new List <LotInfo>(); List <SqlAgent> splitLotArchiSQLList = new List <SqlAgent>(); List <ComponentInfo> lsComponentDatas = new List <ComponentInfo>(); lsComponentDatas.Add(ComponentInfo); var generator = NamingIDGenerator.GetRule("SplitLot"); if (generator == null) { //WRN-00411,找不到可產生的序號,請至命名規則維護設定,規則名稱:{0}!!! throw new Exception(TextMessage.Error.T00437("SplitLot")); } var serialData = generator.GenerateNextIDs(1, ProcessLotData, new string[] { }, User.Identity.Name); splitLotArchiSQLList = serialData.Second; var splitLotID = serialData.First[0]; var reasonCategoryInfo = ReasonCategoryInfo.GetReasonCategoryByCategoryNameAndReason("Common", "OTHER"); SplitLotInfo splitLotData = SplitLotInfo.CreateSplitLotByLotAndQuantity(ProcessLotData.Lot, splitLotID, lsComponentDatas, reasonCategoryInfo, "EDC"); WIPTxn.SplitIndicator splitInd = WIPTxn.SplitIndicator.Create(); WIPTxn.Default.SplitLot(ProcessLotData, splitLotData, splitInd, txnStamp); //若子單元為自動產生,更新序號至DB if (splitLotArchiSQLList != null && splitLotArchiSQLList.Count > 0) { DBCenter.ExecuteSQL(splitLotArchiSQLList); } #endregion var splitLotInfo = LotInfo.GetLotByLot(splitLotID); // 新增Defect List <ComponentDefectObject> lstCompDefectObj = new List <ComponentDefectObject>(); var reason = ReasonCategoryInfo.GetReasonCategoryByCategoryNameAndReason("CustomizeReason", "MeasureNG_MES"); lstCompDefectObj.Add(ComponentDefectObject.Create(ComponentInfo, 1, 0, reason, "CENTER_HOLE_FLAG:NG")); WIPTransaction.DefectComponent(splitLotInfo, lstCompDefectObj, WIPTransaction.DefectIndicator.Create(), txnStamp); #region ReassignOperation // 取得待判站點設定 var saiJudgeOperation = WpcExClassItemInfo.GetExClassItemInfo("SAIJudgeOperation", splitLotInfo["PROCESS"].ToString()); if (saiJudgeOperation.Count == 0) { throw new RuleCimesException(TextMessage.Error.T00555("SAIJudgeOperation", splitLotInfo["PROCESS"].ToString())); } var reassignOperationInfo = RouteOperationInfo.GetLotAllRouteOperations(splitLotInfo).Find(oper => oper.OperationName == saiJudgeOperation[0].Remark02); if (reassignOperationInfo == null) { throw new RuleCimesException(RuleMessage.Error.C10050()); } var lstLotAttr = new List <ModifyLotAttributeInfo>(); // 修改批號系統屬性 lstLotAttr.Add(ModifyLotAttributeInfo.CreateLotSystemAttributeInfo("USERDEFINECOL01", "Y")); lstLotAttr.Add(ModifyLotAttributeInfo.CreateLotSystemAttributeInfo("USERDEFINECOL02", splitLotInfo.OperationSequence)); lstLotAttr.Add(ModifyLotAttributeInfo.CreateLotSystemAttributeInfo("USERDEFINECOL03", splitLotInfo.OperationName)); WIPTransaction.ModifyLotMultipleAttribute(splitLotInfo, lstLotAttr, txnStamp); WIPTransaction.ReassignOperation(splitLotInfo, reassignOperationInfo, reasonCategoryInfo, "EDCSplitReassignOperation", txnStamp); WIPTransaction.ResetLotRule(splitLotInfo, txnStamp); #endregion } cts.Complete(); } ClearUI(); AjaxFocus(ttbWorkpiece); } catch (Exception ex) { HandleError(ex); } }
/// <summary> /// 確定 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void btnOK_Click(object sender, EventArgs e) { try { TransactionStamp txnStamp = new TransactionStamp(User.Identity.Name, ProgramRight, ProgramRight, ApplicationName); //檢查維修原因是否有選擇 ddlRepairReasonCode.Must(lblJudgeReason); #region 檢查維修結果是否有選擇 if (rdbOK.Checked == false && rdbNG.Checked == false) { throw new Exception(TextMessage.Error.T00841(lblRepairResult.Text)); } #endregion using (var cts = CimesTransactionScope.Create()) { //選取的原因碼 var reasonCategory = InfoCenter.GetBySID <ReasonCategoryInfo>(ddlRepairReasonCode.SelectedValue); #region 紀錄維修結束 To do... List <WIPRepairFinishInfo> repairFinishDatas = new List <WIPRepairFinishInfo>(); var repairData = WIPRepairInfo.GetRepairByLotAndReason(_LotData.Lot, _DefectJudgementData.Reason); var repairFinishData = WIPRepairFinishInfo.CreateInfo(repairData); repairFinishData.ActionCategory = reasonCategory.Category; repairFinishData.ActionReasonCode = reasonCategory.Reason; repairFinishData.ActionReasonSID = reasonCategory.ReasonSID; repairFinishData.Result = rdbOK.Checked ? "OK" : "NG"; repairFinishDatas.Add(repairFinishData); var issueOperation = OperationInfo.GetOperationByName(_LotData.OperationName); WIPTransaction.RepairEnd(_LotData, repairFinishDatas, issueOperation, txnStamp); #endregion #region 2017/10/26 跟詩涵確認,無論維修結果如何,一律送回待判站由品保決定處理結果 /* #region OK:依照批號的UDC02(工作站序號)+UDC03(工作站名稱)找出預設流程的下一站點,將批號跳站至該站 * * if (rdbOK.Checked) * { * //取得流程線上版本 取得目前Lot的所有流程(所有工作站) * RouteVersionInfo RouteVersion = RouteVersionInfo.GetRouteActiveVersion(_LotData.RouteName); * * //以此工作站名稱去查詢在流程中的序號 * var routeOperation = RouteOperationInfo.GetRouteAllOperations(RouteVersion).Find(p => p.OperationName == _LotData.UserDefineColumn03); * * var lastOperationSeq = string.Format("{0:000}", (Convert.ToDecimal(routeOperation.OperationSequence) + 1)); * * //下一個工作站 用LOT和流程中下一站的序號去查出下一個工作站資訊 * var NextRouteOperation = RouteOperationInfo.GetRouteOperationByLotSequence(_LotData, lastOperationSeq); * * if (NextRouteOperation == null) * { * //批號:{0}已無下個工作站點,請確認[流程設定] * throw new Exception(RuleMessage.Error.C10008(_LotData.Lot)); * } * * //將批號的UDC02清空 * WIPTransaction.ModifyLotSystemAttribute(_LotData, "USERDEFINECOL02", "", txnStamp); * * //將批號的UDC03清空 * WIPTransaction.ModifyLotSystemAttribute(_LotData, "USERDEFINECOL03", "", txnStamp); * * //執行出站 * WIPTransaction.CheckOut(_LotData, txnStamp); * * WIPTransaction.ReassignOperation(_LotData, NextRouteOperation, reasonCategory, ttbRepairDescr.Text, txnStamp); * } #endregion * #region NG:送到下一站 * if (rdbNG.Checked) * { * //執行出站 * WIPTransaction.CheckOut(_LotData, txnStamp); * * WIPTransaction.DispatchLot(_LotData, txnStamp); * } #endregion * */ #endregion //執行出站 WIPTransaction.CheckOut(_LotData, txnStamp); WIPTransaction.DispatchLot(_LotData, txnStamp); cts.Complete(); } ClearField(); AjaxFocus(ttbLot); _ProgramInformationBlock.ShowMessage(TextMessage.Hint.T00614("")); } catch (Exception ex) { HandleError(ex); } }
/// <summary> /// 確定 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void btnOK_Click(object sender, EventArgs e) { try { #region 確認選擇結果,如果是選擇NG,確認是否有選擇原因碼 string result = ""; if (rdbOK.Checked) { result = "OK"; } else if (rdbNG.Checked) { result = "NG"; //確認是否有選擇原因碼 ddlFAIReasonCode.Must(lblFAIReasonCode); } else if (rdbPASS.Checked) { result = "PASS"; } else if (rdbCLOSE.Checked) { result = "CLOSE"; //確認是否有選擇原因碼 ddlFAIReasonCode.Must(lblFAIReasonCode); } #endregion TransactionStamp txnStamp = new TransactionStamp(User.Identity.Name, ProgramRight, ProgramRight, ApplicationName); using (var cts = CimesTransactionScope.Create()) { #region 更新檢驗主檔[MES_QC_INSP] //取得檢驗主檔資料 var QCInsepctionData = InfoCenter.GetBySID <QCInspectionInfo>(_SelectedQCData.QCInspectionSID).ChangeTo <QCInspectionInfoEx>(); //原因碼 ReasonCategoryInfo reason = null; //有選擇原因碼才更新[NG_Category]及[NG_Reason] if (string.IsNullOrEmpty(ddlFAIReasonCode.SelectedValue) == false) { reason = InfoCenter.GetBySID <ReasonCategoryInfo>(ddlFAIReasonCode.SelectedValue); QCInsepctionData.NG_Category = reason.Category; QCInsepctionData.NG_Reason = reason.Reason; } //如果判定結果為結單的話,則必須把結單時間及人員資料寫回資料庫 if (result == "CLOSE") { QCInsepctionData.FINISHTIME = txnStamp.RecordTime; QCInsepctionData.FINISHUSER = txnStamp.UserID; } QCInsepctionData.NG_Description = ttbDescr.Text; QCInsepctionData.Result = result; QCInsepctionData.Status = "Finished"; QCInsepctionData.UpdateToDB(txnStamp.UserID, txnStamp.RecordTime); #endregion #region 更新機台檢驗主檔[CST_WIP_CMM] if (_CSTWIPCMMList != null) { //更新檢驗主檔的QCInspectionSID欄位 _CSTWIPCMMList.ForEach(data => { data.QCInspectionSID = QCInsepctionData.ID; data.UpdateToDB(); }); } #endregion #region 更新機台資訊 //取得相同BatchID的檢驗資料 var QCDataList = QCInspectionInfoEx.GetDataListByBatchID(_SelectedQCData.BatchID); //相同BatchID都已完成檢驗旗標 bool isAllFinish = true; QCDataList.ForEach(p => { if (!(p.Status == "Finished")) { isAllFinish = false; } }); //取得lot資料 var lot = InfoCenter.GetBySID <LotInfo>(_SelectedQCData.ObjectSID); //更新機台屬性[FAICOUNT] CustomizeFunction.UpdateFAI(_SelectedQCData.EquipmentName, lot.Lot, (rdbNG.Checked) ? true : false, txnStamp); //如果相同的BatchID都檢驗完成或選擇結果為NG時,則更新狀態為IDLE及更新FAICOUNT if (isAllFinish) { //取得機台狀態資料 var newStateInfo = EquipmentStateInfo.GetEquipmentStateByState("IDLE"); var equipData = EquipmentInfo.GetEquipmentByName(_SelectedQCData.EquipmentName); //更新機台狀態 EMSTransaction.ChangeState(equipData, newStateInfo, txnStamp); } #endregion //如果判定結果選擇為NG,則必須拆批送待判 if (rdbNG.Checked) { //判定NG直接拆批及送待判工作站 CustomizeFunction.SplitDefectLot(_SelectedQCData.ComponentLot, ttbDescr.Text, reason, txnStamp); } cts.Complete(); } ClearField(); AjaxFocus(ttbLot); _ProgramInformationBlock.ShowMessage(TextMessage.Hint.T00614("")); } catch (Exception ex) { HandleError(ex); } }
protected void btnOK_Click(object sender, EventArgs e) { try { ttbEquipmentName.Must(lblEquipment); ttbDevice1.Must(lblDevice1); //料號1一定要有資料 if (_DeviceInfo1 == null) { throw new RuleCimesException(TextMessage.Error.T00826(lblDevice1.Text)); } //一定要輸入一種料號 if (_dtVerifiy1 == null) { throw new RuleCimesException(TextMessage.Error.T00826(lblDevice1.Text)); } //若有輸入料號1則需驗證應領數量與領用數量是否相同 if (_dtVerifiy1 != null) { _dtVerifiy1.Rows.LoopDo <DataRow>((p, i) => { if (p["NEEDQTY"].ToDecimal() != p["EQPTOOLCOUNT"].ToDecimal()) { throw new RuleCimesException(RuleMessage.Error.C10141(_EquipmentInfo.EquipmentName, _DeviceInfo1.DeviceName, p["TOOLTYPE"].ToString(), p["NEEDQTY"].ToString())); } }); } //若有輸入料號2則需驗證應領數量與領用數量是否相同 if (_dtVerifiy2 != null) { _dtVerifiy2.Rows.LoopDo <DataRow>((p, i) => { if (p["NEEDQTY"].ToDecimal() != p["EQPTOOLCOUNT"].ToDecimal()) { throw new RuleCimesException(RuleMessage.Error.C10141(_EquipmentInfo.EquipmentName, _DeviceInfo1.DeviceName, p["TOOLTYPE"].ToString(), p["NEEDQTY"].ToString())); } }); } string sReleaseID = DBCenter.GetSystemID(); TransactionStamp txnStamp = new TransactionStamp(User.Identity.Name, ProgramRight, ProgramRight, ApplicationName); using (var cts = CimesTransactionScope.Create()) { //先將舊的資料刪除 var lstEqpToolRelease = CSTEquipmentToolReleaseInfo.GetDataByEquipment(_EquipmentInfo.EquipmentName); lstEqpToolRelease.ForEach(p => { p.DeleteFromDB(); LogCenter.LogToDB(p, LogCenter.LogIndicator.Create(ActionType.Remove, txnStamp.UserID, txnStamp.RecordTime)); }); var lstEqpTool = EquipToolInfo.GetByEquipmentName(_EquipmentInfo.EquipmentName); lstEqpTool.ForEach(p => { //取得配件資訊 var toolInfo = ToolInfo.GetToolByName(p.ToolName); //新增至CST_EQP_TOOL_RELEASE的Info物件 var eqpToolReleaseInfo = InfoCenter.Create <CSTEquipmentToolReleaseInfo>(); eqpToolReleaseInfo.EquipmentName = _EquipmentInfo.EquipmentName; eqpToolReleaseInfo.ToolName = toolInfo.ToolName; eqpToolReleaseInfo.HEAD = toolInfo["HEAD"].ToString(); eqpToolReleaseInfo.RELEASEID = sReleaseID; eqpToolReleaseInfo["OPERATION"] = toolInfo.UserDefineColumn08; eqpToolReleaseInfo.InsertToDB(txnStamp.UserID, txnStamp.RecordTime); LogCenter.LogToDB(eqpToolReleaseInfo, LogCenter.LogIndicator.Create(ActionType.Add, txnStamp.UserID, txnStamp.RecordTime)); //異動Tool的RELEASEID欄位 TMSTransaction.ModifyToolSystemAttribute(toolInfo, "RELEASEID", sReleaseID, txnStamp); }); //先將舊的資料刪除 var lstEqpDeviceRelease = CSTEquipmentDeviceReleaseInfo.GetDataByEquipment(_EquipmentInfo.EquipmentName); lstEqpDeviceRelease.ForEach(p => { p.DeleteFromDB(); LogCenter.LogToDB(p, LogCenter.LogIndicator.Create(ActionType.Remove, txnStamp.UserID, txnStamp.RecordTime)); }); if (_dtVerifiy1 != null) { //新增至CST_EQP_DEVICE_RELEASE的Info物件 var eqpDeviceReleaseInfo = InfoCenter.Create <CSTEquipmentDeviceReleaseInfo>(); eqpDeviceReleaseInfo.EquipmentName = _EquipmentInfo.EquipmentName; eqpDeviceReleaseInfo.DeviceName = _DeviceInfo1.DeviceName; eqpDeviceReleaseInfo.RELEASEID = sReleaseID; eqpDeviceReleaseInfo.InsertToDB(txnStamp.UserID, txnStamp.RecordTime); LogCenter.LogToDB(eqpDeviceReleaseInfo, LogCenter.LogIndicator.Create(ActionType.Add, txnStamp.UserID, txnStamp.RecordTime)); } if (_dtVerifiy2 != null) { //新增至CST_EQP_DEVICE_RELEASE的Info物件 var eqpDeviceReleaseInfo = InfoCenter.Create <CSTEquipmentDeviceReleaseInfo>(); eqpDeviceReleaseInfo.EquipmentName = _EquipmentInfo.EquipmentName; eqpDeviceReleaseInfo.DeviceName = _DeviceInfo2.DeviceName; eqpDeviceReleaseInfo.RELEASEID = sReleaseID; eqpDeviceReleaseInfo.InsertToDB(txnStamp.UserID, txnStamp.RecordTime); LogCenter.LogToDB(eqpDeviceReleaseInfo, LogCenter.LogIndicator.Create(ActionType.Add, txnStamp.UserID, txnStamp.RecordTime)); } cts.Complete(); } ((ProgramInformationBlock)ProgramInformationBlock1).ShowMessage(TextMessage.Hint.T00057(GetUIResource("ToolVerifiy"))); ClearField(); AjaxFocus(ttbEquipmentName); } catch (Exception ex) { HandleError(ex); } }
/// <summary> /// 確認 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void btnOK_Click(object sender, EventArgs e) { try { TransactionStamp txnStamp = new TransactionStamp(User.Identity.Name, ProgramRight, ProgramRight, ApplicationName); using (var cts = CimesTransactionScope.Create()) { if (_SelectLotDatas.Count > 0) { string sLotInString = ""; // 組出where in字串 _SelectLotDatas.ForEach(p => { sLotInString += "'" + p.Lot + "',"; }); sLotInString = sLotInString.EndsWith(",") ? sLotInString.Substring(0, sLotInString.Length - 1) : sLotInString; var dtInvData = DBCenter.GetDataTable(@"SELECT WO,INVLOT,SUM(QUANTITY) QUANTITY,DEVICE,FACTORY FROM MES_WIP_LOT WHERE LOT IN(" + sLotInString + ") GROUP BY WO,INVLOT,DEVICE,FACTORY ORDER BY WO"); string headerSID = ""; string date = txnStamp.RecordTime.Substring(0, 10).Replace("/", ""); string time = txnStamp.RecordTime.Substring(11).Replace(":", ""); string preWo = string.Empty; int seq = 1; // SAI倉位對應表 var lstSAIWarehouse = WpcExClassItemInfo.GetInfoByClass("SAIWarehouse"); dtInvData.Rows.LoopDo <DataRow>((p, i) => { string currentWO = p["WO"].ToString(); string device = p["DEVICE"].ToString(); string factory = p["FACTORY"].ToString(); string invLot = p["INVLOT"].ToString(); string qty = p["QUANTITY"].ToString(); if (preWo != currentWO) { seq = 1; headerSID = DBCenter.GetSystemID(); DBCenter.ExecuteParse(@"INSERT INTO PPFHK (SID, WDATE, WTIME, BUDAT, AUFNR, FLAG) VALUES (#[STRING], #[STRING], #[STRING], #[STRING], #[STRING],'N')", headerSID, date, time, date, currentWO); } //寫入PPFHP //WERKS:Factory //LGORT:入庫倉位 //CHARG:INVLOT //MATNR:Device var lstDetail = _SelectLotDatas.FindAll(select => select.InventoryLot == invLot); var warehouseInfo = lstSAIWarehouse.Find(wpcItem => wpcItem.Remark01 == lstDetail[0].Process && wpcItem.Remark03 == "DEFECT"); if (warehouseInfo == null) { //T00555:查無資料,請至系統資料維護新增類別{0}、項目{1}! throw new CimesException(TextMessage.Error.T00555("SAIWarehouse", lstDetail[0].Process + "Remark03:DEFECT")); } DBCenter.ExecuteParse(@"INSERT INTO PPFHP (SID, SEQNR, WDATE, WTIME, MATNR, WERKS, LGORT, CHARG, MENGE, MEINS, FLAG) VALUES (#[STRING], #[DECIMAL], #[STRING], #[STRING], #[STRING], #[STRING], #[STRING], #[STRING], #[STRING], #[STRING], 'N')", headerSID, seq, date, time, device, factory, warehouseInfo.Remark02, invLot, qty, lstDetail[0].Unit); int detailseq = 1; lstDetail.ForEach(lot => { var defectInfo = CSTWIPDefectJudgementInfo.GetDataByLot(lot.Lot); var reasonGroupInfo = WIPReasonGroupInfoEx.GetReasonGroupByCategory(defectInfo["REASONCATEGORY"].ToString()); var reasonGroup = reasonGroupInfo == null ? "" : reasonGroupInfo.REASONGROUP; //寫入PPBCH DBCenter.ExecuteParse(@"INSERT INTO PPBCH (SID, MATNR, WERKS, CHARG, SEQNO, WDATE, WTIME, CLASS, ATINN, ATWRT, FLAG) Values (#[STRING], #[STRING], #[STRING], #[STRING], #[DECIMAL], #[STRING], #[STRING], #[STRING], #[STRING], #[STRING], 'N')", headerSID, device, factory, invLot, detailseq, date, time, reasonGroup, defectInfo["REASONCATEGORY"].ToString(), defectInfo.Reason); detailseq += 1; }); seq += 1; preWo = currentWO; }); _SelectLotDatas.ForEach(lot => { //寫入WMSMaster & Detail var wmsMaster = CSTWMSMastInfo.GetMaterialLotDataByMaterialLot(lot.InventoryLot); if (wmsMaster == null) { wmsMaster = InfoCenter.Create <CSTWMSMastInfo>(); wmsMaster.Lot = lot.InventoryLot; wmsMaster.DeviceName = lot.DeviceName; wmsMaster.RuleName = txnStamp.RuleName; wmsMaster.InsertToDB(txnStamp.UserID, txnStamp.RecordTime); } //理論上只會有一個Comp lot.GetLotAllComponents().ForEach(comp => { var wmsDetail = InfoCenter.Create <CSTWMSDetailInfo>(); wmsDetail.Lot = lot.InventoryLot; wmsDetail.ComponentID = comp.ComponentID; wmsDetail.Quantity = comp.ComponentQuantity; wmsDetail.InsertToDB(txnStamp.UserID, txnStamp.RecordTime); }); //將入庫單號回寫到批號身上 WIPTransaction.ModifyLotSystemAttribute(lot, "INVNO", ttbDefectNo.Text, txnStamp); //將勾選的批號結批 WIPTransaction.TerminateLot(lot, txnStamp); }); #region 更新命名規則 if (_ExecuteNamingSQLList != null && _ExecuteNamingSQLList.Count > 0) { DBCenter.ExecuteSQL(_ExecuteNamingSQLList); } #endregion cts.Complete(); } else { //[00816]請至少選取一個{0}! throw new Exception(TextMessage.Error.T00816(GetUIResource("WorkpieceLot"))); } } ClearField(); _ProgramInformationBlock.ShowMessage(TextMessage.Hint.T00614("")); } catch (Exception ex) { HandleError(ex); } }
/// <summary> /// 確定 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void btnOK_Click(object sender, EventArgs e) { try { TransactionStamp txnStamp = new TransactionStamp(User.Identity.Name, ProgramRight, ProgramRight, ApplicationName); //確認是否有選擇送待判原因 ddlJudgeDefect.Must(lblJudgeDefect); #region 檢查判定結果是否有選擇 if (rdbGoods.Checked == false && rdbRepair.Checked == false && rdbDefectInv.Checked == false && rdbScrapInv.Checked == false) { throw new Exception(TextMessage.Error.T00841(lblJudgeResult.Text)); } #endregion //檢查判定原因是否有選擇 ddlJudgeReason.Must(lblJudgeReason); using (var cts = CimesTransactionScope.Create()) { #region 依照選擇的判定結果,對批號進行不同的處置 //選取的判定結果 string result = ""; //選取的原因碼 var reasonCategory = InfoCenter.GetBySID <ReasonCategoryInfo>(ddlJudgeReason.SelectedValue); #region 良品:依照批號的UDC02(工作站序號)+UDC03(工作站名稱)找出預設流程的下一站點,將批號跳站至該站 if (rdbGoods.Checked) { result = "Good"; //取得流程線上版本 取得目前Lot的所有流程(所有工作站) RouteVersionInfo RouteVersion = RouteVersionInfo.GetRouteActiveVersion(_LotData.RouteName); //取得設定包裝工作站名稱 var packingOperation = WpcExClassItemInfo.GetExtendItemListByClassAndRemarks("SAIPackingOperation"); if (packingOperation.Count == 0) { //T00555:查無資料,請至系統資料維護新增類別{0}、項目{1}! throw new CimesException(TextMessage.Error.T00555("SAIPackingOperation", "")); } var reassignOperation = packingOperation[0]; //如果送待判站之前記錄的是包裝站,則直接跳至包裝站,反之,跳至下一站 if (reassignOperation.Remark01 == _LotData.UserDefineColumn03) { //取得包裝站名稱 string qcOperationName = reassignOperation.Remark01; //取得包裝工作站資訊 var operation = OperationInfo.GetOperationByName(qcOperationName); if (operation == null) { //T00171, 工作站:{0}不存在!! throw new CimesException(TextMessage.Error.T00171(qcOperationName)); } //根據指定的流程名稱、流程版本、工作站名稱, 找出第一個符合的流程工作站,新的站點包裝 var newOperation = RouteOperationInfo.GetRouteOperationByOperationName(_LotData.RouteName, _LotData.RouteVersion, qcOperationName); //將批號的UDC02清空 WIPTransaction.ModifyLotSystemAttribute(_LotData, "USERDEFINECOL02", "", txnStamp); //將批號的UDC03清空 WIPTransaction.ModifyLotSystemAttribute(_LotData, "USERDEFINECOL03", "", txnStamp); //變更至指定工作站 WIPTransaction.ReassignOperation(_LotData, newOperation, reasonCategory, ttbJudgeDescr.Text, txnStamp); } else { //以此工作站名稱去查詢在流程中的序號 var routeOperation = RouteOperationInfo.GetRouteAllOperations(RouteVersion).Find(p => p.OperationName == _LotData.UserDefineColumn03); var lastOperationSeq = string.Format("{0:000}", (Convert.ToDecimal(routeOperation.OperationSequence) + 1)); //下一個工作站 用LOT和流程中下一站的序號去查出下一個工作站資訊 var NextRouteOperation = RouteOperationInfo.GetRouteOperationByLotSequence(_LotData, lastOperationSeq); if (NextRouteOperation == null) { //批號:{0}已無下個工作站點,請確認[流程設定] throw new Exception(RuleMessage.Error.C10008(_LotData.Lot)); } //將批號的UDC02清空 WIPTransaction.ModifyLotSystemAttribute(_LotData, "USERDEFINECOL02", "", txnStamp); //將批號的UDC03清空 WIPTransaction.ModifyLotSystemAttribute(_LotData, "USERDEFINECOL03", "", txnStamp); WIPTransaction.ReassignOperation(_LotData, NextRouteOperation, reasonCategory, ttbJudgeDescr.Text, txnStamp); } } #endregion #region 維修:紀錄維修及將批號派送至下一規則 if (rdbRepair.Checked) { result = "Repair"; List <WIPRepairInfo> repairDatas = new List <WIPRepairInfo>(); var componentData = ComponentInfoEx.GetDataByCurrentLot(_LotData.Lot)[0]; var repairData = WIPRepairInfo.CreateInfo(_LotData, componentData, componentData.ComponentQuantity, reasonCategory, _LotData.OperationName, _LotData.ResourceName, string.Empty, string.Empty); repairDatas.Add(repairData); var issueOperation = OperationInfo.GetOperationByName(_LotData.OperationName); WIPTransaction.RepairAdd(_LotData, repairDatas, issueOperation, txnStamp); WIPTransaction.DispatchLot(_LotData, txnStamp); } #endregion #region 良品入庫:將批號狀態變更為DefectInv if (rdbDefectInv.Checked) { result = "DefectInv"; WIPTransaction.ModifyLotSystemAttribute(_LotData, "STATUS", "DefectInv", txnStamp); } #endregion #region 報廢品入庫:將批號狀態變更為ScrapInv if (rdbScrapInv.Checked) { result = "ScrapInv"; WIPTransaction.ModifyLotSystemAttribute(_LotData, "STATUS", "ScrapInv", txnStamp); } #endregion #endregion #region 將判定結果紀錄在CST_WIP_DEFECT_JUDGEMENT,Result:良品(Goods)、維修(Repair)、不良品入庫(DefectInv)、報廢入庫(ScrapInv) var insertData = InfoCenter.Create <CSTWIPDefectJudgementInfo>(); insertData.WIPDefectSID = _LotDefectData.DefectSID; insertData["REASONCATEGORY"] = reasonCategory.Category; insertData["LOT"] = _LotData.Lot; insertData.Reason = reasonCategory.Reason; insertData.Result = result; insertData.Description = ttbJudgeDescr.Text; insertData.LinkSID = WIPHistoryInfo.GetLotFirstHistory(_LotData.Lot).LinkSID; insertData.InsertToDB(txnStamp.UserID, txnStamp.RecordTime); #endregion cts.Complete(); } ttbLot.Text = ""; ClearField(); AjaxFocus(ttbLot); _ProgramInformationBlock.ShowMessage(TextMessage.Hint.T00614("")); } catch (Exception ex) { HandleError(ex); } }