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

1972 lines
84 KiB
Plaintext

Compile function DBW_RDS_OVERVIEW_NEPP_EVENTS(CtrlEntId, Event, @PARAMS)
/***********************************************************************************************************************
This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written
permission from Infineon.
Name : NDW_RDS_Proc_Stat_Nepp_Events
Description : This function acts as a commuter module for all events related to this window.
Notes : Commuter Modules are automatically called from the Promoted_Events function which is called by the
application-specific promoted event handler. This makes it possible to add QuickEvents that need to
execute Basic+ logic without having use the Form Designer to make the association, although this is
limited to the events which are currently promoted.
If the form needs to call the commuter module directly then the QuickEvent parameters should be
formatted like this:
'@SELF','@EVENT',['@PARAM1','@PARAMx']
Parameters :
CtrlEntId [in] -- The fully qualified name of the control calling the promoted event
Event [in] -- The event being executed. See the Notes section regarding "PRE" events
Param1-15 [in] -- Additional event parameter holders
EventFlow [out] -- Set to 1 or 0 so the calling event knows whether or not to chain forward. See comments in
EVENT_SETUP insert
History : (Date, Initials, Notes)
09/29/21 djs Created initial commuter module.
***********************************************************************************************************************/
#pragma precomp SRP_PreCompiler
#window DBW_RDS_OVERVIEW_NEPP
$Insert EVENT_SETUP
$Insert ACTION_SETUP
$Insert APPCOLORS
$Insert MSG_EQUATES
$Insert WO_MAT_QA_EQUATES
$Insert WO_MAT_EQUATES
$Insert RDS_EQUATES
$Insert POPUP_EQUATES
$INSERT LOGICAL
$INSERT LSL_USERS_EQU
$INSERT SECURITY_RIGHTS_EQU
$Insert REACT_RUN_EQUATES
$Insert WM_IN_EQUATES
$Insert WM_OUT_EQUATES
$Insert WO_LOG_EQUATES
$Insert NOTIFICATION_EQUATES
Equ COL$LOG_FILE to 1
Equ COL$LOG_DTM to 2
Equ COL$ACTION to 3
Equ COL$WH_CD to 4
Equ COL$LOC_CD to 5
Equ COL$WO_NOS to 6
Equ COL$CASS_NOS to 7
Equ COL$USER_ID to 8
Equ COL$TAGS to 9
Equ COL$TOOL_ID to 10
Equ COL.MET_TEST$ To 1
Equ COL.TEST_DESC$ To 2
Equ COL.SLOT$ To 3
Equ COL.SLOT_DESC$ To 4
Equ COL.WFR_QTY$ To 5
Equ COL.MET_MIN$ To 6
Equ COL.MET_MAX$ To 7
Equ COL.MET_RESULT$ To 8
Equ COL.STD_DEV_MAX$ To 9
Equ COL.STD_DEV_RESULT$ To 10
Equ COL.SIG$ To 11
Equ COL.SIG_DTM$ To 12
Equ COL$MET_TEST to 1 ; // QA Metrology control on RDS_UNLOAD & RDS_POST_EPI windows
Equ COL$MET_TEST_DESC to 2
Equ COL$MET_SLOT to 3
Equ COL$MET_SLOT_DESC to 4
Equ COL$MET_WFR_QTY to 5
Equ COL$MET_MIN to 6
Equ COL$MET_MAX to 7
Equ COL$MET_RESULT to 8
Equ COL$MET_STD_MAX to 9
Equ COL$MET_STD_RESULT to 10
Equ COL$MET_SIG to 11
Equ COL$MET_SIG_DTM to 12
EQU COL$TOP_LABEL TO 1
EQU COL$BOTTOM_LABEL TO 2
EQU COL$LOT_NO TO 3
EQU COL$IFX_LABEL TO 4
EQU COL$RESULT TO 5
EQU COL$WOLOGKEY TO 6
Equ CRLF$ to \0D0A\
Equ SS_STAGE$ To 1
Equ SS_PASS$ To 2
Equ SS_SIG$ To 3
Equ SS_DATA$ To 4
Equ SS_NA$ To 5
Declare subroutine SRP_Show_Window, Set_Property, Send_Message, ErrMsg, Msg, Start_Window, QA_Services, Post_Event
Declare subroutine obj_Appwindow, Popup, Signature_Services, Set_Status, obj_WO_Mat, obj_WO_Mat_Log, Send_Event
Declare subroutine obj_RDS, obj_Notes
Declare function Database_Services, Form_Services, Signature_Services, Msg, SRP_Array, QA_Services, obj_Popup
Declare function Error_Services, Popup_Services, Dialog_Box, MemberOf, obj_WO_Mat, obj_RDS, Send_Message, Utility
SubclassInfo = Form_Services('FindSubclassControl')
Subclass = SubclassInfo<1>
// Update the arguments so that the OpenInsight OLE event will treate the ActiveX event as a native event handler.
If Event EQ 'OLE' then
Transfer Event to OIEvent
Transfer Param1 to Event
Transfer Param2 to Param1
Transfer Param3 to Param2
Transfer Param4 to Param3
Transfer Param5 to Param4
Transfer Param6 to Param5
Transfer Param7 to Param6
Transfer Param8 to Param7
end
GoToEvent Event for CtrlEntID
Return EventFlow else EVENT_CONTINUE$
//-----------------------------------------------------------------------------
// EVENT HANDLERS
//-----------------------------------------------------------------------------
Event WINDOW.CREATE(CreateParam)
GoSub SetupOLEControls
If RowExists('RDS', CreateParam) then
Set_Property(@Window:'.EDL_RDS_NO', 'TEXT', CreateParam)
GoSub RefreshForm
end
GoSub EnableRefreshButton
FormSize = ''
SRP_Show_Window(@Window, '', 'C', 'C', 1, '', False$, False$, FormSize)
End Event
Event WINDOW.CLEAR(bSaveKey, bSuppressWarning, bMaintainFocus, CtrlIDFocus)
GoSub ClearForm
end event
Event OLE_BTN_REFRESH.OnClick(Point, Button, Shift, Ctrl)
GoSub RefreshForm
end event
Event EDL_RDS_NO.LOSTFOCUS(Flag, FocusID)
GoSub EnableRefreshButton
GoSub RefreshForm
end event
Event OLE_EDT_STAGES.OnButtonClick(Cell, Point, Button, Shift, Ctrl)
// Open related form so the user can sign the stage/metrology test/NCR/etc...
RDSNo = Get_Property(@Window:'.EDL_RDS_NO', 'TEXT')
ErrorMsg = ''
If RDSNo NE '' then
StageIndex = Field(Cell, ';', 2)
StageIDs = Get_Property(@Window, '@STAGE_ID_LIST')
StageID = StageIDs<StageIndex>
Begin Case
Case StageID EQ 'VER'
Start_Window('RDS_PRE_EPI', @Window, RDSNo)
Case StageID EQ 'SUPP'
Start_Window('RDS', @Window, RDSNo)
Case StageID EQ 'LOAD'
Start_Window('RDS', @Window, RDSNo)
Case StageID EQ 'UNLOAD'
Start_Window('RDS_UNLOAD', @Window, RDSNo)
Case StageID EQ 'POST'
Start_Window('RDS_POST_EPI', @Window, RDSNo)
Case StageID EQ 'QA'
Start_Window('RDS_POST_EPI', @Window, RDSNo)
Case StageID EQ 'RDS_TEST'
MetKeys = Xlate('RDS', RDSNo, 'MET_KEYS', 'X')
NumKeys = DCount(MetKeys, @VM)
Begin Case
Case NumKeys EQ 1
Start_Window('RDS_TEST', @Window, MetKeys)
Case NumKeys GT 1
// Just display the Post-Epi RDS form so that users can select which RDS_TEST record
// they would like to view.
Start_Window('RDS_POST_EPI', @Window, RDSNo)
Case NumKeys EQ 0
ErrorMsg = 'RDS_TEST record for RDS ':RDSNo:' does not exist!'
End Case
Case ( (StageID EQ 'PREI') or (StageID EQ 'PREC') or (StageID EQ 'PRES') )
CINo = Xlate('RDS', RDSNo, 'PRE_CI_NO', 'X')
If RowExists('CLEAN_INSP', CINo) then
GoSub OpenCleanInsp
end else
ErrorMsg = 'PRE CLEAN_INSP record for RDS ':RDSNo:' does not exist!'
end
Case ( (StageID EQ 'FWII') or (StageID EQ 'FWIC') or (StageID EQ 'FWIS') )
CINo = Xlate('RDS', RDSNo, 'FWI_CI_NO', 'X')
If RowExists('CLEAN_INSP', CINo) then
GoSub OpenCleanInsp
end else
ErrorMsg = 'FWI CLEAN_INSP record for RDS ':RDSNo:' does not exist!'
end
Case StageID EQ 'LOAD_QA_MET'
WOMatQAKey = Xlate('RDS', RDSNo, 'WO_MAT_KEY', 'X')
If RowExists('WO_MAT_QA', WOMatQAKey) then
WOMatQAStages = Xlate('WO_MAT_QA', WOMatQAKey, 'STAGE', 'X')
Locate 'FWI' in WOMatQAStages using @VM setting vPos then
WONo = Field(WOMatQAKey, '*', 1)
WOStep = 1
CassNo = Field(WOMatQAKey, '*', 2)
RunStep = 'FWI'
CassID = WONo:'*':WOStep:'*':CassNo:'*':RDSNo:'*':RunStep
Start_Window('QA_MET_RESULT', @Window, CassID)
end else
ErrorMsg = 'LOAD/FWI QA metrology is not prescribed for RDS ':RDSNo:'!'
end
end else
ErrorMsg = 'WO_MAT_QA record for RDS ':RDSNo:' does not exist!'
end
Case ( (StageID EQ 'LWII') or (StageID EQ 'LWIC') or (StageID EQ 'LWIS') or (StageID EQ 'ROTR') )
CINo = Xlate('RDS', RDSNo, 'LWI_CI_NO', 'X')
If RowExists('CLEAN_INSP', CINo) then
GoSub OpenCleanInsp
end else
ErrorMsg = 'LWI CLEAN_INSP record for RDS ':RDSNo:' does not exist!'
end
Case StageID EQ 'UNLOAD_QA_MET'
WOMatQAKey = Xlate('RDS', RDSNo, 'WO_MAT_KEY', 'X')
If RowExists('WO_MAT_QA', WOMatQAKey) then
WONo = Field(WOMatQAKey, '*', 1)
WOStep = 1
CassNo = Field(WOMatQAKey, '*', 2)
RunStep = 'UNLOAD'
CassID = WONo:'*':WOStep:'*':CassNo:'*':RDSNo:'*':RunStep
Start_Window('NDW_QA_MET_RESULT', @Window, CassID)
end else
ErrorMsg = 'WO_MAT_QA record for RDS ':RDSNo:' does not exist!'
end
Case ( (StageID EQ 'PSTI') or (StageID EQ 'PSTC') or (StageID EQ 'PSTS') )
CINo = Xlate('RDS', RDSNo, 'POST_CI_NO', 'X')
If RowExists('CLEAN_INSP', CINo) then
GoSub OpenCleanInsp
end else
ErrorMsg = 'POST CLEAN_INSP record for RDS ':RDSNo:' does not exist!'
end
Case StageID EQ 'POST_QA_MET'
WOMatQAKey = Xlate('RDS', RDSNo, 'WO_MAT_KEY', 'X')
If RowExists('WO_MAT_QA', WOMatQAKey) then
MetSlot = ''
WONo = Field(WOMatQAKey, '*', 1)
WOStep = 1
CassNo = Field(WOMatQAKey, '*', 2)
RunStep = 'QA'
CassID = WONo:'*':WOStep:'*':CassNo:'*':RDSNo:'*':RunStep
TestStages = Xlate('WO_MAT_QA', WOMatQAKey, 'STAGE', 'X')
NumTests = Count(TestStages, 'QA')
If NumTests GT 1 then
AllSlots = Xlate('WO_MAT_QA', WOMatQAKey, 'SLOT', 'X')
QASlots = ''
For each Stage in TestStages using @VM setting vPos
If Stage EQ 'QA' then QASlots<0, -1> = AllSlots<0, vPos>
Next Stage
MetSlot = Popup_Services('DisplayPopupLiteral', 'Select QA Met Slot', 'Slot', QASlots, 1)
end else
For each Stage in TestStages using @VM setting vPos
If Stage EQ 'QA' then MetSlot = AllSlots<0, vPos>
Next Stage
end
If MetSlot NE '' then
WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatQAKey)
Done = False$
For each Stage in TestStages using @VM setting vPos
ThisSlot = AllSlots<0, vPos>
If ( (Stage EQ 'QA') and (ThisSlot EQ MetSlot) ) then Done = True$
Until Done EQ True$
Next Stage
MetTest = WOMatQARec<WO_MAT_QA_PROFILE$, vPos>
TestLine = ''
TestLine<0, COL.MET_TEST$> = MetTest
TestLine<0, COL.TEST_DESC$> = obj_Popup('CodeDesc', 'QA_MET_TEST':@RM:MetTest)
TestLine<0, COL.SLOT$> = MetSlot
TestLine<0, COL.SLOT_DESC$> = obj_Popup('CodeDesc','TEST_SLOTS':@RM:MetSlot)
TestLine<0, COL.WFR_QTY$> = WOMatQARec<WO_MAT_QA_WFR_QTY$, vPos>
TestLine<0, COL.MET_MIN$> = WOMatQARec<WO_MAT_QA_MIN$, vPos>
TestLine<0, COL.MET_MAX$> = WOMatQARec<WO_MAT_QA_MAX$, vPos>
TestLine<0, COL.MET_RESULT$> = WOMatQARec<WO_MAT_QA_RESULT$, vPos>
TestLine<0, COL.STD_DEV_MAX$> = WOMatQARec<WO_MAT_QA_STD_MAX$, vPos>
TestLine<0, COL.STD_DEV_RESULT$> = WOMatQARec<WO_MAT_QA_STD_RESULT$, vPos>
TestLine<0, COL.SIG$> = WOMatQARec<WO_MAT_QA_SIG$, vPos>
TestLine<0, COL.SIG_DTM$> = WOMatQARec<WO_MAT_QA_SIG_DTM$, vPos>
Start_Window('QA_MET_RESULT', @Window, CassID:@FM:TestLine)
end
end else
ErrorMsg = 'WO_MAT_QA record for RDS ':RDSNo:' does not exist!'
end
Case StageID EQ 'LBLCHK'
Start_Window('DIALOG_QA_LABEL_CHECK')
Case StageID EQ 'NCR'
WOMatKey = Xlate('RDS', RDSNo, 'WO_MAT_KEY', 'X')
NCRKeys = Xlate('WO_MAT', WOMatKey, 'NCR_KEYS', 'X')
If NCRKeys NE '' then
NumKeys = DCount(NCRKeys, @VM)
If NumKeys GT 1 then
NCRKey = Popup_Services('DisplayPopupLiteral', 'Select NCR', 'NCR No', NCRKeys, 1)
end else
NCRKey = NCRKeys
end
If NCRKey NE '' then Start_Window('NCR', @Window, NCRKey)
end else
ErrorMsg = 'No NCR records on file for RDS ':RDSNo:'!'
end
Case StageID EQ 'SAP_BATCH_ID'
WOMatKey = Xlate('RDS', RDSNo, 'WO_MAT_KEY', 'X')
WONo = Field(WOMatKey, '*', 1)
CassNo = Field(WOMatKey, '*', 2)
Start_Window('WO_MAT', @Window, WOMatKey)
Set_Property('WO_MAT.WO_NO', 'TEXT', WONo)
Set_Property('WO_MAT.CASS_NO', 'TEXT', CassNo)
Post_Event('WO_MAT', 'READ')
End Case
end
If ErrorMsg NE '' then ErrMsg(ErrorMsg)
end event
Event OLE_EDT_STAGES.OnCheckChanged(Cell, OldValue, NewValue)
GoSub EnableAutoSignButton
end event
Event PUB_AUTO_SIGN.CLICK()
If (Not(MemberOf(@User4, 'LEAD')) or Not(MemberOf(@User4, 'SUPERVISOR') ) ) then
Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4:@FM:'LEAD':@VM:'SUPERVISOR')
Valid = Response<1>
end else
Valid = True$
end
If Valid then
ErrorMsgs = ''
RDSNo = Get_Property(@Window:'.EDL_RDS_NO', 'TEXT')
WOMatKey = Xlate('RDS', RDSNo, 'WO_MAT_KEY', 'X')
// Check all locks first
RDSLock = Database_Services('IsKeyIDLocked', 'RDS', RDSNo)
If RDSLock then
ErrorMsgs<-1> = 'RDS record ':RDSNo:' is locked!'
end
WOMatLock = Database_Services('IsKeyIDLocked', 'WO_MAT', WOMatKey)
If WOMatLock then
ErrorMsgs<-1> = 'WO_MAT record ':WOMatKey:' is locked!'
end
WOMatQALock = Database_Services('IsKeyIDLocked', 'WO_MAT_QA', WOMatKey)
If WOMatQALock then
ErrorMsgs<-1> = 'WO_MAT_QA record ':WOMatKey:' is locked!'
end
NCRLock = False$
NCRKeys = Xlate('WO_MAT', WOMatKey, 'NCR_KEYS', 'X')
If NCRKeys NE '' then
For each NCRKey in NCRKeys using @VM setting vPos
Locked = Database_Services('IsKeyIDLocked', 'NCR', NCRKey)
If Locked then NCRLock = True$
Until Locked
Next NCRKey
If NCRLock then
ErrorMsgs<-1> = 'NCR record ':NCRKey:' is locked!'
end
end
PreCILock = Database_Services('IsKeyIDLocked', 'CLEAN_INSP', Xlate('RDS', RDSNo, 'PRE_CI_NO', 'X') )
If PreCILock then
ErrorMsgs<-1> = 'PRE CLEAN_INSP record is locked!'
end
FWICILock = Database_Services('IsKeyIDLocked', 'CLEAN_INSP', Xlate('RDS', RDSNo, 'FWI_CI_NO', 'X') )
If FWICILock then
ErrorMsgs<-1> = 'FWI CLEAN_INSP record is locked!'
end
LWICILock = Database_Services('IsKeyIDLocked', 'CLEAN_INSP', Xlate('RDS', RDSNo, 'LWI_CI_NO', 'X') )
If LWICILock then
ErrorMsgs<-1> = 'LWI CLEAN_INSP record is locked!'
end
QACILock = Database_Services('IsKeyIDLocked', 'CLEAN_INSP', Xlate('RDS', RDSNo, 'POST_CI_NO', 'X') )
If QACILock then
ErrorMsgs<-1> = 'POST CLEAN_INSP record is locked!'
end
If ErrorMsgs EQ '' then
If @User4 EQ 'DANIEL_ST' then Send_Event(@Window, 'WRITE')
Def = ""
Def<MTEXT$> = "Auto-signing stages. Please wait..."
Def<MTYPE$> = "U"
MsgUp = Msg(@Window, Def) ;* display the processing message
// Procedurally sign all stages that have a checkmark
ChkBoxList = Get_Property(@Window:'.OLE_EDT_STAGES', "OLE.CellCheck[4; All]")
Swap @RM with @FM in ChkBoxList
StageIDs = Get_Property(@Window, '@STAGE_ID_LIST')
NumRows = DCount(ChkBoxList, @FM)
For RowIndex = 1 to NumRows
ChkVal = ChkBoxList<RowIndex>
If ChkVal EQ True$ then
StageID = StageIDs<RowIndex>
Begin Case
Case StageID EQ 'VER'
WaferQty = Xlate('RDS', RDSNo, 'VERIFY_QTY', 'X')
Reactor = Xlate('RDS', RDSNo, 'REACTOR', 'X')
SigReady = QA_Services('PreEpiSignatureReady', RDSNo, @User4, WaferQty, Reactor)
If SigReady then
QA_Services('SignPreEpiStage', RDSNo, @User4, WaferQty, Reactor, False$)
If Error_Services('NoError') then
ChkBoxList<RowIndex> = False$
end else
ErrorMsgs<-1> = Error_Services('GetMessage')
end
end else
ErrorMsgs<-1> = Error_Services('GetMessage')
end
Case StageID EQ 'SUPP'
Signature_Services('SignSupplement', RDSNo, @User4)
If Error_Services('HasError') then
ErrorMsgs<-1> = Error_Services('GetMessage')
end
Case StageID EQ 'LOAD'
WafersIn = Xlate('RDS', RDSNo, 'WAFERS_IN', 'X')
Reactor = Xlate('RDS', RDSNo, 'REACTOR', 'X')
LLSide = Xlate('RDS', RDSNo, 'LOAD_LOCK_SIDE', 'X')
SigReady = QA_Services('LoadSignatureReady', RDSNo, @User4, WafersIn, LLSide, False$)
If SigReady then
QA_Services('SignLoadStage', RDSNo, @User4, WaferQty, LLSide, False$)
If Error_Services('NoError') then
ChkBoxList<RowIndex> = False$
end else
ErrorMsgs<-1> = Error_Services('GetMessage')
end
end else
ErrorMsgs<-1> = Error_Services('GetMessage')
end
Case StageID EQ 'UNLOAD'
Reactor = Xlate('RDS', RDSNo, 'REACTOR', 'X')
SigReady = QA_Services('UnloadSignatureReady', RDSNo, @User4, Reactor)
If SigReady then
QA_Services('SignUnloadStage', RDSNo, @User4, False$)
If Error_Services('NoError') then
ChkBoxList<RowIndex> = False$
end else
ErrorMsgs<-1> = Error_Services('GetMessage')
end
end else
ErrorMsgs<-1> = Error_Services('GetMessage')
end
Case StageID EQ 'POST'
PSNo = Xlate('RDS', RDSNo, 'PROD_SPEC_ID', 'X')
VerInst = XLATE('PRS_STAGE', PSNo:'*POST', 'INST', 'X')
InstructionsVerified = True$
If VerInst NE '' then InstructionsVerified = Dialog_Box('RDS_VER', @Window, VerInst)
If InstructionsVerified then
SigReady = Signature_Services('PostEpiSigReady', RDSNo)
If SigReady then
Signature_Services('SignPostEpiStage', RDSNo, @User4)
If Error_Services('NoError') then
ChkBoxList<RowIndex> = False$
end else
ErrorMsgs<-1> = Error_Services('GetMessage')
end
end else
ErrorMsgs<-1> = Error_Services('GetMessage')
end
end else
ErrorMsgs<-1> = 'You must acknowledge RDS_VER instructions in order to sign POST-EPI stage.'
end
Case StageID EQ 'QA'
SigReady = Signature_Services('QASigReady', RDSNo)
If SigReady then
Signature_Services('SignQAStage', RDSNo, @User4)
If Error_Services('NoError') then
ChkBoxList<RowIndex> = False$
end else
ErrorMsgs<-1> = Error_Services('GetMessage')
end
end else
ErrorMsgs<-1> = Error_Services('GetMessage')
end
Case StageID EQ 'RDS_TEST'
// No signature for RDS_TEST records
Null
Case ( (StageID EQ 'PREI') or (StageID EQ 'PREC') or (StageID EQ 'PRES') or (StageID EQ 'FWII') |
or (StageID EQ 'FWIC') or (StageID EQ 'FWIS') or (StageID EQ 'LWII') or (StageID EQ 'LWIC') |
or (StageID EQ 'LWIS') or (StageID EQ 'PSTI') or (StageID EQ 'PSTC') or (StageID EQ 'PSTS') )
SigReady = Signature_Services('CleanInspSigReady', RDSNo, StageID)
If SigReady then
Signature_Services('SignCleanInsp', RDSNo, StageID, @User4)
If Error_Services('NoError') then
ChkBoxList<RowIndex> = False$
end else
ErrorMsgs<-1> = Error_Services('GetMessage')
end
end else
ErrorMsgs<-1> = Error_Services('GetMessage')
end
Case ( (StageID EQ 'LOAD_QA_MET') or (StageID EQ 'UNLOAD_QA_MET') or (StageID EQ 'POST_QA_MET') )
Begin Case
Case StageID EQ 'LOAD_QA_MET'
QAStage = 'LOAD'
Case StageID EQ 'UNLOAD_QA_MET'
QAStage = 'UNLOAD'
Case StageID EQ 'POST_QA_MET'
QAStage = 'QA'
End Case
WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatKey)
TestStages = WOMatQARec<WO_MAT_QA_STAGE$>
TestSlots = WOMatQARec<WO_MAT_QA_SLOT$>
For each TestStage in TestStages using @VM setting vPos
If TestStage EQ QAStage then
TestSlot = TestSlots<0, vPos>
SigReady = Signature_Services('QAMetSigReady', RDSNo, QAStage, TestSlot)
If SigReady then
Signature_Services('SignQAMet', RDSNo, QAStage, @User4, TestSlot)
If Error_Services('HasError') then
ErrorMsgs<-1> = Error_Services('GetMessage')
end
end else
ErrorMsgs<-1> = Error_Services('GetMessage')
end
end
Next TestStage
If ErrorMsgs EQ '' then ChkBoxList<RowIndex> = False$
Case StageID EQ 'ROTR'
SigReady = Signature_Services('ROTRSigReady', RDSNo)
If SigReady then
// Collect ROTR reason from user
MsgParms = 'ROTR Acceptance' : @FM : 'ROTR Acceptance Reason' : @FM : ''
Reason = Msg(@Window, '', 'MESSAGE_INPUT', '', MsgParms)
If Reason NE '' then
Signature_Services('SignROTR', RDSNo, @User4, Reason)
If Error_Services('NoError') then
ChkBoxList<RowIndex> = False$
end else
ErrorMsgs<-1> = Error_Services('GetMessage')
end
end else
ErrorMsgs<-1> = 'An ROTR acceptance reason must be provided in order to sign ROTR'
end
end else
ErrorMsgs<-1> = Error_Services('GetMessage')
end
Case StageID EQ 'LBLCHK'
// No signature for LBLCHK. Users must use the UI and barcode scanner.
Null
Case StageID EQ 'NCR'
SigReady = Signature_Services('NCRSigReady', RDSNo)
If SigReady then
Signature_Services('SignNCRs', RDSNo, @User4)
If Error_Services('NoError') then
ChkBoxList<RowIndex> = False$
end else
ErrorMsgs<-1> = Error_Services('GetMessage')
end
end else
ErrorMsgs<-1> = Error_Services('GetMessage')
end
Case Otherwise$
End Case
end
Next RowIndex
Msg(@Window, MsgUp) ;* Take message down
Set_Property(@Window, '@CHK_BOX_LIST', ChkBoxList)
GoSub RefreshForm
end
end else
ErrorMsgs<-1> = 'Only a LEAD or SUPERVISOR may auto-sign.'
end
If ErrorMsgs NE '' then
Swap @FM with CRLF$ in ErrorMsgs
ErrMsg(ErrorMsgs)
end
end event
Event SIGN_BUTTON.CLICK()
Valid = ''
RDSNo = Get_Property(@WINDOW:'.EDL_RDS_NO', 'DEFPROP')
WONo = Xlate('RDS', RDSNo, 'WO', 'X')
CassNo = Xlate('RDS', RDSNo, 'CASS_NO', 'X')
WOStep = Xlate('RDS', RDSNo, 'WO_STEP', 'X')
ReactorType = Xlate('RDS', RDSNo, 'REACTOR_TYPE', 'X')
PSNo = Xlate('RDS', RDSNo, 'PROD_SPEC_ID', 'X')
******************************************
* Update the form with signature, if any *
******************************************
CurrSig = ''
CurrDTM = ''
CurrDate = ''
CurrTime = ''
*********************************************
* Verify if the FQA has already been signed *
*********************************************
IF Not(MemberOf(@USER4,'BYPASS')) THEN
IF (CurrSig NE '') THEN
ErrMsg('Supervisor Verification for this material has already been signed.')
RETURN
END
END
******************************************
* Verify if the Post-EPI has been signed *
******************************************
PostEpiSig = Xlate('RDS', RDSNo, 'POST_EPI_SIG', 'X')
IF (PostEpiSig = '') THEN
ErrorMesg = 'Process Error':@SVM:'Technician Signature Required before Final QA Verification.'
ErrMsg(ErrorMesg)
RETURN
END
**************************************************************************
**************************************************************************
IF Not(MemberOf(@USER4,'BYPASS')) THEN ;* Bypass requirement for a different signer for post-epi and FQA -dkk 10/9/14
IF (PostEpiSig = @USER4) THEN
ErrorMesg = 'Process Error':@SVM:'User ':QUOTE(PostEpiSig):' has signed this RDS for Post-Epi.':CRLF$:CRLF$
ErrorMesg := 'Another qualified user must sign FQA verification'
ErrMsg(ErrorMesg)
RETURN
END
END
***************************************
* Verify Metrology has been completed *
***************************************
Set_Status(0)
obj_WO_Mat('MQAComp',WONo:'*':CassNo:@RM:WOStep:@RM:'QA')
errCode = ''
IF Get_Status(errCode) THEN
ErrMsg(errCode)
RETURN
END
***********************************************
* Verify RDS_TEST record has measurement data *
***********************************************
ThickAvg = Xlate('RDS', RDSNo, 'TTHICK_AVG_ALL', 'X')
If ThickAvg EQ '' then
ErrMsg('RDS metrology measurement data is missing. FQA cannot be signed.')
Return
end
ResAvg = Xlate('RDS', RDSNo, 'TRES_AVG_ALL', 'X')
If ResAvg EQ '' then
ErrMsg('RDS Resistivity measurement data is missing. FQA cannot be signed.')
Recipients = XLATE('SEC_GROUPS', 'OI_ADMIN', 'USER', 'X')
SentFrom = 'OI Admin'
Subject = 'Missing Resistivity Avg data'
Message = RDSNo: ' failed FQA due to missing resistivity average data.'
AttachWindow = ''
AttachKey = ''
SendToGroup = ''
Parms = Recipients:@RM:SentFrom:@RM:Subject:@RM:Message:@RM:AttachWindow:@RM:AttachKey:@RM:SendToGroup
obj_Notes('Create',Parms)
Return
end
************************************************
* Verify Signatures Profile has been fulfilled *
************************************************
WOMatKey = WONo:'*':CassNo
Signature_Services('CheckSigOrder', WOMatKey, 'QA')
If Error_Services('HasError') then
ErrMsg(Error_Services('GetMessage'))
return 0
end
Signature_Services('FQAReady', WOMatKey)
If Error_Services('HasError') then
ErrMsg(Error_Services('GetMessage'))
Return 0
end
*************************
* Verify Wafer Quantity *
*************************
CassSchedWafers = Get_Property(@Window : '.WAFERS_SCHEDULED', 'TEXT')
WafersOut = Get_Property(@Window : '.WAFERS_OUT', 'TEXT')
If CassSchedWafers NE WafersOut then
Message = 'Unable to sign FQA because the Scheduled' : CRLF$ : 'Qty does not equal the '
Message := 'Wafers Out Qty.' : CRLF$ : 'Lead or supervisor must override.'
LeadMessage = 'Scheduled Wafers Quantity does not equal the Wafers Out Quantity.'
If NOT( MemberOf(@USER4, 'LEAD') OR MemberOf(@USER4, 'SUPERVISOR') ) then
Response = Msg(@Window, '', 'POST_EPI_WAFER_OUT', '', Message)
end else
Response = Msg(@Window, '', 'POST_EPI_WAFER_OUT', '', LeadMessage)
end
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
Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4 : @FM : 'LEAD' : @VM : 'SUPERVISOR')
Valid = Response<1>
Username = Response<2>
If NOT(Valid) then
Return
end else
Set_Property(@Window : '.FINAL_QA_WAFER_OUT_SIG', 'DEFPROP', Username)
Set_Property(@Window : '.FINAL_QA_WAFER_OUT_NAME', 'TEXT', OConv(Username, '[XLATE_CONV,LSL_USERS*FIRST_LAST]'))
Set_Property(@Window : '.FINAL_QA_WAFER_OUT_DATE', 'DEFPROP', Oconv(Date(), 'D2/'))
Set_Property(@Window : '.FINAL_QA_WAFER_OUT_TIME', 'DEFPROP', Oconv(Time(), 'MTS'))
end
end else
Return
end
end
*********************************
* Verify NCR total >= USL Fails *
*********************************
ReactorNo = Xlate('RDS', RDSNo, 'REACTOR', 'X')
ROTREnabled = Xlate('REACTOR', ReactorNo, 'ENABLE_ROTR', 'X')
If (ROTREnabled EQ True$) then
LWICIKey = Xlate('RDS', RDSNo, 'LWI_CI_NO', 'X')
NumUSLFailValues = Xlate('CLEAN_INSP', LWICIKey, 'NUM_FAILED_WAFERS', 'X')
NumUSLFailCount = COUNT(NumUSLFailValues,@VM) + (NumUSLFailValues NE '')
NumUSLFail = NumUSLFailValues<1,NumUSLFailCount>
If NumUSLFail EQ '' then NumUSLFail = 0
TotalNCR = Xlate('RDS', RDSNo, 'TOT_REJ', 'X')
If TotalNCR EQ '' then TotalNCR = 0
If NumUSLFail GT TotalNCR then
Message = 'Unable to sign FQA because the total quantity of NCR wafers':CRLF$:'is less than the '|
: 'number of wafers above the USL threshold.' : CRLF$ : 'A lead or supervisor must override.'
LeadMessage = 'Total quantity of NCR wafers is less than the number of wafers above the USL threshold.'
If NOT( MemberOf(@USER4, 'LEAD') OR MemberOf(@USER4, 'SUPERVISOR') ) then
Response = Msg(@Window, '', 'POST_EPI_WAFER_OUT', '', Message)
end else
Response = Msg(@Window, '', 'POST_EPI_WAFER_OUT', '', LeadMessage)
end
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
Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4:@FM:'LEAD':@VM:'SUPERVISOR':@VM:'ENGINEER')
Valid = Response<1>
If NOT(Valid) then Return
end else
Return
end
end
end
********************************************
* Verify NCR wafer qty >= Failed wafer qty *
********************************************
NCRReq = QA_Services('GetNCRRequired', WOMatKey)
If NCRReq then
Message = 'Unable to sign FQA because the total quantity of NCR wafers':CRLF$:'is less than the '|
: 'number of wafers that failed surfscan.' : CRLF$ : 'A lead or supervisor must override.'
LeadMessage = 'Total quantity of NCR wafers is less than the number of wafers that failed surfscan.'
If NOT( MemberOf(@USER4, 'LEAD') OR MemberOf(@USER4, 'SUPERVISOR') ) then
Response = Msg(@Window, '', 'POST_EPI_WAFER_OUT', '', Message)
end else
Response = Msg(@Window, '', 'POST_EPI_WAFER_OUT', '', LeadMessage)
end
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
Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4:@FM:'LEAD':@VM:'SUPERVISOR':@VM:'ENGINEER')
Valid = Response<1>
If NOT(Valid) then Return 0
end else
Return
end
end
*************************
* Verify if Shift exist *
*************************
Shift = Xlate('RDS', RDSNo, 'SHIFT', 'X')
IF (Shift EQ '') THEN
ErrMsg('Process Error':@SVM:'Shift is required before signing.')
RETURN
END
****************************
* Verify if lot is on Hold *
****************************
WOMatCurrStatus = obj_WO_Mat('CurrStatus',WONo:'*':CassNo)
IF WOMatCurrStatus = 'HOLD' THEN
ErrMsg('Process Error':@SVM:'Cassette is on Hold and may not be signed off.':CRLF$:CRLF$)
RETURN
END
**********************
* Check ROTR Failure *
**********************
ROTRAction = Get_Property(@Window : '.ROTR_ACTION', 'INVALUE')
If (ROTRAction NE 'Passed') AND (ROTRAction NE 'Accepted') AND (ROTRAction NE '') then
ErrMsg('Process Error':@SVM:'ROTR does not meet all requirements.':CRLF$:CRLF$)
return
end
***************************************
* Verify Metrology has been completed *
***************************************
CtrlName = @WINDOW:'.MET_TEST'
MetList = Get_Property(CtrlName,'LIST')
MLCnt = COUNT(MetList,@FM) + (MetList NE '')
FOR Line = 1 TO MLCnt
IF MetList<Line,COL$MET_TEST> NE '' THEN
BEGIN CASE
CASE ((MetList<Line,COL$MET_MIN> = '') AND (MetList<Line,COL$MET_MAX> = ''))
NULL
CASE (MetList<Line,COL$MET_RESULT> = '')
ErrMsg('Process Error':@SVM:'Required QA Metrology results have not been entered.')
RETURN
CASE ((MetList<Line,COL$MET_RESULT> < MetList<Line,COL$MET_MIN>) OR (MetList<Line,COL$MET_RESULT> > MetList<Line,COL$MET_MAX>))
ErrMsg('Process Error':@SVM:'One or more QA Metrology results is out of specification.')
RETURN
CASE ((MetList<Line,COL$MET_RESULT> NE '') AND (MetList<Line,COL$MET_SIG> = ''))
ErrMsg('Process Error':@SVM:'One or more QA Metrology results are not signed off.')
RETURN
END CASE
END ;* End of check for a test requirement on the line
NEXT Line
******************************************
* Verify Unload Stage QA Metrology Tests *
******************************************
DevelopmentFlag = Xlate('DEVELOPMENT', 'HGCV', 'STATUS', 'X')
If (DevelopmentFlag EQ True$) then
WOMatQAKey = WONo : '*' : CassNo
WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatQAKey)
OutOfSpec = WOMatQARec<WO_MAT_QA_OUT_OF_SPEC$>
OutOfSpec = Sum(OutOfSpec)
If OutOfSpec GT 0 then
FailReasons = WOMatQARec<WO_MAT_QA_FAIL_REASON$>
ErrorMsg = 'Process Error':@SVM
For each FailReason in FailReasons using @VM
ErrorMsg := FailReason:CRLF$
Next FailReason
ErrMsg(ErrorMsg)
Return
end
end
*******************************************
* Verify if all steps have been completed *
*******************************************
WOMatRec = XLATE('WO_MAT',WONo:'*':CassNo,'','X')
RDSNos = WOMatRec<WO_MAT_RDS_NO$>
MakeupBox = WOMatRec<WO_MAT_MAKEUP_BOX$>
LOCATE RDSNo IN RDSNos USING @VM SETTING Pos THEN
NextRDS = RDSNos<1,Pos+1>
END ELSE
NextRDS = ''
END
IF (WOMatCurrStatus NE 'QA' AND WOMatCurrStatus NE 'PSTI' AND WOMatCurrStatus NE 'COMP') AND (NextRDS NE '' AND WOMatCurrStatus NE 'VER') THEN
ErrorMessage = 'Process Error':@SVM:'Run is not ready for final QA.':CRLF$:CRLF$
ErrorMessage := 'The ':OCONV(WOMatCurrStatus,'[WO_MAT_CURR_STATUS_CONV]'):' step is not complete.'
ErrMsg(ErrorMessage)
RETURN
END
IF NOT(MemberOF( @USER4, 'SUPERVISOR' ) OR MemberOf( @user4, 'LEAD' ) OR MemberOf( @USER4, 'FINAL_QA' ) ) THEN
ErrMsg('Process Error':@SVM:'You must be a supervisor to verify this RDS.')
RETURN
END
************************************************************************
* Prompt user to validate the Process Specification Stage Instructions *
************************************************************************
VerInst = XLATE('PRS_STAGE',PSNo:'*QA',PRS_STAGE_INST$,'X')
VerInst = TRIM(VerInst)
IF LEN(VerInst) > 5 THEN
Yes = Dialog_Box( 'RDS_VER', @WINDOW, VerInst )
IF NOT(Yes) THEN
RETURN
END
END
**************************
* Verify user's password *
**************************
// Check if user has already been verified above to avoid prompting for password twice
If Valid EQ '' Then
Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW)
Valid = Response<1>
end
IF (Valid) THEN
SigDt = OCONV( Date(), 'D2/' )
SigTm = Time()
SigTmPlusOne = OCONV(SigTm + 1, 'MTS' )
SigTmPlusTwo = OCONV(SigTm + 2, 'MTS' )
SigTmPlusFive = OCONV(SigTm + 5, 'MTS' )
SigTmPlusTen = OCONV(SigTm + 10, 'MTS' )
SigTm = OCONV(SigTm,'MTS')
SigBy = @USER4
EventParms = ''
EventCnt = 1
IF ReactorType NE 'EPP' THEN
ToolID = ''
WHCd = 'CR'
LocCD = 'QA'
Tag = ''
EventParms<COL$LOG_FILE> = 'WO_MAT'
EventParms<COL$LOG_DTM> = SigDt:' ':SigTm
EventParms<COL$ACTION> = WOStep:'QA'
EventParms<COL$WH_CD> = 'CR'
EventParms<COL$LOC_CD> = 'QA'
EventParms<COL$WO_NOS> = WONo
EventParms<COL$CASS_NOS> = CassNo
EventParms<COL$USER_ID> = @USER4
EventParms<COL$TAGS> = ''
EventParms<COL$TOOL_ID> = ''
CONVERT @FM TO @RM IN EventParms
obj_WO_Mat_Log('Create',EventParms) ;* * * * * INV EVENT LOG * * * * *
IF Get_Status(errCode) THEN
CALL ErrMsg(ErrCode)
RETURN
END
IF MakeupBox = 1 THEN
EventParms<COL$LOG_FILE> = 'WO_MAT'
EventParms<COL$LOG_DTM> = SigDt:' ':SigTmPlusTwo
EventParms<COL$ACTION> = 'RTU'
EventParms<COL$WH_CD> = 'CR'
EventParms<COL$LOC_CD> = 'MU'
EventParms<COL$WO_NOS> = WONo
EventParms<COL$CASS_NOS> = CassNo
EventParms<COL$USER_ID> = @USER4
EventParms<COL$TAGS> = ''
EventParms<COL$TOOL_ID> = ''
CONVERT @FM TO @RM IN EventParms
obj_WO_Mat_Log('Create',EventParms) ;* * * * * INV EVENT LOG * * * * *
IF Get_Status(errCode) THEN
CALL ErrMsg(ErrCode)
RETURN
END
END
END ;* End of check for non EpiPRO reactor
Set_Property(@Window : '.POST_EPI_SUP_SIG', 'TEXT', @User4)
Set_Property(@Window : '.POST_EPI_SUP_SIG_NAME', 'TEXT', OConv(@User4, '[XLATE_CONV,LSL_USERS*FIRST_LAST]'))
Set_Property(@Window : '.POST_EPI_SUP_SIG_DATE', 'TEXT', SigDt)
Set_Property(@Window : '.POST_EPI_SUP_SIG_TIME', 'TEXT', SigTmPlusOne)
/* Sync up the RDS record with WO_MAT */
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)
WOMatKey = WONo:'*':CassNo
WOMatRec = XLATE('WO_MAT',WOMatKey,'','X')
WMRDSNos = WOMatRec<WO_MAT_RDS_NO$>
LOCATE RDSNo IN WMRDSNos USING @VM SETTING Pos THEN
NextRDSNo = WMRDSNos<1,Pos+1>
IF NextRDSNo NE '' THEN
CurrWfrQty = obj_WO_Mat('CurrWaferCnt',WOMatKey:@RM:WOMatRec)
Set_Status(0)
obj_RDS('SetSchedWfrQty',NextRDSNo:@RM:CurrWfrQty)
IF Get_Status(errCode) THEN ErrMsg(errCode)
END
END
* Added 08/05/2013 JCH
WOMatKey = WONo:'*':CassNo
OrgMUPart = XLATE('WO_MAT',WOMatKey,'MU_PART_NO','X')
NewMUPart = XLATE('WO_MAT',WOMatKey,'MU_PART_NO','X')
IF NewMUPart NE OrgMUPart THEN
IndexTransactionRow = 'MU_PART_NO':@FM:WOMatKey:@FM:OrgMUPart:@FM:NewMUPart:@FM
OPEN "!WO_MAT" TO BangTable THEN
LOCK BangTable, 0 THEN
READ PendingTrans FROM BangTable, 0 ELSE PendingTrans = '0':@FM
PendingTrans := IndexTransactionRow
WRITE PendingTrans ON BangTable, 0 ELSE
ErrMsg('Unable to write index transaction to !WO_MAT. ':WOMatKey)
END
UNLOCK BangTable, 0 ELSE ErrMsg('Unable to Open !WO_MAT to add index transaction. ':WOMatKey)
END ELSE
ErrMsg('Unable to Lock !WO_MAT to add index transaction. ':WOMatKey)
END
END ELSE
ErrMsg('Unable to Open !WO_MAT to add index transaction. ':WOMatKey)
END
END ;* End of check for changed index value
END ;* End of check for valid signature
end event
Event SIG_PROFILE.CLICK()
RDSNo = Get_Property(@WINDOW:'.EDL_RDS_NO','TEXT')
WOMatKey = Xlate('RDS', RDSNo, 'WO_MAT_KEY', 'X')
If WOMatKey NE '' then
SigData = Signature_Services('GetSigProfile', WOMatKey)
Display = ''
RowCnt = COUNT(SigData<1>,@VM) + (SigData<1> NE '')
FOR I = 1 TO RowCnt
Display<1,I,1> = SigData<1,I>
Display<1,I,2> = SigData<2,I>
Display<1,I,3> = SigData<3,I>
Display<1,I,4> = SigData<4,I>
NEXT I
TypeOver = ''
TypeOver<PDISPLAY$> = Display
void = Popup(@WINDOW,TypeOver,'SIG_PROFILE')
end
end event
Event CASS_IDS.POSCHANGED(NextColumn, NextRow)
CtrlEntID = @WINDOW:'.CASS_IDS'
PrevSelPos = Get_Property(CtrlEntId,"PREVSELPOS")
PrevCol = PrevSelPos<1>
PrevRow = PrevSelPos<2>
CurrPos = Get_Property(CtrlEntId,"SELPOS")
CurrCol = CurrPos<1>
CurrRow = CurrPos<2>
ListData = Get_Property(CtrlEntId,'LIST')
ArrayData = Get_Property(CtrlEntId,'ARRAY')
MismatchDetected = False$ /* No mismatch */
CellValue = TRIM(Send_Message(CtrlEntID, "TEXT_BY_POS", CurrCol, CurrRow))
IF (CellValue = '') THEN
ColPointer = CurrCol
LinePointer = CurrRow
ColCnt = 5
/* Find the first non-empty cell */
LOOP
Test = TRIM(Send_Message(CtrlEntID, "TEXT_BY_POS", ColPointer, LinePointer))
UNTIL Test NE '' OR (LinePointer = 0 AND ColPointer = 1)
ColPointer = ColPointer - 1
IF ColPointer = 0 THEN
ColPointer = ColCnt
LinePointer = LinePointer - 1
END
REPEAT
/* Move to the next empty cell */
BEGIN CASE
CASE LinePointer = 0
* Empty Table
LinePointer = 1
ColPointer = 1
CASE ColPointer = ColCnt
LinePointer = LinePointer + 1
ColPointer = 1
CASE 1
ColPointer = ColPointer + 1
END CASE
Set_Property("SYSTEM", "BLOCK_EVENTS", True$)
Set_Property(CtrlEntId, "SELPOS", ColPointer:@FM:LinePointer)
Set_Property("SYSTEM", "BLOCK_EVENTS", False$)
END
*****************************
* Post Prompt for Top Label *
*****************************
TopLabel = TRIM(Send_Message(CtrlEntID, "TEXT_BY_POS", COL$TOP_LABEL, PrevRow))
IF TopLabel[1,2] = '1T' THEN
TopLabel = TopLabel[3,99]
Set_Property(CtrlEntId,"CELLPOS",TopLabel,PrevSelPos)
END
IF ((TopLabel NE '') AND (PrevCol = COL$TOP_LABEL)) THEN
Set_Property(@WINDOW,'@EPIPRO_FLAG',0)
BEGIN CASE
CASE TopLabel[1,1] = 'I'
* WM_IN table
TopLabel = TopLabel[2,99]
WOMatKey = FIELD(TopLabel,'.',1):'*':FIELD(TopLabel,'.',3)
Set_Property(CtrlEntID, "CELLPOS", TopLabel, PrevSelPos)
Set_Property(@WINDOW,'@EPIPRO_FLAG',1)
CASE TopLabel[1,1] = 'O'
* EpiPro Silicon or GaN
TopLabel = TopLabel[2,99]
WONo = TopLabel[1, 'F.']
CassNo = TopLabel[-1, 'B.']
WOMatKey = WONo:'*':CassNo
Set_Property(CtrlEntID, "CELLPOS", TopLabel, PrevSelPos)
If (Count(TopLabel, '.') EQ 2) then
// EpiPro
Set_Property(@WINDOW,'@EPIPRO_FLAG',1)
end else
// GaN
Set_Property(@WINDOW,'@GAN_FLAG',1)
end
CASE INDEX(TopLabel,'.',1) AND NOT(INDEX(TopLabel,'.',2))
* This is a WO_MAT format label
WOMatKey = TopLabel
Convert '.' To '*' In WOMatKey
CASE INDEX(TopLabel,'.',2)
* EpiPRO material indeterminate direction
WOMatKey = FIELD(TopLabel,'.',1):'*':Field(TopLabel,'.',3)
Set_Property(@WINDOW,'@EPIPRO_FLAG',1)
CASE 1
ReactRunRec = XLATE('REACT_RUN', TopLabel, '', 'X')
IF ReactRunRec = '' THEN
RDSRec = XLATE('RDS',TopLabel,'','X')
TestWO = RDSRec<RDS_WO$>
CassNo = RDSRec<RDS_CASS_NO$>
END ELSE
TestWO = ReactRunRec<REACT_RUN_WO_NO$>
CassNo = ReactRunRec<REACT_RUN_CASS_NO$>
End
WOMatKey = TestWO:'*':CassNo
END CASE
WOMatRec = XLATE('WO_MAT', WOMatKey, '', 'X')
IF (WOMatRec = '') THEN
Set_Property(CtrlEntID, "CELLPOS", '', PrevSelPos) ;* No corresponding data record found for label scanned bad read or wrong thing scanned
Set_Property("SYSTEM", "BLOCK_EVENTS", True$)
Set_Property(CtrlEntID, "SELPOS", PrevSelPos)
Set_Property("SYSTEM", "BLOCK_EVENTS", False$)
RETURN
END ELSE
Set_Property(CtrlEntID, "CELLPOS", FIELD(WOMatKey,'*',1), COL$WOLOGKEY:@FM:PrevRow)
* * Check for FQA signature completed * *
FQASigned = ''
WorkOrdNo = Field(WOMatKey, '*', 1)
ReactorType = XLATE('WO_LOG', WorkOrdNo, 'REACT_TYPE', 'X')
QAStage = ''
Begin Case
Case ReactorType EQ 'EPP'
QAStage = 'MO_QA'
Case ReactorType EQ 'GAN'
QAStage = 'G_FQA'
Case Otherwise$
QAStage = 'QA'
End Case
FQASigned = Signature_Services('CheckSignature', WOMatKey, QAStage)
IF NOT(FQASigned) THEN
Msg(@WINDOW, '', 'UNSIGNED_CASSETTE')
Set_Property(CtrlEntID, "CELLPOS", '', PrevSelPos) ;* No corresponding data record found for label scanned bad read or wrong thing scanned
Set_Property("SYSTEM", "BLOCK_EVENTS", True$)
Set_Property(CtrlEntID, "SELPOS", PrevSelPos)
Set_Property("SYSTEM", "BLOCK_EVENTS", False$)
RETURN
END
Set_Property(@WINDOW,'@WO_MAT_KEY',WOMatKey)
Set_Property(@WINDOW,'@WO_MAT_LOT',WOMatRec<WO_MAT_LOT_NO$>)
END
END
********************************
* Post Prompt for Bottom Label *
********************************
TopLabel = TRIM(Send_Message(CtrlEntID, "TEXT_BY_POS", COL$TOP_LABEL, PrevRow))
BottomLabel = TRIM(Send_Message(CtrlEntID, "TEXT_BY_POS", COL$BOTTOM_LABEL, PrevRow))
IF BottomLabel[1,2] = '1T' THEN
BottomLabel = BottomLabel[3,99]
Set_Property(CtrlEntId,"CELLPOS",BottomLabel,PrevSelPos)
END
IF ((BottomLabel NE '') AND (PrevCol = COL$BOTTOM_LABEL)) Then
BEGIN CASE
CASE BottomLabel[1,1] = 'I'
* WM_IN table
BottomLabel = BottomLabel[2,99]
Set_Property(CtrlEntID, "CELLPOS", BottomLabel, PrevSelPos)
CASE BottomLabel[1,1] = 'O'
* WM_OUT table
BottomLabel = BottomLabel[2,99]
Set_Property(CtrlEntID, "CELLPOS", BottomLabel, PrevSelPos)
CASE INDEX(BottomLabel,'.',1) AND NOT(INDEX(BottomLabel,'.',2))
* This is a WO_MAT format label
NULL
CASE INDEX(BottomLabel,'.',2)
* EpiPRO material indeterminate direction
NULL
CASE 1
NULL
END CASE
************************************
* Validate the Top & Bottom Labels *
************************************
IF (TopLabel NE BottomLabel) THEN
MismatchDetected = True$ /* Mismatch Detected */
void = Utility('BEEP')
Set_Property(CtrlEntID, "CELLPOS", 'Mismatch', COL$RESULT:@FM:PrevRow) /* Load Current Location */
stat = Send_Message(CtrlEntID, 'COLOR_BY_POS', 0, PrevRow, RED$)
Set_Property("SYSTEM", "BLOCK_EVENTS", True$)
Set_Property(CtrlEntID, "SELPOS", COL$TOP_LABEL:@FM:PrevRow+1) /* Move to the next line ready to scan */
Set_Property("SYSTEM", "BLOCK_EVENTS", False$)
InsertedPosition = Send_Message(CtrlEntID, "INSERT", -1, '')
TypeOver = ''
TypeOver<MCAPTION$> = 'FQA Label Mismatch'
TypeOver<MTEXT$> = CRLF$:'Label ID Mismatch!':CRLF$
OK = Msg(@WINDOW,TypeOver,'LABEL_MISMATCH')
* Inform Quality Insurance that a mismatch has occurred *
Recipients = ''
OtherRecipients = XLATE('NOTIFICATION','LABEL_CHECK_FQA',NOTIFICATION_USER_ID$,'X') ;* Added 10/03/2005 JCH - J.C. Henry & Co., Inc Changed from LABEL_MISMATCH by dkk 11/6/15
FOR N = 1 TO COUNT(OtherRecipients,@VM) + (OtherRecipients NE '')
OtherRecip = OtherRecipients<1,N>
LOCATE OtherRecip IN Recipients USING @VM SETTING Pos ELSE
Recipients = INSERT(Recipients,1,Pos,0,OtherRecip)
END
NEXT N
SentFrom = @USER4
Subject = 'Final QA Label Check Mismatch'
Message = 'Cassette Top ID ':QUOTE(TopLabel):' has mismatched Bottom ID ':QUOTE(BottomLabel)'.'
AttachWindow = ''
AttachKey = ''
SendToGroup = ''
Parms = Recipients:@RM:SentFrom:@RM:Subject:@RM:Message:@RM:AttachWindow:@RM:AttachKey:@RM:SendToGroup
obj_Notes('Create',Parms)
If Count(TopLabel, '.') then
// EpiPro Silicon or GaN
IF TopLabel[1,1] = 'O' THEN TopLabel[1,1] = ''
IF TopLabel[1,1] = 'I' THEN TopLabel[1,1] = ''
WONo = TopLabel[1, 'F.']
StepNo = 1
CassNo = TopLabel[-1, 'B.']
RDSNo = ''
end else
// Non-EpiPro Silicon
RDSNo = TopLabel
ReactRunRec = XLATE('REACT_RUN', RDSNo, '', 'X')
WONo = ReactRunRec<REACT_RUN_WO_NO$>
StepNo = ReactRunRec<REACT_RUN_WO_STEP$>
CassNo = ReactRunRec<REACT_RUN_CASS_NO$>
end
* Setup parameters to WO_Mat_Log method *
CurrDTM = OCONV(Date(),'D2/'):' ':OCONV(Time(),'MTS')
UserID = @USER4
LogFile = 'WO_MAT' ;* Changed so all scans are logged in the WO_MAT table 12/3/2006
Action = 'LBLCHK' ;* Final label check for same top and bottom and correct Lot Number on WO_MAT record
WHCd = 'CR' ;* Clean room @ final QA
LocCd = 'QA' ;* MisMatch - keep the cassette location at Final QA
Set_Status(0)
obj_WO_Mat_Log('Create',LogFile:@RM:CurrDTM:@RM:Action:@RM:WhCd:@RM:LocCd:@RM:WONo:@RM:CassNo:@RM:UserID:@RM:'Mismatch')
IF Get_Status(errCode) THEN
Errmsg(errCode)
END
END /* End of check for top & bottom labels check */
END /* End of check for bottom label available */
**********************
* Process Lot Number *
**********************
IF (MismatchDetected = False$) THEN
LotNumber = TRIM(Send_Message(CtrlEntID, "TEXT_BY_POS", COL$LOT_NO, PrevRow))
IF ((TopLabel NE '') AND (BottomLabel NE '') AND (LotNumber = '')) THEN
EpiProFlag = Get_Property(@WINDOW, '@EPIPRO_FLAG')
GaNFlag = Get_Property(@WINDOW, '@GAN_FLAG')
Begin Case
Case EpiProFlag EQ True$
LotNumber = 'EpiPRO'
Set_Property(CtrlEntID, "CELLPOS", LotNumber, COL$LOT_NO:@FM:PrevRow)
Case GaNFlag EQ True$
LotNumber = 'GaN'
Set_Property(CtrlEntID, "CELLPOS", LotNumber, COL$LOT_NO:@FM:PrevRow)
End Case
END
IF ((LotNumber NE '') AND (PrevCol = COL$LOT_NO)) THEN
***************************
* Validate the Lot Number *
***************************
IF (LotNumber NE 'EpiPRO' and LotNumber NE 'GaN') THEN
IF ((LotNumber[1,2] = '1T') OR (LotNumber[1,2] = '2T')) THEN
/* Trim off field identifiers (1T) or (2T) if present - changed by dkk 12/13/16 */
LotNumber[1,2] = ''
Set_Property(CtrlEntID, "CELLPOS", LotNumber, COL$LOT_NO:@FM:PrevRow)
END
WOMatKey = Get_Property(@WINDOW,'@WO_MAT_KEY')
WONo = WOMatKey[1,'*']
CassNo = WOMatKey[COL2()+1,'*']
WOMatLot = Get_Property(@WINDOW,'@WO_MAT_LOT')
* * * Check for Wales added suffix "-BB" on implant wafers coming back * * *
IF (WOMatLot[-3,1] = '-') AND (WOMatLot[-2,1] = WOMatLot[-1,1]) And WOMatLot[-2,2] Matches "2A" THEN
IF LotNumber = WOMatLot[1,Len(WOMatLot) - 3] THEN
LotNumber := WOMatLot[-3,3]
END
END ;* End of check for "-AA" type lot suffix added by Wales
IF (LotNumber NE WOMatLot) THEN
MismatchDetected = True$ /* Mismatch Detected */
void = Utility('BEEP')
Set_Property(CtrlEntID, "CELLPOS", 'Mismatch',COL$RESULT:@FM:PrevRow) /* Load Current Location */
stat = Send_Message(CtrlEntID, 'COLOR_BY_POS', 0, PrevRow,RED$)
Set_Property("SYSTEM", "BLOCK_EVENTS", True$)
Set_Property(CtrlEntID, "SELPOS", COL$TOP_LABEL:@FM:PrevRow+1) /* Move to the next line ready to scan */
Set_Property("SYSTEM", "BLOCK_EVENTS", False$)
InsertedPosition = Send_Message(CtrlEntID, "INSERT", -1, '')
TypeOver = ''
TypeOver<MCAPTION$> = 'FQA Label Mismatch'
TypeOver<MTEXT$> = CRLF$:'Lot No. Mismatch!':CRLF$
OK = Msg(@WINDOW,TypeOver,'LABEL_MISMATCH')
/* Inform Quality Insurance that a mismatch has occurred */
Recipients = ''
OtherRecipients = XLATE('NOTIFICATION','LABEL_CHECK_FQA',NOTIFICATION_USER_ID$,'X') ;* Added 10/03/2005 JCH - J.C. Henry & Co., Inc Changed from LABEL_MISMATCH by dkk 11/6/15
FOR N = 1 TO COUNT(OtherRecipients,@VM) + (OtherRecipients NE '')
OtherRecip = OtherRecipients<1,N>
LOCATE OtherRecip IN Recipients USING @VM SETTING Pos ELSE
Recipients = INSERT(Recipients,1,Pos,0,OtherRecip)
END
NEXT N
SentFrom = @USER4
Subject = 'Final QA Label Check Mismatch'
Message = 'Cassette ':QUOTE(TopLabel):' has incorrect Lot No ':QUOTE(LotNumber)'.'
AttachWindow = ''
AttachKey = ''
SendToGroup = ''
Parms = Recipients:@RM:SentFrom:@RM:Subject:@RM:Message:@RM:AttachWindow:@RM:AttachKey:@RM:SendToGroup
obj_Notes('Create',Parms)
CurrDTM = OCONV(Date(),'D2/'):' ':OCONV(Time(),'MTS')
UserID = @USER4
LogFile = 'WO_MAT' ;* Changed so all scans are logged in the WO_MAT table 12/3/2006
Action = 'LBLCHK' ;* Final label check for same top and bottom and correct Lot Number on WO_MAT record
WHCd = 'CR' ;* Clean room @ final QA
LocCd = 'QA' ;* MisMatch - keep the cassette location at Final QA
Set_Status(0)
obj_WO_Mat_Log('Create',LogFile:@RM:CurrDTM:@RM:Action:@RM:WhCd:@RM:LocCd:@RM:WONo:@RM:CassNo:@RM:UserID:@RM:'Mismatch')
IF Get_Status(errCode) THEN
Errmsg(errCode)
END
END ELSE
NULL
END /* End of check for LotNumber and WOMatLot matching */
END ELSE
NULL
END /* End of check for EpiPro lot */
END /* End of check for lot number validation */
END
********************************
* Validate Scanned Information *
********************************
IF (MismatchDetected = False$) THEN
/* Read scanned information from edit table */
TopLabel = TRIM(Send_Message(CtrlEntID, "TEXT_BY_POS", COL$TOP_LABEL, PrevRow))
BottomLabel = TRIM(Send_Message(CtrlEntID, "TEXT_BY_POS", COL$BOTTOM_LABEL, PrevRow))
LotNumber = TRIM(Send_Message(CtrlEntID, "TEXT_BY_POS", COL$LOT_NO, PrevRow))
//IFXLabel = TRIM(Send_Message(CtrlEntID, "TEXT_BY_POS", COL$IFX_LABEL, PrevRow))
IF ((TopLabel NE '') AND (BottomLabel NE '') AND (LotNumber NE '')) THEN ;//AND (IFXValid = 1) AND (IFXLabel NE '')) THEN
********************************
* FQA Labels Validation = GOOD *
********************************
Set_Property(CtrlEntID, "CELLPOS", 'OK', COL$RESULT:@FM:PrevRow)
stat = Send_Message(CtrlEntID, "COLOR_BY_POS", 0, PrevRow,GREEN$)
Set_Property("SYSTEM", "BLOCK_EVENTS", True$)
Set_Property(CtrlEntID, "SELPOS", COL$TOP_LABEL:@FM:PrevRow+1) /* Move to the next line ready to scan */
Set_Property("SYSTEM", "BLOCK_EVENTS", False$)
InsertedPosition = Send_Message(CtrlEntID, "INSERT", -1, '')
* Add transaction to Posting system to time-stamp WO_MAT record
! 10/28/2019 - DJS & Dan Crisp
! This transaction is moving to Packaging_Services and is triggered by
! the NDW_PACKAGING form upon a successful scan sequence.
IF Count(TopLabel, '.') THEN
IF TopLabel[1,1] = 'O' THEN TopLabel[1,1] = ''
IF TopLabel[1,1] = 'I' THEN TopLabel[1,1] = ''
WONo = TopLabel[1, 'F.']
StepNo = 1
CassNo = TopLabel[-1, 'B.']
RDSNo = ''
end else
RDSNo = TopLabel
ReactRunRec = XLATE('REACT_RUN',RDSNo,'','X')
WONo = ReactRunRec<REACT_RUN_WO_NO$>
StepNo = ReactRunRec<REACT_RUN_WO_STEP$>
CassNo = ReactRunRec<REACT_RUN_CASS_NO$>
END
CurrDTM = OCONV(Date(),'D2/'):' ':OCONV(Time(),'MTS')
UserID = @USER4
LogFile = 'WO_MAT' ;* Changed so all scans are logged in the WO_MAT table 12/3/2006
Action = 'LBLCHK' ;* Final label check for same top and bottom and correct Lot Number on WO_MAT record
WHCd = 'CR' ;* Clean room @ final QA
LocCd = 'PKO' ;* QA wants this to "place" the cassette into the outbound passthrough
Set_Status(0)
obj_WO_Mat_Log('Create',LogFile:@RM:CurrDTM:@RM:Action:@RM:WhCd:@RM:LocCd:@RM:WONo:@RM:CassNo:@RM:UserID:@RM:'Match')
IF Get_Status(errCode) THEN
Errmsg(errCode)
END
END /* End of check for all information available to be checked*/
END
If NextRow EQ 2 then GoSub RefreshForm
end event
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Internal GoSubs
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
SetupOLEControls:
NumCols = 4
NumRows = 26
StageIDs = Database_Services('ReadDataRow', 'APP_INFO', 'SILICON_STAGE_LIST')
CtrlList = Xlate('STAGE', StageIDs, 'DESC', 'X')
StageCtrl = @Window:'.OLE_EDT_STAGES'
HeaderFontArray = 'Segoe UI':@SVM:8:@SVM:700
HeaderColArray = 40:@FM:False$:@FM:False$:@FM:False$
HeaderAlignArray = 'Center':@FM:'Center':@FM:'Center'
DimArray = NumCols:@FM:NumRows
HeaderTitles = 'Stage':@VM:'Data':@VM:'Signature':@VM:'Sign'
DataColArray = 120:@FM:True$:@FM:True$:@FM:True$:@FM:False$
Set_Property(StageCtrl, "OLE.CellFont[All; All]", 'Segoe UI':@SVM:8)
Set_Property(StageCtrl, "OLE.Dimension", DimArray)
Set_Property(StageCtrl, "OLE.CellFont[1;All]", HeaderFontArray)
Set_Property(StageCtrl, "OLE.LIST", CtrlList)
Set_Property(StageCtrl, "OLE.HeaderFont[All; 1]", HeaderFontArray)
Set_Property(StageCtrl, "OLE.HeaderFont[1; All]", HeaderFontArray)
Set_Property(StageCtrl, "OLE.TitleList", HeaderTitles)
Set_Property(StageCtrl, "OLE.AllowDeletions", False$)
Set_Property(StageCtrl, "OLE.AllowInserts", False$)
Set_Property(StageCtrl, "OLE.HeaderColumn[1]", HeaderColArray)
Set_Property(StageCtrl, "OLE.HeaderAlignment[All; 1]", HeaderAlignArray)
Set_Property(StageCtrl, "OLE.DataColumn[1]", DataColArray)
DataColArray<1> = 60
DataColArray<4> = False$
Set_Property(StageCtrl, "OLE.DataColumn[2-4]", DataColArray)
CellAlignArray = 'Center':@FM:'Center':@FM:'Center'
Set_Property(StageCtrl, "OLE.CellAlignment[4; All]", CellAlignArray)
// Qualify OLE events that we want to intercept
Qualifier = ''
Qualifier<1> = 1
Qualifier<4> = 0 ; * process synchronously (i.e. immediately)
Send_Message(StageCtrl, 'QUALIFY_EVENT', 'OLE.OnButtonClick', Qualifier)
Send_Message(StageCtrl, 'QUALIFY_EVENT', 'OLE.OnCheckChanged', Qualifier)
Send_Message(@Window:'.OLE_BTN_REFRESH', 'QUALIFY_EVENT', 'OLE.OnClick', Qualifier)
// Stage cell button style setup
ButtonTypeArray = ''
ButtonTypeArray<1> = 'Push Button'
ButtonTypeArray<2> = ''
ButtonTypeArray<2, 1> = False$
ButtonTypeArray<2, 2> = True$
ButtonTypeArray<2, 3> = True$
ButtonTypeArray<3> = 'None'
ButtonTypeArray<4> = "Vertical(Gradient(":OI_HOT_BLUE$:", ":OI_HOT_BLUE$:"), Border(":OI_BLUE$:"))"
ButtonTypeArray<5> = "Vertical(Gradient(":OI_CLICK_BLUE$:", ":OI_CLICK_BLUE$:"), Border(":OI_BLUE$:"))"
ButtonTypeArray<6> = 'OD'
ButtonTypeArray<7> = 'None'
Set_Property(StageCtrl, "OLE.CellType[1; All]", ButtonTypeArray)
return
EnableRefreshButton:
RDSNo = Get_Property(@Window:'.EDL_RDS_NO', 'TEXT')
If RDSNo[1, 2] EQ '1T' then
RDSNo = RDSNo[3, 999]
Set_Property(@Window:'.EDL_RDS_NO', 'TEXT', RDSNo)
end
If RDSNo NE '' then
Enabled = RowExists('RDS', RDSNo)
end else
Enabled = False$
end
Set_Property(@Window:'.OLE_BTN_REFRESH', 'ENABLED', Enabled)
return
EnableAutoSignButton:
ChkVals = Get_Property(@Window:'.OLE_EDT_STAGES', "OLE.CellCheck[4; All]")
Enabled = Sum(ChkVals)
Set_Property(@Window:'.PUB_AUTO_SIGN', 'ENABLED', Enabled)
return
EnableOtherButtons:
RDSNo = Get_Property(@Window:'.EDL_RDS_NO', 'TEXT')
Enabled = (RDSNo NE '')
Set_Property(@Window:'.CTRL_PLAN', 'ENABLED', Enabled)
Set_Property(@Window:'.PUB_SAVE', 'ENABLED', Enabled)
Set_Property(@Window:'.PUB_CLEAR_FORM', 'ENABLED', Enabled)
return
RefreshForm:
RDSNo = Get_Property(@Window:'.EDL_RDS_NO', 'TEXT')
If RDSNo NE '' then
If RDSNo[1,2] EQ '1T' then RDSNo[1,2] = ''
Set_Property(@Window:'.EDL_RDS_NO', 'TEXT', RDSNo)
ReactorType = Xlate('RDS', RDSNo, 'REACTOR_TYPE', 'X')
Begin Case
Case ReactorType EQ 'EPP'
ErrMsg('EpiPro runs are not supported by this form at this time!')
Set_Property(@Window:'.EDL_RDS_NO', 'FOCUS', True$)
Set_Property(@Window:'.EDL_RDS_NO', 'SELECTION', 1:@FM:999)
Case ReactorType EQ 'GAN'
ErrMsg('GaN runs are not supported by this form!')
Set_Property(@Window:'.EDL_RDS_NO', 'FOCUS', True$)
Set_Property(@Window:'.EDL_RDS_NO', 'SELECTION', 1:@FM:999)
Case RowExists('RDS', RDSNo)
GoSub ClearLblChkEDT
Def = ""
Def<MTEXT$> = "Loading stage data. Please wait..."
Def<MTYPE$> = "U"
MsgUp = Msg(@Window, Def) ;* display the processing message
WOMatKey = Xlate('RDS', RDSNo, 'WO_MAT_KEY', 'X')
CassSummary = Signature_Services('GetCassSummary', WOMatKey)
CassSummaryPrime = SRP_Array('Rotate', CassSummary, @FM, @VM)
ArrayData = Get_Property(@Window:'.OLE_EDT_STAGES', 'OLE.ARRAY')
StageIDs = Database_Services('ReadDataRow', 'APP_INFO', 'SILICON_STAGE_LIST')
StageDescs = Xlate('STAGE', StageIDs, 'DESC', 'X')
ColorArray = ''
DataList = ''
ChkBoxList = ''
Set_Property(@Window, '@STAGE_ID_LIST', StageIDs)
Set_Property(@Window, '@STAGE_DESC_LIST', StageDescs)
For each Row in CassSummary using @FM setting fPos
StageID = Row<0, SS_STAGE$>
StageDesc = StageDescs<0, fPos>
StagePass = Row<0, SS_PASS$>
StageSigComp = Row<0, SS_SIG$>
StageDataComp = Row<0, SS_DATA$>
StageNA = Row<0, SS_NA$>
ChkBoxList<fPos> = False$
Begin Case
Case StagePass
ColorArray<fPos, 1> = GREEN$
ColorArray<fPos, 2> = BGREEN$
Case StageDataComp and Not(StageSigComp)
ColorArray<fPos, 1> = YELLOW$
ColorArray<fPos, 2> = BYELLOW$
ChkBoxList<fPos> = True$
Case Not(StagePass) and Not(StageNA)
ColorArray<fPos, 1> = RED$
ColorArray<fPos, 2> = BRED$
Case Otherwise$
ColorArray<fPos, 1> = GREY$
ColorArray<fPos, 2> = LTGREY$
End Case
Begin Case
Case StageDataComp
DataList<fPos, 2> = 'Complete'
ColorArray<fPos, 3> = GREEN$
Case Not(StageDataComp) and Not(StageNA)
DataList<fPos, 2> = 'Missing'
ColorArray<fPos, 3> = YELLOW$
Case Otherwise$
DataList<fPos, 2> = 'N/A'
ColorArray<fPos, 3> = 'None'
End Case
Begin Case
Case StageSigComp
DataList<fPos, 3> = 'Complete'
ColorArray<fPos, 4> = GREEN$
Case Not(StageSigComp) and Not(StageNA)
DataList<fPos, 3> = 'Missing'
ColorArray<fPos, 4> = YELLOW$
Case Otherwise$
DataList<fPos, 3> = 'N/A'
ColorArray<fPos, 4> = 'None'
End Case
Next Row
Set_Property(@Window:'.OLE_EDT_STAGES', "OLE.CellCheck[4; All]", False$)
Set_Property(@Window, '@CHK_BOX_LIST', ChkBoxList)
Set_Property(@Window, '@DATA_LIST', DataList)
Set_Property(@Window, '@COLOR_ARRAY', ColorArray)
GoSub PopulateCells
GoSub ColorCells
GoSub EnableChkBoxes
GoSub EnableAutoSignButton
GoSub EnableOtherButtons
GoSub UpdateHoldLabel
GoSub ColorControls
Send_Event(@Window, 'READ')
Msg(@Window, MsgUp) ;* Take message down
Case Otherwise$
ErrMsg('RDS ':RDSNo:' does not exist!.')
Set_Property(@Window:'.EDL_RDS_NO', 'FOCUS', True$)
Set_Property(@Window:'.EDL_RDS_NO', 'SELECTION', 1:@FM:999)
End Case
end
return
ColorCells:
ColorArray = Get_Property(@Window, '@COLOR_ARRAY')
If ColorArray NE '' then
StageCtrl = @Window:'.OLE_EDT_STAGES'
For each Row in ColorArray using @FM setting fPos
// Column 1 - Stage Name
BackColor = Row<0, 1>
If BackColor EQ '' then BackColor = 'None'
HotBackColor = Row<0, 2>
If HotBackColor EQ '' then HotBackColor = 'None'
CellTypeArray = Get_Property(StageCtrl, 'OLE.CellType[1;':fPos:']')
CellTypeArray<3> = BackColor
CellTypeArray<4> = HotBackColor
Set_Property(StageCtrl, 'OLE.CellType[1;':fPos:']', CellTypeArray)
For Col = 2 to 3
BackColor = Row<0, Col + 1>
CellColorArray = Get_Property(StageCtrl, 'OLE.CellColors[':Col:';':fPos:']')
CellColorArray<2> = BackColor
Set_Property(StageCtrl, 'OLE.CellColors[':Col:';':fPos:']', CellColorArray)
Next Col
Next Row
end
return
ColorControls:
WafersOut = Get_Property(@Window:'.WAFERS_OUT', 'TEXT')
WafersScheduled = Get_Property(@Window:'.WAFERS_SCHEDULED', 'TEXT')
If WafersScheduled NE WafersOut then
BackColor = RED$
end else
BackColor = GREEN$
end
Set_Property(@Window:'.WAFERS_SCHEDULED','BACKCOLOR',BackColor)
Set_Property(@Window:'.WAFERS_OUT','BACKCOLOR',BackColor)
ROTRAction = Get_Property(@WINDOW:'.ROTR_ACTION','TEXT')
BEGIN CASE
CASE ROTRAction[1,1] = 'P'
BackColor = GREEN$
CASE ROTRAction[1,1] = 'F'
BackColor = RED$
CASE ROTRAction[1,1] = 'W'
BackColor = YELLOW$
CASE ROTRAction[1,1] = 'A'
BackColor = ORANGE$
CASE 1
BackColor = Get_Property(@WINDOW,'BACKCOLOR')
END CASE
Set_Property(@WINDOW:'.ROTR_ACTION','BACKCOLOR',BackColor)
return
PopulateCells:
DataList = Get_Property(@Window, '@DATA_LIST')
If DataList NE '' then
StageCtrl = @Window:'.OLE_EDT_STAGES'
For each Row in DataList using @FM setting fPos
For Col = 2 to 3
CellText = DataList<fPos, Col>
Set_Property(StageCtrl, 'OLE.CellText[':Col:';':fPos:']', CellText)
Next Col
Next Row
end
return
EnableChkBoxes:
ChkBoxList = Get_Property(@Window, '@CHK_BOX_LIST')
If ChkBoxList NE '' then
StageCtrl = @Window:'.OLE_EDT_STAGES'
For each Row in ChkBoxList using @FM setting fPos
ChkBoxEnabled = Row<0, 1>
If ChkBoxEnabled then
CellColorArray = Get_Property(StageCtrl, 'OLE.CellColors[4;':fPos:']')
CellColorArray<2> = 'None'
Set_Property(StageCtrl, 'OLE.CellColors[4;':fPos:']', CellColorArray)
CellTypeArray = 'CHB':@FM:True$
Set_Property(StageCtrl, "OLE.CellType[4;":fPos:"]", CellTypeArray)
Set_Property(StageCtrl, "OLE.CellProtection[4;":fPos:"]", 'None')
end else
CellColorArray = Get_Property(StageCtrl, 'OLE.CellColors[4;':fPos:']')
CellColorArray<2> = GREY$
Set_Property(StageCtrl, 'OLE.CellColors[4;':fPos:']', CellColorArray)
Set_Property(StageCtrl, "OLE.CellType[4;":fPos:"]", 'TEXT')
Set_Property(StageCtrl, "OLE.CellProtection[4;":fPos:"]", 'Full')
end
Next Row
end
return
UpdateHoldLabel:
Ctrl = @Window:'.LBL_HOLD'
RDSNo = Get_Property(@Window:'.EDL_RDS_NO', 'TEXT')
OnHold = Xlate('RDS', RDSNo, 'HOLD', 'X')
If OnHold then
// Set label to "On Hold" and set text color to red
Set_Property(Ctrl, 'TEXT', 'On Hold')
Set_Property(Ctrl, 'FORECOLOR', BRED$)
end else
// Set label to "Off Hold" and set text color to green
Set_Property(Ctrl, 'TEXT', 'Off Hold')
Set_Property(Ctrl, 'FORECOLOR', BGREEN$)
end
return
OpenCleanInsp:
DetWindow = 'CLEAN_INSP'
DetKeys = CINo
DefaultRec = ''
RetKey = RDSNo
RetWin = CtrlEntID
RetPage = 1
RetCtrl = 'OLE_EDT_STAGES'
RetPos = ''
obj_Appwindow('ViewNewDetail',DetWindow:@RM:DetKeys:@RM:DefaultRec:@RM:RetKey:@RM:RetPage:@RM:RetCtrl:@RM:RetPos)
Set_Property(DetWindow, '@SKIP_RETURN', True$)
return
OpenWOMatWfr:
DetWindow = 'WO_MAT_WFR'
DetKeys = WOMatKey
DefaultRec = ''
RetKey = RDSNo
RetWin = ''
RetPage = 1
RetCtrl = ''
RetPos = ''
obj_Appwindow('ViewNewDetail',DetWindow:@RM:DetKeys:@RM:DefaultRec:@RM:RetKey:@RM:RetPage:@RM:RetCtrl:@RM:RetPos)
Set_Property(DetWindow, '@SKIP_RETURN', True$)
Set_Property(DetWindow, 'VISIBLE', True$)
return
ClearLblChkEDT:
List = ''
List<3, 4> = ''
Set_Property(@Window:'.CASS_IDS', 'LIST', List)
return
ClearForm:
NumCols = 4
NumRows = 26
DataList = ''
For Row = 1 to NumRows
DataList<Row, NumCols> = ''
Next Row
ColorList = ''
For Row = 1 to NumRows
For Col = 1 to NumCols
ColorList<Row, Col> = 'None'
Next Col
Next Row
ChkList = ''
For Row = 1 to NumRows
For Col = 1 to NumCols
ChkList<Row, Col> = False$
Next Col
Next Row
Set_Property(@Window:'.OLE_EDT_STAGES', "OLE.CellCheck[4; All]", False$)
Set_Property(@Window, '@CHK_BOX_LIST', ChkList)
Set_Property(@Window, '@DATA_LIST', DataList)
Set_Property(@Window, '@COLOR_ARRAY', ColorList)
GoSub PopulateCells
GoSub ColorCells
GoSub EnableChkBoxes
GoSub EnableAutoSignButton
GoSub UpdateHoldLabel
GoSub ColorControls
GoSub ClearLblChkEDT
GoSub EnableRefreshButton
GoSub EnableOtherButtons
return