Feature complete. Ready for UAT. Minor changes to ZPL Hold header and darkness. Implement post UAT changes. fixed small bug in WMO reprint event logic formatted code and removed commented out code
2954 lines
100 KiB
Plaintext
2954 lines
100 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')
|
|
RecordLocked = Database_Services('IsKeyIDLocked', 'RDS', RDSNo)
|
|
SelfLocked = Database_Services('IsKeyIDSelfLocked', 'RDS', RDSNo)
|
|
Open 'RDS' to hRDS then
|
|
If SelfLocked then
|
|
WriteV @User4 on hRDS, RDSNo, RDS_LOCKED_BY$ else
|
|
Null
|
|
end
|
|
WriteV @Station on hRDS, RDSNo, RDS_LOCKED_BY_STATION$ else
|
|
Null
|
|
end
|
|
end
|
|
If RecordLocked and Not(SelfLocked) then
|
|
ReadV LockHolder from hRDS, RDSNo, RDS_LOCKED_BY$ then
|
|
ReadV StationName from hRDS, RDSNo, RDS_LOCKED_BY_STATION$ then
|
|
If StationName NE '' then
|
|
StationLoc = Xlate('LSL_CLIENTS', StationName, 'LOCATION', 'X')
|
|
end else
|
|
StationName = 'Unknown'
|
|
StationLoc = 'Unknown'
|
|
end
|
|
DisplayName = Oconv(LockHolder,'[XLATE_CONV,LSL_USERS*FIRST_LAST]')
|
|
Message = 'This record is currently locked by ':DisplayName:' from location ':StationLoc:'.'
|
|
Msg(@Window, Message)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
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
|
|
|
|
Send_Event(@WINDOW,'WRITE')
|
|
Send_Event(@WINDOW,'CLEAR') ; // 12/22/2017 - DMB - Although WRITE normally clears the form, QBF mode will prevent the clear so do this explicitly so the lock is removed from the RDS record.
|
|
|
|
DetWindow = 'CLEAN_INSP'
|
|
DetKeys = CINo
|
|
DefaultRec = ''
|
|
RetKey = RDSNo
|
|
RetWin = @WINDOW
|
|
RetPage = 1
|
|
RetCtrl = CurrCtrl
|
|
RetPos = ''
|
|
|
|
obj_Appwindow('ViewNewDetail',DetWindow:@RM:DetKeys:@RM:DefaultRec:@RM:RetKey:@RM:RetPage:@RM:RetCtrl:@RM:RetPos)
|
|
|
|
END
|
|
|
|
RETURN
|
|
|
|
|
|
* * * * * * *
|
|
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:
|
|
* * * * * * * *
|
|
|
|
RDSNo = Get_Property(@WINDOW:'.RDS_NO','TEXT')
|
|
Open 'RDS' to hRDS then
|
|
ReadV LockHolder from hRDS, RDSNo, RDS_LOCKED_BY$ then
|
|
If LockHolder EQ @User4 then
|
|
WriteV '' on hRDS, RDSNo, RDS_LOCKED_BY$ else
|
|
Null
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
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
|
|
|