COMPILE FUNCTION Comm_RDS_Dev(Method, Parm1, Parm2) #pragma precomp SRP_PreCompiler /* Commuter module for existing RDS... windows. Used for added functionality in the RDS Mess. 09/17/2004 - John C. Henry, J.C. Henry & Co., Inc. */ DECLARE SUBROUTINE Set_Property, End_Dialog, Send_Event, Set_Status, ErrMsg, Security_Err_Msg, Popup, Print_Cass_Labels DECLARE SUBROUTINE obj_Appwindow, Start_Window, Btree.Extract, Msg, Start_Window,Print_Cleanroom_Labels_Thermal,obj_WO_Mat_Log, obj_Post_Log DECLARE SUBROUTINE obj_RDS_Test, obj_Notes, Print_Control_Plan, obj_WO_Mat, Send_Event, Print_RDS_Instruction, obj_RDS, obj_Tables, obj_React_Run, Post_Event DECLARE SUBROUTINE Start_Window DECLARE FUNCTION Get_Property, Get_Status, Dialog_Box, Utility, Send_Message, Popup, obj_RDS_Makeup, Msg, obj_RDS, obj_Tables, obj_Clean_Insp, obj_WO_Mat_QA DECLARE FUNCTION obj_WO_Step, Security_Check, obj_RDS_Audit, obj_WM_In, Create_Dialog, obj_NCR, obj_WO_Mat, MemberOf, obj_RDS_Test, obj_WO_Mat DECLARE FUNCTION Start_Window, Database_Services EQU CRLF$ TO \0D0A\ $INSERT APPCOLORS $INSERT MSG_EQUATES $INSERT POPUP_EQUATES $INSERT RDS_EQU $INSERT WO_STEP_EQU $INSERT WO_LOG_EQUATES $INSERT SECURITY_RIGHTS_EQU $INSERT SEC_GROUPS_EQU $INSERT DICT_EQUATES $INSERT NOTIFICATION_EQU $INSERT RDS_EPILOAD ;* Equates for data coming back from the EpiPRO Load/Unload dialog boxes $INSERT LSL_USERS_EQU $INSERT PROD_SPEC_EQU $INSERT WO_MAT_EQUATES $INSERT REACTOR_EQUATES $INSERT CLEAN_INSP_EQUATES $INSERT TOOL_CLASS_EQUATES $INSERT QUOTE_SIGS_EQU $INSERT COMPANY_EQUATES $insert logical $INSERT PRS_STAGE_EQUATES EQU COL$LOG_FILE TO 1 ;* obj_WO_Mat_Log method parameter equates EQU COL$LOG_DTM TO 2 EQU COL$WO_MAT_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 FONT_FACE_NAME$ TO 1 EQU FONT_HEIGHT$ TO 2 EQU FONT_WEIGHT$ TO 3 EQU FONT_ITALIC$ TO 4 EQU FONT_UNDERLINE$ TO 5 EQU FONT_WIDTH$ TO 6 EQU FONT_CHAR_SET$ TO 7 EQU FONT_PITCH_AND_FAMILY$ TO 8 EQU FONT_STRIKE_OUT$ TO 9 EQU FONT_OUT_PRECISION$ TO 10 EQU FONT_CLIP_PRECISION$ TO 11 EQU FONT_QUALITY$ TO 12 EQU COL$LSID TO 1 EQU COL$RECIPE TO 2 EQU COL$RECIPE_NAME TO 3 EQU COL$PARAMS TO 4 EQU COL$PARMS_OUT TO 5 EQU COL$BLANK_COL TO 6 EQU COL$MET_NO TO 7 EQU COL$THICK_AVG TO 8 EQU COL$RRHO_AVG TO 9 EQU COL$MET_NO_Z1 TO 10 EQU COL$THICK_AVG_Z1 TO 11 EQU COL$RRHO_AVG_Z1 TO 12 EQU COL$MET_NO_Z2 TO 13 EQU COL$THICK_AVG_Z2 TO 14 EQU COL$RRHO_AVG_Z2 TO 15 EQU COL$MET_OUT TO 16 EQU COL$MET_OUT_Z1 TO 17 EQU COL$MET_OUT_Z2 TO 18 EQU COL$MET_TWSIG TO 19 EQU COL$MET_TWSIG_Z1 TO 20 EQU COL$MET_TWSIG_Z2 TO 21 EQU COL$POCKET TO 1 EQU COL$USE TO 2 EQU COL$ZONE TO 3 EQU COL$IN_CASS TO 4 EQU COL$IN_SLOT TO 5 EQU COL$CHAR TO 6 EQU COL$OUT_CASS TO 7 EQU COL$OUT_SLOT TO 8 EQU COL$NCR TO 9 ;* Dead? EQU COL$MET_TEST TO 1 ;* QA Metrology control RDS_POST_EPI window 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$UL_MET_TEST TO 1 ;* QA Metrology control on RDS_UNLOAD window EQU COL$UL_MET_TEST_DESC TO 2 EQU COL$UL_MET_RECIPE TO 3 EQU COL$UL_MET_SLOT TO 4 EQU COL$UL_MET_SLOT_DESC TO 5 EQU COL$UL_MET_WFR_QTY TO 6 EQU COL$UL_MET_MIN TO 7 EQU COL$UL_MET_MAX TO 8 EQU COL$UL_MET_RESULT TO 9 EQU COL$UL_MET_PHASE_MIN TO 10 EQU COL$UL_MET_PHASE_RESULT TO 11 EQU COL$UL_MET_SIG TO 12 EQU COL$UL_MET_SIG_DTM TO 13 EQU COL$HOLD_START_DTM TO 1 EQU COL$HOLD_START_USER TO 2 EQU COL$HOLD_START_REASON TO 3 EQU COL$HOLD_STOP_DTM TO 4 EQU COL$HOLD_STOP_USER TO 5 EQU COL$HOLD_STOP_REASON TO 6 EQU COL$ACTION TO 1 EQU COL$SPEC_CLEAN_TOOL TO 2 EQU COL$SPEC_MICROSCOPE TO 3 EQU COL$SPEC_BRIGHTLIGHT TO 4 EQU COL$SURFSCAN_RECIPE TO 5 EQU COL$TOOL TO 6 EQU COL$SIG TO 7 EQU COL$SIG_DTM TO 8 ErrTitle = 'Error in Comm_RDS' ErrorMsg = '' Result = '' BEGIN CASE CASE Method = 'Clear' ; GOSUB Clear CASE Method = 'Refresh' ; GOSUB Refresh CASE Method = 'GotFocus' ; GOSUB GotFocus CASE Method = 'RdsLF' ; GOSUB RdsLF CASE Method = 'MUWafers' ; GOSUB MUWafers CASE Method = 'ProdWfrLF' ; GOSUB ProdWfrLF CASE Method = 'WafersInLF' ; GOSUB WafersInLF CASE Method = 'Update' ; GOSUB Update CASE Method = 'FirstRead' ; GOSUB FirstRead CASE Method = 'FirstRefresh' ; GOSUB FirstRefresh CASE Method = 'SupVerSigLF' ; GOSUB SupVerSigLF CASE Method = 'NewNCR' ; GOSUB NewNCR CASE Method = 'NCRKeysDC' ; GOSUB NCRKeysDC CASE Method = 'PrintLabels' ; GOSUB PrintLabels CASE Method = 'ViewAudit' ; GOSUB ViewAudit CASE Method = 'LSIdDC' ; GOSUB LSIdDC CASE Method = 'LoadEpiPro' ; GOSUB LoadEpiPro CASE Method = 'UnloadEpiPro' ; GOSUB UnloadEpiPro CASE Method = 'ClearEpiUnload' ; GOSUB ClearEpiUnload CASE Method = 'AddZoneMet' ; GOSUB AddZoneMet CASE Method = 'MoveMetToZone' ; GOSUB MoveMetToZone CASE Method = 'HoldClick' ; GOSUB HoldClick CASE Method = 'HoldDC' ; GOSUB HoldDC CASE Method = 'CtrlPlanClick' ; GOSUB CtrlPlanClick CASE Method = 'Override' ; GOSUB Override CASE Method = 'PrintInstruction' ; GOSUB PrintInstruction CASE Method = 'ViewWOMat' ; GOSUB ViewWOMat CASE Method = 'NextStepQty' ; GOSUB NextStepQty CASE Method = 'CIClick' ; GOSUB CIClick CASE Method = 'LoadCI' ; GOSUB LoadCI CASE Method = 'SAPSign' ; GOSUB SAPSign CASE Method = 'SAPReject' ; GOSUB SAPReject CASE Method = 'MetTestDC' ; GOSUB MetTestDC CASE Method = 'LUPostCode' ; GOSUB LUPostCode CASE Method = 'SigProfile' ; GOSUB SigProfile CASE Method = 'ReactProfile' ; GOSUB ReactProfile CASE 1 ErrMsg(ErrTitle:@SVM:'Unknown method ':QUOTE(Method):' passed to routine.') END CASE RETURN Result * * * * * * * RdsLF: * * * * * * * RDSNo = Get_Property(@WINDOW:'.RDS_NO','DEFPROP') IF RDSNo NE '' THEN IF RowExists('RDS',RDSNo) ELSE Msg(@WINDOW,'','INVALID_RDS_NO') END END ;* End of check for null RDSNo RETURN * * * * * * * Clear: * * * * * * * * * * * * * * Refresh: * * * * * * * **** Added 4/9/2014 JCH * * * * * * WONo = Get_Property(@WINDOW:'.WO','DEFPROP') IF WONo NE '' THEN PriDisp = XLATE('WO_LOG',WONo,'PRI_DISPLAY','X') Set_Property(@WINDOW:'.PRI_DISPLAY_TEXT','TEXT',PriDisp) CurrFontProp = Get_Property(@WINDOW:'.PRI_DISPLAY_TEXT','FONT') NewFontProp = FIELD(CurrFontProp,@SVM,1,12) IF PriDisp[1,2] = 'P1' THEN Set_Property(@WINDOW:'.PRI_DISPLAY_TEXT','DEFPROP','P1 - High') NewFontProp<1,1,FONT_WEIGHT$> = 700 NewFontProp<1,1,FONT_ITALIC$> = 255 NewFontProp<1,1,FONT_WIDTH$> = 7 ForeColor = BRED$ END IF PriDisp[1,2] = 'P2' THEN Set_Property(@WINDOW:'.PRI_DISPLAY_TEXT','DEFPROP','P2 - Medium') NewFontProp<1,1,FONT_WEIGHT$> = 400 NewFontProp<1,1,FONT_ITALIC$> = 255 NewFontProp<1,1,FONT_WIDTH$> = 6 ForeColor = BYELLOW$ END IF PriDisp[1,2] = 'P3' THEN Set_Property(@WINDOW:'.PRI_DISPLAY_TEXT','DEFPROP','P3 - Low') NewFontProp<1,1,FONT_WEIGHT$> = 400 NewFontProp<1,1,FONT_ITALIC$> = 0 NewFontProp<1,1,FONT_WIDTH$> = 6 ForeColor = FONTGREEN$ END Set_Property(@WINDOW:'.PRI_DISPLAY_TEXT','FONT', NewFontProp) Set_Property(@WINDOW:'.PRI_DISPLAY_TEXT','FORECOLOR',ForeColor) END ;* End of check for window * * * * * * ** * * * * PSNo = Get_Property(@WINDOW:'.PSN','TEXT') PSStatus = XLATE('PROD_SPEC',PSNo,9,'X') IF PSStatus[1,1] = 'I' THEN Set_Property(@WINDOW:'.PSN','BACKCOLOR',RED$) END ELSE Set_Property(@WINDOW:'.PSN','BACKCOLOR',GREEN$) END IF MemberOf(@USER4,'TESTING') OR @USERNAME = 'BRYCE_BARB' OR @USER4 = 'BRYCE_BARB' THEN BEGIN CASE CASE @WINDOW = 'RDS_PRE_EPI' Set_Property(@WINDOW:'.PRE_CI_NO','VISIBLE',1) CASE @WINDOW = 'RDS' Set_Property(@WINDOW:'.FWI_CI_NO','VISIBLE',1) CASE @WINDOW = 'RDS_UNLOAD' Set_Property(@WINDOW:'.LWI_CI_NO','VISIBLE',1) CASE @WINDOW = 'RDS_POST_EPI' Set_Property(@WINDOW:'.POST_CI_NO','VISIBLE',1) END CASE END * Modification History Button ProdMgr = XLATE( 'CONFIG', 'QUOTE_SIGS', ProdMgr$, 'X' ) TrainSpec = XLATE( 'CONFIG', 'QUOTE_SIGS', TrainSpec$, 'X' ) IF @USERNAME = 'BRYCE_BARB' OR (Memberof( @USER4, 'MASTER' )) OR ( @USER4 = ProdMgr ) OR ( @USER4 = TrainSpec ) THEN Set_Property( @WINDOW:'.VIEW_MOD_HIST', 'VISIBLE', 1 ) END * Wafers Accounting and update section UseMUWafers = Get_Property(@WINDOW:'.MU_WAFERS_FLAG','CHECK') MakeupBox = Get_Property(@WINDOW:'.MAKEUP_BOX','CHECK') WafersIn = Get_Property(@WINDOW:'.WAFERS_IN','INVALUE') WafersOut = Get_Property(@WINDOW:'.WAFERS_OUT','INVALUE') WafersScheduled = Get_Property(@WINDOW:'.WAFERS_SCHEDULED','INVALUE') WafersVerify = Get_Property(@WINDOW:'.VERIFY_QTY','INVALUE') WafersProdTest = Get_Property(@WINDOW:'.TW_PROD','INVALUE') WafersTotRej = Get_Property(@WINDOW:'.TOT_REJ','INVALUE') WafersSRPBill = Get_Property(@WINDOW:'.RESEARCH_SRP_BILLABLE','INVALUE') RunOrderNo = Get_Property(@WINDOW:'.RUN_ORDER_NUM','INVALUE') MUWfrsRemoved = Get_Property(@WINDOW:'.MU_WFRS_REMOVED','INVALUE') MUWfrsAdded = Get_Property(@WINDOW:'.MU_WFRS_ADDED','INVALUE') WONo = Get_Property(@WINDOW:'.WO','INVALUE') CassNo = Get_Property(@WINDOW:'.CASS_NO','INVALUE') CassSchedShip = Get_Property(@WINDOW:'.CASS_SHIP_QTY', 'INVALUE') CassShipQty = XLATE('WO_MAT',WONo:'*':CassNo,WO_MAT_CASS_SHIP_QTY$,'X') MinCassShipQty = XLATE('WO_MAT',WONo:'*':CassNo,WO_MAT_MIN_CASS_SHIP_QTY$,'X') IF CassShipQty NE '' AND CassShipQty > 0 THEN FullBoxQty = CassShipQty END ELSE FullBoxQty = WafersIn END EnableLoadButton = 1 EnableQASignButton = 1 EnableUnloadButton = 1 QASignReason = '' IF UseMUWafers THEN Set_Property(@WINDOW:'.MU_WAFER_BUTTON','VISIBLE',0) IF (WafersIn NE '' AND WafersOut NE '' AND WafersOut < FullBoxQty) THEN IF RunOrderNo = 1 THEN IF MUWfrsRemoved NE '' THEN Set_Property(@WINDOW:'.MU_WAFER_BUTTON','ENABLED',0) ;* Rejects, needs makeup wafers** was 1 jch END ELSE Set_Property(@WINDOW:'.MU_WAFER_BUTTON','ENABLED',0) ;* was 1 jch END END ELSE Set_Property(@WINDOW:'.MU_WAFER_BUTTON','ENABLED',0) ;* was 1 jch END END ELSE IF MUWfrsRemoved NE '' OR MUWfrsAdded NE '' THEN Set_Property(@WINDOW:'.MU_WAFER_BUTTON','ENABLED',0) ;* was 1 jch END ELSE Set_Property(@WINDOW:'.MU_WAFER_BUTTON','ENABLED',0) ;* No rejects, doesn't need makeup wafers END END END ELSE Set_Property(@WINDOW:'.MU_WAFER_BUTTON','VISIBLE',0) END BoxType = Get_Property(@WINDOW:'.BOX_TYPE','TEXT') IF BoxType = 'Merged Lots' THEN Set_Property(@WINDOW:'.MU_WAFERS_ADDED','ENABLED',1) Set_Property(@WINDOW:'.MU_ADDED_LABEL','ENABLED',1) END ELSE Set_Property(@WINDOW:'.MU_WAFERS_ADDED','ENABLED',0) Set_Property(@WINDOW:'.MU_ADDED_LABEL','ENABLED',0) END IF BoxType = 'Makeup Box' THEN Set_Property(@WINDOW:'.MU_WAFERS_REMOVED','ENABLED',1) Set_Property(@WINDOW:'.MU_REMOVED_LABEL','ENABLED',1) END ELSE Set_Property(@WINDOW:'.MU_WAFERS_REMOVED','ENABLED',0) Set_Property(@WINDOW:'.MU_REMOVED_LABEL','ENABLED',0) END IF (WafersIn NE WafersScheduled) OR (WafersVerify NE WafersScheduled) THEN *Ctrls = @WINDOW:'.WAFERS_IN':@RM: @WINDOW:'.WAFERS_SCHEDULED':@RM:@WINDOW:'.VERIFY_QTY' *Props = 'BACKCOLOR':@RM:'BACKCOLOR':@RM:'BACKCOLOR' *Vals = RED$:@RM:RED$:@RM:RED$ EnableQASignButton = 0 IF QASignReason = '' THEN QASignReason = 'Wafers In or Wafers Verified is not equal to Wafers Scheduled' END ELSE *Ctrls = @WINDOW:'.WAFERS_IN':@RM: @WINDOW:'.WAFERS_SCHEDULED':@RM:@WINDOW:'.VERIFY_QTY' *Props = 'BACKCOLOR':@RM:'BACKCOLOR':@RM:'BACKCOLOR' *Vals = GREEN$:@RM:GREEN$:@RM:GREEN$ END IF Get_Property(@WINDOW:'.HOT_LOT','CHECK') THEN Set_Property(@WINDOW:'.HOT_LOT_LABEL','VISIBLE',1) END ELSE Set_Property(@WINDOW:'.HOT_LOT_LABEL','VISIBLE',0) END IF Get_Property(@WINDOW:'.HGCV_TEST_CHECK','CHECK') THEN Set_Property(@WINDOW:'.HGCV_TEST','VISIBLE',1) END ELSE Set_Property(@WINDOW:'.HGCV_TEST','VISIBLE',0) END * * * * Pre Epi window IF @WINDOW = 'RDS_PRE_EPI' THEN VerifyQty = Get_Property(@WINDOW:'.VERIFY_QTY','INVALUE') IF VerifyQty NE WafersScheduled THEN Ctrls = @WINDOW:'.VERIFY_QTY' Props = 'BACKCOLOR' Vals = RED$ END ELSE Ctrls = @WINDOW:'.VERIFY_QTY' Props = 'BACKCOLOR' Vals = WHITE$ END Set_Property(Ctrls,Props,Vals) IF Get_Property(@WINDOW:'.HOLD_CHECKBOX','CHECK') THEN Set_Property(@WINDOW:'.HOLD_BUTTON','TEXT','Remove Hold') END ELSE Set_Property(@WINDOW:'.HOLD_BUTTON','TEXT','Place on Hold') END IF MemberOf(@USER4, 'OI_ADMIN') THEN Set_Property(@WINDOW:'.FIX_SIG_PROFILE','VISIBLE',1) END ELSE Set_Property(@WINDOW:'.FIX_SIG_PROFILE','VISIBLE',0) END END * * * * * Load / Wafer Inspection window IF @WINDOW = 'RDS' THEN PSNo = Get_Property(@WINDOW:'.PSN','TEXT') FirstWfrSig = Get_Property(@WINDOW:'.FW_SIG','DEFPROP') WinBackColor = Get_Property(@WINDOW,'BACKCOLOR') ;* default background color FirstOrLast = XLATE('PROD_SPEC',PSNo,PROD_SPEC_POST_FWI_LWI$,'X') IF FirstOrLast NE '' THEN IF FirstOrLast = 'FWI' THEN Set_Property(@WINDOW:'.GROUP_10','TEXT','FWI Surface Inspection Signature') Set_Property(@WINDOW:'.SURFACE_Q_BUTTON','TEXT','FWI Surface Inspection') END IF FirstOrLast = 'LWI' THEN Set_Property(@WINDOW:'.GROUP_10','TEXT','LWI Surface Inspection Signature') Set_Property(@WINDOW:'.SURFACE_Q_BUTTON','TEXT','LWI Surface Inspection') END IF FirstWfrSig = '' THEN Set_Property(@WINDOW:'.GROUP_10','BACKCOLOR',YELLOW$) END ELSE Set_Property(@WINDOW:'.GROUP_10','BACKCOLOR',WinBackColor) END END END * * * * * Unload Window IF @WINDOW = 'RDS_UNLOAD' THEN Reactor = Get_Property(@WINDOW:'.REACTOR','DEFPROP') ReactorType = XLATE('REACTOR',Reactor,1,'X') IF ReactorType = 'EPP' THEN *Set_Property(@WINDOW:'.NEW_NCR','VISIBLE',0) Set_Property(@WINDOW:'.NCR_MU_BUTTON','VISIBLE',0) END ELSE *Set_Property(@WINDOW:'.NEW_NCR','VISIBLE',1) Set_Property(@WINDOW:'.NCR_MU_BUTTON','VISIBLE',1) END CtrlName = @WINDOW:'.NCR_KEYS' NCRList = Get_Property(CtrlName,'LIST') FOR Line = 1 TO COUNT(NCRList,@FM) + (NCRList NE '') Status = NCRList BEGIN CASE CASE Status = '' Color = WHITE$ CASE Status = 'Closed' Color = GREEN$ CASE Status = 'Open' Color = RED$ EnableQASignButton = 0 IF QASignReason = '' THEN QASignReason = 'Open NCR' CASE Status = 'Verified' Color = YELLOW$ CASE 1 Color = WHITE$ END CASE stat = Send_Message(CtrlName,'COLOR_BY_POS',0,Line,Color) NEXT Line END **************************************************************************************************************************************** // RDS and RDS_POST_EPI If @WINDOW = 'RDS' or @WINDOW = 'RDS_POST_EPI' THEN CtrlName = @WINDOW:'.MET_TEST' MetList = Get_Property(CtrlName,'LIST') MLCnt = COUNT(MetList,@FM) + (MetList NE '') FOR Line = 1 TO MLCnt IF MetList NE '' THEN BEGIN CASE CASE MetList = '' Color = YELLOW$ *EnableUnloadButton = 0 CASE MetList < MetList OR MetList > MetList Color = RED$ *EnableUnloadButton = 0 CASE 1 Color = GREEN$ END CASE END ELSE Color = GREEN$ END;* End of check for Met Test on the current line stat = Send_Message(CtrlName,'COLOR_BY_POS',0,Line,Color) NEXT Line IF @WINDOW = 'RDS_POST_EPI' AND (Color = RED$ OR Color = YELLOW$) Then WOStep = Get_Property(@WINDOW:'.WO_NO','DEFPROP') QAResults = obj_WO_Mat_QA('QAResults',WONo:@RM:WOStep:@RM:CassNo) If QAResults NE '' THEN EnableQASignButton = 0 IF QASignReason = '' THEN QASignReason = QAResults END END END **************************************************************************************************************************************** // RDS_UNLOAD If @WINDOW EQ 'RDS_UNLOAD' then * If @USER4 EQ 'FRANCOIS_R' then CtrlName = @WINDOW:'.EDT_QA_MET' Set_Property(@Window : '.MET_TEST', 'VISIBLE', False$) Set_Property(CtrlName, 'VISIBLE', True$) MetList = Get_Property(CtrlName,'LIST') MLCnt = COUNT(MetList,@FM) + (MetList NE '') FOR Line = 1 TO MLCnt IF MetList NE '' THEN MetResult = MetList MetMin = MetList MetMax = MetList PhaseMin = MetList PhaseResult = MetList ScanRecipe = MetList PSN = Get_Property(@Window : '.PSN', 'TEXT') PRSStageKey = PSN:'*UNLOAD' MetTest = MetList PRSStageRec = Database_Services('ReadDataRow', 'PRS_STAGE', PRSStageKey) SpecTests = PRSStageRec SpecRecipe = '' Locate MetTest in SpecTests using @VM setting vPos then SpecRecipe = PRSStageRec end BEGIN CASE CASE MetList = '' Color = YELLOW$ *EnableUnloadButton = 0 CASE (MetResult LT MetMin) OR (MetResult GT MetMax) OR (PhaseResult LT PhaseMin) OR (ScanRecipe NE SpecRecipe) Color = RED$:@FM:'':@FM:BRED$:@FM:'' *EnableUnloadButton = 0 CASE 1 Color = GREEN$ END CASE END ELSE Color = GREEN$ END;* End of check for Met Test on the current line stat = Send_Message(CtrlName,'COLOR_BY_POS',0,Line,Color) NEXT Line Set_Property(@WINDOW:'.BUTTON_11','ENABLED',EnableUnloadButton) IF MemberOf(@USER4, 'OI_ADMIN') THEN Set_Property(@WINDOW:'.CLEAR_EPI_UNLOAD','VISIBLE',1) END ELSE Set_Property(@WINDOW:'.CLEAR_EPI_UNLOAD','VISIBLE',0) END * end else * * CtrlName = @WINDOW:'.MET_TEST' * MetList = Get_Property(CtrlName,'LIST') * * MLCnt = COUNT(MetList,@FM) + (MetList NE '') * FOR Line = 1 TO MLCnt * IF MetList NE '' THEN * BEGIN CASE * CASE MetList = '' * Color = YELLOW$ * *EnableUnloadButton = 0 * CASE MetList < MetList OR MetList > MetList * Color = RED$ * *EnableUnloadButton = 0 * CASE 1 * Color = GREEN$ * END CASE * * END ELSE * Color = GREEN$ * END;* End of check for Met Test on the current line * * stat = Send_Message(CtrlName,'COLOR_BY_POS',0,Line,Color) * NEXT Line * * Set_Property(@WINDOW:'.BUTTON_11','ENABLED',EnableUnloadButton) * * IF MemberOf(@USER4, 'OI_ADMIN') THEN * Set_Property(@WINDOW:'.CLEAR_EPI_UNLOAD','VISIBLE',1) * END ELSE * Set_Property(@WINDOW:'.CLEAR_EPI_UNLOAD','VISIBLE',0) * END * end end * End of check for Unload OR Post_Epi windows **************************************************************************************************************************************** IF @WINDOW = 'RDS_POST_EPI' THEN If CassSchedShip NE WafersOut then BackColor = RED$ end else BackColor = GREEN$ end Set_Property(@Window:'.CASS_SHIP_QTY','BACKCOLOR',BackColor) Set_Property(@Window:'.WAFERS_OUT','BACKCOLOR',BackColor) IF MemberOf(@USER4, 'OI_SUPERUSER') THEN Set_Property(@WINDOW:'.SAP_SIGN','VISIBLE',1) Set_Property(@WINDOW:'.SAP_REJECT','VISIBLE',1) END ELSE Set_Property(@WINDOW:'.SAP_SIGN','VISIBLE',0) Set_Property(@WINDOW:'.SAP_REJECT','VISIBLE',0) END 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) ************************************** * Refreshing Flat Finder Information * ************************************** EpiPartNo = Get_Property(@Window : '.EPI_PART_NO', 'TEXT') WaferSize = Xlate('EPI_PART', EpiPartNo, 'SUB_WAFER_SIZE', 'X') WaferSizeInch = Field(WaferSize, ' ', 3, 1) RDSNo = Get_Property(@Window : '.RDS_NO','DEFPROP') CustNo = Xlate('RDS', RDSNo, 'CUST_NO', 'X') // Get Bench Mark Values CompanyRow = Xlate('COMPANY', CustNo, '', 'X') WaferFlatSizeInches = CompanyRow WaferFlatLengthMins = Oconv(CompanyRow, 'MD1') WaferFlatLengthMaxes = Oconv(CompanyRow, 'MD1') Locate 6 in WaferFlatSizeInches using @VM setting vPos then WaferFlatLengthMin = WaferFlatLengthMins<0, vPos> WaferFlatLengthMax = WaferFlatLengthMaxes<0, vPos> end else WaferFlatLengthMin = '' WaferFlatLengthMax = '' end WafersOut = Get_Property(@WINDOW:'.WAFERS_OUT','TEXT') // Get FlatFinder Read Value FlatFinderWafersQty = Get_Property(@WINDOW:'.FLAT_FINDER_WAFER_QTY','DEFPROP') FlatFinderWaferLength = Get_Property(@WINDOW:'.FLAT_FINDER_FLAT_LENGTH','DEFPROP') If (WaferSizeInch EQ 6) then *************************************** * FlatFinder - Wafers Quatity Section * *************************************** If (FlatFinderWafersQty NE '') then If (FlatFinderWafersQty = WafersOut) then QtyBackColor = GREEN$ end else QtyBackColor = RED$ * EnableQASignButton = 0 end end else QtyBackColor = ORANGE$ * EnableQASignButton = 0 end ************************************ * FlatFinder - Flat Length Section * ************************************ If (WaferFlatLengthMin NE '') AND (WaferFlatLengthMax NE '') then If (FlatFinderWaferLength NE '') then If (FlatFinderWaferLength GE WaferFlatLengthMin) AND (FlatFinderWaferLength LE WaferFlatLengthMax) then LengthBackColor = GREEN$ end else LengthBackColor = RED$ * EnableQASignButton = 0 end end else LengthBackColor = ORANGE$ * EnableQASignButton = 0 end end else LengthBackColor = GREY$ end end else QtyBackColor = GREY$ LengthBackColor = GREY$ end Set_Property(@WINDOW:'.FLAT_FINDER_WAFER_QTY','BACKCOLOR', QtyBackColor) Set_Property(@WINDOW:'.FLAT_FINDER_FLAT_LENGTH','BACKCOLOR', LengthBackColor) end * * * * * Layer Set edit table control in Load and Post Epi windows IF @WINDOW = 'RDS' OR @WINDOW = 'RDS_POST_EPI' THEN IF Get_Property(@WINDOW:'.INV_FAB_COMP','CHECK') = 1 THEN Set_Property(@WINDOW:'.INV_FAB_HRS','BACKCOLOR',GREEN$) END ELSE Set_Property(@WINDOW:'.INV_FAB_HRS','BACKCOLOR',YELLOW$) END CtrlID = @WINDOW:'.RDS_LS_ID' LayerList = Get_Property(CtrlID,'LIST') FOR I = 1 TO COUNT(LayerList,@FM) + (LayerList NE '') * Layer Set Parameters IF ICONV(LayerList,'B') = 1 THEN ParmColor = RED$ END ELSE IF ICONV(LayerList,'B') = 0 THEN ParmColor = YELLOW$ EnableQASignButton = 0 IF QASignReason = '' THEN QASignReason ='Recipe Parameters incomplete' END ELSE ParmColor = GREEN$ END END FOR Col = COL$LSID TO COL$PARMS_OUT stat = Send_Message(CtrlID,'COLOR_BY_POS',Col,I,ParmColor) NEXT Col * ASM Metrology IF LayerList NE '' THEN MetNo = LayerList MetRec = XLATE('RDS_TEST',MetNo,'','X') TWSigned = obj_RDS_Test('TWSignedOff',MetNo:@RM:MetRec) TestComp = obj_RDS_Test('TestComplete',MetNo:@RM:MetRec) OutOfSpec = obj_RDS_Test('OutOfSpec',MetNo:@RM:MetRec) IF NOT(obj_RDS_Test('TWSignedOff',MetNo:@RM:MetRec)) THEN MetColor = ORANGE$ EnableLoadButton = 0 END IF NOT(obj_RDS_Test('TestComplete',MetNo:@RM:MetRec)) THEN MetColor = ORANGE$ EnableQASignButton = 0 IF QASignReason = '' THEN QASignReason = 'Metrology not signed off for Met No: ':MetNo END ELSE IF obj_RDS_Test('OutOfSpec',MetNo:@RM:MetRec) = 1 THEN MetColor = RED$ EnableQASignButton = 0 IF QASignReason = '' THEN QASignReason = 'Metrology ':MetNo:' is out of spec' END ELSE IF LayerList = '' AND LayerList = '' AND LayerList NE '' THEN MetColor = YELLOW$ EnableQASignButton = 0 IF QASignReason = '' THEN QASignReason = 'Metrology incomplete' END ELSE MetColor = GREEN$ END END END END FOR Col = COL$MET_NO TO COL$RRHO_AVG stat = Send_Message(CtrlID,'COLOR_BY_POS',Col,I,MetColor) NEXT Col * Zone 1 EpiPRO Metrology IF LayerList NE '' THEN MetNo = LayerList MetRec = XLATE('RDS_TEST',MetNo,'','X') TWSigned = obj_RDS_Test('TWSignedOff',MetNo:@RM:MetRec) TestComp = obj_RDS_Test('TestComplete',MetNo:@RM:MetRec) OutOfSpec = obj_RDS_Test('OutOfSpec',MetNo:@RM:MetRec) IF NOT(obj_RDS_Test('TWSignedOff',MetNo:@RM:MetRec)) THEN MetColorZ1 = ORANGE$ EnableLoadButton = 0 END IF NOT(obj_RDS_Test('TestComplete',MetNo:@RM:MetRec)) THEN MetColorZ1 = ORANGE$ EnableQASignButton = 0 IF QASignReason = '' THEN QASignReason ='Zone 1 Metrology is Incomplete' END ELSE IF obj_RDS_Test('OutOfSpec',MetNo:@RM:MetRec) = 1 THEN MetColorZ1 = RED$ EnableQASignButton = 0 IF QASignReason = '' THEN QASignReason ='Zone 1 Metrology is Out of Spec' END ELSE IF LayerList = '' AND LayerList = '' AND LayerList NE '' THEN MetColorZ1 = YELLOW$ EnableQASignButton = 0 IF QASignReason = '' THEN QASignReason = 'Zone 1 Metrology is Incomplete' END ELSE MetColorZ1 = PRE_BLUE$ END END END END FOR Col = COL$MET_NO_Z1 TO COL$RRHO_AVG_Z1 stat = Send_Message(CtrlID,'COLOR_BY_POS',Col,I,MetColorZ1) NEXT Col * Zone 2 EpiPRO Metrology IF LayerList NE '' THEN MetNo = LayerList MetRec = XLATE('RDS_TEST',MetNo,'','X') TWSigned = obj_RDS_Test('TWSignedOff',MetNo:@RM:MetRec) TestComp = obj_RDS_Test('TestComplete',MetNo:@RM:MetRec) OutOfSpec = obj_RDS_Test('OutOfSpec',MetNo:@RM:MetRec) IF NOT(obj_RDS_Test('TWSignedOff',MetNo:@RM:MetRec)) THEN MetColorZ2 = ORANGE$ EnableLoadButton = 0 END IF NOT(obj_RDS_Test('TestComplete',MetNo:@RM:MetRec)) THEN MetColorZ2 = ORANGE$ EnableQASignButton = 0 IF QASignReason = '' THEN QASignReason = 'Zone 2 Metrology is Incomplete' END ELSE IF obj_RDS_Test('OutOfSpec',MetNo:@RM:MetRec) = 1 THEN MetColorZ2 = RED$ EnableQASignButton = 0 IF QASignReason = '' THEN QASignReason = 'Zone 2 Metrology is Out of Spec' END ELSE IF LayerList = '' AND LayerList = '' AND LayerList NE '' THEN MetColorZ2 = YELLOW$ EnableQASignButton = 0 IF QASignReason = '' THEN QASignReason = 'Zone 2 Metrology is Incomplete' END ELSE MetColorZ2 = INP_BLUE$ END END END END FOR Col = COL$MET_NO_Z2 TO COL$RRHO_AVG_Z2 stat = Send_Message(CtrlID,'COLOR_BY_POS',Col,I,MetColorZ2) NEXT Col NEXT I LoadLockVal = Get_Property(@WINDOW:'.LOAD_LOCK_SIDE_HIDDEN','TEXT') IF LoadLockVal = '' THEN CurrSaveWarn = Get_Property(@WINDOW,'SAVEWARN') Set_Property(@WINDOW:'.LOAD_LOCK_SIDE','DEFPROP','') IF NOT(CurrSaveWarn) THEN Set_Property(@WINDOW,'SAVEWARN',0) END END Reactor = Get_Property(@WINDOW:'.REACTOR','DEFPROP') ;* Changed to PickPlaceFlag on 12/6/2011 JCH PickPlaceFlag = XLATE('REACTOR',Reactor,REACTOR_PICK_PLACE$,'X') IF PickPlaceFlag THEN Set_Property(@WINDOW:'.ASM_LOAD_LOCK','ENABLED',1) END ELSE Set_Property(@WINDOW:'.ASM_LOAD_LOCK','ENABLED',0) END WafersIn = Get_Property(@WINDOW:'.WAFERS_IN','DEFPROP') IF WafersIn = '' THEN Set_Property(@WINDOW:'.BUTTON_11','ENABLED',0) ;* Load button disabled END ELSE IF EnableLoadButton = 1 OR MemberOf(@USER4, 'OI_ADMIN') THEN Set_Property(@WINDOW:'.BUTTON_11','ENABLED',1) ;* Load button Added flag on 11/14/2007 JCH END END END * Clean Inspection table CtrlName = '' IF @WINDOW = 'RDS_PRE_EPI' THEN CtrlName = @WINDOW:'.PRE_CI_ACTION' IF @WINDOW = 'RDS' THEN CtrlName = @WINDOW:'.FWI_CI_ACTION' IF @WINDOW = 'RDS_UNLOAD' THEN CtrlName = @WINDOW:'.LWI_CI_ACTION' IF @WINDOW = 'RDS_POST_EPI' THEN CtrlName = @WINDOW:'.POST_CI_ACTION' IF CtrlName NE '' THEN CIList = Get_Property(CtrlName,'LIST') CICnt = COUNT(CIList,@FM) + (CIList NE '') FOR Line = 1 TO CICnt IF CIList NE '' THEN BEGIN CASE CASE CIList = '' Color = YELLOW$ EnableUnloadButton = 0 ;* 1/9/2013 JCH EnableQASignButton = 0 IF QASignReason = '' THEN QASignReason = 'Clean Inspection Steps Required' CASE CIList NE '' AND CIList = '' Color = RED$ EnableUnloadButton = 0 EnableQASignButton = 0 IF QASignReason = '' THEN QASignReason = 'Clean Inspection Steps not Signed' CASE 1 Color = GREEN$ END CASE END ELSE Color = GREEN$ END;* End of check for Clean Insp complete on the current line stat = Send_Message(CtrlName,'COLOR_BY_POS',0,Line,Color) IF QASignReason = '' THEN Set_Property(@WINDOW:'.STATUS_LINE','TEXT','') END ELSE Set_Property(@WINDOW:'.STATUS_LINE','TEXT',QASignReason) END NEXT Line END ;* End of check for CtrlName IF @WINDOW = 'RDS_POST_EPI' THEN /* * * * * Existing Checks for ADE ;* Dead on 8 Jan 2013 JCH Ctrls = @WINDOW:'.ADE_READ':@RM:@WINDOW:'.THICK_MIN':@RM:@WINDOW:'.THICK_MAX' Props = 'DEFPROP':@RM:'DEFPROP':@RM:'DEFPROP' Vals = Get_Property(Ctrls,Props) ADERead = Vals[1,@RM] ThickMin = Vals[COL2()+1,@RM] ThickMax = Vals[COL2()+1,@RM] IF ADERead = '' THEN Set_Property(@WINDOW:'.ADE_READ','BACKCOLOR',WHITE$) END ELSE IF ADERead < ThickMin OR ADERead > ThickMax THEN Set_Property(@WINDOW:'.ADE_READ','BACKCOLOR',RED$) END ELSE Set_Property(@WINDOW:'.ADE_READ','BACKCOLOR',GREEN$) END END * * * * * End of existing ADE Check */ NCRList = Get_Property(@WINDOW:'.NCR_KEYS','LIST') FOR Line = 1 TO COUNT(NCRList,@FM) + (NCRList NE '') Status = NCRList IF Status NE '' AND Status NE 'Closed' THEN EnableQASignButton = 0 QASignReason = 'Open NCR' END NEXT Line IF UseMUWafers THEN IF (WafersOut NE '' AND WafersScheduled NE '') THEN // A full box is now defined by have equal to or more wafers required. This allows certain customer's parts // to have a box with less that 25 wafers be allowed to ship. - 08/04/2017 * IF WafersOut NE FullBoxQty AND NOT(MakeupBox) THEN IF WafersOut LT MinCassShipQty AND NOT(MakeupBox) THEN EnableQASignButton = 0 QASignReason = 'Wafer Out is not equal to Specified Full Box Quantity' END END END ** Added 11/1/2013 JCH... another AFUD RotrAction = Get_Property(@WINDOW:'.ROTR_ACTION','TEXT') IF RotrAction[1,1] = 'F' Then EnableQASignButton = 0 QASignReason = 'Failed ROTR test' /* PostCIArray = Get_Property(@WINDOW:'.POST_CI_ACTION','ARRAY') LOCATE 'SurfScan' IN PostCIArray USING @VM SETTING Pos THEN IF PostCIArray = '' THEN EnableQASignButton = 0 QASignReason = 'SurfScan not signed after ROTR test failed' END END ELSE EnableQASignButton = 0 QASignReason = 'SurfScan not performed after ROTR test failed' End */ END *IF @USER4 = 'DAVID_KL' THEN EnableQASignButton = 1 If MemberOf(@USER4, 'OI_ADMIN') then EnableQASignButton = 1 end Set_Property(@WINDOW:'.SIGN_BUTTON','ENABLED',EnableQASignButton) IF QASignReason = '' THEN Set_Property(@WINDOW:'.STATUS_LINE','TEXT','') Set_Property(@WINDOW:'.STATUS_LINE','BACKCOLOR',LTGREY$) END ELSE Set_Property(@WINDOW:'.STATUS_LINE','TEXT',QASignReason) Set_Property(@WINDOW:'.STATUS_LINE','BACKCOLOR',YELLOW$) END END IF @WINDOW = 'RDS' OR @WINDOW = 'RDS_UNLOAD' THEN Reactor = Get_Property(@WINDOW:'.REACTOR','DEFPROP') ReactorType = XLATE('REACTOR',Reactor,1,'X') IF ReactorType = 'EPP' THEN Set_Property(@WINDOW:'.LOAD_EPI_PRO','VISIBLE',1) Set_Property(@WINDOW:'.UNLOAD_EPI_PRO','VISIBLE',1) Set_Property(@WINDOW:'.POCKET','VISIBLE',1) Set_Property(@WINDOW:'.MOVE_MET','VISIBLE',1) Set_Property(@WINDOW:'.ADD_ZONE','VISIBLE',1) END ELSE Set_Property(@WINDOW:'.LOAD_EPI_PRO','VISIBLE',0) Set_Property(@WINDOW:'.UNLOAD_EPI_PRO','VISIBLE',0) Set_Property(@WINDOW:'.POCKET','VISIBLE',0) Set_Property(@WINDOW:'.MOVE_MET','VISIBLE',0) Set_Property(@WINDOW:'.ADD_ZONE','VISIBLE',0) END END RETURN * * * * * * * GotFocus: * * * * * * * RETURN * * * * * * * MUWafers: * * * * * * * RDSNo = Get_Property(@WINDOW,'ID') IF RDSNo = '' THEN RETURN IF Get_Property(@WINDOW,'SAVEWARN') THEN Send_Event(@WINDOW,'WRITE') END obj_AppWindow('ViewRelated','RDS_MAKEUP':@RM:RDSNo) RETURN * * * * * * * ProdWfrLF: * * * * * * * RETURN * * * * * * * Update: * * * * * * * RDSNo = Get_Property(@WINDOW:'.RDS_NO','TEXT') IF RDSNo NE '' THEN Send_Event(@WINDOW,'WRITE') Set_Property(@WINDOW:'.RDS_NO','TEXT',RDSNo) Send_Event(@WINDOW,'READ') END RETURN * * * * * * * WafersInLF: * * * * * * * WafersIn = Get_Property(@WINDOW:'.WAFERS_IN','TEXT') RDSNo = Get_Property(@WINDOW,'ID') IF WafersIn = '' THEN RETURN ScheduledWafers = XLATE('RDS',RDSNo,'WAFERS_SCHEDULED','X') IF WafersIn NE ScheduledWafers THEN UserInput = Msg(@window, '','WAFERS_IN_VERIFY') IF UserInput = CHAR(27) THEN Set_Property(@WINDOW:'.WAFERS_IN','TEXT','') Set_Property(@WINDOW:'.WAFERS_IN','FOCUS',1) END END GOSUB Refresh RETURN * * * * * * * FirstRead: * * * * * * * * Hooked from RDS (first wafer) screen * * * * * * * FirstRefresh: * * * * * * * OverGrowRequired = Get_Property(@WINDOW:'.OVERGROW_REQ','CHECK') IF OverGrowRequired THEN Set_Property(@WINDOW:'.THICK_OVR_GROWTH_AVG','VISIBLE',1) Set_Property(@WINDOW:'.THICK_OVER_LABEL','VISIBLE',1) END ELSE Set_Property(@WINDOW:'.THICK_OVR_GROWTH_AVG','VISIBLE',0) Set_Property(@WINDOW:'.THICK_OVER_LABEL','VISIBLE',0) END GOSUB Refresh RETURN * * * * * * * SupVerSigLF: * * * * * * * RDSNo = Get_Property(@WINDOW,'ID') SupVerSig = Get_Property(@WINDOW:'.POST_EPI_SUP_SIG','TEXT') PostEpiSig = Get_Property(@WINDOW:'.POST_EPI_SIG','TEXT') IF SupVerSig = PostEpiSig THEN ErrorMesg = 'User ':QUOTE(PostEpiSig):' has signed this RDS as Operator Out.':CRLF$:CRLF$ ErrorMesg := 'Another qualified user must sign verification' Set_Property(@WINDOW:'.POST_EPI_SUP_SIG','TEXT','') END RETURN * * * * * * * NewNCR: * * * * * * * RDSNo = Get_Property(@WINDOW:'.RDS_NO','TEXT') Reactor = Get_Property(@WINDOW:'.REACTOR','TEXT') WOStepKey = XLATE('RDS',RDSNo,RDS_WO_STEP_KEY$,'X') WONo = WOStepKey[1,'*'] WOStep = WOStepKey[COL2()+1,'*'] CassNo = XLATE('RDS',RDSNo,'RUN_ORDER_NUM','X') IF 1 = 1 THEN ;* This was a test for non-test users ************* This is the production code ******************** NewNCRNo = obj_NCR('Create',WONo:@RM:WOStep:@RM:CassNo:@RM:RDSNo:@RM:Reactor) IF Get_Status(errCode) THEN ErrMsg(errCode) RETURN END CtrlEntID = @WINDOW:'.NCR_KEYS' NCRNos = Get_Property(CtrlEntID,'ARRAY')<1> SWAP @VM:@VM WITH '' IN NCRNos IF NCRNos[-1,1] = @VM THEN NCRNos[-1,1] = '' LastNCRNo = COUNT(NCRNos,@VM) + (NCRNos NE '') Send_Event(@WINDOW,'WRITE') DetWindow = 'NCR' DetKeys = NewNCRNo DefaultRec = '' RetKey = RDSNo RetWin = @WINDOW RetPage = 1 RetCtrl = CtrlEntID RetPos = 1:@FM:LastNCRNo + 1 obj_Appwindow('ViewNewDetail',DetWindow:@RM:DetKeys:@RM:DefaultRec:@RM:RetKey:@RM:RetPage:@RM:RetCtrl:@RM:RetPos) END ELSE ************* This is the test code ******************** CtrlEntID = @WINDOW:'.NCR_KEYS' NCRNos = Get_Property(CtrlEntID,'ARRAY')<1> SWAP @VM:@VM WITH '' IN NCRNos IF NCRNos[-1,1] = @VM THEN NCRNos[-1,1] = '' LastNCRNo = COUNT(NCRNos,@VM) + (NCRNos NE '') Send_Event(@WINDOW,'WRITE') CreateParms = WONo:@FM CreateParms := CassNo:@FM CreateParms := RDSNo:@FM CreateParms := Reactor:@FM CreateParms := WOStep:@FM CreateParms := '1':@FM ;* Return Page CreateParms := '.NCR_KEYS':@FM ;* Return Ctrl CreateParms := '1,1' thisFormWindowUp = Get_Property('WO_MAT_WFR','VISIBLE') ;* Returns 0 = hidden, 1 = visible, 2 = minimized, 3 = maximized IF thisFormWindowUp = '' THEN Start_Window('WO_MAT_WFR',@WINDOW,CreateParms) END ELSE IF thisFormWindowUp = 2 THEN Set_Property('WO_MAT_WFR','VISIBLE',9) ;* Restore the window if minimized IF Get_Property('WO_MAT_WFR','SAVEWARN') THEN Set_Property('WO_MAT_WFR','@SKIP_CARD_RETURN',1) ;* This stops the Return behavior Send_Event('WO_MAT_WFR','CLEAR') ;* Clear anything existing (prompts for save first) END * Load Key Controls with Key Parts Ctrls = 'WO_MAT_WFR':@RM ; Props = '@RETURN_KEY':@RM ; Vals = RDSNo:@RM Ctrls := 'WO_MAT_WFR':@RM ; Props := '@RETURN_PAGE':@RM ; Vals := '':@RM Ctrls := 'WO_MAT_WFR':@RM ; Props := '@RETURN_CONTROL':@RM ; Vals := 'RDS_UNLOAD.NCR_KEYS':@RM Ctrls := 'WO_MAT_WFR':@RM ; Props := '@RETURN_POS':@RM ; Vals := 1:@FM:1:@RM Ctrls := 'WO_MAT_WFR.WO_NO':@RM ; Props := 'DEFPROP':@RM ; Vals := WONo:@RM Ctrls := 'WO_MAT_WFR.CASS_NO':@RM ; Props := 'DEFPROP':@RM ; Vals := CassNo:@RM Ctrls := 'WO_MAT_WFR.RDS_NO':@RM ; Props := 'DEFPROP':@RM ; Vals := RDSNo:@RM Ctrls := 'WO_MAT_WFR.REACTOR':@RM ; Props := 'DEFPROP':@RM ; Vals := Reactor:@RM Ctrls := 'WO_MAT_WFR.WO_STEP_NO' ; Props := 'DEFPROP' ; Vals := WOStep Set_Property(Ctrls,Props,Vals) Send_Event('WO_MAT_WFR.CASS_NO','LOSTFOCUS') END END ;* End of section with new test code RETURN * * * * * * * NCRKeysDC: * * * * * * * RDSNo = Get_Property(@WINDOW:'.RDS_NO','TEXT') CtrlEntID = @WINDOW:'.NCR_KEYS' CurrPos = Get_Property(CtrlEntID,'SELPOS') CurrCol = CurrPos<1> CurrRow = CurrPos<2> NCRKey = Get_Property(CtrlEntID,'CELLPOS',1:@FM:CurrRow) IF NCRKey = '' THEN RETURN Send_Event(@WINDOW,'WRITE') DetWindow = 'NCR' DetKeys = NCRKey DefaultRec = '' RetKey = RDSNo RetWin = @WINDOW RetPage = 1 RetCtrl = CtrlEntID RetPos = CurrPos obj_Appwindow('ViewNewDetail',DetWindow:@RM:DetKeys:@RM:DefaultRec:@RM:RetKey:@RM:RetPage:@RM:RetCtrl:@RM:RetPos) RETURN * * * * * * * PrintLabels: * * * * * * * RDSNo = Get_Property(@WINDOW,'ID') IF RDSNo = '' THEN RETURN IF Security_Check( 'RDS', Print$ ) ELSE Security_Err_Msg( 'RDS', Print$ ) RETURN END Send_Event(@WINDOW,'WRITE') WOStepKey = XLATE('RDS',RDSNo,RDS_WO_STEP_KEY$,'X') WONo = WOStepKey[1,'*'] WOStep = WOStepKey[-1,'*'] WOSteps = XLATE('WO_LOG',WONo,WO_LOG_WO_STEP_KEY$,'X') IF INDEX(WOSteps,@VM,1) THEN MultiStepFlag = 1 END ELSE MultiStepFlag = 0 END IF WOStep > 1 THEN RDSNos = obj_WO_Step('AdjStepRDSQtys', WOStep:@RM:WOSteps) ;* Returns RDSNos for nth step that have completed step n-1 IF Get_Status(errCode) THEN ErrMsg(errCode) IF RDSNos = '' THEN ErrMsg('No cassettes have completed Step ':WOStep - 1) GOTO SkipIt END END ELSE RetVal = Msg(@WINDOW,'','SELECT_CASS_LABEL') IF RetVal = 1 THEN RDSNos = RDSNo END ELSE RDSNos = XLATE('WO_STEP',WOSteps<1,1>,WO_STEP_RDS_KEY$,'X') END END IF Get_Status(errCode) THEN ErrMsg(errCode) RETURN END IF INDEX(RDSNos,@VM,1) THEN TypeOver = '' TypeOver = RDSNos TypeOver = 2 TypeOver = 'K' RDSKeys = Popup(@WINDOW,TypeOver,'WO_LOG_RTS') END ELSE RDSKeys = RDSNos END IF RDSKeys = '' THEN RETURN CONVERT @VM TO @FM IN RDSKeys Def = "" Def = "Printing Cassette Labels..." Def = "U" MsgUp = Msg(@window, Def) Print_Cass_Labels(RDSKeys,MultiStepFlag) ;* Updated labels with Akrion Bar Codes Msg(@window, MsgUp) * * * * SkipIt: * * * * Set_Property(@WINDOW:'.RDS_NO','TEXT',RDSNo) Send_Event(@WINDOW,'READ') RETURN * * * * * * * ViewAudit: * * * * * * * RDSNo = Get_Property(@WINDOW:'.RDS_NO','DEFPROP') IF RDSNo = '' THEN RETURN *AuditData = obj_RDS_Audit('Display',RDSNo:@RM:@WINDOW) ;* Returns all audit columns for this window AuditData = obj_RDS_Audit('Display',RDSNo:@RM:'') ;* Returns all audit columns DispText = AuditData[1,@RM] UserNames = AuditData[COL2()+1,@RM] LastDTMS = AuditData[COL2()+1,@RM] Windows = AuditData[COL2()+1,@RM] PopupDisplay = '' FOR I = 1 TO COUNT(DispText,@FM) + (DispText NE '') PopupDisplay<1,I> = DispText:@TM:OCONV(UserNames,'[XLATE_CONV,LSL_USERS*FIRST_LAST]' ):@TM:LastDTMs:@TM:Windows NEXT I OverRide = '' OverRide = PopupDisplay PopUp(@WINDOW, OverRide, 'RDS_MOD_HIST_VIEW' ) RETURN * * * * * * * LSIdDC: * * * * * * * CtrlEntID = @WINDOW:'.RDS_LS_ID' RDSNo = Get_Property(@WINDOW,'ID') ReactNo = Get_Property(@WINDOW:'.REACTOR','DEFPROP') IF Get_Property(@WINDOW,'SAVEWARN') THEN Set_Property(@WINDOW,'@SKIP_SAVEWARN',0) END ELSE Set_Property(@WINDOW,'@SKIP_SAVEWARN',1) END CurrPos = Get_Property(CtrlEntID,'SELPOS') CurrCol = CurrPos<1> CurrRow = CurrPos<2> IF CurrCol LT COL$MET_NO THEN LSId = Get_Property(CtrlEntID,'CELLPOS',COL$LSID:@FM:CurrRow) IF RDSNo NE '' AND LSId NE '' THEN /*IF ReactNo = '' THEN ErrMsg('':@VM:'Process Error':@SVM:'Reactor No. is required prior to recording test results.') RETURN 0 END */ Send_Event(@WINDOW,'WRITE') RdsLSID = RDSNo:'*':LSId DetWindow = 'RDS_LAYER' DetKeys = RdsLSID DefaultRec = '' RetKey = RDSNo RetWin = @WINDOW RetPage = 1 RetCtrl = CtrlEntID RetPos = CurrPos obj_Appwindow('ViewNewDetail',DetWindow:@RM:DetKeys:@RM:DefaultRec:@RM:RetKey:@RM:RetPage:@RM:RetCtrl:@RM:RetPos) END END IF CurrCol = COL$MET_NO OR CurrCol = COL$MET_NO_Z1 OR CurrCol = COL$MET_NO_Z2 THEN MetNo = Get_Property(CtrlEntID,'CELLPOS',CurrCol:@FM:CurrRow) /*IF ReactNo = '' THEN ErrMsg('':@VM:'Process Error':@SVM:'Reactor No. is required prior to recording test results.') RETURN 0 END */ IF MetNo NE '' THEN Send_Event(@WINDOW,'WRITE') Send_Event(@WINDOW,'CLEAR') ; // 12/21/2017 - DMB - Although WRITE normally clears the form, QBF mode will prevent the clear so do this explicitly so the lock is removed from the RDS record. DetWindow = 'RDS_TEST' DetKeys = MetNo DefaultRec = '' RetKey = RDSNo RetWin = 'RDS' RetPage = 1 RetCtrl = CtrlEntID RetPos = CurrPos obj_Appwindow('ViewNewDetail',DetWindow:@RM:DetKeys:@RM:DefaultRec:@RM:RetKey:@RM:RetPage:@RM:RetCtrl:@RM:RetPos) END END RETURN * * * * * * * LoadEpiPro: * * * * * * * RDSNo = Get_Property(@WINDOW:'.RDS_NO','DEFPROP') CurrentLoad = Get_Property(@WINDOW:'.POCKET','DEFPROP') IF RDSNo = '' THEN RETURN OutCassettes = CurrentLoad CONVERT @VM TO '' IN OutCassettes IF OutCassettes NE '' THEN ErrMsg('Wafers have already been unloaded from the reactor.') RETURN END /* IF Security_Check( 'RDS', Print$ ) ELSE Security_Err_Msg( 'RDS', Print$ ) RETURN END */ Reactor = Get_Property(@WINDOW:'.REACTOR','TEXT') ReactorType = XLATE('REACTOR',Reactor,1,'X') IF ReactorType NE 'EPP' THEN ErrMsg('Reactor ':Reactor:' is not an EpiPro tool.') RETURN END Send_Event(@WINDOW,'WRITE') MatlLoadInfo = Create_Dialog('DIALOG_LOAD_EPI_PRO', @WINDOW, 0, RDSNo:@FM:CurrentLoad) RETURN * * * * * * * UnloadEpiPro: * * * * * * * RDSNo = Get_Property(@WINDOW:'.RDS_NO','DEFPROP') CurrentLoad = Get_Property(@WINDOW:'.POCKET','DEFPROP') IF RDSNo = '' THEN RETURN /* IF Security_Check( 'RDS', Print$ ) ELSE Security_Err_Msg( 'RDS', Print$ ) RETURN END */ Reactor = Get_Property(@WINDOW:'.REACTOR','TEXT') ReactorType = XLATE('REACTOR',Reactor,1,'X') IF ReactorType NE 'EPP' THEN ErrMsg('Reactor ':Reactor:' is not an EpiPro tool.') RETURN END ProdLoadCnt = 0 ProdUnloadCnt = 0 FOR I = 1 TO COUNT(CurrentLoad<1>,@VM) + (CurrentLoad<1> NE '') Usage = CurrentLoad WfrType = CurrentLoad OutCass = CurrentLoad IF WfrType = 'PROD' AND Usage = '' AND OutCass = '' THEN ProdLoadCnt += 1 ;* Product wafers to be unloaded END IF OutCass NE '' THEN ProdUnloadCnt += 1 END NEXT I IF ProdLoadCnt = 0 AND ProdUnloadCnt = 0 THEN ErrMsg('No production wafers loaded in reactor.') ;* Not yet loaded RETURN END Send_Event(@WINDOW,'WRITE') MatlUnloadInfo = Create_Dialog('DIALOG_UNLOAD_EPI_PRO', @WINDOW, 0, RDSNo:@FM:CurrentLoad) RETURN * * * * * * * * ClearEpiUnload: * * * * * * * * RDSNo = Get_Property(@WINDOW:'.RDS_NO','DEFPROP') CurrentLoad = Get_Property(@WINDOW:'.POCKET','DEFPROP') IF RDSNo = '' THEN RETURN Reactor = Get_Property(@WINDOW:'.REACTOR','TEXT') ReactorType = XLATE('REACTOR',Reactor,1,'X') IF ReactorType NE 'EPP' THEN ErrMsg('Reactor ':Reactor:' is not an EpiPro tool.') RETURN END ProdLoadCnt = 0 ProdUnloadCnt = 0 FOR I = 1 TO COUNT(CurrentLoad<1>,@VM) + (CurrentLoad<1> NE '') Usage = CurrentLoad WfrType = CurrentLoad OutCass = CurrentLoad IF WfrType = 'PROD' AND Usage = '' AND OutCass = '' THEN ProdLoadCnt += 1 ;* Product wafers to be unloaded END IF OutCass NE '' THEN ProdUnloadCnt += 1 END NEXT I IF ProdLoadCnt = 0 AND ProdUnloadCnt = 0 THEN ErrMsg('No production wafers loaded in reactor.') ;* Not yet loaded RETURN END Send_Event(@WINDOW,'WRITE') Set_Status(0) obj_RDS('ClearEpiUnload',RDSNo) ; // Note: This routine does not exist in OBJ_RDS IF Get_Status(errCode) THEN ErrMsg(errCode) END Set_Property(@WINDOW:'.RDS_NO','DEFPROP',RDSNo) Send_Event(@WINDOW,'READ') RETURN * * * * * * * AddZoneMet: * * * * * * * CtrlEntID = @WINDOW:'.RDS_LS_ID' RDSNo = Get_Property(@WINDOW,'ID') PSNo = Get_Property(@WINDOW:'.PSN','DEFPROP') LSArray = Get_Property(CtrlEntID,'DEFPROP') LSIDs = LSArray MetNos = LSArray MetNosZ1 = LSArray MetNosZ2 = LSArray MetTest = MetNos Z1Test = MetNosZ1 Z2Test = MetNosZ2 CONVERT @VM TO '' IN MetTest CONVERT @VM TO '' IN Z1Test CONVERT @VM TO '' IN Z2Test IF MetTest = '' THEN BEGIN CASE CASE Z1Test = '' AND Z2Test = '' * Ask for z1 or z2 TypeOver = '' TypeOver = 'B&1,&2,&Cancel' TypeOver = 'Add Reactor Zone Metrology' TypeOver = '?' TypeOver = '3' TypeOver = 'Add Metrology for Zone:' NewZone = Msg(@WINDOW,TypeOver,'') IF NewZone = 3 THEN RETURN CASE Z1Test = '' AND Z2Test NE '' NewZone = 1 CASE Z1Test NE '' AND Z2Test = '' NewZone = 2 CASE 1 ErrMsg('No open Zone to move to.') RETURN END CASE Send_Event(@WINDOW,'WRITE') FOR I = 1 TO COUNT(LSIDs,@VM) + (LSIDs NE '') IF LSIDs<1,I> NE '' THEN LSID = LSIDs<1,I> oRTParms = RDSNo:@RM oRTParms := LSID:@RM oRTParms := PSNo:@RM oRTParms := NewZone obj_RDS_Test('Create',oRTPARms) END NEXT I Set_Property(@WINDOW:'.RDS_NO','DEFPROP',RDSNo) Send_Event(@WINDOW,'READ') END RETURN * * * * * * * MoveMetToZone: * * * * * * * CtrlEntID = @WINDOW:'.RDS_LS_ID' RDSNo = Get_Property(@WINDOW,'ID') LSArray = Get_Property(CtrlEntID,'DEFPROP') MetNos = LSArray MetNosZ1 = LSArray MetNosZ2 = LSArray MetTest = MetNos Z1Test = MetNosZ1 Z2Test = MetNosZ2 CONVERT @VM TO '' IN MetTest CONVERT @VM TO '' IN Z1Test CONVERT @VM TO '' IN Z2Test IF MetTest NE '' THEN BEGIN CASE CASE Z1Test = '' AND Z2Test = '' * Ask for z1 or z2 TypeOver = '' TypeOver = 'B&1,&2,&Cancel' TypeOver = 'Move Metrology to Reactor Zone' TypeOver = '?' TypeOver = '3' TypeOver = 'Move Metrology to Zone:' DestZone = Msg(@WINDOW,TypeOver,'') IF DestZone = 3 THEN RETURN CASE Z1Test = '' AND Z2Test NE '' DestZone = 1 CASE Z1Test NE '' AND Z2Test = '' DestZone = 2 CASE 1 ErrMsg('No open Zone to move to.') RETURN END CASE Send_Event(@WINDOW,'WRITE') FOR I = 1 TO COUNT(MetNos,@VM) + (MetNos NE '') IF MetNos<1,I> NE '' THEN MetNo = MetNos<1,I> oRTParms = MetNo:@RM oRTParms := DestZone obj_RDS_Test('SetZone',oRTPARms) END NEXT I Set_Property(@WINDOW:'.RDS_NO','DEFPROP',RDSNo) Send_Event(@WINDOW,'READ') END RETURN * * * * * * * HoldClick: * * * * * * * RDSNo = Get_Property(@WINDOW:'.RDS_NO','DEFPROP') WOMatKey = Get_Property(@WINDOW:'.WO_MAT_KEY','DEFPROP') CtrlEnt = Get_Property(@WINDOW,'FOCUS') Send_Event(@WINDOW,'WRITE') Send_Event(@WINDOW,'CLEAR') ; // 12/21/2017 - DMB - Although WRITE normally clears the form, QBF mode will prevent the clear so do this explicitly so the lock is removed from the RDS record. HoldEntity = 'RDS' HoldEntityID = RDSNo obj_WO_Mat('ToggleHold',WOMatKey:@RM:HoldEntity:@RM:HoldEntityID:@RM:CtrlEnt) IF Get_Status(errCode) THEN ErrMsg(errCode) obj_AppWindow('LoadFormKeys',@WINDOW:@RM:RDSNo) RETURN * * * * * * * HoldDC: * * * * * * * CtrlEntID = @WINDOW:'.HOLD_HISTORY' RecordID = Get_Property(@WINDOW:'.RDS_NO','DEFPROP') WOMatKey = Get_Property(@WINDOW:'.WO_MAT_KEY','DEFPROP') HoldHistory = Get_Property(CtrlEntID,'LIST') CurrPos = Get_Property(CtrlEntID,'SELPOS') CurrCol = CurrPos<1> CurrRow = CurrPos<2> HistoryCols = Get_Property(CtrlEntID, "COLUMN") ColName = HistoryCols<1,1,CurrCol> obj_WO_Mat('EditHoldReason',WOMatKey:@RM:ColName:@RM:CurrRow) IF Get_Status(errCode) THEN ErrMsg(errCode) Send_Event(CtrlEntID,'CALCULATE',CurrCol) RETURN * * * * * * * CtrlPlanClick: * * * * * * * PSNo = Get_Property(@WINDOW:'.PSN','DEFPROP') WONo = Get_Property(@WINDOW:'.WO','DEFPROP') IF PSNo NE '' THEN Print_Control_Plan(PSNo,WONo) END RETURN * * * * * * * Override: * * * * * * * UserRec = XLATE('LSL_USERS',@USER4,'','X') RDSMasterFlag = UserRec UserGroups = UserRec IF NOT(RDSMasterFlag) THEN ErrMsg('You do not have security rights to override Run Data Sheet information.') RETURN END IF NOT(Dialog_Box( 'PWD_ENTRY', @WINDOW, '' )) THEN RETURN EpiOvrControls = Get_Property( @WINDOW, '@EpiOvrControls' ) Set_Property( EpiOvrControls, 'ENABLED', 1 ) LOCATE 'MASTER_SCHED' IN UserGroups USING @VM SETTING Dummy ELSE Set_Property(@WINDOW:'.STATUS.CANCELLED','ENABLED',0) ;* Disable the CANCELLED button in the button group END RETURN * * * * * * * PrintInstruction: * * * * * * * RDSNo = Get_Property(@WINDOW:'.RDS_NO','TEXT') IF RDSNo NE '' THEN Print_RDS_Instruction(RDSNo) END RETURN * * * * * * * ViewWOMat: * * * * * * * Ctrls = @WINDOW:'.WO':@RM ; Props = 'DEFPROP':@RM Ctrls := @WINDOW:'.RUN_ORDER_NUM':@RM ; Props := 'DEFPROP':@RM Ctrls := @WINDOW:'.RDS_NO':@RM ; Props := 'DEFPROP':@RM Ctrls := @WINDOW:'.REACTOR':@RM ; Props := 'DEFPROP':@RM Ctrls := @WINDOW:'.WO_STEP':@RM ; Props := 'DEFPROP':@RM Ctrls := @WINDOW:'.REACTOR_TYPE' ; Props := 'DEFPROP' Vals = Get_Property(Ctrls,Props) WONo = Vals[1,@RM] CassNo = Vals[COL2()+1,@RM] RDSNo = Vals[COL2()+1,@RM] Reactor = Vals[COL2()+1,@RM] WOStep = Vals[COL2()+1,@RM] ReactorType = Vals[COL2()+1,@RM] IF ReactorType = 'P' OR ReactorType = 'EPP' THEN RETURN Send_Event(@WINDOW,'WRITE') Send_Event(@WINDOW,'CLEAR') ; // 12/21/2017 - DMB - Although WRITE normally clears the form, QBF mode will prevent the clear so do this explicitly so the lock is removed from the RDS record. thisFormWindowUp = Get_Property('WO_MAT_WFR','VISIBLE') ;* Returns 0 = hidden, 1 = visible, 2 = minimized, 3 = maximized IF thisFormWindowUp = '' THEN Start_Window('WO_MAT_WFR',@WINDOW,'') END ELSE IF thisFormWindowUp = 2 THEN Set_Property('WO_MAT_WFR','VISIBLE',9) ;* Restore the window if minimized IF Get_Property('WO_MAT_WFR','SAVEWARN') THEN Set_Property('WO_MAT_WFR','@SKIP_CARD_RETURN',1) ;* This stops the Return behavior Send_Event('WO_MAT_WFR','CLEAR') ;* Clear anything existing (prompts for save first) END END * Load Key Controls with Key Parts Ctrls = 'WO_MAT_WFR':@RM ; Props = '@RETURN_KEY':@RM ; Vals = RDSNo:@RM Ctrls := 'WO_MAT_WFR':@RM ; Props := '@RETURN_PAGE':@RM ; Vals := '':@RM Ctrls := 'WO_MAT_WFR':@RM ; Props := '@RETURN_CONTROL':@RM ; Vals := '':@RM Ctrls := 'WO_MAT_WFR':@RM ; Props := '@RETURN_POS':@RM ; Vals := '':@RM Ctrls := 'WO_MAT_WFR':@RM ; Props := '@RDS_NO':@RM ; Vals := RDSNo:@RM Ctrls := 'WO_MAT_WFR':@RM ; Props := '@REACTOR':@RM ; Vals := Reactor:@RM Ctrls := 'WO_MAT_WFR':@RM ; Props := '@WO_STEP_NO':@RM ; Vals := WOStep:@RM Ctrls := 'WO_MAT_WFR.WO_NO':@RM ; Props := 'DEFPROP':@RM ; Vals := WONo:@RM Ctrls := 'WO_MAT_WFR.CASS_NO' ; Props := 'DEFPROP' ; Vals := CassNo Set_Property(Ctrls,Props,Vals) Send_Event('WO_MAT_WFR.CASS_NO','LOSTFOCUS') RETURN * * * * * * * NextStepQty: * * * * * * * Ctrls = @WINDOW:'.RDS_NO':@RM ; Props = 'DEFPROP':@RM Ctrls := @WINDOW:'.WO':@RM ; Props := 'DEFPROP':@RM Ctrls := @WINDOW:'.WO_STEP':@RM ; Props := 'DEFPROP':@RM Ctrls := @WINDOW:'.CASS_NO' ; Props := 'DEFPROP' Vals = Get_Property(Ctrls,Props) CurRDSNo = Vals[1,@RM] WONo = Vals[COL2()+1,@RM] WOStep = Vals[COL2()+1,@RM] CassNo = Vals[COL2()+1,@RM] WOMatKey = WONo:'*':CassNo WOMatRec = XLATE('WO_MAT',WOMatKey,'','X') WMRDSNos = WOMatRec LOCATE CurRdsNo 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 ELSE ErrMsg('Not a multi step process') END RETURN * * * * * * * CIClick: * * * * * * * CurrCtrl = Parm1 BEGIN CASE CASE @WINDOW = 'RDS_PRE_EPI' Stage = 'PRE' CICtrl = @WINDOW:'.PRE_CI_NO' CASE @WINDOW = 'RDS' Stage = 'FWI' CICtrl = @WINDOW:'.FWI_CI_NO' CASE @WINDOW = 'RDS_UNLOAD' Stage = 'LWI' CICtrl = @WINDOW:'.LWI_CI_NO' CASE @WINDOW = 'RDS_POST_EPI' Stage = 'POST' CICtrl = @WINDOW:'.POST_CI_NO' CASE 1 ; RETURN END CASE Ctrls = @WINDOW:'.RDS_NO':@RM ; Props = 'DEFPROP':@RM Ctrls := @WINDOW:'.WO':@RM ; Props := 'DEFPROP':@RM Ctrls := @WINDOW:'.WO_STEP':@RM ; Props := 'DEFPROP':@RM Ctrls := @WINDOW:'.CASS_NO':@RM ; Props := 'DEFPROP':@RM Ctrls := @WINDOW:'.PSN':@RM ; Props := 'DEFPROP':@RM Ctrls := CICtrl ; Props := 'DEFPROP' Vals = Get_Property(Ctrls,Props) RDSNo = Vals[1,@RM] WONo = Vals[COL2()+1,@RM] WOStep = Vals[COL2()+1,@RM] CassNo = Vals[COL2()+1,@RM] PSNo = Vals[COL2()+1,@RM] CINo = Vals[COL2()+1,@RM] IF RDSNo = '' THEN RETURN IF CINo = '' THEN MsgHead = 'Create Clean_Insp Record' MsgText = 'Are you sure you wish to create a Clean_Insp record for this stage?' OK = Msg(@WINDOW,'','YESNO','',MsgHead:@FM:MsgText) IF NOT(OK) THEN RETURN oCIParms = WONo:@RM oCIParms := WOStep:@RM oCIParms := CassNo:@RM oCIParms := Stage:@RM oCIParms := RDSNo:@RM oCIParms := PSNo:@RM oCIParms := '' ;* PSRec passed as null CINo = obj_Clean_Insp('Create',oCIParms) IF Get_Status(errCode) THEN ErrMsg(errCode) RETURN END obj_React_Run('AddCI',RDSNo:@RM:Stage:@RM:CINo) END IF CINo NE '' THEN Send_Event(@WINDOW,'WRITE') Send_Event(@WINDOW,'CLEAR') ; // 12/22/2017 - DMB - Although WRITE normally clears the form, QBF mode will prevent the clear so do this explicitly so the lock is removed from the RDS record. DetWindow = 'CLEAN_INSP' DetKeys = CINo DefaultRec = '' RetKey = RDSNo RetWin = @WINDOW RetPage = 1 RetCtrl = CurrCtrl RetPos = '' obj_Appwindow('ViewNewDetail',DetWindow:@RM:DetKeys:@RM:DefaultRec:@RM:RetKey:@RM:RetPage:@RM:RetCtrl:@RM:RetPos) END RETURN * * * * * * * LoadCI: * * * * * * * * Dead RETURN * * * * * * * SAPSign: * * * * * * * * Used to auto-sign all steps for Admin purposes. RDSNo = Get_Property(@WINDOW:'.RDS_NO','DEFPROP') WONo = Get_Property(@WINDOW:'.WO','DEFPROP') WOStepNo = Get_Property(@WINDOW:'.WO_STEP','DEFPROP') CassNo = Get_Property(@WINDOW:'.CASS_NO','DEFPROP') SchedQty = Get_Property(@WINDOW:'.WAFERS_SCHEDULED','DEFPROP') PRodVerNo = XLATE('WO_LOG',WONo,WO_LOG_PROD_VER_NO$,'X') IF ProdVerNo = '' THEN ErrMsg('No Prod_Ver number on Work Order -> Not generated by SAP.') RETURN END CurrDt = Date() CurrTm = Time() Set_Property(@WINDOW:'.SHIFT','DEFPROP',1) Send_Event(@WINDOW,'WRITE') otParms = 'RDS':@RM:RdsNo RDSRec = obj_Tables('ReadRec',otParms) ;* Reads and sets lock IF Get_Status(errCode) THEN RETURN ;* Problems getting the lock * IF @USERNAME = 'BRYCE_BARB' THEN Sig = 'BRYCE_BARB' * IF @USER4 = 'DAVID_KL' THEN Sig = 'DAVID_KL' If MemberOf(@USER4, 'OI_ADMIN') then Sig = @USER4 end AllSigProfKeys = XLATE('WO_MAT',WONo:'*':CassNo,WO_MAT_SIG_PROFILE$,'X') SigCnt = COUNT(AllSigProfKeys,@VM) + (AllSigProfKeys NE '') SigDTM = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTHS') SigProfKeys = '' Sigs = '' SigDTMs = '' SigProfKeys = AllSigProfKeys FOR I = 1 TO SigCnt - 1 *SigProfKeys<1,I> = AllSigProfKeys<1,I> Sigs<1,I> = Sig SigDTMs<1,I> = SigDTM NEXT I RDSRec = Sig RDSRec = CurrDt RDSRec = CurrTm - 250 RDSRec = Sig RDSRec = CurrDt RDSRec = CurrTm - 200 RDSRec = Sig RDSRec = CurrDt RDSRec = CurrTm - 150 RDSRec = Sig RDSRec = CurrDt RDSRec = CurrTm - 100 RDSRec = Sig RDSRec = CurrDt RDSRec = CurrTm - 50 * RDSRec = Sig * RDSRec = CurrDt * RDSRec = CurrTm - 25 RDSRec = 'T' RDSRec = SchedQty RDSRec = SchedQty RDSRec = SchedQty otParms = FIELDSTORE(otParms,@RM,4,0,RDSRec) obj_Tables('WriteRec',otParms) IF Get_Status(errCode) THEN obj_Tables('UnlockRec',otParms) END * obj_WO_Mat('SetSignature',WONo:@RM:CassNo:@RM:WOStepNo:@RM:SigProfKeys:@RM:Sigs:@RM:SigDTMs) ;* Clears the WO_MAT signature IF Get_Status(errCode) THEN ErrMsg(errCode) END LogFile = 'WO_MAT' Action = 'Place' WhCd = '1K' ;* Class 1000 room LocCd = 'PTI' ;* Passthrough Inbound WONos = WONo CassNos = CassNo UserID = Sig CassIDs = RDSNo obj_WO_Mat_Log('Create',LogFile:@RM:SigDTM:@RM:Action:@RM:WhCd:@RM:LocCd:@RM:WONos:@RM:CassNos:@RM:UserID:@RM:CassIDs) IF Get_Status(errCode) THEN ErrMsg(errCode) END Set_Property(@WINDOW:'.RDS_NO','DEFPROP',RDSNo) Send_Event(@WINDOW:'.RDS_NO','LOSTFOCUS') RETURN * * * * * * * SAPReject: * * * * * * * * Rejected cassettes do not close automatically. This is the manual step triggered by the * SAP "Reject" button on the RDS_POST_EPI window. Admin reviews and then closes and data is sent * to SAP and Fab-Time. * Following copied from Sign Final QA click event on the RDS_POST_EPI window. * Development in process 10/23/2014 JC IF @USERNAME = 'BRYCE_BARB' THEN @USER4 = 'BRYCE_BARB' SigDt = OCONV( Date(), 'D2/' ) SigTm = Time() SigTmPlusOne = OCONV(SigTm + 1, 'MTS' ) SigTmPlusTwo = OCONV(SigTm + 2, 'MTS' ) SigTm = OCONV(SigTm,'MTS') SigBy = @USER4 Ctrls = @WINDOW:'.REACTOR_TYPE':@RM ; Props = 'DEFPROP':@RM Ctrls := @WINDOW:'.RDS_NO':@RM ; Props := 'DEFPROP':@RM Ctrls := @WINDOW:'.WO':@RM ; Props := 'DEFPROP':@RM Ctrls := @WINDOW:'.WO_STEP':@RM ; Props := 'DEFPROP':@RM Ctrls := @WINDOW:'.CASS_NO':@RM ; Props := 'DEFPROP':@RM Ctrls := @WINDOW:'.MAKEUP_BOX' ; Props := 'CHECK' Vals = Get_Property(Ctrls,Props) ReactorType = Vals[1,@RM] CurRDSNo = Vals[COL2()+1,@RM] WONo = Vals[COL2()+1,@RM] WOStep = Vals[COL2()+1,@RM] CassNo = Vals[COL2()+1,@RM] MakeupBox = Vals[COL2()+1,@RM] EventParms = '' EventCnt = 1 IF ReactorType NE 'EPP' THEN ToolID = '' WHCd = 'CR' LocCD = 'QA' Tag = '' owmParms = WONo:@RM:CassNo:@RM:WOStep:@RM:'QA':@RM:@USER4:@RM:SigDt:' ':SigTm:@RM:ToolID:@RM:WHCd:@RM:LocCd:@RM:Tag ;* 4/30/2013 JCH added parms for merging of two methods * obj_WO_Mat('SetSignature',owmParms) ; * * * * * S I G N A T U R E * * * * * * IF Get_Status(errCode) THEN CALL ErrMsg(ErrCode) RETURN 0 ;* Added 4/4/2013 JCH END EventParms = 'WO_MAT' EventParms = SigDt:' ':SigTm EventParms = WOStep:'QA' EventParms = 'CR' EventParms = 'QA' EventParms = WONo EventParms = CassNo EventParms = @USER4 EventParms = '' EventParms = '' CONVERT @FM TO @RM IN EventParms obj_WO_Mat_Log('Create',EventParms) ;* * * * * INV EVENT LOG * * * * * IF Get_Status(errCode) THEN CALL ErrMsg(ErrCode) RETURN 0 END IF MakeupBox = 1 THEN EventParms = 'WO_MAT' EventParms = SigDt:' ':SigTmPlusTwo EventParms = 'RTU' EventParms = 'CR' EventParms = 'MU' EventParms = WONo EventParms = CassNo EventParms = @USER4 EventParms = '' EventParms = '' CONVERT @FM TO @RM IN EventParms obj_WO_Mat_Log('Create',EventParms) ;* * * * * INV EVENT LOG * * * * * IF Get_Status(errCode) THEN CALL ErrMsg(ErrCode) RETURN 0 END END END ;* End of check for non EpiPRO reactor * Update Final QA signature fields in the window * Ctrls = @WINDOW:'.POST_EPI_SUP_SIG':@RM ; Props = 'TEXT':@RM ; Vals = @USER4:@RM Ctrls := @WINDOW:'.POST_EPI_SUP_SIG_NAME':@RM ; Props := 'TEXT':@RM ; Vals := OCONV( @USER4, '[XLATE_CONV,LSL_USERS*FIRST_LAST]' ):@RM Ctrls := @WINDOW:'.POST_EPI_SUP_SIG_DATE':@RM ; Props := 'TEXT':@RM ; Vals := SigDt:@RM Ctrls := @WINDOW:'.POST_EPI_SUP_SIG_TIME' ; Props := 'TEXT' ; Vals := SigTmPlusOne Set_Property(Ctrls,Props,Vals) * Check for multiple Reactor Runs on this cassette and update Sched Wafer Qty as required * WOMatKey = WONo:'*':CassNo WOMatRec = XLATE('WO_MAT',WOMatKey,'','X') WMRDSNos = WOMatRec LOCATE CurRdsNo 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 WOMatKey = WONo:'*':CassNo OrgMUPart = XLATE('WO_MAT',WOMatKey,'MU_PART_NO','X') Send_Event(@WINDOW,'WRITE') * Generate index transaction to keep the MU_PART_NO index updated in the WO_MAT table * 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 * Redisplay the updated RDS record in the window * obj_AppWindow('LoadFormKeys',@WINDOW:@RM:CurRdsNo) RETURN * * * * * * * MetTestDC: * * * * * * * Ctrls = @WINDOW:'.RDS_NO':@RM ; Props = 'DEFPROP':@RM Ctrls := @WINDOW:'.WO':@RM ; Props := 'DEFPROP':@RM Ctrls := @WINDOW:'.WO_STEP':@RM ; Props := 'DEFPROP':@RM Ctrls := @WINDOW:'.CASS_NO':@RM ; Props := 'DEFPROP':@RM * If @USER4 EQ 'FRANCOIS_R' then Ctrls := @WINDOW:'.EDT_QA_MET':@RM ; Props := 'SELPOS':@RM Ctrls := @WINDOW:'.EDT_QA_MET' ; Props := 'LIST' * end else * Ctrls := @WINDOW:'.MET_TEST':@RM ; Props := 'SELPOS':@RM * Ctrls := @WINDOW:'.MET_TEST' ; Props := 'LIST' * end Vals = Get_Property(Ctrls,Props) RDSNo = Vals[1,@RM] WONo = Vals[COL2()+1,@RM] WOStep = Vals[COL2()+1,@RM] CassNo = Vals[COL2()+1,@RM] CurrPos = Vals[COL2()+1,@RM] Lines = Vals[COL2()+1,@RM] CurrCol = CurrPos<1> CurrRow = CurrPos<2> TestLine = Lines CurrCtrl = Get_Property(@WINDOW,'FOCUS') RunStep = '' If CurrCtrl[1,'.'] = 'RDS' Then RunStep = 'FWI' IF CurrCtrl[1,'.'] = 'RDS_UNLOAD' THEN RunStep = 'UNLOAD' IF CurrCtrl[1,'.'] = 'RDS_POST_EPI' THEN RunStep = 'QA' IF RunStep = '' THEN RETURN CassID = WONo:'*':WOStep:'*':CassNo:'*':RDSNo:'*':RunStep BEGIN CASE CASE @WINDOW = 'RDS_UNLOAD' ;//and @USER4 EQ 'FRANCOIS_R' ReturnVal = Dialog_Box( 'NDW_QA_MET_RESULT', @WINDOW, CassID) CASE Otherwise$ ReturnVal = Dialog_Box('QA_MET_RESULT', @WINDOW, CassID:@FM:TestLine) END CASE GOSUB Refresh RETURN * * * * * * * * LUPostCode: * * * * * * * * ToolKeys = XLATE('TOOL_CLASS','AKRION',TOOL_CLASS_TOOL$,'X') ToolKeys<1,-1> = XLATE('TOOL_CLASS','WET BENCH',TOOL_CLASS_TOOL$,'X') TypeOver = '' TypeOver = 'K' TypeOver = ToolKeys ToolID = Popup(@WINDOW,TypeOver,'TOOLS') IF ToolID = '' THEN RETURN obj_Appwindow('LUValReturn',ToolID:@RM:@WINDOW:'.POST_CODE') RETURN * * * * * * * SigProfile: * * * * * * * WONo = Get_Property(@WINDOW:'.WO','TEXT') CassNo = Get_Property(@WINDOW:'.CASS_NO','TEXT') WOStep = Get_Property(@WINDOW:'.WO_STEP','TEXT') IF WONo = '' OR CassNo = '' THEN RETURN SigData = obj_WO_Mat('GetSigProfile',WONo:'*':CassNo:@RM:WOStep) 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 = Display void = Popup(@WINDOW,TypeOver,'SIG_PROFILE') RETURN * * * * * * * ReactProfile: * * * * * * * ReactNo = Get_Property(@WINDOW:'.REACTOR','DEFPROP') IF ReactNo NE '' THEN obj_AppWindow('ViewRelated','REACT_STATE':@RM:ReactNo) END RETURN * * * * * * * * ConversionLoad: * * * * * * * * * Routine to create/update RDS_LAYER and RDS_TEST records until conversion is complete * dead stub RETURN