Merged PR 15044: Created a routine to determine lot eligible to be peeled off. Modified form l...

Created a routine to determine lot eligible to be peeled off. Modified form logic to allow for lots to be selected out of order.

Related work items: #252918
This commit is contained in:
Ouellette Jonathan (CSC FI SPS MESLEO) 2025-04-14 23:28:55 +02:00
parent 32df3e6816
commit 781274c395
2 changed files with 342 additions and 211 deletions

View File

@ -73,6 +73,7 @@ $Insert ORDER_EQU
$Insert ORDER_DET_EQU $Insert ORDER_DET_EQU
$Insert RLIST_EQUATES $Insert RLIST_EQUATES
$Insert WO_STEP_EQUATES $Insert WO_STEP_EQUATES
$Insert RDS_EQUATES
EQU COL$QUOTE_DESC TO 1 EQU COL$QUOTE_DESC TO 1
EQU COL$SETUP_CHG TO 4 EQU COL$SETUP_CHG TO 4
@ -1185,153 +1186,97 @@ Event PUB_REFRESH_SIG_PROFILE.CLICK()
end event end event
Event PUB_REM_CASS.CLICK() Event PUB_REM_CASS.CLICK()
ErrorMessage = ''
WONo = Get_Property(@WINDOW:'.EDL_WO_NO','TEXT') WONo = Get_Property(@WINDOW:'.EDL_WO_NO','TEXT')
WOStepKey = XLATE('WO_LOG', WONo, WO_LOG_WO_STEP_KEY$, 'X')
IF WONo NE '' then IF WONo NE '' then
WOReactType = Xlate('WO_LOG', WONo, WO_LOG_REACT_TYPE$, 'X')
WORec = XLATE('WO_LOG',WONo,'','X') Begin Case
WOMatKeys = WORec<WO_LOG_WO_MAT_KEY$> Case WOReactType EQ 'EPP'
WMInKeys = XLATE('WO_STEP', WOStepKey, WO_STEP_WM_IN_KEYS$, 'X') CassList = Work_Order_Services('GetEligiblePeelOffLotsByWOAndEntityType', WONo, 'WM_IN')
WMInTestSTring = WMInKeys Case WOReactType EQ 'ASM' OR WOReactType EQ 'HTR' OR WOReactType EQ 'ASM+'
CassList = Work_Order_Services('GetEligiblePeelOffLotsByWOAndEntityType', WONo, 'RDS')
CONVERT @VM TO '' IN WMInTestString Case Otherwise$
ErrorMessage = 'Unsupported or null reactor type for this work order.'
WMInCnt = COUNT(WMInKeys,@VM) + (WMinKeys NE '') End Case
If ErrorMessage EQ '' then
RDSNos = '' If CassList NE '' then
CassNos = '' Display = ''
DispLine = 1
WMIData = '' For each Cass in CassList using @VM
RDSData = '' Begin Case
Case WOReactType EQ 'EPP'
Display = '' WOMatKey = Field(Cass, '*', 1) : '*' : Field(Cass, '*', 3)
DispLine = 1 Case WOReactType EQ 'ASM' OR WOReactType EQ 'HTR' OR WOReactType EQ 'ASM+'
WOMatKey = Cass
IF WMInTestString NE '' THEN End Case
//EPP Case for WMI WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey, True$, 0, False$)
FOR I = WMInCnt TO 1 STEP -1 If WOReactType EQ 'EPP' then
WMIRec = XLATE('WM_IN',WMInKeys<1,I>,'','X') CassNo = Field(Cass, '*', 3)
WMIRdsNos = WMIRec<WM_IN_RDS_NO$> CassId = Cass
WMINCRNos = WMIRec<WM_IN_SLOT_NCR$> UnConvCurrStatus = XLATE('WM_IN',CassId,'CURR_STATUS','X')
CONVERT @VM TO '' IN WMIRdsNos CassCurrStatus = OCONV(UnConvCurrStatus,'[WM_IN_CURR_STATUS_CONV]')
CONVERT @VM TO '' IN WMINCRNos end else
UNTIL WMIRdsNos NE '' OR WMINCRNos NE '' CassNo = Field(Cass, '*', 2)
Display<1,DispLine,1> = FIELD(WOMatKeys<1,I>,'*',2) CassId = WOMatRec<WO_MAT_RDS_NO$>
Display<1,DispLine,2> = XLATE('WO_MAT',WOMatKeys<1,I>,WO_MAT_LOT_NO$,'X') UnConvCurrStatus = obj_WO_Mat('CurrStatus',CassId:@RM:WOMatRec)
Display<1,DispLine,3> = XLATE('WO_MAT',WOMatKeys<1,I>,WO_MAT_WAFER_QTY$,'X') CassCurrStatus = OConv(UnConvCurrStatus, '[WO_MAT_CURR_STATUS_CONV]')
Display<1,DispLine,4> = WMInKeys<1,I> end
Display<1,DispLine,5> = OCONV(XLATE('WM_IN',WMInKeys<1,I>,'CURR_STATUS','X'),'[WM_IN_CURR_STATUS_CONV]') Display<1,DispLine,1> = CassNo
DispLine += 1
NEXT I
IF Display NE '' THEN
TypeOver = ''
TypeOver<PDISPLAY$> = Display
WMIData = Popup(@WINDOW,TypeOver,'UNUSED_WM_IN')
WMIDCnt = COUNT(WMIData,@FM) + (WMIData NE '')
FOR N = 1 TO WMIDCnt
IF WMIData<N,1> NE Display<1,N,1> THEN
ErrMsg('You must pick cassettes from the top line downward in sequence.')
RETURN
END
NEXT N
IF WMIData = '' OR WMIData = CHAR(27) THEN
RETURN ;* Cancelled out
END
END ELSE
ErrMsg('All cassettes on this Work Order have started processing.')
RETURN
END
DelWMInKeys = ''
FOR I = 1 TO COUNT(WMIData,@FM) + (WMIData NE '')
CassNos<1,I> = WMIData<I,1>
DelWMInKeys<1,I> = WMIData<I,4>
NEXT I
TestWMInKeys = DelWMInKeys
IF TestWMInKeys NE '' THEN
Set_Status(0)
for each DelWMInKey in DelWMInKeys using @VM
Work_Order_Services('SignVoidWMI', DelWMInKey, @USER4)
Next DelWMInKey
END
END ELSE
//Non-EPP Case for RDS
CassCnt = COUNT(WOMatKeys,@VM) + (WOMatKeys NE '')
FOR I = CassCnt TO 1 STEP -1
WOMatKey = WOMatKeys<1,I>
WOMatRec = XLATE('WO_MAT',WOMatKey,'','X')
WOMatCurrStatus = obj_WO_Mat('CurrStatus',WOMatKey:@RM:WOMatRec)
WOMatSigs = WOMatRec<WO_MAT_SIGNATURE$>
CONVERT @VM TO '' IN WOMatSigs
UNTIL WOMatSigs NE ''
If WoMatCurrStatus NE 'VOID' then
Display<1,DispLine,1> = WOMatKeys<1,I>[-1,'B*']
Display<1,DispLine,2> = WOMatRec<WO_MAT_LOT_NO$> Display<1,DispLine,2> = WOMatRec<WO_MAT_LOT_NO$>
Display<1,DispLine,3> = WOMatRec<WO_MAT_WAFER_QTY$> Display<1,DispLine,3> = WOMatRec<WO_MAT_WAFER_QTY$>
Display<1,DispLine,4> = WOMatRec<WO_MAT_RDS_NO$> Display<1,DispLine,4> = CassId
Display<1,DispLine,5> = OCONV(WOMatCurrStatus,'[WO_MAT_CURR_STATUS_CONV]') Display<1,DispLine,5> = CassCurrStatus
DispLine += 1 DispLine += 1
end Next Cass
NEXT I CassettesToVoid = ''
IF Display NE '' THEN
TypeOver = '' TypeOver = ''
TypeOver<PDISPLAY$> = Display TypeOver<PDISPLAY$> = Display
UnusedData = Popup(@WINDOW,TypeOver,'UNUSED_RDS') If WOReactType EQ 'EPP' then
END ELSE CassettesToVoid = Popup(@WINDOW,TypeOver,'UNUSED_WM_IN')
ErrMsg('All cassettes on this Work Order have started processing.') If CassettesToVoid NE '' then
RETURN for each CassetteToVoid in CassettesToVoid using @FM
END WMIToVoid = CassetteToVoid<1,4>
Work_Order_Services('SignVoidWMI', WMIToVoid, @USER4)
If Error_Services('HasError') then
ErrorMessage = Error_Services('GetMessage')
end
Until ErrorMessage NE ''
Next CassetteToVoid
end else
ErrorMessage = 'No cassettes were selected.'
end
IF UnusedData = '' OR UnusedData = CHAR(27) THEN end else
RETURN ;* Cancelled out CassettesToVoid = Popup(@WINDOW,TypeOver,'UNUSED_RDS')
END for each CassetteToVoid in CassettesToVoid using @FM
UnusedCnt = COUNT(UnusedData,@FM) + (UnusedData NE '') RDSToVoid = CassetteToVoid<1,4>
WONo = XLATE('RDS', RDSToVoid, RDS_WO$, 'X')
FOR I = 1 TO UnusedCnt CassNo = XLATE('RDS', RDSToVoid, RDS_CASS_NO$, 'X')
IF Display<1,I,1> = UnusedData<I,1> THEN WOMatKey = WONo : '*' : CassNo
CassNos<1,I> = UnusedData<I,1> Work_Order_Services('SignVoidNonEPP', WOMatKey, @USER4)
RDSNos<1,I> = UnusedData<I,4> If Error_Services('HasError') then
END ELSE ErrorMessage = Error_Services('GetMessage')
Msg(@WINDOW,'','WO_MAT_REMOVAL') end
RETURN Until ErrorMessage NE ''
END Next CassetteToVoid
NEXT I
VoidStatusMessage = ''
for each CassNo in CassNos using @VM
WoMatKey = WONo : '*' : CassNo
Work_Order_Services('SignVoidNonEpp', WoMatKey, @USER4)
If Error_Services('HasError') then
VoidStatusMessage = Error_Services('GetMessage')
end end
Next CassNo end else
If VoidStatusMessage EQ '' then ErrorMessage = 'No eligible lots from this work order found to void.'
VoidStatusMessage = 'All cassettes have been queued for void.'
end end
Msg(@Window, VoidStatusMessage) end
END end else
Msg(@Window, ErrorMessage)
IF Display = '' THEN return
ErrMsg('All cassettes on this Work Order have started processing.') end
RETURN If ErrorMessage EQ '' then
END //Now send a message
Recipients = XLATE('NOTIFICATION','WO_ENTRY',NOTIFICATION_USER_ID$,'X') Recipients = XLATE('NOTIFICATION','WO_ENTRY',NOTIFICATION_USER_ID$,'X')
SentFrom = @USER4 SentFrom = @USER4
Subject = 'Unprocessed Cassettes removed from WO ':WONo Subject = 'Cassettes removed from WO ':WONo
Message = 'Cassettes removed from WO.' Message = 'Cassettes removed from WO.'
NewForm = Xlate('APP_INFO', 'NEW_WO_FORM', '', 'X') NewForm = Xlate('APP_INFO', 'NEW_WO_FORM', '', 'X')
If NewForm then If NewForm then
@ -1345,90 +1290,177 @@ Event PUB_REM_CASS.CLICK()
Parms = Recipients:@RM:SentFrom:@RM:Subject:@RM:Message:@RM:AttachWindow:@RM:AttachKey:@RM:SendToGroup Parms = Recipients:@RM:SentFrom:@RM:Subject:@RM:Message:@RM:AttachWindow:@RM:AttachKey:@RM:SendToGroup
obj_Notes('Create',Parms) obj_Notes('Create',Parms)
GoSub PopulateControls Msg(@Window, 'All selected lots queued for void.')
IF Get_Status(errCode) THEN
ErrMsg(errCode)
END
end else
Msg('Error in voiding lots process : ' : ErrorMessage)
end end
GoSub PopulateControls
end event end event
Event PUB_REM_WM_OUT.CLICK() Event PUB_REM_WM_OUT.CLICK()
ErrorMessage = ''
WONo = Get_Property(@WINDOW:'.EDL_WO_NO','TEXT') WONo = Get_Property(@WINDOW:'.EDL_WO_NO','TEXT')
WOStepKey = XLATE('WO_LOG', WONo, WO_LOG_WO_STEP_KEY$, 'X')
IF WONo NE '' then IF WONo NE '' then
WOReactType = Xlate('WO_LOG', WONo, WO_LOG_REACT_TYPE$, 'X')
Begin Case
Case WOReactType EQ 'EPP'
CassList = Work_Order_Services('GetEligiblePeelOffLotsByWOAndEntityType', WONo, 'WM_OUT')
Case WOReactType EQ 'ASM' OR WOReactType EQ 'HTR' OR WOReactType EQ 'ASM+'
ErrorMessage = 'Non EpiPro work order types do not utilize WM_OUT cassettes. Nothing to void.'
Case Otherwise$
ErrorMessage = 'Unsupported or null reactor type for this work order.'
End Case
If ErrorMessage EQ '' then
If CassList NE '' then
Display = ''
DispLine = 1
For each Cass in CassList using @VM
WOMatKey = Field(Cass, '*', 1) : '*' : Field(Cass, '*', 3)
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey, True$, 0, False$)
CassNo = Field(Cass, '*', 3)
CassId = Cass
UnConvCurrStatus = XLATE('WM_OUT',CassId,'CURR_STATUS','X')
CassCurrStatus = OCONV(UnConvCurrStatus,'[WM_OUT_CURR_STATUS_CONV]')
WORec = XLATE('WO_LOG',WONo,'','X') * Display<1,DispLine,1> = CassNo
WOMatKeys = WORec<WO_LOG_WO_MAT_KEY$> * Display<1,DispLine,2> = WOMatRec<WO_MAT_LOT_NO$>
WMOutKeys = Database_Services('ReadDataColumn', 'WO_STEP', WOStepKey, WO_STEP_WM_OUT_KEYS$, True$, 0, False$) * Display<1,DispLine,3> = WOMatRec<WO_MAT_WAFER_QTY$>
WMOutCnt = COUNT(WMOutKeys,@VM) + (WMOutKeys NE '') * Display<1,DispLine,4> = CassId
* Display<1,DispLine,5> = CassCurrStatus
* Display<1,DispLine,1> = FIELD(WOMatKeys<1,I>,'*',2)
* Display<1,DispLine,2> = OCONV(obj_WM_Out('CurrStatus',WOMatKeys<1,I>:@RM:WMORec),'[WO_MAT_CURR_STATUS_CONV]')
* Display<1,DispLine,3> = WMOutKeys<1,I>
Display = '' Display<1,DispLine,1> = CassNo
DispLine = 1 Display<1,DispLine,2> = CassCurrStatus
Display<1,DispLine,3> = CassId
IF WMOutCnt > 0 THEN DispLine += 1
Next Cass
FOR I = WMOutCnt TO 1 STEP -1 CassettesToVoid = ''
WMORec = XLATE('WM_OUT',WMOutKeys<1,I>,'','X')
WMO_RdsNos = WMORec<WM_OUT_RDS$>
WMO_NCRNos = WMORec<WM_OUT_SLOT_NCR$>
WMO_UMWCassIDs = WMORec<WM_OUT_UMW_CASS_ID$>
CONVERT @VM TO '' IN WMO_RdsNos
CONVERT @VM TO '' IN WMO_NCRNos
CONVERT @VM TO '' IN WMO_UMWCassIDs
UNTIL WMO_RdsNos NE '' OR WMO_NCRNos NE '' OR WMO_UMWCassIDs NE ''
Display<1,DispLine,1> = FIELD(WOMatKeys<1,I>,'*',2)
Display<1,DispLine,2> = OCONV(obj_WM_Out('CurrStatus',WOMatKeys<1,I>:@RM:WMORec),'[WO_MAT_CURR_STATUS_CONV]')
Display<1,DispLine,3> = WMOutKeys<1,I>
DispLine += 1
NEXT I
IF Display NE '' THEN
TypeOver = '' TypeOver = ''
TypeOver<PDISPLAY$> = Display TypeOver<PDISPLAY$> = Display
TypeOver<PTITLE$> = 'Unused WM_OUT Cassettes' CassettesToVoid = Popup(@WINDOW,TypeOver,'UNUSED_WM_OUT')
WMOData = Popup(@WINDOW,TypeOver,'UNUSED_WM_OUT') If CassettesToVoid NE '' then
IF WMOData = '' OR WMOData = CHAR(27) THEN RETURN ;* Cancelled out for each CassetteToVoid in CassettesToVoid using @FM
END ELSE WMOToVoid = CassetteToVoid<1,3>
ErrMsg('All cassettes on this Work Order have started processing.') Work_Order_Services('SignVoidWMO', WMOToVoid, @USER4)
RETURN If Error_Services('HasError') then
END ErrorMessage = Error_Services('GetMessage')
end
DelWMOutKeys = '' Until ErrorMessage NE ''
FOR I = 1 TO COUNT(WMOData,@FM) + (WMOData NE '') Next CassetteToVoid
DelWMOutKeys<1,I> = WMOData<I,3> end else
NEXT I ErrorMessage = 'No lots were selected to void.'
TestWMOutKeys = DelWMOutKeys
IF TestWMOutKeys NE '' THEN
for each WMOutKey in TestWMOutKeys using @VM
Work_Order_Services('SignVoidWMO', WMOutKey, @USER4)
Next WMOutKey
If Error_Services('HasError') then
Msg(@Window, Error_Services('GetMessage'))
end end
END end else
END ErrorMessage = 'No eligible lots from this work order found to void.'
end
IF Display = '' THEN end else
ErrMsg('All cassettes on this Work Order have had wafers placed in them.') Msg(@Window, ErrorMessage)
RETURN return
END end
IF Get_Status(errCode) THEN
ErrMsg(errCode)
END
GoSub PopulateControls
end end
If ErrorMessage EQ '' then
//Now send a message
Recipients = XLATE('NOTIFICATION','WO_ENTRY',NOTIFICATION_USER_ID$,'X')
SentFrom = @USER4
Subject = 'Cassettes removed from WO ':WONo
Message = 'Cassettes removed from WO.'
NewForm = Xlate('APP_INFO', 'NEW_WO_FORM', '', 'X')
If NewForm then
AttachWindow = 'NDW_WO_LOG'
end else
AttachWindow = 'WO_LOG2'
end
AttachKey = WONo
SendToGroup = ''
Parms = Recipients:@RM:SentFrom:@RM:Subject:@RM:Message:@RM:AttachWindow:@RM:AttachKey:@RM:SendToGroup
obj_Notes('Create',Parms)
Msg(@Window, 'All selected lots queued for void.')
end else
Msg('Error in voiding lots process : ' : ErrorMessage)
end
GoSub PopulateControls
end event end event
* Event PUB_REM_WM_OUT.CLICK()
* WONo = Get_Property(@WINDOW:'.EDL_WO_NO','TEXT')
* WOStepKey = XLATE('WO_LOG', WONo, WO_LOG_WO_STEP_KEY$, 'X')
* IF WONo NE '' then
*
* WORec = XLATE('WO_LOG',WONo,'','X')
* WOMatKeys = WORec<WO_LOG_WO_MAT_KEY$>
* WMOutKeys = Database_Services('ReadDataColumn', 'WO_STEP', WOStepKey, WO_STEP_WM_OUT_KEYS$, True$, 0, False$)
* WMOutCnt = COUNT(WMOutKeys,@VM) + (WMOutKeys NE '')
*
* Display = ''
* DispLine = 1
*
* IF WMOutCnt > 0 THEN
*
* FOR I = WMOutCnt TO 1 STEP -1
* WMORec = XLATE('WM_OUT',WMOutKeys<1,I>,'','X')
* WMO_RdsNos = WMORec<WM_OUT_RDS$>
* WMO_NCRNos = WMORec<WM_OUT_SLOT_NCR$>
* WMO_UMWCassIDs = WMORec<WM_OUT_UMW_CASS_ID$>
* CONVERT @VM TO '' IN WMO_RdsNos
* CONVERT @VM TO '' IN WMO_NCRNos
* CONVERT @VM TO '' IN WMO_UMWCassIDs
*
* UNTIL WMO_RdsNos NE '' OR WMO_NCRNos NE '' OR WMO_UMWCassIDs NE ''
* Display<1,DispLine,1> = FIELD(WOMatKeys<1,I>,'*',2)
* Display<1,DispLine,2> = OCONV(obj_WM_Out('CurrStatus',WOMatKeys<1,I>:@RM:WMORec),'[WO_MAT_CURR_STATUS_CONV]')
* Display<1,DispLine,3> = WMOutKeys<1,I>
* DispLine += 1
* NEXT I
*
* IF Display NE '' THEN
* TypeOver = ''
* TypeOver<PDISPLAY$> = Display
* TypeOver<PTITLE$> = 'Unused WM_OUT Cassettes'
* WMOData = Popup(@WINDOW,TypeOver,'UNUSED_WM_OUT')
* IF WMOData = '' OR WMOData = CHAR(27) THEN RETURN ;* Cancelled out
* END ELSE
* ErrMsg('All cassettes on this Work Order have started processing.')
* RETURN
* END
*
* DelWMOutKeys = ''
* FOR I = 1 TO COUNT(WMOData,@FM) + (WMOData NE '')
* DelWMOutKeys<1,I> = WMOData<I,3>
* NEXT I
*
* TestWMOutKeys = DelWMOutKeys
*
* IF TestWMOutKeys NE '' THEN
* for each WMOutKey in TestWMOutKeys using @VM
* Work_Order_Services('SignVoidWMO', WMOutKey, @USER4)
* Next WMOutKey
* If Error_Services('HasError') then
* Msg(@Window, Error_Services('GetMessage'))
* end
* END
* END
*
* IF Display = '' THEN
* ErrMsg('All cassettes on this Work Order have had wafers placed in them.')
* RETURN
* END
*
* IF Get_Status(errCode) THEN
* ErrMsg(errCode)
* END
*
* GoSub PopulateControls
* end
*
* end event
Event PUB_RECALL.CLICK() Event PUB_RECALL.CLICK()
@ -2138,7 +2170,3 @@ StartStopDate:
END END
return return

View File

@ -54,7 +54,7 @@ Declare subroutine Print_Wmi_Labels, Print_Wmo_Labels, ErrMsg, Print_Cass_Label
Declare subroutine obj_WO_Mat_Log, WO_Mat_Services, Work_Order_Services Declare subroutine obj_WO_Mat_Log, WO_Mat_Services, Work_Order_Services
Declare function SRP_Array, Work_Order_Services, Memory_Services, Database_Services, SRP_Sort_Array, SRP_JSON Declare function SRP_Array, Work_Order_Services, Memory_Services, Database_Services, SRP_Sort_Array, SRP_JSON
Declare function Company_Services, obj_Prod_Spec, Schedule_Services, Datetime, obj_WO_Log, obj_WO_Step, Memberof Declare function Company_Services, obj_Prod_Spec, Schedule_Services, Datetime, obj_WO_Log, obj_WO_Step, Memberof
Declare function Environment_Services, Logging_Services, Hold_Services Declare function Environment_Services, Logging_Services, Hold_Services, Signature_Services
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_LOG' LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_LOG'
LogDate = Oconv(Date(), 'D4/') LogDate = Oconv(Date(), 'D4/')
@ -1442,6 +1442,108 @@ Service SignVoidWMO(WMOutKey, Username)
end service end service
Service GetEligiblePeelOffLotsByWOAndEntityType(WONo, EntityType)
ErrorMessage = ''
EligibleCassIds = ''
If RowExists('WO_LOG', WONo) then
Begin Case
Case EntityType EQ 'RDS'
CassIds = Database_Services('ReadDataColumn', 'WO_LOG', WONo, WO_LOG_WO_MAT_KEY$, True$, 0, False$)
for each CassId in CassIds using @VM
RDSNo = XLATE('WO_MAT', CassId, WO_MAT_RDS_NO$, 'X')
Signatures = Signature_Services('GetSigProfile', CassId, 0, RDSNo)
Eligible = True$
for each Signature in Signatures<1> using @VM setting SigPos
SignatureDtm = Signatures<3, SigPos>
If SignatureDtm NE '' then
Eligible = False$
end
Until Eligible EQ False$
Next Signature
If Eligible then EligibleCassIds<1, -1> = CassId
Next CassId
Case EntityType EQ 'WM_OUT'
//WM_OUTS can be voided when
//1. There are no RDS Nos associated
//2. There have never been any wafers in them
WOStepKey = XLATE('WO_LOG', WONo, WO_LOG_WO_STEP_KEY$, 'X')
CassIds = Database_Services('ReadDataColumn', 'WO_STEP', WOStepKey, WO_STEP_WM_OUT_KEYS$, True$, 0, False$)
for each CassId in CassIds using @VM
WMORec = Database_Services('ReadDataRow', 'WM_OUT', CassId, True$, 0, False);//XLATE('WM_OUT',WMOutKeys<1,I>,'','X')
WMO_RdsNos = WMORec<WM_OUT_RDS$>
WMO_NCRNos = WMORec<WM_OUT_SLOT_NCR$>
WMO_UMWCassIDs = WMORec<WM_OUT_UMW_CASS_ID$>
Eligible = True$
//Loop through RDS list to see if there is an RDS attached. If there are any RDS No's attached it is not eligible.
for each RDSNo in WMO_RDSNos using @VM
If RDSNo NE '' then
Eligible = False$
end
Until Eligible EQ False$
Next RDSNo
//Loop through NCR list to see if there are any NCR's associated. If there are any NCR No's attached it is not eligible.
If Eligible then
For Each NCRNo in WMO_NCRNos using @VM
If NCRNo NE '' then
Eligible = False$
end
Until Eligible EQ False$
Next NCR
end
//Loop through MU Wafer Usage list to see if there are any MU wafer's taken from this lot. If there are any Makeup Wafers attached it is not eligible.
If Eligible then
For Each UMWCass in WMO_UMWCassIDs using @VM
If UMWCass NE '' then
Eligible = False$
end
Until Eligible EQ False$
Next UMWCass
end
If Eligible then EligibleCassIds<1, -1> = CassId
Next CassId
Case EntityType EQ 'WM_IN'
WOStepKey = XLATE('WO_LOG', WONo, WO_LOG_WO_STEP_KEY$, 'X')
CassIds = Database_Services('ReadDataColumn', 'WO_STEP', WOStepKey, WO_STEP_WM_IN_KEYS$, True$, 0, False$)
for each CassId in CassIds using @VM
Eligible = True$
WMIRec = Database_Services('ReadDataRow', 'WM_IN', CassId, True$, 0, False);//XLATE('WM_OUT',WMOutKeys<1,I>,'','X')
WMI_RdsNos = WMIRec<WM_IN_RDS_NO$>
WMI_NCRNos = WMIRec<WM_IN_NCR_NO$>
Eligible = True$
//Loop through RDS list to see if there is an RDS attached. If there are any RDS No's attached it is not eligible.
for each RDSNo in WMI_RDSNos using @VM
If RDSNo NE '' then
Eligible = False$
end
Until Eligible EQ False$
Next RDSNo
//Loop through NCR list to see if there are any NCR's associated. If there are any NCR No's attached it is not eligible.
If Eligible then
For Each NCRNo in WMI_NCRNos using @VM
If NCRNo NE '' then
Eligible = False$
end
Until Eligible EQ False$
Next NCR
end
If Eligible then EligibleCassIds<1, -1> = CassId
Next CassId
Case EntityType EQ ''
ErrorMessage = 'Entity type parameter was invalid.'
Case Otherwise$
ErrorMessage = 'Entity type parameter was null.'
End Case
end else
ErrorMessage = 'WO# ' : WONo : ' not found in WO_LOG table.'
end
If ErrorMessage NE '' then
Error_Services('Add', 'Error in ' : Service : '. ' : ErrorMessage)
end
Response = EligibleCassIds
end service
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Internal GoSubs // Internal GoSubs
@ -1455,3 +1557,4 @@ ClearCursors:
return return