open-insight/LSL2/STPROC/OBJ_WO_WFR_TEST.txt
Infineon\StieberD 7762b129af pre cutover push
2024-09-04 20:33:41 -07:00

824 lines
20 KiB
Plaintext

COMPILE FUNCTION obj_WO_Wfr_Test(Method,Parms)
/*
Methods for the WO_WFR (Wafer) Tables
3/1/2016 JCH - Initial coding
*/
DECLARE FUNCTION Get_Status, Msg, obj_Tables, Send_Dyn, ErrMsg, obj_Tables, Reconcile_Epi_WO, obj_WO_Mat_Wfr
DECLARE SUBROUTINE ErrMsg, Set_Status, Send_Dyn, FieldStore, obj_Tables, obj_WO_Wfr, Clear_Table, obj_WO_Mat_Wfr, Set_Property
Declare Subroutine Rlist, obj_Tool_Wfr, obj_Location, obj_Notes
$INSERT WO_LOG_EQUATES
$INSERT WO_MAT_EQUATES
$INSERT WM_IN_EQUATES
$INSERT WM_OUT_EQUATES
$INSERT RDS_EQUATES
$INSERT WO_WFR_EQUATES
$Insert WO_MAT_WFR_EQUATES
$Insert TW_USE_EQUATES
$Insert NCR_EQUATES
$Insert RLIST_Equates
Equ CRLF$ To \0D0A\
EQU WAFER_ID$ TO 1 ;* Columns in data structure returned by Reconcile_Epi_Pro
EQU LOT_NO$ TO 2
EQU LOADED_INTO$ TO 3
EQU RAN_IN$ TO 4
EQU POCKET_CHAR$ TO 5
EQU UNLOADED_INTO$ TO 6
EQU WAFER_DISP$ TO 7
ErrTitle = 'Error in Stored Procedure "obj_WO_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 = 'CassRel' ; Gosub CassRel
Case Method = 'AddEvent' ; Gosub AddEvent
Case Method = 'RemEvent' ; Gosub RemEvent
Case Method = 'CurrLoc' ; Gosub CurrLoc
Case Method = 'GetET' ; Gosub GetET
CASE Method = 'Convert' ; Gosub Convert
CASE Method = 'Disp' ; Gosub Disp
Case Method = 'CassDel' ; Gosub CassDel
CASE Method = 'LoadFromSlot' ; Gosub LoadFromSlot
CASE Method = 'UnloadIntoSlot' ; Gosub UnloadIntoSlot
CASE Method = 'InSlotDisp' ; Gosub InSlotDisp
CASE Method = 'OutSlotDisp' ; Gosub OutSlotDisp
CASE 1
NULL
END CASE
IF ErrorMsg NE '' THEN
Set_Status(-1,ErrTitle:@SVM:ErrorMsg)
END
RETURN Result
* * * * * * *
CassRel:
* * * * * * *
WOMatKey = Parms[1,@RM]
If WOMatKey = '' Then Return
WfrQty = Xlate('WO_MAT',WOMatKey,WO_MAT_WAFER_QTY$,'X')
CurrDTM = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS')
For I = 1 To WfrQty
owwParms = WOMatKey:'*':I:@RM ;* WfrID
owwParms := CurrDTM:@RM ;* EventDtm
owwParms := @USER4:@RM ;* EventBy
owwParms := 'REL':@RM ;* Event
owwParms := WOMatKey:'*':I:@RM ;* New Slot ID
owwParms := '':@RM ;* RPZ (RDSNo*Pocket*Zone)
owwParms := '':@RM ;* NCRNo
owwParms := '':@RM ;* TWUse ID
owwParms := '':@RM ;* Current Slot ID
owwParms := '':@RM ;* New ToolID
owwParms := '':@RM ;* Curr Tool ID
owwParms := '':@RM ;* NewInvLoc
owwParms := '':@RM ;* CurrInvLoc
owwParms := 'I' ;* Wfr Side
obj_WO_Wfr('AddEvent',owwParms)
Next I
Return
* * * * * * *
AddEvent:
* * * * * * *
WfrIDs = Parms[1,@RM]
EventDtm = Parms[COL2()+1,@RM]
EventBy = Parms[COL2()+1,@RM]
Event = Parms[COL2()+1,@RM]
NewSlotID = Parms[COL2()+1,@RM]
RunLoc = Parms[COL2()+1,@RM]
NCRNo = Parms[COL2()+1,@RM]
TWUse = Parms[COL2()+1,@RM]
CurrSlotID = Parms[COL2()+1,@RM]
NewToolID = Parms[COL2()+1,@RM]
CurrToolID = Parms[COL2()+1,@RM]
NewInvLoc = Parms[COL2()+1,@RM]
CurrInvLoc = Parms[COL2()+1,@RM]
WfrSide = Parms[COL2()+1,@RM]
NewCarrLoc = Parms[COL2()+1,@RM] ;* Added 6/20/2016 JCH
CurrCarrLoc = Parms[COL2()+1,@RM] ;* Added 6/20/2016 JCH
If WfrIDs = '' THEN ErrorMsg = 'Null Parameter "WfrIDs" passed to routine. (':Method:')'
*If EventDTM = '' THEN ErrorMsg = 'Null Parameter "EventDTM" passed to routine. (':Method:')'
*If EventBy = '' THEN ErrorMsg = 'Null Parameter "EventBy" passed to routine. (':Method:')'
If Event = '' THEN ErrorMsg = 'Null Parameter "EventEvent" passed to routine. (':Method:')'
If EventDTM NE '' THEN
thisEventDTM = ICONV(EventDTM,'DT')
If thisEventDTM = '' THEN ErrorMsg = 'Invalid Parameter EventDTM ':Quote(EventDTM):' passed to routine. (':Method:')'
If ErrorMsg NE '' Then RETURN
End
CONVERT '.' TO '*' IN NewSlotID
CONVERT '.' TO '*' IN CurrSlotID
IF NewSlotID NE '' THEN
NewSlotIDCassNo = FIELD(NewSlotID,'*',2)
IF NewSlotIDCassNo = '' THEN
DEBUG
RETURN
END
END
otParms = 'WO_WFR':@RM:WfrID
WfrRec = obj_Tables('ReadRec',otParms)
IF Get_Status(errCode) THEN
ErrMsg(errCode)
DEBUG
RETURN
END
If EventDTM = '' Then
ExistDTMs = WfrRec<WO_WFR_LOC_DTM$>
IF ExistDTMs = '' THEN
thisEventDTM = ICONV( OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS'),'DT' )
END ELSE
Loop
TestChar = ExistDTMs[-1,1]
Until TestChar NE @VM Or ExistDTMs = ''
ExistDTMs[-1,1] = ''
Repeat
LastDTM = ExistDTMs[-1,'B':@VM]
thisEventDTM = LastDTM + ( 1/24 ) ;* Fake a time for this 1 hour after last transaction.
END ;* End check for Existing DTMs
End
If EventBy = '' Then
EventBy = 'OI' ;* Admin user
End
Locate thisEventDTM In WfrRec<WO_WFR_LOC_DTM$> BY 'AR' SETTING Pos THEN
obj_Tables('UnlockRec',otParms)
IF Get_Status(ErrCode) THEN
ErrMsg(errCode)
DEBUG
END
END ELSE
DestTest = XLATE('TOOl',NewToolID,'DEST_TEST','X') ;* Tool Start on destructive test
IF DestTest THEN
IF WfrRec<WO_WFR_BROKEN$> = 1 THEN
obj_Tables('UnlockRec',otParms) ;* Wafer already flagged as broken
END ELSE
WfrRec<WO_WFR_BROKEN$> = 1 ;* Flag the wafer as broken
WfrRec = Insert(WfrRec,WO_WFR_LOC_DTM$,Pos,0,thisEventDTM)
WfrRec = Insert(WfrRec,WO_WFR_LOC_BY$,Pos,0,EventBy)
WfrRec = Insert(WfrRec,WO_WFR_LOC_EVENT$,Pos,0,'DEST') ;* Wafer flagged as destroyed
WfrRec = Insert(WfrRec,WO_WFR_SLOT_ID$,Pos,0,NewSlotID)
WfrRec = Insert(WfrRec,WO_WFR_RUN_LOC$,Pos,0,RunLoc)
WfrRec = Insert(WfrRec,WO_WFR_NCR_NO$,Pos,0,NCRNo)
WfrRec = Insert(WfrRec,WO_WFR_TW_USE$,Pos,0,TWUse)
WfrRec = Insert(WfrRec,WO_WFR_TOOL_ID$,Pos,0,'') ;* Wafer not logged
WfrRec = Insert(WfrRec,WO_WFR_INV_LOC$,Pos,0,NewInvLoc) ;* This is blank in this case
WfrRec = Insert(WfrRec,WO_WFR_WFR_SIDE$,Pos,0,WfrSide) ;* Added 5/28/2016 JCH
WfrRec = Insert(WfrRec,WO_WFR_CARR_SLOT$,Pos,0,NewCarrLoc) ;* Added 6/20/2016 JCH
otParms = FieldStore(otParms,@RM,4,0,WfrRec)
obj_Tables('WriteRec',otParms)
IF Get_Status(ErrCode) THEN
ErrMsg(errCode)
DEBUG
END
END
END ELSE
WfrRec = Insert(WfrRec,WO_WFR_LOC_DTM$,Pos,0,thisEventDTM)
WfrRec = Insert(WfrRec,WO_WFR_LOC_BY$,Pos,0,EventBy)
WfrRec = Insert(WfrRec,WO_WFR_LOC_EVENT$,Pos,0,Event)
WfrRec = Insert(WfrRec,WO_WFR_SLOT_ID$,Pos,0,NewSlotID)
WfrRec = Insert(WfrRec,WO_WFR_RUN_LOC$,Pos,0,RunLoc)
WfrRec = Insert(WfrRec,WO_WFR_NCR_NO$,Pos,0,NCRNo)
WfrRec = Insert(WfrRec,WO_WFR_TW_USE$,Pos,0,TWUse)
WfrRec = Insert(WfrRec,WO_WFR_TOOL_ID$,Pos,0,NewToolID)
WfrRec = Insert(WfrRec,WO_WFR_INV_LOC$,Pos,0,NewInvLoc)
WfrRec = Insert(WfrRec,WO_WFR_WFR_SIDE$,Pos,0,WfrSide) ;* Added 5/28/2016 JCH
WfrRec = Insert(WfrRec,WO_WFR_CARR_SLOT$,Pos,0,NewCarrLoc) ;* Added 6/20/2016 JCH
otParms = FieldStore(otParms,@RM,4,0,WfrRec)
obj_Tables('WriteRec',otParms)
IF Get_Status(ErrCode) THEN
ErrMsg(errCode)
DEBUG
END
END ; * end of check for destructive test
BEGIN CASE
CASE NewSlotID = '' AND CurrSlotID NE ''
obj_WO_Mat_Wfr('ClearWfrID',CurrSlotID:@RM:@RM:WfrSide) ;* Removes wafer from slot in WO_MAT_WFR record
CASE NewSlotID NE '' AND CurrSlotID NE ''
obj_WO_Mat_Wfr('SetWfrID',NewSlotID:@RM:WfrID:@RM:WfrSide) ;* Adds Wafer ID to NewSlotID in WO_MAT_WFR table
obj_WO_Mat_Wfr('ClearWfrID',CurrSlotID:@RM:@RM:WfrSide) ;* Removes wafer from CurrSlotIDin WO_MAT_WFR record
CASE NewSlotID NE '' AND CurrSlotID = ''
obj_WO_Mat_Wfr('SetWfrID',NewSlotID:@RM:WfrID:@RM:WfrSide) ;* Adds Wafer ID to NewSlotID in WO_MAT_WFR table
CASE 1
NULL
END Case
BEGIN CASE
CASE NewToolID = '' AND CurrToolID NE ''
obj_Tool_Wfr('ClearWfrID',CurrToolID:@RM:WfrID) ;* Removes wafer from Tool_WFR record
CASE NewToolID NE '' AND CurrToolID NE ''
obj_Tool_Wfr('SetWfrID',NewToolID:@RM:WfrID) ;* Adds Wafer ID to NewToolID IN TOOL_WFR table
obj_Tool_Wfr('ClearWfrID',CurrToolID) ;* Removes wafer from CurrToolID in TOOL_WFR record
CASE NewToolID NE '' AND CurrToolID = ''
obj_Tool_Wfr('SetWfrID',NewToolID:@RM:WfrID) ;* Adds Wafer ID to NewTOOLID IN TOOL_WFR table
CASE 1
NULL
END Case
BEGIN CASE
CASE NewInvLoc = '' AND CurrInvLoc NE ''
obj_Location('ClearWfrID',CurrInvLoc:@RM:WfrID) ;* Removes wafer from Location record
CASE NewInvLoc NE '' AND CurrInvLoc NE ''
obj_Location('SetWfrID',NewInvLoc:@RM:WfrID) ;* Adds Wafer ID to WFR_ID field IN LOCATION table
obj_Location('ClearWfrID',CurrInvLoc) ;* Removes wafer from WFR_ID field in LOCATION record
CASE NewInvLoc NE '' AND CurrInvLoc = ''
obj_Location('SetWfrID',NewInvLoc:@RM:WfrID) ;* Adds Wafer ID to WFR_ID field IN LOCATION table
CASE 1
NULL
END Case
END
Return
* * * * * * *
RemEvent:
* * * * * * *
* * * Removes NCR or TEST from history if they are the last event recorded * * *
WfrID = Parms[1,@RM]
Event = Parms[COL2()+1,@RM]
EventID = Parms[COL2()+1,@RM]
If WfrID = '' THEN ErrorMsg = 'Null Parameter "WfrID" passed to routine. (':Method:')'
If Event = '' THEN ErrorMsg = 'Null Parameter "Event" passed to routine. (':Method:')'
If ErrorMsg NE '' Then Return
If Event NE 'NCR' And Event NE 'TEST' Then
ErrorMsg = 'Only NCR or TEST events may be removed. Event = ':QUOTE(Event)
Return
END
otParms = 'WO_WFR':@RM:WfrID
WfrRec = obj_Tables('ReadRec',otParms)
IF WfrRec = '' THEN
obj_Tables('UnlockRec',otParms)
RETURN
END
BEGIN CASE
CASE Event = 'NCR' ; EventFieldNo = WO_WFR_NCR_NO$
CASE Event = 'TEST' ; EventFieldNo = WO_WFR_TW_USE$
CASE Event = ''
*otParms = 'WO_WFR':@RM:WfrID
obj_Tables('UnlockRec',otParms)
RETURN
END CASE
Locate EventID In WfrRec<EventFieldNo> USING @VM SETTING Pos Then
NewSlotID = WfrRec<WO_WFR_SLOT_ID$,Pos - 1>
If NewSlotID NE '' THEN
obj_WO_Mat_Wfr('SetWfrID',NewSlotID:@RM:WfrID) ;* Adds Wafer ID to NewSlotID in WO_MAT_WFR table
End
WfrRec = Delete(WfrRec,WO_WFR_LOC_DTM$,Pos,0)
WfrRec = Delete(WfrRec,WO_WFR_LOC_BY$,Pos,0)
WfrRec = Delete(WfrRec,WO_WFR_LOC_EVENT$,Pos,0)
WfrRec = Delete(WfrRec,WO_WFR_SLOT_ID$,Pos,0)
WfrRec = Delete(WfrRec,WO_WFR_RUN_LOC$,Pos,0)
WfrRec = Delete(WfrRec,WO_WFR_NCR_NO$,Pos,0)
WfrRec = Delete(WfrRec,WO_WFR_TW_USE$,Pos,0)
otParms = FieldStore(otParms,@RM,4,1,WfrRec)
obj_Tables('WriteRec',otParms)
End Else
*otParms = 'WO_WFR':@RM:WfrID
obj_Tables('UnlockRec',otParms)
End
Return
* * * * * * *
CurrLoc:
* * * * * * *
IF NOT(ASSIGNED(WfrID)) THEN WfrID = Parms[1,@RM]
IF NOT(ASSIGNED(WfrRec)) THEN WfrRec = Parms[COL2()+1,@RM]
IF WfrID = '' THEN RETURN ;* This is used in the dictionary -> don't throw an error for a null parmeter
IF WfrRec = '' THEN WfrRec = XLATE('WO_WFR',WfrID,'','X')
WfrEvents = WfrRec<WO_WFR_LOC_EVENT$>
CurrLoc = ''
weCnt = Count(WfrEvents,@VM) + (WfrEvents NE '')
For M = WeCnt To 1 STEP -1
WfrEvent = WfrEvents<1,M>
WOMatLoc = WfrRec<WO_WFR_SLOT_ID$,M>
ToolLoc = WfrRec<WO_WFR_TOOL_ID$,M>
InvIDLoc = WfrRec<WO_WFR_INV_LOC$,M>
If WOMatLoc NE '' Then CurrLoc<1,1> = Field(WoMatLoc,'*',1,2)
If ToolLoc NE '' Then CurrLoc<1,2> = ToolLoc
If InvIDLoc NE '' Then CurrLoc<1,3> = InvIDLoc
While CurrLoc = ''
Next M
Result = CurrLoc
RETURN
* * * * * * *
GetET:
* * * * * * *
* Returns time in Hours since last event happened
WfrID = Parms[1,@RM]
WfrRec = Parms[COL2()+1,@RM]
IF WfrID = '' THEN RETURN ;* This is used in the dictionary -> don't throw an error for a null parmeter
IF WfrRec = '' THEN WfrRec = XLATE('WO_WFR',WfrID,'','X')
LocDTMs = WfrRec<WO_WFR_LOC_DTM$>
LocCnt = COUNT(LocDTMs,@VM) + (LocDTMs NE '')
LastDTM = LocDTMs<1,LocCnt>
IF LastDTM = '' THEN RETURN ;* Bail
CurrDTM = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTH')
CurrDTM = ICONV(CurrDTM , 'DT' )
IF CurrDTM > LastDTM THEN
Result = OCONV(ICONV( (CurrDTM - LastDTM)*24 , 'MD1'), 'MD1') ;* Elapsed time in hours to 1 decimal precision
END
RETURN
* * * * * * *
Disp:
* * * * * * *
IF NOT(ASSIGNED(WfrID)) THEN WfrID = Parms[1,@RM]
IF NOT(ASSIGNED(WfrRec)) THEN WfrRec = Parms[COL2()+1,@RM]
IF WfrID = '' THEN RETURN ;* This is used in the dictionary -> don't throw an error for a null parmeter
IF WfrRec = '' THEN WfrRec = XLATE('WO_WFR',WfrID,'','X')
WfrEvents = WfrRec<WO_WFR_LOC_EVENT$>
evCnt = COUNT(WfrEvents,@VM) + ( WfrEvents NE '' )
Loaded = INDEX(WfrEvents,'LOAD',1)
Unloaded = INDEX(WfrEvents,'UNLOAD',1)
BEGIN CASE
CASE NOT(Loaded)
EpiStage = 'Pre'
CASE Loaded AND NOT(Unloaded)
EpiStage ='React'
CASE Loaded AND Unloaded
EpiStage = 'Post'
END CASE
LastEvent = WfrRec<WO_WFR_LOC_EVENT$,evCnt>
BEGIN CASE
CASE LastEvent = 'TEST'
TWKey = WfrRec<WO_WFR_TW_USE$,evCnt>
IF TWKey = '' THEN TWKey = '***'
Disp = 'TEST -> ':TWKey
CASE LastEvent = 'NCR'
Disp = 'NCR':' - ':WfrRec<WO_WFR_NCR_NO$,evCnt>:' ':WfrRec<WO_WFR_SLOT_ID$,evCnt-1>
CASE LastEvent = 'UNLOAD'
Disp = 'UNLOAD -> ':WfrRec<WO_WFR_SLOT_ID$,evCnt>
CASE LastEvent = 'LOAD'
Disp = 'LOAD -> ':WfrRec<WO_WFR_RUN_LOC$,evCnt>
CASE LastEvent = 'MKUP'
Disp = 'MKUP -> ':WfrRec<WO_WFR_SLOT_ID$,evCnt>
CASE LastEvent = 'MOVE'
Disp = 'MOVE -> ':WfrRec<WO_WFR_SLOT_ID$,evCnt>
CASE LastEvent = 'REPLACE'
Disp = 'REPLACE -> ':WfrRec<WO_WFR_SLOT_ID$,evCnt>
CASE LastEvent = 'RETURN'
Disp = 'RETURN -> ':WfrRec<WO_WFR_RUN_LOC$,evCnt>
CASE 1
Disp = 'PROD - ':WfrID
END CASE
Result = Disp
RETURN
* * * * * * *
CassDel:
* * * * * * *
WOMatKey = Parms[1,@RM]
If WOMatKey = '' Then Return
WfrQty = Xlate('WO_MAT',WOMatKey,WO_MAT_WAFER_QTY$,'X')
otParms = 'WO_MAT_WFR':@RM:WOMatKey
obj_Tables('DeleteRec',otParms)
For I = 1 To WfrQty
otParms = 'WO_WFR':@RM:WOMatKey:'*':I
obj_Tables('DeleteRec',otParms)
Next I
Return
* * * * * * *
InSlotDisp:
* * * * * * *
WOWfrKey = Parms[1,@RM]
WOWfrRec = Parms[COL2()+1,@RM]
IF WOWfrKey = '' THEN RETURN ;* Called from dictionary -> no messages
IF WOWfrRec = '' THEN
WOWfrRec = XLATE('WO_WFR',WOWfrKey,'','X')
END
IF WOWfrRec = '' THEN RETURN
eCnt = COUNT(WOWfrRec<WO_WFR_LOC_EVENT$>,@VM) + (WOWfrRec<WO_WFR_LOC_EVENT$> NE '')
LoadPOs = ''
NCRPos = ''
TestPos = ''
UnloadPos = ''
FOR I = eCnt TO 1 STEP -1
Event = WOWfrRec<WO_WFR_LOC_EVENT$,I>
IF Event = 'LOAD' AND LoadPos = '' THEN LoadPos = I
IF Event = 'NCR' AND NCRPos = '' THEN NCRPos = I
IF Event = 'TEST' AND TestPos = '' THEN TestPos = I
IF Event = 'UNLOAD' AND UnloadPos = '' THEN UnloadPos = I
UNTIL LoadPos AND NCRPos AND TestPos AND UnloadPos
NEXT I
BEGIN CASE
CASE NCRPos AND LoadPos = '' ; Result = 'PreEpi NCR - ':WOWfrRec<WO_WFR_NCR_NO$,NCRPos>
CASE TestPos NE '' ; Result = 'Prod Test - ':WOWfrRec<WO_WFR_TW_USE$,TestPos>
CASE LoadPos NE '' ; Result = 'Load - ':WOWfrREc<WO_WFR_TOOL_ID$,LoadPos>:' ':WOWfrRec<WO_WFR_RUN_LOC$,LoadPos>
CASE 1
NULL
END CASE
RETURN
* * * * * * *
OutSlotDisp:
* * * * * * *
WOWfrKey = Parms[1,@RM]
WOWfrRec = Parms[COL2()+1,@RM]
IF WOWfrKey = '' THEN RETURN ;* Called from dictionary -> no messages
IF WOWfrRec = '' THEN
WOWfrRec = XLATE('WO_WFR',WOWfrKey,'','X')
END
IF WOWfrRec = '' THEN RETURN
eCnt = COUNT(WOWfrRec<WO_WFR_LOC_EVENT$>,@VM) + (WOWfrRec<WO_WFR_LOC_EVENT$> NE '')
MkupPos = ''
NCRPos = ''
UnloadPos = ''
FOR I = eCnt TO 1 STEP -1
Event = WOWfrRec<WO_WFR_LOC_EVENT$,I>
IF Event = 'MKUP' AND MkupPos = '' THEN MkupPos = I
IF Event = 'NCR' AND NCRPos = '' THEN NCRPos = I
IF Event = 'UNLOAD' AND UnloadPos = '' THEN UnloadPos = I
UNTIL UnloadPos AND NCRPos AND MkupPos
NEXT I
BEGIN CASE
CASE NCRPos AND UnLoadPos NE '' ; Result = 'NCR Post Epi - ':WOWfrRec<WO_WFR_NCR_NO$,NCRPos>
CASE MkupPos NE '' ; Result = 'UMW - ':WOWfrRec<WO_WFR_SLOT_ID$,MkupPos>
CASE 1
NULL
END CASE
RETURN
* * * * * * *
Convert:
* * * * * * *
*CLEAR_TABLE('WO_WFR')
*CLEAR_TABLE('WO_MAT_WFR')
WONos = '161854'
wCnt = COUNT(WONos,@VM) + (WONos NE '')
FOR I = 1 TO wCnt
WONo = WONos<1,I>
EpiProFlag = Xlate('WO_LOG',WONo,'EPI_PRO_FLAG','X')
If EpiProFlag THEN
CALL Convert_Epi_WO(WONo)
End Else
Gosub ConvertASM
End
NEXT I
RETURN
* * * * * * *
ConvertASM:
* * * * * * *
Open 'WO_MAT' To WOMatTable Else
ErrMsg(ErrorMsg)
Return
End
SelectSent = 'SELECT WO_MAT WITH WO_NO = ':QUOTE(WONo):' BY CASS_NO'
Set_Status(0)
RList(SelectSent,TARGET_ACTIVELIST$,'','','')
IF Get_Status(errCode) THEN
ErrMsg(errCode)
Return
END
Done = 0
LOOP
READNEXT WOMatKey ELSE Done = 1
UNTIL Done
WOMatRec = Xlate('WO_MAT',WOMatKey,'','X')
WONo = WOMatKey[1,'*']
CassNo = WOMatKey[COL2()+1,'*']
SlotNos = WOMatRec<WO_MAT_SLOT_NO$>
sCnt = Count( SlotNos,@VM ) + ( SlotNos NE '' )
For I = 1 To sCnt
SlotNo = SlotNos<1,I>
NCRNo = WOMatRec<WO_MAT_SLOT_NCR$,I>
TWUseKey = WOMatRec<WO_MAT_SLOT_MET_NO$,I>
RepWfrID = WOMatRec<WO_MAT_SLOT_REP_WAFER_ID$,I>
WfrID = WONo:'*':CassNo:'*':SlotNo
CurrWfrRec = Xlate('WO_WFR',WfrID,'','X')
If NCRNo NE '' Then
Locate NCRNo In WOMatRec<WO_MAT_NCR_KEYS$> BY 'AR' SETTING NPos Then
NCRBy = WOMatRec<WO_MAT_NCR_FINAL_SIG$,NPos>
NCRDTM = WOMatRec<WO_MAT_NCR_FINAL_SIG_DTM$,NPos>
CurrWfrRec = XLATE('WO_WFR',WfrID,'','X')
LOCATE NCRNo IN CurrWfrRec<WO_WFR_NCR_NO$> SETTING cwPos ELSE
owwParms = WfrID:@RM ;* WfrID
owwParms := Oconv(NCRDtm,'DT4/^S'):@RM ;* Event Dtm
owwParms := NCRBy:@RM ;* Event By
owwParms := 'NCR':@RM ;* Event
owwParms := '':@RM ;* NewSlotID
owwParms := '':@RM ;* RunID (RPZ)
owwParms := NCRNo:@RM ;* NCRNo
owwParms := '':@RM ;* TwID
owwParms := WfrID ;* CurrSlotID
obj_WO_Wfr('AddEvent',owwParms)
END ;* End of check for NCRNo already in WO_WFR record
End ;* End of locating NCRNo IN WOMatRec field
End ;* End of check for NCR No
If TWUseKey NE '' Then
LOCATE 'TEST' IN CurrWfrRec<WO_WFR_LOC_EVENT$> SETTING twPos ELSE
TWUseRec = XLATE('TW_USE',TWUseKey,'','X')
TWSig = TWUseRec<TW_USE_SIGNATURE$>
TWSigDtm = TWUseRec<TW_USE_SIG_DTM$>
owwParms = WfrID:@RM ;* WfrID
owwParms := Oconv(TWSigDTM,'DT4/^S'):@RM ;* Event Dtm
owwParms := TWSig:@RM ;* Event By
owwParms := 'TEST':@RM ;* Event
owwParms := '':@RM ;* NewSlotID
owwParms := '':@RM ;* RunID (RPZ)
owwParms := '':@RM ;* NCRNo
owwParms := TWUseKey:@RM ;* TWUseKey
owwParms := WfrID ;* CurrSlotID
obj_WO_Wfr('AddEvent',owwParms)
END ;* End of check for 'TEST' Event already in WO_WFR Record
End ;* End of check for TWUseKey
If RepWfrID NE '' Then
Convert '.' To '*' In RepWfrID
LOCATE WfrID IN CurrWfrRec<WO_WFR_SLOT_ID$> SETTING Dummy ELSE
owwParms = RepWfrID:@RM ;* WfrID
owwParms := '':@RM ;* Event Dtm
owwParms := '':@RM ;* Event By
owwParms := 'MKUP':@RM ;* Event
owwParms := WfrID:@RM ;* NewSlotID
owwParms := '':@RM ;* RunID (RPZ)
owwParms := '':@RM ;* NCRNo
owwParms := '':@RM ;* TwID
owwParms := RepWfrID ;* CurrSlotID
obj_WO_Wfr('AddEvent',owwParms)
END ;* End of new Slot ID already in the existing WO_WFR Rec
End ;* End of check for RepWfrID
Next I
REPEAT
RETURN
* * * * * * *
LoadFromSlot:
* * * * * * *
DEBUG
RETURN
* * * * * * *
UnloadIntoSlot:
* * * * * * *
DEBUG
RETURN