replaced with NDW_VERIFY_USER. Added barcode scan function to NDW_VERIFY_USER. fixed two instances of ohms square unit characters being garbled by git minor modification to NDW_VERIFY_USER_EVENTS lost focus events minor change to gotfocus event logic
		
			
				
	
	
		
			2381 lines
		
	
	
		
			73 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			2381 lines
		
	
	
		
			73 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| COMPILE FUNCTION Comm_RDS_Test(Instruction, Parm1, Parm2)
 | |
| #pragma precomp SRP_PreCompiler
 | |
| 
 | |
| /*
 | |
| 	Commuter module for RDS_Test Window
 | |
| 	
 | |
| 	02/17/2006 - John C. Henry, J.C. Henry & Co., Inc.
 | |
| 	01/12/2023 - djs - Updated the refresh subroutine to disable TW_USE related controls for EpiPro
 | |
| 	                   RDSs as EpiPro records test wafers at the EpiPro Load Run Configuration dialog.
 | |
| 	                   
 | |
| */
 | |
| 
 | |
| DECLARE SUBROUTINE Set_Property, End_Dialog, Send_Event, Set_Status, Center_Window,Print_Vend_CofA, SPC_Services
 | |
| DECLARE SUBROUTINE ErrMsg, Send_Message, Set_Property, Send_Event, Btree.Extract, obj_AppWindow, Msg,Post_Event
 | |
| DECLARE SUBROUTINE obj_WO_Mat, obj_TW_Use, Forward_Event, Error_Services, Database_Services, Logging_Services
 | |
| 
 | |
| DECLARE FUNCTION Get_Property, Get_Status, Dialog_Box, Utility, Center_Window, Popup, Collect.Ixvals, MemberOf
 | |
| DECLARE FUNCTION Send_Message, obj_RDS_Test, Send_Message, RDS_Comm, Start_Window, Msg, Create_Dialog, obj_WO_Mat
 | |
| DECLARE FUNCTION obj_TW_Use, Environment_Services, Get_EventStatus, Logging_Services, Database_Services
 | |
| DECLARE FUNCTION SPC_Services, Error_Services, RDS_Services
 | |
| 
 | |
| $INSERT RDS_LAYER_EQUATES
 | |
| $INSERT RDS_EQU
 | |
| $INSERT RDS_TEST_EQUATES
 | |
| $INSERT REACT_RUN_EQUATES
 | |
| $INSERT RECIPE_PARMS_EQU
 | |
| $INSERT REACT_STATUS_EQUATES
 | |
| $INSERT POPUP_EQUATES
 | |
| $INSERT LOGICAL
 | |
| $INSERT DICT_EQUATES
 | |
| $INSERT APPCOLORS
 | |
| $INSERT LSL_USERS_EQU
 | |
| $INSERT MSG_EQUATES
 | |
| $INSERT TW_USE_EQUATES
 | |
| $INSERT SPC_QUEUE_EQUATES
 | |
| 
 | |
| EQU CRLF$	TO \0D0A\
 | |
| 
 | |
| EQU SHEETRHO_SPEC_UNITS$	TO \EA2FDC\
 | |
| EQU RES_SPEC_UNITS$			TO \EA2D636D\
 | |
| EQU TAB$					TO CHAR(9)
 | |
| 
 | |
| EQU EDITABLE$		TO 4
 | |
| EQU PROTECTED$		TO 8
 | |
| EQU HIDDEN$			TO 32
 | |
| 
 | |
| EQU COL$TW_QTY				TO 1
 | |
| EQU COL$TW_CODE				TO 2
 | |
| EQU COL$TW_USAGE_DESC		TO 3
 | |
| EQU COL$TW_TOOL				TO 4
 | |
| EQU COL$TW_TYPE				TO 5
 | |
| EQU COL$TW_SIG				TO 6
 | |
| EQU COL$TW_SIG_DTM			TO 7
 | |
| EQU COL$TW_HRS_SINCE_PROD	TO 8
 | |
| EQU COL$TW_HRS_ESC			TO 9
 | |
| EQU COL$TW_WAFER_ID			TO 10
 | |
| EQU COL$TW_USE_ID			TO 11
 | |
| 
 | |
| EQU COL$USE_NO			TO 1
 | |
| EQU COL$QTY				TO 2
 | |
| EQU COL$CODE			TO 3
 | |
| EQU COL$DESC			TO 4
 | |
| EQU COL$TOOL			TO 5
 | |
| EQU COL$TYPE			TO 6
 | |
| EQU COL$SIGNATURE		TO 7
 | |
| EQU COL$SIG_DTM			TO 8
 | |
| EQU COL$WAFER_ID		TO 9 
 | |
| 
 | |
| 
 | |
| ErrTitle = 'Error in Comm_RDS_Test'
 | |
| ErrorMsg = ''
 | |
| 
 | |
| Result = ''
 | |
| 
 | |
| BEGIN CASE
 | |
| 	CASE Instruction = 'Create' 			; GOSUB Create
 | |
| 	CASE Instruction = 'Read'				; GOSUB Read
 | |
| 	CASE Instruction = 'Clear'				; GOSUB Clear
 | |
| 	CASE Instruction = 'Refresh'			; GOSUB Refresh
 | |
| 	CASE Instruction = 'Write'				; GOSUB Write
 | |
| 	CASE Instruction = 'Delete'				; GOSUB Delete
 | |
| 	CASE Instruction = 'Close'				; GOSUB Close
 | |
|     CASE Instruction = 'SYSMSG'             ; GOSUB SYSMSG
 | |
| 	CASE Instruction = 'ReadingsLF'			; GOSUB ReadingsLF
 | |
| 	CASE Instruction = 'ReadingsPC'			; GOSUB ReadingsPC
 | |
| 	CASE Instruction = 'ReadingsDel'		; GOSUB ReadingsDel
 | |
| 	CASE Instruction = 'ReadingsIns'		; GOSUB ReadingsIns
 | |
| 	CASE Instruction = 'TWOptions'			; GOSUB TWOptions
 | |
| 	CASE Instruction = 'TWUseDC'			; GOSUB TWUseDC
 | |
| 	
 | |
| 	CASE Instruction = 'TWPC'				; GOSUB TWPC
 | |
| 	CASE Instruction = 'TWLF'				; GOSUB TWLF
 | |
| 	CASE Instruction = 'TWDel'				; GOSUB TWDel
 | |
| 	CASE Instruction = 'OverRide'			; GOSUB OverRide
 | |
| 	CASE Instruction = 'CopyTSLine'			; GOSUB CopyTSLine
 | |
| 	CASE Instruction = 'AddSRP'				; GOSUB AddSRP
 | |
| 	CASE Instruction = 'ViewSRP'			; GOSUB ViewSRP
 | |
| 	CASE Instruction = 'InsertSRP'			; GOSUB InsertSRP
 | |
| 	CASE Instruction = 'RemoveSRP'			; GOSUB RemoveSRP
 | |
| 	CASE Instruction = 'ThickDC'			; GOSUB ThickDC
 | |
| 	CASE Instruction = 'SendSPC'			; GOSUB SendSPC
 | |
| 	CASE Instruction = 'NewTWUse'			; GOSUB NewTWUse
 | |
| 	
 | |
| 	CASE 1
 | |
| 		ErrorMsg = 'Unknown Instruction passed to routine.'
 | |
| 		ErrMsg(ErrorMsg)
 | |
| END CASE
 | |
| 
 | |
| RETURN Result
 | |
| 
 | |
| 
 | |
| 
 | |
| * * * * * * *
 | |
| Create:
 | |
| * * * * * * *
 | |
| 
 | |
| Center_Window(@WINDOW)
 | |
| 
 | |
| IF Parm1 NE '' THEN
 | |
| 	obj_AppWindow('LoadFormKeys',@WINDOW:@RM:Parm1)
 | |
| END
 | |
| 
 | |
| UserGroups = XLATE( 'LSL_USERS', @USER4 , LSL_USERS_GROUPS$, 'X' )
 | |
| 
 | |
| AddNewSRPButton = 0
 | |
| 
 | |
| LOCATE 'ENGINEERING' IN UserGroups USING @VM SETTING Dummy THEN
 | |
| 	AddNewSRPButton = 1
 | |
| END ELSE
 | |
| 	LOCATE 'MASTER' IN UserGroups USING @VM SETTING Dummy THEN
 | |
| 		AddNewSRPButton = 1
 | |
| 	END
 | |
| END
 | |
| 
 | |
| IF MemberOf(@USER4, 'OI_SUPERUSER') THEN
 | |
| 	AddNewSRPButton = 1
 | |
| 	Set_Property(@WINDOW:'.TEST_POINT_MAP','VISIBLE',1)
 | |
| 	Set_Property(@WINDOW:'.TEST_POINT_MAP_LABEL','VISIBLE',1)
 | |
| 	Set_Property(@WINDOW:'.SEND_SPC','VISIBLE',1)
 | |
| 	Set_Property(@WINDOW:'.SPC_DTM','VISIBLE',1)
 | |
| END ELSE
 | |
| 	Set_Property(@WINDOW:'.TEST_POINT_MAP','VISIBLE',0)
 | |
| 	Set_Property(@WINDOW:'.TEST_POINT_MAP_LABEL','VISIBLE',0)
 | |
| 	Set_Property(@WINDOW:'.SEND_SPC','VISIBLE',1)				;* Chad is ready to go live 3/11/2010 JCH
 | |
| 	Set_Property(@WINDOW:'.SPC_DTM','VISIBLE',1)
 | |
| END
 | |
| 
 | |
| // Deprecated control per the information on the form. Preventing button from becoming visible - dmb - 07/03/2018 - [IREPIOI-50]
 | |
| * Set_Property(@WINDOW:'.ADD_SRP_BUTTON','VISIBLE',AddNewSRPButton)
 | |
| 
 | |
| MeasureUnits = XLATE('LISTBOX_CONFIG','UNITS','','X')
 | |
| CONVERT @VM TO @FM IN MeasureUnits
 | |
| 
 | |
| Set_Property(@WINDOW:'.SPEC_THICK_UNITS','LIST',MeasureUnits)
 | |
| Set_Property(@WINDOW:'.SPEC_RES_UNITS','LIST',MeasureUnits)
 | |
| Set_Property(@WINDOW:'.SPEC_CON_UNITS','LIST',MeasureUnits)
 | |
| Set_Property(@WINDOW:'.SPEC_CRES_UNITS','LIST',MeasureUnits)
 | |
| 
 | |
| 
 | |
| * Build @ET_SYMBOLICS data structure for window
 | |
| 
 | |
| ETSymbolics = ''
 | |
| 
 | |
| EditTables  = Utility ('OBJECTLIST', @WINDOW, 'EDITTABLE')
 | |
| 
 | |
| FOR I = 1 TO COUNT(EditTables,@FM) + (EditTables NE '')
 | |
| 	EditTable = EditTables<I>
 | |
| 	CtrlCols = Get_Property(EditTable,'COLUMN')
 | |
| 	CtrlTables = Get_Property(EditTable, 'TABLE')
 | |
| 	LastTable = ''
 | |
| 	FOR N = 1 TO COUNT(CtrlCols,@SVM) + (CtrlCols NE '')
 | |
| 		CtrlCol = CtrlCols<1,1,N>
 | |
| 		TableName = CtrlTables<1,1,N>
 | |
| 		IF TableName NE '' THEN
 | |
| 			IF TableName NE LastTable THEN
 | |
| 				DictStruct = XLATE('DICT.':TableName,'%FIELDS%','','X')
 | |
| 				LastTable = TableName
 | |
| 			END
 | |
| 			
 | |
| 			LOCATE CtrlCol IN DictStruct<FIELDS_NAME$> USING @VM SETTING Pos THEN
 | |
| 				IF DictStruct<FIELDS_TYPE$,Pos> = 'S' THEN
 | |
| 					LOCATE EditTable IN ETSymbolics<1> USING @VM SETTING ETPos ELSE
 | |
| 						ETSymbolics = INSERT(ETSymbolics,1,ETPos,0,EditTable)
 | |
| 					END
 | |
| 					ETSymbolics<2,ETPos,-1> = N ;* Add Column Number to the list
 | |
| 				END
 | |
| 			END
 | |
| 		END
 | |
| 	NEXT N
 | |
| NEXT I
 | |
| 
 | |
| Set_Property(@WINDOW,'@ET_SYMBOLICS',ETSymbolics)
 | |
| 
 | |
| GOSUB Refresh
 | |
| 
 | |
| RETURN
 | |
| 
 | |
| 
 | |
| * * * * * * * 
 | |
| Clear:
 | |
| * * * * * * * 
 | |
| 
 | |
| GOSUB Refresh
 | |
| 
 | |
| RETURN
 | |
| 
 | |
| 
 | |
| * * * * * * *
 | |
| Read:
 | |
| * * * * * * * 
 | |
| 
 | |
| CurrRecord = Get_Property(@WINDOW,'RECORD')
 | |
| Set_Property(@WINDOW,'@ORG_RECORD',CurrRecord)
 | |
| * Send_Event(@Window : '.THICK_READINGS', 'POSCHANGED')
 | |
| * Send_Event(@Window : '.SHEETRHO_READINGS', 'POSCHANGED')
 | |
| * Send_Event(@Window : '.RES_READINGS', 'POSCHANGED')
 | |
| * Send_Event(@Window : '.HGCV1_READINGS', 'POSCHANGED')
 | |
| * IOOptions       = Get_Property(@Window, 'IOOPTIONS')
 | |
| * IOOptions<6>    = 1
 | |
| * Set_Property(@Window, 'IOOPTIONS', IOOptions)
 | |
| * Set_Property(@WINDOW,'@DONT_CLOSE_ON_WRITE','1')
 | |
| * Send_Event(@Window, 'WRITE')
 | |
| * IOOptions<6>    = 0
 | |
| * Set_Property(@Window, 'IOOPTIONS', IOOptions)
 | |
| 
 | |
| * * * * * * *
 | |
| Refresh:
 | |
| * * * * * * *
 | |
| 
 | |
| /*
 | |
| 	CtrlEntID = @WINDOW:'.WFR_USAGE'
 | |
| 
 | |
| 	TWArray	= Get_Property(CtrlEntID,'DEFPROP')
 | |
| 	TestVals = TWArray<COL$TW_USE_ID>
 | |
| 	CONVERT @VM TO '' IN TestVals
 | |
| 
 | |
| 	IF TestVals NE '' THEN
 | |
| 		Set_Property(@WINDOW:'.WFR_USAGE','VISIBLE',0)
 | |
| 		Set_Property(@WINDOW:'.TW_USE','VISIBLE',1)
 | |
| 	END ELSE
 | |
| 		Set_Property(@WINDOW:'.WFR_USAGE','VISIBLE',1)
 | |
| 		Set_Property(@WINDOW:'.TW_USE','VISIBLE',0)
 | |
| 	END
 | |
| */
 | |
| 
 | |
| IF MemberOf(@USER4,'OI_ADMIN') THEN
 | |
| 	Set_Property(@WINDOW:'.DELETE_BUTTON_FIX','VISIBLE',1)
 | |
| END ELSE
 | |
| 	Set_Property(@WINDOW:'.DELETE_BUTTON_FIX','VISIBLE',0)
 | |
| END
 | |
| 
 | |
| InjectPcnt = Get_Property(@WINDOW:'.INJECT_PCNT','DEFPROP')
 | |
| 
 | |
| CONVERT '%' TO '' IN InjectPcnt
 | |
| 
 | |
| IF ABS(InjectPcnt) > 4.0 THEN
 | |
| 	Set_Property(@WINDOW:'.INJECT_PCNT','BACKCOLOR',KEY_YELLOW$)
 | |
| END ELSE
 | |
| 	Set_Property(@WINDOW:'.INJECT_PCNT','BACKCOLOR',INP_BLUE$)
 | |
| END
 | |
| 
 | |
| 
 | |
| DepTmPcnt = Get_Property(@WINDOW:'.DEP_TM_PCNT','DEFPROP')
 | |
| 
 | |
| CONVERT '%' TO '' IN DepTmPcnt
 | |
| 
 | |
| IF ABS(DepTmPcnt) > 4.0 THEN
 | |
| 	Set_Property(@WINDOW:'.DEP_TM_PCNT','BACKCOLOR',KEY_YELLOW$)
 | |
| END ELSE
 | |
| 	Set_Property(@WINDOW:'.DEP_TM_PCNT','BACKCOLOR',INP_BLUE$)
 | |
| END
 | |
| 
 | |
| 
 | |
| IF Get_Property(@WINDOW:'.SPC_DTM','DEFPROP') = '' THEN
 | |
| 	Set_Property(@WINDOW:'.SEND_SPC','TEXT','Send to SPC')
 | |
| END ELSE
 | |
| 	Set_Property(@WINDOW:'.SEND_SPC','TEXT','Resend to SPC')
 | |
| END
 | |
| 
 | |
| 
 | |
| LSId = Get_Property(@WINDOW:'.LS_ID','TEXT')
 | |
| 
 | |
| BEGIN CASE
 | |
| 	CASE LSId = 'L1'
 | |
| 		Set_Property(@WINDOW:'.LS_ID','BACKCOLOR',RCV_BLUE$)
 | |
| 		
 | |
| 	CASE LSId = 'L2'
 | |
| 		Set_Property(@WINDOW:'.LS_ID','BACKCOLOR',PRE_BLUE$)
 | |
| 		
 | |
| 	CASE LSId = '2'
 | |
| 		Set_Property(@WINDOW:'.LS_ID','BACKCOLOR',INP_BLUE$)
 | |
| 		
 | |
| 	CASE 1
 | |
| 		Set_Property(@WINDOW:'.LS_ID','BACKCOLOR',GREEN$)
 | |
| 		
 | |
| END CASE
 | |
| 
 | |
| 
 | |
| DataPointList	= Get_Property(@WINDOW:'.TEST_POINTS','DEFPROP')
 | |
| ReactorType		= Get_Property(@WINDOW:'.REACTOR_TYPE_IN','TEXT')		;* Hidden control without any conversion on it
 | |
| PSNo			= Get_Property(@WINDOW:'.PS_NO','DEFPROP')
 | |
| ThickFilmMet	= Get_Property(@WINDOW:'.THICKFILM_MET','CHECK')
 | |
| 
 | |
| Ctrls	 = @WINDOW:'.THICK_READINGS':@RM:@WINDOW:'.SHEETRHO_READINGS':@RM:@WINDOW:'.HGCV1_READINGS'
 | |
| Props	 = 'BACKCOLOR':@RM:'BACKCOLOR':@RM:'BACKCOLOR'
 | |
| 
 | |
| * * * * *
 | |
| 
 | |
| EpiPROCtrls  = @WINDOW:'.INJECT_FLOW_LABEL':@RM				; EpiPROProps  = 'VISIBLE':@RM
 | |
| EpiPROCtrls := @WINDOW:'.INJECT_FLOW':@RM					; EpiPROProps := 'VISIBLE':@RM
 | |
| EpiPROCtrls := @WINDOW:'.SUGG_INJECT_FLOW_LABEL':@RM		; EpiPROProps := 'VISIBLE':@RM
 | |
| EpiPROCtrls := @WINDOW:'.SUGG_INJECT_FLOW':@RM				; EpiPROProps := 'VISIBLE':@RM
 | |
| EpiPROCtrls := @WINDOW:'.INJECT_PCNT_LABEL':@RM				; EpiPROProps := 'VISIBLE':@RM
 | |
| EpiPROCtrls := @WINDOW:'.INJECT_PCNT':@RM					; EpiPROProps := 'VISIBLE':@RM
 | |
| EpiPROCtrls := @WINDOW:'.SUGG_DEP_TM_LABEL':@RM				; EpiPROProps := 'VISIBLE':@RM
 | |
| EpiPROCtrls := @WINDOW:'.SUGG_DEP_TM':@RM					; EpiPROProps := 'VISIBLE':@RM	
 | |
| EpiPROCtrls := @WINDOW:'.DEP_TM_PCNT_LABEL':@RM				; EpiPROProps := 'VISIBLE':@RM
 | |
| EpiPROCtrls := @WINDOW:'.DEP_TM_PCNT'						; EpiPROProps := 'VISIBLE'
 | |
| 
 | |
| IF ReactorType = 'P' OR ReactorType = 'EPP' THEN
 | |
| 	EpiPROVals = STR('0':@RM,10)
 | |
| END ELSE
 | |
| 	EpiPROVals = STR('1':@RM,10)
 | |
| END
 | |
| 
 | |
| EpiPROVals[-1,1]= ''	;* Trim trailing @RM
 | |
| 
 | |
| Set_Property(EpiPROCtrls,EpiPROProps,EpiPROVals)
 | |
| 
 | |
| * * * * *
 | |
| 
 | |
| HalfCtrls  = @WINDOW:'.SMALL_DELTA_DP_GROUP':@RM			; HalfProps  = 'VISIBLE':@RM
 | |
| HalfCtrls := @WINDOW:'.HALF_SUGG_DEP_TM':@RM				; HalfProps := 'VISIBLE':@RM
 | |
| HalfCtrls := @WINDOW:'.HALF_SUGG_DEP_TM_LABEL':@RM			; HalfProps := 'VISIBLE':@RM
 | |
| HalfCtrls := @WINDOW:'.HALF_DEP_TM_PCNT':@RM				; HalfProps := 'VISIBLE':@RM
 | |
| HalfCtrls := @WINDOW:'.HALF_DEP_TM_PCNT_LABEL':@RM			; HalfProps := 'VISIBLE':@RM
 | |
| HalfCtrls := @WINDOW:'.SMALL_DELTA_INJ_GROUP':@RM			; HalfProps := 'VISIBLE':@RM
 | |
| HalfCtrls := @WINDOW:'.HALF_SUGG_INJECT':@RM				; HalfProps := 'VISIBLE':@RM
 | |
| HalfCtrls := @WINDOW:'.HALF_SUGG_INJECT_LABEL':@RM			; HalfProps := 'VISIBLE':@RM
 | |
| HalfCtrls := @WINDOW:'.HALF_INJECT_PCNT':@RM				; HalfProps := 'VISIBLE':@RM
 | |
| HalfCtrls := @WINDOW:'.HALF_INJECT_PCNT_LABEL'				; HalfProps := 'VISIBLE'
 | |
| 
 | |
| IF Get_Property(@WINDOW:'.SMALL_REACTOR_DELTA','CHECK') = 1 THEN
 | |
| 	HalfVals = STR('1':@RM,10)
 | |
| END ELSE
 | |
| 	HalfVals = STR('0':@RM,10)
 | |
| END
 | |
| 
 | |
| HalfVals[-1,1]= ''	;* Trim trailing @RM
 | |
| 
 | |
| Set_Property(HalfCtrls,HalfProps,HalfVals)
 | |
| 
 | |
| * * * * *
 | |
| 
 | |
| SheetRhoStyles	= Send_Message( @WINDOW:'.SHEETRHO_READINGS', "COLSTYLE", 0, '' )
 | |
| ThickStyles		= Send_Message( @WINDOW:'.THICK_READINGS', "COLSTYLE", 0, '' )
 | |
| HgCv1Styles		= Send_Message( @WINDOW:'.HGCV1_READINGS', "COLSTYLE", 0, '' )
 | |
| 
 | |
| IF ReactorType = 'EPP' OR ReactorType = 'P'  OR ThickFilmMet = 1 THEN
 | |
| 
 | |
| 	* EpiPRO Reactor
 | |
| 	
 | |
| 	Vals = GREEN$:@RM:GREEN$:@RM:GREEN$
 | |
| 	
 | |
| 	ThickStyles<1>		= BitOr(ThickStyles<1>,PROTECTED$ )
 | |
| 	SheetRhoStyles<1>	= BitOr(SheetRhoStyles<1>,PROTECTED$ )
 | |
| 	HgCv1Styles	<1>		= BitOr(HgCv1Styles<1>, PROTECTED$ )
 | |
| 	
 | |
| 	HgCvFlag = 0
 | |
| 	
 | |
| END ELSE
 | |
| 	
 | |
| 	* Regular Reactor
 | |
| 	
 | |
| 	Vals = WHITE$:@RM													;* Thickness background
 | |
| 	ThickStyles<1> = BitAnd(ThickStyles<1> , BitNot(PROTECTED$) )		;* Thickness enabled
 | |
| 			
 | |
| 	IF Get_Property(@WINDOW:'.SPEC_RES_MTOOL','TEXT') = 'HgCv' Then		;* OR Get_Property(@WINDOW:'.SPEC_CON_MTOOL','TEXT') = 'HgCv'  
 | |
| 		HgCvFlag = 1
 | |
| 		Vals := GREEN$:@RM:WHITE$
 | |
| 		SheetRhoStyles<1>	= BitOr(SheetRhoStyles<1> , PROTECTED$ )			;* Disable SheetRho table
 | |
| 		HgCv1Styles	<1>		= BitAnd(HgCv1Styles<1>, BitNot(PROTECTED$) )		;* Enable HgCv1 table
 | |
| 	END ELSE
 | |
| 		HgCvFlag = 0
 | |
| 		Vals := WHITE$:@RM:GREEN$
 | |
| 		SheetRhoStyles<1>	= BitAnd(SheetRhoStyles<1> , BitNot(PROTECTED$) )	;* Enable SheetRho table
 | |
| 		HgCv1Styles	<1>		= BitOr(HgCv1Styles<1>, PROTECTED$ )				;* Disable HgCv1 table
 | |
| 	END
 | |
| 	
 | |
| END
 | |
| Savewarn = Get_Property(@Window, 'SAVEWARN')
 | |
| If Savewarn EQ False$ then
 | |
|    ThisMetNo   = Get_Property(@Window: '.MET_NO', 'TEXT')
 | |
|     ThisMetRec  = Database_Services('ReadDataRow', 'RDS_TEST', ThisMetNo)
 | |
|     ResReadings = obj_RDS_Test('Resistivity',ThisMetNo:@RM:ThisMetRec:@RM:1)
 | |
| 
 | |
|     for i = 1 to DCount(ResReadings, @VM)
 | |
|         ResReading       = ResReadings<1,i>
 | |
|         ResReadings<1,i> = OConv(ResReading,'MD4Z')
 | |
|     Next i
 | |
| 
 | |
|     Set_Property(@Window : '.RES_READINGS', 'ARRAY', ResReadings) 
 | |
| end
 | |
| 
 | |
| 
 | |
| Set_Property(Ctrls,Props,Vals)
 | |
| 
 | |
| Send_Message( @WINDOW:'.SHEETRHO_READINGS', "COLSTYLE", 1, SheetRhoStyles )
 | |
| Send_Message( @WINDOW:'.THICK_READINGS', "COLSTYLE", 1, ThickStyles )
 | |
| Send_Message( @WINDOW:'.HGCV1_READINGS', "COLSTYLE", 1, HgCv1Styles )
 | |
| 
 | |
| 
 | |
| LOCATE 'Center' IN DataPointList USING @VM SETTING CenterPoint ELSE
 | |
| 	CenterPoint = 9
 | |
| END
 | |
| 	
 | |
| Send_Message(@WINDOW:'.TEST_POINTS','COLOR_BY_POS',1,CenterPoint,ORANGE$)
 | |
| Send_Message(@WINDOW:'.THICK_READINGS','COLOR_BY_POS',1,CenterPoint,ORANGE$)
 | |
| Send_Message(@WINDOW:'.SHEETRHO_READINGS','COLOR_BY_POS',1,CenterPoint,ORANGE$)
 | |
| Send_Message(@WINDOW:'.RES_READINGS','COLOR_BY_POS',1,CenterPoint,ORANGE$)
 | |
| Send_Message(@WINDOW:'.HGCV1_READINGS','COLOR_BY_POS',1,CenterPoint,ORANGE$)
 | |
| 
 | |
| WaferSize = Get_Property(@WINDOW:'.WAFER_SIZE','DEFPROP')
 | |
| 
 | |
| IF WaferSize NE '' THEN
 | |
| 	BEGIN CASE
 | |
| 		CASE WaferSize[1,' '] = '75'
 | |
| 			FirstValidLine = 6
 | |
| 			LastValidLine  = 12
 | |
| 			
 | |
| 		CASE WaferSize[1,' '] = '100'
 | |
| 			FirstValidLine = 5
 | |
| 			LastValidLine  = 13
 | |
| 			
 | |
| 		CASE WaferSize[1,' '] = '125'
 | |
| 			FirstValidLine = 4
 | |
| 			LastValidLine  = 14
 | |
| 			
 | |
| 		CASE WaferSize[1,' '] = '150'
 | |
| 			FirstValidLine = 3
 | |
| 			LastValidLine  = 15
 | |
| 			
 | |
| 		CASE 1
 | |
| 			FirstValidLine = 1
 | |
| 			LastValidLine  = 17
 | |
| 			
 | |
| 	END CASE
 | |
| 	
 | |
| 	Set_Property(@Window:'.TEST_POINTS', 'MINROWLIMIT', 17)
 | |
| 	Set_Property(@Window:'.THICK_READINGS', 'MINROWLIMIT', 17)
 | |
| 	Set_Property(@Window:'.SHEETRHO_READINGS', 'MINROWLIMIT', 17)
 | |
| 	Set_Property(@Window:'.RES_READINGS', 'MINROWLIMIT', 17)
 | |
| 	
 | |
| 	IF FirstValidLine > 1 THEN
 | |
| 		FOR I = 1 TO (FirstValidLine - 1)
 | |
| 			Send_Message(@WINDOW:'.TEST_POINTS','COLOR_BY_POS',1,I,GREY$)
 | |
| 			Send_Message(@WINDOW:'.THICK_READINGS','COLOR_BY_POS',1,I,GREY$)
 | |
| 			Send_Message(@WINDOW:'.SHEETRHO_READINGS','COLOR_BY_POS',1,I,GREY$)
 | |
| 			Send_Message(@WINDOW:'.RES_READINGS','COLOR_BY_POS',1,I,GREY$)
 | |
| 			Send_Message(@WINDOW:'.HGCV1_READINGS','COLOR_BY_POS',1,I,GREY$)
 | |
| 		NEXT I
 | |
| 		
 | |
| 		FOR I = (LastValidLine + 1) TO 17
 | |
| 			Send_Message(@WINDOW:'.TEST_POINTS','COLOR_BY_POS',1,I,GREY$)
 | |
| 			Send_Message(@WINDOW:'.THICK_READINGS','COLOR_BY_POS',1,I,GREY$)
 | |
| 			Send_Message(@WINDOW:'.SHEETRHO_READINGS','COLOR_BY_POS',1,I,GREY$)
 | |
| 			Send_Message(@WINDOW:'.RES_READINGS','COLOR_BY_POS',1,I,GREY$)
 | |
| 			Send_Message(@WINDOW:'.HGCV1_READINGS','COLOR_BY_POS',1,I,GREY$)
 | |
| 		NEXT I
 | |
| 	END
 | |
| END
 | |
| 
 | |
| SpecType = Get_Property(@WINDOW:'.SPEC_TYPE','TEXT')
 | |
| Set_Property(@WINDOW:'.SPEC_TYPE_LABEL','TEXT',SpecType)
 | |
| 
 | |
| IF Get_Property(@WINDOW:'.SPEC_RES_MOVERGROW','INVALUE') = 1 THEN
 | |
| 	Set_Property(@WINDOW:'.THICK_OVERGROW_AVG','BACKCOLOR',YELLOW$)
 | |
| END ELSE
 | |
| 	Set_Property(@WINDOW:'.THICK_OVERGROW_AVG','BACKCOLOR',WHITE$)
 | |
| END
 | |
| 
 | |
| SpecResUnits = Get_Property(@WINDOW:'.SPEC_RES_UNITS', 'DEFPROP')
 | |
| 
 | |
| BEGIN CASE
 | |
| 	CASE SpecResUnits = SHEETRHO_SPEC_UNITS$
 | |
| 		Vals = '0':@RM:'0':@RM:'0':@RM:'0':@RM:'0':@RM:'0':@RM:'0':@RM:'-1':@RM:'-1':@RM:'-1':@RM:'-1':@RM:'-1':@RM:'-1':@RM:'-1'
 | |
| 	CASE SpecResUnits = RES_SPEC_UNITS$	
 | |
| 		Vals = '-1':@RM:'-1':@RM:'-1':@RM:'-1':@RM:'-1':@RM:'-1':@RM:'-1':@RM:'0':@RM:'0':@RM:'0':@RM:'0':@RM:'0':@RM:'0':@RM:'0'
 | |
| 	CASE 1
 | |
| 		Vals = '0':@RM:'0':@RM:'0':@RM:'0':@RM:'0':@RM:'0':@RM:'0':@RM:'0':@RM:'0':@RM:'0':@RM:'0':@RM:'0':@RM:'0':@RM:'0'
 | |
| END CASE
 | |
| 
 | |
| Ctrls  = @WINDOW:'.SHEETRHO_AVG':@RM			; Props  = 'ENABLED':@RM
 | |
| Ctrls := @WINDOW:'.SHEETRHO_STDV':@RM			; Props := 'ENABLED':@RM
 | |
| Ctrls := @WINDOW:'.SHEETRHO_RANGE':@RM			; Props := 'ENABLED':@RM
 | |
| Ctrls := @WINDOW:'.SHEETRHO_RANGE_PCNT':@RM		; Props := 'ENABLED':@RM
 | |
| Ctrls := @WINDOW:'.SHEETRHO_UNIF':@RM			; Props := 'ENABLED':@RM
 | |
| Ctrls := @WINDOW:'.SHEETRHO_MIN':@RM			; Props := 'ENABLED':@RM
 | |
| Ctrls := @WINDOW:'.SHEETRHO_MAX':@RM			; Props := 'ENABLED':@RM
 | |
| Ctrls := @WINDOW:'.RES_AVG':@RM					; Props := 'ENABLED':@RM
 | |
| Ctrls := @WINDOW:'.RES_STDV':@RM				; Props := 'ENABLED':@RM
 | |
| Ctrls := @WINDOW:'.RES_RANGE':@RM				; Props := 'ENABLED':@RM
 | |
| Ctrls := @WINDOW:'.RES_RANGE_PCNT':@RM			; Props := 'ENABLED':@RM
 | |
| Ctrls := @WINDOW:'.RES_UNIF':@RM				; Props := 'ENABLED':@RM
 | |
| Ctrls := @WINDOW:'.RES_MIN':@RM					; Props := 'ENABLED':@RM
 | |
| Ctrls := @WINDOW:'.RES_MAX'						; Props := 'ENABLED'
 | |
| 
 | |
| 
 | |
| Set_Property(Ctrls,Props,Vals)
 | |
| 
 | |
| 
 | |
| ReadCtrls = @WINDOW:'.THICK_READINGS':@RM:@WINDOW:'.SHEETRHO_READINGS':@RM:@WINDOW:'.RES_READINGS':@RM:@WINDOW:'.HGCV1_READINGS'
 | |
| 
 | |
| ReadProps = 'INVALUE':@RM:'INVALUE':@RM:'INVALUE':@RM:'INVALUE'
 | |
| 
 | |
| ReadVals = Get_Property(ReadCtrls,ReadProps)
 | |
| 
 | |
| ThickReads		= ReadVals[1,@RM]
 | |
| SheetRhoReads	= ReadVals[COL2()+1,@RM]
 | |
| ResReads		= ReadVals[COL2()+1,@RM]
 | |
| HgCv1Reads		= ReadVals[COL2()+1,@RM]
 | |
| 
 | |
| LimitCtrls  = @WINDOW:'.SPEC_THICK_MIN':@RM			; LimitProps  = 'INVALUE':@RM
 | |
| LimitCtrls := @WINDOW:'.SPEC_THICK_MAX':@RM			; LimitProps := 'INVALUE':@RM
 | |
| LimitCtrls := @WINDOW:'.SPEC_RES_MIN':@RM			; LimitProps := 'INVALUE':@RM
 | |
| LimitCtrls := @WINDOW:'.SPEC_RES_MAX'				; LimitProps := 'INVALUE'
 | |
| 
 | |
| Limits = Get_Property(LimitCtrls,LimitProps)
 | |
| 
 | |
| SpecThickMin	= Limits[1,@RM]
 | |
| SpecThickMax	= Limits[COL2()+1,@RM]
 | |
| SpecResMin		= Limits[COL2()+1,@RM]
 | |
| SpecResMax		= Limits[COL2()+1,@RM]
 | |
| 
 | |
| ReadLineCnt = COUNT(ThickReads,@VM) + (ThickReads NE '')
 | |
| 
 | |
| ThickSpecFlag		= 0
 | |
| SheetRhoSpecFlag	= 0
 | |
| ResistivitySpecFlag	= 0
 | |
| HgCv1SpecFlag		= 0
 | |
| 
 | |
| 
 | |
| FOR I = 1 TO ReadLineCnt
 | |
| 	ThickVal = ThickReads<1,I>
 | |
| 	
 | |
| 	IF ThickVal NE '' THEN
 | |
| 		ThickVal = IConv(ThickVal, "MD1")
 | |
| 		IF ThickVal > SpecThickMax OR ThickVal < SpecThickMin THEN
 | |
| 			Send_Message(@WINDOW:'.THICK_READINGS','COLOR_BY_POS',1,I,RED$)
 | |
| 			ThickSpecFlag = 1 
 | |
| 		END ELSE
 | |
| 			IF I = CenterPoint THEN
 | |
| 				Send_Message(@WINDOW:'.THICK_READINGS','COLOR_BY_POS',1,I,ORANGE$)
 | |
| 			END ELSE
 | |
| 				Send_Message(@WINDOW:'.THICK_READINGS','COLOR_BY_POS',1,I,WHITE$)
 | |
| 			END
 | |
| 		END
 | |
| 	END
 | |
| 	
 | |
| 	IF SpecResUnits = SHEETRHO_SPEC_UNITS$ THEN
 | |
| 		ResVal = SheetRhoReads<1,I>
 | |
| 		IF ResVal NE '' THEN
 | |
| 			ResVal = ResVal
 | |
| 			IF ResVal > SpecResMax OR ResVal < SpecResMin THEN
 | |
| 				Send_Message(@WINDOW:'.SHEETRHO_READINGS','COLOR_BY_POS',1,I,RED$)
 | |
| 				SheetRhoSpecFlag = 1
 | |
| 			END ELSE
 | |
| 				IF I = CenterPoint THEN
 | |
| 					Send_Message(@WINDOW:'.SHEETRHO_READINGS','COLOR_BY_POS',1,I,ORANGE$)
 | |
| 				END ELSE
 | |
| 					Send_Message(@WINDOW:'.SHEETRHO_READINGS','COLOR_BY_POS',1,I,WHITE$)
 | |
| 				END
 | |
| 			END
 | |
| 		END
 | |
| 	END 
 | |
| 	
 | |
| 	IF SpecResUnits = RES_SPEC_UNITS$ THEN
 | |
| 		ResVal = ResReads<1,I>
 | |
| 
 | |
| 		IF ResVal NE '' THEN
 | |
| 		
 | |
| 			* Spec is in MD3, Calculated value is in MD4 -> *10 is a multiplier to make the adjustment
 | |
| 			* Added 7/1/2008 JCH
 | |
| 			
 | |
| 			IF ResVal > SpecResMax*10 OR ResVal < SpecResMin*10 THEN
 | |
| 				Send_Message(@WINDOW:'.RES_READINGS','COLOR_BY_POS',1,I,RED$)	;* Changes the reading
 | |
| 				ResistivitySpecFlag = 1
 | |
| 			END ELSE
 | |
| 				IF I = CenterPoint THEN
 | |
| 					Send_Message(@WINDOW:'.RES_READINGS','COLOR_BY_POS',1,I,ORANGE$)
 | |
| 				END ELSE
 | |
| 					Send_Message(@WINDOW:'.RES_READINGS','COLOR_BY_POS',1,I,GREEN$)
 | |
| 				END
 | |
| 			END
 | |
| 		END
 | |
| 		
 | |
| 		HgCv1Val = HgCv1Reads<1,I>
 | |
| 		
 | |
| 		IF HgCv1Val NE '' THEN
 | |
| 			IF HgCv1Val > SpecResMax OR HgCv1Val < SpecResMin THEN
 | |
| 				Send_Message(@WINDOW:'.HGCV1_READINGS','COLOR_BY_POS',1,I,RED$)	;* Changes the reading
 | |
| 				ResistivitySpecFlag = 1
 | |
| 			END ELSE
 | |
| 				IF I = CenterPoint THEN
 | |
| 					Send_Message(@WINDOW:'.HGCV1_READINGS','COLOR_BY_POS',1,I,ORANGE$)
 | |
| 				END ELSE
 | |
| 					IF HgCvFlag = 1 THEN
 | |
| 						Send_Message(@WINDOW:'.HGCV1_READINGS','COLOR_BY_POS',1,I,WHITE$)
 | |
| 					END ELSE
 | |
| 						Send_Message(@WINDOW:'.HGCV1_READINGS','COLOR_BY_POS',1,I,GREEN$)
 | |
| 					END
 | |
| 				END
 | |
| 			END
 | |
| 		END
 | |
| 		
 | |
| 	END
 | |
| 	
 | |
| 	IF SpecResUnits = '' THEN
 | |
| 		IF I = CenterPoint THEN
 | |
| 			Send_Message(@WINDOW:'.THICK_READINGS','COLOR_BY_POS',1,I,ORANGE$)
 | |
| 			Send_Message(@WINDOW:'.SHEETRHO_READINGS','COLOR_BY_POS',1,I,ORANGE$)
 | |
| 			Send_Message(@WINDOW:'.RES_READINGS','COLOR_BY_POS',1,I,ORANGE$)
 | |
| 			Send_Message(@WINDOW:'.HGCV1_READINGS','COLOR_BY_POS',1,I,ORANGE$)
 | |
| 		END ELSE
 | |
| 			Send_Message(@WINDOW:'.THICK_READINGS','COLOR_BY_POS',1,I,WHITE$)
 | |
| 			Send_Message(@WINDOW:'.SHEETRHO_READINGS','COLOR_BY_POS',1,I,WHITE$)
 | |
| 			Send_Message(@WINDOW:'.RES_READINGS','COLOR_BY_POS',1,I,GREEN$)
 | |
| 			Send_Message(@WINDOW:'.HGCV1_READINGS','COLOR_BY_POS',1,I,GREEN$)
 | |
| 		END
 | |
| 	END
 | |
| NEXT I
 | |
| 
 | |
| ThickMinValue = Get_Property(@WINDOW:'.THICK_MIN','INVALUE')
 | |
| ThickMaxValue = Get_Property(@WINDOW:'.THICK_MAX','INVALUE')
 | |
| ThickMinValue = IConv(ThickMinValue, "MD1")
 | |
| ThickMaxValue = IConv(ThickMaxValue, "MD1")
 | |
| 
 | |
| IF  ThickMinValue < SpecThickMin AND ThickMinValue NE '' THEN
 | |
| 	Set_Property(@WINDOW:'.THICK_MIN','BACKCOLOR',RED$)
 | |
| 	ThickSpecFlag = 1
 | |
| END ELSE
 | |
| 	Set_Property(@WINDOW:'.THICK_MIN','BACKCOLOR',GREEN$)
 | |
| END
 | |
| 
 | |
| IF ThickMaxValue > SpecThickMax AND ThickMaxValue NE '' THEN
 | |
| 	Set_Property(@WINDOW:'.THICK_MAX','BACKCOLOR',RED$)
 | |
| 	ThickSpecFlag = 1
 | |
| END ELSE
 | |
| 	Set_Property(@WINDOW:'.THICK_MAX','BACKCOLOR',GREEN$)
 | |
| END
 | |
| 
 | |
| 
 | |
| BEGIN CASE
 | |
| 	CASE SpecResUnits = SHEETRHO_SPEC_UNITS$
 | |
| 
 | |
| 		ResMinValue = Get_Property(@WINDOW:'.SHEETRHO_MIN','INVALUE') 
 | |
| 		ResMaxValue = Get_Property(@WINDOW:'.SHEETRHO_MAX','INVALUE')
 | |
| 		
 | |
| 		IF ResMinValue < SpecResMin  AND ResMinValue NE ''THEN
 | |
| 			Set_Property(@WINDOW:'.SHEETRHO_MIN','BACKCOLOR',RED$)
 | |
| 			SheetRhoSpecFlag = 1
 | |
| 		END ELSE
 | |
| 			Set_Property(@WINDOW:'.SHEETRHO_MIN','BACKCOLOR',GREEN$)
 | |
| 		END
 | |
| 
 | |
| 		IF ResMaxValue > SpecResMax AND ResMaxValue NE '' THEN
 | |
| 			Set_Property(@WINDOW:'.SHEETRHO_MAX','BACKCOLOR',RED$)
 | |
| 			SheetRhoSpecFlag = 1
 | |
| 		END ELSE
 | |
| 			Set_Property(@WINDOW:'.SHEETRHO_MAX','BACKCOLOR',GREEN$)
 | |
| 		END
 | |
| 	
 | |
| 	CASE SpecResUnits = RES_SPEC_UNITS$
 | |
| 
 | |
| 		ResMinValue = Get_Property(@WINDOW:'.RES_MIN','INVALUE')
 | |
| 		ResMaxValue = Get_Property(@WINDOW:'.RES_MAX','INVALUE')
 | |
| 
 | |
| 		IF ResMinValue < SpecResMin*10 AND ResMinValue NE '' THEN
 | |
| 			Set_Property(@WINDOW:'.RES_MIN','BACKCOLOR',RED$)
 | |
| 			ResistivitySpecFlag = 1
 | |
| 		END ELSE
 | |
| 			Set_Property(@WINDOW:'.RES_MIN','BACKCOLOR',GREEN$)
 | |
| 		END
 | |
| 
 | |
| 		IF ResMaxValue > SpecResMax*10 AND ResMaxValue NE '' THEN
 | |
| 			Set_Property(@WINDOW:'.RES_MAX','BACKCOLOR',RED$)
 | |
| 			ResistivitySpecFlag = 1
 | |
| 		END ELSE
 | |
| 			Set_Property(@WINDOW:'.RES_MAX','BACKCOLOR',GREEN$)
 | |
| 		END
 | |
| 		
 | |
| 		HgCv1MinValue = Get_Property(@WINDOW:'.HGCV1_RES_MIN','INVALUE')
 | |
| 		HgCv1MaxValue = Get_Property(@WINDOW:'.HGCV1_RES_MAX','INVALUE')
 | |
| 
 | |
| 		IF HgCv1MinValue < SpecResMin AND HgCv1MinValue NE '' THEN
 | |
| 			Set_Property(@WINDOW:'.HGCV1_RES_MIN','BACKCOLOR',RED$)
 | |
| 			HgCv1SpecFlag = 1
 | |
| 		END ELSE
 | |
| 			Set_Property(@WINDOW:'.HGCV1_RES_MIN','BACKCOLOR',GREEN$)
 | |
| 		END
 | |
| 
 | |
| 		IF HgCv1MaxValue > SpecResMax AND HgCv1MaxValue NE '' THEN
 | |
| 			Set_Property(@WINDOW:'.HGCV1_RES_MAX','BACKCOLOR',RED$)
 | |
| 			HgCv1SpecFlag = 1
 | |
| 		END ELSE
 | |
| 			Set_Property(@WINDOW:'.HGCV1_RES_MAX','BACKCOLOR',GREEN$)
 | |
| 		END
 | |
| 		
 | |
| 		
 | |
| 	CASE 1
 | |
| 		Set_Property(@WINDOW:'.SHEETRHO_MIN','BACKCOLOR',GREEN$)
 | |
| 		Set_Property(@WINDOW:'.SHEETRHO_MAX','BACKCOLOR',GREEN$)
 | |
| 		Set_Property(@WINDOW:'.RES_MIN','BACKCOLOR',GREEN$)
 | |
| 		Set_Property(@WINDOW:'.RES_MAX','BACKCOLOR',GREEN$)
 | |
| 		Set_Property(@WINDOW:'.HGCV1_RES_MIN','BACKCOLOR',GREEN$)
 | |
| 		Set_Property(@WINDOW:'.HGCV1_RES_MAX','BACKCOLOR',GREEN$)
 | |
| 		
 | |
| END CASE
 | |
| 
 | |
| 
 | |
| 
 | |
| IF ThickSpecFlag OR SheetRhoSpecFlag OR ResistivitySpecFlag OR HgCv1SpecFlag THEN
 | |
| 	Set_Property(@WINDOW:'.OUT_OF_SPEC','CHECK',1)
 | |
| END ELSE
 | |
| 	Set_Property(@WINDOW:'.OUT_OF_SPEC','CHECK',0)
 | |
| END
 | |
| 
 | |
| * Reset OverRide enabled controls
 | |
| 
 | |
| ORCtrls  = @WINDOW:'.SPEC_THICK_MIN':@RM:@WINDOW:'.SPEC_THICK_TARGET':@RM:@WINDOW:'.SPEC_THICK_MAX':@RM:@WINDOW:'.SPEC_THICK_UNITS':@RM
 | |
| ORCtrls := @WINDOW:'.SPEC_RES_MIN':@RM:@WINDOW:'.SPEC_RES_TARGET':@RM:@WINDOW:'.SPEC_RES_MAX':@RM:@WINDOW:'.SPEC_RES_UNITS':@RM
 | |
| ORCtrls := @WINDOW:'.SPEC_CON_MIN':@RM:@WINDOW:'.SPEC_CON_TARGET':@RM:@WINDOW:'.SPEC_CON_MAX':@RM:@WINDOW:'.SPEC_CON_UNITS':@RM
 | |
| ORCtrls := @WINDOW:'.SPEC_CRES_MIN':@RM:@WINDOW:'.SPEC_CRES_TARGET':@RM:@WINDOW:'.SPEC_CRES_MAX':@RM:@WINDOW:'.SPEC_CRES_UNITS'
 | |
| 
 | |
| Props = STR('ENABLED':@RM,16)	; Props[-1,1] = ''
 | |
| Vals = STR('0':@RM,16)			; Vals[-1,1] = ''
 | |
| 
 | |
| 
 | |
| Set_Property(ORCtrls,Props,Vals)
 | |
| 
 | |
| Props = STR('BACKCOLOR':@RM,16)	; Props[-1,1] = ''
 | |
| Vals = STR(GREEN$ :@RM,16)		; Vals[-1,1] = ''
 | |
| 
 | |
| Set_Property(ORCtrls,Props,Vals)
 | |
| 
 | |
| * Disable Test Wafer related controls for EpiPro Runs to eliminate confusion
 | |
| * around whether or not TW_USE records need to be created in order to account
 | |
| * for test wafers for SAP purposes. (EpiPro test wafers are accounted for
 | |
| * at the load run configuration step within the RDS Load EpiPro operation.)
 | |
| RDSNo     = Get_Property(@Window:'.RDS_NO', 'TEXT')
 | |
| ReactType = Xlate('RDS', RDSNo, 'REACTOR_TYPE', 'X')
 | |
| TWEnabled = (ReactType NE 'EPP')
 | |
| Set_Property(@Window:'.NEW_TW_USE', 'ENABLED', TWEnabled)
 | |
| Set_Property(@Window:'.COPY_TW_LINE', 'ENABLED', TWEnabled)
 | |
| Set_Property(@Window:'.TW_USE', 'ENABLED', TWEnabled)
 | |
| 
 | |
| * QBF buttons
 | |
| 
 | |
| Ctrls  = @WINDOW:'.QBF_FIRST_FIX':@RM		; Props  = 'ENABLED':@RM
 | |
| Ctrls := @WINDOW:'.QBF_PREV_FIX':@RM		; Props := 'ENABLED':@RM
 | |
| Ctrls := @WINDOW:'.QBF_ABS_FIX':@RM			; Props := 'ENABLED':@RM
 | |
| Ctrls := @WINDOW:'.QBF_NEXT_FIX':@RM		; Props := 'ENABLED':@RM
 | |
| Ctrls := @WINDOW:'.QBF_LAST_FIX':@RM		; Props := 'ENABLED':@RM
 | |
| Ctrls := @WINDOW:'.QBF_STOP_FIX'			; Props := 'ENABLED'
 | |
| 
 | |
| IF Get_Property(@WINDOW,'QBFLIST') = '' THEN
 | |
| 	Vals = 0:@RM:0:@RM:0:@RM:0:@RM:0:@RM:0
 | |
| END ELSE
 | |
| 	Vals = 1:@RM:1:@RM:1:@RM:1:@RM:1:@RM:1
 | |
| END
 | |
| 
 | |
| Set_Property(Ctrls,Props,Vals)
 | |
| 
 | |
| * Turn edit table symbolic column backgrounds to green
 | |
| 
 | |
| ETSymbolics = Get_Property(@WINDOW,'@ET_SYMBOLICS')		;* Loaded during 'Create' in obj_Appwindow
 | |
| 
 | |
| ETCtrls	= ETSymbolics<1>
 | |
| ETCols	= ETSymbolics<2>
 | |
| 
 | |
| FOR I = 1 TO COUNT(ETCtrls,@VM) + (ETCtrls NE '')
 | |
| 	ETCtrl	= ETCtrls<1,I>
 | |
| 	IF ETCtrl NE @WINDOW:'.RES_READINGS' THEN
 | |
| 		ETList = Get_Property(ETCtrl,'LIST')
 | |
| 		FOR Line = 1 TO COUNT(ETList,@FM) + (ETList NE '')
 | |
| 			IF ETList<Line,1> NE '' THEN
 | |
| 				FOR N = 1 TO COUNT(ETCols<1,I>,@SVM) + (ETCols<1,I> NE '')
 | |
| 					stat = Send_Message(ETCtrl,'COLOR_BY_POS',ETCols<1,I,N>,Line,GREEN$)
 | |
| 				NEXT N
 | |
| 			END
 | |
| 		NEXT I
 | |
| 	END
 | |
| NEXT I
 | |
| 
 | |
| RETURN
 | |
| 
 | |
| 
 | |
| * * * * * * *
 | |
| Write:
 | |
| * * * * * * *
 | |
| 
 | |
| RDSTestKey = Get_Property(@WINDOW,'ID')
 | |
| 
 | |
| CurrRecord = Get_Property(@WINDOW,'RECORD')
 | |
| OrgRecord = Get_Property(@WINDOW,'@ORG_RECORD')
 | |
| 
 | |
| IF CurrRecord<RDS_TEST_RDS_NO$> = '' OR CurrRecord<RDS_TEST_LS_ID$> = '' THEN
 | |
| 	Result = 0
 | |
| 	ErrMsg('This record may not be saved.')
 | |
| 	RETURN
 | |
| END
 | |
| 
 | |
| IF CurrRecord NE OrgRecord THEN
 | |
| 	
 | |
| 	CurrDTM = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS')
 | |
| 	
 | |
| 	NewLine = @USER4:@VM:CurrDTM
 | |
| 	Send_Message(@WINDOW:'.MODIFY_USER','INSERT',1,NewLine)
 | |
| 	
 | |
| 	*Dummy = Msg(@WINDOW,'','SPC_REMINDER')
 | |
| 	
 | |
| 	* Section added 2/21/2011 JCH - Synchronizes 'TW_USE' table with RDS_TEST
 | |
| 	* Made live on 4/2/2011 JCH  
 | |
| 	
 | |
| END
 | |
| 
 | |
| // Ask the system event handler to attempt to write the row and then come back.
 | |
| Forward_Event()
 | |
| 
 | |
| // Check to see if the MFS set an FS error. There are conditions that will prevent RDS_TEST data from being modified.
 | |
| EventCode = ''
 | |
| Error     = Get_EventStatus(EventCode)
 | |
| 
 | |
| If Error then
 | |
|     // If EventCode contains error code FS104 then display our own message box.
 | |
|     ErrorNumber     = EventCode[1, @VM]
 | |
|     ErrorMessage    = EventCode[Col2() + 1, @VM]
 | |
|     If ErrorNumber EQ 'FS104' then
 | |
|         MsgStruct           = ''
 | |
|         MsgStruct<MCOL$>    = -1
 | |
|         MsgStruct<MROW$>    = -1
 | |
|         // Users belonging to the SPEC_CHANGE security group will be allowed to override the block. However, these
 | |
|         // users must confirm that this is what they want.
 | |
|         If MemberOf(@User4, 'SPEC_CHANGE') then
 | |
|             Override    = Msg(@Window, MsgStruct, 'YESNO', '', 'RDS Test' : @FM : ErrorMessage : @TM : @TM : 'Please confirm that you want to override.')
 | |
|             If Override EQ True$ then
 | |
|                 Record      = Get_Property(@Window, 'ATRECORD')
 | |
|                 Record<RDS_TEST_MODIFY_OVERRIDE$> = True$
 | |
|                 Database_Services('WriteDataRow', 'RDS_TEST', @ID, Record, True$, False$, False$)
 | |
|                 FocusCtrl   = Get_Property(@Window, 'FOCUS')
 | |
|                 Set_Property(FocusCtrl, 'GOTFOCUS_VALUE', Get_Property(FocusCtrl, 'DEFPROP'))
 | |
|                 Set_Property(@Window, 'SAVEWARN', False$)
 | |
|                 IF Get_Property(@WINDOW,'@DONT_CLOSE_ON_WRITE') THEN
 | |
|                     Set_Property(@WINDOW,'@DONT_CLOSE_ON_WRITE','0')
 | |
|                 END ELSE
 | |
|                     Post_Event(@WINDOW,'CLOSE')
 | |
|                 END
 | |
|             end
 | |
|         end else
 | |
|             Msg(@Window, MsgStruct, 'OK', '', 'RDS Test' : @FM : ErrorMessage)
 | |
|         end
 | |
|     end
 | |
| end else
 | |
|     IF Get_Property(@WINDOW,'@DONT_CLOSE_ON_WRITE') THEN
 | |
|         Set_Property(@WINDOW,'@DONT_CLOSE_ON_WRITE','0')
 | |
|     END ELSE
 | |
|         Post_Event(@WINDOW,'CLOSE')
 | |
|     END
 | |
| end
 | |
| 
 | |
| // Set the result variable to 0 so the event chain does not continue. Both pre- and post-event handlers are done here.
 | |
| Result = 0
 | |
| 
 | |
| RETURN 
 | |
| 
 | |
| 
 | |
| * * * * * * *
 | |
| Delete:
 | |
| * * * * * * * 
 | |
| 
 | |
| IF MemberOf(@USER4,'OI_ADMIN') THEN
 | |
| 	Result = Msg(@WINDOW,'','PRE_DELETE')
 | |
| END ELSE
 | |
| 	ErrMsg('Records may not be modified or deleted.')
 | |
| 	Result = 0
 | |
| END
 | |
| 
 | |
| 
 | |
| RETURN
 | |
| 
 | |
| 
 | |
| * * * * * * *
 | |
| Close:
 | |
| * * * * * * *
 | |
| 
 | |
| obj_Appwindow('DetailReturn')
 | |
| 
 | |
| RETURN
 | |
| 
 | |
| 
 | |
| SYSMSG:
 | |
|     
 | |
|     MsgCode     = Parm1[1, @RM]
 | |
|     CancelFlag  = Parm1[Col2() + 1, @RM]
 | |
|     StatCode    = Parm1[Col2() + 1, @RM]
 | |
|     ErrorNumber = StatCode[1, @VM]
 | |
|     If ErrorNumber EQ 'FS104' then
 | |
|         // This means our custom logic in RDS_TEST_ACTIONS has blocked this row from being written. The WRITE event
 | |
|         // handler will display a custom message instead of the system.
 | |
|         Result  = 0
 | |
|     end else
 | |
|         // Allow the system to handle this message (if any).
 | |
|         Result  = 1
 | |
|     end
 | |
| 
 | |
| return
 | |
| 
 | |
| 
 | |
| * * * * * * *
 | |
| ReadingsLF:
 | |
| * * * * * * *
 | |
| 
 | |
| CtrlName = Parm1
 | |
| 
 | |
| IF CtrlName = '' THEN
 | |
| 	CurrCtrl = Get_Property(@WINDOW,'FOCUS')
 | |
| END ELSE
 | |
| 	CurrCtrl = @WINDOW:'.':CtrlName
 | |
| END
 | |
| 
 | |
| FirstColumnData = Get_Property(CurrCtrl,'DEFPROP')
 | |
| DataPointDist	= Get_Property(@WINDOW:'.TEST_POINTS','DEFPROP')
 | |
| 
 | |
| LOCATE 'Center' IN DataPointDist USING @VM SETTING CenterPos ELSE CenterPos = 9		;* This will break if the number of data points is increased above 17!
 | |
| 
 | |
| Readings = ''
 | |
| TotalLineCnt = COUNT(FirstColumnData,@VM) + (FirstColumnData NE '')
 | |
| 
 | |
| FOR I = 1 TO TotalLineCnt
 | |
| 	IF FirstColumnData<1,I> NE '' THEN Readings<1,-1> = FirstColumnData<1,I>
 | |
| NEXT I
 | |
| 
 | |
| ReadingCnt = COUNT(Readings,@VM) + (Readings NE '')
 | |
| 
 | |
| IF ReadingCnt > 0 THEN
 | |
| 	*IF Mod(ReadingCnt,2) = 0 THEN
 | |
| 	*	ErrMsg('Incorrect number of readings entered. 1,3,5,7,9,11,13,15 or 17 values must be entered.')		;* Dead on 11/29/2016 Added 10 wafer metrology DKK
 | |
| 	*	Set_Property('FOCUS',CtrlName,1)
 | |
| 	*	RETURN
 | |
| 	*END ELSE
 | |
| 		Set_Property(CurrCtrl,'DEFPROP',STR(@VM,16))
 | |
| 		StartPos = CenterPos - (ReadingCnt - 1)*(.5)
 | |
| 		Set_Property(@WINDOW,'@FIRST_READING_LINE',StartPos)
 | |
| 		FOR I = 1 TO TotalLineCnt
 | |
| 			IF I >= StartPos AND Readings NE '' THEN
 | |
| 				Set_Property(CurrCtrl,'DEFPROP',Readings<1,1>,1:@FM:I)
 | |
| 				Readings = DELETE(Readings,0,1,0)
 | |
| 			END ELSE
 | |
| 				Set_Property(CurrCtrl,'DEFPROP','',1:@FM:I)
 | |
| 			END
 | |
| 		NEXT I
 | |
| 	*END
 | |
| END
 | |
| 
 | |
| //Post_Event(@WINDOW:'.RES_READINGS','CALCULATE',1)
 | |
| UpdatedRec = Get_Property(@Window, 'ATRECORD')
 | |
| ThisMetNo   = Get_Property(@Window: '.MET_NO', 'TEXT')
 | |
| ResReadings = obj_RDS_Test('Resistivity',ThisMetNo:@RM:UpdatedRec:@RM:1)
 | |
| 
 | |
| for i = 1 to DCount(ResReadings, @VM)
 | |
|     ResReading       = ResReadings<1,i>
 | |
|     ResReadings<1,i> = OConv(ResReading,'MD4Z')
 | |
| Next i
 | |
| Set_Property(@Window : '.RES_READINGS', 'ARRAY', ResReadings)
 | |
| 
 | |
| Send_Event(@WINDOW:'.GROWTH_RATE','CALCULATE')
 | |
| 
 | |
| * * * * * * *
 | |
| ReadingsPC:
 | |
| * * * * * * *
 | |
| 
 | |
| OrigRec = Get_Property(@Window, '@ORG_RECORD')
 | |
| RDSNo   = Get_Property(@Window:'.RDS_NO', 'TEXT')
 | |
| 
 | |
| CtrlName = Parm1
 | |
| 
 | |
| IF CtrlName = '' THEN
 | |
| 	CurrCtrl = Get_Property(@WINDOW,'FOCUS')
 | |
| END ELSE
 | |
|     If Index(CtrlName, '.', 1) then
 | |
|         CurrCtrl    = CtrlName
 | |
|     end else
 | |
| 	    CurrCtrl    = @WINDOW:'.':CtrlName
 | |
| 	end
 | |
| END
 | |
| 
 | |
| //Problem line here. Removed 10/25/2024
 | |
| //Send_Event(@WINDOW:'.RES_READINGS','CALCULATE')
 | |
| 
 | |
| UpdatedRec = Get_Property(@Window, 'ATRECORD')
 | |
| ThisMetNo   = Get_Property(@Window: '.MET_NO', 'TEXT')
 | |
| ResReadings = obj_RDS_Test('Resistivity',ThisMetNo:@RM:UpdatedRec:@RM:1)
 | |
| 
 | |
| for i = 1 to DCount(ResReadings, @VM)
 | |
|     ResReading       = ResReadings<1,i>
 | |
|     ResReadings<1,i> = OConv(ResReading,'MD4Z')
 | |
| Next i
 | |
| Set_Property(@Window : '.RES_READINGS', 'ARRAY', ResReadings)
 | |
| 
 | |
| Readings = Get_Property(CurrCtrl,'ARRAY')
 | |
| Conversion = Get_Property(CurrCtrl,'CONV')<1,1,1>
 | |
| 
 | |
| IF CurrCtrl = 'RDS_TEST.SHEETRHO_READINGS' THEN Conversion = 'MD3'
 | |
| 
 | |
| Set_Status(0)
 | |
| 
 | |
| Stats = obj_RDS_Test('CalcStats',Readings:@RM:Conversion)
 | |
| 
 | |
| IF Get_Status(errCode) THEN
 | |
| 	ErrMsg(errCode)
 | |
| 	RETURN
 | |
| END
 | |
| 
 | |
| UnQualCtrlName = FIELD(CurrCtrl,'.',2)
 | |
| IF UnQualCtrlName = 'HGCV1_READINGS' THEN
 | |
| 	CtrlPref = 'HGCV1_RES'
 | |
| END ELSE
 | |
| 	CtrlPref = UnQualCtrlName[1,'_']
 | |
| END
 | |
| 
 | |
| 
 | |
| Ctrls  = @WINDOW:'.':CtrlPref:'_AVG':@RM		; Props  = 'DEFPROP':@RM
 | |
| Ctrls := @WINDOW:'.':CtrlPref:'_STDV':@RM		; Props := 'DEFPROP':@RM
 | |
| Ctrls := @WINDOW:'.':CtrlPref:'_UNIF':@RM		; Props := 'DEFPROP':@RM
 | |
| Ctrls := @WINDOW:'.':CtrlPref:'_MIN':@RM		; Props := 'DEFPROP':@RM
 | |
| Ctrls := @WINDOW:'.':CtrlPref:'_MAX':@RM		; Props := 'DEFPROP':@RM
 | |
| Ctrls := @WINDOW:'.':CtrlPref:'_RANGE':@RM		; Props := 'DEFPROP':@RM
 | |
| Ctrls := @WINDOW:'.':CtrlPref:'_RANGE_PCNT'		; Props := 'DEFPROP'
 | |
| 
 | |
| Set_Property(Ctrls,Props,Stats)
 | |
| 	
 | |
| 
 | |
| 
 | |
| ResCtrl = @WINDOW:'.RES_READINGS'
 | |
| 
 | |
| IF CurrCtrl NE ResCtrl THEN
 | |
| 
 | |
| 	* Update the resistance statistics
 | |
| 	
 | |
| 	Readings = Get_Property(ResCtrl,'ARRAY')
 | |
| 	Conversion = Get_Property(ResCtrl,'CONV')<1,1,1>
 | |
| 
 | |
| 	testReadings = Readings
 | |
| 	CONVERT @VM TO '' IN testReadings
 | |
| 
 | |
| 	Set_Status(0)
 | |
| 	
 | |
| 	Stats = obj_RDS_Test('CalcStats',Readings:@RM:Conversion)
 | |
| 	IF Get_Status(errCode) THEN
 | |
| 		ErrMsg(errCode)
 | |
| 		RETURN
 | |
| 	END
 | |
| 	
 | |
| 	UnQualCtrlName = FIELD(ResCtrl,'.',2)
 | |
| 	CtrlPref = UnQualCtrlName[1,'_']
 | |
| 	
 | |
| 	Ctrls  = @WINDOW:'.':CtrlPref:'_AVG':@RM		; Props  = 'DEFPROP':@RM
 | |
| 	Ctrls := @WINDOW:'.':CtrlPref:'_STDV':@RM		; Props := 'DEFPROP':@RM
 | |
| 	Ctrls := @WINDOW:'.':CtrlPref:'_UNIF':@RM		; Props := 'DEFPROP':@RM
 | |
| 	Ctrls := @WINDOW:'.':CtrlPref:'_MIN':@RM		; Props := 'DEFPROP':@RM
 | |
| 	Ctrls := @WINDOW:'.':CtrlPref:'_MAX':@RM		; Props := 'DEFPROP':@RM
 | |
| 	Ctrls := @WINDOW:'.':CtrlPref:'_RANGE':@RM		; Props := 'DEFPROP':@RM
 | |
| 	Ctrls := @WINDOW:'.':CtrlPref:'_RANGE_PCNT'		; Props := 'DEFPROP'
 | |
| 	
 | |
| 	Set_Property(Ctrls,Props,Stats)
 | |
| 		
 | |
| END
 | |
| 
 | |
| Send_Event(@WINDOW:'.GROWTH_RATE','CALCULATE')
 | |
| 
 | |
| GOSUB Refresh
 | |
| 
 | |
| CalcRec = Get_Property(@Window, 'ATRECORD')
 | |
| Savewarn = (OrigRec NE CalcRec)
 | |
| Set_Property(@Window, 'SAVEWARN', Savewarn)
 | |
| 
 | |
| RETURN
 | |
| 
 | |
| 
 | |
| 
 | |
| * * * * * * *
 | |
| ReadingsIns:
 | |
| * * * * * * *
 | |
| return
 | |
| RowIndex = Parm1
 | |
| 
 | |
| CurrCtrl = Get_Property(@WINDOW,'FOCUS')
 | |
| 
 | |
| *Dummy = Send_Message(CurrCtrl, "DELETE", RowIndex)	;* Row Limit of 17 doesn't allow additional lines to be added
 | |
| 
 | |
| //ErrMsg('Rows may not be inserted or deleted.')
 | |
| 
 | |
| RETURN
 | |
| 
 | |
| 
 | |
| * * * * * * * 
 | |
| ReadingsDel:
 | |
| * * * * * * *
 | |
| 
 | |
| DeletedRowIndex = Parm1
 | |
| DeletedRowText = Parm2
 | |
| 
 | |
| CurrCtrl = Get_Property(@WINDOW,'FOCUS')
 | |
| 
 | |
| Dummy = Send_Message(CurrCtrl, "INSERT",DeletedRowIndex, DeletedRowText)
 | |
| 
 | |
| ErrMsg('Rows may not be inserted or deleted.')
 | |
| 
 | |
| RETURN
 | |
| 
 | |
| 
 | |
| * * * * * * *
 | |
| SyncTestWafers:
 | |
| * * * * * * *
 | |
| 
 | |
| * * * * * *   Conversion routine to match up TW_USE with associated MV's in RDS_TEST  * * * * * * * *
 | |
| * * * * * *             This will go away once conversion is completed.               * * * * * * * *
 | |
| 
 | |
| ListCnt = COUNT(TWList,@FM) + (TWList NE '')
 | |
| 
 | |
| TWUseCodes	= obj_TW_Use('Convert',MetNo:@RM:TWList)	;* Creates new TW_USE records and returns updated list of TWUseCodes
 | |
| 
 | |
| IF TWUseCodes NE TWArray<COL$TW_USE_ID> THEN
 | |
| 														;* New TW_USED record created - update RDS_TEST record
 | |
| 	TWArray<COL$TW_USE_ID> = TWUseCodes					;* Set Use ID column values
 | |
| 	
 | |
| 	Set_Property(@WINDOW,'@DONT_CLOSE_ON_WRITE',1)
 | |
| 	Set_Property(CtrlEntID,'DEFPROP',TWArray)
 | |
| 	Send_Event (@WINDOW,'WRITE')						;* Write updated Met Rec to disk
 | |
| 	
 | |
| 	Set_Property(@WINDOW:'.MET_NO','DEFPROP',MetNo)	
 | |
| 	Send_Event(@WINDOW:'.MET_NO','LOSTFOCUS')			;* Read Updated Met Rec From disk
 | |
| 	
 | |
| END
 | |
| 
 | |
| RETURN
 | |
| 
 | |
| 
 | |
| * * * * * * *
 | |
| NewTWUse:
 | |
| * * * * * * *
 | |
| 
 | |
|     RDSNo        = Get_Property(@Window : '.RDS_NO', 'TEXT')
 | |
|     FQASigned    = RDS_Services('GetFinalQAStatus', RDSNo)
 | |
|     RecordLocked = False$
 | |
|     
 | |
|     RDSNo    = Get_Property(@WINDOW:'.RDS_NO', 'DEFPROP')
 | |
|     WOMatKey = Xlate('RDS', RDSNo, 'WO_MAT_KEY', 'X')
 | |
| *    If WOMatKey NE '' then RecordLocked = Database_Services('IsKeyIDLocked', 'WO_MAT', WOMatKey, False$)
 | |
|     
 | |
|     Begin Case
 | |
|         
 | |
|         Case FQASigned EQ True$
 | |
|             
 | |
|             // FQA Signed -> Block TW_USE creation/deletion/modification
 | |
|             ErrorMsg = 'FQA has already been signed. Metrology test record cannot be updated!'
 | |
|             ErrMsg(ErrorMsg)
 | |
|             Return 0
 | |
|             
 | |
|         Case RecordLocked EQ True$
 | |
|             LockOwner   = Xlate('WO_MAT', WOMatKey, 'LOCKED_BY', 'X')
 | |
|             If LockOwner NE '' then
 | |
|                 DisplayName = Oconv(LockOwner,'[XLATE_CONV,LSL_USERS*FIRST_LAST]')
 | |
|             end else
 | |
|                 DisplayName = 'an unknown user'
 | |
|             end
 | |
|             MsgParms    = ''
 | |
|             MsgParms<1> = 'Record Locked'
 | |
|             MsgParms<2> = 'The WO_MAT record for this RDS is locked by ':DisplayName:'. Only one user session at a time can edit an RDS.'
 | |
|             Msg(@Window, '', 'OK', '', MsgParms)
 | |
|             Return 0
 | |
|             
 | |
|             
 | |
|         Case Otherwise$
 | |
|             CtrlEntID    = @WINDOW:'.TW_USE'
 | |
|             MetNo        = Get_Property(@WINDOW,'ID')
 | |
|             IF MetNo = '' THEN RETURN
 | |
|             TW_UseNos    = Get_Property(CtrlEntID,'ARRAY')<1>	;* Just need the first column
 | |
|             LastTW_UseNo = 0
 | |
|             DetItemCnt   = COUNT(TW_UseNos,@VM) + (TW_UseNos NE '')
 | |
| 
 | |
|             FOR I = 1 TO DetItemCnt
 | |
|                 TW_UseNo = TW_UseNos<1,I>
 | |
|                 IF TW_UseNo = '' THEN TW_UseNo = 0
 | |
|                 IF TW_UseNo > LastTW_UseNo THEN LastTW_UseNo = TW_UseNo
 | |
|             NEXT I
 | |
| 
 | |
|             Set_Property(@WINDOW,'@DONT_CLOSE_ON_WRITE',1)
 | |
|             Send_Event(@WINDOW,'WRITE')
 | |
| 
 | |
|             TW_UseKey = MetNo:'*':LastTW_UseNo + 1
 | |
|             DetWindow	= 'TW_USE'
 | |
|             DetKeys		= TW_UseKey
 | |
|             DefaultRec	= ''
 | |
|             RetKey		= MetNo
 | |
|             RetWin		= @WINDOW
 | |
|             RetPage		= 1
 | |
|             RetCtrl		= CtrlEntID
 | |
|             RetPos		= 1:@FM:LastTW_UseNo + 1
 | |
|             obj_Appwindow('ViewNewDetail',DetWindow:@RM:DetKeys:@RM:DefaultRec:@RM:RetKey:@RM:RetPage:@RM:RetCtrl:@RM:RetPos)
 | |
|             
 | |
|     End Case
 | |
| 
 | |
| *    If FQASigned EQ False$ then
 | |
| *        
 | |
| *        CtrlEntID    = @WINDOW:'.TW_USE'
 | |
| *        MetNo        = Get_Property(@WINDOW,'ID')
 | |
| *        IF MetNo = '' THEN RETURN
 | |
| *        TW_UseNos    = Get_Property(CtrlEntID,'ARRAY')<1>	;* Just need the first column
 | |
| *        LastTW_UseNo = 0
 | |
| *        DetItemCnt   = COUNT(TW_UseNos,@VM) + (TW_UseNos NE '')
 | |
| * 
 | |
| *        FOR I = 1 TO DetItemCnt
 | |
| *            TW_UseNo = TW_UseNos<1,I>
 | |
| *            IF TW_UseNo = '' THEN TW_UseNo = 0
 | |
| *            IF TW_UseNo > LastTW_UseNo THEN LastTW_UseNo = TW_UseNo
 | |
| *        NEXT I
 | |
| * 
 | |
| *        Set_Property(@WINDOW,'@DONT_CLOSE_ON_WRITE',1)
 | |
| *        Send_Event(@WINDOW,'WRITE')
 | |
| * 
 | |
| *        TW_UseKey = MetNo:'*':LastTW_UseNo + 1
 | |
| *        DetWindow	= 'TW_USE'
 | |
| *        DetKeys		= TW_UseKey
 | |
| *        DefaultRec	= ''
 | |
| *        RetKey		= MetNo
 | |
| *        RetWin		= @WINDOW
 | |
| *        RetPage		= 1
 | |
| *        RetCtrl		= CtrlEntID
 | |
| *        RetPos		= 1:@FM:LastTW_UseNo + 1
 | |
| *        obj_Appwindow('ViewNewDetail',DetWindow:@RM:DetKeys:@RM:DefaultRec:@RM:RetKey:@RM:RetPage:@RM:RetCtrl:@RM:RetPos)
 | |
| * 
 | |
| *    end else
 | |
| *        // FQA Signed -> Block TW_USE creation/deletion/modification
 | |
| *        ErrorMsg = 'FQA has already been signed. Metrology test record cannot be updated!'
 | |
| *        ErrMsg(ErrorMsg)
 | |
| *        Return 0
 | |
| *        
 | |
| *    end
 | |
| 
 | |
| RETURN
 | |
| 
 | |
| 
 | |
| 
 | |
| * * * * * * *
 | |
| TWUseDC:
 | |
| * * * * * * *
 | |
| 
 | |
|     RDSNo        = Get_Property(@Window : '.RDS_NO', 'TEXT')
 | |
|     FQASigned    = RDS_Services('GetFinalQAStatus', RDSNo)
 | |
|     RecordLocked = False$
 | |
|     
 | |
|     RDSNo    = Get_Property(@WINDOW:'.RDS_NO', 'DEFPROP')
 | |
|     WOMatKey = Xlate('RDS', RDSNo, 'WO_MAT_KEY', 'X')
 | |
| *    If WOMatKey NE '' then RecordLocked = Database_Services('IsKeyIDLocked', 'WO_MAT', WOMatKey, False$)
 | |
|     
 | |
|     Begin Case
 | |
|         
 | |
|         Case FQASigned EQ True$
 | |
|             
 | |
|             // FQA Signed -> Block TW_USE creation/deletion/modification
 | |
|             ErrorMsg = 'FQA has already been signed. Metrology test record cannot be updated!'
 | |
|             ErrMsg(ErrorMsg)
 | |
|             Return 0
 | |
|             
 | |
|         Case RecordLocked EQ True$
 | |
|             LockOwner   = Xlate('WO_MAT', WOMatKey, 'LOCKED_BY', 'X')
 | |
|             If LockOwner NE '' then
 | |
|                 DisplayName = Oconv(LockOwner,'[XLATE_CONV,LSL_USERS*FIRST_LAST]')
 | |
|             end else
 | |
|                 DisplayName = 'an unknown user'
 | |
|             end
 | |
|             MsgParms    = ''
 | |
|             MsgParms<1> = 'Record Locked'
 | |
|             MsgParms<2> = 'The WO_MAT record for this RDS is locked by ':DisplayName:'. Only one user session at a time can edit an RDS.'
 | |
|             Msg(@Window, '', 'OK', '', MsgParms)
 | |
|             Return 0
 | |
|             
 | |
|         Case Otherwise$
 | |
|             MetNo     = Get_Property(@WINDOW,'ID')
 | |
|             CtrlEntID = @WINDOW:'.TW_USE'
 | |
|             CurrPos   = Get_Property(CtrlEntID,'CARETPOS')
 | |
|             CurrCol   = CurrPos<1>
 | |
|             CurrRow   = CurrPos<2>
 | |
|             IF CurrCol = COL$USE_NO THEN
 | |
|                 UseNo = Get_Property(CtrlEntID,'CELLPOS',COL$USE_NO:@FM:CurrRow)
 | |
|                 IF MetNo NE '' AND UseNo NE '' THEN
 | |
|                     IF Get_Property(@WINDOW,'QBFLIST') = '' THEN
 | |
|                         Set_Property(@WINDOW,'@DONT_CLOSE_ON_WRITE','1')
 | |
|                         Send_Event(@WINDOW,'WRITE')
 | |
|                     END                
 | |
|                     DetWindow	= 'TW_USE'
 | |
|                     DetKeys		= MetNo:'*':UseNo
 | |
|                     DefaultRec	= ''
 | |
|                     RetKey		= MetNo
 | |
|                     RetPage		= 1
 | |
|                     RetCtrl		= CtrlEntID
 | |
|                     RetPos		= CurrPos                
 | |
|                     oAParms = DetWindow:@RM:DetKeys:@RM:DefaultRec:@RM:RetKey:@RM:RetPage:@RM:RetCtrl:@RM:RetPos
 | |
|                     obj_AppWindow('ViewNewDetail',oAParms)
 | |
|                     IF Get_Status(errCode) THEN
 | |
|                         ErrMsg(errCode)
 | |
|                     END
 | |
|                 END
 | |
|             END	;* End of ItemNo column
 | |
|             
 | |
|     End Case
 | |
| 
 | |
| *    If FQASigned EQ False$ then   
 | |
| * 
 | |
| *        MetNo = Get_Property(@WINDOW,'ID')
 | |
| *        CtrlEntID = @WINDOW:'.TW_USE'
 | |
| *        CurrPos = Get_Property(CtrlEntID,'CARETPOS')
 | |
| *        CurrCol = CurrPos<1>
 | |
| *        CurrRow = CurrPos<2>
 | |
| *        IF CurrCol = COL$USE_NO THEN
 | |
| *            UseNo = Get_Property(CtrlEntID,'CELLPOS',COL$USE_NO:@FM:CurrRow)
 | |
| *            IF MetNo NE '' AND UseNo NE '' THEN
 | |
| *                IF Get_Property(@WINDOW,'QBFLIST') = '' THEN
 | |
| *                    Set_Property(@WINDOW,'@DONT_CLOSE_ON_WRITE','1')
 | |
| *                    Send_Event(@WINDOW,'WRITE')
 | |
| *                END                
 | |
| *                DetWindow	= 'TW_USE'
 | |
| *                DetKeys		= MetNo:'*':UseNo
 | |
| *                DefaultRec	= ''
 | |
| *                RetKey		= MetNo
 | |
| *                RetPage		= 1
 | |
| *                RetCtrl		= CtrlEntID
 | |
| *                RetPos		= CurrPos                
 | |
| *                oAParms = DetWindow:@RM:DetKeys:@RM:DefaultRec:@RM:RetKey:@RM:RetPage:@RM:RetCtrl:@RM:RetPos
 | |
| *                obj_AppWindow('ViewNewDetail',oAParms)
 | |
| *                IF Get_Status(errCode) THEN
 | |
| *                    ErrMsg(errCode)
 | |
| *                END
 | |
| *            END
 | |
| *        END	;* End of ItemNo column
 | |
| *        
 | |
| *    end else
 | |
| *        
 | |
| *        // FQA Signed -> Block TW_USE creation/deletion/modification
 | |
| *        ErrorMsg = 'FQA has already been signed. Metrology test record cannot be updated!'
 | |
| *        ErrMsg(ErrorMsg)
 | |
| *        Return 0
 | |
| *    
 | |
| *    end
 | |
| 
 | |
| RETURN
 | |
| 
 | |
| 
 | |
| * * * * * * *
 | |
| TWOptions:
 | |
| * * * * * * *
 | |
| 
 | |
| CtrlEntID = @WINDOW:'.WFR_USAGE'
 | |
| CurrPos = Get_Property(CtrlEntID,'SELPOS')
 | |
| CurrCol = CurrPos<1>
 | |
| CurrRow = CurrPos<2>
 | |
| 
 | |
| MetNo		= Get_Property(@WINDOW:'.MET_NO','DEFPROP')
 | |
| TWList		= Get_Property(CtrlEntID,'LIST')
 | |
| TWArray		= Get_Property(CtrlEntID,'DEFPROP')
 | |
| 
 | |
| 
 | |
| 	CurrUseID = TWArray<COL$TW_USE_ID,CurrRow>
 | |
| 	
 | |
| 	IF CurrUseID NE '' THEN
 | |
| 			
 | |
| 		obj_AppWindow('ViewRelated','TW_USE':@RM:CurrUseID)
 | |
| 		
 | |
| 	END
 | |
| 	
 | |
| 
 | |
| BEGIN CASE
 | |
| 
 | |
| 	CASE CurrCol = COL$TW_TYPE
 | |
| 		
 | |
| 		Result = Popup(@WINDOW,'','TW_TYPES')
 | |
| 		
 | |
| 		IF Result NE '' THEN
 | |
| 			Parms = Result:@RM:CtrlEntId:@RM:CurrPos
 | |
| 			obj_Appwindow('LUValReturn',Result:@RM:CtrlEntId:@RM:CurrPos )
 | |
| 		END
 | |
| 		
 | |
| 	CASE CurrCol = COL$TW_CODE
 | |
| 	
 | |
| 		Result = Popup(@WINDOW,'','SHOW_TW_CODES')
 | |
| 		
 | |
| 		IF Result NE '' THEN
 | |
| 			Parms = Result:@RM:CtrlEntId:@RM:CurrPos
 | |
| 			obj_Appwindow('LUValReturn',Result:@RM:CtrlEntId:@RM:CurrPos )
 | |
| 		END
 | |
| 	
 | |
| 	CASE CurrCol = COL$TW_TOOL
 | |
| 		
 | |
| 		Result = Popup( @WINDOW, '', 'CHOOSE_TOOL' )
 | |
| 	
 | |
| 		IF Result NE '' THEN
 | |
| 			Parms = Result:@RM:CtrlEntId:@RM:CurrPos
 | |
| 			obj_Appwindow('LUValReturn',Result:@RM:CtrlEntId:@RM:CurrPos )
 | |
| 		END
 | |
| 		
 | |
| 				
 | |
| END CASE
 | |
| 
 | |
| RETURN
 | |
| 
 | |
| 
 | |
| * * * * * * *
 | |
| TWPC:
 | |
| * * * * * * *
 | |
| 
 | |
| RETURN	;******************************
 | |
| 
 | |
| CtrlEntID	= Get_Property(@WINDOW,'FOCUS')
 | |
| 
 | |
| PrevSelPos	= Get_Property(CtrlEntId,"PREVSELPOS")
 | |
| PrevCol 	= PrevSelPos<1>
 | |
| PrevRow 	= PrevSelPos<2>
 | |
| 
 | |
| CurrPos = Get_Property(CtrlEntId,'SELPOS')
 | |
| CurrCol = CurrPos<1>
 | |
| CurrRow = CurrPos<2>
 | |
| 
 | |
| ListData	= Get_Property(CtrlEntId,'LIST')
 | |
| 
 | |
| MetNo = Get_Property(@WINDOW:'.MET_NO','TEXT')
 | |
| 
 | |
| ColCnt = 11
 | |
| 
 | |
| * LostFocus checks 
 | |
| 
 | |
| IF ListData<PrevRow,PrevCol> NE '' THEN
 | |
| 	
 | |
| 	BEGIN CASE
 | |
| 	
 | |
| 		CASE PrevCol = COL$TW_CODE
 | |
| 		
 | |
| 			TWCode = ListData<PrevRow,PrevCol>
 | |
| 			IF RowExists('TW_CODES', TWCode) THEN
 | |
| 				IF TWCode = '99' THEN
 | |
| 					Parms = 'NA':@RM:CtrlEntId:@RM:COL$TW_TOOL:@FM:PrevRow		;* Added 'NA' defaults for signature line 11/14/2007 JCH
 | |
| 					obj_Appwindow('LUValReturn',Parms)
 | |
| 					
 | |
| 					Parms = 'NA':@RM:CtrlEntId:@RM:COL$TW_TYPE:@FM:PrevRow
 | |
| 					obj_Appwindow('LUValReturn',Parms)
 | |
| 				END
 | |
| 			END ELSE
 | |
| 				
 | |
| 				Mesg  = 'Invalid Test Wafer Code Entered.':@TM:@TM
 | |
| 				Mesg := 'Code ':QUOTE(TWCode):' not found in':@TM:'TestWafer Code Table!'
 | |
| 				ErrMsg(Mesg)
 | |
| 									
 | |
| 				Set_Property(CtrlEntId,"SELPOS",PrevSelPos)
 | |
| 				Set_Property(CtrlEntID,'INVALUE','',PrevSelPos)			;* Clear entered field
 | |
| 			END
 | |
| 			
 | |
| 			
 | |
| 			
 | |
| 		CASE PrevCol = COL$TW_TOOL
 | |
| 			TWTool = ListData<PrevRow,PrevCol>
 | |
| 			
 | |
| 			
 | |
| 			IF TWTool NE 'NA' THEN
 | |
| 				AllTools = XLATE('LISTBOX_CONFIG','ALLTOOLS',1,'X')
 | |
| 				
 | |
| 				LOCATE TWTool IN AllTools USING @VM SETTING Dummy ELSE
 | |
| 				
 | |
| 					Mesg  = 'Invalid TestWafer Tool Entered.':@TM:@TM
 | |
| 					Mesg := 'Tool ':QUOTE(TWTool):' not found in LISTBOX_CONFIG table.':@TM:'ALLTOOLS record.'
 | |
| 					ErrMsg(Mesg)
 | |
| 					
 | |
| 					Set_Property(CtrlEntId,"SELPOS",PrevSelPos)
 | |
| 					Set_Property(CtrlEntID,'INVALUE','',PrevSelPos)			;* Clear entered field
 | |
| 				END
 | |
| 			END
 | |
| 			
 | |
| 			
 | |
| 			
 | |
| 		CASE PrevCol = COL$TW_TYPE
 | |
| 			TWType = ListData<PrevRow,PrevCol>
 | |
| 			
 | |
| 			IF TWType NE 'NA' THEN
 | |
| 			
 | |
| 				TWTypes = XLATE('SYSREPOSPOPUPS','LSL2**TW_TYPES',8,'X')
 | |
| 				
 | |
| 				TypeCnt = COUNT(TWTypes,@VM) + (TWTypes NE '')
 | |
| 				Found = 0
 | |
| 				
 | |
| 				FOR N = 1 TO TypeCnt
 | |
| 					IF TWTypes<1,N,1> = TWType THEN Found = 1
 | |
| 				UNTIL Found
 | |
| 				NEXT N
 | |
| 				
 | |
| 				IF NOT(Found) THEN
 | |
| 					
 | |
| 					Mesg  = 'Invalid Test Wafer Type Entered.':@TM:@TM
 | |
| 					Mesg := 'Tool ':QUOTE(TWType):' not found in TW_TYPES popup.':@TM:'ALLTOOLS record.'
 | |
| 					ErrMsg(Mesg)
 | |
| 					
 | |
| 					Set_Property(CtrlEntId,"SELPOS",PrevSelPos)
 | |
| 					Set_Property(CtrlEntID,'INVALUE','',PrevSelPos)			;* Clear entered field
 | |
| 				END
 | |
| 				
 | |
| 				
 | |
| 				
 | |
| 			END
 | |
| 			
 | |
| 	END CASE
 | |
| END		
 | |
| 
 | |
| * Gotfocus checks
 | |
| 
 | |
| IF ListData<CurrRow,CurrCol> = '' AND CurrCol NE COL$TW_USAGE_DESC THEN
 | |
| 	
 | |
| 	ColPointer = CurrCol
 | |
| 	LinePointer = CurrRow
 | |
| 	
 | |
| 	* Find the first non-empty cell
 | |
| 	
 | |
| 	LOOP
 | |
| 		Test = ListData<LinePointer,(ColPointer) >
 | |
| 	UNTIL Test NE '' OR (LinePointer = 0 AND ColPointer = 1)
 | |
| 		ColPointer -= 1
 | |
| 		IF ColPointer = 0 THEN
 | |
| 			ColPointer = ColCnt - 2
 | |
| 			LinePointer -= 1
 | |
| 		END
 | |
| 	REPEAT
 | |
| 	
 | |
| 	* Move one past the non empty cell
 | |
| 	
 | |
| 	BEGIN CASE
 | |
| 		CASE LinePointer = 0 
 | |
| 			* Empty Table
 | |
| 			LinePointer = 1
 | |
| 			ColPointer = 1
 | |
| 			
 | |
| 		CASE ColPointer = ColCnt - 2
 | |
| 			LinePointer += 1
 | |
| 			ColPointer = 1
 | |
| 			
 | |
| 		CASE 1
 | |
| 			ColPointer += 1
 | |
| 			
 | |
| 	END CASE
 | |
| 	
 | |
| 	Set_Property(CtrlEntId,"SELPOS",ColPointer:@FM:LinePointer)
 | |
| 	
 | |
| 	
 | |
| 	ToolCtrls  = @WINDOW:'.SPEC_THICK_MTOOL':@RM	; ToolProps  = 'DEFPROP':@RM
 | |
| 	ToolCtrls := @WINDOW:'.SPEC_RES_MTOOL':@RM		; ToolProps := 'DEFPROP':@RM
 | |
| 	ToolCtrls := @WINDOW:'.SPEC_CON_MTOOL':@RM		; ToolProps := 'DEFPROP':@RM
 | |
| 	ToolCtrls := @WINDOW:'.SPEC_CRES_MTOOL'			; ToolProps := 'DEFPROP'
 | |
| 	
 | |
| 	AvailTools = Get_Property(ToolCtrls,ToolProps)
 | |
| 	CONVERT @RM TO @VM IN AvailTools
 | |
| 	SWAP @VM:@VM WITH @VM IN AvailTools
 | |
| 	
 | |
| 	
 | |
| 	TypeCtrls  = @WINDOW:'.SPEC_THICK_MTYPE':@RM		; TypeProps  = 'DEFPROP':@RM
 | |
| 	TypeCtrls := @WINDOW:'.SPEC_RES_MTYPE':@RM			; TypeProps := 'DEFPROP':@RM
 | |
| 	TypeCtrls := @WINDOW:'.SPEC_CON_MTYPE':@RM			; TypeProps := 'DEFPROP':@RM
 | |
| 	TypeCtrls := @WINDOW:'.SPEC_CRES_MYPE'				; TypeProps := 'DEFPROP'
 | |
| 	
 | |
| 	MTypeCtrls  = @WINDOW:'.SPEC_THICK_MPROVEIN':@RM	; MTypeProps  = 'DEFPROP':@RM
 | |
| 	MTypeCtrls := @WINDOW:'.SPEC_RES_MPROVEIN':@RM		; MTypeProps := 'DEFPROP':@RM
 | |
| 	MTypeCtrls := @WINDOW:'.SPEC_CON_MPROVEIN':@RM		; MTypeProps := 'DEFPROP':@RM
 | |
| 	MTypeCtrls := @WINDOW:'.SPEC_CRES_MPROVEIN'		; MTypeProps := 'DEFPROP'
 | |
| 	
 | |
| 	AvailTypes = Get_Property(TypeCtrls,TypeProps)
 | |
| 	CONVERT @RM TO @VM IN AvailTypes
 | |
| 	
 | |
| 	AvailMTypes = Get_Property(MTypeCtrls,MTypeProps)
 | |
| 	CONVERT @RM TO @VM IN AvailMTypes
 | |
| 	
 | |
| 	
 | |
| 	BEGIN CASE
 | |
| 		CASE ColPointer = COL$TW_CODE
 | |
| 			
 | |
| 			* Leave this null for now
 | |
| 			
 | |
| 		CASE ColPointer = COL$TW_TOOL
 | |
| 		
 | |
| 			IF ListData<CurrRow,CurrCol> = '' THEN
 | |
| 		
 | |
| 				* Popup Tools
 | |
| 				
 | |
| 				TypeOver = ''
 | |
| 				TypeOver<PDISPLAY$> = AvailTools
 | |
| 				Tool = Popup(@WINDOW,TypeOver,'RDS_SPEC_TOOLS')	
 | |
| 				
 | |
| 				IF Tool NE '' THEN
 | |
| 					Parms = Tool:@RM:CtrlEntId:@RM:ColPointer:@FM:LinePointer
 | |
| 					obj_Appwindow('LUValReturn',Parms)
 | |
| 					
 | |
| 				END
 | |
| 			END
 | |
| 			
 | |
| 			
 | |
| 		CASE ColPointer = COL$TW_TYPE
 | |
| 		
 | |
| 			IF ListData<CurrRow,CurrCol> = '' THEN
 | |
| 		
 | |
| 				* Popup WaferTypes on this tools line
 | |
| 				
 | |
| 				TypeCode = Popup(@WINDOW,'','TW_TYPES')
 | |
| 				
 | |
| 				IF TypeCode NE '' THEN	
 | |
| 					Parms = TypeCode:@RM:CtrlEntId:@RM:ColPointer:@FM:LinePointer
 | |
| 					obj_Appwindow('LUValReturn',Parms)
 | |
| 				END
 | |
| 			END
 | |
| 			
 | |
| 			
 | |
| 		CASE ColPointer = COL$TW_SIG
 | |
| 			
 | |
| 			IF ListData<CurrRow,CurrCol> = '' THEN                  
 | |
|                 Valid = Dialog_Box('NDW_VERIFY_USER', @Window, @User4)
 | |
|                 Valid = Valid<1>
 | |
| 				IF Valid THEN
 | |
| 					Parms = @USER4:@RM:CtrlEntId:@RM:ColPointer:@FM:LinePointer						;* Username
 | |
| 					obj_Appwindow('LUValReturn',Parms )
 | |
| 					
 | |
| 					CurrDTM = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS')
 | |
| 					Parms = CurrDTM:@RM:CtrlEntId:@RM:ColPointer+1:@FM:LinePointer					;* Date-Time Stamp 
 | |
| 					obj_Appwindow('LUValReturn',Parms )
 | |
| 					
 | |
| 					
 | |
| 					CurrDTM			= ICONV(CurrDTM,'DT')
 | |
| 					ReactNo			= Get_Property(@WINDOW:'.REACTOR','DEFPROP')
 | |
| 					OutOfProdDTM	= XLATE('REACT_STATUS',ReactNo,REACT_STATUS_OUT_OF_PROD_DTM$,'X')
 | |
| 					HrsSinceProd 	= OCONV((CurrDTM - OutOfProdDTM)*24,'MD2')
 | |
| 					
 | |
| 					Parms = HrsSinceProd:@RM:CtrlEntId:@RM:ColPointer+2:@FM:LinePointer	;* Hours Since Production
 | |
| 					obj_Appwindow('LUValReturn',Parms )
 | |
| 					
 | |
| 					EscHrs = XLATE('REACTOR',ReactNo,'ACT_ESC_HRS','X')
 | |
| 					IF EscHrs = '' THEN EscHrs = 0
 | |
| 					EscElapsedTime	= OCONV(EscHrs,'MD2')
 | |
| 					
 | |
| 					Parms = EscElapsedTime:@RM:CtrlEntId:@RM:ColPointer+3:@FM:LinePointer			;* Hours in Escalation
 | |
| 					obj_Appwindow('LUValReturn',Parms )
 | |
| 				END	
 | |
| 			END
 | |
| 			
 | |
| 		CASE 1
 | |
| 			NULL
 | |
| 			
 | |
| 	END CASE
 | |
| 	
 | |
| 	RETURN
 | |
| 	
 | |
| END
 | |
|  
 | |
| IF CurrCol = COL$TW_USAGE_DESC THEN
 | |
| 	Set_Property(CtrlEntId,'SELPOS',CurrCol + 1:@FM:CurrRow)
 | |
| END
 | |
| 
 | |
| 
 | |
| IF CurrCol = COL$TW_QTY OR CurrCol = COL$TW_CODE OR CurrCol = COL$TW_TOOL OR CurrCol = COL$TW_TYPE THEN
 | |
| 	IF ListData<CurrRow,CurrCol> NE '' AND ListData<CurrRow,COL$TW_SIG> NE '' THEN
 | |
| 		Set_Property(CtrlEntId,'SELPOS',CurrCol + 1:@FM:CurrRow)										;* 11/19/2007 JCH no change in parms once signed
 | |
| 	END
 | |
| END
 | |
| 
 | |
| 
 | |
| 
 | |
| GOSUB Refresh
 | |
| 
 | |
| RETURN
 | |
| 
 | |
| 
 | |
| * * * * * * * 
 | |
| TWLF:
 | |
| * * * * * * *
 | |
| 
 | |
| RETURN
 | |
| 
 | |
| CtrlEntID	= @WINDOW:'.WFR_USAGE'							;***************************************************
 | |
| MetNo		= Get_Property(@WINDOW:'.MET_NO','DEFPROP')
 | |
| ListData	= Get_Property(CtrlEntId,'LIST')
 | |
| TWArray 	= Get_Property(CtrlEntID,'ARRAY')
 | |
| ReactType	= Get_Property(@WINDOW:'.REACTOR_TYPE_IN','TEXT')
 | |
| 
 | |
| WriteFlag = 0
 | |
| 
 | |
| ListCnt = COUNT(ListData,@FM) + (ListData NE '')
 | |
| FOR I = 1 TO ListCnt
 | |
| 
 | |
| 	Tool = ListData<I,COL$TW_TOOL>
 | |
| 	
 | |
| 	*IF ListData<I,COL$TW_TYPE> = 'PROD' THEN
 | |
| 	*	IF Tool NE 'SRP' AND Tool NE 'HgCv'  THEN
 | |
| 		
 | |
| 	*		Mesg  = 'The ':Tool:' tool is Non_Destructive to a Product wafer':CRLF$:CRLF$
 | |
| 	*		Mesg := 'Only tests that are destructive to a product wafer are recorded':CRLF$	;* Dead 3/31/2009 JCH & DKK
 | |
| 	*		Mesg := 'in the Test Wafer Usage area.'
 | |
| 	*		ErrMsg(Mesg)
 | |
| 	*		Set_Property(CtrlEntID, 'FOCUS', 1)
 | |
| 	*		RETURN
 | |
| 	*	END
 | |
| 	*END
 | |
| 	
 | |
| 	IF ListData<I,COL$TW_QTY> NE '' THEN
 | |
| 		IF ListData<I,COL$TW_CODE> = '' THEN
 | |
| 			Mesg = 'Incomplete Test Wafer Line - All Fields must be completed.'
 | |
| 			ErrMsg(Mesg)
 | |
| 			Set_Property(CtrlEntID, 'FOCUS', 1)
 | |
| 			Set_Property(CtrlEntId,"SELPOS",I:@FM:COL$TW_CODE)
 | |
| 			RETURN
 | |
| 		END ELSE
 | |
| 			IF ListData<I,COL$TW_TOOL> = '' THEN
 | |
| 				Mesg = 'Incomplete Test Wafer Line - All Fields must be completed.'
 | |
| 				ErrMsg(Mesg)
 | |
| 				Set_Property(CtrlEntID, 'FOCUS', 1)
 | |
| 				Set_Property(CtrlEntId,"SELPOS",I:@FM:COL$TW_TOOL)
 | |
| 				RETURN
 | |
| 			END ELSE
 | |
| 				IF ListData<I,COL$TW_TYPE> = '' THEN
 | |
| 					Mesg = 'Incomplete Test Wafer Line - All Fields must be completed.'
 | |
| 					ErrMsg(Mesg)
 | |
| 					Set_Property(CtrlEntID, 'FOCUS', 1)
 | |
| 					Set_Property(CtrlEntId,"SELPOS",I:@FM:COL$TW_TOOL)
 | |
| 					RETURN
 | |
| 				END
 | |
| 			END
 | |
| 		END
 | |
| 	END
 | |
| 	
 | |
| 	* This section added 8/11/2008 JCH for Test wafer slot maintenance in the WO_MAT table
 | |
| 	
 | |
| 	IF ReactType NE 'P' THEN
 | |
| 	
 | |
| 		RDSNo = Get_Property(@WINDOW:'.RDS_NO','DEFPROP')
 | |
| 		RRRec = XLATE('REACT_RUN',RDSno,'','X')
 | |
| 				
 | |
| 		WONo	= RRRec<REACT_RUN_WO_NO$>
 | |
| 		CassNo	= RRRec<REACT_RUN_CASS_NO$>
 | |
| 		
 | |
| 		IF ListData<I,COL$TW_TYPE> = 'PROD' AND ListData<I,COL$TW_WAFER_ID> = '' THEN
 | |
| 		
 | |
| 			SlotWaferIDs = obj_WO_Mat('SlotWaferIDs',WONo:'*':CassNo)									;* Get list of available wafers in cassette
 | |
| 			WaferIDCnt = COUNT(SlotWaferIDs,@VM) + (SlotWaferIDs NE '')
 | |
| 			
 | |
| 			FOR N = 1 TO WaferIDCnt
 | |
| 				SlotWaferIDs<1,N> = N:@SVM:SlotWaferIDs<1,N>
 | |
| 			NEXT N
 | |
| 			
 | |
| 			TypeOver = ''
 | |
| 			TypeOver<PDISPLAY$> = SlotWaferIDs
 | |
| 			ProdTestSlots = Popup(@WINDOW,TypeOver,'SELECT_PROD_TEST')									;* Select from list of available wafers
 | |
| 			
 | |
| 			
 | |
| 			IF ProdTestSlots NE '' THEN
 | |
| 				Set_Status(0)
 | |
| 				WaferIDList = obj_WO_Mat('RemProdTW',WONo:@RM:CassNo:@RM:MetNo:@RM:ProdTestSlots)		;* Add metrology number to each selected slot
 | |
| 				
 | |
| 				IF Get_Status(errCode) THEN
 | |
| 					ErrMsg(errCode)
 | |
| 				END ELSE
 | |
| 						
 | |
| 					IF ListData<I,COL$TW_TYPE> = 'PROD' AND ListData<I,COL$TW_WAFER_ID> = '' THEN
 | |
| 						Parms = WaferIDList:@RM:CtrlEntId:@RM:COL$TW_WAFER_ID:@FM:I
 | |
| 						obj_Appwindow('LUValReturn',Parms)												;* Add @SVM'd wafer ids to test wafer line
 | |
| 					END
 | |
| 				END
 | |
| 			END
 | |
| 			NULL
 | |
| 			WriteFlag = 1
 | |
| 		END
 | |
| 		
 | |
| 		IF ListData<I,COL$TW_TYPE> NE 'PROD' AND ListData<I,COL$TW_WAFER_ID> NE '' THEN
 | |
| 			obj_WO_Mat('RepProdTW',WONo:@RM:CassNo:@RM:MetNo:@RM:ListData<I,COL$TW_WAFER_ID>)			;* Put the test wafers back in the box
 | |
| 			Parms = '':@RM:CtrlEntId:@RM:COL$TW_WAFER_ID:@FM:I
 | |
| 			obj_Appwindow('LUValReturn',Parms)															;*
 | |
| 			WriteFlag = 1
 | |
| 		END
 | |
| 	END	;* End of check for Non EpiPRO reactor type
 | |
| NEXT I
 | |
| 
 | |
| IF WriteFlag = 1 THEN
 | |
| 	Set_Property(@WINDOW,'@DONT_CLOSE_ON_WRITE',1)
 | |
| 	Send_Event(@WINDOW,'WRITE')
 | |
| 	obj_AppWindow('LoadFormKeys',@WINDOW:@RM:MetNo)
 | |
| END
 | |
| 
 | |
| 
 | |
| RETURN
 | |
| 
 | |
| 
 | |
| 
 | |
| * * * * * * *
 | |
| TWDel:
 | |
| * * * * * * *
 | |
| 
 | |
| RETURN
 | |
| 
 | |
| RowNum	= Parm1
 | |
| RowData	= Parm2
 | |
| 	
 | |
| CtrlEntID = @WINDOW:'.WFR_USAGE'
 | |
| 
 | |
| UserRec		= XLATE( 'LSL_USERS', @USER4, '', 'X' )
 | |
| Groups		= UserRec<LSL_USERS_GROUPS$>
 | |
| 
 | |
| WriteFlag	= 0
 | |
| 
 | |
| *Add LEAD to group
 | |
| 
 | |
| 
 | |
| LOCATE 'SUPERVISOR' IN Groups USING @VM SETTING DUMMY THEN
 | |
| 
 | |
| 	MetNo	= Get_Property(@WINDOW:'.MET_NO','DEFPROP')
 | |
| 	RDSNo = Get_Property(@WINDOW:'.RDS_NO','DEFPROP')
 | |
| 	RRRec = XLATE('REACT_RUN',RDSno,'','X')
 | |
| 			
 | |
| 	WONo	= RRRec<REACT_RUN_WO_NO$>
 | |
| 	CassNo	= RRRec<REACT_RUN_CASS_NO$>
 | |
| 	
 | |
| 	TWUseID = RowData<1,COL$TW_USE_ID>
 | |
| 	IF TWUseID NE '' THEN
 | |
| 		obj_TW_Use('Delete',WONo:@RM:CassNo:@RM:MetNo:@RM:TWUseID)
 | |
| 		IF Get_Status(errCode) THEN
 | |
| 			* * * * * * * 
 | |
| 		END
 | |
| 	END ELSE
 | |
| 		IF RowData<1,COL$TW_WAFER_ID> NE '' THEN
 | |
| 			obj_WO_Mat('RepProdTW',WONo:@RM:CassNo:@RM:MetNo:@RM:RowData<1,COL$TW_WAFER_ID>)		;* Put the test wafers back in the box
 | |
| 		END	
 | |
| 	END
 | |
| 	WriteFlag = 1
 | |
| 
 | |
| END ELSE
 | |
| 	Send_Message(CtrlEntID, "INSERT", RowNum, RowData)
 | |
| 	ErrMsg('Only supervisors may delete test wafer line items.')
 | |
| END
 | |
| 
 | |
| IF WriteFlag = 1 THEN
 | |
| 	Set_Property(@WINDOW,'@DONT_CLOSE_ON_WRITE',1)
 | |
| 	Send_Event(@WINDOW,'WRITE')
 | |
| 	obj_AppWindow('LoadFormKeys',@WINDOW:@RM:MetNo)
 | |
| END
 | |
| 
 | |
| RETURN
 | |
| 
 | |
| 
 | |
| * * * * * * *
 | |
| OverRide:
 | |
| * * * * * * *
 | |
| 
 | |
| IF XLATE( 'LSL_USERS', @USER4, LSL_USERS_RDS_MASTER$, 'X' ) THEN
 | |
| 
 | |
| 	IF NOT( Dialog_Box( 'PWD_ENTRY', @WINDOW, '' ) ) THEN RETURN
 | |
| 	
 | |
| END ELSE
 | |
| 	MSGINFO = ''
 | |
| 	MSGINFO<MTEXT$> = 'You do not have security rights to override Run Data Sheet information.'
 | |
| 	MSGINFO<MICON$> = 'H'
 | |
| 	VOID = MSG( '', MSGINFO )
 | |
| 	RETURN
 | |
| END
 | |
| 
 | |
| ORCtrls  = @WINDOW:'.SPEC_THICK_MIN':@RM:@WINDOW:'.SPEC_THICK_TARGET':@RM:@WINDOW:'.SPEC_THICK_MAX':@RM:@WINDOW:'.SPEC_THICK_UNITS':@RM
 | |
| ORCtrls := @WINDOW:'.SPEC_RES_MIN':@RM:@WINDOW:'.SPEC_RES_TARGET':@RM:@WINDOW:'.SPEC_RES_MAX':@RM:@WINDOW:'.SPEC_RES_UNITS':@RM
 | |
| ORCtrls := @WINDOW:'.SPEC_CON_MIN':@RM:@WINDOW:'.SPEC_CON_TARGET':@RM:@WINDOW:'.SPEC_CON_MAX':@RM:@WINDOW:'.SPEC_CON_UNITS':@RM
 | |
| ORCtrls := @WINDOW:'.SPEC_CRES_MIN':@RM:@WINDOW:'.SPEC_CRES_TARGET':@RM:@WINDOW:'.SPEC_CRES_MAX':@RM:@WINDOW:'.SPEC_CRES_UNITS'
 | |
| 
 | |
| Props = STR('ENABLED':@RM,16)	; Props[-1,1] = ''
 | |
| Vals = STR('1':@RM,16)			; Vals[-1,1] = ''
 | |
| 
 | |
| 
 | |
| Set_Property(ORCtrls,Props,Vals)
 | |
| 
 | |
| Props = STR('BACKCOLOR':@RM,16)	; Props[-1,1] = ''
 | |
| Vals = STR(WHITE$ :@RM,16)		; Vals[-1,1] = ''
 | |
| 
 | |
| Set_Property(ORCtrls,Props,Vals)
 | |
| 
 | |
| RETURN
 | |
| 
 | |
| 
 | |
| * * * * * * *
 | |
| CopyTSLine:
 | |
| * * * * * * *
 | |
| 
 | |
|     RDSNo = Get_Property(@Window : '.RDS_NO', 'TEXT')
 | |
|     FQASigned = RDS_Services('GetFinalQAStatus', RDSNo)
 | |
| 
 | |
|     If FQASigned EQ False$ then   
 | |
| 
 | |
|         CtrlEntID	= @WINDOW:'.WFR_USAGE'
 | |
| 
 | |
|         CurrPos	= Get_Property(CtrlEntId,"SELPOS")
 | |
|         CurrRow = CurrPos<2>
 | |
| 
 | |
|         IF CurrPos = '' THEN RETURN						;* No row selected
 | |
|         
 | |
|         CtrlEntID = @WINDOW:'.TW_USE'       
 | |
|         CurrPos	= Get_Property(CtrlEntId,"SELPOS")
 | |
|         CurrRow = CurrPos<2>      
 | |
|         IF CurrRow = '' THEN
 | |
|             MText = 'Please select an existing row to copy.'
 | |
|             Msg(@WINDOW,'', 'ERROR','','Copy Test Wafer Use':@FM: MText)
 | |
|         
 | |
|             RETURN
 | |
|         END       
 | |
|         IF INDEX(CurrRow,@VM,1) THEN
 | |
|             MText = 'Please select a single row to copy.'
 | |
|             Msg(@WINDOW,'', 'ERROR','','Copy Test Wafer Use':@FM: MText)
 | |
|             RETURN
 | |
|         END        
 | |
|         CurrWaferIDs = Get_Property(CtrlEntID,'CELLPOS',COL$WAFER_ID:@FM:CurrRow)        
 | |
|         IF CurrWaferIDs NE '' THEN
 | |
|             MText = 'Selected Wafer Usage uses Product Test Wafers and may not be copied.'
 | |
|             Msg(@WINDOW,'', 'ERROR','','Copy Test Wafer Use':@FM: MText)
 | |
|             RETURN
 | |
|         END
 | |
|         UseNos = Get_Property(CtrlEntId,'DEFPROP')<COL$USE_NO>       
 | |
|         CurrUseNo	= UseNos<COL$USE_NO,CurrRow>       
 | |
|         IF CurrUseNo = '' THEN
 | |
|             MText = 'No Test Wafer Use line selected to copy.'
 | |
|             Msg(@WINDOW,'', 'ERROR','','Copy Test Wafer Use':@FM: MText)
 | |
|             RETURN
 | |
|         END       
 | |
|         LOOP
 | |
|         UNTIL UseNos[-1,1] NE @VM OR UseNos = ''
 | |
|             UseNos[-1,1] = ''
 | |
|         REPEAT        
 | |
|         UseCnt = COUNT(UseNos,@VM) + (UseNos NE '')        
 | |
|         LastSeq = 0       
 | |
|         FOR I = 1 to UseCnt
 | |
|             UseNo =UseNos<1,I>
 | |
|             IF UseNo > LastSeq THEN
 | |
|                 LastSeq = UseNo
 | |
|             END
 | |
|         NEXT I        
 | |
|         NextSeq = LastSeq + 1        
 | |
|         MetNo = Get_Property(@WINDOW:'.MET_NO','DEFPROP')        
 | |
|         Set_Property(@WINDOW,'@DONT_CLOSE_ON_WRITE','1')
 | |
|         Send_Event('RDS_TEST','WRITE')        
 | |
|         Set_Status(0)        
 | |
|         obj_TW_Use('Copy',MetNo:@RM:NextSeq:@RM:CurrUseNo)        
 | |
|         IF Get_Status(errCode) THEN
 | |
|             ErrMsg(errCode)
 | |
|             obj_AppWindow('LoadFormKeys',@WINDOW:@RM:MetNo)
 | |
|             RETURN
 | |
|         END       
 | |
|         obj_AppWindow('LoadFormKeys',@WINDOW:@RM:MetNo)               
 | |
|         obj_AppWindow('ViewRelated','TW_USE':@RM:MetNo:'*':NextSeq)
 | |
|                 
 | |
|     end else
 | |
| 
 | |
|         // FQA Signed -> Block TW_USE creation/deletion/modification
 | |
|         ErrorMsg = 'FQA has already been signed. Metrology test record cannot be updated!'
 | |
|         ErrMsg(ErrorMsg)
 | |
|         Return 0
 | |
|         
 | |
|     end
 | |
| 	
 | |
| RETURN
 | |
| 	
 | |
| 
 | |
| * * * * * * *
 | |
| AddSRP:
 | |
| * * * * * * *
 | |
| 
 | |
| RDSNo = Get_Property(@WINDOW:'.RDS_NO','DEFPROP')
 | |
| SRPPaths = Get_Property(@WINDOW:'.SRP_BITMAPS','ARRAY')<1>
 | |
| 
 | |
| thisSRPPaths = SRPPaths
 | |
| 
 | |
| FirstMTLine = 1
 | |
| LOOP
 | |
| 	thisSRPPath = thisSRPPaths[1,@VM]
 | |
| UNTIL thisSRPPath = ''
 | |
| 	FirstMTLine += 1
 | |
| 	thisSRPPaths[1,COL2()] = ''
 | |
| REPEAT
 | |
| 
 | |
| * Display the Windows Choosefile Dialog with the default filename loaded.
 | |
| 
 | |
| * SRPDirectory = 'N:\Engineering\CommonRW\SRPScans\'
 | |
| SRPDirectory = Environment_Services('GetUserDataRootPath') : '\Engineering\CommonRW\SRPScans\'
 | |
| 
 | |
| CFOpt = ''
 | |
| CFOpt<1> = ''
 | |
| CFOpt<2> = 'Bitmaps (*.bmp)/*.bmp/'
 | |
| CFOpt<3> = 1
 | |
| CFOpt<4> = RDSNo:'.bmp'
 | |
| CFOpt<6> = SRPDirectory
 | |
| 
 | |
| FullPath = Utility('CHOOSEFILE',@WINDOW,CFOpt)
 | |
| 
 | |
| IF FullPath = '' THEN RETURN
 | |
| 
 | |
| LOCATE FullPath IN SRPPaths USING @VM SETTING Pos THEN
 | |
| 	ErrMsg('Bitmap is already attached.')
 | |
| 	
 | |
| END ELSE
 | |
| 	Send_Message(@WINDOW:'.SRP_BITMAPS','INSERT',1,FullPath)
 | |
| END
 | |
| 
 | |
| RETURN
 | |
| 
 | |
| 
 | |
| * * * * * * *
 | |
| ViewSRP:
 | |
| * * * * * * *
 | |
| 
 | |
| CtrlEntID = @WINDOW:'.SRP_BITMAPS'
 | |
| 
 | |
| CurrPos = Get_Property(CtrlEntID,'SELPOS')
 | |
| CurrRow = CurrPos<2>
 | |
| 
 | |
| AllPaths = Get_Property(CtrlEntID,'DEFPROP')<1>
 | |
| 
 | |
| FullPath = AllPaths<1,CurrRow>
 | |
| 
 | |
| IF FullPath NE '' THEN
 | |
| 	Void = Start_Window('RDS_SRP',@WINDOW,FullPath,'','')
 | |
| END
 | |
| 
 | |
| RETURN
 | |
| 
 | |
| 
 | |
| * * * * * * *
 | |
| RemoveSRP:
 | |
| * * * * * * * 
 | |
| 
 | |
| CtrlEntID = @WINDOW:'.SRP_BITMAPS'
 | |
| 
 | |
| DeletedRowIndex = Parm1
 | |
| DeletedRowText = Parm2
 | |
| 
 | |
| Result = Msg(@WINDOW,'','REMOVE_SRP_POINTER')
 | |
| 
 | |
| IF Result = 0 THEN
 | |
| 	Send_Message(CtrlEntID, "INSERT",DeletedRowIndex, DeletedRowText)	;* Put it back in the list
 | |
| END
 | |
| 
 | |
| RETURN
 | |
| 
 | |
| 
 | |
| * * * * * * *
 | |
| InsertSRP:
 | |
| * * * * * * *
 | |
| 
 | |
| RowIndex = Parm1
 | |
| 
 | |
| CurrCtrl = Get_Property(@WINDOW,'FOCUS')
 | |
| 
 | |
| Dummy = Send_Message(CurrCtrl, "DELETE", RowIndex)
 | |
| 
 | |
| ErrMsg('Rows may not be inserted.')
 | |
| 
 | |
| RETURN
 | |
| 
 | |
| 
 | |
| * * * * * * *
 | |
| ThickDC:
 | |
| * * * * * * *
 | |
| 
 | |
| ReactorType 	= Get_Property(@WINDOW:'.REACTOR_TYPE_IN','TEXT')
 | |
| PSNo			= Get_Property(@WINDOW:'.PS_NO','DEFPROP')
 | |
| ThickFilmMet	= Get_Property(@WINDOW:'.THICKFILM_MET','CHECK')
 | |
| 
 | |
| IF ReactorType = 'EPP' OR ReactorType = 'P' OR ThickFilmMet = 1 THEN
 | |
| 
 | |
| 	RDSNo	= Get_Property(@WINDOW:'.RDS_NO','TEXT')
 | |
| 	LSID	= Get_Property(@WINDOW:'.LS_ID','TEXT')
 | |
| 	
 | |
| 	LSKeys	= XLATE('RDS',RDSNo,RDS_RDS_LAYER_KEYS$,'X')
 | |
| 	
 | |
| 	LastLSID = LSKeys[-1,'B*']
 | |
| 	
 | |
| 	IF LSID NE LastLSID THEN
 | |
| 		ErrMsg('EpiPRO results may only be entered on the LAST layer set.')
 | |
| 		RETURN
 | |
| 	END
 | |
| 	
 | |
| 	Ctrls  = @WINDOW:'.MET_NO':@RM		; Props  = 'TEXT':@RM
 | |
| 	Ctrls := @WINDOW:'.ZONE'			; Props := 'TEXT'
 | |
| 	
 | |
| 	Vals = Get_Property(Ctrls,Props)
 | |
| 
 | |
| 	MetNo	= Vals[1,@RM]
 | |
| 	Zone	= Vals[COL2()+1,@RM]
 | |
| 	
 | |
| 	IF MetNo = '' THEN RETURN
 | |
| 	IF Zone = '' AND NOT(ThickFilmMet) THEN										;* Added check for ThickFilmMet 1/15/2009 JCH, J.C. Henry & Co., Inc.
 | |
| 		ErrMsg('Zone must be filled in before entering metrology data.')
 | |
| 		Set_Property(@WINDOW:'.ZONE','FOCUS',1)
 | |
| 		RETURN
 | |
| 	END
 | |
| 	
 | |
| 	Set_Property(@WINDOW,'@DONT_CLOSE_ON_WRITE',1)				;* Sets a flag to keep the RDS_TEST window from closing on the WRITE event
 | |
| 	Send_Event(@WINDOW,'WRITE')
 | |
| 	dummy = Create_Dialog('DIALOG_EPI_PRO_MET',@WINDOW,0,MetNo)
 | |
| 	
 | |
| 	
 | |
| END
 | |
| 
 | |
| RETURN
 | |
| 
 | |
| 
 | |
| * * * * * * *
 | |
| SendSPC:
 | |
| * * * * * * *
 | |
| 
 | |
| // Temporarily disable the "Send SPC" button to avoid duplicate requests from being generated.
 | |
| Set_Property(@Window : '.SEND_SPC', 'ENABLED', False$)
 | |
| Send_Event(@WINDOW:'.GROWTH_RATE','CALCULATE')
 | |
| 
 | |
| Ctrls  = @WINDOW:'.PS_NO':@RM				; Props  = 'DEFPROP':@RM
 | |
| Ctrls := @WINDOW:'.RDS_NO':@RM				; Props := 'DEFPROP':@RM
 | |
| Ctrls := @WINDOW:'.LS_ID':@RM				; Props := 'DEFPROP':@RM
 | |
| Ctrls := @WINDOW:'.REACTOR':@RM				; Props := 'DEFPROP':@RM
 | |
| Ctrls := @WINDOW:'.ZONE':@RM				; Props := 'DEFPROP':@RM
 | |
| Ctrls := @WINDOW:'.THICK_AVG':@RM			; Props := 'DEFPROP':@RM
 | |
| Ctrls := @WINDOW:'.THICK_STDV':@RM			; Props := 'DEFPROP':@RM
 | |
| Ctrls := @WINDOW:'.SHEETRHO_AVG':@RM		; Props := 'DEFPROP':@RM
 | |
| Ctrls := @WINDOW:'.SHEETRHO_STDV':@RM		; Props := 'DEFPROP':@RM
 | |
| Ctrls := @WINDOW:'.RES_AVG':@RM				; Props := 'DEFPROP':@RM
 | |
| Ctrls := @WINDOW:'.RES_STDV':@RM			; Props := 'DEFPROP':@RM
 | |
| Ctrls := @WINDOW:'.HGCV1_RES_AVG':@RM		; Props := 'DEFPROP':@RM
 | |
| Ctrls := @WINDOW:'.HGCV1_RES_STDV':@RM		; Props := 'DEFPROP':@RM
 | |
| Ctrls := @WINDOW:'.GROWTH_RATE':@RM			; Props := 'DEFPROP':@RM
 | |
| 
 | |
| Ctrls := @WINDOW:'.THICK_RANGE':@RM				; Props := 'DEFPROP':@RM
 | |
| Ctrls := @WINDOW:'.THICK_RANGE_PCNT':@RM		; Props := 'DEFPROP':@RM
 | |
| Ctrls := @WINDOW:'.SHEETRHO_RANGE':@RM			; Props := 'DEFPROP':@RM
 | |
| Ctrls := @WINDOW:'.SHEETRHO_RANGE_PCNT':@RM		; Props := 'DEFPROP':@RM
 | |
| Ctrls := @WINDOW:'.RES_RANGE':@RM				; Props := 'DEFPROP':@RM
 | |
| Ctrls := @WINDOW:'.RES_RANGE_PCNT':@RM			; Props := 'DEFPROP':@RM
 | |
| Ctrls := @WINDOW:'.HGCV1_RES_RANGE':@RM			; Props := 'DEFPROP':@RM
 | |
| Ctrls := @WINDOW:'.HGCV1_RES_RANGE_PCNT':@RM	; Props := 'DEFPROP':@RM
 | |
| 
 | |
| Vals = Get_Property(Ctrls,Props)
 | |
| 
 | |
| PSNo			= Vals[1,@RM]
 | |
| RDSNo			= Vals[COL2()+1,@RM]
 | |
| LSId			= Vals[COL2()+1,@RM]
 | |
| Reactor			= Vals[COL2()+1,@RM]
 | |
| Zone			= Vals[COL2()+1,@RM]
 | |
| ThickAvg		= Vals[COL2()+1,@RM]
 | |
| ThickStdv		= Vals[COL2()+1,@RM]
 | |
| SheetRhoAvg		= Vals[COL2()+1,@RM]
 | |
| SheetRhoStdv	= Vals[COL2()+1,@RM]
 | |
| ResAvg			= Vals[COL2()+1,@RM]
 | |
| ResStdv			= Vals[COL2()+1,@RM]
 | |
| HgcvAvg			= Vals[COL2()+1,@RM]
 | |
| HgCvStdv		= Vals[COL2()+1,@RM]
 | |
| GrowthRate		= Vals[COL2()+1,@RM]
 | |
| 
 | |
| ThickRange			= Vals[COL2()+1,@RM]
 | |
| ThickRangePcnt		= Vals[COL2()+1,@RM]
 | |
| SheetRhoRange		= Vals[COL2()+1,@RM]
 | |
| SheetRhoRangePcnt	= Vals[COL2()+1,@RM]
 | |
| ResRange			= Vals[COL2()+1,@RM]
 | |
| ResRangePcnt		= Vals[COL2()+1,@RM]
 | |
| Hgcv1ResRange		= Vals[COL2()+1,@RM]
 | |
| Hgcv1ResRangePcnt	= Vals[COL2()+1,@RM]
 | |
| 
 | |
| ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 | |
| 
 | |
| IOOptions = Get_Property(@Window, 'IOOPTIONS')
 | |
| IOOptions<6> = True$
 | |
| Set_Property(@Window, 'IOOPTIONS', IOOptions)
 | |
| Set_Property(@WINDOW, '@DONT_CLOSE_ON_WRITE', True$)
 | |
| Savewarn = Get_Property(@Window, 'SAVEWARN')
 | |
| If Savewarn EQ True$ then
 | |
|     // User has entered in new data so save before posting SPC request.  
 | |
|     Set_Status(0)
 | |
|     Send_Event(@Window, 'WRITE')
 | |
|     If Get_Status(StatusCode) then
 | |
|         ErrMsg('Error saving metrology record. Could not send metrology data to SPC.')
 | |
|         Set_Property(@Window : '.SEND_SPC', 'ENABLED', True$)
 | |
|         return
 | |
|     end
 | |
| end
 | |
| 
 | |
| LayerRec = XLATE('RDS_LAYER',RDSNo:'*':LSId,'','X')
 | |
| DictInfo = XLATE('DICT.RDS_LAYER','%FIELDS%','','X')
 | |
| 
 | |
| GoodData = True$
 | |
| IF LayerRec<RDS_LAYER_EPI_TIME$>	= '' THEN GoodData = False$
 | |
| IF LayerRec<RDS_LAYER_DOPANT_FLOW$>	= '' THEN GoodData = False$
 | |
| 
 | |
| IF NOT(GoodData) THEN
 | |
|     ErrMsg('Incomplete Reactor Parameters (RDS Layer) record.')
 | |
|     Set_Property(@Window : '.SEND_SPC', 'ENABLED', True$)
 | |
|     RETURN
 | |
| END 
 | |
| 
 | |
| IF Reactor EQ '' THEN 
 | |
|     ErrMsg('':@VM:'Process Error':@SVM:'Reactor No. is required on RDS prior to recording test results.')
 | |
|     Set_Property(@Window : '.SEND_SPC', 'ENABLED', True$)
 | |
|     RETURN
 | |
| End
 | |
| 
 | |
| KeyID = Get_Property(@Window : '.MET_NO', 'TEXT')
 | |
| 
 | |
| If KeyID NE '' then
 | |
|     SPC_Services('PostToQueue', 'RDS_TEST', KeyID)
 | |
|     If Error_Services('NoError') else
 | |
|         ErrMsg('Error posting Metrology data to SPC queue. Error message: ':Error_Services('GetMessage'))
 | |
|         Set_Property(@Window : '.SEND_SPC', 'ENABLED', True$)
 | |
|         return
 | |
|     end
 | |
| end else
 | |
|     ErrMsg('Process Error':@SVM:'Met. No. is required prior to recording test results.')
 | |
|     Set_Property(@Window : '.SEND_SPC', 'ENABLED', True$)
 | |
|     return
 | |
| end
 | |
| 
 | |
| CurrDTM = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTHS')
 | |
| Set_Property(@Window : '.SPC_DTM', 'DEFPROP', CurrDTM)
 | |
| // Save new sent to SPC datetime.
 | |
| Send_Event(@Window, 'WRITE')
 | |
| // Revert IOOptions to previous setting.
 | |
| IOOptions    = Get_Property(@Window, 'IOOPTIONS')
 | |
| IOOptions<6> = False$
 | |
| Set_Property(@Window, 'IOOPTIONS', IOOptions)
 | |
| // Request posted -> reenable the "Send SPC" button.
 | |
| Set_Property(@Window : '.SEND_SPC', 'ENABLED', True$)
 | |
| 
 | |
| return 
 | |
| ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 | |
| 
 | |
| 
 | |
| CONVERT '%' TO '' IN ThickRangePcnt
 | |
| CONVERT '%' TO '' IN SheetRhoRangePcnt
 | |
| CONVERT '%' TO '' IN ResRangePcnt
 | |
| CONVERT '%' TO '' IN Hgcv1ResRangePcnt
 | |
| 
 | |
| 
 | |
| IF NUM(LSId) THEN
 | |
| 	DepositTime = ''
 | |
| 	DopantFlow = ''
 | |
| 	EpiH2Flow = ''
 | |
| 	FOffset = ''
 | |
| 	ROffset= ''
 | |
| 	SOffset = ''
 | |
| 	TcsFlow = ''
 | |
| END ELSE
 | |
| 
 | |
| 	LayerRec = XLATE('RDS_LAYER',RDSNo:'*':LSId,'','X')
 | |
| 	DictInfo = XLATE('DICT.RDS_LAYER','%FIELDS%','','X')
 | |
| 
 | |
| 	GoodData = 1
 | |
| 	IF LayerRec<RDS_LAYER_EPI_TIME$>	= '' THEN GoodData = 0
 | |
| 	IF LayerRec<RDS_LAYER_DOPANT_FLOW$>	= '' THEN GoodData = 0
 | |
| 	
 | |
| 	IF NOT(GoodData) THEN
 | |
| 		ErrMsg('Incomplete Reactor Parameters (RDS Layer) record.')
 | |
| 		RETURN
 | |
| 	END 
 | |
| 
 | |
| 	IF Get_Property(@WINDOW:'.REACTOR','DEFPROP') = '' THEN 
 | |
| 		ErrMsg('':@VM:'Process Error':@SVM:'Reactor No. is required on RDS prior to recording test results.')
 | |
| 		RETURN
 | |
| 	End
 | |
| 	
 | |
| 
 | |
| 	LOCATE RDS_LAYER_EPI_TIME$ IN DictInfo<FIELDS_FIELD_NO$> SETTING Pos THEN
 | |
| 		DepositTime	= OCONV(LayerRec<RDS_LAYER_EPI_TIME$>,DictInfo<FIELDS_CONV$,Pos>)
 | |
| 	END ELSE
 | |
| 		DepositTime	= LayerRec<RDS_LAYER_EPI_TIME$>
 | |
| 	END
 | |
| 
 | |
| 	LOCATE RDS_LAYER_DOPANT_FLOW$ IN DictInfo<FIELDS_FIELD_NO$> SETTING Pos THEN
 | |
| 		DopantFlow	= OCONV(LayerRec<RDS_LAYER_DOPANT_FLOW$>,DictInfo<FIELDS_CONV$,Pos>)
 | |
| 	END ELSE
 | |
| 		DopantFlow	= LayerRec<RDS_LAYER_DOPANT_FLOW$>
 | |
| 	END
 | |
| 
 | |
| 	LOCATE RDS_LAYER_EPI_H2_FLOW$ IN DictInfo<FIELDS_FIELD_NO$> SETTING Pos THEN
 | |
| 		EpiH2Flow	= OCONV(LayerRec<RDS_LAYER_EPI_H2_FLOW$>,DictInfo<FIELDS_CONV$,Pos>)
 | |
| 	END ELSE
 | |
| 		EpiH2Flow	= LayerRec<RDS_LAYER_EPI_H2_FLOW$>
 | |
| 	END
 | |
| 
 | |
| 	LOCATE RDS_LAYER_F_OFFSET$ IN DictInfo<FIELDS_FIELD_NO$> SETTING Pos THEN
 | |
| 		FOffset		=  OCONV(LayerRec<RDS_LAYER_F_OFFSET$>,DictInfo<FIELDS_CONV$,Pos>)
 | |
| 	END ELSE
 | |
| 		FOffset		= LayerRec<RDS_LAYER_F_OFFSET$>
 | |
| 	END
 | |
| 
 | |
| 	LOCATE RDS_LAYER_R_OFFSET$ IN DictInfo<FIELDS_FIELD_NO$> SETTING Pos THEN
 | |
| 		ROffset		=  OCONV(LayerRec<RDS_LAYER_R_OFFSET$>,DictInfo<FIELDS_CONV$,Pos>)
 | |
| 	END ELSE
 | |
| 		ROffset		= LayerRec<RDS_LAYER_R_OFFSET$>
 | |
| 	END
 | |
| 
 | |
| 	LOCATE RDS_LAYER_S_OFFSET$ IN DictInfo<FIELDS_FIELD_NO$> SETTING Pos THEN
 | |
| 		SOffset		=  OCONV(LayerRec<RDS_LAYER_S_OFFSET$>,DictInfo<FIELDS_CONV$,Pos>)
 | |
| 	END ELSE
 | |
| 		SOffset		= LayerRec<RDS_LAYER_S_OFFSET$>
 | |
| 	END
 | |
| 
 | |
| 	LOCATE RDS_LAYER_TCS_FLOW$ IN DictInfo<FIELDS_FIELD_NO$> SETTING Pos THEN
 | |
| 		TcsFlow		=  OCONV(LayerRec<RDS_LAYER_TCS_FLOW$>,DictInfo<FIELDS_CONV$,Pos>)
 | |
| 	END ELSE
 | |
| 		TcsFlow		= LayerRec<RDS_LAYER_TCS_FLOW$>
 | |
| 	END
 | |
| END	;* End of check for Numeric Layer Set ID
 | |
| 
 | |
| 
 | |
| UserName = OCONV(@USER4,'[XLATE_CONV,LSL_USERS*FIRST_LAST]')
 | |
| 
 | |
| DataLine  = QUOTE(PSNo):TAB$
 | |
| DataLine := QUOTE(RDSNo):TAB$
 | |
| DataLine := QUOTE(LSId):TAB$
 | |
| DataLine := QUOTE(Reactor):TAB$
 | |
| DataLine := QUOTE(Zone):TAB$
 | |
| DataLine := QUOTE(ThickAvg):TAB$
 | |
| DataLine := QUOTE(ThickStdv):TAB$
 | |
| DataLine := QUOTE(SheetRhoAvg):TAB$
 | |
| DataLine := QUOTE(SheetRhoStdv):TAB$
 | |
| DataLine := QUOTE(ResAvg):TAB$
 | |
| DataLine := QUOTE(ResStdv):TAB$
 | |
| DataLine := QUOTE(HgcvAvg):TAB$
 | |
| DataLine := QUOTE(HgcvStdv):TAB$
 | |
| DataLine := QUOTE(GrowthRate):TAB$
 | |
| DataLine := QUOTE(DepositTime):TAB$
 | |
| DataLine := QUOTE(DopantFlow):TAB$
 | |
| DataLine := QUOTE(EpiH2Flow):TAB$
 | |
| DataLine := QUOTE(FOffset):TAB$
 | |
| DataLine := QUOTE(ROffset):TAB$
 | |
| DataLine := QUOTE(SOffset):TAB$
 | |
| DataLine := QUOTE(TcsFlow):TAB$
 | |
| DataLine := QUOTE(UserName):TAB$
 | |
| DataLine := QUOTE(ThickRange):TAB$
 | |
| DataLine := QUOTE(ThickRangePcnt):TAB$
 | |
| DataLine := QUOTE(SheetRhoRange):TAB$
 | |
| DataLine := QUOTE(SheetRhoRangePcnt):TAB$
 | |
| DataLine := QUOTE(ResRange):TAB$
 | |
| DataLine := QUOTE(ResRangePcnt):TAB$
 | |
| DataLine := QUOTE(Hgcv1ResRange):TAB$
 | |
| DataLine := QUOTE(Hgcv1ResRangePcnt):TAB$
 | |
| 
 | |
| * DOSFile = 'N:\IT\CommonRW\OI_SPC_Data_Transfer\SPC_Data.TXT'
 | |
| * DOSFile = Environment_Services('GetUserDataProductionPath') : '\CommonRW\OI_SPC_Data_Transfer\SPC_Data.TXT'
 | |
| DOSFile = Environment_Services('GetSPCDataPath') : '\SPC_Data.txt'
 | |
| 
 | |
| * * * * * * *
 | |
| DosRead:
 | |
| * * * * * * *
 | |
| 
 | |
| Set_Status(0)
 | |
| 
 | |
| OSRead DOSRecord FROM DOSFile ELSE
 | |
|     ErrCode = Status()
 | |
|     IF ErrCode = 4 THEN
 | |
|         DOSRecord = ''	;* File doesn't exist
 | |
|     END ELSE
 | |
|         ErrMsg('Unable to read DOS file "SPC_Data.TXT" for update. ':ErrCode:' Please try again.')
 | |
|         RETURN
 | |
|     END
 | |
| END
 | |
|  
 | |
| DOSRecord := DataLine:CRLF$
 | |
| 
 | |
| OSWrite DOSRecord ON DOSFile
 | |
| CurrDTM = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTHS')
 | |
| 
 | |
| Set_Property(@WINDOW:'.SPC_DTM','DEFPROP',CurrDTM)
 | |
| 
 | |
| RETURN
 | |
| 
 |