Refined event logic to prevent multiple error messages from being displayed. Imlemented GetStackTrace service in Error_Services so that the stack contents can be logged with the RDS Layer error log.

This commit is contained in:
Infineon\StieberD 2025-03-21 13:54:43 -07:00 committed by Stieber Daniel (CSC FI SPS MESLEO)
parent 651b7ab420
commit f930fd3efe
6 changed files with 543 additions and 1079 deletions

View File

@ -49,56 +49,54 @@ 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 = 'Page' ; GOSUB Page
CASE Instruction = 'RParmsDeleteRow' ; GOSUB RParmsDeleteRow
CASE Instruction = 'RParmsInsertRow' ; GOSUB RParmsInsertRow
CASE Instruction = 'RParmsPC' ; GOSUB RParmsPC
CASE Instruction = 'NewTest' ; GOSUB NewTest
CASE Instruction = 'TestKeyDC' ; GOSUB TestKeyDC
CASE Instruction = 'OverRideRecipeLimits' ; GOSUB OverRideRecipeLimits
CASE Instruction = 'OverRideDC' ; GOSUB OverRideDC
CASE Instruction = 'OverRidePC' ; GOSUB OverRidePC
CASE Instruction = 'UpdateLimits' ; GOSUB UpdateLimits
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 = 'Page' ; GOSUB Page
CASE Instruction = 'RParmsDeleteRow' ; GOSUB RParmsDeleteRow
CASE Instruction = 'RParmsInsertRow' ; GOSUB RParmsInsertRow
CASE Instruction = 'RParmsPC' ; GOSUB RParmsPC
CASE Instruction = 'NewTest' ; GOSUB NewTest
CASE Instruction = 'TestKeyDC' ; GOSUB TestKeyDC
CASE Instruction = 'OverRideRecipeLimits' ; GOSUB OverRideRecipeLimits
CASE Instruction = 'OverRideDC' ; GOSUB OverRideDC
CASE Instruction = 'OverRidePC' ; GOSUB OverRidePC
CASE Instruction = 'UpdateLimits' ; GOSUB UpdateLimits
CASE 1
ErrorMsg = 'Unknown Instruction passed to routine.'
ErrMsg(ErrorMsg)
CASE 1
ErrorMsg = 'Unknown Instruction passed to routine.'
ErrMsg(ErrorMsg)
END CASE
RETURN Result
* * * * * * *
Create:
* * * * * * *
obj_Appwindow('Create',@WINDOW)
obj_Appwindow('Create',@WINDOW)
IF Parm1 NE '' THEN
obj_AppWindow('LoadFormKeys',@WINDOW:@RM:Parm1)
END
GOSUB Refresh
IF Parm1 NE '' THEN
obj_AppWindow('LoadFormKeys',@WINDOW:@RM:Parm1)
END
GOSUB Refresh
RETURN
* * * * * * *
Clear:
* * * * * * *
Send_Event(@WINDOW,'PAGE',1)
Send_Event(@WINDOW,'PAGE',1)
GOSUB Refresh
GOSUB Refresh
RETURN
@ -107,15 +105,15 @@ RETURN
Page:
* * * * * * *
Page = Parm1
Page = Parm1
IF Page = '' THEN
Page = Get_Property(@WINDOW:'.TAB_MAIN','VALUE')
END ELSE
Set_Property(@WINDOW:'.TAB_MAIN','VALUE',Page)
END
IF Page = '' THEN
Page = Get_Property(@WINDOW:'.TAB_MAIN','VALUE')
END ELSE
Set_Property(@WINDOW:'.TAB_MAIN','VALUE',Page)
END
Set_Property(@WINDOW,'VPOSITION', Page)
Set_Property(@WINDOW,'VPOSITION', Page)
RETURN
@ -124,164 +122,162 @@ RETURN
Read:
* * * * * * *
CurrRecord = Get_Property(@WINDOW,'RECORD')
Set_Property(@WINDOW,'@ORG_RECORD',CurrRecord)
CurrRecord = Get_Property(@WINDOW,'RECORD')
Set_Property(@WINDOW,'@ORG_RECORD',CurrRecord)
* * * * * * *
* * * * * * *
Refresh:
* * * * * * *
LSId = Get_Property(@WINDOW:'.LS_ID','TEXT')
LSId = Get_Property(@WINDOW:'.LS_ID','TEXT')
BEGIN CASE
CASE LSId = 'L1'
Set_Property(@WINDOW:'.LS_ID','BACKCOLOR',RCV_BLUE$)
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 = 'L2'
Set_Property(@WINDOW:'.LS_ID','BACKCOLOR',PRE_BLUE$)
CASE LSId = '2'
Set_Property(@WINDOW:'.LS_ID','BACKCOLOR',INP_BLUE$)
CASE LSId = '2'
Set_Property(@WINDOW:'.LS_ID','BACKCOLOR',INP_BLUE$)
CASE 1
Set_Property(@WINDOW:'.LS_ID','BACKCOLOR',KEY_YELLOW$)
CASE 1
Set_Property(@WINDOW:'.LS_ID','BACKCOLOR',KEY_YELLOW$)
END CASE
END CASE
Set_Property(@WINDOW:'.OVERRIDE_LIMITS_GROUP','ENABLED',0)
Set_Property(@WINDOW:'.OVERRIDE_LIMITS_GROUP','ENABLED',0)
RDSNo = Get_Property( @WINDOW:'.RDS_NO', 'DEFPROP' )
RDSRec = XLATE('RDS',RDSNo,'','X')
RDSNo = Get_Property( @WINDOW:'.RDS_NO', 'DEFPROP' )
RDSRec = XLATE('RDS',RDSNo,'','X')
LayerSetID = Get_Property(@WINDOW:'.LS_ID','DEFPROP')
LayerSetID = Get_Property(@WINDOW:'.LS_ID','DEFPROP')
PSNId = RDSRec< RDS_PROD_SPEC_ID$ >
RecipeNo = Get_Property(@WINDOW:'.RECIPE_NO','DEFPROP')
PSNId = RDSRec< RDS_PROD_SPEC_ID$ >
RecipeNo = Get_Property(@WINDOW:'.RECIPE_NO','DEFPROP')
RecipeParms = Get_Property(@WINDOW:'.RECIPE_PARMS','ARRAY') ;* Entered by user
RecipeLimits = Get_Property(@WINDOW:'.RECIPE_LIMITS','LIST')<1>
RecipeParms = Get_Property(@WINDOW:'.RECIPE_PARMS','ARRAY') ;* Entered by user
RecipeLimits = Get_Property(@WINDOW:'.RECIPE_LIMITS','LIST')<1>
CONVERT @VM TO @FM IN RecipeLimits
CONVERT @VM TO @FM IN RecipeLimits
ColCnt = COUNT(RecipeLimits,@FM) + (RecipeLimits NE '') ;* This is 16 columns as of the development of this window
ColCnt = COUNT(RecipeLimits,@FM) + (RecipeLimits NE '') ;* This is 16 columns as of the development of this window
RecipeParms = Get_Property(@WINDOW:'.RECIPE_PARMS','ARRAY')
RecipeParms = Get_Property(@WINDOW:'.RECIPE_PARMS','ARRAY')
ParameterStyles = Send_Message( @WINDOW:'.RECIPE_PARMS', "COLSTYLE", 0, '' )
LimitStyles = Send_Message( @WINDOW:'.RECIPE_LIMITS', "COLSTYLE", 0, '' )
ParameterStyles = Send_Message( @WINDOW:'.RECIPE_PARMS', "COLSTYLE", 0, '' )
LimitStyles = Send_Message( @WINDOW:'.RECIPE_LIMITS', "COLSTYLE", 0, '' )
CONVERT @VM TO '' IN RecipeParms
CONVERT @VM TO '' IN RecipeParms
ColNames = Get_Property( @WINDOW:'.RECIPE_PARMS', 'COLUMN' )
ColNames = Get_Property( @WINDOW:'.RECIPE_PARMS', 'COLUMN' )
OutOfSpecCols = ''
FOR Col = 1 TO ColCnt
IF RecipeLimits<Col> = '' AND RecipeParms<Col> = '' THEN
ParameterStyles<Col> = BitOr( ParameterStyles<Col>, HIDDEN$ ) ;* Column not used -> Hide
LimitStyles<Col> = BitOr( LimitStyles<Col>, HIDDEN$ )
END ELSE
ParameterStyles<Col> = BitAnd( ParameterStyles<Col>, BitNot(HIDDEN$) ) ;* Column used -> Show
LimitStyles<Col> = BitAnd( LimitStyles<Col>, BitNot(HIDDEN$) )
OutOfSpecCols = ''
FOR Col = 1 TO ColCnt
IF RecipeLimits<Col> = '' AND RecipeParms<Col> = '' THEN
ParameterStyles<Col> = BitOr( ParameterStyles<Col>, HIDDEN$ ) ;* Column not used -> Hide
LimitStyles<Col> = BitOr( LimitStyles<Col>, HIDDEN$ )
END ELSE
ParameterStyles<Col> = BitAnd( ParameterStyles<Col>, BitNot(HIDDEN$) ) ;* Column used -> Show
LimitStyles<Col> = BitAnd( LimitStyles<Col>, BitNot(HIDDEN$) )
LimitData = RecipeLimits<Col>
ParamData = RecipeParms<Col>
LimitData = RecipeLimits<Col>
ParamData = RecipeParms<Col>
ColName = ColNames<1,1,Col>
Conversion = XLATE('DICT.RDS_LAYER',ColName,DICT_CONV$,'X')
ColName = ColNames<1,1,Col>
Conversion = XLATE('DICT.RDS_LAYER',ColName,DICT_CONV$,'X')
SWAP ' ~ ' WITH @VM IN LimitData
SWAP ' ~ ' WITH @VM IN LimitData
IF Conversion NE '' THEN
ParamData = ICONV(ParamData,Conversion)
LimitData = ICONV(LimitData,Conversion)
END
IF Conversion NE '' THEN
ParamData = ICONV(ParamData,Conversion)
LimitData = ICONV(LimitData,Conversion)
END
Minimum = LimitData<1,1>
Maximum = LimitData<1,2>
Minimum = LimitData<1,1>
Maximum = LimitData<1,2>
IF ParamData NE '' THEN
IF ParamData < Minimum OR ParamData > Maximum THEN
Send_Message(@WINDOW:'.RECIPE_PARMS','COLOR_BY_POS',Col,1,RED$)
OutOfSpecCols = INSERT(OutOfSpecCols,Col,0,0,1)
END ELSE
Send_Message(@WINDOW:'.RECIPE_PARMS','COLOR_BY_POS',Col,1,WHITE$)
END
END ELSE
Send_Message(@WINDOW:'.RECIPE_PARMS','COLOR_BY_POS',Col,1,WHITE$)
END
IF ParamData NE '' THEN
IF ParamData < Minimum OR ParamData > Maximum THEN
Send_Message(@WINDOW:'.RECIPE_PARMS','COLOR_BY_POS',Col,1,RED$)
OutOfSpecCols = INSERT(OutOfSpecCols,Col,0,0,1)
END ELSE
Send_Message(@WINDOW:'.RECIPE_PARMS','COLOR_BY_POS',Col,1,WHITE$)
END
END ELSE
Send_Message(@WINDOW:'.RECIPE_PARMS','COLOR_BY_POS',Col,1,WHITE$)
END
END
END
NEXT Col
NEXT Col
LOCATE '1' IN OutOfSpecCols USING @FM SETTING Pos THEN
Set_Property(@WINDOW:'.OUT_OF_SPEC','CHECK',1)
END ELSE
Set_Property(@WINDOW:'.OUT_OF_SPEC','CHECK',0)
END
LOCATE '1' IN OutOfSpecCols USING @FM SETTING Pos THEN
Set_Property(@WINDOW:'.OUT_OF_SPEC','CHECK',1)
END ELSE
Set_Property(@WINDOW:'.OUT_OF_SPEC','CHECK',0)
END
Parameter_Styles = Send_Message( @WINDOW:'.RECIPE_PARMS', "COLSTYLE", 0, ParameterStyles )
LimitStyles = Send_Message( @WINDOW:'.RECIPE_LIMITS', "COLSTYLE", 0, LimitStyles )
Parameter_Styles = Send_Message( @WINDOW:'.RECIPE_PARMS', "COLSTYLE", 0, ParameterStyles )
LimitStyles = Send_Message( @WINDOW:'.RECIPE_LIMITS', "COLSTYLE", 0, LimitStyles )
Set_Property( @WINDOW:'.RECIPE_INFO', "AUTOSIZECOL", 16 )
Set_Property( @WINDOW:'.RECIPE_LIMITS', "AUTOSIZECOL", 16 )
Set_Property( @WINDOW:'.RECIPE_INFO', "AUTOSIZECOL", 16 )
Set_Property( @WINDOW:'.RECIPE_LIMITS', "AUTOSIZECOL", 16 )
* 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>
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
NEXT I
TestList = Get_Property(@WINDOW:'.RDS_TEST_KEYS','LIST')
* QBF buttons
FOR I = 1 TO COUNT(TestList,@FM) + (TestList NE '')
IF ICONV(TestList<I,COL$OUT_OF_SPEC>,'B') = 1 THEN
Send_Message(@WINDOW:'.RDS_TEST_KEYS','COLOR_BY_POS',0,I,RED$)
END ELSE
Send_Message(@WINDOW:'.RDS_TEST_KEYS','COLOR_BY_POS',0,I,WHITE$)
END
NEXT I
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>
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
NEXT I
TestList = Get_Property(@WINDOW:'.RDS_TEST_KEYS','LIST')
FOR I = 1 TO COUNT(TestList,@FM) + (TestList NE '')
IF ICONV(TestList<I,COL$OUT_OF_SPEC>,'B') = 1 THEN
Send_Message(@WINDOW:'.RDS_TEST_KEYS','COLOR_BY_POS',0,I,RED$)
END ELSE
Send_Message(@WINDOW:'.RDS_TEST_KEYS','COLOR_BY_POS',0,I,WHITE$)
END
NEXT I
RPCopy = RecipeParms
Convert @FM to '' in RPCopy
If RPCopy EQ '' then
Set_Property(@Window : '.BTN_SET_CURR_RUN_PARMS', 'ENABLED', False$)
end else
Set_Property(@Window : '.BTN_SET_CURR_RUN_PARMS', 'ENABLED', True$)
end
RPCopy = RecipeParms
Convert @FM to '' in RPCopy
If RPCopy EQ '' then
Set_Property(@Window : '.BTN_SET_CURR_RUN_PARMS', 'ENABLED', False$)
end else
Set_Property(@Window : '.BTN_SET_CURR_RUN_PARMS', 'ENABLED', True$)
end
RETURN
@ -290,34 +286,33 @@ RETURN
Write:
* * * * * * *
SkipScriptEvent = Get_Property(@Window, '@SKIPSCRIPT')
If (SkipScriptEvent EQ False$) or (SkipScriptEvent EQ '') then
RDSLayerKey = Get_Property(@WINDOW,'ID')
SkipScriptEvent = Get_Property(@Window, '@SKIPSCRIPT')
If (SkipScriptEvent EQ False$) or (SkipScriptEvent EQ '') then
RDSLayerKey = Get_Property(@WINDOW,'ID')
CurrRecord = Get_Property(@WINDOW,'RECORD')
OrgRecord = Get_Property(@WINDOW,'@ORG_RECORD')
CurrRecord = Get_Property(@WINDOW,'RECORD')
OrgRecord = Get_Property(@WINDOW,'@ORG_RECORD')
IF CurrRecord NE OrgRecord THEN
CurrDTM = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS')
NewLine = @USER4:@VM:CurrDTM
Send_Message(@WINDOW:'.MODIFY_USER','INSERT',1,NewLine)
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)
END
Post_Event(@WINDOW,'CLOSE')
end
Result = 1
Post_Event(@WINDOW,'CLOSE')
end
Result = 1
RETURN
* * * * * * *
Delete:
* * * * * * *
ErrMsg('Records may not be modified or deleted.')
ErrMsg('Records may not be modified or deleted.')
Result = 0 ;* No Deletes
Result = 0 ;* No Deletes
RETURN
@ -326,7 +321,7 @@ RETURN
Close:
* * * * * * *
obj_Appwindow('DetailReturn')
obj_Appwindow('DetailReturn')
RETURN
@ -335,16 +330,16 @@ RETURN
RParmsDeleteRow:
* * * * * * *
DeletedRowIndex = Parm1
DeletedRowText = Parm2
DeletedRowIndex = Parm1
DeletedRowText = Parm2
CurrCtrl = @WINDOW:'.RECIPE_PARMS'
CurrCtrl = @WINDOW:'.RECIPE_PARMS'
Dummy = Send_Message(CurrCtrl, "INSERT",DeletedRowIndex, DeletedRowText)
Dummy = Send_Message(CurrCtrl, "INSERT",DeletedRowIndex, DeletedRowText)
Set_Property(CurrCtrl,'SELPOS',1:@FM:1)
Set_Property(CurrCtrl,'SELPOS',1:@FM:1)
ErrMsg('Rows may not be inserted or deleted.')
ErrMsg('Rows may not be inserted or deleted.')
RETURN
@ -353,11 +348,11 @@ RETURN
RParmsInsertRow:
* * * * * * *
RowIndex = Parm1
RowIndex = Parm1
CurrCtrl = @WINDOW:'.RECIPE_PARMS'
CurrCtrl = @WINDOW:'.RECIPE_PARMS'
ErrMsg('Rows may not be inserted or deleted.')
ErrMsg('Rows may not be inserted or deleted.')
RETURN
@ -366,98 +361,97 @@ RETURN
RParmsPC:
* * * * * * *
CurrCtrl = @WINDOW:'.RECIPE_PARMS'
CurrCtrl = @WINDOW:'.RECIPE_PARMS'
PrevSelPos = Get_Property(CurrCtrl,"PREVSELPOS")
PrevCol = PrevSelPos<1>
PrevRow = PrevSelPos<2>
PrevSelPos = Get_Property(CurrCtrl,"PREVSELPOS")
PrevCol = PrevSelPos<1>
PrevRow = PrevSelPos<2>
CurrSelPos = Get_Property(CurrCtrl,"SELPOS")
CurrCol = CurrSelPos<1>
CurrRow = CurrSelPos<2>
CurrSelPos = Get_Property(CurrCtrl,"SELPOS")
CurrCol = CurrSelPos<1>
CurrRow = CurrSelPos<2>
ColStyles = Send_Message( @WINDOW:'.RECIPE_PARMS', 'COLSTYLE', 0, '' )
ColNames = Get_Property( @WINDOW:'.RECIPE_PARMS', 'COLUMN' )
ColStyles = Send_Message( @WINDOW:'.RECIPE_PARMS', 'COLSTYLE', 0, '' )
ColNames = Get_Property( @WINDOW:'.RECIPE_PARMS', 'COLUMN' )
IF CurrRow > 1 THEN
Set_Property(CurrCtrl,'SELPOS',CurrCol:@FM:1) ;* Can't move off of the first row
END
IF CurrRow > 1 THEN
Set_Property(CurrCtrl,'SELPOS',CurrCol:@FM:1) ;* Can't move off of the first row
END
ListData = Get_Property(CurrCtrl,'LIST')
ListData = Get_Property(CurrCtrl,'LIST')
IF ListData<1,PrevCol> NE '' THEN
VisibleColumn = NOT(BitAnd( ColStyles<PrevCol>, HIDDEN$ )) ;* Gives @VM list of flags for visible columns in the edit table
IF VisibleColumn THEN
LimitData = Get_Property(@WINDOW:'.RECIPE_LIMITS','LIST')<1,PrevCol>
ParamData = ListData<1,PrevCol>
IF ListData<1,PrevCol> NE '' THEN
VisibleColumn = NOT(BitAnd( ColStyles<PrevCol>, HIDDEN$ )) ;* Gives @VM list of flags for visible columns in the edit table
IF VisibleColumn THEN
LimitData = Get_Property(@WINDOW:'.RECIPE_LIMITS','LIST')<1,PrevCol>
ParamData = ListData<1,PrevCol>
ColName = ColNames<1,1,PrevCol>
Conversion = XLATE('DICT.RDS_LAYER',ColName,DICT_CONV$,'X')
ColName = ColNames<1,1,PrevCol>
Conversion = XLATE('DICT.RDS_LAYER',ColName,DICT_CONV$,'X')
CONVERT '~' TO @VM IN LimitData
CONVERT '~' TO @VM IN LimitData
IF Conversion NE '' THEN
ParamData = ICONV(ParamData,Conversion)
LimitData = ICONV(LimitData,Conversion)
END
IF Conversion NE '' THEN
ParamData = ICONV(ParamData,Conversion)
LimitData = ICONV(LimitData,Conversion)
END
Minimum = LimitData<1,1>
Maximum = LimitData<1,2>
Minimum = LimitData<1,1>
Maximum = LimitData<1,2>
IF ParamData < Minimum OR ParamData > Maximum THEN
*ErrMsg('Data Entered for ':QUOTE(ColName):' is out of specified limits!')
END
IF ParamData < Minimum OR ParamData > Maximum THEN
*ErrMsg('Data Entered for ':QUOTE(ColName):' is out of specified limits!')
END
IF ColName = 'EPI_TIME' THEN
LSId = Get_Property(@WINDOW:'.LS_ID','DEFPROP')
RDSNo = Get_Property(@WINDOW:'.RDS_NO','DEFPROP')
IF ColName = 'EPI_TIME' THEN
LSId = Get_Property(@WINDOW:'.LS_ID','DEFPROP')
RDSNo = Get_Property(@WINDOW:'.RDS_NO','DEFPROP')
ReactRunRec = XLATE('REACT_RUN',RDSNo,'','X')
ReactRunRec = XLATE('REACT_RUN',RDSNo,'','X')
WONo = ReactRunRec<REACT_RUN_WO_NO$>
WOStep = ReactRunRec<REACT_RUN_WO_STEP$>
WONo = ReactRunRec<REACT_RUN_WO_NO$>
WOStep = ReactRunRec<REACT_RUN_WO_STEP$>
PSNo = XLATE('WO_STEP',WONo:'*':WOStep,WO_STEP_PROD_SPEC_ID$,'X')
PSNo = XLATE('WO_STEP',WONo:'*':WOStep,WO_STEP_PROD_SPEC_ID$,'X')
DepTimeRatio = XLATE('PROD_SPEC',PSNo,PROD_SPEC_DEP_TIME_RATIO$,'X')
DepTimeRatio = XLATE('PROD_SPEC',PSNo,PROD_SPEC_DEP_TIME_RATIO$,'X')
IF DepTimeRatio = 1 THEN
IF LSId = 'L1' THEN
LS1DepTime = ParamData
LS2DepTime = XLATE('RDS_LAYER',RDSNo:'*L2',RDS_LAYER_EPI_TIME$,'X')
END
IF LSId = 'L2' THEN
LS1DepTime = XLATE('RDS_LAYER',RDSNo:'*L1',RDS_LAYER_EPI_TIME$,'X')
LS2DepTime = ParamData
END
IF DepTimeRatio = 1 THEN
IF LSId = 'L1' THEN
LS1DepTime = ParamData
LS2DepTime = XLATE('RDS_LAYER',RDSNo:'*L2',RDS_LAYER_EPI_TIME$,'X')
END
IF LSId = 'L2' THEN
LS1DepTime = XLATE('RDS_LAYER',RDSNo:'*L1',RDS_LAYER_EPI_TIME$,'X')
LS2DepTime = ParamData
END
IF LS1DepTime NE '' AND LS2DepTime NE '' THEN
IF LS1DepTime NE '' AND LS2DepTime NE '' THEN
LS1DepTime = OCONV(LS1DepTime,'MD1')
LS2DepTime = OCONV(LS2DepTime,'MD1')
TotDepTime = LS1DepTime + LS2DepTime
LS1Ratio = OCONV(ICONV(LS1DepTime/TotDepTime,'MD6'),'MD6')
LS1DepTime = OCONV(LS1DepTime,'MD1')
LS2DepTime = OCONV(LS2DepTime,'MD1')
TotDepTime = LS1DepTime + LS2DepTime
LS1Ratio = OCONV(ICONV(LS1DepTime/TotDepTime,'MD6'),'MD6')
IF LS1Ratio <= 0.112 OR LS1Ratio >= 0.114 THEN
Msg(@WINDOW,'','DEP_TIME_RATIO','',LS1DepTime:@FM:LS2DepTime:@FM:LS1Ratio)
END
END
IF LS1Ratio <= 0.112 OR LS1Ratio >= 0.114 THEN
Msg(@WINDOW,'','DEP_TIME_RATIO','',LS1DepTime:@FM:LS2DepTime:@FM:LS1Ratio)
END
END
END ;* End of check for DepTimeRatio flag
END ;* End of check for column = 'EPI_TIME"
END ;* End of check for DepTimeRatio flag
END ;* End of check for column = 'EPI_TIME"
END ;* End of Check for Visible Column
END ;* End of Check for Visible Column
END
END
GOSUB Refresh
GOSUB Refresh
RETURN
* * * * * * *
NewTest:
* * * * * * *
@ -465,39 +459,38 @@ NewTest:
RETURN
* * * * * * *
TestKeyDC:
* * * * * * *
CurrCtrl = @WINDOW:'.RDS_TEST_KEYS'
CurrCtrl = @WINDOW:'.RDS_TEST_KEYS'
CurrPos = Get_Property(CurrCtrl,"SELPOS")
CurrCol = CurrPos<1>
CurrRow = CurrPos<2>
CurrPos = Get_Property(CurrCtrl,"SELPOS")
CurrCol = CurrPos<1>
CurrRow = CurrPos<2>
RDSTestNo = Get_Property(CurrCtrl,'CELLPOS',COL$TEST_NO:@FM:CurrRow)
RDSLsID = Get_Property(@WINDOW,'ID')
RDSTestNo = Get_Property(CurrCtrl,'CELLPOS',COL$TEST_NO:@FM:CurrRow)
RDSLsID = Get_Property(@WINDOW,'ID')
IF RDSTestNo NE '' AND RDSLsID NE '' THEN
IF RDSTestNo NE '' AND RDSLsID NE '' THEN
CardWindow = 'RDS_TEST'
CardKey = RDSTestNo ;* Null values for CardKey creates new card
NewCardCtrl = '' ;* Name of button control to create new Card on Card window
RecalcCtrl = CurrCtrl ;* Symbolic Control to recalculate upon return
RecalcPos = '' ;* Position in edit list or edit table for recalc
RetCtrl = CurrCtrl ;* This can be called from both a window and a process
RetPos = CurrPos ;* Position in edit list or edit table to return to
CardWindow = 'RDS_TEST'
CardKey = RDSTestNo ;* Null values for CardKey creates new card
NewCardCtrl = '' ;* Name of button control to create new Card on Card window
RecalcCtrl = CurrCtrl ;* Symbolic Control to recalculate upon return
RecalcPos = '' ;* Position in edit list or edit table for recalc
RetCtrl = CurrCtrl ;* This can be called from both a window and a process
RetPos = CurrPos ;* Position in edit list or edit table to return to
oAParms = CardWindow:@RM:CardKey:@RM:NewCardCtrl:@RM:RecalcCtrl:@RM:RecalcPos:@RM:RetCtrl:@RM:RetPos
oAParms = CardWindow:@RM:CardKey:@RM:NewCardCtrl:@RM:RecalcCtrl:@RM:RecalcPos:@RM:RetCtrl:@RM:RetPos
obj_AppWindow('ViewNewCard',oAParms)
obj_AppWindow('ViewNewCard',oAParms)
IF Get_Status(errCode) THEN
ErrMsg(errCode)
END
IF Get_Status(errCode) THEN
ErrMsg(errCode)
END
END
END
RETURN
@ -506,199 +499,49 @@ RETURN
OverRideRecipeLimits:
* * * * * * *
IF Security_Check( 'Recipe', Write$ ) THEN
Set_Property(@WINDOW:'.OVERRIDE_LIMITS_GROUP','ENABLED',1)
END ELSE
Security_Err_Msg( 'Recipe', Write$ )
END
IF Security_Check( 'Recipe', Write$ ) THEN
Set_Property(@WINDOW:'.OVERRIDE_LIMITS_GROUP','ENABLED',1)
END ELSE
Security_Err_Msg( 'Recipe', Write$ )
END
RETURN
* * * * * * *
UpdateLimits:
* * * * * * *
IF Security_Check( 'Recipe', Write$ ) THEN
RDSNo = Get_Property(@WINDOW:'.RDS_NO','DEFPROP')
LSId = Get_Property(@WINDOW:'.LS_ID','DEFPROP')
IF Security_Check( 'Recipe', Write$ ) THEN
RDSNo = Get_Property(@WINDOW:'.RDS_NO','DEFPROP')
LSId = Get_Property(@WINDOW:'.LS_ID','DEFPROP')
IF RDSNo = '' OR LSId = '' THEN RETURN
IF RDSNo = '' OR LSId = '' THEN RETURN
Send_Event(@WINDOW,'WRITE')
Send_Event(@WINDOW,'WRITE')
obj_RDS_Layer('UpdateLimits',RDSNo:@RM:LSId)
obj_RDS_Layer('UpdateLimits',RDSNo:@RM:LSId)
IF Get_Status(errCode) THEN ErrMsg(errCode)
IF Get_Status(errCode) THEN ErrMsg(errCode)
obj_AppWindow('LoadFormKeys',@WINDOW:@RM:RDSNo:'*':LSId)
obj_AppWindow('LoadFormKeys',@WINDOW:@RM:RDSNo:'*':LSId)
END ELSE
Security_Err_Msg( 'Recipe', Write$ )
END
END ELSE
Security_Err_Msg( 'Recipe', Write$ )
END
RETURN
* * * * * * *
OverRideDC:
* * * * * * *
RETURN
* * * * * * *
OverRidePC:
* * * * * * *
/*
CtrlEntID = @WINDOW:'.CUST_LOT_NO'
OrderNo = Get_Property(@WINDOW:'.ORDER_NO','TEXT')
ItemNo = Get_Property(@WINDOW:'.ITEM_NO','TEXT')
OrderDetKey = OrderNo:'*':ItemNo
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')
ColCnt = 2 ;* Number of columns in the edit table
IF ListData<CurrRow,CurrCol> = '' 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
LinePointer -= 1
END
REPEAT
* Move one past the non empty cell
BEGIN CASE
CASE LinePointer = 0
* Empty Table
LinePointer = 1
CoilPointer = 1
CASE ColPointer = ColCnt
LinePointer += 1
ColPointer = 1
CASE 1
ColPointer += 1
END CASE
Set_Property(CtrlEntId,"SELPOS",ColPointer:@FM:LinePointer)
END
IF ListData<PrevRow,PrevCol> NE '' THEN
IF PrevCol = COL$CUST_LOT_NO THEN
LotNo = ListData<PrevRow,PrevCol>
IF INDEX(LotNo,' ',1) THEN
ListData<PrevRow,PrevCol> = TRIM(LotNo)
Set_Property(CtrlEntId,'LIST',ListData)
LotNo = TRIM(LotNo)
END
Extract_SI_Keys('ORDER_DET','CUST_LOT_NO',LotNo,OrderDetKeys) ;* Check for previous use of customer lot number in new data structure
IF OrderDetKeys NE '' THEN
LOCATE OrderDetKey IN OrderDetKeys USING @VM SETTING FPos THEN
OrderDetKeys = DELETE(OrderDetKeys,1,FPos,0) ;* Exclude the current Order Item from this check
END
IF OrderDetKeys NE '' THEN
SWAP @VM WITH ', ' IN OrderDetKeys
Message = 'Lot No ':QUOTE(LotNo):' has been used in Order Item(s) |':OrderDetKeys:'||'
Message := 'Do you wish to use this duplicate Lot Number?|'
MsgInfo = ''
MsgInfo<MTEXT$> = Message
Resp = Msg( @WINDOW, MsgInfo,'CUST_LOT_USED' )
IF Resp = CHAR(27) THEN
Set_Property(CtrlEntId,'CELLPOS','',PrevSelPos)
Set_Property(CtrlEntId,"SELPOS",PrevSelPos)
END
END
END ELSE
* Try looking in the old format Orders
Extract_SI_Keys('ORDER','LOT_NUM',LotNo,OrderNos) ;* Check for previous use of customer lot number in old data structure
IF OrderNos NE '' THEN
LOCATE OrderNo IN OrderNos USING @VM SETTING FPos THEN
OrderNos = DELETE(OrderNos,1,FPos,0) ;* Exclude the current Order No from this check
END
IF OrderNos NE '' THEN
SWAP @VM WITH ', ' IN OrderNos
Message = 'Lot No ':QUOTE(LotNo):' has been used in Order Number |':OrderNos:'||'
Message := 'Do you wish to use this duplicate Lot Number?|'
MsgInfo = ''
MsgInfo<MTEXT$> = Message
Resp = Msg( @WINDOW, MsgInfo,'CUST_LOT_USED' )
IF Resp = CHAR(27) THEN
Set_Property(CtrlEntId,'CELLPOS','',PrevSelPos)
Set_Property(CtrlEntId,"SELPOS",PrevSelPos)
END
END
END
END ;* End of checks for Lot Nos used elswhere
END
END ;* End of check for Previous Cell NE Null
GOSUB Refresh
RETURN
*/
RETURN

View File

@ -27,30 +27,47 @@ Common /ErrorServices/ ErrorMessages@, ErrorSources@, ErrorCodes@, RetStacks@, E
Equ CRLF$ to \0D0A\
Declare function Environment_Services, Logging_Services, GetSessionCallStack, Error_Services, RetStack
Declare subroutine Logging_Services, Get_Status, Set_Env
Declare subroutine Logging_Services, Get_Status, Set_Env, GetTempPath
Main:
ErrorMessages = Error_Services('GetMessages')
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\StackTrace'
LogDate = Oconv(Date(), 'D4/')
LogTime = Oconv(Time(), 'MTS')
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' Error Log.csv'
objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ',', '', '', False$, False$)
LogData = ''
LogData<1> = CRLF$:'Timestamp: ':LogDate:' ':LogTime
LogData<2> = 'Machine: ':Environment_Services('GetServer')
LogData<3> = 'Set_Status Code:':EsSpStatCode@
LogData<4> = 'Set_Status Message:':EsSpStatMessage@
ErrorMessages = Error_Services('GetMessages')
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\StackTrace'
LogDate = Oconv(Date(), 'D4/')
LogTime = Oconv(Time(), 'MTS')
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' Error Log.csv'
objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ',', '', '', False$, False$)
TempLogFileName = 'OIStackLog.csv'
TempDirectory = Str(\00\, 1024)
GetTempPath(Len(TempDirectory), TempDirectory)
Convert \00\ to '' in TempDirectory
TempLogPath = TempDirectory
objTempLog = Logging_Services('NewLog', TempLogPath, TempLogFileName, CRLF$, ',', '', '', False$, True$)
LogData = ''
LogData<1> = CRLF$:'Timestamp: ':LogDate:' ':LogTime
LogData<2> = 'Machine: ':Environment_Services('GetServer')
LogData<3> = 'Set_Status Code:':EsSpStatCode@
LogData<4> = 'Set_Status Message:':EsSpStatMessage@
Swap @FM with @VM in ErrorMessages
LogData<5> = 'Error_Services Messages:':ErrorMessages
LogData<6> = 'Call Depth: ':CallDepth@
LogData<7> = 'Curr Program and line no: ':CallStack@<2,1>:@VM:CallStack@<2,2>
LogData<8> = 'Call Stack / Line Nos: '
Stack = CallStack@
Stack = Delete(Stack, 1, 0, 0)
LogData<9> = Stack:CRLF$
LogData<5> = 'Error_Services Messages:':ErrorMessages
LogData<6> = 'Call Depth: ':CallDepth@
Stack = CallStack@
Begin Case
Case ( (CallStack@<1,1> EQ 'ERROR_SERVICES') and (CallStack@<2,1> EQ 'ERROR_SERVICES') )
LogData<7> = 'Curr Program and line no: ':CallStack@<3,1>:@VM:CallStack@<3,2>
Stack = Delete(Stack, 1, 0, 0)
Stack = Delete(Stack, 1, 0, 0)
Case (CallStack@<1,1> EQ 'ERROR_SERVICES')
LogData<7> = 'Curr Program and line no: ':CallStack@<2,1>:@VM:CallStack@<2,2>
Stack = Delete(Stack, 1, 0, 0)
Case Otherwise$
LogData<7> = 'Curr Program and line no: ':CallStack@<1,1>:@VM:CallStack@<1,2>
End Case
LogData<8> = 'Call Stack / Line Nos: '
Convert \00\ to '' in Stack
LogData<9> = Stack:CRLF$
Logging_Services('AppendLog', objLog, LogData, @FM, @VM, '', '', '')
Logging_Services('AppendLog', objTempLog, LogData, @FM, @VM, '', '', '')
Return

View File

@ -102,7 +102,7 @@ If Assigned(Response) else Response = ''
AutoDisplayErrors = False$ ; // Set this to True$ when debugging so all errors will automatically display.
Declare function RetStack, Error_Services, SRPSendMail, Get_Env
Declare subroutine Error_Services, Set_Env, Set_Status
Declare subroutine Error_Services, Set_Env, Set_Status, GetTempPath
GoToService else
Error_Services('Set', Service : ' is not a valid service request within the Error services module.')
@ -311,16 +311,39 @@ Service GetCodes()
End Service
//----------------------------------------------------------------------------------------------------------------------
// GetStackTrace
//
// Uses a debugger intercept to log the stack including line numbers to a temporary file and returns the contents
// in the Response variable.
//
// Warning:
// Stepping into this while debugging will interrupt the debugging session and may cause an error message to
// be displayed. It is advised to set a breakpoint after the call and let the debugger run through this.
//----------------------------------------------------------------------------------------------------------------------
Service GetStackTrace()
// Business logic goes here. Data that needs to be returned should be assigned to the Response parameter.
Response = '<Service Response>'
Error_Services('LogStack')
TempLogFileName = 'OIStackLog.csv'
TempDirectory = Str(\00\, 1024)
GetTempPath(Len(TempDirectory), TempDirectory)
Convert \00\ to '' in TempDirectory
TempLogPath = TempDirectory:TempLogFileName
OSRead Response from TempLogpath else
Error_Services('Add', 'Error in ':Service:' service. Error retrieving OIStackLog.csv')
end
End Service
//----------------------------------------------------------------------------------------------------------------------
// LogStack
//
// Uses a custom debugger intercept to log the stack including line numbers to .../LogFiles/StackTrace.
// Uses a debugger intercept, DEBUGGER_LOGGER, to log the stack including line numbers to .../LogFiles/StackTrace.
//
// Warning:
// Stepping into this while debugging will interrupt the debugging session and may cause an error message to
// be displayed. It is advised to set a breakpoint after the call and let the debugger run through this.
//----------------------------------------------------------------------------------------------------------------------
Service LogStack()
@ -402,3 +425,4 @@ SendRuntimeAlert:
MsgSent = SRPSendMail(Message, ConfigFile)
return

View File

@ -81,12 +81,6 @@ LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' RDS
Headers = 'Logging DTM' : @FM : 'RDSNo' : @FM : 'WONo' : @FM : 'CassNo' : @FM : 'Reactor Type'
objLog3 = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$)
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\RDS_LAYER'
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' RDS_LAYER Log.csv'
Headers = 'Logging DTM' : @FM : 'Results'
ColumnWidths = 20 : @FM : 100
objLog2 = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ' ', Headers, ColumnWidths, False$, False$)
If KeyID then GoSub Initialize_System_Variables
Begin Case
@ -1045,3 +1039,4 @@ Restore_System_Variables:
return

View File

@ -49,17 +49,9 @@ $insert FILE.SYSTEM.EQUATES
$insert ACTION_SETUP
$insert RDS_LAYER_EQUATES
Declare function Tool_Parms_Services, Environment_Services, Logging_Services, Memberof
Declare function Tool_Parms_Services, Environment_Services, Logging_Services, Memberof, Error_Services
Declare subroutine Logging_Services, Error_Services
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\RDS_LAYER_WriteIssue'
LogDate = Oconv(Date(), 'D4/')
LogTime = Oconv(Time(), 'MTS')
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' RDS_LAYER WriteIssue Log.csv'
Headers = 'Logging DTM' : @FM : 'User' : @FM : 'RDS_LAYER Key ID' : @FM : 'Notes'
objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$)
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
If KeyID then GoSub Initialize_System_Variables
Begin Case
@ -151,382 +143,68 @@ return
WRITE_RECORD_PRE:
EngineeringCheck = Memberof(@User4, 'ENGINEERING')
If (EngineeringCheck EQ True$) then
ActionFlow = ACTION_CONTINUE$
end else
WriteIssue = False$
If (OrigRecord<RDS_LAYER_EPI_TIME_MIN$> NE '') AND (Record<RDS_LAYER_EPI_TIME_MIN$> EQ '') then
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = @USER4
LogData<3> = Name
LogData<4> = 'RDS_LAYER Epi Time Min can only be cleared by a member of Engineering.'
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
Error_Services('Add', 'RDS_LAYER Epi Time Min can only be cleared by a member of Engineering.')
WriteIssue = True$
end
If (OrigRecord<RDS_LAYER_EPI_TIME_MAX$> NE '') AND (Record<RDS_LAYER_EPI_TIME_MAX$> EQ '') then
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = @USER4
LogData<3> = Name
LogData<4> = 'RDS_LAYER Epi Time Max can only be cleared by a member of Engineering.'
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
Error_Services('Add', 'RDS_LAYER Epi Time Max can only be cleared by a member of Engineering.')
WriteIssue = True$
end
If (OrigRecord<RDS_LAYER_EPI_H2_FLOW_MIN$> NE '') AND (Record<RDS_LAYER_EPI_H2_FLOW_MIN$> EQ '') then
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = @USER4
LogData<3> = Name
LogData<4> = 'RDS_LAYER Epi H2 Flow Min can only be cleared by a member of Engineering.'
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
Error_Services('Add', 'RDS_LAYER Epi H2 Flow Min can only be cleared by a member of Engineering.')
WriteIssue = True$
end
If (OrigRecord<RDS_LAYER_EPI_H2_FLOW_MAX$> NE '') AND (Record<RDS_LAYER_EPI_H2_FLOW_MAX$> EQ '') then
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = @USER4
LogData<3> = Name
LogData<4> = 'RDS_LAYER Epi H2 Flow Max can only be cleared by a member of Engineering.'
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
Error_Services('Add', 'RDS_LAYER Epi H2 Flow Max can only be cleared by a member of Engineering.')
WriteIssue = True$
end
If (OrigRecord<RDS_LAYER_TCS_FLOW_MIN$> NE '') AND (Record<RDS_LAYER_TCS_FLOW_MIN$> EQ '') then
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = @USER4
LogData<3> = Name
LogData<4> = 'RDS_LAYER TCS Flow Min can only be cleared by a member of Engineering.'
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
Error_Services('Add', 'RDS_LAYER TCS Flow Min can only be cleared by a member of Engineering.')
WriteIssue = True$
end
If (OrigRecord<RDS_LAYER_TCS_FLOW_MAX$> NE '') AND (Record<RDS_LAYER_TCS_FLOW_MAX$> EQ '') then
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = @USER4
LogData<3> = Name
LogData<4> = 'RDS_LAYER TCS Flow Max can only be cleared by a member of Engineering.'
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
Error_Services('Add', 'RDS_LAYER TCS Flow Max can only be cleared by a member of Engineering.')
WriteIssue = True$
end
If (OrigRecord<RDS_LAYER_AUX1_MIN$> NE '') AND (Record<RDS_LAYER_AUX1_MIN$> EQ '') then
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = @USER4
LogData<3> = Name
LogData<4> = 'RDS_LAYER Aux1 Min can only be cleared by a member of Engineering.'
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
Error_Services('Add', 'RDS_LAYER Aux1 Min can only be cleared by a member of Engineering.')
WriteIssue = True$
end
If (OrigRecord<RDS_LAYER_AUX1_MAX$> NE '') AND (Record<RDS_LAYER_AUX1_MAX$> EQ '') then
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = @USER4
LogData<3> = Name
LogData<4> = 'RDS_LAYER Aux1 Max can only be cleared by a member of Engineering.'
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
Error_Services('Add', 'RDS_LAYER Aux1 Max can only be cleared by a member of Engineering.')
WriteIssue = True$
end
If (OrigRecord<RDS_LAYER_F_OFFSET_MIN$> NE '') AND (Record<RDS_LAYER_F_OFFSET_MIN$> EQ '') then
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = @USER4
LogData<3> = Name
LogData<4> = 'RDS_LAYER F Offset Min can only be cleared by a member of Engineering.'
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
Error_Services('Add', 'RDS_LAYER F Offset Min can only be cleared by a member of Engineering.')
WriteIssue = True$
end
If (OrigRecord<RDS_LAYER_F_OFFSET_MAX$> NE '') AND (Record<RDS_LAYER_F_OFFSET_MAX$> EQ '') then
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = @USER4
LogData<3> = Name
LogData<4> = 'RDS_LAYER F Offset Max can only be cleared by a member of Engineering.'
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
Error_Services('Add', 'RDS_LAYER F Offset Max can only be cleared by a member of Engineering.')
WriteIssue = True$
end
If (OrigRecord<RDS_LAYER_SUSC_ETCH_MIN$> NE '') AND (Record<RDS_LAYER_SUSC_ETCH_MIN$> EQ '') then
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = @USER4
LogData<3> = Name
LogData<4> = 'RDS_LAYER Susc Etch Min can only be cleared by a member of Engineering.'
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
Error_Services('Add', 'RDS_LAYER Susc Etch Min can only be cleared by a member of Engineering.')
WriteIssue = True$
end
If (OrigRecord<RDS_LAYER_SUSC_ETCH_MAX$> NE '') AND (Record<RDS_LAYER_SUSC_ETCH_MAX$> EQ '') then
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = @USER4
LogData<3> = Name
LogData<4> = 'RDS_LAYER Susc Etch Max can only be cleared by a member of Engineering.'
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
Error_Services('Add', 'RDS_LAYER Susc Etch Max can only be cleared by a member of Engineering.')
WriteIssue = True$
end
If (OrigRecord<RDS_LAYER_DILUENT_MIN$> NE '') AND (Record<RDS_LAYER_DILUENT_MIN$> EQ '') then
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = @USER4
LogData<3> = Name
LogData<4> = 'RDS_LAYER Dilutent Min can only be cleared by a member of Engineering.'
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
Error_Services('Add', 'RDS_LAYER Dilutent Min can only be cleared by a member of Engineering.')
WriteIssue = True$
end
If (OrigRecord<RDS_LAYER_DILUENT_MAX$> NE '') AND (Record<RDS_LAYER_DILUENT_MAX$> EQ '') then
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = @USER4
LogData<3> = Name
LogData<4> = 'RDS_LAYER Dilutent Max can only be cleared by a member of Engineering.'
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
Error_Services('Add', 'RDS_LAYER Dilutent Max can only be cleared by a member of Engineering.')
WriteIssue = True$
end
If (OrigRecord<RDS_LAYER_DOPANT_FLOW_MIN$> NE '') AND (Record<RDS_LAYER_DOPANT_FLOW_MIN$> EQ '') then
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = @USER4
LogData<3> = Name
LogData<4> = 'RDS_LAYER Dopant Flow Min can only be cleared by a member of Engineering.'
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
Error_Services('Add', 'RDS_LAYER Dopant Flow Min can only be cleared by a member of Engineering.')
WriteIssue = True$
end
If (OrigRecord<RDS_LAYER_DOPANT_FLOW_MAX$> NE '') AND (Record<RDS_LAYER_DOPANT_FLOW_MAX$> EQ '') then
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = @USER4
LogData<3> = Name
LogData<4> = 'RDS_LAYER Dopant Flow Max can only be cleared by a member of Engineering.'
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
Error_Services('Add', 'RDS_LAYER Dopant Flow Max can only be cleared by a member of Engineering.')
WriteIssue = True$
end
If (OrigRecord<RDS_LAYER_HCL_FLOW_MIN$> NE '') AND (Record<RDS_LAYER_HCL_FLOW_MIN$> EQ '') then
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = @USER4
LogData<3> = Name
LogData<4> = 'RDS_LAYER HCL Flow Min can only be cleared by a member of Engineering.'
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
Error_Services('Add', 'RDS_LAYER HCL Flow Min can only be cleared by a member of Engineering.')
WriteIssue = True$
end
If (OrigRecord<RDS_LAYER_HCL_FLOW_MAX$> NE '') AND (Record<RDS_LAYER_HCL_FLOW_MAX$> EQ '') then
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = @USER4
LogData<3> = Name
LogData<4> = 'RDS_LAYER HCL Flow Max can only be cleared by a member of Engineering.'
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
Error_Services('Add', 'RDS_LAYER HCL Flow Max can only be cleared by a member of Engineering.')
WriteIssue = True$
end
If (OrigRecord<RDS_LAYER_BAKE_TIME_MIN$> NE '') AND (Record<RDS_LAYER_BAKE_TIME_MIN$> EQ '') then
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = @USER4
LogData<3> = Name
LogData<4> = 'RDS_LAYER Bake Time Min can only be cleared by a member of Engineering.'
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
Error_Services('Add', 'RDS_LAYER Bake Time Min can only be cleared by a member of Engineering.')
WriteIssue = True$
end
If (OrigRecord<RDS_LAYER_BAKE_TIME_MAX$> NE '') AND (Record<RDS_LAYER_BAKE_TIME_MAX$> EQ '') then
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = @USER4
LogData<3> = Name
LogData<4> = 'RDS_LAYER Bake Time Max can only be cleared by a member of Engineering.'
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
Error_Services('Add', 'RDS_LAYER Bake Time Max can only be cleared by a member of Engineering.')
WriteIssue = True$
end
If (OrigRecord<RDS_LAYER_DCS_FLOW_MIN$> NE '') AND (Record<RDS_LAYER_DCS_FLOW_MIN$> EQ '') then
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = @USER4
LogData<3> = Name
LogData<4> = 'RDS_LAYER DCS Flow Min can only be cleared by a member of Engineering.'
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
Error_Services('Add', 'RDS_LAYER DCS Flow Min can only be cleared by a member of Engineering.')
WriteIssue = True$
end
If (OrigRecord<RDS_LAYER_DCS_FLOW_MAX$> NE '') AND (Record<RDS_LAYER_DCS_FLOW_MAX$> EQ '') then
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = @USER4
LogData<3> = Name
LogData<4> = 'RDS_LAYER DCS Flow Max can only be cleared by a member of Engineering.'
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
Error_Services('Add', 'RDS_LAYER DCS Flow Max can only be cleared by a member of Engineering.')
WriteIssue = True$
end
If (OrigRecord<RDS_LAYER_AUX2_MIN$> NE '') AND (Record<RDS_LAYER_AUX2_MIN$> EQ '') then
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = @USER4
LogData<3> = Name
LogData<4> = 'RDS_LAYER Aux2 Min can only be cleared by a member of Engineering.'
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
Error_Services('Add', 'RDS_LAYER Aux2 Min can only be cleared by a member of Engineering.')
WriteIssue = True$
end
If (OrigRecord<RDS_LAYER_AUX2_MAX$> NE '') AND (Record<RDS_LAYER_AUX2_MAX$> EQ '') then
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = @USER4
LogData<3> = Name
LogData<4> = 'RDS_LAYER Aux2 Max can only be cleared by a member of Engineering.'
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
Error_Services('Add', 'RDS_LAYER Aux2 Max can only be cleared by a member of Engineering.')
WriteIssue = True$
end
If (OrigRecord<RDS_LAYER_S_OFFSET_MIN$> NE '') AND (Record<RDS_LAYER_S_OFFSET_MIN$> EQ '') then
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = @USER4
LogData<3> = Name
LogData<4> = 'RDS_LAYER S Offset Min can only be cleared by a member of Engineering.'
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
Error_Services('Add', 'RDS_LAYER S Offset Min can only be cleared by a member of Engineering.')
WriteIssue = True$
end
If (OrigRecord<RDS_LAYER_S_OFFSET_MAX$> NE '') AND (Record<RDS_LAYER_S_OFFSET_MAX$> EQ '') then
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = @USER4
LogData<3> = Name
LogData<4> = 'RDS_LAYER S Offset Max can only be cleared by a member of Engineering.'
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
Error_Services('Add', 'RDS_LAYER S Offset Max can only be cleared by a member of Engineering.')
WriteIssue = True$
end
If (OrigRecord<RDS_LAYER_R_OFFSET_MIN$> NE '') AND (Record<RDS_LAYER_R_OFFSET_MIN$> EQ '') then
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = @USER4
LogData<3> = Name
LogData<4> = 'RDS_LAYER R Offset Min can only be cleared by a member of Engineering.'
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
Error_Services('Add', 'RDS_LAYER R Offset Min can only be cleared by a member of Engineering.')
WriteIssue = True$
end
If (OrigRecord<RDS_LAYER_R_OFFSET_MAX$> NE '') AND (Record<RDS_LAYER_R_OFFSET_MAX$> EQ '') then
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = @USER4
LogData<3> = Name
LogData<4> = 'RDS_LAYER R Offset Max can only be cleared by a member of Engineering.'
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
Error_Services('Add', 'RDS_LAYER R Offset Max can only be cleared by a member of Engineering.')
WriteIssue = True$
end
If (OrigRecord<RDS_LAYER_ETCH1_MIN$> NE '') AND (Record<RDS_LAYER_ETCH1_MIN$> EQ '') then
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = @USER4
LogData<3> = Name
LogData<4> = 'RDS_LAYER Etch 1 Min can only be cleared by a member of Engineering.'
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
Error_Services('Add', 'RDS_LAYER Etch 1 Min can only be cleared by a member of Engineering.')
WriteIssue = True$
end
If (OrigRecord<RDS_LAYER_ETCH1_MAX$> NE '') AND (Record<RDS_LAYER_ETCH1_MAX$> EQ '') then
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = @USER4
LogData<3> = Name
LogData<4> = 'RDS_LAYER Etch 1 Max can only be cleared by a member of Engineering.'
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
Error_Services('Add', 'RDS_LAYER Etch 1 Max can only be cleared by a member of Engineering.')
WriteIssue = True$
end
If (OrigRecord<RDS_LAYER_ETCH2_MIN$> NE '') AND (Record<RDS_LAYER_ETCH2_MIN$> EQ '') then
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = @USER4
LogData<3> = Name
LogData<4> = 'RDS_LAYER Etch 2 Min can only be cleared by a member of Engineering.'
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
Error_Services('Add', 'RDS_LAYER Etch 2 Min can only be cleared by a member of Engineering.')
WriteIssue = True$
end
If (OrigRecord<RDS_LAYER_ETCH2_MAX$> NE '') AND (Record<RDS_LAYER_ETCH2_MAX$> EQ '') then
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = @USER4
LogData<3> = Name
LogData<4> = 'RDS_LAYER Etch 2 Max can only be cleared by a member of Engineering.'
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
Error_Services('Add', 'RDS_LAYER Etch 2 Max can only be cleared by a member of Engineering.')
WriteIssue = True$
end
If (OrigRecord<RDS_LAYER_ETCH3_MIN$> NE '') AND (Record<RDS_LAYER_ETCH3_MIN$> EQ '') then
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = @USER4
LogData<3> = Name
LogData<4> = 'RDS_LAYER Etch 3 Min can only be cleared by a member of Engineering.'
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
Error_Services('Add', 'RDS_LAYER Etch 3 Min can only be cleared by a member of Engineering.')
WriteIssue = True$
end
If (OrigRecord<RDS_LAYER_ETCH3_MAX$> NE '') AND (Record<RDS_LAYER_ETCH3_MAX$> EQ '') then
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = @USER4
LogData<3> = Name
LogData<4> = 'RDS_LAYER Etch 3 Max can only be cleared by a member of Engineering.'
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
Error_Services('Add', 'RDS_LAYER Etch 3 Max can only be cleared by a member of Engineering.')
WriteIssue = True$
end
If Not(Memberof(@User4, 'ENGINEERING')) then
If ( (OrigRecord<RDS_LAYER_EPI_TIME_MIN$> NE '') AND (Record<RDS_LAYER_EPI_TIME_MIN$> EQ '') ) |
or ( (OrigRecord<RDS_LAYER_EPI_TIME_MAX$> NE '') AND (Record<RDS_LAYER_EPI_TIME_MAX$> EQ '') ) |
or ( (OrigRecord<RDS_LAYER_EPI_H2_FLOW_MIN$> NE '') AND (Record<RDS_LAYER_EPI_H2_FLOW_MIN$> EQ '') ) |
or ( (OrigRecord<RDS_LAYER_EPI_H2_FLOW_MAX$> NE '') AND (Record<RDS_LAYER_EPI_H2_FLOW_MAX$> EQ '') ) |
or ( (OrigRecord<RDS_LAYER_TCS_FLOW_MIN$> NE '') AND (Record<RDS_LAYER_TCS_FLOW_MIN$> EQ '') ) |
or ( (OrigRecord<RDS_LAYER_TCS_FLOW_MAX$> NE '') AND (Record<RDS_LAYER_TCS_FLOW_MAX$> EQ '') ) |
or ( (OrigRecord<RDS_LAYER_AUX1_MIN$> NE '') AND (Record<RDS_LAYER_AUX1_MIN$> EQ '') ) |
or ( (OrigRecord<RDS_LAYER_AUX1_MAX$> NE '') AND (Record<RDS_LAYER_AUX1_MAX$> EQ '') ) |
or ( (OrigRecord<RDS_LAYER_F_OFFSET_MIN$> NE '') AND (Record<RDS_LAYER_F_OFFSET_MIN$> EQ '') ) |
or ( (OrigRecord<RDS_LAYER_F_OFFSET_MAX$> NE '') AND (Record<RDS_LAYER_F_OFFSET_MAX$> EQ '') ) |
or ( (OrigRecord<RDS_LAYER_SUSC_ETCH_MIN$> NE '') AND (Record<RDS_LAYER_SUSC_ETCH_MIN$> EQ '') ) |
or ( (OrigRecord<RDS_LAYER_SUSC_ETCH_MAX$> NE '') AND (Record<RDS_LAYER_SUSC_ETCH_MAX$> EQ '') ) |
or ( (OrigRecord<RDS_LAYER_DILUENT_MIN$> NE '') AND (Record<RDS_LAYER_DILUENT_MIN$> EQ '') ) |
or ( (OrigRecord<RDS_LAYER_DILUENT_MAX$> NE '') AND (Record<RDS_LAYER_DILUENT_MAX$> EQ '') ) |
or ( (OrigRecord<RDS_LAYER_DOPANT_FLOW_MIN$> NE '') AND (Record<RDS_LAYER_DOPANT_FLOW_MIN$> EQ '') ) |
or ( (OrigRecord<RDS_LAYER_DOPANT_FLOW_MAX$> NE '') AND (Record<RDS_LAYER_DOPANT_FLOW_MAX$> EQ '') ) |
or ( (OrigRecord<RDS_LAYER_HCL_FLOW_MIN$> NE '') AND (Record<RDS_LAYER_HCL_FLOW_MIN$> EQ '') ) |
or ( (OrigRecord<RDS_LAYER_HCL_FLOW_MAX$> NE '') AND (Record<RDS_LAYER_HCL_FLOW_MAX$> EQ '') ) |
or ( (OrigRecord<RDS_LAYER_BAKE_TIME_MIN$> NE '') AND (Record<RDS_LAYER_BAKE_TIME_MIN$> EQ '') ) |
or ( (OrigRecord<RDS_LAYER_BAKE_TIME_MAX$> NE '') AND (Record<RDS_LAYER_BAKE_TIME_MAX$> EQ '') ) |
or ( (OrigRecord<RDS_LAYER_DCS_FLOW_MIN$> NE '') AND (Record<RDS_LAYER_DCS_FLOW_MIN$> EQ '') ) |
or ( (OrigRecord<RDS_LAYER_DCS_FLOW_MAX$> NE '') AND (Record<RDS_LAYER_DCS_FLOW_MAX$> EQ '') ) |
or ( (OrigRecord<RDS_LAYER_AUX2_MIN$> NE '') AND (Record<RDS_LAYER_AUX2_MIN$> EQ '') ) |
or ( (OrigRecord<RDS_LAYER_AUX2_MAX$> NE '') AND (Record<RDS_LAYER_AUX2_MAX$> EQ '') ) |
or ( (OrigRecord<RDS_LAYER_S_OFFSET_MIN$> NE '') AND (Record<RDS_LAYER_S_OFFSET_MIN$> EQ '') ) |
or ( (OrigRecord<RDS_LAYER_S_OFFSET_MAX$> NE '') AND (Record<RDS_LAYER_S_OFFSET_MAX$> EQ '') ) |
or ( (OrigRecord<RDS_LAYER_R_OFFSET_MIN$> NE '') AND (Record<RDS_LAYER_R_OFFSET_MIN$> EQ '') ) |
or ( (OrigRecord<RDS_LAYER_R_OFFSET_MAX$> NE '') AND (Record<RDS_LAYER_R_OFFSET_MAX$> EQ '') ) |
or ( (OrigRecord<RDS_LAYER_ETCH1_MIN$> NE '') AND (Record<RDS_LAYER_ETCH1_MIN$> EQ '') ) |
or ( (OrigRecord<RDS_LAYER_ETCH1_MAX$> NE '') AND (Record<RDS_LAYER_ETCH1_MAX$> EQ '') ) |
or ( (OrigRecord<RDS_LAYER_ETCH2_MIN$> NE '') AND (Record<RDS_LAYER_ETCH2_MIN$> EQ '') ) |
or ( (OrigRecord<RDS_LAYER_ETCH2_MAX$> NE '') AND (Record<RDS_LAYER_ETCH2_MAX$> EQ '') ) |
or ( (OrigRecord<RDS_LAYER_ETCH3_MIN$> NE '') AND (Record<RDS_LAYER_ETCH3_MIN$> EQ '') ) |
or ( (OrigRecord<RDS_LAYER_ETCH3_MAX$> NE '') AND (Record<RDS_LAYER_ETCH3_MAX$> EQ '') ) |
or ( (OrigRecord<RDS_LAYER_UL_TEMP_MIN$> NE '') AND (Record<RDS_LAYER_UL_TEMP_MIN$> EQ '') ) |
or ( (OrigRecord<RDS_LAYER_UL_TEMP_MAX$> NE '') AND (Record<RDS_LAYER_UL_TEMP_MAX$> EQ '') ) then
If (OrigRecord<RDS_LAYER_UL_TEMP_MIN$> NE '') AND (Record<RDS_LAYER_UL_TEMP_MIN$> EQ '') then
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = @USER4
LogData<3> = Name
LogData<4> = 'RDS_LAYER UL Temp Min can only be cleared by a member of Engineering.'
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
Error_Services('Add', 'RDS_LAYER UL Temp Min can only be cleared by a member of Engineering.')
WriteIssue = True$
end
If (OrigRecord<RDS_LAYER_UL_TEMP_MAX$> NE '') AND (Record<RDS_LAYER_UL_TEMP_MAX$> EQ '') then
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = @USER4
LogData<3> = Name
LogData<4> = 'RDS_LAYER UL Temp Max can only be cleared by a member of Engineering.'
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
Error_Services('Add', 'RDS_LAYER UL Temp Max can only be cleared by a member of Engineering.')
WriteIssue = True$
end
ErrorMsg = 'RDS_LAYER specifications can only be cleared by a member of Engineering.'
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\RDS_LAYER'
LogDate = Oconv(Date(), 'D4/')
LogTime = Oconv(Time(), 'MTS')
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' RDS_LAYER_Spec_Clear_Attempt_Log.csv'
Headers = 'Logging DTM' : @FM : 'User' : @FM : 'RDS_LAYER Key ID' : @FM : 'Notes'
objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$)
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
// User is attempting to erase data that is prohibited from being erased Set the FS104 error and block the write.
If WriteIssue EQ True$ then
OrigFileError = 104:': RDS_LAYER params can only be cleared by a member of Engineering.'
LogData = ''
LogData<1> = LoggingDTM
LogData<2> = @USER4
LogData<3> = Name
LogData<4> = ErrorMsg
LogData<5> = Error_Services('GetStackTrace')
Logging_Services('AppendLog', ObjLog, LogData, @RM, @FM, False$)
Error_Services('LogStack')
Error_Services('Add', ErrorMsg)
OrigFileError = 104:': ':ErrorMsg
Status = 0
Record = ''
ActionFlow = ACTION_STOP$
Error_Services('LogStack')
end else
ActionFlow = ACTION_CONTINUE$
ActionFlow = ACTION_STOP$
end
end
@ -545,6 +223,7 @@ return
// ----- Internal Methods ----------------------------------------------------------------------------------------------
Initialize_System_Variables:
// Save these for restoration later
SaveDict = @DICT
SaveID = @ID
@ -561,7 +240,7 @@ Initialize_System_Variables:
end
If CurrentDictName NE DictName then
Open DictName to @DICT else Status = 'Unable to initialize @DICT'
Open DictName to @DICT else Status = 'Unable to initialize @DICT'
end
@ID = KeyID
@ -578,11 +257,16 @@ Initialize_System_Variables:
end
end
@RECORD = Record
return
Restore_System_Variables:
Transfer SaveDict to @DICT
Transfer SaveID to @ID
Transfer SaveRecord to @RECORD
@FILE.ERROR = OrigFileError
return

View File

@ -35,6 +35,7 @@ Compile function RDS_LAYER_EVENTS(CtrlEntId, Event, @PARAMS)
#pragma precomp SRP_PreCompiler
#window RDS_LAYER
$Insert EVENT_SETUP
$Insert RDS_EQUATES
$Insert APP_INSERTS
$Insert RLIST_EQUATES
@ -54,7 +55,7 @@ EQU HIDDEN$ TO 32
Declare subroutine Comm_RDS_Layer, Tool_Parms_Services, Set_Status, RList, Errmsg, Database_Services, Msg
Declare subroutine PlaceDialog, obj_RDS_Layer, Security_Err_Msg
Declare function Tool_Parms_Services, Get_Property, Database_Services, Security_Check, MemberOf
Declare function Tool_Parms_Services, Get_Property, Database_Services, Security_Check, MemberOf, Get_EventStatus
GoToEvent Event for CtrlEntId else
// Event not implemented
@ -98,7 +99,7 @@ Event WINDOW.WRITE()
IF CurrRecord NE OrgRecord THEN
CurrDTM = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS')
NewLine = @USER4:@VM:CurrDTM
Send_Message(@WINDOW:'.MODIFY_USER','INSERT',1,NewLine)
Send_Message(@WINDOW:'.MODIFY_USER', 'INSERT', 1, NewLine)
END
IOOptions = Get_Property(@Window, 'IOOPTIONS')
@ -107,104 +108,16 @@ Event WINDOW.WRITE()
Set_Status(0)
Forward_Event()
errCode = ''
If Get_Status(errCode) then ErrMsg('Save failed. Error code: ':errCode)
Post_Event(@WINDOW,'CLOSE')
* end else
*
* MsgHead = 'Default Run Parameters'
* MsgText = 'Would you like to use these parameters as the default for future lots?'
*
* Response = Msg(@WINDOW,'','YESNO','',MsgHead:@FM:MsgText)
*
* IF Response EQ True$ THEN
*
* RDSNo = Get_Property(@Window : '.RDS_NO', 'TEXT')
* Database_Services('ActivateRecord', 'RDS', RDSNo)
* WorkOrder = {WO}
* ReactorNo = {REACTOR}
* PSN = {PROD_SPEC_ID}
* If PSN NE '' then
* If ReactorNo EQ '' then
* ReactorNo = {SCHED_REACTOR}
* If ReactorNo EQ '' then
* ErrorMsg = 'No scheduled reactor found for work order: ':WorkOrder:'. Could not apply current ':@SVM |
* : 'run parameters. Please assign a reactor to this RDS first.'
* ErrMsg(ErrorMsg)
* return
* end
* end
* // Create a new TOOL_PARMS record, which is the "master" parameter record.
* Tool_Parms_Services('CreateToolParmsRec', PSN, ReactorNo, RDSNo)
* If Error_Services('NoError') then
* Msg(@Window, '', 'SUCCESS', '', 'Run parameters have been set for reactor ':ReactorNo)
* end else
* Errmsg('Error setting run parameters. Error message: ':Error_Services('GetMessage'))
* end
* end else
* ErrorMsg = 'No PSN assigned to this RDS. Could not apply current ':@SVM |
* : 'run parameters. Please assign a PSN to this RDS first.'
* ErrMsg(ErrorMsg)
* return
* end
* end
* end
If Get_EventStatus(errCode) then
EventFlow = EVENT_STOP$
end else
Post_Event(@WINDOW,'CLOSE')
end
end event
* Event BTN_SET_CURR_RUN_PARMS.CLICK()
*
* // Use new RDS_LAYER parameters to create a new TOOL_PARMS record.
* // Then apply the new TOOL_PARMS to all RDS records in this work order on this reactor.
* // Note: If a reactor has not yet been assigned to an RDS in this work order, then
* // the TOOL_PARMS will be applied anyways as a convenience. Should the RDS be
* // reassigned to another reactor later, the appropriate TOOL_PARMS will be applied
* // by the RDS_ACTIONS MFS.
*
* Savewarn = Get_Property(@Window, 'SAVEWARN')
* Set_Property(@Window, '@SKIPSCRIPT', True$)
* If Savewarn EQ True$ then
* IOOptions = Get_Property(@Window, 'IOOPTIONS')
* IOOptions<6> = 1
* Set_Property(@Window, 'IOOPTIONS', IOOptions)
* Send_Event(@Window, 'WRITE')
* end
* RDSNo = Get_Property(@Window : '.RDS_NO', 'TEXT')
* Database_Services('ActivateRecord', 'RDS', RDSNo)
* WorkOrder = {WO}
* ReactorNo = {REACTOR}
* PSN = {PROD_SPEC_ID}
* If PSN NE '' then
* If ReactorNo EQ '' then
* ReactorNo = {SCHED_REACTOR}
* If ReactorNo EQ '' then
* ErrorMsg = 'No scheduled reactor found for work order: ':WorkOrder:'. Could not apply current ':@SVM |
* : 'run parameters. Please assign a reactor to this RDS first.'
* ErrMsg(ErrorMsg)
* return
* end
* end
* // Create a new TOOL_PARMS record, which is the "master" parameter record.
* Tool_Parms_Services('CreateToolParmsRec', PSN, ReactorNo, RDSNo)
* // Apply new TOOL_PARMS record to all RDS_LAYERS in this run without an unload signature.
* Tool_Parms_Services('ApplyCurrentRunParms', PSN, ReactorNo)
* If Error_Services('NoError') then
* Msg(@Window, '', 'SUCCESS', '', 'Run parameters have been set for reactor ':ReactorNo)
* end else
* Errmsg('Error setting run parameters. Error message: ':Error_Services('GetMessage'))
* end
* end else
* ErrorMsg = 'No PSN assigned to this RDS. Could not apply current ':@SVM |
* : 'run parameters. Please assign a PSN to this RDS first.'
* ErrMsg(ErrorMsg)
* return
* end
*
* end event
Event PUB_CONFIRM_PARMS.CLICK()
RDSNo = Get_Property(@Window:'.RDS_NO', 'TEXT')
@ -248,9 +161,11 @@ end event
ClearCursors:
For counter = 0 to 8
ClearSelect counter
Next counter
return
@ -348,11 +263,6 @@ Refresh:
Parameter_Styles = Send_Message( @WINDOW:'.RECIPE_PARMS', "COLSTYLE", 0, ParameterStyles )
LimitStyles = Send_Message( @WINDOW:'.RECIPE_LIMITS', "COLSTYLE", 0, LimitStyles )
* Set_Property( @WINDOW:'.RECIPE_INFO', "AUTOSIZECOL", 16 )
* Set_Property( @WINDOW:'.RECIPE_LIMITS', "AUTOSIZECOL", 16 )
* QBF buttons
Ctrls = @WINDOW:'.QBF_FIRST_FIX':@RM ; Props = 'ENABLED':@RM
@ -389,7 +299,6 @@ Refresh:
NEXT I
NEXT I
TestList = Get_Property(@WINDOW:'.RDS_TEST_KEYS','LIST')
FOR I = 1 TO COUNT(TestList,@FM) + (TestList NE '')
@ -400,14 +309,6 @@ Refresh:
END
NEXT I
* RPCopy = RecipeParms
* Convert @FM to '' in RPCopy
* If RPCopy EQ '' then
* Set_Property(@Window : '.BTN_SET_CURR_RUN_PARMS', 'ENABLED', False$)
* end else
* Set_Property(@Window : '.BTN_SET_CURR_RUN_PARMS', 'ENABLED', True$)
* end
IsTestWafer = Xlate('RDS', RDSNo, 'ON_TW_FREQ', 'X')
RDSLayerAck = RDSRec<RDS_RDS_LAYER_ACK$>
If ( (IsTestWafer EQ True$) and ( (RDSLayerAck EQ False$) or (RDSLayerAck EQ '') ) ) then