ebase 8/22/2025

Modified RDS_Actions to fix RDSNo being unassigned when calling obj_wo_react -> RemRDS

various bug fixes

Re-initializaing branch

Modified RDS_Actions to fix RDSNo being unassigned when calling obj_wo_react -> RemRDS

Added a check prior to running Load logic to check that a reactor is assigned.
This commit is contained in:
Infineon\Ouellette
2025-08-20 17:01:57 -07:00
parent cc2213061c
commit d61ae234c9
12 changed files with 6092 additions and 3104 deletions

View File

@ -82,8 +82,6 @@ Equ COL$MET_SIG_DTM to 12
Equ MSG_WIDTH$ to 600
EQU READONLY_GREEN$ TO 192 + (220*256) + (192*65536)
Declare subroutine ErrMsg, Set_Status, obj_WO_Mat, obj_WO_Mat_Log, obj_RDS, Set_Property, Send_Event, Database_Services
Declare subroutine Dialog_Box, Qa_Services, Obj_React_Ll, Start_Window, obj_React_Status, Reactor_Services, Rds_Services
Declare subroutine Lot_Event_Services, Override_Log_Services, Logging_Services
@ -170,7 +168,8 @@ end event
Event PUB_SIGN.CLICK()
RDSNo = Get_Property(@WINDOW:'.RDS_NO','TEXT')
ReactorType = Get_Property(@WINDOW:'.REACTOR_TYPE','TEXT')
LoadLockVal = Get_Property(@WINDOW:'.LOAD_LOCK_SIDE_HIDDEN','TEXT')
@ -183,365 +182,345 @@ Event PUB_SIGN.CLICK()
LSIDArray = Get_Property(@WINDOW:'.RDS_LS_ID','ARRAY')
Preauthenticated = FALSE$
SignEventType = Get_Property(CtrlEntID, 'TEXT')
WoMatKey = WONo : '*' : CassNo
Begin Case
Case SignEventType EQ 'Sign'
debug
RDSNo = Get_Property(@WINDOW:'.RDS_NO','DEFPROP')
WfrQty = Get_Property(@WINDOW:'.WAFERS_IN','TEXT')
LLSide = Get_Property(@Window:'.LOAD_LOCK_SIDE', 'DEFPROP')
Reactor = Get_Property(@Window:'.REACTOR', 'TEXT')
ReactorRec = Database_Services('ReadDataRow', 'REACTOR', Reactor)
ReactorType = ReactorRec<REACTOR_REACT_TYPE$>
ROTREnabled = Xlate('REACTOR', Reactor, 'ENABLE_ROTR', 'X')
// Don't allow tracking in on down reactor
ReactorCurrModeKey = Xlate('REACTOR_CHILD_KEY_IDS_NG', Reactor, 1, 'X')
ReactCurrModeRec = Database_Services('ReadDataRow','REACT_MODE_NG', ReactorCurrModeKey, '','','')
CurrReactMode = ReactCurrModeRec<REACT_MODE_NG_MODE$>
CurrE10State = Xlate('REACTOR_MODES', CurrReactMode, REACTOR_MODES_E10_STATE$, 'X')
Override = False$
UserVerification = ''
OverrideGroups = 'LEAD':@VM:'SUPERVISOR':@VM:'ENGINEERING':@VM:'ENG_TECH':@VM:'ROTR_OVERRIDE'
ReactorIsDown = CurrE10State _NEC 'PRODUCTIVE'
If (ReactorIsDown EQ True$) then
// Allow override during prove in
If ReactorType EQ 'EPP' then
If RDS_Services('IsEpiProTestRun', RDSNo) then Override = True$
Reactor = Database_Services('ReadDataColumn', 'RDS', RDSNo, RDS_REACTOR$, True$, 0, False$)
If Reactor NE '' then
ReactorRec = Database_Services('ReadDataRow', 'REACTOR', Reactor)
ReactorType = ReactorRec<REACTOR_REACT_TYPE$>
ROTREnabled = Xlate('REACTOR', Reactor, 'ENABLE_ROTR', 'X')
// Don't allow tracking in on down reactor
ReactorCurrModeKey = Xlate('REACTOR_CHILD_KEY_IDS_NG', Reactor, 1, 'X')
ReactCurrModeRec = Database_Services('ReadDataRow','REACT_MODE_NG', ReactorCurrModeKey, '','','')
CurrReactMode = ReactCurrModeRec<REACT_MODE_NG_MODE$>
CurrE10State = Xlate('REACTOR_MODES', CurrReactMode, REACTOR_MODES_E10_STATE$, 'X')
Override = False$
UserVerification = ''
OverrideGroups = 'LEAD':@VM:'SUPERVISOR':@VM:'ENGINEERING':@VM:'ENG_TECH':@VM:'ROTR_OVERRIDE'
ReactorIsDown = CurrE10State _NEC 'PRODUCTIVE'
If (ReactorIsDown EQ True$) then
// Allow override during prove in
If ReactorType EQ 'EPP' then
If RDS_Services('IsEpiProTestRun', RDSNo) then Override = True$
end
If Override EQ False$ then
UserMsg = "Reactor down. Override required from a lead or supervisor."
UserVerification = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4:@FM:OverrideGroups:@FM:'':@FM:UserMsg)
Override = UserVerification<1>
end
end
If Override EQ False$ then
UserMsg = "Reactor down. Override required from a lead or supervisor."
UserVerification = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4:@FM:OverrideGroups:@FM:'':@FM:UserMsg)
Override = UserVerification<1>
end
end
If (ReactorIsDown NE True$) OR (Override EQ True$) then
If (ReactorType EQ 'ASM+' OR ReactorType EQ 'HTR' OR ReactorType EQ 'ASM') AND (ROTREnabled EQ True$) then
ROTRStatus = ReactorRec<REACTOR_ROTR_STATUS$>
If ROTRStatus EQ 'F' then
FailReason = ReactorRec<REACTOR_ROTR_STATUS_REASON$>
Message = 'Unable to load reactor.' : CRLF$ : FailReason
RotrOverrideCount = ReactorRec<REACTOR_ROTR_OVERRIDE_COUNT$>
If RotrOverrideCount EQ '' then RotrOverrideCount = 0
Message := CRLF$ : RotrOverrideCount : ' override(s) were performed since the ROTR block was originally set.'
Message := CRLF$ : 'A lead or supervisor must override to clear ROTR status.'
Response = Msg(@Window, '', 'RDS_ROTR_OVERRIDE', '', Message)
Begin Case
Case Response EQ 1
Response = True$ ; // User Clicked Override
Case Response EQ 2
Response = False$ ; // User Clicked Cancel
Case Response EQ char(27)
Response = False$ ; // User Pressed Escape Key
End Case
If Response EQ True$ then
If UserVerification EQ '' then
UserVerification = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4:@FM:OverrideGroups)
end
Valid = UserVerification<1>
If Valid EQ True$ then
// Prompt user for a comment
ResponseComment = Dialog_Box('NDW_ADD_COMMENT', @WINDOW)
IF ResponseComment<2> NE '' THEN
// Clear ROTR reactor load block.
overrideLogTable = 'RDS':@VM:'REACTOR'
overrideLogKey = RDSNo:@VM:Reactor
overrideLogUser = Response<2>
overrideLogComment = ResponseComment<2>
overrideLogCategory = 'ROTR_BLOCK'
overrideLogCause = FailReason
orKey = Override_Log_Services('Create', overrideLogTable, overrideLogKey, overrideLogUser, overrideLogComment, overrideLogCategory, overrideLogCause)
//Add override key to RDS
RDSRec = Xlate('RDS', RDSNo, '', 'X')
RDSRec = Insert(RDSRec, RDS_OVERRIDE_KEYS$, 1, 0, orKey)
ReactorRec<REACTOR_ROTR_STATUS$> = 'P'
rotrStatusReason = ReactorRec<REACTOR_ROTR_STATUS_REASON$>
ReactorRec<REACTOR_PREVIOUS_ROTR_STATUS_REASON$> = rotrStatusReason
ReactorRec<REACTOR_ROTR_STATUS_REASON$> = ''
ReactorRec<REACTOR_PREVIOUS_ROTR_OVERRIDE_RDS$> = RDSNo
rotrOverrideCount = ReactorRec<REACTOR_ROTR_OVERRIDE_COUNT$>
ReactorRec<REACTOR_ROTR_OVERRIDE_COUNT$> = rotrOverrideCount + 1
Database_Services('WriteDataRow', 'REACTOR', Reactor, ReactorRec, True$, False$, True$)
Database_Services('WriteDataRow', 'RDS', RDSNo, RDSRec, True$, False$, True$)
If (ReactorIsDown NE True$) OR (Override EQ True$) then
If (ReactorType EQ 'ASM+' OR ReactorType EQ 'HTR' OR ReactorType EQ 'ASM') AND (ROTREnabled EQ True$) then
ROTRStatus = ReactorRec<REACTOR_ROTR_STATUS$>
If ROTRStatus EQ 'F' then
FailReason = ReactorRec<REACTOR_ROTR_STATUS_REASON$>
Message = 'Unable to load reactor.' : CRLF$ : FailReason
RotrOverrideCount = ReactorRec<REACTOR_ROTR_OVERRIDE_COUNT$>
If RotrOverrideCount EQ '' then RotrOverrideCount = 0
Message := CRLF$ : RotrOverrideCount : ' override(s) were performed since the ROTR block was originally set.'
Message := CRLF$ : 'A lead or supervisor must override to clear ROTR status.'
Response = Msg(@Window, '', 'RDS_ROTR_OVERRIDE', '', Message)
Begin Case
Case Response EQ 1
Response = True$ ; // User Clicked Override
Case Response EQ 2
Response = False$ ; // User Clicked Cancel
Case Response EQ char(27)
Response = False$ ; // User Pressed Escape Key
End Case
If Response EQ True$ then
If UserVerification EQ '' then
UserVerification = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4:@FM:OverrideGroups)
end
Valid = UserVerification<1>
If Valid EQ True$ then
// Prompt user for a comment
ResponseComment = Dialog_Box('NDW_ADD_COMMENT', @WINDOW)
IF ResponseComment<2> NE '' THEN
// Clear ROTR reactor load block.
overrideLogTable = 'RDS':@VM:'REACTOR'
overrideLogKey = RDSNo:@VM:Reactor
overrideLogUser = Response<2>
overrideLogComment = ResponseComment<2>
overrideLogCategory = 'ROTR_BLOCK'
overrideLogCause = FailReason
orKey = Override_Log_Services('Create', overrideLogTable, overrideLogKey, overrideLogUser, overrideLogComment, overrideLogCategory, overrideLogCause)
//Add override key to RDS
RDSRec = Xlate('RDS', RDSNo, '', 'X')
RDSRec = Insert(RDSRec, RDS_OVERRIDE_KEYS$, 1, 0, orKey)
ReactorRec<REACTOR_ROTR_STATUS$> = 'P'
rotrStatusReason = ReactorRec<REACTOR_ROTR_STATUS_REASON$>
ReactorRec<REACTOR_PREVIOUS_ROTR_STATUS_REASON$> = rotrStatusReason
ReactorRec<REACTOR_ROTR_STATUS_REASON$> = ''
ReactorRec<REACTOR_PREVIOUS_ROTR_OVERRIDE_RDS$> = RDSNo
rotrOverrideCount = ReactorRec<REACTOR_ROTR_OVERRIDE_COUNT$>
ReactorRec<REACTOR_ROTR_OVERRIDE_COUNT$> = rotrOverrideCount + 1
Database_Services('WriteDataRow', 'REACTOR', Reactor, ReactorRec, True$, False$, True$)
Database_Services('WriteDataRow', 'RDS', RDSNo, RDSRec, True$, False$, True$)
end else
//No Comment added. Block Load Signaure
Msg(@Window, 'A comment is required to perform an ROTR Block Override', '', '', '')
return
end
end else
//No Comment added. Block Load Signaure
Msg(@Window, 'A comment is required to perform an ROTR Block Override', '', '', '')
// ROTR override not verified. Block load signature.
return
end
end else
// ROTR override not verified. Block load signature.
// Block load signature
return
end
end else
// Block load signature
return
end
end
end
end
end
SupplAckReq = Supplement_Services('UnacknowledgedSupplementCheck', 'RDS', RDSNo, 'LOAD')
IF (SupplAckReq NE FALSE$) then
Response = Dialog_Box('NDW_RDS_SUPP_SIG', @Window, RDSNo :@FM: 'LOAD' :@FM: FALSE$)
If Response EQ False$ then
return
end else
PreAuthenticated = TRUE$
end
end
RDSLayerAckReq = Xlate('RDS', RDSNo, 'RDS_LAYER_ACK_REQ', 'X')
If RDSLayerAckReq EQ True$ then
ErrorMessage = 'RDS layer parameters must be reviewed for accuracy and acknowledged before the load operation can be signed.'
ErrMsg(ErrorMessage)
LayerKeys = Xlate('RDS', RDSNo, 'RDS_LAYER_KEYS', 'X')
// Just display the first layer
RDSLSID = LayerKeys<0, 1>
Dialog_Box('RDS_LAYER', @Window, RDSLSID)
RDSLayerAck = Xlate('RDS', RDSNo, 'RDS_LAYER_ACK', 'X')
If ( (RDSLayerAck EQ False$) or (RDSLayerAck EQ '') ) then
ErrorMessage = 'RDS layer parameters were not acknowledged. Sign load stage event aborting.'
ErrMsg(ErrorMessage)
return
end
end
FWIInstAckReq = Xlate('RDS', RDSNo, 'FWI_INST_ACK_REQ', 'X')
If (FWIInstAckReq EQ True$) then
Response = RDS_Services('RDSVerifyInst', RDSNo, 'FWI')
If Response EQ False$ then return
end
LoadInstAckReq = Xlate('RDS', RDSNo, 'LOAD_INST_ACK_REQ', 'X')
If (LoadInstAckReq EQ True$) then
Response = RDS_Services('RDSVerifyInst', RDSNo, 'LOAD')
If Response EQ False$ then return
end
SupplAckReq = Xlate('RDS', RDSNo, 'SUPPL_ACK_REQ', 'X')
IF (SupplAckReq EQ True$) then
Response = Dialog_Box('NDW_RDS_SUPP_SIG', @Window, RDSNo)
If Response EQ False$ then return
end
//Check if TW Required
if XLATE('APP_INFO', 'NEW_TW_SYSTEM_ACTIVE_SWITCH', 1, 'X') EQ True$ AND (ReactorType EQ 'HTR' OR ReactorType EQ 'ASM' OR ReactorType 'ASM+') then
UsingTestWafers = False$
IsTWReqd = RDS_Services('IsTWLoggingReqd', RDSNo)
ExistingTestWafersLogged = Test_Run_Services('GetTestRunKeysByRDS', RdsNo)
If ExistingTestWafersLogged NE True$ then
If Not(IsTWReqd) then
//Test wafer logging is NOT required here.
If ReactorType NE 'EPP' then
UsingTestWafers = Msg(@Window, '', 'YESNO', '', 'Test Wafer Usage logging is not required on this load.':@FM:'Are any test wafers loaded?')
If UsingTestWafers EQ True$ then
TWLogResult = Dialog_Box('NDW_LOG_TEST_WAFER_USAGE', @Window, RDSNo : @VM : 'STANDARD' : @VM : 'REACTOR' : @VM : Reactor)
If TWLogResult NE True$ then
ContinueSign = Msg(@Window, '', 'YESNO', '', 'Continue?':@FM:'Test wafer logging was cancelled. Do you wish to continue signing?')
If Not(ContinueSign) then return
end
end
end
SupplAckReq = Supplement_Services('UnacknowledgedSupplementCheck', 'RDS', RDSNo, 'LOAD')
IF (SupplAckReq NE FALSE$) then
Response = Dialog_Box('NDW_RDS_SUPP_SIG', @Window, RDSNo :@FM: 'LOAD' :@FM: FALSE$)
If Response EQ False$ then
return
end else
//Test wafer logging is Required here.
Begin Case
Case ReactorType EQ 'ASM' OR ReactorType EQ 'HTR'
UsingTestWafers = Msg(@Window, '', 'YESNO', '', 'A test wafer is required to be ran with this load for metrology on this run':@FM:'Are any test wafers loaded?')
Case ReactorType EQ 'ASM+'
UsingTestWafers = Msg(@Window, '', 'YESNO', '', 'A test wafer is required to be ran with this load for metrology on the next run.':@FM:'Are any test wafers loaded?')
End Case
If UsingTestWafers EQ True$ then
//User has stated that they are using test wafers
TWLogResult = Dialog_Box('NDW_LOG_TEST_WAFER_USAGE', @Window, RDSNo : @VM : 'STANDARD' : @VM : 'REACTOR' : @VM : Reactor)
If TWLogResult NE True$ then
//User exited the the TW log prompt answering that they are not using any test wafers.
PreAuthenticated = TRUE$
end
end
RDSLayerAckReq = Xlate('RDS', RDSNo, 'RDS_LAYER_ACK_REQ', 'X')
If RDSLayerAckReq EQ True$ then
ErrorMessage = 'RDS layer parameters must be reviewed for accuracy and acknowledged before the load operation can be signed.'
ErrMsg(ErrorMessage)
LayerKeys = Xlate('RDS', RDSNo, 'RDS_LAYER_KEYS', 'X')
// Just display the first layer
RDSLSID = LayerKeys<0, 1>
Dialog_Box('RDS_LAYER', @Window, RDSLSID)
RDSLayerAck = Xlate('RDS', RDSNo, 'RDS_LAYER_ACK', 'X')
If ( (RDSLayerAck EQ False$) or (RDSLayerAck EQ '') ) then
ErrorMessage = 'RDS layer parameters were not acknowledged. Sign load stage event aborting.'
ErrMsg(ErrorMessage)
return
end
end
FWIInstAckReq = Xlate('RDS', RDSNo, 'FWI_INST_ACK_REQ', 'X')
If (FWIInstAckReq EQ True$) then
Response = RDS_Services('RDSVerifyInst', RDSNo, 'FWI')
If Response EQ False$ then return
end
LoadInstAckReq = Xlate('RDS', RDSNo, 'LOAD_INST_ACK_REQ', 'X')
If (LoadInstAckReq EQ True$) then
Response = RDS_Services('RDSVerifyInst', RDSNo, 'LOAD')
If Response EQ False$ then return
end
SupplAckReq = Xlate('RDS', RDSNo, 'SUPPL_ACK_REQ', 'X')
IF (SupplAckReq EQ True$) then
Response = Dialog_Box('NDW_RDS_SUPP_SIG', @Window, RDSNo)
If Response EQ False$ then return
end
//Check if TW Required
if XLATE('APP_INFO', 'NEW_TW_SYSTEM_ACTIVE_SWITCH', 1, 'X') EQ True$ AND (ReactorType EQ 'HTR' OR ReactorType EQ 'ASM' OR ReactorType 'ASM+') then
UsingTestWafers = False$
IsTWReqd = RDS_Services('IsTWLoggingReqd', RDSNo)
ExistingTestWafersLogged = Test_Run_Services('GetTestRunKeysByRDS', RdsNo)
If ExistingTestWafersLogged NE True$ then
If Not(IsTWReqd) then
//Test wafer logging is NOT required here.
If ReactorType NE 'EPP' then
UsingTestWafers = Msg(@Window, '', 'YESNO', '', 'Test Wafer Usage logging is not required on this load.':@FM:'Are any test wafers loaded?')
If UsingTestWafers EQ True$ then
TWLogResult = Dialog_Box('NDW_LOG_TEST_WAFER_USAGE', @Window, RDSNo : @VM : 'STANDARD' : @VM : 'REACTOR' : @VM : Reactor)
If TWLogResult NE True$ then
ContinueSign = Msg(@Window, '', 'YESNO', '', 'Continue?':@FM:'Test wafer logging was cancelled. Do you wish to continue signing?')
If Not(ContinueSign) then return
end
end
end
end else
//Test wafer logging is Required here.
Begin Case
Case ReactorType EQ 'ASM' OR ReactorType EQ 'HTR'
UsingTestWafers = Msg(@Window, '', 'YESNO', '', 'A test wafer is required to be ran with this load for metrology on this run':@FM:'Are any test wafers loaded?')
Case ReactorType EQ 'ASM+'
UsingTestWafers = Msg(@Window, '', 'YESNO', '', 'A test wafer is required to be ran with this load for metrology on the next run.':@FM:'Are any test wafers loaded?')
End Case
If UsingTestWafers EQ True$ then
//User has stated that they are using test wafers
TWLogResult = Dialog_Box('NDW_LOG_TEST_WAFER_USAGE', @Window, RDSNo : @VM : 'STANDARD' : @VM : 'REACTOR' : @VM : Reactor)
If TWLogResult NE True$ then
//User exited the the TW log prompt answering that they are not using any test wafers.
UserMsg = "Unable to sign load because test wafer logging is required on this run. A supervisor or lead may override."
OverrideGroups = 'LEAD':@VM:'SUPERVISOR':@VM:'ENGINEERING':@VM:'ENG_TECH'
UserVerification = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4:@FM:OverrideGroups:@FM:'':@FM:UserMsg)
Override = UserVerification<1>
OverrideUser = UserVerification<2>
If Override then
Override_log_services('Create', 'RDS', RDSNo, OverrideUser, '', 'TW_USAGE', '')
end else
return
end
end
end else
//User has stated that they are NOT using test wafers
UserMsg = "Unable to sign load because test wafer logging is required on this run. A supervisor or lead may override."
OverrideGroups = 'LEAD':@VM:'SUPERVISOR':@VM:'ENGINEERING':@VM:'ENG_TECH'
UserVerification = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4:@FM:OverrideGroups:@FM:'':@FM:UserMsg)
Override = UserVerification<1>
OverrideUser = UserVerification<2>
If Override then
Override_log_services('Create', 'RDS', RDSNo, OverrideUser, '', 'TW_USAGE', '')
Override_log_services('Create', 'RDS', RDSNo, OverrideUser, '', 'TW_USAGE', '')
end else
return
return
end
end
end else
//User has stated that they are NOT using test wafers
UserMsg = "Unable to sign load because test wafer logging is required on this run. A supervisor or lead may override."
OverrideGroups = 'LEAD':@VM:'SUPERVISOR':@VM:'ENGINEERING':@VM:'ENG_TECH'
UserVerification = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4:@FM:OverrideGroups:@FM:'':@FM:UserMsg)
Override = UserVerification<1>
OverrideUser = UserVerification<2>
If Override then
Override_log_services('Create', 'RDS', RDSNo, OverrideUser, '', 'TW_USAGE', '')
end else
return
end
end
end
end
end
ReadyToSign = QA_Services('LoadSignatureReady', RDSNo, @User4, WfrQty, LLSide)
If ReadyToSign EQ True$ then
If PreAuthenticated EQ FALSE$ then
initParams = ''
initParams<4> = 'Sign Load'
Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, initParams)
Valid = Response<1>
If (Valid EQ True$) then
ReadyToSign = QA_Services('LoadSignatureReady', RDSNo, @User4, WfrQty, LLSide)
If ReadyToSign EQ True$ then
If PreAuthenticated EQ FALSE$ then
initParams = ''
initParams<4> = 'Sign Load'
Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, initParams)
Valid = Response<1>
If (Valid EQ True$) then
QA_Services('SignLoadStage', RDSNo, @USER4, WfrQty, LLSide)
end
end else
QA_Services('SignLoadStage', RDSNo, @USER4, WfrQty, LLSide)
end
end else
QA_Services('SignLoadStage', RDSNo, @USER4, WfrQty, LLSide)
end
end
If Error_Services('HasError') then
ErrorMsg = Error_Services('GetMessage')
ErrMsg(ErrorMsg)
If Error_Services('HasError') then
ErrorMsg = Error_Services('GetMessage')
ErrMsg(ErrorMsg)
end
end else
Msg(@Window, "Reactor load signature not allowed on a down reactor.")
end
end else
Msg(@Window, "Reactor load signature not allowed on a down reactor.")
Msg(@Window, "RDS is not assigned to a reactor.")
end
GoSub OLE_LL_Status
Set_Property(@Window, 'SAVEWARN', False$)
Send_Event(@Window, 'READ')
Case SignEventType EQ 'Unsign'
// 1. Check if on hold. If so, then block event and inform user
WOMatKey = WONo:'*':CassNo
WOMatCurrStatus = obj_WO_Mat('CurrStatus',WOMatKey)
IF WOMatCurrStatus = 'HOLD' THEN
ErrorMessage = 'Process Error':@SVM:'Cassette is on Hold and may not have the signature removed.':CRLF$:CRLF$
ErrMsg(ErrorMessage)
RETURN 0
END
// 2.
// a. For Non-EPP - Check if LWII, LWIS, or FQA has been signed. If so, then block event and inform user
// b. For EPP - Check Clean_Insp actions to see if an inspection or surfscan has been completed
// Also check the FQA signature (MO_QA)
UnloadSig = Xlate('RDS', RDSNo, 'OPERATOR_OUT', 'X')
ReactorType = Xlate('RDS', RDSNo, 'REACTOR_TYPE','X')
CISigs = Xlate('RDS', RDSNo, 'LWI_CI_SIG', 'X')
Convert @VM to '' in CISigs
IF ReactorType NE 'EPP' THEN
FQASig = Xlate('RDS', RDSNo, 'SUP_VER_SIG', 'X')
END ELSE
WMOutKey = Xlate('RDS', RDSNo, 'WM_OUT_KEY', 'X')
FQASig = Xlate('WM_OUT', WMOutKey, 'SUP_VER_SIG', 'X')
END
If ( (UnloadSig NE '') or (CISigs NE '') or (FQASig NE '') ) then
// UNLOAD, LWII, LWIS, or FQA already signed. Block unload unsign event.
ErrorMessage = 'Process Error':@SVM:'UNLOAD, LWII, LWIS, or FQA already signed. Cannot unsign unload event.' |
: CRLF$ : CRLF$
ErrMsg(ErrorMessage)
Return 0
end
// 1. Check if RDS Load signature is eligible to be set.
IsEligible = QA_Services('UnsignLoadSignatureReady', RDSNo)
// 3. Lead/Supervisor/Engineer/EngTech override
Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4 : @FM : 'LEAD' : @VM : 'SUPERVISOR':@VM:'ENGINEER':@VM:'ENG_TECH')
Valid = Response<1>
OverrideUser = Response<2>
If Valid then
Machine = Environment_Services('GetServer')
Headers = 'Logging DTM' : @FM : 'Machine' : @FM : 'Log'
ColumnWidths = 20 : @FM : 15 : @FM : 300
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\Lot'
makeDirSuccess = Utility("MAKEDIR", LogPath)
LogFileName = 'R':RDSNo:'.csv'
objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ' ', Headers, ColumnWidths, False$, False$)
LogData = ''
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS') ; // Logging DTM
LogData<2> = Machine
LogData<3> = 'LOAD stage unsigned for RDS ':RDSNo:' by user ':@User4
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$)
// 4. Remove WO_MAT Unload signature, date, and time
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
SigProf = WOMatRec<WO_MAT_SIG_PROFILE$>
Sigs = WOMatRec<WO_MAT_SIGNATURE$>
SigDTMs = WOMatRec<WO_MAT_SIG_DTM$>
Locate '1LOAD' in SigProf using @VM setting vPos then
Sigs<1, vPos> = ''
SigDTMs<1, vPos> = ''
WOMatRec<WO_MAT_SIGNATURE$> = Sigs
WOMatRec<WO_MAT_SIG_DTM$> = SigDTMs
obj_React_Status('HandleLoadUnsign',Reactor:@RM:WONo:@RM:CassNo:@RM:RDSNo:@RM:OverrideUser)
end
// 5. Remove '1LOAD' material log entry (i.e. WO_MAT<INV...> columns)
InvActions = WOMatRec<WO_MAT_INV_ACTION$>
Locate '1LOAD' in InvActions using @VM setting vPos then
WOMatRec<WO_MAT_INV_WH$> = Delete(WOMatRec<WO_MAT_INV_WH$>, 0, vPos, 0)
WOMatRec<WO_MAT_INV_LOCATION$> = Delete(WOMatRec<WO_MAT_INV_LOCATION$>, 0, vPos, 0)
WOMatRec<WO_MAT_INV_ACTION$> = Delete(WOMatRec<WO_MAT_INV_ACTION$>, 0, vPos, 0)
WOMatRec<WO_MAT_INV_DTM$> = Delete(WOMatRec<WO_MAT_INV_DTM$>, 0, vPos, 0)
WOMatRec<WO_MAT_INV_USER$> = Delete(WOMatRec<WO_MAT_INV_USER$>, 0, vPos, 0)
WOMatRec<WO_MAT_INV_TAG$> = Delete(WOMatRec<WO_MAT_INV_TAG$>, 0, vPos, 0)
WOMatRec<WO_MAT_INV_TOOL_ID$> = Delete(WOMatRec<WO_MAT_INV_TOOL_ID$>, 0, vPos, 0)
WOMatRec<WO_MAT_INV_LOC$> = Delete(WOMatRec<WO_MAT_INV_LOC$>, 0, vPos, 0)
WOMatRec<WO_MAT_INV_SCAN_ENTRY$> = Delete(WOMatRec<WO_MAT_INV_SCAN_ENTRY$>, 0, vPos, 0)
end
Database_Services('WriteDataRow', 'WO_MAT', WOMatKey, WOMatRec, True$, False$, True$)
// 6. Remove RDS Unload signature, date, and time
// NOTE: This needs to occur before item #5 to avoid RDS_ACTIONS restoring the load signature
Set_Property(@Window:'.OP_IN', 'TEXT', '')
Set_Property(@Window:'.OP_IN_NAME', 'TEXT', '')
Set_Property(@Window:'.OP_IN_DATE', 'TEXT', '')
Set_Property(@Window:'.OP_IN_TIME', 'TEXT', '')
IOOptions = Get_Property(@Window, 'IOOPTIONS')
IOOptions<6> = True$
Set_Property(@Window, 'IOOPTIONS', IOOptions)
Send_Event(@Window, 'WRITE')
IOOptions<6> = False$
Set_Property(@Window, 'IOOPTIONS', IOOptions)
Reactor = Get_Property(@Window:'.REACTOR', 'TEXT')
Rds_Services('AddComment', RDSNo, 'Load Stage Unsigned from Reactor ' : Reactor)
ReactorRec = Database_Services('ReadDataRow', 'REACTOR', Reactor)
PreviousRotrOverrideRds = ReactorRec<REACTOR_PREVIOUS_ROTR_OVERRIDE_RDS$>
// Check if ROTR override was preformed when signing this load
If (PreviousRotrOverrideRds EQ RDSNo) then
// Reset the override flag
ReactorRec<REACTOR_ROTR_STATUS$> = 'F'
PreviousRotrStatusReason = ReactorRec<REACTOR_PREVIOUS_ROTR_STATUS_REASON$>
ReactorRec<REACTOR_ROTR_STATUS_REASON$> = PreviousRotrStatusReason
RotrOverrideCount = ReactorRec<REACTOR_ROTR_OVERRIDE_COUNT$>
ReactorRec<REACTOR_ROTR_OVERRIDE_COUNT$> = Max(0, (RotrOverrideCount - 1))
end
Database_Services('WriteDataRow', 'REACTOR', Reactor, ReactorRec, True$, False$, True$)
If ReactorType EQ 'EPP' then
Reactor_Services('DecrementWfrMetrics', RDSNo)
end
Set_Property(@Window:'.PUB_SIGN', 'TEXT', 'Sign')
If IsEligible then
// 3. Lead/Supervisor/Engineer/EngTech override
Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4 : @FM : 'LEAD' : @VM : 'SUPERVISOR':@VM:'ENGINEER':@VM:'ENG_TECH')
Valid = Response<1>
OverrideUser = Response<2>
If Valid then
Machine = Environment_Services('GetServer')
Headers = 'Logging DTM' : @FM : 'Machine' : @FM : 'Log'
ColumnWidths = 20 : @FM : 15 : @FM : 300
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\Lot'
makeDirSuccess = Utility("MAKEDIR", LogPath)
LogFileName = 'R':RDSNo:'.csv'
objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ' ', Headers, ColumnWidths, False$, False$)
LogData = ''
LogData<1> = Oconv(Date(), 'D4/') : ' ' : Oconv(Time(), 'MTS') ; // Logging DTM
LogData<2> = Machine
LogData<3> = 'LOAD stage unsigned for RDS ':RDSNo:' by user ':@User4
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$)
// 4. Remove WO_MAT Unload signature, date, and time
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
SigProf = WOMatRec<WO_MAT_SIG_PROFILE$>
Sigs = WOMatRec<WO_MAT_SIGNATURE$>
SigDTMs = WOMatRec<WO_MAT_SIG_DTM$>
Locate '1LOAD' in SigProf using @VM setting vPos then
Sigs<1, vPos> = ''
SigDTMs<1, vPos> = ''
WOMatRec<WO_MAT_SIGNATURE$> = Sigs
WOMatRec<WO_MAT_SIG_DTM$> = SigDTMs
obj_React_Status('HandleLoadUnsign',Reactor:@RM:WONo:@RM:CassNo:@RM:RDSNo:@RM:OverrideUser)
end
// 5. Remove '1LOAD' material log entry (i.e. WO_MAT<INV...> columns)
InvActions = WOMatRec<WO_MAT_INV_ACTION$>
Locate '1LOAD' in InvActions using @VM setting vPos then
WOMatRec<WO_MAT_INV_WH$> = Delete(WOMatRec<WO_MAT_INV_WH$>, 0, vPos, 0)
WOMatRec<WO_MAT_INV_LOCATION$> = Delete(WOMatRec<WO_MAT_INV_LOCATION$>, 0, vPos, 0)
WOMatRec<WO_MAT_INV_ACTION$> = Delete(WOMatRec<WO_MAT_INV_ACTION$>, 0, vPos, 0)
WOMatRec<WO_MAT_INV_DTM$> = Delete(WOMatRec<WO_MAT_INV_DTM$>, 0, vPos, 0)
WOMatRec<WO_MAT_INV_USER$> = Delete(WOMatRec<WO_MAT_INV_USER$>, 0, vPos, 0)
WOMatRec<WO_MAT_INV_TAG$> = Delete(WOMatRec<WO_MAT_INV_TAG$>, 0, vPos, 0)
WOMatRec<WO_MAT_INV_TOOL_ID$> = Delete(WOMatRec<WO_MAT_INV_TOOL_ID$>, 0, vPos, 0)
WOMatRec<WO_MAT_INV_LOC$> = Delete(WOMatRec<WO_MAT_INV_LOC$>, 0, vPos, 0)
WOMatRec<WO_MAT_INV_SCAN_ENTRY$> = Delete(WOMatRec<WO_MAT_INV_SCAN_ENTRY$>, 0, vPos, 0)
end
Database_Services('WriteDataRow', 'WO_MAT', WOMatKey, WOMatRec, True$, False$, True$)
// 6. Remove RDS Unload signature, date, and time
// NOTE: This needs to occur before item #5 to avoid RDS_ACTIONS restoring the load signature
Set_Property(@Window:'.OP_IN', 'TEXT', '')
Set_Property(@Window:'.OP_IN_NAME', 'TEXT', '')
Set_Property(@Window:'.OP_IN_DATE', 'TEXT', '')
Set_Property(@Window:'.OP_IN_TIME', 'TEXT', '')
IOOptions = Get_Property(@Window, 'IOOPTIONS')
IOOptions<6> = True$
Set_Property(@Window, 'IOOPTIONS', IOOptions)
Send_Event(@Window, 'WRITE')
IOOptions<6> = False$
Set_Property(@Window, 'IOOPTIONS', IOOptions)
Reactor = Get_Property(@Window:'.REACTOR', 'TEXT')
ReactorRec = Database_Services('ReadDataRow', 'REACTOR', Reactor)
PreviousRotrOverrideRds = ReactorRec<REACTOR_PREVIOUS_ROTR_OVERRIDE_RDS$>
// Check if ROTR override was preformed when signing this load
If (PreviousRotrOverrideRds EQ RDSNo) then
// Reset the override flag
ReactorRec<REACTOR_ROTR_STATUS$> = 'F'
PreviousRotrStatusReason = ReactorRec<REACTOR_PREVIOUS_ROTR_STATUS_REASON$>
ReactorRec<REACTOR_ROTR_STATUS_REASON$> = PreviousRotrStatusReason
RotrOverrideCount = ReactorRec<REACTOR_ROTR_OVERRIDE_COUNT$>
ReactorRec<REACTOR_ROTR_OVERRIDE_COUNT$> = Max(0, (RotrOverrideCount - 1))
end
Database_Services('WriteDataRow', 'REACTOR', Reactor, ReactorRec, True$, False$, True$)
If ReactorType EQ 'EPP' then
Reactor_Services('DecrementWfrMetrics', RDSNo)
end
Set_Property(@Window:'.PUB_SIGN', 'TEXT', 'Sign')
end else
Return 0
end
end else
Return 0
end
ErrorMessage = Error_Services('GetMessage')
Msg(@Window, ErrorMessage)
end
End Case
Post_Event(@Window, 'READ')
@ -582,7 +561,6 @@ Event LL_R_STATUS.OnClick()
end event
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Internal GoSubs
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@ -740,3 +718,5 @@ OLE_LL_Status:
return