467 lines
10 KiB
Plaintext
467 lines
10 KiB
Plaintext
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<WfrField,WOMatSlotNo> = WfrID
|
|
WOMatWfrRec<PrevWfrField,WOMatSlotNo> = ''
|
|
|
|
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<WfrField,WOMatSlotNo> = WfrID
|
|
WOMatWfrRec<PrevWfrField,WOMatSlotNo> = ''
|
|
|
|
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<PrevWfrField,WOMatSlotNo> = WOMatWfrRec<WfrField,WOMatSlotNo>
|
|
WOMatWfrRec<WfrField,WOMatSlotNo> = ''
|
|
|
|
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<PrevWfrField,WOMatSlotNo> = WOMatWfrRec<WfrField,WOMatSlotNo>
|
|
WOMatWfrRec<WfrField,WOMatSlotNo> = ''
|
|
|
|
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<WO_MAT_WFR_WFR_ID$,WOMatSlotNo>
|
|
|
|
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<WO_MAT_WAFER_QTY$>
|
|
|
|
IF WOMatRec<WO_MAT_HOLD$> = 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<WO_MAT_CASS_SHIP_QTY$>
|
|
|
|
If SlotCnt = '' THEN
|
|
SlotCnt = WOMatRec<WO_MAT_WAFER_QTY$>
|
|
END
|
|
|
|
WOMatWfrRec = XLATE('WO_MAT_WFR',WONo:'*':CassNo,'','X')
|
|
WfrKeys = WOMatWfrRec<WO_MAT_WFR_OUT_WFR_ID$>
|
|
PrevWfrKeys = WOMatWfrRec<WO_MAT_WFR_OUT_PREV_WFR_ID$>
|
|
|
|
FOR N = SlotCnt TO 1 STEP -1
|
|
|
|
SlotID = WOMatKey:'*':N
|
|
|
|
If WfrKeys<1,N> = '' Then
|
|
PrevDisp = obj_WO_WFr('Disp',WOMatWfrRec<WO_MAT_WFR_OUT_PREV_WFR_ID$,N>)[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<WO_WFR_LOC_EVENT$>
|
|
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<WO_WFR_LOC_DTM$,I>:@RM ;* EventDtm
|
|
Parms := WOWfrRec<WO_WFR_LOC_BY$,I>:@RM ;* EventBy
|
|
Parms := WOWfrRec<WO_WFR_LOC_EVENT$,I>:@RM ;* Event
|
|
Parms := WOWfrRec<WO_WFR_SLOT_ID$,I>:@RM ;* NewSlotID
|
|
Parms := WOWfrRec<WO_WFR_RUN_LOC$,I:@RM ;* RunLoc
|
|
Parms := WOWfrRec<WO_WFR_NCR_NO$,I>:@RM ;* NCRNo
|
|
Parms := WOWfrRec<WO_WFR_TW_USE$,I>:@RM ;* TWUse
|
|
Parms := WOWfrRec<WO_WFR_TOOL_ID$,I>:@RM ;* CurrSlotID
|
|
Parms := WOWfrRec<WO_WFR_INV_LOC$,I>: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<WO_MAT_WFR_WFR_ID$,WOMatSlotNo> = '' THEN
|
|
* WOMatWfrRec<WO_MAT_WFR_PREV_WFR_ID$,WOMatSlotNo> = 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
|
|
|
|
|
|
|
|
|
|
|
|
|