COMPILE FUNCTION EPI_Part(EntID,Event,Parm1,Parm2,Parm3,Parm4,Parm5) #pragma precomp SRP_PreCompiler /* Commuter module for EPI_Part window 02/18/2011 - John C. Henry, J.C. Henry & Co., Inc. */ DECLARE SUBROUTINE Set_Property, End_Dialog, Send_Event, Set_Status, Center_Window, Post_Event DECLARE SUBROUTINE ErrMsg, Send_Message, Set_Property, Send_Event, Btree.Extract, obj_AppWindow, DECLARE SUBROUTINE obj_Notes, Security_Err_Msg, End_Window, Forward_Event, Start_Window, Create_Note DECLARE SUBROUTINE Set_List_Box_Data, obj_Epi_Part, Epi_Part_Services DECLARE FUNCTION Get_Property, Get_Status, Dialog_Box, Utility, Popup, Collect.Ixvals, obj_Popup, Epi_Part_Services DECLARE FUNCTION Send_Message, Msg, Security_Check, obj_React_Run_CI, Select_Into, obj_EPI_Part, obj_Prod_Spec, MemberOf $INSERT MSG_EQUATES $INSERT APPCOLORS $INSERT LSL_USERS_EQU $INSERT SECURITY_RIGHTS_EQU $INSERT REACT_EVENT_EQUATES $INSERT POPUP_EQUATES $INSERT LOGICAL $INSERT RTI_STYLE_EQUATES $INSERT CUST_EPI_PART_EQUATES $INSERT PROD_VER_EQUATES $INSERT PRS_LAYER_EQU $INSERT PROD_SPEC_EQUATES $Insert EPI_PART_EQUATES EQU EDITABLE$ TO 4 EQU PROTECTED$ TO 8 ;* Protected - Edittable COLSTYLE constants EQU MULTILINE_STYLE$ TO 512 ;* MultiLine Select EQU LOCKED$ TO 8192 EQU DROPDOWN_STYLE$ TO 131072 EQU CRLF$ TO \0D0A\ EQU TAB$ TO \09\ EQU COL$LAYER TO 1 EQU COL$STEP TO 2 EQU COL$STEP_LS_ID TO 3 EQU COL$DOPANT TO 4 EQU COL$THICK_MIN TO 5 EQU COL$THICK_MAX TO 6 EQU COL$THICK_TARGET TO 7 EQU COL$RES_MIN TO 8 EQU COL$RES_MAX TO 9 EQU COL$RES_TARGET TO 10 EQU COL$PROD_VER_NO TO 1 EQU COL$PROD_VER_DESC TO 2 EQU COL$REACT_TYPE TO 3 EQU COL$SHIP_PSN TO 4 EQU COL$PROD_VER_SUB_PART_NO TO 5 EQU COL$PROD_VER_CUST_NO TO 6 EQU COL$PROD_VER_CUST_PART_NO TO 7 EQU COL$THIN_EPI_THICK TO 8 EQU COL$THICK_EPI_THICK TO 9 EQU COL$PART_STATUS TO 10 EQU COL$PSN_STATUS TO 11 EQU COL$TYPE_CODE TO 1 EQU COL$TYPE_DESC TO 2 EQU COL$TYPE_SIG TO 3 EQU COL$TYPE_SIG_DTM TO 4 EQU COL$CUST_NO TO 1 EQU COL$DUMMY_1_PIXEL_WIDE TO 1 ;* Used for both INSP_SPEC and INSP controls EQU HIDDEN$ TO 32 EQU SKIPPED$ TO 4100 ErrTitle = 'Error in EPI_Part' ErrorMsg = '' ErrCode = '' Result = '' BEGIN CASE CASE EntID = @WINDOW BEGIN CASE CASE Event = 'CLEAR' ; GOSUB Clear CASE Event = 'CREATE' ; GOSUB Create CASE Event = 'CLOSE' ; GOSUB Close CASE Event = 'READ' ; GOSUB Read CASE Event = 'WRITE' ; GOSUB Write CASE Event[1,3] = 'QBF' ; GOSUB Refresh END CASE CASE EntID = @WINDOW:'.LU_EPI_PART_NO' AND Event = 'CLICK' ; GOSUB LUEpiPartNo CASE EntID = @WINDOW:'.TAB_CONTROL' AND Event = 'CLICK' ; GOSUB TabClick CASE EntID = @WINDOW:'.NAVIGATOR' BEGIN CASE CASE Event = 'DBLCK' GOSUB NavigatorDC END CASE CASE EntID = @WINDOW:'.PROD_VER_NO' BEGIN CASE CASE Event = 'POSCHANGED' ; GOSUB ProdVerPC CASE Event = 'DBLCLK' ; GOSUB ProdVerDC END CASE CASE EntID = @WINDOW:'.CUST_NO' BEGIN CASE CASE Event = 'DBLCLK' ; GOSUB CustNoDC END CASE CASE EntID = @WINDOW:'.INACTIVE_PROD_VER' BEGIN CASE CASE Event = 'DBLCLK' ; GOSUB InactiveProdVerDC END CASE CASE EntID = @WINDOW:'.SUB_WAFER_SIZE' AND Event = 'GOTFOCUS' ; GOSUB SubSizeGF CASE EntID = @WINDOW:'.LOAD_LAYERS' AND Event = 'CLICK' ; GOSUB LoadLayers CASE EntID = @WINDOW:'.LU_SIZE' AND Event = 'CLICK' ; GOSUB LUSubSize Case EntID = @Window : '.MPW_ASM_SCHEDULER' AND Event = 'LOSTFOCUS' ; GoSub MPW_ASM_SCHEDULER.LOSTFOCUS Case EntID = @Window : '.MPW_ASM_PLUS_SCHEDULER' AND Event = 'LOSTFOCUS' ; GoSub MPW_ASM_PLUS_SCHEDULER.LOSTFOCUS Case EntID = @Window : '.MPW_HTR_SCHEDULER' AND Event = 'LOSTFOCUS' ; GoSub MPW_HTR_SCHEDULER.LOSTFOCUS Case EntID = @Window : '.MPW_EPIPRO_SCHEDULER' AND Event = 'LOSTFOCUS' ; GoSub MPW_EPIPRO_SCHEDULER.LOSTFOCUS Case EntID = @Window : '.MPW_GAN_SCHEDULER' AND Event = 'LOSTFOCUS' ; GoSub MPW_GAN_SCHEDULER.LOSTFOCUS CASE 1 ErrorMsg = 'Unknown Parameters ':EntID:' - ':Event:' passed to commuter' ErrMsg(ErrorMsg) END CASE IF ErrorMsg NE '' THEN ErrMsg(ErrTitle:@SVM:ErrorMsg) END RETURN Result * * * * * * * Create: * * * * * * * obj_Appwindow('Create',@WINDOW) if (MemberOf(@USER4,'EXPORT_CONTROL_ADMINS')) then Set_Property(@WINDOW:'.EXPORT_CONTROL','VISIBLE',1) end else Set_Property(@WINDOW:'.EXPORT_CONTROL','VISIBLE',0) end obj_Appwindow('SetDropDowns') * Set result table special styles (Dropdowns) LayerStyles = Send_Message(@WINDOW:'.LAYER_SPEC','COLSTYLE',0,'') LayerStyles = BitOr(LayerStyles,DTCS_DROPDOWN$) Send_Message(@WINDOW:'.LAYER_SPEC','COLSTYLE',0,LayerStyles) Dopants = XLATE('LISTBOX_CONFIG','DOPANT','','X') Send_Message(@WINDOW:'.LAYER_SPEC','COLFORMAT',COL$DOPANT,Dopants) If Parm1 NE '' then EpiPart = Parm1[1, '*'] Set_Property(@Window : '.EPI_PN', 'TEXT', EpiPart) Post_Event(@Window, 'READ') end else GOSUB Refresh end RETURN * * * * * * * Clear: * * * * * * * IF Get_Property(@WINDOW,'@READONLY') THEN obj_AppWindow('ReadOnly',@RM:1) ;* Reenables data bound controls Set_Property(@WINDOW,'@READONLY',0) ;* Clear flag on window END * * * * * * * Refresh: * * * * * * * EpiPN = Get_Property(@WINDOW:'.EPI_PN','DEFPROP') EpiPartDesc = Get_Property(@WINDOW:'.EPI_PART_DESC','DEFPROP') IF EpiPartDesc NE '' THEN EpiPart = EpiPN:' - ':EpiPartDesc END ELSE EpiPart = EpiPN END NavList = '' IF EpiPart NE '' THEN NavList<1> = '1-1:':EpiPart END * SAP Substrate Section SubParts = '' SubPartList = Get_Property(@WINDOW:'.SUB_PART_NO','LIST') SubCnt = COUNT(SubPartList,@FM) + (SubPartList NE '') FOR I = 1 TO SubCnt IF SubPartList NE '' THEN SubParts<-1> = '7-3:':SubPartList:' - ':SubPartList END NEXT I IF SubParts NE '' THEN NavList := @FM:'2-2:SAP Substrates':@FM:SubParts END * Customer Section CustList = Get_Property(@WINDOW:'.CUST_NO','LIST') CustCount = COUNT(CustList,@FM) + (CustList NE '') FOR I = 1 TO CustCount IF CustList NE '' THEN IF I = 1 THEN NavList := @FM:'2-2:Customers' END CustNo = CustList CustEpiPartRec = XLATE('CUST_EPI_PART',CustNo:'*':EpiPN,'','X') CustPNs = CustEpiPartRec CustPNCnt = COUNT(CustPNs,@VM) + (CustPNs NE '') CustParts = '' FOR N = 1 TO CustPNCnt CustParts := @FM:'7-5:':CustPNs<1,N> IF CustEpiPartRec NE '' THEN CustParts := ' - Inbound: ':CustEpiPartRec END NEXT N NavList := @FM:'3-3:':CustList:' - ':CustList IF CustParts NE '' THEN NavList := @FM:'4-4:Customer Part Nos' NavList := CustParts END * Substrate Part No's CustSubPNs = CustEpiPartRec CustSubPNCnt = COUNT(CustSubPNs,@VM) + (CustSubPNs NE '') CustSubParts = '' FOR N = 1 TO CustSubPNCnt CustSubParts := @FM:'5-5:':CustSubPNs<1,N> IF CustEpiPartRec NE '' THEN CustSubParts := ' - ':CustEpiPartRec END NEXT N IF CustSubParts NE '' THEN NavList := @FM:'4-4:Direct From Customer Substrate Part Nos' NavList := CustSubParts END END; * End of check for null Customer NEXT I ProdVerList = Get_Property(@WINDOW:'.PROD_VER_NO','LIST') ProdVerCnt = COUNT(ProdVerList,@FM) + (ProdVerList NE '') ProdVerSort = '' ProdVerKeys = '' FOR I = 1 TO ProdVerCnt ProdVerNo = ProdVerList IF ProdVerNo NE '' THEN CustNo = ProdVerList ReactType = ProdVerList SubPN = ProdVerList SortKey = CustNo:'*':ReactType:'*':SubPN LOCATE SortKey IN ProdVerSort BY 'AL' USING @FM SETTING Pos ELSE ProdVerSort = INSERT(ProdVerSort,Pos,0,0,SortKey) ProdVerKeys = INSERT(ProdVerKeys,Pos,0,0,ProdVerNo) END END ;* End of check for null ProdVerNo NEXT I ProdVerKeyCnt = COUNT(ProdVerKeys,@FM) + (ProdVerKeys NE '') ProdVers = '' IF ProdVerKeyCnt > 0 THEN NavList := @FM:TAB$:@FM:'2-2:Production Versions' END SpecList = '' ;* Tree of specification data ReactTypeArray = '' ;* ReactType:'*':StepNo ReactDataArray = '' FOR I = 1 TO ProdVerKeyCnt ProdVerKey = ProdVerKeys ProdVerRec = XLATE('PROD_VER',ProdVerKey,'','X') ReactType = OCONV(ProdVerRec,'[REACT_TYPE_CONV,OPSREF]') NavList := @FM:'5-3:':ProdVerKey:TAB$:ReactType:TAB$:FMT(ProdVerRec,"L#25"):TAB$ StepIDs = XLATE('PROD_VER',ProdVerKey,'PROC_STEP_ID','X') StepPSNs = XLATE('PROD_VER',ProdVerKey,'PROC_STEP_PSN','X') StepTypes = XLATE('PROD_VER',ProdVerKey,'PROC_STEP_LAYER_TYPE','X') StepCnt = COUNT(StepIDs,@VM) + (StepIDs NE '') IF StepCnt > 0 THEN NewRDFlag = 0 FOR N = 1 TO StepCnt StepID = StepIDs<1,N> StepPSN = StepPSNs<1,N> NavList := 'Step ':StepID:' - ':StepPSN:' - ':StepTypes<1,N> IF N NE StepCnt THEN NavList := '/' END LOCATE ReactType:'*':StepID IN ReactTypeArray BY 'AR' USING @FM SETTING RTPos ELSE ReactTypeArray = INSERT(ReactTypeArray,RTPos,0,0,ReactType:'*':StepID) IF SpecList = '' THEN SpecList = 'Reactor Type' END ELSE SpecList := @FM:'ReactorType' END NewRDFlag = 1 END NEXT N END ;* End of check for StepCnt > 0 NEXT I NavList := @FM:'2-2:Specification':ReactDataArray Set_Property(@WINDOW:'.NAVIGATOR', 'LIST', NavList) Send_Message(@WINDOW:'.NAVIGATOR', 'EXPAND', 0, 6) * QBF buttons Ctrls = @WINDOW:'.QBF_FIRST_FIX':@RM ; Props = 'ENABLED':@RM Ctrls := @WINDOW:'.QBF_PREV_FIX':@RM ; Props := 'ENABLED':@RM Ctrls := @WINDOW:'.QBF_ABS_FIX':@RM ; Props := 'ENABLED':@RM Ctrls := @WINDOW:'.QBF_NEXT_FIX':@RM ; Props := 'ENABLED':@RM Ctrls := @WINDOW:'.QBF_LAST_FIX':@RM ; Props := 'ENABLED':@RM Ctrls := @WINDOW:'.QBF_STOP_FIX' ; Props := 'ENABLED' IF Get_Property(@WINDOW,'QBFLIST') = '' THEN Vals = 0:@RM:0:@RM:0:@RM:0:@RM:0:@RM:0 END ELSE Vals = 1:@RM:1:@RM:1:@RM:1:@RM:1:@RM:1 END Set_Property(Ctrls,Props,Vals) SpecCtrl = @WINDOW:'.LAYER_SPEC' LSList = Get_Property(SpecCtrl,'LIST') LSCnt = COUNT(LSList,@FM) + (LSList NE '') FOR Line = 1 TO LSCnt BEGIN CASE CASE LSList = 'L1' ; LineColor = LS1_GREEN$ CASE LSList = 'L2' ; LineColor = LS2_GREEN$ CASE LSList = 'L3' ; LineColor = LS3_GREEN$ CASE LSList = 'CMB' ; LineColor = CMB_YELLOW$ CASE 1 ;LineColor = WHITE$ END CASE stat = Send_Message(SpecCtrl,'COLOR_BY_POS',0,Line,LineColor) NEXT Line * Turn edit table symbolic column backgrounds to green ************************************************** ETSymbolics = Get_Property(@WINDOW,'@ET_SYMBOLICS') ;* Loaded during 'Create' in obj_Appwindow ETCtrls = ETSymbolics<1> ETCols = ETSymbolics<2> FOR I = 1 TO COUNT(ETCtrls,@VM) + (ETCtrls NE '') ETCtrl = ETCtrls<1,I> ETList = Get_Property(ETCtrl,'LIST') FOR Line = 1 TO COUNT(ETList,@FM) + (ETList NE '') IF ETList NE '' THEN IF ETCtrl = 'EPI_PART.PROD_VER_NO' OR ETCtrl = 'EPI_PART.INACTIVE_PROD_VER' THEN IF ETList = 'A' AND ETList = 'A' THEN LineColor = GREEN$ END ELSE LineColor = RED$ END END ELSE LineColor = GREEN$ END FOR N = 1 TO COUNT(ETCols<1,I>,@SVM) + (ETCols<1,I> NE '') stat = Send_Message(ETCtrl,'COLOR_BY_POS',ETCols<1,I,N>,Line,LineColor) NEXT N END NEXT I NEXT I // Scheduler tab data and calculations. MPWScheduler = Get_Property(@Window : '.MINUTES_PER_WAFER_SCHEDULER', 'ARRAY') MPWASMScheduler = MPWScheduler<0, 1> MPWASMPlusScheduler = MPWScheduler<0, 2> MPWHTRScheduler = MPWScheduler<0, 3> MPWEpiProScheduler = MPWScheduler<0, 4> MPWGaNScheduler = MPWScheduler<0, 5> Set_Property(@Window : '.MPW_ASM_SCHEDULER', 'INVALUE', MPWASMScheduler) Set_Property(@Window : '.MPW_ASM_PLUS_SCHEDULER', 'INVALUE', MPWASMPlusScheduler) Set_Property(@Window : '.MPW_HTR_SCHEDULER', 'INVALUE', MPWHTRScheduler) Set_Property(@Window : '.MPW_EPIPRO_SCHEDULER', 'INVALUE', MPWEpiProScheduler) Set_Property(@Window : '.MPW_GAN_SCHEDULER', 'INVALUE', MPWGaNScheduler) GoSub Calculate_WPD RETURN * * * * * * * Read: * * * * * * * GOSUB Refresh RETURN * * * * * * * Write: * * * * * * * // Scheduler tab data and calculations. MPWASMScheduler = Get_Property(@Window : '.MPW_ASM_SCHEDULER', 'INVALUE') MPWASMPlusScheduler = Get_Property(@Window : '.MPW_ASM_PLUS_SCHEDULER', 'INVALUE') MPWHTRScheduler = Get_Property(@Window : '.MPW_HTR_SCHEDULER', 'INVALUE') MPWEpiProScheduler = Get_Property(@Window : '.MPW_EPIPRO_SCHEDULER', 'INVALUE') MPWGaNScheduler = Get_Property(@Window : '.MPW_GAN_SCHEDULER', 'INVALUE') MPWScheduler = '' MPWScheduler<0, 1> = MPWASMScheduler MPWScheduler<0, 2> = MPWASMPlusScheduler MPWScheduler<0, 3> = MPWHTRScheduler MPWScheduler<0, 4> = MPWEpiProScheduler MPWScheduler<0, 5> = MPWGaNScheduler Set_Property(@Window : '.MINUTES_PER_WAFER_SCHEDULER', 'ARRAY', MPWScheduler) Forward_Event() Post_Event(@WINDOW,'CLOSE') Result = 0 RETURN * * * * * * * Delete: * * * * * * * /* IF Security_Check('Order',Delete$) THEN Result = 1 ;* Proceed with delete END ELSE Security_Err_Msg('Order',Delete$) Result = 0 ;* Stop event chain END */ RETURN * * * * * * * LUEpiPartNo: * * * * * * * EpiPartNos = Popup(@WINDOW,'','EPI_PART_NOS') IF EpiPartNos NE '' THEN IF INDEX(EpiPartNos,@VM,1) THEN Send_Event(@WINDOW,'QBFINIT') Set_Property(@WINDOW,'QBFLIST',EpiPartNos) Send_Event(@WINDOW,'QBFFIRST') END ELSE obj_AppWindow('LoadFormKeys',@WINDOW:@RM:EpiPartNos) END END RETURN * * * * * * * TabClick: * * * * * * * IF Parm1 NE '' THEN Page = Parm1 END ELSE Page = Get_Property(@WINDOW:'.TAB_CONTROL','VALUE') END Set_Property(@WINDOW,'VPOSITION',Page) RETURN * * * * * * * ProdVerDC: * * * * * * * EpiPartNo = Get_Property(@WINDOW:'.EPI_PN','TEXT') CtrlEntID = @WINDOW:'.PROD_VER_NO' CurrPos = Get_Property(CtrlEntID,'SELPOS') CurrCol = CurrPos<1> CurrRow = CurrPos<2> IF CurrCol = COL$PROD_VER_NO THEN ProdVerNo = Get_Property(CtrlEntID,'CELLPOS',COL$PROD_VER_NO:@FM:CurrRow) IF EpiPartNo NE '' THEN CardWindow = 'PROD_VER' CardKey = ProdVerNo DefaultRec = '' NewCardCtrl = '' RecalcCtrl = CtrlEntID RecalcPos = CurrPos RetCtrl = CtrlEntID RetPos = CurrPos oAParms = CardWindow:@RM:CardKey:@RM:DefaultRec:@RM:NewCardCtrl:@RM:RecalcCtrl:@RM:RecalcPos:@RM:RetCtrl:@RM:RetPos obj_AppWindow('ViewNewCard',oAParms) IF Get_Status(errCode) THEN ErrMsg(errCode) END END END ;* End of ItemNo column RETURN * * * * * * * ProdVerPC: * * * * * * * RETURN * * * * * * * InactiveProdVerDC: * * * * * * * EpiPartNo = Get_Property(@WINDOW:'.EPI_PN','TEXT') CtrlEntID = @WINDOW:'.INACTIVE_PROD_VER' CurrPos = Get_Property(CtrlEntID,'SELPOS') CurrCol = CurrPos<1> CurrRow = CurrPos<2> IF CurrCol = COL$PROD_VER_NO THEN ProdVerNo = Get_Property(CtrlEntID,'CELLPOS',COL$PROD_VER_NO:@FM:CurrRow) IF EpiPartNo NE '' THEN CardWindow = 'PROD_VER' CardKey = ProdVerNo DefaultRec = '' NewCardCtrl = '' RecalcCtrl = CtrlEntID RecalcPos = CurrPos RetCtrl = CtrlEntID RetPos = CurrPos oAParms = CardWindow:@RM:CardKey:@RM:DefaultRec:@RM:NewCardCtrl:@RM:RecalcCtrl:@RM:RecalcPos:@RM:RetCtrl:@RM:RetPos obj_AppWindow('ViewNewCard',oAParms) IF Get_Status(errCode) THEN ErrMsg(errCode) END END END ;* End of ItemNo column RETURN * * * * * * * CustNoDC: * * * * * * * EpiPartNo = Get_Property(@WINDOW:'.EPI_PN','TEXT') CtrlEntID = @WINDOW:'.CUST_NO' CurrPos = Get_Property(CtrlEntID,'SELPOS') CurrCol = CurrPos<1> CurrRow = CurrPos<2> IF CurrCol = COL$CUST_NO THEN CustNo = Get_Property(CtrlEntID,'CELLPOS',COL$CUST_NO:@FM:CurrRow) IF EpiPartNo NE '' THEN CardWindow = 'CUST_EPI_PART' CardKey = CustNo:'*':EpiPartNo DefaultRec = '' NewCardCtrl = '' RecalcCtrl = CtrlEntID RecalcPos = CurrPos RetCtrl = CtrlEntID RetPos = CurrPos oAParms = CardWindow:@RM:CardKey:@RM:DefaultRec:@RM:NewCardCtrl:@RM:RecalcCtrl:@RM:RecalcPos:@RM:RetCtrl:@RM:RetPos obj_AppWindow('ViewNewCard',oAParms) IF Get_Status(errCode) THEN ErrMsg(errCode) END END END ;* End of ItemNo column RETURN * * * * * * * Close: * * * * * * * *obj_Notes('Inbox',@USER4) ;* Checks for any new messages obj_Appwindow('DetailReturn') RETURN * * * * * * * LoadLayers: * * * * * * * EpiPartNo = Get_Property(@WINDOW:'.EPI_PN','DEFPROP') Send_Event(@WINDOW,'WRITE') obj_EPI_Part('LoadLayers',EpiPartNo) Set_Property(@WINDOW:'.EPI_PN','DEFPROP',EpiPartNo) Send_Event(@WINDOW:'.EPI_PN','LOSTFOCUS') RETURN * * * * * * * SubSizeGF: * * * * * * * SubSize = Get_Property(@WINDOW:'.SUB_WAFER_SIZE','DEFPROP') IF SubSize NE '' THEN IF SubSize MATCHES "2N' mm '1N' in'" OR SubSize MATCHES "3N' mm '1N' in'" THEN RETURN END ELSE ErrMsg('Application Message':@SVM:'Invalid data format entered. Select from following popup.') END END * Proceed to Popup with options * * * * * * * LUSubSize: * * * * * * * RetVal = Popup(@WINDOW,'','SUBSTRATE_SIZE') IF RetVal NE '' THEN oaParms = RetVal:@RM:@WINDOW:'.SUB_WAFER_SIZE' obj_Appwindow('LUValReturn',oaParms) END RETURN * * * * * * * * NavigatorDC: * * * * * * * * RETURN MPW_ASM_SCHEDULER.LOSTFOCUS: GoSub Calculate_WPD return MPW_ASM_PLUS_SCHEDULER.LOSTFOCUS: GoSub Calculate_WPD return MPW_HTR_SCHEDULER.LOSTFOCUS: GoSub Calculate_WPD return MPW_EPIPRO_SCHEDULER.LOSTFOCUS: GoSub Calculate_WPD return MPW_GAN_SCHEDULER.LOSTFOCUS: GoSub Calculate_WPD return Calculate_WPD: EpiPartNo = Get_Property(@Window : '.EPI_PN', 'TEXT') MPWCtrls = 'MPW_ASM_SCHEDULER,MPW_ASM_PLUS_SCHEDULER,MPW_HTR_SCHEDULER,MPW_EPIPRO_SCHEDULER,MPW_GAN_SCHEDULER' For Each MPWCtrl in MPWCtrls using ',' setting cPos MPWValue = Get_Property(@Window : '.' : MPWCtrl, 'DEFPROP') ReactorType = Field('ASM,ASM+,HTR,EpiPro,GaN', ',', cPos, 1) If MPWValue NE '' then WPDIdeal = Epi_Part_Services('GetIdealWafersPerDayScheduler', EpiPartNo, ReactorType, MPWValue) end else WPDIdeal = '' end WPDCtrl = MPWCtrl Swap 'MPW' with 'WPD' in WPDCtrl Set_Property(@Window : '.' : WPDCtrl, 'DEFPROP', WPDIdeal) If MPWValue NE '' then WPDAdjusted = Epi_Part_Services('GetAdjustedWafersPerDayScheduler', EpiPartNo, ReactorType, MPWValue) end else WPDAdjusted = '' end WPDCtrl = MPWCtrl Swap 'MPW' with 'WPDA' in WPDCtrl Set_Property(@Window : '.' : WPDCtrl, 'DEFPROP', WPDAdjusted) Next MPWCtrl return