open-insight/LSL2/STPROC/COMM_RDS_TEST.txt

2344 lines
72 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 'ê/Ü'
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
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
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)
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
Send_Event(@WINDOW:'.RES_READINGS','CALCULATE')
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:
* * * * * * *
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( 'QUOTE_SIG_PWD_ENTRY', @WINDOW, @USER4:@VM:XLATE( 'LSL_USERS', @USER4, LSL_USERS_PASSWORD$, 'X' ) )
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