open-insight/LSL2/STPROC/COMM_REACT_RUN.txt
Infineon\Mitchem 741a8450e3 Removed referenced to QUOTE_SIG_PWD_ENTRY and
replaced with NDW_VERIFY_USER. Added barcode
scan function to NDW_VERIFY_USER.

fixed two instances of ohms square unit characters being garbled by git

minor modification to NDW_VERIFY_USER_EVENTS lost focus events

minor change to gotfocus event logic
2025-04-09 12:49:28 -07:00

1815 lines
45 KiB
Plaintext

COMPILE FUNCTION Comm_React_Run(Instruction,Parm1,Parm2)
#pragma precomp SRP_PreCompiler
/*
Template Commuter module for REACT_RUN (Reactor Run) window
02/21/2008 - 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 obj_RDS_Test, Print_Control_Plan, Print_RDS_Instruction, Send_Info, Post_Event
DECLARE FUNCTION Get_Property, Get_Status, Dialog_Box, Utility, Center_Window, Popup, Collect.Ixvals
DECLARE FUNCTION Send_Message, Msg, Security_Check, RowExists, NextKey, obj_React_Esc, obj_React_Run
DECLARE FUNCTION obj_RDS_Test, MemberOf, Create_Dialog, obj_Popup, obj_WO_Wfr
$INSERT MSG_EQUATES
$INSERT APPCOLORS
$INSERT LSL_USERS_EQU
$INSERT SECURITY_RIGHTS_EQU
$INSERT REACT_EVENT_EQUATES
$INSERT REACT_RUN_EQUATES
$INSERT WO_STEP_EQU
$INSERT WO_MAT_EQUATES
$INSERT WO_WFR_WIP_EQUATES
$INSERT EPI_SUSCEPTOR_EQUATES
$INSERT REACTOR_EQUATES
$INSERT RTI_STYLE_EQUATES
$INSERT POPUP_EQUATES
$INSERT LOGICAL
EQU CRLF$ TO \0D0A\
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$CHAR_WFR_ID TO 1
EQU COL$SCRIBE TO 2
EQU COL$SPLIT_BY TO 3
EQU COL$SPLIT_DTM TO 4
EQU COL$CURR_STAGE TO 5
EQU COL$CHAR_DEST TO 6
EQU COL$CHAR_TW_NO TO 7
EQU COL$CHAR_WFR_STATUS TO 8
EQU COL$CARR_SLOG_NO TO 1
EQU COL$CARR_WFR_ID TO 2
EQU COL$CARR_SCRIBE TO 3
EQU COL$CARR_CHAR_FLAG TO 4
EQU COL$CARR_NCR TO 5
EQU COL$CARR_GRADE TO 6
EQU COL$SIG_PROF TO 1
EQU COL$SIGNATURE TO 2
EQU COL$SIG_DTM TO 3
EQU COL$STAGE_COMMENT TO 4
EQU COL$STAGE_STATUS TO 5
EQU COL$SUSC_LOAD_WFR_ID TO 6 ;* SUSC_LOAD control
EQU COL$SUSC_LOAD_WFR_SCRIBE TO 7
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
ErrCode = ''
ErrorMsg = ''
ErrTitle = 'Error in Comm_React_Run'
Result = ''
BEGIN CASE
CASE Instruction = 'Create' ; GOSUB Create
CASE Instruction = 'Refresh' ; GOSUB Refresh
CASE Instruction = 'Page' ; GOSUB Page
CASE Instruction = 'VScroll' ; GOSUB VScroll
CASE Instruction = 'Read' ; GOSUB Read
CASE Instruction = 'Write' ; GOSUB Write
CASE Instruction = 'Clear' ; GOSUB Clear
CASE Instruction = 'Delete' ; GOSUB Delete
CASE Instruction = 'Close' ; GOSUB Close
CASE Instruction = 'RDSNoLF' ; GOSUB RDSNoLF
CASE Instruction = 'CIClick' ; GOSUB CIClick
CASE Instruction = 'LURDSNo' ; GOSUB LURDSNo
CASE Instruction = 'LUReactNo' ; GOSUB LUReactNo
CASE Instruction = 'LUReactEsc' ; GOSUB LUReactEsc
CASE Instruction = 'CopyMetrology' ; GOSUB CopyMetrology
CASE Instruction = 'LSIdDC' ; GOSUB LSIdDC
CASE Instruction = 'AddZoneMet' ; GOSUB AddZoneMet
CASE Instruction = 'MoveMetToZone' ; GOSUB MoveMetToZone
CASE Instruction = 'ViewWOMat' ; GOSUB ViewWOMat
CASE Instruction = 'SendMsg' ; GOSUB SendMsg
CASE Instruction = 'CtrlPlanClick' ; GOSUB CtrlPlanClick
CASE Instruction = 'ViewPSN' ; GOSUB ViewPSN
CASE Instruction = 'PrintInstruction' ; GOSUB PrintInstruction
CASE Instruction = 'SignSuppl' ; GOSUB SignSuppl
CASE Instruction = 'SignFinalQA' ; GOSUB SignFinalQA
CASE Instruction = 'SigProfileClick' ; GOSUB SigProfileClick
CASE Instruction = 'ViewWO' ; GOSUB ViewWO
CASE Instruction = 'CharWfrDC' ; GOSUB CharWfrDC
CASE Instruction = 'CarrWfrDC' ; GOSUB CarrWfrDC
CASE Instruction = 'CharWfrOptions' ; GOSUB CharWfrOptions
CASE Instruction = 'SplitClick' ; GOSUB SplitClick
CASE Instruction = 'DispoClick' ; GOSUB DispoClick
CASE Instruction = 'LURunPri' ; GOSUB LURunPri
CASE Instruction = 'EditScribe' ; GOSUB SUSC_LOAD.OPTIONS
* CASE EntID = @WINDOW:'.SUSC_LOAD' AND Event = 'OPTIONS' ; GOSUB SUSC_LOAD.OPTIONS
CASE 1
ErrorMsg = 'Unknown Instruction ':QUOTE(Instruction):' passed to routine.'
ErrMsg(ErrorMsg)
END CASE
IF ErrorMsg NE '' THEN
ErrMsg(ErrTitle:@SVM:ErrorMsg)
END
RETURN Result
* * * * * * *
Create:
* * * * * * *
/*
IF NOT(Security_Check('Reactor Event Log',READ$)) THEN
Security_Err_Msg('Reactor Event Log',READ$)
End_Window(@WINDOW)
RETURN
END
*/
obj_Appwindow('Create',@WINDOW)
* Provides compatibility with the existing messaging attachment system
IF Parm1 NE '' THEN
PassedKeys = FIELD(Parm1,'*',1)
obj_Appwindow('ViewRelated',@WINDOW:@RM:PassedKeys)
END
*
/*
ReactorStyles = Send_Message(@WINDOW:'.REACTOR_LOAD','COLSTYLE',0,'')
ReactorStyles<COL$USAGE> = BitOr(ReactorStyles<COL$USAGE>,DROPDOWN_STYLE$)
Send_Message(@WINDOW:'.REACTOR_LOAD','COLSTYLE',0,ReactorStyles)
Send_Message(@WINDOW:'.REACTOR_LOAD','COLFORMAT',COL$USAGE,@VM:'TEST':@VM:'PROD':@VM:'DUMMY')
*/
CharStyles = Send_Message(@WINDOW:'.CHAR_WFR_ID','COLSTYLE',0,'') ;* Get All Styes
CharStyles<COL$CHAR_WFR_ID> = BitOr(CharStyles<COL$CHAR_WFR_ID>,DTCS_OPTIONSBUTTON$) ;* Set column to Dropdown
Send_Message(@WINDOW:'.CHAR_WFR_ID','COLSTYLE',0,CharStyles) ;* Set Col Styles
SuscLoadStyles = Send_Message(@WINDOW:'.SUSC_LOAD','COLSTYLE',0,'')
SuscLoadStyles<COL$SUSC_LOAD_WFR_SCRIBE> = BitOr(SuscLoadStyles<COL$SUSC_LOAD_WFR_SCRIBE>,DTCS_OPTIONSBUTTON$)
void = Send_Message(@WINDOW:'.SUSC_LOAD','COLSTYLE',0,SuscLoadStyles)
CarrStyles = Send_Message(@WINDOW:'.CARR_WFR_ID','COLSTYLE',0,'')
CarrStyles<COL$CARR_CHAR_FLAG> = BitOr(CarrStyles<COL$CARR_CHAR_FLAG>,DTCS_CHECKBOX$)
CarrStyles<COL$CARR_CHAR_FLAG> = BitOr(CarrStyles<COL$CARR_CHAR_FLAG>,DTCS_CHECKBOXCENTER$)
void = Send_Message(@WINDOW:'.CARR_WFR_ID','COLSTYLE',0,CarrStyles)
Set_Property(@WINDOW:'.CANCELLED','ENABLE',0)
GOSUB Refresh
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:
* * * * * * *
RDSNo = Get_Property(@WINDOW:'.RDS_NO','DEFPROP')
CharWfrData = Get_Property(@WINDOW:'.CHAR_WFR_ID','DEFPROP')
CharWfrIDs = CharWfrData<COL$CHAR_WFR_ID>
WfrSigKeys = obj_React_Run('GetNextWfrStage',RDSNo:@RM:CharWfrIDs)
IF Get_Status(errCode) THEN
ErrMsg(errCode)
DEBUG
END
RunPri = Get_Property(@WINDOW:'.RUN_PRI','DEFPROP')
BEGIN CASE
CASE RunPri = 'P1' ; PriBackColor = PR1_RED$
CASE RunPri = 'P2' ; PriBackColor = PR2_RED$
CASE RunPri = 'P3' ; PriBackColor = PR3_RED$
CASE 1 ; PriBackColor = GREEN$
END CASE
Set_Property(@WINDOW:'.RUN_PRI_DESC','BACKCOLOR',PriBackColor)
* * * * * * * * * * * * * * * * Original code below here needs a serious review JCH * * * * * *& * * * * * * * *
SuppInst = Get_Property(@WINDOW:'.SUPP_INST','TEXT')
SuppSig = Get_Property(@WINDOW:'.SUPP_SIG','TEXT')
Ctrls = @WINDOW:'.SUPP_SIG':@RM ; Props = 'BACKCOLOR':@RM
Ctrls := @WINDOW:'.SUPP_SIG_DTM':@RM ; Props := 'BACKCOLOR':@RM
Ctrls := @WINDOW:'.SUPP_SIG_BUTTON':@RM ; Props := 'ENABLED':@RM
Ctrls := @WINDOW:'..NEEDS_ATTENTION':@RM ; Props := 'TEXT':@RM
Ctrls := @WINDOW:'..NEEDS_ATTENTION' ; Props := 'VISIBLE'
IF SuppSig = '' THEN
Vals = WHITE$:@RM
Vals := WHITE$:@RM
END ELSE
Vals = GREEN$:@RM
Vals := GREEN$:@RM
END
NeedsAttention = ''
IF SuppInst NE '' THEN
SuppSig = Get_Property(@WINDOW:'.SUPP_SIG','TEXT')
IF SuppSig = '' THEN
NeedsAttention = 'Supplemental Instruction is not signed!'
END
END
IF NeedsAttention = '' THEN Vals := 0:@RM ELSE Vals := 1:@RM ;* Turns the signbutton on
Vals := NeedsAttention:@RM ;* Sets red text for operator
IF NeedsAttention = '' THEN Vals := 0 ELSE Vals := 1 ;* Makes the text visible
Set_Property(Ctrls,Props,Vals) ;* Sets NEEDS_ATTENTION and associated stuff
* NeedsAttention NE ''
Ctrls = @WINDOW:'.ADE_READ':@RM ; Props = 'DEFPROP':@RM
Ctrls := @WINDOW:'.LAST_WAFER_RHO':@RM ; Props := 'DEFPROP':@RM
Ctrls := @WINDOW:'.FIN_WFR_QTY':@RM ; Props := 'DEFPROP':@RM
Ctrls := @WINDOW:'.SHIFT':@RM ; Props := 'DEFPROP':@RM
Ctrls := @WINDOW:'.FQA_LPD':@RM ; Props := 'DEFPROP':@RM ;* Added FQA_LPD property check dkk 12/29/14
Ctrls := @WINDOW:'.WFR_SIG':@RM ; Props := 'DEFPROP':@RM
Ctrls := @WINDOW:'.UNLOAD_SIG':@RM ; Props := 'DEFPROP':@RM
Ctrls := @WINDOW:'.POST_SIG':@RM ; Props := 'DEFPROP':@RM
Ctrls := @WINDOW:'.FIN_SIG' ; Props := 'DEFPROP'
Vals = Get_Property(Ctrls,Props)
ADERead = Vals[1,@RM]
LastWaferRHO = Vals[COL2()+1,@RM]
FinWfrQty = Vals[COL2()+1,@RM]
Shift = Vals[COL2()+1,@RM]
FqaLpd = Vals[COL2()+1,@RM] ;* Added FqaLpd check dkk 12/29/14
WfrSig = Vals[COL2()+1,@RM]
UnloadSig = Vals[COL2()+1,@RM]
PostSig = Vals[COL2()+1,@RM]
FinSig = Vals[COL2()+1,@RM]
IF NeedsAttention = '' AND ADERead NE '' AND LastWaferRHO NE '' AND FinWfrQty NE '' AND Shift NE '' AND FqaLpd NE '' Then;* Added FqaLpd check to ensure completed dkk 12/29/14
BEGIN CASE
CASE PostCIDesc NE '' AND PostSig NE '' AND UnloadSig NE '' AND FinSig = ''
Set_Property(@WINDOW:'.FINAL_SIG_BUTTON','ENABLED',1)
CASE PostCIDesc = '' AND WfrSig NE '' AND UnloadSig NE '' AND FinSig = ''
Set_Property(@WINDOW:'.FINAL_SIG_BUTTON','ENABLED',1)
CASE 1
Set_Property(@WINDOW:'.FINAL_SIG_BUTTON','ENABLED',0)
END CASE
END ELSE
Set_Property(@WINDOW:'.FINAL_SIG_BUTTON','ENABLED',0)
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
LoadLockVal = Get_Property(@WINDOW:'.LOAD_LOCK_SIDE_HIDDEN','TEXT') ;* This little bit of code clears the default radio button (with much difficulty!)
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
ReactType = Get_Property(@WINDOW:'.REACTOR_TYPE','INVALUE')
Ctrls = @WINDOW:'.LOAD_LOCK_SIDE':@RM ; Props = 'ENABLED':@RM
Ctrls := @WINDOW:'.ASM_LOAD_LOCK_LBL':@RM ; Props := 'ENABLED':@RM
Ctrls := @WINDOW:'.ASM_LOAD_LOCK' ; Props := 'ENABLED'
IF ReactType = 'ASM+' THEN
Vals = STR('1':@RM,9)
Vals[-1,1] = ''
END ELSE
Vals = STR('0':@RM,9)
Vals[-1,1] = ''
END
Set_Property(Ctrls,Props,Vals)
Ctrls = @WINDOW:'.WFR_REJECT_LABEL':@RM ; Props = 'VISIBLE':@RM
Ctrls := @WINDOW:'.WFR_REJECT':@RM ; Props := 'VISIBLE':@RM
Ctrls := @WINDOW:'.MU_WFRS_ADDED_LABEL':@RM ; Props := 'VISIBLE':@RM
Ctrls := @WINDOW:'.MU_WFRS_ADDED':@RM ; Props := 'VISIBLE':@RM
Ctrls := @WINDOW:'.MU_WFRS_REMOVED_LABEL':@RM ; Props := 'VISIBLE':@RM
Ctrls := @WINDOW:'.MU_WFRS_REMOVED':@RM ; Props := 'VISIBLE':@RM
Ctrls := @WINDOW:'.CURR_WFR_CNT_LABEL':@RM ; Props := 'VISIBLE':@RM
Ctrls := @WINDOW:'.CURR_WFR_CNT':@RM ; Props := 'VISIBLE':@RM
Ctrls := @WINDOW:'.CASS_SHIP_QTY_LABEL':@RM ; Props := 'VISIBLE':@RM
Ctrls := @WINDOW:'.CASS_SHIP_QTY':@RM ; Props := 'VISIBLE':@RM
Ctrls := @WINDOW:'.SIG_PROFILE':@RM ; Props := 'VISIBLE':@RM
Ctrls := @WINDOW:'.LOAD_REQ_GROUP':@RM ; Props := 'VISIBLE':@RM
Ctrls := @WINDOW:'.FINAL_QA_GROUP':@RM ; Props := 'VISIBLE':@RM
Ctrls := @WINDOW:'.LOAD_SIG_BUTTON':@RM ; Props := 'VISIBLE':@RM
Ctrls := @WINDOW:'.LOAD_SIG_LABEL':@RM ; Props := 'VISIBLE':@RM
Ctrls := @WINDOW:'.LOAD_SIG':@RM ; Props := 'VISIBLE':@RM
Ctrls := @WINDOW:'.LOAD_SIG_DTM':@RM ; Props := 'VISIBLE':@RM
Ctrls := @WINDOW:'.UNLOAD_SIG_BUTTON':@RM ; Props := 'VISIBLE':@RM
Ctrls := @WINDOW:'.UNLOAD_SIG_LABEL':@RM ; Props := 'VISIBLE':@RM
Ctrls := @WINDOW:'.UNLOAD_SIG':@RM ; Props := 'VISIBLE':@RM
Ctrls := @WINDOW:'.UNLOAD_SIG_DTM' ; Props := 'VISIBLE'
IF ReactType = 'EPP' OR ReactType[1,6] = 'EpiPro' THEN
END Else
Vals = STR('1':@RM,13):STR('0':@RM,8) ; Vals[-1,1] = ''
Set_Property(Ctrls,Props,Vals)
SigProfileList = Get_Property(@WINDOW:'.SIG_PROFILE','LIST')
SigProfCnt = COUNT(SigProfileList,@FM) + (SigProfileList NE '')
NextStepSigProf = ''
FOR I =1 TO SigProfCnt
SigProf = SigProfileList<I,COL$SIG_PROF>
Signature = SigProfileList<I,COL$SIGNATURE>
StageStatus = SigProfileList<I,COL$STAGE_STATUS>
BEGIN CASE
CASE SigProf NE '' AND StageStatus EQ 'RUN' ;LineColor = LS3_GREEN$
CASE SigProf NE '' AND StageStatus EQ 'SIG' ;LineColor = ORANGE$
CASE SigProf NE '' AND Signature EQ '' ;LineColor = YELLOW$
CASE SigProf NE '' AND Signature NE '' ;LineColor = GREEN$
CASE SigProf EQ '' AND Signature EQ '' ;LineColor = WHITE$
CASE 1 ; LineColor = WHITE$
END CASE
stat = Send_Message(@WINDOW:'.SIG_PROFILE','COLOR_BY_POS',0,I,LineColor)
IF LineColor = YELLOW$ AND NextStepSigProf = '' THEN
BasicSigProf = ICONV(SigProf,'[SIG_PROFILE_CONV]')
BEGIN CASE
CASE BasicSigProf = 'VER' ; NextStepSigProf = 'VER'
CASE BasicSigProf = 'LOAD' ; NextStepSigProf = 'LOAD'
CASE BasicSigProf = 'UNLOAD' ; NextStepSigProf = 'UNLOAD'
CASE BasicSigProf = 'QA' ; NextStepSigProf = 'QA'
END CASE
END ;* End of check for unsigned line and null NextStepSigProf
NEXT I
WfrSigProfileList = Get_Property(@WINDOW:'.WFR_SIG_PROFILE','LIST')
WfrSigProfCnt = COUNT(WfrSigProfileList,@FM) + (WfrSigProfileList NE '')
NextStepSigProf = ''
FOR I =1 TO WfrSigProfCnt
SigProf = WfrSigProfileList<I,COL$SIG_PROF>
Signature = WfrSigProfileList<I,COL$SIGNATURE>
StageStatus = WfrSigProfileList<I,COL$CHAR_WFR_STATUS>
BEGIN CASE
CASE SigProf NE '' AND StageStatus EQ 'RUN' ;LineColor = LS3_GREEN$
CASE SigProf NE '' AND StageStatus EQ 'SIG' ;LineColor = ORANGE$
CASE SigProf NE '' AND Signature EQ '' ;LineColor = YELLOW$
CASE SigProf NE '' AND Signature NE '' ;LineColor = GREEN$
CASE SigProf EQ '' AND Signature EQ '' ;LineColor = WHITE$
CASE 1 ; LineColor = WHITE$
END CASE
stat = Send_Message(@WINDOW:'.WFR_SIG_PROFILE','COLOR_BY_POS',0,I,LineColor)
NEXT I
VerReqCtrl = @WINDOW:'.VER_WFR_CNT'
LoadReqCtrls = @WINDOW:'.LOAD_WFR_CNT':@RM
LoadReqCtrls := @WINDOW:'.LOAD_LOCK_SIDE'
UnloadReqCtrl = @WINDOW:'.WFR_UNLOAD_QTY'
QAReqCtrls = @WINDOW:'.ADE_READ':@RM
QAReqCtrls := @WINDOW:'.LAST_WAFER_RHO':@RM
QAReqCtrls := @WINDOW:'.SHIFT':@RM
QAReqCtrls := @WINDOW:'.FIN_WFR_CNT'
QAReqCtrls := @WINDOW:'.FQA_LPD' ;* Added LPD's here -dkk 12/3/14
ClearCtrls = ''
IF NextStepSigProf = 'VER' THEN
Val = Get_Property(VerReqCtrl,'DEFPROP')
IF Val = '' THEN BackColor = RED$ ELSE BackColor = WHITE$
Set_Property(VerReqCtrl,'BACKCOLOR',BackColor)
END ELSE
ClearCtrls := VerReqCtrl:@RM
END
IF NextStepSigProf = 'LOAD' THEN
CtrlCnt = 2
Vals = Get_Property(LoadReqCtrls,'DEFPROP')
BackColors = ''
FOR I = 1 TO CtrlCnt
IF FIELD(Vals,@RM,I) = '' THEN
BackColors = FieldStore(BackColors,@RM,I,1,RED$)
END ELSE
BackColors = FieldStore(BackColors,@RM,I,1,WHITE$)
END
NEXT I
Set_Property(LoadReqCtrls,'BACKCOLOR',BackColors)
END ELSE
ClearCtrls := LoadReqCtrls:@RM
END
IF NextStepSigProf = 'UNLOAD' THEN
Val = Get_Property(UnloadReqCtrl,'DEFPROP')
IF Val = '' THEN BackColor = RED$ ELSE BackColor = WHITE$
Set_Property(UnloadReqCtrl,'BACKCOLOR',BackColor)
END ELSE
ClearCtrls := UnloadReqCtrl:@RM
END
IF NextStepSigProf = 'QA' THEN
CtrlCnt = 4
Vals = Get_Property(QAReqCtrls,'DEFPROP')
BackColors = ''
FOR I = 1 TO CtrlCnt
IF FIELD(Vals,@RM,I) = '' THEN
BackColors = FieldStore(BackColors,@RM,I,1,YELLOW$)
END ELSE
BackColors = FieldStore(BackColors,@RM,I,1,WHITE$)
END
NEXT I
Set_Property(QAReqCtrls,'BACKCOLOR',BackColors)
END ELSE
ClearCtrls := QAReqCtrls:@RM
END
ClearCtrls[-1,1] = ''
Set_Property(ClearCtrls,'BACKCOLOR',WHITE$)
END ;* End of check for EpiPro reactor
*************
* 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>
IF ETCtrl NE @WINDOW:'.SIG_PROFILE' AND ETCtrl NE @WINDOW:'.CHAR_WFR_ID' THEN
ETList = Get_Property(ETCtrl,'LIST')
FOR Line = 1 TO COUNT(ETList,@FM) + (ETList NE '')
IF ETList<Line,1> 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
END ;* End of check for .SIG_PROFILE control
NEXT I
CtrlID = @WINDOW:'.RDS_LS_ID'
LayerList = Get_Property(CtrlID,'LIST')
FOR I = 1 TO COUNT(LayerList,@FM) + (LayerList NE '')
IF ICONV(LayerList<I,COL$PARMS_OUT>,'B') = 1 THEN
ParmColor = RED$
END ELSE
IF ICONV(LayerList<I,COL$PARAMS>,'B') = 0 THEN
ParmColor = YELLOW$
EnableSignButton = 0
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
IF ICONV(LayerList<I,COL$MET_TWSIG>,'B') = 0 THEN
MetColor = ORANGE$
EnableLoadButton = 0
END ELSE
IF ICONV(LayerList<I,COL$MET_OUT>,'B') = 1 THEN
MetColor = RED$
EnableSignButton = 0
END ELSE
IF LayerList<I,COL$THICK_AVG> = '' AND LayerList<I,COL$RRHO_AVG> = '' AND LayerList<I,COL$MET_NO> NE '' THEN
MetColor = YELLOW$
EnableSignButton = 0
END ELSE
MetColor = GREEN$
END
END
END
FOR Col = COL$MET_NO TO COL$RRHO_AVG
stat = Send_Message(CtrlID,'COLOR_BY_POS',Col,I,MetColor)
NEXT Col
IF ICONV(LayerList<I,COL$MET_TWSIG_Z1>,'B') = 0 THEN
MetColorZ1 = ORANGE$
EnableLoadButton = 0
END ELSE
IF ICONV(LayerList<I,COL$MET_OUT_Z1>,'B') = 1 THEN
MetColorZ1 = RED$
EnableSignButton = 0
END ELSE
IF LayerList<I,COL$THICK_AVG_Z1> = '' AND LayerList<I,COL$RRHO_AVG_Z1> = '' AND LayerList<I,COL$MET_NO_Z1> NE '' THEN
MetColorZ1 = YELLOW$
EnableSignButton = 0
END ELSE
MetColorZ1 = PRE_BLUE$
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
IF ICONV(LayerList<I,COL$MET_TWSIG_Z2>,'B') = 0 THEN
MetColorZ2 = ORANGE$
EnableLoadButton = 0
END ELSE
IF ICONV(LayerList<I,COL$MET_OUT_Z2>,'B') = 1 THEN
MetColorZ2 = RED$
EnableSignButton = 0
END ELSE
IF LayerList<I,COL$THICK_AVG_Z2> = '' AND LayerList<I,COL$RRHO_AVG_Z2> = '' AND LayerList<I,COL$MET_NO_Z2> NE '' THEN
MetColorZ2 = YELLOW$
EnableSignButton = 0
END ELSE
MetColorZ2 = INP_BLUE$
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
CtrlID = @WINDOW:'.CHAR_WFR_ID'
CharWfrList = Get_Property(CtrlID,'LIST')
FOR I = 1 TO COUNT(CharWfrList,@FM) + (CharWfrList NE '')
CurrStage = CharWfrList<I,COL$CURR_STAGE>
CharDest = CharWfrList<I,COL$CHAR_DEST>
StageStatus = CharWfrList<I,COL$CHAR_WFR_STATUS>
BEGIN CASE
CASE SigProf NE '' AND StageStatus EQ 'RUN' ;LineColor = LS3_GREEN$
CASE SigProf NE '' AND StageStatus EQ 'SIG' ;LineColor = ORANGE$
CASE SigProf NE '' AND StageStatus EQ 'PART' ;LineColor = GREY$
CASE SigProf NE '' AND Signature EQ '' ;LineColor = YELLOW$
CASE SigProf NE '' AND Signature NE '' ;LineColor = GREEN$
CASE SigProf EQ '' AND Signature EQ '' ;LineColor = WHITE$
CASE 1 ; LineColor = WHITE$
END CASE
* * * * * * * Change to display 'DEST' column to red if destroyed, rest of line to LineColor ********** ****************************
BEGIN CASE
CASE CurrStage = '-' ; ParmColor = GREEN$
CASE CurrStage NE '' ; ParmColor = LineColor
CASE 1 ; ParmColor = WHITE$
END CASE
stat = Send_Message(CtrlID,'COLOR_BY_POS',0,I,ParmColor)
IF CharDest = 'Yes' THEN
stat = Send_Message(CtrlID,'COLOR_BY_POS',COL$CHAR_DEST,I,RED$)
END
NEXT I
RETURN
* * * * * * *
Read:
* * * * * * *
ReactNo = Get_Property(@WINDOW:'.REACTOR','DEFPROP')
ReactType = XLATE('REACTOR',ReactNo,REACTOR_REACT_TYPE$,'X')
IF ReactType = 'EPP' THEN
PSNo = Get_Property(@WINDOW:'.PS_NO','DEFPROP')
ReactorLoad = Get_Property(@WINDOW:'.REACTOR_LOAD','LIST')
CurrPockets = ReactorLoad<COL$POCKET>
CONVERT @VM TO '' IN CurrPockets
IF CurrPockets = '' THEN
PSNWaferSize = XLATE('PROD_SPEC',PSNo,'SUB_WAFER_SIZE','X')
BEGIN CASE
CASE PSNWaferSize = '150 mm 6 in'
EpiSusceptor = XLATE('EPI_SUSCEPTOR','6','','X')
CASE PSNWaferSize = '125 mm 5 in'
EpiSusceptor = XLATE('EPI_SUSCEPTOR','5','','X')
CASE 1
ErrorMsg = 'PSN: ':QUOTE(PSNo):' has a wafer size of ':PSNWaferSize:'.':CRLF$:CRLF$
ErrorMsg := 'The EpiPRO reactors cannot process wafers of this size.'
ErrMsg(ErrorMsg)
GOSUB Refresh
RETURN
END CASE
Pockets = EpiSusceptor<EPI_SUSCEPTOR_POCKET_NO$>
Zones = EpiSusceptor<EPI_SUSCEPTOR_POCKET_ZONE$>
PTypes = EpiSusceptor<EPI_SUSCEPTOR_POCKET_TYPE$>
FOR I = 1 TO COUNT(Pockets,@VM) + (Pockets NE '')
Set_Property(@WINDOW:'.REACTOR_LOAD','CELLPOS',Pockets<1,I>,COL$POCKET:@FM:I)
Set_Property(@WINDOW:'.REACTOR_LOAD','CELLPOS',PTypes<1,I>,COL$USAGE:@FM:I)
Set_Property(@WINDOW:'.REACTOR_LOAD','CELLPOS',Zones<1,I>,COL$ZONE:@FM:I)
NEXT I
END ;* End of check for Pocket column data
END ;* End of check for EpiPro reactor type
GOSUB Refresh
RETURN
* * * * * * *
Page:
* * * * * * *
Page = Get_Property(@WINDOW:'.TABCONTROL', 'VALUE')
Set_Property(@WINDOW,'VPOSITION', Page)
RETURN
* * * * * * *
VScroll:
* * * * * * *
Page = Parm1
Set_Property(@WINDOW:'.TABCONTROL','VALUE', Page)
RETURN
* * * * * * *
Write:
* * * * * * *
prevControl = Get_Property("SYSTEM" , "PREVFOCUS")
Result = 1
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
* * * * * * *
RDSNoLF:
* * * * * * *
PromptDataIn = Get_Property(@WINDOW:'.RDS_NO','DEFPROP')
CONVERT '.' TO '*' IN PromptDataIN
IF INDEX(PromptDataIn,'*',1) THEN
WOMatRec = XLATE('WO_MAT',PromptDataIn,'','X')
IF WOMatRec NE '' THEN
RDSNos = WOMatRec<WO_MAT_RDS_NO$>
IF RDSNos NE '' THEN
IF INDEX(RDSNos,@VM,1) THEN
TypeOver = ''
TypeOver<PDISPLAY$> = RDSNos
RDSNo = Popup(@WINDOW,TypeOver,'REACT_RUN')
IF RDSNo = CHAR(27) OR RDSNo = '' THEN RETURN
Set_Property(@WINDOW:'.RDS_NO','DEFPROP','')
obj_AppWindow('LoadFormKeys',@WINDOW:@RM:RDSNo)
END ELSE
Set_Property(@WINDOW:'.RDS_NO','DEFPROP','')
obj_AppWindow('LoadFormKeys',@WINDOW:@RM:RDSNos)
END
END ELSE
* Must be EpiPro
WMIRdsNos = XLATE('WO_MAT',PromptDataIn,'WMI_RDS_NO','X')
WMISlotNCRs = XLATE('WO_MAT',PromptDataIn,'WMI_SLOT_NCR','X')
WMORdsNos = XLATE('WO_MAT',PromptDataIn,'WMO_RDS_NO','X')
WMOSlotNCRs = XLATE('WO_MAT',PromptDataIn,'WMO_SLOT_NCR','X')
WMICnt = COUNT(WMIRdsNos,@VM) + (WMIRdsNos NE '')
WMOCnt = COUNT(WMORdsNos,@VM) + (WMORdsNos NE '')
InboundRDSs = ''
OutBoundRDSs = ''
FOR I = 1 TO WMICnt
RDSNo = WMIRdsNos<1,I>
IF WMISlotNCRs<1,I> = '' THEN
LOCATE RDSNo IN InboundRDSs USING @VM SETTING Pos ELSE
InboundRDSs = INSERT(InboundRDSs,1,Pos,0,RDSNo)
END
END
NEXT I
FOR I = 1 TO WMOCnt
RDSNo = WMORdsNos<1,I>
IF WMOSlotNCRs<1,I> = '' THEN
LOCATE RDSNo IN OutboundRDSs USING @VM SETTING Pos ELSE
OutboundRDSs = INSERT(OutboundRDSs,1,Pos,0,RDSNo)
END
END
NEXT I
IRCnt = COUNT(InboundRDSs,@VM) + (InboundRDSs NE '')
ORCnt = COUNT(OutboundRDSs,@VM) + (OutboundRDSs NE '')
Display = ''
FOR I = 1 TO IRCnt
Display<1,-1> = 'Inbound':@SVM:InboundRDSs<1,I>
NEXT I
FOR I = 1 TO ORCnt
Display<1,-1> = 'Outbound':@SVM:OutboundRDSs<1,I>
NEXT I
TypeOver = ''
TypeOver<PDISPLAY$> = Display
RDSNo = Popup(@WINDOW,TypeOver,'EPI_PRO_WO_MAT_RDS')
IF RDSNo = CHAR(27) OR RDSNo = '' THEN RETURN
Set_Property(@WINDOW:'.RDS_NO','DEFPROP','')
obj_AppWindow('LoadFormKeys',@WINDOW:@RM:RDSNo)
END
END
END
RETURN
* * * * * * *
CIClick:
* * * * * * *
CINO = 0
CurrCtrl = Parm1
/*BEGIN CASE
CASE CurrCtrl = @WINDOW:'.PRE_EPI_CI_BUTTON' ; CIKey = Get_Property(@WINDOW:'.PRE_EPI_CI_BUTTON','TEXT')
CASE CurrCtrl = @WINDOW:'.UNLOAD_CI_BUTTON' ; CIKey = Get_Property(@WINDOW:'.UNLOAD_CI_BUTTON','TEXT')
CASE CurrCtrl = @WINDOW:'.POST_CI_BUTTON' ; CIKey = Get_Property(@WINDOW:'.POST_CI_BUTTON','TEXT')
CASE 1 ; RETURN
END Case*/
BEGIN Case ;* Substituted for remarked out code above. Copied from COMM_RDS. -dkk 10/22/14
CASE @WINDOW = 'REACT_RUN' ;* CASE @WINDOW = 'RDS_PRE_EPI'
Stage = 'PRE'
CICtrl = @WINDOW:'.PRE_EPI_CI_BUTTON'
CASE @WINDOW = 'REACT_RUN' ;* CASE @WINDOW = 'RDS'
Stage = 'FWI'
CICtrl = @WINDOW:'.LOAD_CI_BUTTON'
CASE @WINDOW = 'REACT_RUN' ;* CASE @WINDOW = 'RDS_UNLOAD'
Stage = 'LWI'
CICtrl = @WINDOW:'.UNLOAD_CI_BUTTON'
CASE @WINDOW = 'REACT_RUN' ;* CASE @WINDOW = 'RDS_POST_EPI'
Stage = 'POST'
CICtrl = @WINDOW:'.POST_CI_BUTTON'
CASE 1 ; RETURN
END CASE
DetWindow = 'CLEAN_INSP'
DetKeys = CINO
DefaultRec = ''
obj_AppWindow('ViewNewDetail',DetWindow:@RM:DetKeys:@RM:'')
RETURN
* * * * * * *
LURunPri:
* * * * * * *
RunPri = Popup(@WINDOW,'','GAN_WFR_PRIORITY')
IF RunPri = CHAR(27) THEN RETURN ;* Canceled
obj_Appwindow('LUValReturn',RunPri:@RM:@WINDOW:'.RUN_PRI')
GOSUB Refresh
RETURN
* * * * * * *
LURDSNo:
* * * * * * *
RETURN
* * * * * * *
LUReactNo:
* * * * * * *
ReactorNo = Get_Property(@WINDOW:'.REACTOR','DEFPROP')
Set_Status(0)
ReactorNo = Popup(@WINDOW,'','REACTORS')
IF ReactorNo = '' THEN RETURN
obj_Appwindow('LUValReturn',ReactorNo:@RM:@WINDOW:'.REACTOR')
RETURN
RETURN
* * * * * * *
LUReactEsc:
* * * * * * *
IF NOT(ASSIGNED(Parm1)) THEN FocusControl = '' ELSE FocusControl = Parm1
IF NOT(ASSIGNED(Parm2)) THEN FocusPos = '' ELSE FocusPos = Parm2
Set_Status(0)
EventKeys = obj_React_Esc('Find')
IF Get_Status(errCode) THEN ErrMsg(ErrCode)
IF INDEX(EventKeys,@VM,1) THEN
TypeOver = ''
TypeOver<PMODE$> = 'K'
TypeOver<PDISPLAY$> = EventKeys
EventKeys = Popup(@WINDOW,TypeOver,'REACT_ESC_QUERY')
END
CONVERT @VM TO @FM IN EventKeys
IF INDEX(EventKeys,@FM,1) THEN
Send_Event(@WINDOW,'QBFINIT')
Set_Property(@WINDOW,'QBFLIST',EventKeys)
GOSUB Refresh
Send_Event(@WINDOW,'QBFIRST')
END ELSE
obj_Appwindow('LoadFormKeys',@WINDOW:@RM:EventKeys)
END
RETURN
* * * * * * *
Close:
* * * * * * *
obj_Notes('Inbox',@USER4) ;* Checks for any new messages
Parent = Get_Property(@WINDOW,'PARENT')
IF Parent[1,7] = 'WO_PROD' THEN
Post_Event(Parent, 'READ')
END
RETURN
* * * * * * *
CopyMetrology:
* * * * * * *
RDSNo = Get_Property(@WINDOW:'.RDS_NO','DEFPROP')
WONo = Get_Property(@Window:'.WO_NO', 'TEXT')
DestRDSNos = Dialog_Box('NDW_RDS_QUERY', @Window, WONo : @FM : 'quick')
SourceMetKeys = obj_React_Run('GetMetKeys',RDSNo)
RDSCnt = COUNT(DestRDSNos,@VM) + (DestRDSNos NE '')
FOR I = 1 TO RDSCnt
Copy = 1 ;* Set flag
DestRDSNo = DestRDSNos<1,I>
MetEntered = XLATE('RDS',DestRDSNo,'LS_MET_ENTERED','X') ;* @VM list of binary values by layer
IF MetEntered[1,1] = 1 THEN
MsgInfo = ''
MsgInfo<MTEXT$> = 'RDS ':DestRDSNo:' already has Metrology Results. Do you wish to overwrite them?'
MsgInfo<MICON$> = '?'
MsgInfo<MTYPE$> = 'BNY'
MsgInfo<MDEFBTN$> = '2' ;* This sets the default to the No button
Copy = Msg(@WINDOW,MsgInfo)
END
IF Copy THEN
DestMetKeys = obj_React_Run('GetMetKeys',DestRDSNo)
IF SourceMetKeys<1> = DestMetKeys<1> THEN
Set_Status(0)
obj_RDS_Test('CopyStats',SourceMetKeys<2>:@RM:DestMetKeys<2>)
IF Get_Status(errCode) THEN
ErrMsg(errCode)
END
END ELSE
ErrMsg('SourceMetKeys not equal DestMetKeys: Contact FI')
END
END ;* End of check for Copy flag
NEXT I
RETURN
* * * * * * *
LSIdDC:
* * * * * * *
CtrlEntID = @WINDOW:'.RDS_LS_ID'
RDSNo = Get_Property(@WINDOW:'.RDS_NO','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
Send_Event('REACT_RUN','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 MetNo NE '' THEN
Send_Event('REACT_RUN','WRITE')
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
* * * * * * *
AddZoneMet:
* * * * * * *
CtrlEntID = @WINDOW:'.RDS_LS_ID_FIX'
RDSNo = Get_Property(@WINDOW:'.RDS_NO_FIX','DEFPROP')
PSNo = Get_Property(@WINDOW:'.PS_NO_FIX','DEFPROP')
LSArray = Get_Property(CtrlEntID,'DEFPROP')
LSIDs = LSArray<COL$LSID>
MetNos = LSArray<COL$MET_NO>
MetNosZ1 = LSArray<COL$MET_NO_Z1>
MetNosZ2 = LSArray<COL$MET_NO_Z2>
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<MTYPE$> = 'B&1,&2,&Cancel'
TypeOver<MCAPTION$> = 'Add Reactor Zone Metrology'
TypeOver<MICON$> = '?'
TypeOver<MDEFBTN$> = '3'
TypeOver<MTEXT$> = '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_FIX'
RDSNo = Get_Property(@WINDOW:'.RDS_NO_FIX','DEFPROP')
LSArray = Get_Property(CtrlEntID,'DEFPROP')
MetNos = LSArray<COL$MET_NO>
MetNosZ1 = LSArray<COL$MET_NO_Z1>
MetNosZ2 = LSArray<COL$MET_NO_Z2>
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<MTYPE$> = 'B&1,&2,&Cancel'
TypeOver<MCAPTION$> = 'Move Metrology to Reactor Zone'
TypeOver<MICON$> = '?'
TypeOver<MDEFBTN$> = '3'
TypeOver<MTEXT$> = '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
* * * * * * *
ViewWOMat:
* * * * * * *
Ctrls = @WINDOW:'.WO_NO':@RM ; Props = 'DEFPROP':@RM
Ctrls := @WINDOW:'.CASS_NO':@RM ; Props := 'DEFPROP':@RM
Ctrls := @WINDOW:'.RDS_NO':@RM ; Props := 'DEFPROP':@RM
Ctrls := @WINDOW:'.REACTOR':@RM ; Props := 'DEFPROP':@RM
Ctrls := @WINDOW:'.WO_STEP' ; 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]
Send_Event(@WINDOW,'WRITE')
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
* * * * * * *
SendMsg:
* * * * * * *
CurrWindow = @WINDOW
CurrKey = Get_Property(CurrWindow,'ID')
IF CurrKey = '' THEN
MsgInfo = ''
MsgInfo<MTEXT$> = 'You must have a record present...'
MsgInfo<MICON$> = 'H'
Msg( '', MsgInfo )
RETURN
END
IF RowExists('REACT_RUN',CurrKey) THEN
NoteID = NextKey('NOTES')
obj_AppWindow('ViewRelated','NOTE_MESSAGE':@RM:NoteID:@RM:@WINDOW:@FM:CurrKey)
END ELSE
MsgInfo = ''
MsgInfo<mtext$> = 'You must save this run data sheet first...'
MsgInfo<micon$> = 'H'
Msg( '', MsgInfo )
END
RETURN
* * * * * * *
CtrlPlanClick:
* * * * * * *
PSNo = Get_Property(@WINDOW:'.PS_NO','DEFPROP')
IF PSNo NE '' THEN
Print_Control_Plan(PSNo)
END
RETURN
* * * * * * *
ViewPSN:
* * * * * * *
PSNo = Get_Property(@WINDOW:'.PS_NO','DEFPROP')
IF PSNo NE '' THEN
Start_Window('PROD_SPEC',@WINDOW, PSNo:'*CENTER', '', '' ) ;* Old style call to old style window
END
RETURN
* * * * * * *
ViewWO:
* * * * * * *
WONo = Get_Property(@WINDOW:'.WO_NO','DEFPROP')
IF WONo NE '' THEN
NewForm = Xlate('APP_INFO', 'NEW_WO_FORM', '', 'X')
If NewForm then
Start_Window('NDW_WO_LOG', @Window, WONo)
end else
Start_Window('WO_LOG2',@WINDOW, WONo:'*CENTER', '', '' ) ;* Added (copied from ViewPSN) -dkk 10/23/14
end
END
RETURN
* * * * * * *
PrintInstruction:
* * * * * * *
RDSNo = Get_Property(@WINDOW:'.RDS_NO','TEXT')
IF RDSNo NE '' THEN
Print_RDS_Instruction(RDSNo)
END
RETURN
* * * * * * *
SignSuppl:
* * * * * * *
IF MemberOf( @USER4, 'DATA_ENTRY' ) OR MemberOf( @USER4, 'SUPERVISOR' ) THEN
Valid = Dialog_Box('NDW_VERIFY_USER', @Window, @User4)
Valid = Valid<1>
IF Valid THEN
Set_Property(@WINDOW:'.SUPP_SIG','INVALUE',@USER4)
*Set_Property(@WINDOW:'.SUPP_SIG','TEXT',XLATE('LSL_USERS',@USER4,'FIRST_LAST','X' )
Set_Property(@WINDOW:'.SUPP_SIG_DTM','INVALUE',ICONV(OCONV(Date(), 'D4/'):' ':OCONV(Time(), 'MTHS'),'DT'))
END
END ELSE
MsgInfo = ''
MsgInfo<micon$> = '!'
MsgInfo<mtext$> = 'Only cleanroom personnel are permitted to sign the work order verification.'
Msg( '', MsgInfo )
END
RETURN
* * * * * * *
SignFinalQA:
* * * * * * *
Ctrls = @WINDOW:'RDS_NO':@RM ; Props = 'DEFPROP':@RM
Ctrls := @WINDOW:'.WO_NO':@RM ; Props := 'DEFPROP':@RM
Ctrls := @WINDOW:'.CASS_NO':@RM ; Props := 'DEFPROP':@RM
Ctrls := @WINDOW:'.STEP_NO' ; Props := 'DEFPROP'
Vals = Get_Property(Ctrls,Props)
RDSNo = Vals[1,@RM]
WONo = Vals[COL2()+1,@RM]
CassNo = Vals[COL2()+1,@RM]
StepNo = Vals[COL2()+1,@RM]
RETURN
/*
* This section adjusts the SchedQty on the Next RDS to run on this box
WOMatRec = XLATE('WO_MAT',WONo:'*':CassNo,'','X')
WOMRDSKeys = WOMatRec<WO_MAT_RDS_NO$>
LOCATE RDSNo IN WOMRDSKeys USING @VM SETTING Pos THEN
IF WOMRDSKeys<1,Pos+1> NE '' THEN
NextRDSNo = WOMRDSKeys<1,Pos+1>
CurrWfrQty = obj_WO_Mat('CurrWaferCnt',WONo:'*':CassNo:@RM:WOMatRec)
obj_React_Run('SetSchedWfrCnt',
END ;* End of check for next WO_Step run
END
*/
RETURN
* * * * * * *
SigProfileClick:
* * * * * * *
CtrlEntID = @WINDOW:'.SIG_PROFILE'
SigList = Get_Property(CtrlEntID,'LIST')
CurrPos = Get_Property(CtrlEntID,'SELPOS')
CurrRow = CurrPos<2>
CurrSigProf = ICONV(SigList<CurrRow,1>,'[SIG_PROFILE_CONV]')
RDSNo = Get_Property(@WINDOW:'.RDS_NO','DEFPROP')
CurrStage = CurrSigProf
IF RDSNo NE '' AND CurrStage NE '' THEN
RunStageKey = RDSNo:'*':CurrStage
Send_Event('REACT_RUN','WRITE')
DetWindow = 'RUN_STAGE'
DetKeys = RunStageKey
DefaultRec = ''
RetKey = RDSNo
RetWin = @WINDOW
RetPage = 1
RetCtrl = @WINDOW:'.RDS_NO'
RetPos = CurrPos
obj_Appwindow('ViewNewDetail',DetWindow:@RM:DetKeys:@RM:DefaultRec:@RM:RetKey:@RM:RetPage:@RM:RetCtrl:@RM:RetPos)
IF Get_Status(errCode) THEN
ErrMsg(errCode)
END
END
RETURN
* * * * * * *
CharWfrDC:
* * * * * * *
CtrlEntID = @WINDOW:'.CHAR_WFR_ID'
RDSNo = Get_Property(@WINDOW:'.RDS_NO','DEFPROP')
IF RDSNo = '' THEN RETURN
CurrPos = Get_Property(CtrlEntID,'SELPOS')
CurrCol = CurrPos<1>
CurrRow = CurrPos<2>
WfrList = Get_Property(CtrlEntID,'LIST')
CharWfrID = WfrList<CurrRow,COL$CHAR_WFR_ID>
BEGIN CASE
CASE CurrCol = COL$CHAR_WFR_ID
WfrSigProfile = obj_React_Run('GetWfrSigKeys',RDSNo:@RM:CharWfrID)
TypeOver = ''
TypeOver<PDISPLAY$> = WfrSigProfile
RunStageWfrKey = Popup(@WINDOW,TypeOver,'CHAR_WFR_STAGES')
IF Get_Status(errCode) THEN ErrMsg(errCode)
IF RunStageWfrKey = CHAR(27) OR RunStageWfrKey = '' THEN RETURN
Send_Event('REACT_RUN','WRITE')
DetWindow = 'RUN_STAGE_WFR'
DetKeys = RunStageWfrKey
DefaultRec = ''
RetKey = RDSNo
RetWin = @WINDOW
RetPage = 1
RetCtrl = @WINDOW:'.RDS_NO'
RetPos = CurrPos
obj_Appwindow('ViewNewDetail',DetWindow:@RM:DetKeys:@RM:DefaultRec:@RM:RetKey:@RM:RetPage:@RM:RetCtrl:@RM:RetPos)
IF Get_Status(errCode) THEN
ErrMsg(errCode)
END
CASE CurrCol = COL$CURR_STAGE
CurrStage = WfrList<CurrRow,CurrCol>
CurrStatus = WfrList<CurrRow,COL$CHAR_WFR_STATUS>
IF CurrStatus = 'PART' THEN
Msg(@WINDOW,'','PART_CHAR')
RETURN
END
IF CurrStage = '-' THEN
RunStageWfrKey = ''
END ELSE
WfrKID = CharWfrID
CONVERT '*' TO '.' IN WfrKID
RunStageWfrKey = RDSNo:'*':CurrStage:'*':WfrKID
Send_Event('REACT_RUN','WRITE')
DetWindow = 'RUN_STAGE_WFR'
DetKeys = RunStageWfrKey
DefaultRec = ''
RetKey = RDSNo
RetWin = @WINDOW
RetPage = 1
RetCtrl = @WINDOW:'.RDS_NO'
RetPos = CurrPos
obj_Appwindow('ViewNewDetail',DetWindow:@RM:DetKeys:@RM:DefaultRec:@RM:RetKey:@RM:RetPage:@RM:RetCtrl:@RM:RetPos)
IF Get_Status(errCode) THEN
ErrMsg(errCode)
END
END
CASE CurrCol = COL$CHAR_TW_NO
TWNo = WfrList<CurrRow,CurrCol>
IF TWNo NE '' THEN
DetWindow = 'TEST_WAFER'
DetKeys = TWNo
DefaultRec = ''
RetKey = RDSNo
RetPage = 1
RetCtrl = CtrlEntID
RetPos = CurrPos
oAParms = DetWindow:@RM:DetKeys:@RM:DefaultRec:@RM:RetKey:@RM:RetPage:@RM:RetCtrl:@RM:RetPos
obj_AppWindow('ViewNewDetail',oAParms)
IF Get_Status(errCode) THEN
ErrMsg(errCode)
END
END
CASE 1
NULL
END CASE
RETURN
* * * * * * *
CharWfrOptions:
* * * * * * *
CtrlEntID = @WINDOW:'.CHAR_WFR_ID'
CurrPos = Get_Property(CtrlEntID,'SELPOS')
CurrCol = CurrPos<1>
CurrRow = CurrPos<2>
WfrList = Get_Property(CtrlEntID,'LIST')
CharWfrID = WfrList<CurrRow,COL$CHAR_WFR_ID>
IF CharWfrID NE '' THEN
TraceData = obj_WO_Wfr('TraceData',CharWfrID:@RM:'')
END
TypeOver = ''
TypeOver<PDISPLAY$> = TraceData
void = Popup(@WINDOW,TypeOver,'WAFER_TRACE')
IF Get_Status(errCode) THEN
ErrMsg(errCode)
RETURN
END
RETURN
* * * * * * *
CarrWfrDC:
* * * * * * *
RDSNo = Get_Property(@WINDOW:'.RDS_NO','DEFPROP')
IF RDSNo = '' THEN RETURN
CtrlEntID = @WINDOW:'.CARR_WFR_ID'
CurrList = Get_Property(CtrlEnTID,'LIST')
CurrPos = Get_Property(CtrlEntID,'NOTIFYPOS')
CurrCol = CurrPos<1>
CurrRow = CurrPos<2>
BEGIN CASE
CASE CurrCol = COL$CARR_NCR
NCRNo = CurrList<CurrRow,COL$CARR_NCR>
IF NCRNo NE '' THEN
Send_Event('REACT_RUN','WRITE')
DetWindow = 'NCR'
DetKeys = NCRNo
DefaultRec = ''
RetKey = RDSNo
RetPage = 1
RetCtrl = CtrlEntID
RetPos = CurrPos
obj_Appwindow('ViewNewDetail',DetWindow:@RM:DetKeys:@RM:DefaultRec:@RM:RetKey:@RM:RetPage:@RM:RetCtrl:@RM:RetPos)
END
END CASE
RETURN
* * * * * * *
SplitClick:
* * * * * * *
RDSNo = Get_Property(@WINDOW:'.RDS_NO','DEFPROP')
CarrWfrIDs = Get_Property(@WINDOW:'.CARR_WFR_ID','DEFPROP')<1>
Stage = ''
ToolID = ''
TestCarrWfrIDs = CarrWfrIDs
CONVERT @VM TO '' IN TestCarrWfrIDS
IF TestCarrWfrIDs = '' THEN
ErrMsg('Wafers have not been unloaded from the reactor.')
RETURN
END
Send_Event(@WINDOW,'WRITE')
* The process of splitting the wafer writes the REACT_RUN record after pulling stuff off the window *
WfrID = Dialog_Box('DIALOG_SPLIT_WAFER', 'REACT_RUN', RDSNo:@FM:Stage:@FM:ToolID:@FM:CarrWfrIDs)
IF Get_Status(errCode) THEN
ErrMsg(errCode)
RETURN
END
obj_Appwindow('LoadFormKeys','REACT_RUN':@RM:RDSNo) ;* Reloads the updated REACT_RUN record
RETURN
* * * * * * *
DispoClick:
* * * * * * *
RDSNo = Get_Property(@WINDOW:'.RDS_NO','DEFPROP')
Send_Event(@WINDOW,'WRITE')
DetWindow = 'REACT_RUN_DISP'
DetKeys = RDSNo
DefaultRec = ''
RetKey = RDSNo
RetPage = 1
RetCtrl = ''
RetPos = ''
obj_Appwindow('ViewNewDetail',DetWindow:@RM:DetKeys:@RM:DefaultRec:@RM:RetKey:@RM:RetPage:@RM:RetCtrl:@RM:RetPos)
IF Get_Status(errCode) THEN
ErrMsg(errCode)
RETURN
END
RETURN
SUSC_LOAD.OPTIONS:
CtrlEntID = @WINDOW:'.SUSC_LOAD'
SelPos = Get_Property(CtrlEntID, 'SELPOS')
Array = Get_Property(CtrlEntID, 'ARRAY')
ColPos = SelPos<1>
RowPos = SelPos<2>
WOWfrID = Array<COL$SUSC_LOAD_WFR_ID, RowPos>
rv = Dialog_Box('DIALOG_WO_WFR_SCRIBE', @Window, WOWfrID)
Send_Event(CtrlEntID, 'CALCULATE', COL$SUSC_LOAD_WFR_SCRIBE)
return