COMPILE FUNCTION obj_WO_LogRR(Method,Parms) /* Methods for the Work Order Log (WO_LOG) Release/Recall methods 04/18/2016 JCH - Initial Coding Properties: Methods: Release ;* Release Cassette based Runs Recall ;* Recall */ DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, Dialog_Box, Popup, obj_RDS, obj_WO_Mat, Set_Property, obj_Sched DECLARE FUNCTION obj_Prod_Spec DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn, Btree.Extract, ErrMsg, RList, obj_WO_Step, Send_Info, obj_RDS2 DECLARE SUBROUTINE obj_Notes, Msg, obj_WO_Mat, obj_RDS, obj_Post_Log, obj_WO_Mat_Log, obj_WO_Wfr $INSERT APPCOLORS $INSERT MSG_EQUATES $INSERT NOTIFICATION_EQU $INSERT COMPANY_EQUATES $INSERT WO_LOG_EQUATES $INSERT WO_STEP_EQUATES $INSERT WO_MAT_EQUATES $INSERT RDS_EQUATES $INSERT REACT_RUN_EQUATES $INSERT PRS_STAGE_EQUATES $INSERT PRS_LAYER_EQUATES $INSERT PROD_SPEC_EQUATES $INSERT EPI_PART_EQUATES $INSERT CUST_EPI_PART_EQUATES $INSERT PROD_VER_EQUATES EQU CRLF$ TO \0D0A\ EQU TARGET_ACTIVELIST$ TO 5 ErrTitle = 'Error in Stored Procedure "obj_WO_LogRR"' ErrorMsg = '' IF NOT(ASSIGNED(Method)) THEN ErrorMsg = 'Unassigned parameter "Method" passed to subroutine' IF NOT(ASSIGNED(Parms)) THEN Parms = '' IF ErrorMsg NE '' THEN Set_Status(-1,ErrTitle:@SVM:ErrorMsg) RETURN '' END Result = '' BEGIN CASE CASE Method = 'Release' ; GOSUB Release CASE Method = 'Recall' ; GOSUB Recall CASE 1 ErrorMsg = 'Unknown Method ':QUOTE(Method):' passed to routine.' END CASE IF ErrorMsg NE '' THEN Set_Status(-1,ErrTitle:@SVM:ErrorMsg) RETURN '' END RETURN Result * * * * * * * Release: * * * * * * * WONo = Parms[1,@RM] CassNos = Parms[COL2()+1,@RM] IF WONo = '' THEN ErrorMsg = 'Null parameter WONo passed to routine (':Method:').' IF ErrorMsg NE '' THEN RETURN *OrgColor = Set_Property('WO_LOG2.STATUSLINE_FIX','BACKCOLOR',YELLOW$) ;* //////// Messaging *** Out for development TableVar = '' OtParms = 'WO_LOG':@RM:WONo:@RM:TableVar *WORec = obj_Tables('ReadRec',OtParms) ;* **** Out for development WORec = XLATE('WO_LOG',WONo,'','X') ;* Used for testing * * * * * * * * * * CustNo = WORec PromiseDt = WORec WOStepKeys = WORec ProdVerNo = WORec EPIPartNo = WORec WOMatKeys = WORec IF ProdVerNo = '' THEN ErrorMsg = 'Prod Ver No blank on Work Order. WO Not Released. (':Method:')' IF CustNo = '' THEN ErrorMsg = 'No Cust Number on Work Order. WO Not Released. (':Method:')' IF WOStepKeys = '' THEN ErrorMsg = 'Missing WO Step Keys. WO Not Released. (':Method:')' IF ErrorMsg NE '' THEN obj_Tables('UnlockRec',OtParms) RETURN END * * * Lock all the WO_MAT records for updates * * * CassCnt = COUNT(CassNos,@VM) + (CassNos NE '') WOMKeys = '' FOR K = 1 TO CassCnt WOMKeys<1,K> = WONo:'*':CassNos<1,K> NEXT K Send_Info('Locking WOMat records for update...') WOMTableVar = obj_WO_Mat('LockSet',WOMKeys) IF Get_Status(errCode) THEN obj_Tables('UnlockRec',OtParms) ;* Unlock WO_LOG record Send_Info(STR(' ',60)) ;** - Messaging - ** NewForm = Xlate('APP_INFO', 'NEW_WO_FORM', '', 'X') If NewForm then Form = 'NDW_WO_LOG' end else Form = 'WO_LOG2' end Dummy = Set_Property(Form:'.STATUSLINE_FIX','BACKCOLOR',OrgColor) ;** - Messaging - ** RETURN END * At this point the WO_LOG is locked and the WO_MAT (cassettes) are all locked for update ReactorType = XLATE('PROD_VER',ProdVerNo,PROD_VER_REACT_TYPE$,'X') BEGIN CASE CASE ReactorType = 'GAN' ; GOSUB RelGaN CASE ReactorType = 'EPP' ; GOSUB RelEpiPRO CASE ReactorType NE '' ; GOSUB RelASM CASE 1 obj_Tables('UnlockRec',OtParms) END CASE RETURN * * * * * * * Recall: * * * * * * * RETURN * * * * * * * RelGaN: * * * * * * * OrderWaferQty = WORec PONo = WORec VisionOrderNo = WORec ;* SAP Production Order Number VisionLineNos = '' WMOLoadQty = XLATE('CUST_EPI_PART',CustNo:'*':EPIPartNo,CUST_EPI_PART_WMO_LOAD_CNT$,'X') EpiPN = WORec EpiPartRec = XLATE('EPI_PART',EpiPN,'','X') SubSupplyBy = EpiPartRec ProdVerRec = XLATE('PROD_VER',ProdVerNo,'','X') ProcStepNos = ProdVerRec ProcPSNs = ProdVerRec ReactorType = ProdVerRec WOStepCnt = COUNT(ProcPSNs,@VM) + (ProcPSNs NE '') TableVar = '' FOR WOStep = 1 TO WOStepCnt WOStepKey = WORec WOStepRec = XLATE('WO_STEP',WOStepKey,'','X') IF WOStep = WOStepCnt THEN LastStep = 1 ELSE LastStep = 0 ProcPSN = ProcPSNs<1,WOStep> StepProfile = obj_Prod_Spec('GetSigProfile',ProcPSN) SigCnt = COUNT(StepProfile,@VM) + (StepProfile NE '') CassCnt = COUNT(CassNos,@VM) + (CassNos NE '') Def = "" Def = "Releasing Cassettes for WO Step ":WOStep:"..." Def = "G" Def = CassCnt Def = 600 *MsgUp = Msg(@WINDOW, Def) ;* * * * * * * *** Out for development * * * This was WM_IN and RDS creation section * * * FOR N = 1 TO CassCnt CassNo = CassNos<1,N> FOR S = 1 TO SigCnt StepSig = StepProfile<1,S> IF StepSig[1,2] NE 'RN' THEN SigProfile := I:StepProfile<1,N>:@VM END NEXT S *Void = Msg(@WINDOW, MsgUp, N, MSGINSTUPDATE$) ;* * * * * * * Out for development NEXT N *Msg(@WINDOW, MsgUp) ;* take down the gauge NEXT WOStep RETURN * * * * * * * RelASM: * * * * * * * RETURN * * * * * * * RelEpiPRO: * * * * * * * RETURN ************ Original Code * * * * * * * /* * * * * * * * ReleaseCassettes: * * * * * * * WONo = Parms[1,@RM] CassNos = Parms[COL2()+1,@RM] IF WONo = '' THEN ErrorMsg = 'Null parameter WONo passed to routine (':Method:').' IF ErrorMsg NE '' THEN RETURN OrgColor = Set_Property('WO_LOG2.STATUSLINE_FIX','BACKCOLOR',YELLOW$) ;* //////// Messaging TableVar = '' OtParms = 'WO_LOG':@RM:WONo:@RM:TableVar WORec = obj_Tables('ReadRec',OtParms) ;* Locks and reads record for update IF Get_Status(errCode) THEN Return * Added 5/21/2015 JCH to check for previous releases on this work order WOMatKeys = WORec OrderNo = WORec OrderItems = WORec CustNo = WORec PromiseDt = WORec WOStepKeys = WORec EPIPartNo = WORec IF OrderNo = '' AND ProdVerNo = '' THEN ErrorMsg = 'Both Order No and Prod Ver No blank on Work Order. WO Not Released. (':Method:')' IF CustNo = '' THEN ErrorMsg = 'No Cust Number on Work Order. WO Not Released. (':Method:')' *IF OrderItems = '' THEN ErrorMsg = 'No Order Items on Work Order. WO Not Released. (':Method:')' *IF PromiseDt = '' THEN ErrorMsg = 'No Promise Date on Work Order. WO Not Released. (':Method:')' IF WOStepKeys = '' THEN ErrorMsg = 'Missing WO Step Keys. WO Not Released. (':Method:')' IF ErrorMsg NE '' THEN obj_Tables('UnlockRec',OtParms) RETURN END * * * * * * * * * * * * * * * * * * * * * * * * * * IF ProdVerNo NE '' THEN ReactorType = XLATE('PROD_VER',ProdVerNo,PROD_VER_REACT_TYPE$,'X') IF ReactorType NE 'EPP' THEN IF WORec = '' THEN CurrDTM = ICONV(OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTHS'),'DT') WORec = CurrDTM END END END * * * * * * * * * * * * * * * * * * * * * * * * * * * Send_Info("Collecting Data for release...") ;* //////// Messaging IF OrderNo = '' THEN OrderWaferQty = WORec PONo = WORec VisionOrderNo = WORec ;* SAP Production Order Number VisionLineNos = '' WMOLoadQty = XLATE('CUST_EPI_PART',CustNo:'*':EPIPartNo,CUST_EPI_PART_WMO_LOAD_CNT$,'X') END ELSE OrderRec = XLATE('ORDER',OrderNo,'','X') OrderWaferQty = 0 FOR I = 1 TO COUNT(OrderItems,@VM) + (OrderItems NE '') OrderDetRec = XLATE('ORDER_DET',OrderNo:'*':OrderItems<1,I>,'','X') IF NOT(INDEX(OrderDetRec,'MISC',1)) THEN OrderWaferQty = OrderWaferQty + OrderDetRec END NEXT I PONo = OrderRec VisionOrderNo = OrderRec VisionLineNos = XLATE('ORDER_DET',OrderItems,ORDER_DET_VISION_LINE_NO$,'X') END OrdSummary = '' ;* Holds Order Detail Lot Numbers and Associated Order Item Numbers CassCnt = COUNT(CassNos,@VM) + (CassNos NE '') WOMKeys = '' FOR K = 1 TO CassCnt WOMKeys<1,K> = WONo:'*':CassNos<1,K> NEXT K Send_Info('Locking WOMat records for update...') WOMTableVar = obj_WO_Mat('LockSet',WOMKeys) IF Get_Status(errCode) THEN obj_Tables('UnlockRec',OtParms) ;* Unlock WO_LOG record Send_Info(STR(' ',60)) ;** - Messaging - ** Dummy = Set_Property('WO_LOG2.STATUSLINE_FIX','BACKCOLOR',OrgColor) ;** - Messaging - ** RETURN END * At this point the WO_LOG is locked and the WO_MAT (cassettes) are all locked for update EpiPN = WORec EpiPartRec = XLATE('EPI_PART',EpiPN,'','X') SubSupplyBy = EpiPartRec ProdVerRec = XLATE('PROD_VER',ProdVerNo,'','X') ProcStepNos = ProdVerRec ProcPSNs = ProdVerRec ReactorType = ProdVerRec WOStepCnt = COUNT(ProcPSNs,@VM) + (ProcPSNs NE '') TableVar = '' FOR WOStep = 1 TO WOStepCnt WOStepKey = WORec WOStepRec = XLATE('WO_STEP',WOStepKey,'','X') IF WOStep = WOStepCnt THEN LastStep = 1 ELSE LastStep = 0 ProcPSN = ProcPSNs<1,WOStep> SubPreClean = XLATE('PRS_STAGE',ProcPSN:'*PRE',PRS_STAGE_CLEAN_TOOL$,'X') SubPostClean = XLATE('PRS_STAGE',ProcPSN:'*POST',PRS_STAGE_CLEAN_TOOL$,'X') IF ReactorType = 'EPP' THEN Send_Info('Creating WM_OUT records for WOStep ':WOStep:'...') ;** - Messaging - ** OutOnlyCassIDS = obj_WM_Out('Create',WONO:@RM:WOStep:@RM:CassNos:@RM:WMOLoadQty) ;* Changed WMOLoadQty 9/14/2012 JCH ********* END ELSE OutOnlyCassIDs = '' END StepRDSNos = '' CassCnt = COUNT(CassNos,@VM) + (CassNos NE '') Def = "" Def = "Releasing Cassettes for WO Step ":WOStep:"..." Def = "G" Def = CassCnt Def = 600 MsgUp = Msg(@WINDOW, Def) ReprocessedRDSNos = '' FOR N = 1 TO CassCnt CassNo = CassNos<1,N> Void = Msg(@WINDOW, MsgUp, N, MSGINSTUPDATE$) IF ReactorType = 'EPP' THEN CassWaferQty = XLATE('WO_MAT',WONo:'*':CassNo,WO_MAT_WAFER_QTY$,'X') WMIKey = WONo:'*':WOStep:'*':CassNo Send_Info('Creating WM_IN record "':WMIKey:'"...') ;** - Messaging - ** obj_WM_IN('Create',WONo:@RM:WOStep:@RM:CassNo:@RM:CassWaferQty) ;* ******************************** EpiPro 5000 Reactor -> create WM_IN records END ELSE IF WOStepRec = '' THEN WOMatRec = XLATE('WO_MAT',WoNo:'*':CassNo,'','X') CassLotNo = WOMatRec CassWaferQty = WOMatRec CassCustPartNo = WOMatRec CassSubPartNo = WOMatRec CassSubInvID = '' CassOrderItem = WOMatRec ReprocessedMat = WOMatRec IF OrderNo = '' THEN QuoteNo = '' END ELSE QuoteNo = XLATE('ORDER_DET',OrderNo:'*':CassOrderItem,ORDER_DET_QUOTE_NO$,'X') END Parms = WONo:@RM Parms := WOStep:@RM Parms := LastStep:@RM Parms := CassNo:@RM Parms := QuoteNo:@RM Parms := OrderNo:@RM Parms := CassOrderItem:@RM Parms := CustNo:@RM Parms := PONo:@RM Parms := ProcPSN:@RM Parms := SubSupplyBy:@RM Parms := SubPreClean:@RM Parms := SubPostClean:@RM Parms := PromiseDt:@RM Parms := CassLotNo:@RM Parms := CassCustPartNo:@RM Parms := CassWaferQty:@RM Parms := CassSubPartNo:@RM Parms := '' ;* QXJ Flag Send_Info('Creating RDS for Cass No: ':CassNo:'...') ;** - Messaging - ** NewRDSNo = obj_RDS('Create',Parms) StepRDSNos<1,-1> = NewRDSNo IF Get_Status(errCode) THEN ErrMsg(errCode) ErrorMsg = 'RDS Create Failure - Check for missing data on Work Order' * Modify this to call obj_RDS('Delete' ******************************************** RTParms = 'RDS' FOR I = 1 TO COUNT(StepRdsNos,@VM) + (StepRdsNos NE '') RdsNo = StepRdsNos<1,I> RTParms = FieldStore(RTParms, @RM, 2, 1, RdsNo) obj_Tables('DeleteRec',RTParms) NEXT I Msg(@WINDOW, MsgUp) ;* take down the gauge RETURN ;******************************************************** Check this for WO_LOG being cleared END IF ReprocessedMat THEN OrgRDSNo = CassLotNo obj_Reprocess('FixUp',OrgRDSNo:@RM:NewRDSNo) ;**************************************************** END END ;* End of Check for existing RDS on this WO_Step*CassetteNo END ;* End of check for EpiPRO reactor type NEXT N Msg(@WINDOW, MsgUp) ;* take down the gauge NEXT WOStep Send_Info("Updating WO_Mat Records with release data...") RelDTM = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTHS') ;* 12/31/2014 JCH & DKK moved to prevent time incrementing time during release PtiDTM = OCONV(Date(),'D4/'):' ':OCONV(Time()+5,'MTHS') FOR N = 1 TO CassCnt WOMKey = WOMKeys<1,N> CassNo = FIELD(WOMKey,'*',2) WOMatRec = XLATE('WO_MAT',WOMKey,'','X') ;* We have the lock, so just get the record this way IF WOMatRec = '' THEN WOMatRec = ICONV(RelDTM,'DT') WOMatRec = @USER4 WOMatRec = PromiseDt IF SubPreClean = 'No' OR SubPreClean = '' THEN WOMatRec = 'RTU' END ELSE WOMatRec = 'PREC' END WOMatRec = 'RTB' thisInvDTM = ICONV(RelDTM,'DT') WHCd = 'SR' LocCd = 'RB' InvAction = 'REL' ScanUserID = @USER4 Tag = '' ToolID = '' LOCATE thisInvDTM IN WOMatRec BY 'AR' USING @VM SETTING Pos ELSE WOMatRec = INSERT(WOMatRec,WO_MAT_INV_WH$,Pos,0,WHCd) WOMatRec = INSERT(WOMatRec,WO_MAT_INV_LOCATION$,Pos,0,LocCd) WOMatRec = INSERT(WOMatRec,WO_MAT_INV_ACTION$,Pos,0,InvAction) WOMatRec = INSERT(WOMatRec,WO_MAT_INV_DTM$,Pos,0,thisInvDTM) WOMatRec = INSERT(WOMatRec,WO_MAT_INV_USER$,Pos,0,ScanUserID) WOMatRec = INSERT(WOMatRec,WO_MAT_INV_TAG$,Pos,0,Tag) WOMatRec = INSERT(WOMatRec,WO_MAT_INV_TOOL_ID$,Pos,0,ToolID) END * * * Added 5/14/2015 by JCH & DKK to "AutoScan" PTI transactions * * * * This section is dead WHCd = '1K' LocCd = 'PTI' InvAction = 'PLACE' ScanUserID = @USER4 Tag = '' ToolID = '' thisPtiDTM = ICONV(PtiDTM,'DT') LOCATE thisPtiDTM IN WOMatRec BY 'AR' USING @VM SETTING Pos ELSE WOMatRec = INSERT(WOMatRec,WO_MAT_INV_WH$,Pos,0,WHCd) WOMatRec = INSERT(WOMatRec,WO_MAT_INV_LOCATION$,Pos,0,LocCd) WOMatRec = INSERT(WOMatRec,WO_MAT_INV_ACTION$,Pos,0,InvAction) WOMatRec = INSERT(WOMatRec,WO_MAT_INV_DTM$,Pos,0,thisPtiDTM) WOMatRec = INSERT(WOMatRec,WO_MAT_INV_USER$,Pos,0,ScanUserID) WOMatRec = INSERT(WOMatRec,WO_MAT_INV_TAG$,Pos,0,Tag) WOMatRec = INSERT(WOMatRec,WO_MAT_INV_TOOL_ID$,Pos,0,ToolID) END * End of dead section WOMatParms = 'WO_MAT':@RM:WOMKey:@RM:WOMTableVar:@RM:WOMatRec obj_Tables('WriteRec',WOMatParms) ;* This writes and unlocks the WO_MAT records *obj_WO_Wfr('CassRel',WOMKey) ;* Added 3/17/2016 JCH for wafer history *************************************** END NEXT N Send_Info(STR(' ',60)) ;** - Messaging - ** Dummy = Set_Property('WO_LOG2.STATUS_LINE_FIX','BACKCOLOR',OrgColor) ;** - Messaging - ** * * * * * * WO_LOG record write was here OutOnlyCnt = COUNT(OutOnlyCassIDs,@VM) + (OutOnlyCassIDs NE '') ExistingWOMatKeys = WORec FOR I = 1 TO OutOnlyCnt OutOnlyCassID = OutOnlyCassIDs<1,I> LOCATE OutOnlyCassID IN ExistingWOMatKeys BY 'AR' USING @VM SETTING Pos ELSE ExistingWOMatKeys = INSERT(ExistingWOMatKeys,1,Pos,0,OutOnlyCassID) END NEXT I WORec = ExistingWOMatKeys ;* Add OutOnly Cassettetes to list inWO_LOG record. Send_Info('Saving WO_LOG record...') OtParms = FieldStore(OtParms,@RM,4,1,WORec) obj_Tables('WriteRec',OtParms) ;* Writes and unlocks the record It only has one value updated Send_Info(STR(' ',60)) ;** - Messaging - ** * * * * * * * * * * ReactNos = obj_Sched('GetReactNos',WONo) ;************************ 5/26/2-15 JCH Added schedule ReactNos and check for WO_START_DTM$ rnCnt = COUNT(ReactNos,@VM) + (ReactNos NE '') IF rnCnt GE 1 THEN BEGIN CASE CASE rnCnt = 1 Message = CassCnt:' Cassettes Released for Reactor No: ':ReactNos CASE rnCnt = 2 SWAP @VM WITH ' and ' IN ReactNos Message = CassCnt:' Cassettes Released for Reactor Nos: ':ReactNos CASE 1 LastReact = ReactNos<1,rnCnt> RestOfReacts = FIELD(ReactNos,@VM,1,rnCnt - 1) SWAP @VM WITH ', ' IN RestOfReacts Message = CassCnt:' Cassettes Release for Reactor Nos: ':RestOfReacts:', and ':LastReact END CASE IF WORec NE '' THEN Recipients = XLATE('NOTIFICATION','WO_RELEASE',NOTIFICATION_USER_ID$,'X') SentFrom = @USER4 Subject = 'Work Order Release on ':WONo IF ReactorType = 'EPP' THEN AttachWindow = 'WO_PROD_EPI' END ELSE AttachWindow = 'WO_PROD' END AttachKey = WONo:'*':1 SendToGroup = '' Parms = Recipients:@RM:SentFrom:@RM:Subject:@RM:Message:@RM:AttachWindow:@RM:AttachKey:@RM:SendToGroup obj_Notes('Create',Parms) IF Get_Status(errCode) THEN ErrMsg(errCode) END END END ;* WO is not on the schedule * * * * * * * * * * RETURN */ /* * * * * * * * RecallWO: * * * * * * * WONo = Parms[1,@RM] IF WONo = '' THEN ErrorMsg = 'Null parameter WONo passed to routine (':Method:').' IF ErrorMsg NE '' THEN RETURN WORec = XLATE('WO_LOG',WONo,'','X') CassNos = XLATE('WO_LOG',WONo,'WO_MAT_CASS_NO','X') CassCnt = COUNT(CassNos,@VM) + (CassNos NE '') WOMKeys = '' FOR K = 1 TO CassCnt WOMKeys<1,K> = WONo:'*':CassNos<1,K> NEXT K WOMTableVar = obj_WO_Mat('LockSet',WOMKeys) ;* Locks all WO_MAT records on the Work Order IF Get_Status(errCode) THEN RETURN ;* Couldn't lock all of the cassettes WOMCnt = COUNT(WOMKeys,@VM) + (WOMKeys NE '') FOR I = 1 TO WOMCnt WOMKey = WOMKeys<1,I> WOMatRec = XLATE('WO_MAT',WOMKey,'','X') ;* We have the lock, so just get the record this way WMIKey = WOMatRec WMOKey = WOMatRec IF WOMatRec NE '' THEN IF WOMatRec NE '' THEN RDSCnt = COUNT(WOMatRec,@VM) + (WOMatRec NE '') FOR N = 1 TO RDSCnt Set_Status(0) obj_RDS('Delete',WOMatRec) NEXT I END IF WMIKey NE '' THEN obj_WM_In('Delete',WMIKey) IF WMOKey NE '' THEN obj_WM_Out('Delete',WMOKey) obj_WO_Wfr('CassDel',WOMKey) ;* Added 3/17/2016 JCH for wafer tracking ********************************* WOMatRec = '' WOMatRec = '' WOMatRec = '' WOMatParms = 'WO_MAT':@RM:WOMKey:@RM:WOMTableVar:@RM:WOMatRec obj_Tables('WriteRec',WOMatParms) ;* This writes and unlocks the WO_MAT records END ELSE obj_Tables('UnlockRec','WO_MAT':@RM:WOMKey) ErrorMsg := " WO_Mat Record ":QUOTE(WOMKey):' has not been released':CRLF$ END NEXT I RETURN */