COMPILE FUNCTION obj_WO_Mat_Wfr(Method,Parms) /* Methods for the WO_MAT_WFR (Wafer) Tables 3/4/2016 JCH - Initial coding */ DECLARE FUNCTION Get_Status, Msg, obj_Tables, Send_Dyn, ErrMsg, obj_Tables, obj_WO_Wfr DECLARE SUBROUTINE ErrMsg, Set_Status, FieldStore, obj_Tables, obj_WO_Wfr, RList, Send_Dyn $Insert WO_MAT_WFR_EQUATES $Insert WO_WFR_EQUATES $Insert WO_MAT_EQUATES $Insert WO_LOG_EQUATES $Insert RLIST_EQUATES ErrTitle = 'Error in Stored Procedure "obj_WO_Mat_Wfr"' 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 = 'SetWfrID' ; Gosub SetWfrID Case Method = 'ClearWfrID' ; Gosub ClearWfrID CASE Method = 'GetWfrID' ; GOSUB GetWfrID Case Method = 'GetPreEpiWfrs' ; Gosub GetPreEpiWfrs Case Method = 'GetPostEpiSlots' ; Gosub GetPostEpiSlots Case Method = 'FixPrevWfr' ; Gosub FixPrevWfr CASE 1 NULL END CASE IF ErrorMsg NE '' THEN Set_Status(-1,ErrTitle:@SVM:ErrorMsg) END RETURN Result * * * * * * * SetWfrID: * * * * * * * SlotID = Parms[1,@RM] WfrID = Parms[COL2()+1,@RM] WfrSide = Parms[COL2()+1,@RM] If SlotID = '' THEN ErrorMsg = 'Null Parameter "SlotID" passed to routine. (':Method:')' If ErrorMsg NE '' Then Return WOMatWfrKey = FIELD(SlotID,'*',1,2) WOMatSlotNo = FIELD(SlotID,'*',3) otParms = 'WO_MAT_WFR':@RM:WOMatWfrKey WOMatWfrRec = obj_Tables('ReadRec',otParms) IF WfrSide = 'I' THEN WfrField = WO_MAT_WFR_IN_WFR_ID$ PrevWfrField = WO_MAT_WFR_IN_PREV_WFR_ID$ END ELSE WfrField = WO_MAT_WFR_OUT_WFR_ID$ PrevWfrField = WO_MAT_WFR_OUT_PREV_WFR_ID$ END WOMatWfrRec = WfrID WOMatWfrRec = '' otParms = FieldStore(otParms,@RM,4,0,WOMatWfrRec) obj_Tables('WriteRec',otParms) Return * * * * * * * SetWfrIDs: * * * * * * * *** New 9/6/2016 JCH * * * * WOMatKey = Parms[1,@RM] SlotIDs = Parms[COL2()+1,@RM] WfrIDs = Parms[COL2()+1,@RM] WfrSide = Parms[COL2()+1.@RM] IF WOMatKey = '' THEN ErrorMsg = 'Null Parameter "WOMatKey" passed to routine. (':Method:')' IF SlotIDs = '' THEN ErrorMsg = 'Null Parameter "SlotIDs" passed to routine. (':Method:')' IF WfrIDs = '' THEN ErrorMsg = 'Null Parameter "WfrIDs" passed to routine. (':Method:')' IF WfrSide = '' THEN ErrorMsg = 'Null Parameter "WfrSide" passed to routine. (':Method:')' IF WfrSide = 'I' THEN WfrField = WO_MAT_WFR_IN_WFR_ID$ PrevWfrField = WO_MAT_WFR_IN_PREV_WFR_ID$ END ELSE WfrField = WO_MAT_WFR_OUT_WFR_ID$ PrevWfrField = WO_MAT_WFR_OUT_PREV_WFR_ID$ END otParms = 'WO_MAT_WFR':@RM:WOMatWfrKey WOMatWfrRec = obj_Tables('ReadRec',otParms) wCnt = COUNT(WfrIDs,@VM) + (WfrIDs NE '') FOR I = 1 TO wCnt SlotID = SlotIDs<1,I> WfrID = WfrIDs<1,I> WOMatSlotNo = FIELD(SlotID,'*',3) WOMatWfrRec = WfrID WOMatWfrRec = '' NEXT I otParms = FieldStore(otParms,@RM,4,0,WOMatWfrRec) obj_Tables('WriteRec',otParms) RETURN * * * * * * * ClearWfrID: * * * * * * * SlotID = Parms[1,@RM] WfrID = Parms[COL2()+1,@RM] ;* Not used here WfrSide = Parms[COL2()+1,@RM] If SlotID = '' THEN ErrorMsg = 'Null Parameter "SlotID" passed to routine. (':Method:')' If ErrorMsg NE '' Then Return Convert '.' To '*' In SlotID WOMatWfrKey = Field(SlotID,'*',1,2) WOMatSlotNo = Field(SlotID,'*',3,1) otParms = 'WO_MAT_WFR':@RM:WOMatWfrKey WOMatWfrRec = obj_Tables('ReadRec',otParms) IF WfrSide = 'I' THEN WfrField = WO_MAT_WFR_IN_WFR_ID$ PrevWfrField = WO_MAT_WFR_IN_PREV_WFR_ID$ END ELSE WfrField = WO_MAT_WFR_OUT_WFR_ID$ PrevWfrField = WO_MAT_WFR_OUT_PREV_WFR_ID$ END WOMatWfrRec = WOMatWfrRec WOMatWfrRec = '' otParms = FieldStore(otParms,@RM,4,0,WOMatWfrRec) obj_Tables('WriteRec',otParms) Return * * * * * * * ClearWfrIDs: * * * * * * * *** New 9/6/2016 JCH * * * * WOMatKey = Parms[1,@RM] SlotIDs = Parms[COL2()+1,@RM] WfrIDs = Parms[COL2()+1,@RM] WfrSide = Parms[COL2()+1.@RM] IF WOMatKey = '' THEN ErrorMsg = 'Null Parameter "WOMatKey" passed to routine. (':Method:')' IF SlotIDs = '' THEN ErrorMsg = 'Null Parameter "SlotIDs" passed to routine. (':Method:')' IF WfrIDs = '' THEN ErrorMsg = 'Null Parameter "WfrIDs" passed to routine. (':Method:')' IF WfrSide = '' THEN ErrorMsg = 'Null Parameter "WfrSide" passed to routine. (':Method:')' Convert '.' To '*' In SlotIDs IF WfrSide = 'I' THEN WfrField = WO_MAT_WFR_IN_WFR_ID$ PrevWfrField = WO_MAT_WFR_IN_PREV_WFR_ID$ END ELSE WfrField = WO_MAT_WFR_OUT_WFR_ID$ PrevWfrField = WO_MAT_WFR_OUT_PREV_WFR_ID$ END otParms = 'WO_MAT_WFR':@RM:WOMatWfrKey WOMatWfrRec = obj_Tables('ReadRec',otParms) wCnt = COUNT(WfrIDs,@VM) + (WfrIDs NE '') FOR I = 1 TO wCnt SlotID = SlotIDs<1,I> WfrID = WfrIDs<1,I> WOMatSlotNo = FIELD(SlotID,'*',3) WOMatWfrRec = WOMatWfrRec WOMatWfrRec = '' NEXT I otParms = FieldStore(otParms,@RM,4,0,WOMatWfrRec) obj_Tables('WriteRec',otParms) RETURN * * * * * * * GetWfrID: * * * * * * * SlotID = Parms[1,@RM] If SlotID = '' THEN ErrorMsg = 'Null Parameter "SlotID" passed to routine. (':Method:')' If ErrorMsg NE '' Then Return Convert '.' To '*' In SlotID WOMatWfrKey = Field(SlotID,'*',1,2) WOMatSlotNo = Field(SlotID,'*',3,1) WOMatWfrRec = XLATE('WO_MAT_WFR',WOMatWfrKey,'','X') Result = WOMatWfrRec Return * * * * * * * GetPreEpiWfrs: * * * * * * * 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 IF CassNos = '' THEN CassNos = XLATE('WO_LOG',WONo,'WO_MAT_CASS_NO','X') END CassCnt = COUNT(CassNos,@VM) + (CassNos NE '') * Start Counting at the last box and work backward FOR I = CassCnt TO 1 STEP -1 CassNo = CassNos<1,I> WOMatKey = WONo:'*':CassNo WOMatRec = XLATE('WO_MAT' , WOMatKey , '' , 'X' ) SlotCnt = WOMatRec IF WOMatRec = 1 THEN NULL ;* Box is on hold - skip it END Else WOWfrIDs = Xlate('WO_MAT_WFR',WONo:'*':CassNo,WO_MAT_WFR_IN_WFR_ID$,'X') FOR N = SlotCnt TO 1 STEP -1 SlotID = WONo:'*':CassNo:'*':N If WOWfrIDs<1,N> = '' Then WfrID = '' End Else WfrID = WOWfrIDs<1,N> Result = INSERT(Result,1,0,0,SlotID:@VM:WfrID) ;* Plate-o-lator (LIFO) style End Next N END NEXT I RETURN * * * * * * * GetPostEpiSlots: * * * * * * * 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 IF CassNos = '' THEN CassNos = XLATE('WO_LOG',WONo,'WO_MAT_CASS_NO','X') END CassCnt = COUNT(CassNos,@VM) + (CassNos NE '') * Start Counting at the last box and work backward LoadQty = Xlate('WO_LOG',WONo,WO_LOG_OUT_CASS_LOAD_QTY$,'X') FOR I = CassCnt TO 1 STEP -1 CassNo = CassNos<1,I> WOMatKey = WONo:'*':CassNo WOMatRec = XLATE('WO_MAT' , WOMatKey , '' , 'X' ) SlotCnt = WOMatRec If SlotCnt = '' THEN SlotCnt = WOMatRec END WOMatWfrRec = XLATE('WO_MAT_WFR',WONo:'*':CassNo,'','X') WfrKeys = WOMatWfrRec PrevWfrKeys = WOMatWfrRec FOR N = SlotCnt TO 1 STEP -1 SlotID = WOMatKey:'*':N If WfrKeys<1,N> = '' Then PrevDisp = obj_WO_WFr('Disp',WOMatWfrRec)[1,' '] ;* Just need the 'EVENT' at the front of the text IF PrevDisp NE 'NCR' AND PrevDisp NE 'MKUP' THEN *IF NOT(RowExists('WMO_WFRS',WONo:'*':WOStep:'*':CassNo:'*':SlotNo)) THEN ;* Check for 'LOCK' in WMO_WFRS table Result = INSERT(Result,1,0,0,SlotID) ;* Plate-o-lator (LIFO) style END END NEXT N NEXT I RETURN * * * * * * * FixPrevWfr: * * * * * * * /* OPEN 'WO_WFR' TO WOWfrTable ELSE DEBUG RETURN END OPEN 'WO_MAT_WFR' TO WOMatWfrTable ELSE DEBUG RETURN END *RList('SELECT WO_WFR WITH REACT_TYPE = "EPP"',TARGET_ACTIVELIST$) RList('SELECT WO_WFR WITH WO_NO 162188 AND WITH CASS_NO >= 10',TARGET_ACTIVELIST$) IF Get_Status(errCode) THEN DEBUG Done = 0 RecNo = 0 FixCnt = 0 LOOP READNEXT WOWfrKey ELSE Done = 1 UNTIL Done READ WOWfrRec FROM WOWfrTable,WOWfrKey THEN RecNo += 1 Events = WOWfrRec eCnt = COUNT(Events,@VM) + (Events NE '') FOR I = 1 TO eCnt Event = Events<1,I> IF Event = 'LOAD' OR Event = 'TEST' OR Event = 'REPLACE' THEN WfrSide = 'I' END ELSE WfrSide = 'O' END Parms = WOWfrKey:@RM ;* WfrID Parms := WOWfrRec:@RM ;* EventDtm Parms := WOWfrRec:@RM ;* EventBy Parms := WOWfrRec:@RM ;* Event Parms := WOWfrRec:@RM ;* NewSlotID Parms := WOWfrRec:@RM ;* NCRNo Parms := WOWfrRec:@RM ;* TWUse Parms := WOWfrRec:@RM ;* CurrSlotID Parms := WOWfrRec:ReactNo:@RM ;* NewToolID (Load Tool) Parms := WOWfrRec<,I:@RM ;* CurrToolID Parms := WOWfrRec<,I:@RM ;* NewInvLoc Parms := WOWfrRec<,I:@RM ;* CurrInvLoc Parms := WfrSide ;* Wfr Side *obj_WO_Wfr('AddEvent',Parms) NEXT I *otParms = 'WO_MAT_WFR':@RM:WOMatWfrKey *WOMatWfrRec = obj_Tables('ReadRec',otParms) *IF WOMatWfrRec = '' THEN * WOMatWfrRec = PrevWfrID * FixCnt += 1 *END *otParms = FieldStore(otParms,@RM,4,0,WOMatWfrRec) *obj_Tables('WriteRec',otParms) Send_Dyn(RecNo:' ':FixCnt:' ':WOMatWfrKey:' ':WOMatSlotNo:' -> ':PrevWfrID:' ':LastEvent) END END ;* End of check for multiple lines End ;* End of record read Repeat */ RETURN