open-insight/LSL2/STPROC/COMM_RDS.txt

2920 lines
99 KiB
Plaintext

COMPILE FUNCTION Comm_RDS(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.
06/13/2024 djm Add new stage-specific supplement system.
*/
DECLARE SUBROUTINE Set_Property, End_Dialog, Send_Event, Set_Status, ErrMsg, Security_Err_Msg, Popup, Print_Cass_Labels
DECLARE SUBROUTINE Print_Prod_Labels, obj_WO_Mat_Log, obj_Post_Log, obj_Tables, obj_React_Run, Post_Event, Hold_Services
DECLARE SUBROUTINE obj_Appwindow, Start_Window, Btree.Extract, Msg, Start_Window,Print_Cleanroom_Labels_Thermal, Error_Services
DECLARE SUBROUTINE obj_RDS_Test, obj_Notes, Print_Control_Plan, obj_WO_Mat, Send_Event, Print_RDS_Instruction, obj_RDS
DECLARE SUBROUTINE Start_Window, Development_Services, Dialog_Box, SAP_Services, End_Window, Logging_Services, Rds_Services
Declare subroutine Labeling_Services
DECLARE FUNCTION Get_Property, Get_Status, Dialog_Box, Utility, Send_Message, Popup, obj_RDS_Makeup, Msg, obj_RDS
DECLARE FUNCTION obj_Tables, obj_Clean_Insp, obj_WO_Mat_QA, obj_RDS_Test, obj_WO_Mat, Signature_Services
DECLARE FUNCTION obj_WO_Step, Security_Check, obj_RDS_Audit, obj_WM_In, Create_Dialog, obj_NCR, obj_WO_Mat, MemberOf
DECLARE FUNCTION Start_Window, Database_Services, Development_Services, RDS_Services, RTI_Lock_Owner, Logging_Services
DECLARE FUNCTION Environment_Services, Wafer_Counter_Services, Error_Services, Hold_Services, Datetime
EQU CRLF$ TO \0D0A\
$INSERT LOGICAL
$INSERT APPCOLORS
$INSERT MSG_EQUATES
$INSERT POPUP_EQUATES
$INSERT RDS_EQUATES
$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 PRS_STAGE_EQUATES
$INSERT WO_MAT_QA_EQUATES
$INSERT WAFER_COUNTER_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_EDGE TO 3
EQU COL$SPEC_MICROSCOPE TO 4
EQU COL$SPEC_BRIGHTLIGHT TO 5
EQU COL$SURFSCAN_RECIPE TO 6
EQU COL$TOOL TO 7
EQU COL$SIG TO 8
EQU COL$SIG_DTM TO 9
LogDate = Oconv(Date(), 'D4/')
LogTime = Oconv(Time(), 'MTS')
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\RDS'
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' WAFERS_IN.csv'
Headers = 'Logging DTM' : @FM : 'RDS Key ID' : @FM : 'WAFERS_IN'
objWafersLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ',', Headers, '', False$, False$)
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
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 = '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 = 'RemZoneMet' ; GOSUB RemoveZoneMet
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 = '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 Method = 'OverrideLog' ; GOSUB OverrideLog
CASE Method = 'AddComment' ; GOSUB AddComment
CASE Method = 'ViewComments' ; GOSUB ViewComments
CASE Method = 'ViewLotHistory' ; GOSUB ViewLotHistory
CASE Method = 'Close' ; GOSUB Close
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') 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 (Memberof( @USER4, 'MASTER' )) OR ( @USER4 = ProdMgr ) OR ( @USER4 = TrainSpec ) THEN
Set_Property( @WINDOW:'.VIEW_MOD_HIST', 'VISIBLE', 1 )
END
RDSNo = Get_Property(@Window:'.RDS_NO', 'TEXT')
WOMatKey = Xlate('RDS', RDSNo, 'WO_MAT_KEY', 'X', '')
HoldCheck = Hold_Services('CheckForHold', WOMatKey, '')
IF HoldCheck THEN
Set_Property(@WINDOW:'.HOLD_BUTTON2','TEXT','Remove Hold')
Set_Property(@Window:'.MENU.PRINT.REPRINT_HOLD_LABEL', 'ENABLED', True$)
END ELSE
Set_Property(@WINDOW:'.HOLD_BUTTON2','TEXT','Place on Hold')
Set_Property(@Window:'.MENU.PRINT.REPRINT_HOLD_LABEL', 'ENABLED', False$)
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
EnableQASignButton = 0
IF QASignReason = '' THEN QASignReason = 'Wafers In or Wafers Verified is not equal to Wafers Scheduled'
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')
RDSNo = Get_Property(@Window:'.RDS_NO', 'TEXT')
LoadSig = Xlate('RDS', RDSNo, 'OPERATOR_IN', 'X')
If LoadSig NE '' then Set_Property(@Window:'.VERIFY_QTY', 'ENABLED', False$)
IF VerifyQty NE WafersScheduled THEN
Ctrls = @WINDOW:'.VERIFY_QTY'
Props = 'BACKCOLOR'
Vals = RED$
END ELSE
Ctrls = @WINDOW:'.VERIFY_QTY'
Props = 'BACKCOLOR'
If LoadSig NE '' then
Vals = READONLY_GREEN$
end else
Vals = WHITE$
end
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:'.NCR_MU_BUTTON','VISIBLE',0)
END ELSE
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<Line,2>
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
UnloadSig = Get_Property(@Window:'.OP_OUT', 'TEXT')
If UnloadSig NE '' then
Set_Property(@Window:'.PUB_SIGN', 'TEXT', 'Unsign')
end else
Set_Property(@Window:'.PUB_SIGN', 'TEXT', 'Sign')
end
END
****************************************************************************************************************************************
// RDS and RDS_POST_EPI
If @WINDOW = 'RDS' or @WINDOW = 'RDS_POST_EPI' THEN
CtrlName = @WINDOW:'.MET_TEST'
MetList = Get_Property(CtrlName,'LIST')
MetListtest = XLATE('RDS', @ID, 'MET_TEST_QA', 'X')
MLCnt = COUNT(MetList,@FM) + (MetList NE '')
FOR Line = 1 TO MLCnt
//MetResult = ICONV(MetList<Line,COL$MET_RESULT>, "MD1")
IF MetList<Line,COL$MET_TEST> NE '' THEN
BEGIN CASE
CASE MetList<Line,COL$MET_RESULT> = ''
Color = YELLOW$
CASE MetList<Line,COL$MET_RESULT> < MetList<Line,COL$MET_MIN> OR MetList<Line,COL$MET_RESULT> > MetList<Line,COL$MET_MAX>
//CASE MetResult < MetList<Line,COL$MET_MIN> OR MetResult > MetList<Line,COL$MET_MAX>
Color = RED$
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
WOMatKey = WONo:'*':CassNo
RDSNo = Xlate('WO_MAT', WOMatKey, 'RDS_NO', 'X')
WOStep = Xlate('RDS', RDSNo, 'WO_STEP', 'X')
QAResults = obj_WO_Mat_QA('QAResults',WONo:@RM:WOStep:@RM:CassNo)
If QAResults NE '' THEN
EnableQASignButton = 0
IF QASignReason = '' THEN QASignReason = QAResults
END
END
If @WINDOW EQ 'RDS' then
LoadSig = Get_Property(@Window:'.OP_IN', 'TEXT')
PUBText = Get_Property(@Window:'.PUB_SIGN', 'TEXT')
If LoadSig NE '' then
Set_Property(@Window:'.PUB_SIGN', 'TEXT', 'Unsign')
end else
Set_Property(@Window:'.PUB_SIGN', 'TEXT', 'Sign')
end
end
END
****************************************************************************************************************************************
// RDS_UNLOAD
If @WINDOW EQ 'RDS_UNLOAD' then
DevelopmentFlag = Xlate('DEVELOPMENT', 'HGCV', 'STATUS', 'X')
If (DevelopmentFlag EQ True$) then
CtrlName = @WINDOW:'.EDT_QA_MET'
Set_Property(@Window : '.MET_TEST', 'VISIBLE', False$)
Set_Property(CtrlName, 'VISIBLE', True$)
MetList = Get_Property(CtrlName,'LIST')
ThickOutOfSpec = False$
CresOutOfSpec = False$
MLCnt = COUNT(MetList,@FM) + (MetList NE '')
FOR Line = 1 TO MLCnt
IF MetList<Line,COL$UL_MET_TEST> NE '' THEN
MetResult = MetList<Line,COL$UL_MET_RESULT>
MetMin = MetList<Line,COL$UL_MET_MIN>
MetMax = MetList<Line,COL$UL_MET_MAX>
PhaseMin = MetList<Line,COL$UL_MET_PHASE_MIN>
PhaseResult = MetList<Line,COL$UL_MET_PHASE_RESULT>
ScanRecipe = MetList<Line,COL$UL_MET_RECIPE>
PSN = Get_Property(@Window : '.PSN', 'TEXT')
PRSStageKey = PSN:'*UNLOAD'
MetTest = MetList<Line,COL$UL_MET_TEST>
PRSStageRec = Database_Services('ReadDataRow', 'PRS_STAGE', PRSStageKey)
SpecTests = PRSStageRec<PRS_STAGE_MET_TEST$>
SpecRecipe = ''
RDSNo = Get_Property(@Window:'.RDS_NO', 'TEXT')
QAMetKey = Xlate('RDS', RDSNo, 'WO_MAT_KEY', 'X')
WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', QAMetKey)
DataPoints = WOMatQARec<WO_MAT_QA_DATA_POINTS$, Line>
Begin Case
Case MetTest EQ 'THICK_ONLY'
// Check each point to see if any are out of spec
For each DataPoint in DataPoints using @SVM setting ThickIndex
Until DataPoint EQ ''
Begin Case
Case ThickIndex GT 10
Null
Case (DataPoint EQ '')
ThickOutOfSpec = True$
Case (DataPoint GT MetMax) OR (DataPoint LT MetMin)
ThickOutOfSpec = True$
End Case
Next DataPoint
Case MetTest EQ 'CRES'
// Check critical points to see if any are out of spec (both HgCV and Phase)
CriticalPoints = '1,2,5,6,9'
For each DataPoint in DataPoints using @SVM setting CresIndex
Until DataPoint EQ ''
HgCVDataPoint = DataPoint[1, 'F':@TM]
PhaseDataPoint = DataPoint[-1, 'B':@TM]
CriticalPoint = Index(CriticalPoints, CresIndex, 1)
Begin Case
Case (HgCVDataPoint EQ '') and CriticalPoint
CresOutOfSpec = True$
Case (PhaseDataPoint EQ '') and CriticalPoint
CresOutOfSpec = True$
Case (HgCVDataPoint GT MetMax) OR (HgCVDataPoint LT MetMin) and CriticalPoint
CresOutOfSpec = True$
Case (PhaseDataPoint LT PhaseMin) and CriticalPoint
CresOutOfSpec = True$
End Case
Next DataPoint
End Case
QAMetOutofSpec = (ThickOutOfSpec or CresOutOfSpec)
Locate MetTest in SpecTests using @VM setting vPos then
SpecRecipe = PRSStageRec<PRS_STAGE_MET_RECIPE$, vPos>
end
NoError = True$
If (MetList<Line,COL$UL_MET_RESULT> EQ '') then
Color = YELLOW$
stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RESULT, Line, Color)
NoError = False$
end
If QAMetOutofSpec EQ True$ then
Color = BYELLOW$:@FM:BLACK$:@FM:BYELLOW$:@FM:BLACK$
stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RESULT, Line, Color)
NoError = False$
end
If (MetResult LT MetMin) then
Color = RED$:@FM:'':@FM:BRED$:@FM:''
stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RESULT, Line, Color)
NoError = False$
end
If (MetResult GT MetMax) then
Color = RED$:@FM:'':@FM:BRED$:@FM:''
stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RESULT, Line, Color)
NoError = False$
end
If (PhaseResult LT PhaseMin) then
Color = RED$:@FM:'':@FM:BRED$:@FM:''
stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_PHASE_RESULT, Line, Color)
NoError = False$
end
QAFailReason = WOMatQARec<WO_MAT_QA_FAIL_REASON$, Line>
DetectedFail = Index(QAFailReason, 'Number of data points is less than the required amount', 1)
If (ScanRecipe NE SpecRecipe) OR (DetectedFail) then
Color = RED$:@FM:'':@FM:BRED$:@FM:''
stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RECIPE, Line, Color)
NoError = False$
end
If (NoError EQ True$) then
Color = GREEN$
stat = Send_Message(CtrlName,'COLOR_BY_POS',0,Line,Color)
end
END ELSE
Color = GREEN$
stat = Send_Message(CtrlName,'COLOR_BY_POS',0,Line,Color)
END
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'
Set_Property(@Window : '.EDT_QA_MET', '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<Line,COL$MET_TEST> NE '' THEN
BEGIN CASE
CASE MetList<Line,COL$MET_RESULT> = ''
Color = YELLOW$
CASE MetList<Line,COL$MET_RESULT> < MetList<Line,COL$MET_MIN> OR MetList<Line,COL$MET_RESULT> > MetList<Line,COL$MET_MAX>
Color = RED$
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 WafersScheduled NE WafersOut then
BackColor = RED$
end else
BackColor = GREEN$
end
Set_Property(@Window:'.WAFERS_SCHEDULED','BACKCOLOR',BackColor)
Set_Property(@Window:'.WAFERS_OUT','BACKCOLOR',BackColor)
IF MemberOf(@USER4, 'SAP_ADMIN') 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)
GoSub RefreshWaferCounterData
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<I,COL$PARMS_OUT>,'B') = 1 THEN
ParmColor = RED$
END ELSE
IF ICONV(LayerList<I,COL$PARAMS>,'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<I,COL$MET_NO> NE '' THEN
MetNo = LayerList<I,COL$MET_NO>
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<I,COL$THICK_AVG> = '' AND LayerList<I,COL$RRHO_AVG> = '' AND LayerList<I,COL$MET_NO> 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<I,COL$MET_NO_Z1> NE '' THEN
MetNo = LayerList<I,COL$MET_NO_Z1>
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<I,COL$THICK_AVG_Z1> = '' AND LayerList<I,COL$RRHO_AVG_Z1> = '' AND LayerList<I,COL$MET_NO_Z1> 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<I,COL$MET_NO_Z2> NE '' THEN
MetNo = LayerList<I,COL$MET_NO_Z2>
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
If TWSigned EQ False$ then
MetColorZ2 = ORANGE$
EnableLoadButton = 0
END
* IF NOT(obj_RDS_Test('TestComplete',MetNo:@RM:MetRec)) THEN
If TestComp EQ False$ 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<I,COL$THICK_AVG_Z2> = '' AND LayerList<I,COL$RRHO_AVG_Z2> = '' AND LayerList<I,COL$MET_NO_Z2> 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')
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<Line,COL$ACTION> NE '' THEN
BEGIN CASE
CASE @WINDOW = 'RDS_PRE_EPI'
CICtrl = @WINDOW:'.PRE_CI_NO'
CASE @WINDOW = 'RDS'
CICtrl = @WINDOW:'.FWI_CI_NO'
CASE @WINDOW = 'RDS_UNLOAD'
CICtrl = @WINDOW:'.LWI_CI_NO'
CASE @WINDOW = 'RDS_POST_EPI'
CICtrl = @WINDOW:'.POST_CI_NO'
CASE 1 ; RETURN
END CASE
CINo = Get_Property(CICtrl,'DEFPROP')
CIStatus = Xlate('CLEAN_INSP', CINo,CLEAN_INSP_ROTR_ACTION$, 'X')
Begin Case
Case CIList<Line, COL$ACTION> EQ 'Clean'
SigReq = Xlate('CLEAN_INSP', CINo, CLEAN_INSP_SPEC_CLEAN_REQ$, 'X')
Case CIList<Line, COL$ACTION> EQ 'Inspection'
SigReq = Xlate('CLEAN_INSP', CINo, CLEAN_INSP_SPEC_INSP_REQ$, 'X')
Case CIList<Line, COL$ACTION> EQ 'SurfScan'
SigReq = Xlate('CLEAN_INSP', CINo, CLEAN_INSP_SPEC_SURFSCAN_REQ$, 'X')
Case Otherwise$
SigReq = False$
End Case
BEGIN CASE
Case SigReq NE True$
Color = GREEN$
CASE CIList<Line,COL$TOOL> = ''
Color = YELLOW$
EnableUnloadButton = 0 ;* 1/9/2013 JCH
EnableQASignButton = 0
IF QASignReason = '' THEN QASignReason = 'Clean Inspection Steps Required'
CASE CIList<Line,COL$TOOL> NE '' AND CIList<Line,COL$SIG> = '' AND CIStatus NE 'P'
Color = RED$
EnableUnloadButton = 0
EnableQASignButton = 0
IF QASignReason = '' THEN QASignReason = 'Clean Inspection Steps not Signed'
CASE CIStatus NE 'P' AND CIList<Line,COL$ACTION> EQ 'SurfScan'
ROTRSignature = Xlate('CLEAN_INSP', CINo, CLEAN_INSP_SIGN_ROTR_SIGNATURE$, 'X')
IF ROTRSignature NE '' then
Color = ORANGE$
end else
Color = RED$
end
CASE Otherwise$
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
NCRList = Get_Property(@WINDOW:'.NCR_KEYS','LIST')
FOR Line = 1 TO COUNT(NCRList,@FM) + (NCRList NE '')
Status = NCRList<Line,2>
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'
END
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)
Set_Property(@WINDOW:'.REM_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)
Set_Property(@WINDOW:'.REM_ZONE','VISIBLE',0)
END
END
* * * * * Hide Signature Profile Button if Non-EpiPro * * * * *
RDSNo = Get_Property(@Window:'.RDS_NO', 'TEXT')
ReactorType = Xlate('RDS', RDSNo, 'REACTOR_TYPE', 'X')
* If ( (ReactorType EQ 'EPP') or (ReactorType EQ 'P') ) then
* Set_Property(@Window:'.SIG_PROFILE', 'VISIBLE', False$)
* end else
* Set_Property(@Window:'.SIG_PROFILE', 'VISIBLE', True$)
* end
QBFList = Get_Property(@Window, "QBFLIST")
NumRDS = DCount(QBFList, @FM)
QBFEnabled = (NumRDS GT 1)
Set_Property(@Window:'.PHX_QBF_FIRST', 'VISIBLE', QBFEnabled)
Set_Property(@Window:'.PHX_QBF_PREV', 'VISIBLE', QBFEnabled)
Set_Property(@Window:'.PHX_QBF_NEXT', 'VISIBLE', QBFEnabled)
Set_Property(@Window:'.PHX_QBF_LAST', 'VISIBLE', QBFEnabled)
RDSNo = Get_Property(@WINDOW:'.RDS_NO','TEXT')
RecordLocked = Database_Services('IsKeyIDLocked', 'RDS', RDSNo)
SelfLocked = Database_Services('IsKeyIDSelfLocked', 'RDS', RDSNo)
Open 'RDS' to hRDS then
If SelfLocked then
Set_Property(@Window:'.LOAD_EPI_PRO', 'ENABLED', True$)
Set_Property(@Window:'.UNLOAD_EPI_PRO', 'ENABLED', True$)
Set_Property(@Window:'.CLEAR_EPI_UNLOAD', 'ENABLED', True$)
Set_Property(@Window:'.PUB_SIGN', 'ENABLED', True$)
end
If RecordLocked and Not(SelfLocked) then
Set_Property(@Window:'.LOAD_EPI_PRO', 'ENABLED', False$)
Set_Property(@Window:'.UNLOAD_EPI_PRO', 'ENABLED', False$)
Set_Property(@Window:'.CLEAR_EPI_UNLOAD', 'ENABLED', False$)
Set_Property(@Window:'.PUB_SIGN', 'ENABLED', False$)
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 Not(Num(WafersIn)) then
// Log the WafersIn value
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = RDSNo
LogData<3> = WafersIn
Logging_Services('AppendLog', objWafersLog, LogData, @RM, @FM)
WafersIn = WafersIn<1, 1, 1>
end
IF WafersIn NE ScheduledWafers THEN
UserInput = Msg(@window, '','WAFERS_IN_VERIFY')
OrigWafersIn = Xlate('RDS', RDSNo, 'WAFERS_IN', 'X')
If Not(Num(OrigWafersIn)) then
// Log the WafersIn value
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = RDSNo
LogData<3> = OrigWafersIn
Logging_Services('AppendLog', objWafersLog, LogData, @RM, @FM)
OrigWafersIn = OrigWafersIn<1, 1, 1>
end
Set_Property(@WINDOW:'.WAFERS_IN','TEXT',OrigWafersIn)
Set_Property(@WINDOW:'.WAFERS_IN','FOCUS',1)
END
GOSUB Refresh
RETURN
* * * * * * *
FirstRead:
* * * * * * *
* Hooked from RDS (first wafer) screen
RDSNo = Get_Property(@Window:'.RDS_NO', 'TEXT')
WOMatKey = Xlate('RDS', RDSNo, 'WO_MAT_KEY', 'X', '')
HoldCheck = Hold_Services('CheckForHold', WOMatKey, '')
IF HoldCheck THEN
Set_Property(@WINDOW:'.HOLD_BUTTON2','TEXT','Remove Hold')
END ELSE
Set_Property(@WINDOW:'.HOLD_BUTTON2','TEXT','Place on Hold')
END
* * * * * * *
FirstRefresh:
* * * * * * *
RDSNo = Get_Property(@WINDOW:'.RDS_NO','TEXT')
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
* * * * * * *
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)
errCode = ''
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<PDISPLAY$> = RDSNos
TypeOver<PFIELD$> = 2
TypeOver<PTYPE$> = '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<MTEXT$> = "Printing Cassette Labels..."
Def<MTYPE$> = "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:'') ;* 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<I>:@TM:OCONV(UserNames<I>,'[XLATE_CONV,LSL_USERS*FIRST_LAST]' ):@TM:LastDTMs<I>:@TM:Windows<I>
NEXT I
OverRide = ''
OverRide<PDISPLAY$> = 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
// Do not clear on WRITE
PrevIOOptions = Get_Property(@Window, 'IOOPTIONS')
IOOptions = PrevIOOptions
IOOptions<6> = True$
Set_Property(@Window, 'IOOPTIONS', IOOptions)
Send_Event(@Window, 'WRITE')
Set_Property(@Window, 'IOOPTIONS', PrevIOOptions)
RdsLSID = RDSNo:'*':LSId
Dialog_Box('RDS_LAYER', @Window, RdsLSID)
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(@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<COL$OUT_CASS>
CONVERT @VM TO '' IN OutCassettes
IF OutCassettes NE '' THEN
ErrMsg('Wafers have already been unloaded from the reactor.')
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
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<COL$USE,I>
WfrType = CurrentLoad<COL$CHAR,I>
OutCass = CurrentLoad<COL$OUT_CASS,I>
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<COL$USE,I>
WfrType = CurrentLoad<COL$CHAR,I>
OutCass = CurrentLoad<COL$OUT_CASS,I>
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<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
* * * * * * *
RemoveZoneMet:
* * * * * * *
CtrlEntID = @WINDOW:'.RDS_LS_ID'
RDSNo = Get_Property(@WINDOW,'ID')
PSNo = Get_Property(@WINDOW:'.PSN','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 NE '' or Z1Test NE '' or Z2Test NE '' THEN
BEGIN CASE
CASE Z1Test NE '' AND Z2Test NE ''
* Ask for z1 or z2
TypeOver = ''
TypeOver<MTYPE$> = 'B&1,&2,&Cancel'
TypeOver<MCAPTION$> = 'Which zone metrology would you like to remove?'
TypeOver<MICON$> = '?'
TypeOver<MDEFBTN$> = '3'
TypeOver<MTEXT$> = 'Remove Metrology for Zone:'
DeleteZone = Msg(@WINDOW,TypeOver,'')
IF DeleteZone = 3 THEN RETURN
CASE Otherwise$
ErrMsg('At least one zone must have metrology.')
RETURN
END CASE
Send_Event(@WINDOW,'WRITE')
NumMet = DCount(MetNos, @VM)
FOR I = 1 TO NumMet
Begin Case
Case DeleteZone EQ 1
// Operator wants to delete metrology from zone 1.
IF MetNosZ1<1,I> NE '' THEN
MetNo = MetNosZ1<1,I>
oRTParms = MetNo:@RM
obj_RDS_Test('Delete',oRTParms)
END
Case DeleteZone EQ 2
// Operator wants to delete metrology from zone 2.
IF MetNosZ2<1,I> NE '' THEN
MetNo = MetNosZ2<1,I>
oRTParms = MetNo:@RM
obj_RDS_Test('Delete',oRTParms)
END
Case Otherwise$
Null
End Case
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<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 '' or Z1Test NE '' or Z2Test 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')
NumMet = DCount(MetNos, @VM)
FOR I = 1 TO NumMet
Begin Case
Case Z1Test EQ '' and Z2Test EQ ''
// Metrology has not yet been assigned to a zone.
IF MetNos<1,I> NE '' THEN
MetNo = MetNos<1,I>
oRTParms = MetNo:@RM
oRTParms := DestZone
obj_RDS_Test('SetZone',oRTPARms)
END
Case Z1Test EQ '' and Z2Test NE ''
// Operator wants to move metrology from zone 2 to zone 1.
IF MetNosZ2<1,I> NE '' THEN
MetNo = MetNosZ2<1,I>
oRTParms = MetNo:@RM
oRTParms := DestZone
obj_RDS_Test('SetZone',oRTPARms)
END
Case Z1Test NE '' and Z2Test EQ ''
// Operator wants to move metrology from zone 1 to zone 2.
IF MetNosZ1<1,I> NE '' THEN
MetNo = MetNosZ1<1,I>
oRTParms = MetNo:@RM
oRTParms := DestZone
obj_RDS_Test('SetZone',oRTPARms)
END
Case Otherwise$
// Swap zones?
Null
End Case
NEXT I
Set_Property(@WINDOW:'.RDS_NO','DEFPROP',RDSNo)
Send_Event(@WINDOW,'READ')
END
RETURN
* * * * * * *
HoldClick:
* * * * * * *
RDSNo = Get_Property(@WINDOW:'.RDS_NO','DEFPROP')
CtrlEnt = Get_Property(@WINDOW,'FOCUS')
PSN = Get_Property(@WINDOW:'.PSN','TEXT')
ReactorType = Get_Property(@WINDOW:'.REACTOR_TYPE','TEXT')
If ReactorType = 'EPP' then
Reactor = 'EPP'
end else
Reactor = Get_Property(@WINDOW:'.REACTOR','TEXT')
end
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.
IF RDSNo NE '' then
HoldEntity = 'RDS'
HoldEntityID = RDSNo
WOMatKey = Xlate('RDS', RDSNo, 'WO_MAT_KEY', 'X', '')
//obj_WO_Mat('ToggleHold',WOMatKey:@RM:HoldEntity:@RM:HoldEntityID:@RM:CtrlEnt)
Transition = Hold_Services('CheckForHold', WOMatKey, CtrlEnt)
Stage = Xlate('WO_MAT', WOMatKey, WO_MAT_HOLD_STAGE$, 'X')
Interrupted = Xlate('WO_MAT', WOMatKey, WO_MAT_HOLD_INTERRUPTED$, 'X')
HoldType = 'HOLD'
HoldData = ''
HoldData = Dialog_Box('DIALOG_HOLD',@WINDOW,Transition:@FM:@FM:HoldType:@FM:Stage:@FM:Interrupted)
If HoldData NE 'Cancel' then
Hold_Services('ToggleHold', WOMatKey, HoldEntity, HoldEntityID, CtrlEnt, '', HoldData, '')
IF Error_Services("HasError") THEN
ErrCode = Error_Services("GetMessage")
ErrMsg(errCode)
end else
If Transition EQ False$ then
MsgInfo = ''
MsgInfo<MTYPE$> = 'BNY'
MsgInfo<MTEXT$> = 'Hold Successful. Would you like to print label(s)?'
MsgInfo<MICON$> = '!'
PrintLabel = Msg(@WINDOW,MsgInfo,'')
HoldBy = HoldData<1>
Reason = HoldData<2>
Stage = HoldData<4>
Interrupted = HoldData<5>
DTM = Datetime()
If PrintLabel EQ True$ then
Labeling_Services('PrintHoldLabel', HoldEntity, HoldEntityID, Stage, Reason, HoldBy, DTM, PSN, Reactor, Interrupted)
end
end
end
end
end
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>
WOMatRec = Database_Services("ReadDataRow", "WO_MAT", WOMatKey, "", "", FALSE$)
IF INDEX(ColName,'START',1) THEN
HoldStartReason = WOMatRec<WO_MAT_HOLD_START_REASON$,CurrRow>
UpdatedText = Dialog_Box('DIALOG_TEXT',@WINDOW,'Hold Start Reason':@FM:HoldStartReason)
END ELSE
IF INDEX(ColName,'STOP',1) THEN
HoldStopReason = WOMatRec<WO_MAT_HOLD_STOP_REASON$,CurrRow>
UpdatedText = Dialog_Box('DIALOG_TEXT',@WINDOW,'Hold Stop Reason':@FM:HoldStopReason)
END
END
If UpdatedText NE 'Cancel' then
Hold_Services("EditHoldReason",WOMatKey, ColName, CurrRow, UpdatedText)
End
IF Error_Services("NoError") NE TRUE$ THEN
ErrMsg(Error_Services("GetMessage"))
end
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<LSL_USERS_RDS_MASTER$>
UserGroups = UserRec<LSL_USERS_GROUPS$>
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
Set_Property('WO_MAT_WFR', 'VISIBLE', 1)
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<WO_MAT_RDS_NO$>
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
CurrQBFPos = Get_Property (@WINDOW, "QBFPOS"); // 4/14/2025 - JRO - CLEAR event below is advancing the QBF position. Buffer the current position before that happens
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.
Set_Property (@WINDOW, "QBFPOS", CurrQBFPos); // - JRO - 4/14/2025 CLEAR event above is advancing the QBF position. apply the buffered position value
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
* * * * * * *
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', 'A')
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 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
Sigs<1,I> = Sig
SigDTMs<1,I> = SigDTM
NEXT I
RDSRec<RDS_PRE_EPI_SIG$> = Sig
RDSRec<RDS_PRE_EPI_SIG_DATE$> = CurrDt
RDSRec<RDS_PRE_EPI_SIG_TIME$> = CurrTm - 250
RDSRec<RDS_OPERATOR_IN$> = Sig
RDSRec<RDS_DATE_IN$> = CurrDt
RDSRec<RDS_TIME_IN$> = CurrTm - 200
RDSRec<RDS_FIRST_WAF_SIG$> = Sig
RDSRec<RDS_FIRST_WAF_SIG_DATE$> = CurrDt
RDSRec<RDS_FIRST_WAF_SIG_TIME$> = CurrTm - 150
RDSRec<RDS_OPERATOR_OUT$> = Sig
RDSRec<RDS_DATE_OUT$> = CurrDt
RDSRec<RDS_TIME_OUT$> = CurrTm - 100
RDSRec<RDS_POST_EPI_SIG$> = Sig
RDSRec<RDS_POST_EPI_SIG_DATE$> = CurrDt
RDSRec<RDS_POST_EPI_SIG_TIME$> = CurrTm - 50
RDSRec<RDS_STATUS$> = 'T'
RDSRec<RDS_VERIFY_QTY$> = SchedQty
RDSRec<RDS_WAFERS_IN$> = SchedQty
RDSRec<RDS_WAFERS_OUT$> = SchedQty
otParms = FIELDSTORE(otParms,@RM,4,0,RDSRec)
obj_Tables('WriteRec',otParms)
IF Get_Status(errCode) THEN
obj_Tables('UnlockRec',otParms)
END
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
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]
WOMatKey = WONo:'*':CassNo
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
IF Get_Status(errCode) THEN
CALL ErrMsg(ErrCode)
RETURN 0 ;* Added 4/4/2013 JCH
END
EventParms<COL$LOG_FILE> = 'WO_MAT'
EventParms<COL$LOG_DTM> = SigDt:' ':SigTm
EventParms<COL$WO_MAT_ACTION> = WOStep:'QA'
EventParms<COL$WH_CD> = 'CR'
EventParms<COL$LOC_CD> = 'QA'
EventParms<COL$WO_NOS> = WONo
EventParms<COL$CASS_NOS> = CassNo
EventParms<COL$USER_ID> = @USER4
EventParms<COL$TAGS> = ''
EventParms<COL$TOOL_ID> = ''
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<COL$LOG_FILE> = 'WO_MAT'
EventParms<COL$LOG_DTM> = SigDt:' ':SigTmPlusTwo
EventParms<COL$WO_MAT_ACTION> = 'RTU'
EventParms<COL$WH_CD> = 'CR'
EventParms<COL$LOC_CD> = 'MU'
EventParms<COL$WO_NOS> = WONo
EventParms<COL$CASS_NOS> = CassNo
EventParms<COL$USER_ID> = @USER4
EventParms<COL$TAGS> = ''
EventParms<COL$TOOL_ID> = ''
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)
// Send SAP "CASS_COMP" transaction
Sap_Services('AddCassCompTransaction', WOMatKey)
* 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<WO_MAT_RDS_NO$>
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
CurrPos = Get_Property(@WINDOW:'.MET_TEST', 'SELPOS')
CurrCol = CurrPos<1>
CurrRow = CurrPos<2>
Lines = Get_Property(@WINDOW:'.MET_TEST', 'LIST')
TestLine = Lines<CurrRow>
LWRHOTest = Indexc(TestLine, 'LW_RHO', 1)
DevelopmentFlag = Xlate('DEVELOPMENT', 'HGCV', 'STATUS', 'X')
If (DevelopmentFlag EQ True$) and (@Window EQ 'RDS_UNLOAD') and (LWRHOTest EQ False$) 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<CurrRow>
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
MetTest = TestLine<0, 1>
BEGIN CASE
CASE MetTest EQ ''
Null
CASE (@WINDOW = 'RDS_UNLOAD') and (DevelopmentFlag EQ True$) and (LWRHOTest EQ False$)
ReturnVal = Dialog_Box('NDW_QA_MET_RESULT', @WINDOW, CassID)
Send_Event(@Window, "READ")
CASE Otherwise$
ReturnVal = Dialog_Box('QA_MET_RESULT', @WINDOW, CassID:@FM:TestLine)
Send_Event(@Window, "READ");
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<PMODE$> = 'K'
TypeOver<PDISPLAY$> = ToolKeys
ToolID = Popup(@WINDOW,TypeOver,'TOOLS')
IF ToolID = '' THEN RETURN
obj_Appwindow('LUValReturn',ToolID:@RM:@WINDOW:'.POST_CODE')
RETURN
* * * * * * *
SigProfile:
* * * * * * *
RDSNo = Get_Property(@WINDOW:'.RDS_NO','TEXT')
WOMatKey = Xlate('RDS', RDSNo, 'WO_MAT_KEY', 'X')
If WOMatKey NE '' or RDSNo NE '' then
SigData = Signature_Services('GetSigProfile', WOMatKey, False$, RDSNo)
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<PDISPLAY$> = Display
void = Popup(@WINDOW,TypeOver,'SIG_PROFILE')
end
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
* * * * * * * *
Overridelog:
* * * * * * * *
RDSNo = Get_Property(@WINDOW:'.RDS_NO','TEXT')
orKeys = XLATE('RDS',RDSNo, 295, 'X')
Display = ''
overriderec = ''
i = 1
For Each orKey in orKeys using @VM
overriderec = Xlate('OVERRIDE_LOG', orKey, '', 'X')
Display<1,I,1> = overriderec<3>
Display<1,I,2> = overriderec<4>
Display<1,I,3> = overriderec<5>
Display<1,I,4> = overriderec<6>
i = i + 1
Next orKey
TypeOver = ''
TypeOver<PDISPLAY$> = Display
void = Popup(@WINDOW,TypeOver,'OVERRIDES')
RETURN
* * * * * * * *
AddComment:
* * * * * * * *
RDSNo = Get_Property(@WINDOW:'.RDS_NO','TEXT')
If RDSNo NE '' then
Response = Dialog_Box('NDW_ADD_RDS_COMMENT', @Window)
If Response NE '' then Rds_Services('AddComment', RDSNo, Response)
end
return
* * * * * * * *
ViewComments:
* * * * * * * *
RDSNo = Get_Property(@WINDOW:'.RDS_NO','TEXT')
If RDSNo NE '' then Response = Dialog_Box('NDW_RDS_COMMENT_VIEWER', @Window, RDSNo)
return
* * * * * * * *
ViewLotHistory:
* * * * * * * *
RDSNo = Get_Property(@WINDOW:'.RDS_NO','TEXT')
If RDSNo NE '' then Response = Dialog_Box('NDW_LOT_HISTORY_VIEWER', @Window, RDSNo)
return
* * * * * * * *
Close:
* * * * * * * *
return
RefreshWaferCounterData:
WCCheckEnabled = Xlate('APP_INFO', 'WAFER_COUNTER_CHECK', '', 'X')
If WCCheckEnabled then
Set_Property(@Window:'.LBL_WAFER_COUNTER_QTY', 'VISIBLE', True$)
Set_Property(@Window:'.EDL_WAFER_COUNTER_QTY', 'VISIBLE', True$)
QtyBackColor = GREEN$
RDSNo = Get_Property(@Window : '.RDS_NO','DEFPROP')
If RDSNo NE '' then
FqaWcRec = Wafer_Counter_Services('GetLastScan', RDSNo, 'QA')
WaferCounterQty = FqaWcRec<WAFER_COUNTER.SCAN_QTY$>
Set_Property(@Window, '@ORIG_WFR_CTR_QTY', WaferCounterQty)
WafersOut = Get_Property(@WINDOW:'.WAFERS_OUT','TEXT')
Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','DEFPROP', WaferCounterQty)
*****************************************
* WaferCounter - Wafers Quantity Section *
*****************************************
If (WaferCounterQty NE '') then
If (WaferCounterQty NE WafersOut) then QtyBackColor = RED$
end else
QtyBackColor = ORANGE$
end
WaferSize = Xlate('RDS', RDSNo, 'WAFER_SIZE', 'X')
WaferSize = Field(WaferSize, ' ', 3, 1)
If ( (WaferSize EQ 6) or (WaferSize EQ 8) ) then
WCToolId = Wafer_Counter_Services('GetWaferCounterToolID', WaferSize:'INCH', 'QA')
If Error_Services('NoError') then
WCCurrMode = ''
If RowExists('TOOL', WCToolID) then
WCCurrModeKey = Xlate('TOOL', WCToolID, 'CURR_MODE_KEY', 'X')
WCCurrMode = Xlate('TOOL_LOG', WCCurrModeKey, 'TOOL_MODE', 'X')
Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY', 'ENABLED', (WCCurrMode NE 'PROD'))
end else
ErrMsg('Verify wafer count error. Invalid wafer counter tool ID "':WCToolID:'".')
end
end else
ErrMsg(Error_Services('GetMessage'))
end
end else
ErrMsg('Verify wafer count error. Invalid wafer size "':WaferSize:'" returned for RDS "':RDSNo:'".')
end
end
Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','BACKCOLOR', QtyBackColor)
end else
Set_Property(@Window:'.EDL_WAFER_COUNTER_QTY', 'VISIBLE', False$)
Set_Property(@Window:'.LBL_WAFER_COUNTER_QTY', 'VISIBLE', False$)
end
return