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 RLIST_EQUATES
$Insert WO_STEP_EQUATES
$Insert RDS_EQUATES
EQU COL$QUOTE_DESC TO 1
EQU COL$SETUP_CHG TO 4
@ -1185,153 +1186,97 @@ Event PUB_REFRESH_SIG_PROFILE.CLICK()
end event
Event PUB_REM_CASS.CLICK()
ErrorMessage = ''
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$>
WMInKeys = XLATE('WO_STEP', WOStepKey, WO_STEP_WM_IN_KEYS$, 'X')
WMInTestSTring = WMInKeys
CONVERT @VM TO '' IN WMInTestString
WMInCnt = COUNT(WMInKeys,@VM) + (WMinKeys NE '')
RDSNos = ''
CassNos = ''
WMIData = ''
RDSData = ''
Display = ''
DispLine = 1
IF WMInTestString NE '' THEN
//EPP Case for WMI
FOR I = WMInCnt TO 1 STEP -1
WMIRec = XLATE('WM_IN',WMInKeys<1,I>,'','X')
WMIRdsNos = WMIRec<WM_IN_RDS_NO$>
WMINCRNos = WMIRec<WM_IN_SLOT_NCR$>
CONVERT @VM TO '' IN WMIRdsNos
CONVERT @VM TO '' IN WMINCRNos
UNTIL WMIRdsNos NE '' OR WMINCRNos NE ''
Display<1,DispLine,1> = FIELD(WOMatKeys<1,I>,'*',2)
Display<1,DispLine,2> = XLATE('WO_MAT',WOMatKeys<1,I>,WO_MAT_LOT_NO$,'X')
Display<1,DispLine,3> = XLATE('WO_MAT',WOMatKeys<1,I>,WO_MAT_WAFER_QTY$,'X')
Display<1,DispLine,4> = WMInKeys<1,I>
Display<1,DispLine,5> = OCONV(XLATE('WM_IN',WMInKeys<1,I>,'CURR_STATUS','X'),'[WM_IN_CURR_STATUS_CONV]')
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*']
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_IN')
Case WOReactType EQ 'ASM' OR WOReactType EQ 'HTR' OR WOReactType EQ 'ASM+'
CassList = Work_Order_Services('GetEligiblePeelOffLotsByWOAndEntityType', WONo, 'RDS')
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
Begin Case
Case WOReactType EQ 'EPP'
WOMatKey = Field(Cass, '*', 1) : '*' : Field(Cass, '*', 3)
Case WOReactType EQ 'ASM' OR WOReactType EQ 'HTR' OR WOReactType EQ 'ASM+'
WOMatKey = Cass
End Case
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey, True$, 0, False$)
If WOReactType EQ 'EPP' then
CassNo = Field(Cass, '*', 3)
CassId = Cass
UnConvCurrStatus = XLATE('WM_IN',CassId,'CURR_STATUS','X')
CassCurrStatus = OCONV(UnConvCurrStatus,'[WM_IN_CURR_STATUS_CONV]')
end else
CassNo = Field(Cass, '*', 2)
CassId = WOMatRec<WO_MAT_RDS_NO$>
UnConvCurrStatus = obj_WO_Mat('CurrStatus',CassId:@RM:WOMatRec)
CassCurrStatus = OConv(UnConvCurrStatus, '[WO_MAT_CURR_STATUS_CONV]')
end
Display<1,DispLine,1> = CassNo
Display<1,DispLine,2> = WOMatRec<WO_MAT_LOT_NO$>
Display<1,DispLine,3> = WOMatRec<WO_MAT_WAFER_QTY$>
Display<1,DispLine,4> = WOMatRec<WO_MAT_RDS_NO$>
Display<1,DispLine,5> = OCONV(WOMatCurrStatus,'[WO_MAT_CURR_STATUS_CONV]')
Display<1,DispLine,4> = CassId
Display<1,DispLine,5> = CassCurrStatus
DispLine += 1
end
NEXT I
IF Display NE '' THEN
Next Cass
CassettesToVoid = ''
TypeOver = ''
TypeOver<PDISPLAY$> = Display
UnusedData = Popup(@WINDOW,TypeOver,'UNUSED_RDS')
END ELSE
ErrMsg('All cassettes on this Work Order have started processing.')
RETURN
END
IF UnusedData = '' OR UnusedData = CHAR(27) THEN
RETURN ;* Cancelled out
END
UnusedCnt = COUNT(UnusedData,@FM) + (UnusedData NE '')
FOR I = 1 TO UnusedCnt
IF Display<1,I,1> = UnusedData<I,1> THEN
CassNos<1,I> = UnusedData<I,1>
RDSNos<1,I> = UnusedData<I,4>
END ELSE
Msg(@WINDOW,'','WO_MAT_REMOVAL')
RETURN
END
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')
If WOReactType EQ 'EPP' then
CassettesToVoid = Popup(@WINDOW,TypeOver,'UNUSED_WM_IN')
If CassettesToVoid NE '' then
for each CassetteToVoid in CassettesToVoid using @FM
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
end else
CassettesToVoid = Popup(@WINDOW,TypeOver,'UNUSED_RDS')
for each CassetteToVoid in CassettesToVoid using @FM
RDSToVoid = CassetteToVoid<1,4>
WONo = XLATE('RDS', RDSToVoid, RDS_WO$, 'X')
CassNo = XLATE('RDS', RDSToVoid, RDS_CASS_NO$, 'X')
WOMatKey = WONo : '*' : CassNo
Work_Order_Services('SignVoidNonEPP', WOMatKey, @USER4)
If Error_Services('HasError') then
ErrorMessage = Error_Services('GetMessage')
end
Until ErrorMessage NE ''
Next CassetteToVoid
end
Next CassNo
If VoidStatusMessage EQ '' then
VoidStatusMessage = 'All cassettes have been queued for void.'
end else
ErrorMessage = 'No eligible lots from this work order found to void.'
end
Msg(@Window, VoidStatusMessage)
END
IF Display = '' THEN
ErrMsg('All cassettes on this Work Order have started processing.')
RETURN
END
end
end else
Msg(@Window, ErrorMessage)
return
end
If ErrorMessage EQ '' then
//Now send a message
Recipients = XLATE('NOTIFICATION','WO_ENTRY',NOTIFICATION_USER_ID$,'X')
SentFrom = @USER4
Subject = 'Unprocessed Cassettes removed from WO ':WONo
Subject = 'Cassettes removed from WO ':WONo
Message = 'Cassettes removed from WO.'
NewForm = Xlate('APP_INFO', 'NEW_WO_FORM', '', 'X')
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
obj_Notes('Create',Parms)
GoSub PopulateControls
IF Get_Status(errCode) THEN
ErrMsg(errCode)
END
Msg(@Window, 'All selected lots queued for void.')
end else
Msg('Error in voiding lots process : ' : ErrorMessage)
end
GoSub PopulateControls
end event
Event PUB_REM_WM_OUT.CLICK()
ErrorMessage = ''
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
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]')
* Display<1,DispLine,1> = CassNo
* Display<1,DispLine,2> = WOMatRec<WO_MAT_LOT_NO$>
* Display<1,DispLine,3> = WOMatRec<WO_MAT_WAFER_QTY$>
* 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<1,DispLine,1> = CassNo
Display<1,DispLine,2> = CassCurrStatus
Display<1,DispLine,3> = CassId
DispLine += 1
Next Cass
CassettesToVoid = ''
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'))
CassettesToVoid = Popup(@WINDOW,TypeOver,'UNUSED_WM_OUT')
If CassettesToVoid NE '' then
for each CassetteToVoid in CassettesToVoid using @FM
WMOToVoid = CassetteToVoid<1,3>
Work_Order_Services('SignVoidWMO', WMOToVoid, @USER4)
If Error_Services('HasError') then
ErrorMessage = Error_Services('GetMessage')
end
Until ErrorMessage NE ''
Next CassetteToVoid
end else
ErrorMessage = 'No lots were selected to void.'
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 else
ErrorMessage = 'No eligible lots from this work order found to void.'
end
end else
Msg(@Window, ErrorMessage)
return
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
* 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()
@ -2138,7 +2170,3 @@ StartStopDate:
END
return