Compile function NDW_RDS_PROC_STAT_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 NDW_RDS_PROC_STAT_NEPP $Insert LOGICAL $Insert EVENT_SETUP $Insert ACTION_SETUP $Insert APPCOLORS $Insert MSG_EQUATES $Insert WO_MAT_QA_EQUATES 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 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 Declare function Database_Services, Form_Services, Signature_Services, Msg, SRP_Array, QA_Services, obj_Popup Declare function Error_Services, Popup_Services, Dialog_Box, MemberOf 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:'.RDS_NO', 'TEXT', CreateParam) GoSub RefreshForm end GoSub EnableRefreshButton FormSize = '' SRP_Show_Window(@Window, '', 'C', 'C', 1, '', False$, False$, FormSize) 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 Begin Case Case StageID EQ 'VER' Start_Window('RDS_PRE_EPI', @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 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 TestLine<0, COL.MET_MIN$> = WOMatQARec TestLine<0, COL.MET_MAX$> = WOMatQARec TestLine<0, COL.MET_RESULT$> = WOMatQARec TestLine<0, COL.STD_DEV_MAX$> = WOMatQARec TestLine<0, COL.STD_DEV_RESULT$> = WOMatQARec TestLine<0, COL.SIG$> = WOMatQARec TestLine<0, COL.SIG_DTM$> = WOMatQARec 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 Def = "" Def = "Auto-signing stages. Please wait..." Def = "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 If ChkVal EQ True$ then StageID = StageIDs 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 = False$ end else ErrorMsgs<-1> = Error_Services('GetMessage') end end else 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 = False$ end else ErrorMsgs<-1> = Error_Services('GetMessage') end end else ErrorMsgs<-1> = Error_Services('GetMessage') end Case StageID EQ 'UNLOAD' SigReady = QA_Services('UnloadSignatureReady', RDSNo, @User4) If SigReady then QA_Services('SignUnloadStage', RDSNo, @User4, False$) If Error_Services('NoError') then ChkBoxList = 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 = 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 = 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 = 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 TestSlots = WOMatQARec 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 = 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 = 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 = 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 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Internal GoSubs //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// SetupOLEControls: NumCols = 4 NumRows = 25 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 Enabled = RowExists('RDS', RDSNo) 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 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) Def = "" Def = "Loading stage data. Please wait..." Def = "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 = False$ Begin Case Case StagePass ColorArray = GREEN$ ColorArray = BGREEN$ Case StageDataComp and Not(StageSigComp) ColorArray = YELLOW$ ColorArray = BYELLOW$ ChkBoxList = True$ Case Not(StagePass) and Not(StageNA) ColorArray = RED$ ColorArray = BRED$ Case Otherwise$ ColorArray = GREY$ ColorArray = LTGREY$ End Case Begin Case Case StageDataComp DataList = 'Complete' ColorArray = GREEN$ Case Not(StageDataComp) and Not(StageNA) DataList = 'Missing' ColorArray = YELLOW$ Case Otherwise$ DataList = 'N/A' ColorArray = 'None' End Case Begin Case Case StageSigComp DataList = 'Complete' ColorArray = GREEN$ Case Not(StageSigComp) and Not(StageNA) DataList = 'Missing' ColorArray = YELLOW$ Case Otherwise$ DataList = 'N/A' ColorArray = '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 UpdateHoldLabel 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> HotBackColor = Row<0, 2> 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 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 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