COMPILE FUNCTION Test_Wafer(CtrlEntID,Event,Parm1, Parm2, Parm3, Parm4, Parm5) /* Commuter module for Test_Wafer (Test Wafer Use) window 06/28/2016 - John C. Henry, J.C. Henry & Co., Inc. */ DECLARE SUBROUTINE Set_Property, Set_Status, ErrMsg, Set_Property, obj_AppWindow, Forward_Event DECLARE SUBROUTINE Send_Event, obj_TW_Use, Security_Err_Msg, Post_Event, Btree.Extract, ErrMsg, obj_WO_Mat DECLARE SUBROUTINE Send_Message, obj_WM_IN, obj_WO_Wfr, obj_Notes DECLARE FUNCTION Get_Property, Get_Status, Popup, Send_Message, Msg, MemberOf, NextKey DECLARE FUNCTION obj_Quote, Security_Check, obj_WO_Mat, obj_WM_In, Dialog_Box, obj_WO_Wfr $INSERT REACT_RUN_EQUATES $INSERT WO_MAT_EQUATES $INSERT REACTOR_EQUATES $INSERT NOTIFICATION_EQU $INSERT SECURITY_RIGHTS_EQU $INSERT LSL_USERS_EQU $INSERT MSG_EQUATES $INSERT APPCOLORS $INSERT POPUP_EQUATES $INSERT LOGICAL EQU CRLF$ TO \0D0A\ ErrTitle = 'Error in TEST_WAFER' ErrorMsg = '' Result = '' BEGIN CASE CASE CtrlEntID = @WINDOW AND Event = 'CREATE' ; GOSUB Create CASE CtrlEntID = @WINDOW AND Event = 'READ' ; GOSUB Read CASE CtrlEntID = @WINDOW AND Event = 'WRITE' ; GOSUB Write CASE CtrlEntID = @WINDOW AND Event = 'DELETE' ; GOSUB Delete CASE CtrlEntID = @WINDOW AND Event = 'CLEAR' ; GOSUB Refresh CASE CtrlEntID = @WINDOW AND Event = 'CLOSE' ; GOSUB Close CASE CtrlEntID = @WINDOW AND Event[1,3] = 'QBF' ; GOSUB Refresh CASE CtrlEntID = @WINDOW:'.WAFER_ID' AND Event = 'DELETEROW' ; GOSUB DeleteWaferID CASE CtrlEntID = @WINDOW:'.WAFER_ID' AND Event = 'INSERTROW' ; GOSUB InsertWaferID CASE CtrlEntID = @WINDOW:'.TW_QTY' AND Event = 'LOSTFOCUS' ; GOSUB TWQtyLF CASE CtrlEntID = @WINDOW:'.TW_CODE' AND Event = 'LOSTFOCUS' ; GOSUB Refresh CASE CtrlEntID = @WINDOW:'.TW_TYPE' AND Event = 'LOSTFOCUS' ; GOSUB TWTypeLF CASE CtrlEntID = @WINDOW:'.TW_TYPE' AND Event = 'GOTFOCUS' ; GOSUB TWTypeGF CASE CtrlEntID = @WINDOW:'.NEW_BUTTON' AND Event = 'CLICK' ; GOSUB New CASE CtrlEntID = @WINDOW:'.LU_TW_CODE' AND Event = 'CLICK' ; GOSUB LU_TWCode CASE CtrlEntID = @WINDOW:'.LU_TW_TYPE' AND Event = 'CLICK' ; GOSUB LU_TWType CASE CtrlEntID = @WINDOW:'.LU_TOOL' AND Event = 'CLICK' ; GOSUB LU_Tool CASE CtrlEntID = @WINDOW:'.LU_CUST_PART_NO' AND Event = 'CLICK' ; GOSUB LU_CustPart CASE CtrlEntID = @WINDOW:'.LU_WFR_ID' AND Event = 'CLICK' ; GOSUB LU_WfrID CASE CtrlEntID = @WINDOW:'.SIGN_BUTTON' AND Event = 'CLICK' ; GOSUB Sign CASE CtrlEntID = @WINDOW:'.WAFER_HELP' AND Event = 'CLICK' ; GOSUB WaferHelp CASE 1 ErrorMsg = 'Unknown Instruction passed to routine':CRLF$:CtrlEntID:' - ':Event END CASE IF ErrorMsg NE '' THEN ErrMsg(ErrTitle:@SVM:ErrorMsg) END RETURN Result * * * * * * * Create: * * * * * * * obj_Appwindow('Create',@WINDOW) GOSUB Refresh RETURN * * * * * * * Read: * * * * * * * TestRec = Get_Property(@WINDOW,'RECORD') CONVERT @FM TO '' IN TestRec IF TestRec = '' THEN Set_Property(@WINDOW,'@NEW_RECORD',1) END ReactNo = Get_Property(@WINDOW:'.REACT_NO','DEFPROP') ReactType = XLATE('REACTOR',ReactNo,REACTOR_REACT_TYPE$,'X') WfrIDs = Get_Property(@WINDOW:'.WAFER_ID','DEFPROP')<1> CONVERT @VM TO ' ' IN WfrIDs WfrIDs = TRIM(WfrIDs) CONVERT ' ' TO @VM in WfrIDs WfrCnt = COUNT(WfrIDs,@VM) + (WfrIDs NE '') Ctrls = @WINDOW:'.WINDOW_LABEL_FIX':@RM ; Props = 'TEXT':@RM Ctrls := @WINDOW:'.PROD_TEST_GROUP':@RM ; Props := 'TEXT':@RM Ctrls := @WINDOW:'.LU_WFR_ID':@RM ; Props := 'ENABLED'@RM Ctrls := @WINDOW:'.TW_QTY':@RM ; Props := 'DEFPROP':@RM Ctrls := @WINDOW:'.TW_CODE':@RM ; Props := 'DEFPROP':@RM Ctrls := @WINDOW:'.TW_TYPE':@RM ; Props := 'DEFPROP':@RM Ctrls := @WINDOW:'.TOOL' ; Props := 'DEFPROP' IF ReactType = 'GAN' THEN CurrVals = Get_Property(Ctrls,Props) CurrLabel = CurrVals[1,@RM] CurrGroup = CurrVals[COL2()+1,@RM] CurrEnable = CurrVals[COL2()+1,@RM] CurrQty = CurrVals[COL2()+1,@RM] CurrCode = CurrVals[COL2()+1,@RM] CurrType = CurrVals[COL2()+1,@RM] CurrTool = CurrVals[COL2()+1,@RM] Vals = 'GaN Char Wafer':@RM Vals := 'GaN Characterization Wafers':@RM Vals := '0':@RM IF CurrQty = '' THEN Qty = WfrCnt ELSE Qty = CurrQty IF CurrCode = '' THEN Code = '3' ELSE Code = CurrCode IF CurrType = '' THEN Type = 'PROD' ELSE Type = CurrType IF CurrTool = '' THEN Tool = 'GaN Char' ELSE Tool = CurrTool Vals := Qty:@RM Vals := Code:@RM Vals := Type:@RM Vals := Tool END ELSE Vals = 'Test Wafer':@RM Vals := 'Product Test Wafers':@RM Vals := '1':@RM Vals := '':@RM Vals := '':@RM Vals := '':@RM Vals := '' END ;* End of check for GAN reactor Set_Property(Ctrls,Props,Vals) GOSUB Refresh Return * * * * * * * Write: * * * * * * * Forward_Event() Post_Event(@WINDOW,'CLOSE') Return * * * * * * * Clear: * * * * * * * obj_AppWindow('ReadOnly',@RM:1) ;* Reenables data bound controls Set_Property(@WINDOW,'@READONLY',0) ;* Clear flag on window GOTO Refresh RETURN * * * * * * * Close: * * * * * * * obj_Appwindow('DetailReturn') RETURN * * * * * * * Delete: * * * * * * * DEBUG RETURN IF MemberOf(@USER4, 'OI_SUPERUSER') OR MemberOf( @USER4, 'SUPERVISOR' ) OR MemberOf( @USER4, 'LEAD' ) ELSE MsgInfo = '' MsgInfo = '!' MsgInfo = 'You must be a Supervisor OR a Lead to Remove a Test Wafer record.' Void = Msg( '', MsgInfo ) RETURN END Ctrls = @WINDOW:'.MET_NO':@RM ; Props = 'DEFPROP':@RM Ctrls := @WINDOW:'.TW_NO':@RM ; Props := 'DEFPROP':@RM Ctrls := @WINDOW:'.WAFER_ID' ; Props := 'DEFPROP' Vals = Get_Property(Ctrls,Props) MetNo = Vals[1,@RM] TWNo = Vals[COL2()+1,@RM] WaferIDs = Vals[COL2()+1,@RM] LOOP UNTIL WaferIDs[-1,1] NE @VM OR WaferIDs = '' WaferIDs[-1,1] = '' REPEAT IF WaferIDs NE '' THEN RDSNo = Get_Property(@WINDOW:'.RDS_NO','DEFPROP') MetNo = Get_Property(@WINDOW:'.MET_NO','DEFPROP') TWNo = Get_Property(@WINDOW:'.TW_NO','DEFPROP') *TWUseKey = MetNo:'*':TWNo ;* Key changed to TWNo only in TEST_WAFER table * * * * Added 3/24/2016 JCH - wafer history * * * * wCnt = COUNT(WaferIDs,@VM) + (WaferIDs NE '') FOR W = 1 TO wCnt WfrID = WaferIDs<1,W> CONVERT '.' TO '*' IN WfrID Event = 'TEST' Parms = Event:@RM:WfrID obj_WO_Wfr('RemEvent',Parms) ;* This is untested JCH 6/28/2016 NEXT W * * * * * End of update * * * * * RRRec = XLATE('REACT_RUN',RDSNo,'','X') ReactType = XLATE('REACTOR',RRRec,1,'X') FirstWafer = WaferIDs<1,1> WONo = FirstWafer[1,'.'] CassNo = FirstWafer[COL2()+1,'.'] WaferID = '' ;* Pass null to remove all references to this TW_USE record IF ReactType = 'EPP' THEN obj_WM_In('RepProdTW',WONo:@RM:CassNo:@RM:MetNo:'*':TWNo:@RM:WaferID) END ELSE obj_WO_Mat('RepProdTW',WONo:@RM:CassNo:@RM:TWNo:@RM:WaferID) END END Forward_Event() Result = 0 Post_Event(@WINDOW,'CLOSE') RETURN * * * * * * * New: * * * * * * * CurrTWNo = Get_Property(@WINDOW:'.TW_NO','DEFPROP') IF CurrTWNo NE '' THEN RETURN TWNo = NextKey('TEST_WAFER') obj_Appwindow('LUValReturn',TWNo:@RM:@WINDOW:'.TW_NO') RETURN * * * * * * * Refresh: * * * * * * * Ctrls = @WINDOW:'.TW_QTY':@RM ; Props = 'DEFPROP':@RM Ctrls := @WINDOW:'.TW_CODE':@RM ; Props := 'DEFPROP':@RM Ctrls := @WINDOW:'.TOOL':@RM ; Props := 'DEFPROP':@RM Ctrls := @WINDOW:'.TW_TYPE':@RM ; Props := 'DEFPROP':@RM Ctrls := @WINDOW:'.CUST_TW_PART_NO':@RM ; Props := 'DEFPROP':@RM Ctrls := @WINDOW:'.WAFER_ID':@RM ; Props := 'ARRAY':@RM Ctrls := @WINDOW:'.SIGNATURE' ; Props := 'DEFPROP' Vals = Get_Property(Ctrls,Props) TWQty = Vals[1,@RM] TWCode = Vals[COL2()+1,@RM] Tool = Vals[COL2()+1,@RM] TWType = Vals[COL2()+1,@RM] CustTWPartNo = Vals[COL2()+1,@RM] WaferIDs = Vals[COL2()+1,@RM] Signature = Vals[COL2()+1,@RM] LOOP WaferID = WaferIDs[-1,'B':@VM] UNTIL WaferID NE '' OR WaferIDs = '' WaferIDs[-1,1] = '' REPEAT IF Signature = '' THEN OKToSign = 1 TestWaferIDs = Get_Property(@WINDOW:'.WAFER_ID','DEFPROP') CONVERT @VM TO '' IN TestWaferIDs Ctrls = @WINDOW:'.TOOL':@RM ; Props = 'ENABLED':@RM Ctrls := @WINDOW:'.TW_TYPE':@RM ; Props := 'ENABLED':@RM Ctrls := @WINDOW:'.LU_TOOL':@RM ; Props := 'ENABLED':@RM Ctrls := @WINDOW:'.LU_TW_TYPE' ; Props := 'ENABLED' IF TWCode = 99 AND TWQty = 0 THEN Vals = 0:@RM:0:@RM:0:@RM:0 END ELSE Vals = 1:@RM:1:@RM:1:@RM:1 end Set_Property(Ctrls,Props,Vals) BEGIN CASE CASE (TWCode = '99' OR TWCode = '98') AND TWQty = 0 ; NULL CASE (TWCode = '99' OR TWCode = '98') AND TWQty NE 0 ; OKToSign = 0 CASE TWQty = '' ; OKToSign = 0 CASE TWCode = '' ; OKToSign = 0 CASE TWType = '' ; OKToSign = 0 CASE TWType = 'PROD' AND TestWaferIDs = '' ; OKToSign = 0 END CASE Set_Property(@WINDOW:'.SIG_GROUP','ENABLED',OKToSign) ;* Required parameters met TWType = Get_Property(@WINDOW:'.TW_TYPE','DEFPROP') IF TWType = 'CUST' THEN Set_Property(@WINDOW:'.CUST_TW_GROUP','ENABLED',1) END ELSE Set_Property(@WINDOW:'.CUST_TW_GROUP','ENABLED',0) END END IF TWType = 'PROD' AND Signature = '' THEN Set_Property(@WINDOW:'.PROD_TEST_GROUP','ENABLED',1) END ELSE IF MemberOf(@USER4, 'OI_SUPERUSER') THEN Set_Property(@WINDOW:'.PROD_TEST_GROUP','ENABLED',1) END ELSE Set_Property(@WINDOW:'.PROD_TEST_GROUP','ENABLED',0) END END * 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) * 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 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,GREEN$) NEXT N END NEXT Line NEXT I RETURN * * * * * * * TWQtyLF: * * * * * * * Ctrls = @WINDOW:'.TW_QTY':@RM ; Props = 'DEFPROP':@RM Ctrls := @WINDOW:'.TW_CODE' ; Props := 'DEFPROP' Vals = Get_Property(Ctrls,Props) TWQty = Vals[1,@RM] TWType = Vals[COL2()+1,@RM] IF TWQty = 0 AND TWType = '' THEN TypeOver = '' TypeOver = 'WITH SEQ = "99" "98" BY SEQ' TWCode = Popup(@WINDOW,TypeOver,'TW_CODES') IF TWCode = '' OR TWCode = CHAR(27) THEN RETURN Set_Property(@WINDOW:'.TW_CODE','DEFPROP',TWCode) END GOSUB Refresh RETURN * * * * * * * TWTypeLF: * * * * * * * Ctrls = @WINDOW:'.TW_QTY':@RM ; Props = 'DEFPROP':@RM Ctrls := @WINDOW:'.TW_CODE' ; Props := 'DEFPROP' Vals = Get_Property(Ctrls,Props) TWQty = Vals[1,@RM] TWType = Vals[COL2()+1,@RM] IF TWQty NE 0 AND (TWType = 99 OR TWType = 98)THEN ErrMsg('TW Qty must be "0" when using TW Type "99" or "98".') Set_Property(@WINDOW:'TW_CODE','FOCUS',1) END GOSUB Refresh RETURN * * * * * * * TWTypeGF: * * * * * * * Ctrls = @WINDOW:'.TW_TYPE':@RM ; Props = 'DEFPROP':@RM Ctrls := @WINDOW:'.WAFER_ID' ; Props := 'ARRAY' Vals = Get_Property(Ctrls,Props) TWType = Vals[1,@RM] WaferIDs = Vals[COL2()+1,@RM] NoChange = 0 IF TWType = 'PROD' THEN CONVERT @FM:@VM TO '' IN WaferIDs IF WaferIDs NE '' THEN Msg(@WINDOW,'','TW_TYPE_CHANGE') NoChange = 1 END END RETURN * * * * * * * LU_TWCode: * * * * * * * Result = Popup(@WINDOW,'','SHOW_TW_CODES') IF Result NE '' THEN Parms = Result:@RM:@WINDOW:'.TW_CODE':@RM:'' obj_Appwindow('LUValReturn',Parms ) END GOSUB Refresh RETURN * * * * * * * LU_TWType: * * * * * * * GOSUB TWTypeGF IF NoChange = 1 THEN RETURN Result = Popup(@WINDOW,'','TW_TYPES') IF Result NE '' THEN Parms = Result:@RM:@WINDOW:'.TW_TYPE':@RM:'' obj_Appwindow('LUValReturn',Parms ) END GOSUB Refresh RETURN * * * * * * * LU_Tool: * * * * * * * Result = Popup( @WINDOW, '', 'CHOOSE_TOOL' ) IF Result NE '' THEN Parms = Result:@RM:@WINDOW:'.TOOL':@RM:'' obj_Appwindow('LUValReturn',Parms ) END RETURN * * * * * * * LU_CustPart: * * * * * * * CustNo = Get_Property(@WINDOW:'.CUST_NO','DEFPROP') IF CustNo NE '' THEN SearchString = 'CUST_NO':@VM:CustNo:@FM OPEN 'DICT.CUST_TW_PART' TO DictVar ELSE ErrMsg('Unable to open DICT.CUST_TW_PART for index lookup.') RETURN END Options = '' Flag = '' BTREE.EXTRACT(SearchString, 'CUST_TW_PART', DictVar, CustTWPartKeys, Options, flag) IF Get_Status(errCode) THEN ErrMsg(errCode) RETURN END IF CustTWPartKeys = '' THEN ErrMsg('No TW Part Numbers on file for Customer ':QUOTE(CustNo):'.') RETURN END TypeOver = '' TypeOver = CustTWPartKeys TypeOver = 1 ;* Single select CustTWPartKey = Popup(@WINDOW,TypeOver,'CUST_TW_PART') CustTWPartNo = CustTWPartKey[-1,'B*'] IF CustTWPartNo NE '' THEN Parms = CustTWPartNo:@RM:@WINDOW:'.CUST_TW_PART_NO':@RM:'' obj_Appwindow('LUValReturn',Parms ) END END ;* End of check for null Customer number RETURN * * * * * * * LU_WfrID: * * * * * * * Ctrls = @WINDOW:'.MET_NO':@RM ; Props = 'DEFPROP':@RM Ctrls := @WINDOW:'.TW_NO':@RM ; Props := 'DEFPROP':@RM Ctrls := @WINDOW:'.RDS_NO':@RM ; Props := 'DEFPROP':@RM Ctrls := @WINDOW:'.TW_QTY':@RM ; Props := 'DEFPROP':@RM Ctrls := @WINDOW:'.ZONE' ; Props := 'DEFPROP' Vals = Get_Property(Ctrls,Props) MetNo = Vals[1,@RM] TWNo = Vals[COL2()+1,@RM] RDSNo = Vals[COL2()+1,@RM] TWQty = Vals[COL2()+1,@RM] Zone = Vals[COL2()+1,@RM] IF MetNo = '' THEN RETURN IF TWNo = '' THEN RETURN IF RDSNo = '' THEN RETURN *TWUseKey = MetNo:'*':TWNo ;* Changed to TWNo only for TEST_WAFER table RRRec = XLATE('REACT_RUN',RDSNo,'','X') WONo = RRRec CassNo = RRRec Pockets = RRRec Zones = RRRec PocketCnt = COUNT(Pockets,@VM) + (Pockets NE '') ProdTestArray = '' IF PocketCnt > 0 THEN * * * EpiPRO * * * Display = '' LineCnt = 0 FOR I = 1 TO PocketCnt a1PktChar = RRRec a1WfrChar = RRRec a1WfrZone = RRRec IF RRRec = 'TEST' AND RRRec = 'PROD' AND RRRec = Zone THEN LineCnt += 1 Display<1,LineCnt,1> = Pockets<1,I> Display<1,LineCnt,2> = RRRec Display<1,LineCnt,3> = RRRec Display<1,LineCnt,4> = RRRec Display<1,LineCnt,5> = WONo:'.':RRRec:'.':RRRec Display<1,LineCnt,6> = RRRec:'.':RRRec END NEXT I IF Display = '' THEN ErrMsg('No Product Test Wafer configured in this zone during EpiPRO Load.') RETURN END TypeOver = '' TypeOver = Display LOOP WaferIDs = Popup(@WINDOW,TypeOver,'REACT_EPI_PRO_TW_LOAD') WaferIDCnt = COUNT(WaferIDs,@VM) + (WaferIDs NE '') UNTIL WaferIDCnt = TWQty Response = Msg(@WINDOW,'','PROD_TEST_QTY_ERROR','',WaferIDCnt:@FM:TWQty) IF Response = CHAR(27) THEN RETURN REPEAT IF WaferIDCnt > 0 THEN ProdTestArray = '' RemDTM = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS') WfrIds = '' FOR N = 1 TO WaferIDCnt WaferID = WaferIDs<1,N> SrcCassNo = Field(WaferID,'.',2) SlotNo = Field(WaferID,'.',3) If SlotNo = '' Then Recipients = 'DAN_CR' SentFrom = @USER4 Subject = 'TEST_WAFER - EpiPRO':TWNo Message = 'WfrID = ':QUOTE(WONo:'*':CassNo:'*':SlotNo):CRLF$:WaferIDs AttachWindow = 'TEST_WAFER' AttachKey = TWNo SendToGroup = '' Parms = Recipients:@RM:SentFrom:@RM:Subject:@RM:Message:@RM:AttachWindow:@RM:AttachKey:@RM:SendToGroup obj_Notes('Create',Parms) END * * * * Added 3/24/2016 JCH - wafer history * * * * WfrID = WONo:'*':SrcCassNo:'*':SlotNo WfrIDs<1,-1> = WfrID CurrLocs = obj_WO_Wfr('CurrLoc',WfrID:@RM:'') ;* Added 10/3/2016 JCH CurrSlotID = CurrLocs<1,2> ;* Added 10/3/2016 JCH CurrTool = CurrLocs<1,3> ;* Added 10/3/2016 JCH CurrInvLoc = CurrLocs<1,4> ;* Added 10/3/2016 JCH Parms = WONo:'*':SrcCassNo:'*':SlotNo:@RM ;* WfrID Parms := RemDTM:@RM ;* EventDtm Parms := @USER4:@RM ;* EventBy Parms := 'TEST':@RM ;* Event Parms := '':@RM ;* NewSlotID Parms := '':@RM ;* RunLoc Parms := '':@RM ;* NCRNo Parms := TWNo:@RM ;* TEST_WAFER No Parms := CurrSlotID:@RM ;* CurrSlotID Parms := '':@RM ;* NewToolID Parms := CurrTool:@RM ;* CurrToolID Parms := '':@RM ;* NewInvLoc Parms := CurrInvLoc:@RM ;* CurrInvLoc Parms := 'O' ;* Inbound or Outbound Wafers obj_WO_Wfr('AddEvent',Parms) * * * * * End of Update * * * * * * Set_Status(0) ProdTestArray<1,N> = obj_WM_IN('RemProdTW',WONo:@RM:SrcCassNo:@RM:TWNo:@RM:SlotNo) ;* Add metrology number to each selected slot IF Get_Status(errCode) THEN ErrMsg(errCode) * Back out logic here END NEXT N /* IF WfrIDs NE '' THEN Parms = WfrIDs:@RM ;* WfrIDs - mv Parms := RemDTM:@RM ;* EventDtm Parms := @USER4:@RM ;* EventBy Parms := 'TEST':@RM ;* Event Parms := '':@RM ;* NewSlotIDs - mv Parms := '':@RM ;* RunLocs - mv Parms := '':@RM ;* NCRNo Parms := TWNo:@RM ;* TEST_WAFER No Parms := '':@RM ;* CurrSlotIDs - mv Parms := '':@RM ;* NewToolID Parms := '':@RM ;* CurrToolID Parms := '':@RM ;* NewInvLoc Parms := '':@RM ;* CurrInvLoc Parms := 'O' ;* Inbound or Outbound Wafers obj_WO_Wfr('AddEvent',Parms) END */ END END ELSE WOMatRec = XLATE('WO_MAT',WONo:'*':CassNo,'','X') SlotMetNos = WOMatRec SlotNCRNos = WOMatRec SlotWaferIDs = obj_WO_Mat('SlotWaferIDs',WONo:'*':CassNo) ;* Get list of available wafers in cassette WaferIDCnt = COUNT(SlotWaferIDs,@VM) + (SlotWaferIDs NE '') PopupDisplay = '' CurrTWUseCnt = 0 FOR N = 1 TO WaferIDCnt PopupDisplay<1,N,1> = N PopupDisplay<1,N,2> = SlotWaferIDs<1,N> PopupDisplay<1,N,3> = SlotNCRNos<1,N> PopupDisplay<1,N,4> = SlotMetNos<1,N> IF SlotMetNos<1,N> = MetNo:'*':TWNo THEN CurrTWUseCnt += 1 ;* Test Wafers already pulled from the box for this TW_USE NEXT N TypeOver = '' TypeOver = PopupDisplay TypeOver = 2 LOOP WaferIDs = Popup(@WINDOW,TypeOver,'SELECT_PROD_TEST') IF WaferIDs = '' OR WaferIDs = CHAR(27) THEN RETURN WaferIDCnt = COUNT(WaferIDs,@VM) + (WaferIDs NE '') UNTIL WaferIDCnt + CurrTWUseCnt = TWQty Response = Msg(@WINDOW,'','PROD_TEST_QTY_ERROR','',WaferIDCnt:@FM:TWQty) IF Response = CHAR(27) THEN RETURN REPEAT SlotNos = '' FOR N = 1 TO WaferIDCnt WaferID = WaferIDs<1,N> IF WaferID = '' THEN ErrMsg('Select slots must contain a Wafer ID.') RETURN END ELSE SlotNos<1,-1> = Field(WaferID,'.',3) END NEXT N * * * * Added 3/24/2016 JCH - wafer history * * * * RemDTM = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS') sCnt = COUNT(SlotNos,@VM) + (SlotNos NE '') FOR S = 1 TO Scnt SlotNo = SlotNos<1,S> If SlotNo = '' Then Recipients = 'DAN_CR' SentFrom = @USER4 Subject = 'TW_USE non EpiPRO':TWNo Message = 'WfrID = ':QUOTE(WONo:'*':CassNo:'*':SlotNo):CRLF$:WaferIDs AttachWindow = 'TEST_WAFER' AttachKey = TWNo SendToGroup = '' Parms = Recipients:@RM:SentFrom:@RM:Subject:@RM:Message:@RM:AttachWindow:@RM:AttachKey:@RM:SendToGroup obj_Notes('Create',Parms) END WfrID = WONo:'*':CassNo:'*':SlotNo CurrLocs = obj_WO_Wfr('CurrLoc',WfrID:@RM:'') ;* Added 10/3/2016 JCH CurrSlotID = CurrLocs<1,2> ;* Added 10/3/2016 JCH CurrTool = CurrLocs<1,3> ;* Added 10/3/2016 JCH CurrInvLoc = CurrLocs<1,4> ;* Added 10/3/2016 JCH Parms = WfrID:@RM ;* WfrID Parms := RemDTM:@RM ;* EventDtm Parms := @USER4:@RM ;* EventBy Parms := 'TEST':@RM ;* Event Parms := '':@RM ;* NewSlotID Parms := '':@RM ;* RunLoc Parms := '':@RM ;* NCRNo Parms := TWNo:@RM ;* TWfrNo Parms := CurrSlotID:@RM ;* CurrSlotID Parms := '':@RM ;* NewToolID Parms := CurrTool:@RM ;* CurrToolID Parms := '':@RM ;* NewInvLoc Parms := CurrInvLoc:@RM ;* CurrInvLoc Parms := 'O' ;* Inbound or Outbound Wafers ;* CurrSlotID obj_WO_Wfr('AddEvent',Parms) NEXT S Set_Status(0) ProdTestArray = obj_WO_Mat('RemProdTW',WONo:@RM:CassNo:@RM:TWNo:@RM:SlotNos:@RM:'1') IF Get_Status(errCode) THEN ErrMsg(errCode) * Back out logic here END END ;* End of check for EpiPRO pocket load data CurrProdTestArray = Get_Property(@WINDOW:'.WAFER_ID','ARRAY') NewProdTestArray = '' Position = 1 Flag = "" LOOP REMOVE CurrWfrID FROM CurrProdTestArray AT Position SETTING FLAG WHILE Flag IF CurrWfrID NE '' THEN LOCATE CurrWfrID IN ProdTestArray BY 'AR' USING @VM SETTING Pos ELSE ProdTestArray = INSERT(ProdTestArray,1,Pos,0,CurrWfrID) END END REPEAT IF ProdTestArray NE '' THEN Set_Property(@WINDOW:'.WAFER_ID','ARRAY',ProdTestArray:@VM:@VM:@VM) GOSUB Refresh RETURN * * * * * * * InsertWaferID: * * * * * * * RowIndex = Parm1 void = Send_Message(CtrlEntID, 'DELETE', RowIndex) ErrMsg('Use "Select Wafers" button on window to add additional wafers.') RETURN * * * * * * * DeleteWaferID: * * * * * * * RowIndex = Parm1 WaferID = Parm2 RETURN MsgHead = 'Replace Product Test Wafer in Cassette' MsgText = 'Are you sure you wish to place wafer ':WaferID:' back into the product cassette?' OK = Msg(@WINDOW,'','YESNO','',MsgHead:@FM:MsgText) IF OK THEN RDSNo = Get_Property(@WINDOW:'.RDS_NO','DEFPROP') MetNo = Get_Property(@WINDOW:'.MET_NO','DEFPROP') TWNo = Get_Property(@WINDOW:'.TW_NO','DEFPROP') *TWUseKey = MetNo:'*':TWNo RRRec = XLATE('REACT_RUN',RDSNo,'','X') ReactType = XLATE('REACTOR',RRRec,1,'X') WONo = WaferID[1,'.'] CassNo = WaferID[COL2()+1,'.'] * * * * Added 3/24/2016 JCH - wafer history * * * * WfrID = WaferID CONVERT '.' TO '*' IN WfrID Parms = WfrID:@RM Parms := 'TEST' obj_WO_Wfr('RemEvent',Parms) * * * * * End of wafer history update * * * * * IF ReactType = 'EPP' THEN * * * EpiPRO Box * * * ***********************************************************8 obj_WM_In('RepProdTW',WONo:@RM:CassNo:@RM:MetNo:'*':TWNo:@RM:WaferID) END ELSE obj_WO_Mat('RepProdTW',WONo:@RM:CassNo:@RM:MetNo:'*':TWNo:@RM:WaferID) END END ELSE Send_Message(CtrlEntID,'INSERT',RowIndex,WaferID) END RETURN * * * * * * * Sign: * * * * * * * Valid = Dialog_Box( 'QUOTE_SIG_PWD_ENTRY', @WINDOW, @USER4:@VM:XLATE( 'LSL_USERS', @USER4, LSL_USERS_PASSWORD$, 'X' ) ) IF Valid THEN CurrDTM = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS') Set_Property(@WINDOW:'.SIGNATURE','DEFPROP',@USER4) Set_Property(@WINDOW:'.SIG_DTM','DEFPROP',CurrDTM) /* * From the RDS_TEST window code - save just in case they want it back! * CurrDTM = ICONV(CurrDTM,'DT') ReactNo = Get_Property(@WINDOW:'.REACTOR','DEFPROP') OutOfProdDTM = XLATE('REACT_STATUS',ReactNo,REACT_STATUS_OUT_OF_PROD_DTM$,'X') HrsSinceProd = OCONV((CurrDTM - OutOfProdDTM)*24,'MD2') Parms = HrsSinceProd:@RM:CtrlEntId:@RM:ColPointer+2:@FM:LinePointer ;* Hours Since Production obj_Appwindow('LUValReturn',Parms ) EscHrs = XLATE('REACTOR',ReactNo,'ACT_ESC_HRS','X') IF EscHrs = '' THEN EscHrs = 0 EscElapsedTime = OCONV(EscHrs,'MD2') Parms = EscElapsedTime:@RM:CtrlEntId:@RM:ColPointer+3:@FM:LinePointer ;* Hours in Escalation obj_Appwindow('LUValReturn',Parms ) */ END GOSUB Refresh RETURN * * * * * * * WaferHelp: * * * * * * * Msg(@WINDOW,'','TW_USE_WAFER_HELP') RETURN