removed dead code
This commit is contained in:
parent
16c7bc6926
commit
803f946c7e
@ -581,171 +581,131 @@ Refresh:
|
||||
// RDS_UNLOAD
|
||||
|
||||
If @WINDOW EQ 'RDS_UNLOAD' then
|
||||
|
||||
DevelopmentFlag = Xlate('DEVELOPMENT', 'HGCV', 'STATUS', 'X')
|
||||
|
||||
CtrlName = @WINDOW:'.EDT_QA_MET'
|
||||
Set_Property(@Window : '.MET_TEST', 'VISIBLE', False$)
|
||||
Set_Property(CtrlName, 'VISIBLE', True$)
|
||||
MetList = Get_Property(CtrlName,'LIST')
|
||||
ThickOutOfSpec = False$
|
||||
CresOutOfSpec = False$
|
||||
MLCnt = COUNT(MetList,@FM) + (MetList NE '')
|
||||
FOR Line = 1 TO MLCnt
|
||||
IF MetList<Line,COL$UL_MET_TEST> NE '' THEN
|
||||
MetResult = MetList<Line,COL$UL_MET_RESULT>
|
||||
MetMin = MetList<Line,COL$UL_MET_MIN>
|
||||
MetMax = MetList<Line,COL$UL_MET_MAX>
|
||||
PhaseMin = MetList<Line,COL$UL_MET_PHASE_MIN>
|
||||
PhaseResult = MetList<Line,COL$UL_MET_PHASE_RESULT>
|
||||
ScanRecipe = MetList<Line,COL$UL_MET_RECIPE>
|
||||
PSN = Get_Property(@Window : '.PSN', 'TEXT')
|
||||
PRSStageKey = PSN:'*UNLOAD'
|
||||
MetTest = MetList<Line,COL$UL_MET_TEST>
|
||||
PRSStageRec = Database_Services('ReadDataRow', 'PRS_STAGE', PRSStageKey)
|
||||
SpecTests = PRSStageRec<PRS_STAGE_MET_TEST$>
|
||||
SpecRecipe = ''
|
||||
RDSNo = Get_Property(@Window:'.RDS_NO', 'TEXT')
|
||||
QAMetKey = Xlate('RDS', RDSNo, 'WO_MAT_KEY', 'X')
|
||||
WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', QAMetKey)
|
||||
DataPoints = WOMatQARec<WO_MAT_QA_DATA_POINTS$, Line>
|
||||
Begin Case
|
||||
Case MetTest EQ 'THICK_ONLY'
|
||||
// Check each point to see if any are out of spec
|
||||
For each DataPoint in DataPoints using @SVM setting ThickIndex
|
||||
Until DataPoint EQ ''
|
||||
Begin Case
|
||||
Case ThickIndex GT 10
|
||||
Null
|
||||
Case (DataPoint EQ '')
|
||||
ThickOutOfSpec = True$
|
||||
Case (DataPoint GT MetMax) OR (DataPoint LT MetMin)
|
||||
ThickOutOfSpec = True$
|
||||
End Case
|
||||
Next DataPoint
|
||||
|
||||
Case MetTest EQ 'CRES'
|
||||
// Check critical points to see if any are out of spec (both HgCV and Phase)
|
||||
CriticalPoints = '1,2,5,6,9'
|
||||
For each DataPoint in DataPoints using @SVM setting CresIndex
|
||||
Until DataPoint EQ ''
|
||||
HgCVDataPoint = DataPoint[1, 'F':@TM]
|
||||
PhaseDataPoint = DataPoint[-1, 'B':@TM]
|
||||
CriticalPoint = Index(CriticalPoints, CresIndex, 1)
|
||||
Begin Case
|
||||
Case (HgCVDataPoint EQ '') and CriticalPoint
|
||||
CresOutOfSpec = True$
|
||||
Case (PhaseDataPoint EQ '') and CriticalPoint
|
||||
CresOutOfSpec = True$
|
||||
Case (HgCVDataPoint GT MetMax) OR (HgCVDataPoint LT MetMin) and CriticalPoint
|
||||
CresOutOfSpec = True$
|
||||
Case (PhaseDataPoint LT PhaseMin) and CriticalPoint
|
||||
CresOutOfSpec = True$
|
||||
End Case
|
||||
Next DataPoint
|
||||
End Case
|
||||
QAMetOutofSpec = (ThickOutOfSpec or CresOutOfSpec)
|
||||
Locate MetTest in SpecTests using @VM setting vPos then
|
||||
SpecRecipe = PRSStageRec<PRS_STAGE_MET_RECIPE$, vPos>
|
||||
end
|
||||
NoError = True$
|
||||
|
||||
If (DevelopmentFlag EQ True$) then
|
||||
|
||||
CtrlName = @WINDOW:'.EDT_QA_MET'
|
||||
Set_Property(@Window : '.MET_TEST', 'VISIBLE', False$)
|
||||
Set_Property(CtrlName, 'VISIBLE', True$)
|
||||
MetList = Get_Property(CtrlName,'LIST')
|
||||
ThickOutOfSpec = False$
|
||||
CresOutOfSpec = False$
|
||||
MLCnt = COUNT(MetList,@FM) + (MetList NE '')
|
||||
FOR Line = 1 TO MLCnt
|
||||
IF MetList<Line,COL$UL_MET_TEST> NE '' THEN
|
||||
MetResult = MetList<Line,COL$UL_MET_RESULT>
|
||||
MetMin = MetList<Line,COL$UL_MET_MIN>
|
||||
MetMax = MetList<Line,COL$UL_MET_MAX>
|
||||
PhaseMin = MetList<Line,COL$UL_MET_PHASE_MIN>
|
||||
PhaseResult = MetList<Line,COL$UL_MET_PHASE_RESULT>
|
||||
ScanRecipe = MetList<Line,COL$UL_MET_RECIPE>
|
||||
PSN = Get_Property(@Window : '.PSN', 'TEXT')
|
||||
PRSStageKey = PSN:'*UNLOAD'
|
||||
MetTest = MetList<Line,COL$UL_MET_TEST>
|
||||
PRSStageRec = Database_Services('ReadDataRow', 'PRS_STAGE', PRSStageKey)
|
||||
SpecTests = PRSStageRec<PRS_STAGE_MET_TEST$>
|
||||
SpecRecipe = ''
|
||||
RDSNo = Get_Property(@Window:'.RDS_NO', 'TEXT')
|
||||
QAMetKey = Xlate('RDS', RDSNo, 'WO_MAT_KEY', 'X')
|
||||
WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', QAMetKey)
|
||||
DataPoints = WOMatQARec<WO_MAT_QA_DATA_POINTS$, Line>
|
||||
Begin Case
|
||||
Case MetTest EQ 'THICK_ONLY'
|
||||
// Check each point to see if any are out of spec
|
||||
For each DataPoint in DataPoints using @SVM setting ThickIndex
|
||||
Until DataPoint EQ ''
|
||||
Begin Case
|
||||
Case ThickIndex GT 10
|
||||
Null
|
||||
Case (DataPoint EQ '')
|
||||
ThickOutOfSpec = True$
|
||||
Case (DataPoint GT MetMax) OR (DataPoint LT MetMin)
|
||||
ThickOutOfSpec = True$
|
||||
End Case
|
||||
Next DataPoint
|
||||
|
||||
Case MetTest EQ 'CRES'
|
||||
// Check critical points to see if any are out of spec (both HgCV and Phase)
|
||||
CriticalPoints = '1,2,5,6,9'
|
||||
For each DataPoint in DataPoints using @SVM setting CresIndex
|
||||
Until DataPoint EQ ''
|
||||
HgCVDataPoint = DataPoint[1, 'F':@TM]
|
||||
PhaseDataPoint = DataPoint[-1, 'B':@TM]
|
||||
CriticalPoint = Index(CriticalPoints, CresIndex, 1)
|
||||
Begin Case
|
||||
Case (HgCVDataPoint EQ '') and CriticalPoint
|
||||
CresOutOfSpec = True$
|
||||
Case (PhaseDataPoint EQ '') and CriticalPoint
|
||||
CresOutOfSpec = True$
|
||||
Case (HgCVDataPoint GT MetMax) OR (HgCVDataPoint LT MetMin) and CriticalPoint
|
||||
CresOutOfSpec = True$
|
||||
Case (PhaseDataPoint LT PhaseMin) and CriticalPoint
|
||||
CresOutOfSpec = True$
|
||||
End Case
|
||||
Next DataPoint
|
||||
End Case
|
||||
QAMetOutofSpec = (ThickOutOfSpec or CresOutOfSpec)
|
||||
Locate MetTest in SpecTests using @VM setting vPos then
|
||||
SpecRecipe = PRSStageRec<PRS_STAGE_MET_RECIPE$, vPos>
|
||||
end
|
||||
NoError = True$
|
||||
|
||||
If (MetList<Line,COL$UL_MET_RESULT> EQ '') then
|
||||
Color = YELLOW$
|
||||
stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RESULT, Line, Color)
|
||||
NoError = False$
|
||||
end
|
||||
|
||||
If QAMetOutofSpec EQ True$ then
|
||||
Color = BYELLOW$:@FM:BLACK$:@FM:BYELLOW$:@FM:BLACK$
|
||||
stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RESULT, Line, Color)
|
||||
NoError = False$
|
||||
end
|
||||
|
||||
If (MetResult LT MetMin) then
|
||||
Color = RED$:@FM:'':@FM:BRED$:@FM:''
|
||||
stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RESULT, Line, Color)
|
||||
NoError = False$
|
||||
end
|
||||
|
||||
If (MetResult GT MetMax) then
|
||||
Color = RED$:@FM:'':@FM:BRED$:@FM:''
|
||||
stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RESULT, Line, Color)
|
||||
NoError = False$
|
||||
end
|
||||
|
||||
If (PhaseResult LT PhaseMin) then
|
||||
Color = RED$:@FM:'':@FM:BRED$:@FM:''
|
||||
stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_PHASE_RESULT, Line, Color)
|
||||
NoError = False$
|
||||
end
|
||||
|
||||
QAFailReason = WOMatQARec<WO_MAT_QA_FAIL_REASON$, Line>
|
||||
DetectedFail = Index(QAFailReason, 'Number of data points is less than the required amount', 1)
|
||||
If (ScanRecipe NE SpecRecipe) OR (DetectedFail) then
|
||||
Color = RED$:@FM:'':@FM:BRED$:@FM:''
|
||||
stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RECIPE, Line, Color)
|
||||
NoError = False$
|
||||
end
|
||||
|
||||
If (NoError EQ True$) then
|
||||
Color = GREEN$
|
||||
stat = Send_Message(CtrlName,'COLOR_BY_POS',0,Line,Color)
|
||||
end
|
||||
|
||||
END ELSE
|
||||
Color = GREEN$
|
||||
stat = Send_Message(CtrlName,'COLOR_BY_POS',0,Line,Color)
|
||||
END
|
||||
|
||||
NEXT Line
|
||||
|
||||
Set_Property(@WINDOW:'.BUTTON_11','ENABLED',EnableUnloadButton)
|
||||
|
||||
IF MemberOf(@USER4, 'OI_ADMIN') THEN
|
||||
Set_Property(@WINDOW:'.CLEAR_EPI_UNLOAD','VISIBLE',1)
|
||||
END ELSE
|
||||
Set_Property(@WINDOW:'.CLEAR_EPI_UNLOAD','VISIBLE',0)
|
||||
END
|
||||
|
||||
|
||||
end else
|
||||
|
||||
CtrlName = @WINDOW:'.MET_TEST'
|
||||
Set_Property(@Window : '.EDT_QA_MET', 'VISIBLE', False$)
|
||||
Set_Property(CtrlName, 'VISIBLE', True$)
|
||||
MetList = Get_Property(CtrlName,'LIST')
|
||||
|
||||
MLCnt = COUNT(MetList,@FM) + (MetList NE '')
|
||||
FOR Line = 1 TO MLCnt
|
||||
IF MetList<Line,COL$MET_TEST> NE '' THEN
|
||||
BEGIN CASE
|
||||
CASE MetList<Line,COL$MET_RESULT> = ''
|
||||
Color = YELLOW$
|
||||
CASE MetList<Line,COL$MET_RESULT> < MetList<Line,COL$MET_MIN> OR MetList<Line,COL$MET_RESULT> > MetList<Line,COL$MET_MAX>
|
||||
Color = RED$
|
||||
CASE 1
|
||||
Color = GREEN$
|
||||
END CASE
|
||||
|
||||
END ELSE
|
||||
Color = GREEN$
|
||||
END;* End of check for Met Test on the current line
|
||||
|
||||
stat = Send_Message(CtrlName,'COLOR_BY_POS',0,Line,Color)
|
||||
NEXT Line
|
||||
|
||||
Set_Property(@WINDOW:'.BUTTON_11','ENABLED',EnableUnloadButton)
|
||||
|
||||
IF MemberOf(@USER4, 'OI_ADMIN') THEN
|
||||
Set_Property(@WINDOW:'.CLEAR_EPI_UNLOAD','VISIBLE',1)
|
||||
END ELSE
|
||||
Set_Property(@WINDOW:'.CLEAR_EPI_UNLOAD','VISIBLE',0)
|
||||
END
|
||||
end
|
||||
end
|
||||
If (MetList<Line,COL$UL_MET_RESULT> EQ '') then
|
||||
Color = YELLOW$
|
||||
stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RESULT, Line, Color)
|
||||
NoError = False$
|
||||
end
|
||||
|
||||
If QAMetOutofSpec EQ True$ then
|
||||
Color = BYELLOW$:@FM:BLACK$:@FM:BYELLOW$:@FM:BLACK$
|
||||
stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RESULT, Line, Color)
|
||||
NoError = False$
|
||||
end
|
||||
|
||||
If (MetResult LT MetMin) then
|
||||
Color = RED$:@FM:'':@FM:BRED$:@FM:''
|
||||
stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RESULT, Line, Color)
|
||||
NoError = False$
|
||||
end
|
||||
|
||||
If (MetResult GT MetMax) then
|
||||
Color = RED$:@FM:'':@FM:BRED$:@FM:''
|
||||
stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RESULT, Line, Color)
|
||||
NoError = False$
|
||||
end
|
||||
|
||||
If (PhaseResult LT PhaseMin) then
|
||||
Color = RED$:@FM:'':@FM:BRED$:@FM:''
|
||||
stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_PHASE_RESULT, Line, Color)
|
||||
NoError = False$
|
||||
end
|
||||
|
||||
QAFailReason = WOMatQARec<WO_MAT_QA_FAIL_REASON$, Line>
|
||||
DetectedFail = Index(QAFailReason, 'Number of data points is less than the required amount', 1)
|
||||
If (ScanRecipe NE SpecRecipe) OR (DetectedFail) then
|
||||
Color = RED$:@FM:'':@FM:BRED$:@FM:''
|
||||
stat = Send_Message(CtrlName, 'COLOR_BY_POS', COL$UL_MET_RECIPE, Line, Color)
|
||||
NoError = False$
|
||||
end
|
||||
|
||||
If (NoError EQ True$) then
|
||||
Color = GREEN$
|
||||
stat = Send_Message(CtrlName,'COLOR_BY_POS',0,Line,Color)
|
||||
end
|
||||
|
||||
END ELSE
|
||||
Color = GREEN$
|
||||
stat = Send_Message(CtrlName,'COLOR_BY_POS',0,Line,Color)
|
||||
END
|
||||
|
||||
NEXT Line
|
||||
|
||||
Set_Property(@WINDOW:'.BUTTON_11','ENABLED',EnableUnloadButton)
|
||||
|
||||
IF MemberOf(@USER4, 'OI_ADMIN') THEN
|
||||
Set_Property(@WINDOW:'.CLEAR_EPI_UNLOAD','VISIBLE',1)
|
||||
END ELSE
|
||||
Set_Property(@WINDOW:'.CLEAR_EPI_UNLOAD','VISIBLE',0)
|
||||
END
|
||||
end
|
||||
* End of check for Unload OR Post_Epi windows
|
||||
|
||||
****************************************************************************************************************************************
|
||||
@ -2669,9 +2629,8 @@ MetTestDC:
|
||||
Lines = Get_Property(@WINDOW:'.MET_TEST', 'LIST')
|
||||
TestLine = Lines<CurrRow>
|
||||
LWRHOTest = Indexc(TestLine, 'LW_RHO', 1)
|
||||
DevelopmentFlag = Xlate('DEVELOPMENT', 'HGCV', 'STATUS', 'X')
|
||||
|
||||
If (DevelopmentFlag EQ True$) and (@Window EQ 'RDS_UNLOAD') and (LWRHOTest EQ False$) then
|
||||
If (@Window EQ 'RDS_UNLOAD') and (LWRHOTest EQ False$) then
|
||||
Ctrls := @WINDOW:'.EDT_QA_MET':@RM ; Props := 'SELPOS':@RM
|
||||
Ctrls := @WINDOW:'.EDT_QA_MET' ; Props := 'LIST'
|
||||
end else
|
||||
@ -2708,8 +2667,7 @@ MetTestDC:
|
||||
BEGIN CASE
|
||||
CASE MetTest EQ ''
|
||||
Null
|
||||
|
||||
CASE (@WINDOW = 'RDS_UNLOAD') and (DevelopmentFlag EQ True$) and (LWRHOTest EQ False$)
|
||||
CASE (@WINDOW = 'RDS_UNLOAD') and (LWRHOTest EQ False$)
|
||||
ReturnVal = Dialog_Box('NDW_QA_MET_RESULT', @WINDOW, CassID)
|
||||
Send_Event(@Window, "READ")
|
||||
CASE Otherwise$
|
||||
@ -2863,57 +2821,47 @@ return
|
||||
|
||||
RefreshWaferCounterData:
|
||||
|
||||
WCCheckEnabled = Xlate('APP_INFO', 'WAFER_COUNTER_CHECK', '', 'X')
|
||||
If WCCheckEnabled then
|
||||
|
||||
Set_Property(@Window:'.LBL_WAFER_COUNTER_QTY', 'VISIBLE', True$)
|
||||
Set_Property(@Window:'.EDL_WAFER_COUNTER_QTY', 'VISIBLE', True$)
|
||||
QtyBackColor = GREEN$
|
||||
RDSNo = Get_Property(@Window : '.RDS_NO','DEFPROP')
|
||||
If RDSNo NE '' then
|
||||
FqaWcRec = Wafer_Counter_Services('GetLastScan', RDSNo, 'QA')
|
||||
WaferCounterQty = FqaWcRec<WAFER_COUNTER.SCAN_QTY$>
|
||||
Set_Property(@Window, '@ORIG_WFR_CTR_QTY', WaferCounterQty)
|
||||
WafersOut = Get_Property(@WINDOW:'.WAFERS_OUT','TEXT')
|
||||
Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','DEFPROP', WaferCounterQty)
|
||||
Set_Property(@Window:'.LBL_WAFER_COUNTER_QTY', 'VISIBLE', True$)
|
||||
Set_Property(@Window:'.EDL_WAFER_COUNTER_QTY', 'VISIBLE', True$)
|
||||
QtyBackColor = GREEN$
|
||||
RDSNo = Get_Property(@Window : '.RDS_NO','DEFPROP')
|
||||
If RDSNo NE '' then
|
||||
FqaWcRec = Wafer_Counter_Services('GetLastScan', RDSNo, 'QA')
|
||||
WaferCounterQty = FqaWcRec<WAFER_COUNTER.SCAN_QTY$>
|
||||
Set_Property(@Window, '@ORIG_WFR_CTR_QTY', WaferCounterQty)
|
||||
WafersOut = Get_Property(@WINDOW:'.WAFERS_OUT','TEXT')
|
||||
Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','DEFPROP', WaferCounterQty)
|
||||
|
||||
*****************************************
|
||||
* WaferCounter - Wafers Quantity Section *
|
||||
*****************************************
|
||||
If (WaferCounterQty NE '') then
|
||||
If (WaferCounterQty NE WafersOut) then QtyBackColor = RED$
|
||||
end else
|
||||
QtyBackColor = ORANGE$
|
||||
end
|
||||
|
||||
WaferSize = Xlate('RDS', RDSNo, 'WAFER_SIZE', 'X')
|
||||
WaferSize = Field(WaferSize, ' ', 3, 1)
|
||||
If ( (WaferSize EQ 6) or (WaferSize EQ 8) ) then
|
||||
WCToolId = Wafer_Counter_Services('GetWaferCounterToolID', WaferSize:'INCH', 'QA')
|
||||
If Error_Services('NoError') then
|
||||
WCCurrMode = ''
|
||||
If RowExists('TOOL', WCToolID) then
|
||||
WCCurrModeKey = Xlate('TOOL', WCToolID, 'CURR_MODE_KEY', 'X')
|
||||
WCCurrMode = Xlate('TOOL_LOG', WCCurrModeKey, 'TOOL_MODE', 'X')
|
||||
Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY', 'ENABLED', (WCCurrMode NE 'PROD'))
|
||||
end else
|
||||
ErrMsg('Verify wafer count error. Invalid wafer counter tool ID "':WCToolID:'".')
|
||||
end
|
||||
*****************************************
|
||||
* WaferCounter - Wafers Quantity Section *
|
||||
*****************************************
|
||||
If (WaferCounterQty NE '') then
|
||||
If (WaferCounterQty NE WafersOut) then QtyBackColor = RED$
|
||||
end else
|
||||
QtyBackColor = ORANGE$
|
||||
end
|
||||
|
||||
WaferSize = Xlate('RDS', RDSNo, 'WAFER_SIZE', 'X')
|
||||
WaferSize = Field(WaferSize, ' ', 3, 1)
|
||||
If ( (WaferSize EQ 6) or (WaferSize EQ 8) ) then
|
||||
WCToolId = Wafer_Counter_Services('GetWaferCounterToolID', WaferSize:'INCH', 'QA')
|
||||
If Error_Services('NoError') then
|
||||
WCCurrMode = ''
|
||||
If RowExists('TOOL', WCToolID) then
|
||||
WCCurrModeKey = Xlate('TOOL', WCToolID, 'CURR_MODE_KEY', 'X')
|
||||
WCCurrMode = Xlate('TOOL_LOG', WCCurrModeKey, 'TOOL_MODE', 'X')
|
||||
Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY', 'ENABLED', (WCCurrMode NE 'PROD'))
|
||||
end else
|
||||
ErrMsg(Error_Services('GetMessage'))
|
||||
ErrMsg('Verify wafer count error. Invalid wafer counter tool ID "':WCToolID:'".')
|
||||
end
|
||||
end else
|
||||
ErrMsg('Verify wafer count error. Invalid wafer size "':WaferSize:'" returned for RDS "':RDSNo:'".')
|
||||
end
|
||||
end
|
||||
Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','BACKCOLOR', QtyBackColor)
|
||||
|
||||
end else
|
||||
Set_Property(@Window:'.EDL_WAFER_COUNTER_QTY', 'VISIBLE', False$)
|
||||
Set_Property(@Window:'.LBL_WAFER_COUNTER_QTY', 'VISIBLE', False$)
|
||||
end
|
||||
ErrMsg(Error_Services('GetMessage'))
|
||||
end
|
||||
end else
|
||||
ErrMsg('Verify wafer count error. Invalid wafer size "':WaferSize:'" returned for RDS "':RDSNo:'".')
|
||||
end
|
||||
end
|
||||
Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','BACKCOLOR', QtyBackColor)
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
||||
|
@ -1107,29 +1107,25 @@ SignSupVer:
|
||||
END
|
||||
END
|
||||
|
||||
WCCheckEnabled = Xlate('APP_INFO', 'WAFER_COUNTER_CHECK', '', 'X')
|
||||
If WCCheckEnabled then
|
||||
|
||||
****************************************
|
||||
* Verify the Wafer Counter information *
|
||||
****************************************
|
||||
****************************************
|
||||
* Verify the Wafer Counter information *
|
||||
****************************************
|
||||
|
||||
WafersOut = Get_Property(@WINDOW:'.WAFER_CNT','TEXT')
|
||||
WaferCounterQty = Get_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','DEFPROP')
|
||||
|
||||
************************************
|
||||
* Wafer Counter - Quantity Section *
|
||||
************************************
|
||||
If (WaferCounterQty NE '') then
|
||||
If (WaferCounterQty NE WafersOut) then
|
||||
ErrMsg('Unable to sign FQA because Wafer Counter and Wafers Filled quantities do not match.')
|
||||
RETURN 0
|
||||
end
|
||||
end else
|
||||
ErrMsg('Unable to sign FQA because the Wafer Counter quantity is missing.')
|
||||
RETURN 0
|
||||
end
|
||||
end
|
||||
WafersOut = Get_Property(@WINDOW:'.WAFER_CNT','TEXT')
|
||||
WaferCounterQty = Get_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','DEFPROP')
|
||||
|
||||
************************************
|
||||
* Wafer Counter - Quantity Section *
|
||||
************************************
|
||||
If (WaferCounterQty NE '') then
|
||||
If (WaferCounterQty NE WafersOut) then
|
||||
ErrMsg('Unable to sign FQA because Wafer Counter and Wafers Filled quantities do not match.')
|
||||
RETURN 0
|
||||
end
|
||||
end else
|
||||
ErrMsg('Unable to sign FQA because the Wafer Counter quantity is missing.')
|
||||
RETURN 0
|
||||
end
|
||||
|
||||
**************************
|
||||
* Verify user's password *
|
||||
@ -2293,58 +2289,50 @@ return
|
||||
|
||||
|
||||
RefreshWaferCounterData:
|
||||
|
||||
WCCheckEnabled = Xlate('APP_INFO', 'WAFER_COUNTER_CHECK', '', 'X')
|
||||
If WCCheckEnabled then
|
||||
|
||||
Set_Property(@Window:'.LBL_WAFER_COUNTER_QTY', 'VISIBLE', True$)
|
||||
Set_Property(@Window:'.EDL_WAFER_COUNTER_QTY', 'VISIBLE', True$)
|
||||
QtyBackColor = GREEN$
|
||||
WONo = Get_Property(@Window : '.WO_NO', 'TEXT')
|
||||
Cassette = Get_Property(@Window : '.OUT_CASS_NO', 'TEXT')
|
||||
WMOKey = WONo:'*1*':Cassette
|
||||
If WMOKey NE '*1*' then
|
||||
FqaWcRec = Wafer_Counter_Services('GetLastScan', WMOKey, 'QA')
|
||||
WaferCounterQty = FqaWcRec<WAFER_COUNTER.SCAN_QTY$>
|
||||
Set_Property(@Window, '@ORIG_WFR_CTR_QTY', WaferCounterQty)
|
||||
WafersFilled = Get_Property(@WINDOW:'.WAFER_CNT','TEXT')
|
||||
Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','DEFPROP', WaferCounterQty)
|
||||
|
||||
************************************
|
||||
* Wafer Counter - Quantity Section *
|
||||
************************************
|
||||
If (WaferCounterQty NE '') then
|
||||
If (WaferCounterQty NE WafersFilled) then QtyBackColor = RED$
|
||||
end else
|
||||
QtyBackColor = ORANGE$
|
||||
end
|
||||
WaferSize = Xlate('WM_OUT', WMOKey, 'WAFER_SIZE', 'X')
|
||||
WaferSize = Field(WaferSize, ' ', 3, 1)
|
||||
If ( (WaferSize EQ 6) or (WaferSize EQ 8) ) then
|
||||
WCToolId = Wafer_Counter_Services('GetWaferCounterToolID', WaferSize:'INCH', 'QA')
|
||||
If Error_Services('NoError') then
|
||||
WCCurrMode = ''
|
||||
If RowExists('TOOL', WCToolID) then
|
||||
WCCurrModeKey = Xlate('TOOL', WCToolID, 'CURR_MODE_KEY', 'X')
|
||||
WCCurrMode = Xlate('TOOL_LOG', WCCurrModeKey, 'TOOL_MODE', 'X')
|
||||
Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY', 'ENABLED', (WCCurrMode NE 'PROD'))
|
||||
end else
|
||||
ErrMsg('Verify wafer count error. Invalid wafer counter tool ID "':WCToolID:'".')
|
||||
end
|
||||
Set_Property(@Window:'.LBL_WAFER_COUNTER_QTY', 'VISIBLE', True$)
|
||||
Set_Property(@Window:'.EDL_WAFER_COUNTER_QTY', 'VISIBLE', True$)
|
||||
QtyBackColor = GREEN$
|
||||
WONo = Get_Property(@Window : '.WO_NO', 'TEXT')
|
||||
Cassette = Get_Property(@Window : '.OUT_CASS_NO', 'TEXT')
|
||||
WMOKey = WONo:'*1*':Cassette
|
||||
If WMOKey NE '*1*' then
|
||||
FqaWcRec = Wafer_Counter_Services('GetLastScan', WMOKey, 'QA')
|
||||
WaferCounterQty = FqaWcRec<WAFER_COUNTER.SCAN_QTY$>
|
||||
Set_Property(@Window, '@ORIG_WFR_CTR_QTY', WaferCounterQty)
|
||||
WafersFilled = Get_Property(@WINDOW:'.WAFER_CNT','TEXT')
|
||||
Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','DEFPROP', WaferCounterQty)
|
||||
|
||||
************************************
|
||||
* Wafer Counter - Quantity Section *
|
||||
************************************
|
||||
If (WaferCounterQty NE '') then
|
||||
If (WaferCounterQty NE WafersFilled) then QtyBackColor = RED$
|
||||
end else
|
||||
QtyBackColor = ORANGE$
|
||||
end
|
||||
WaferSize = Xlate('WM_OUT', WMOKey, 'WAFER_SIZE', 'X')
|
||||
WaferSize = Field(WaferSize, ' ', 3, 1)
|
||||
If ( (WaferSize EQ 6) or (WaferSize EQ 8) ) then
|
||||
WCToolId = Wafer_Counter_Services('GetWaferCounterToolID', WaferSize:'INCH', 'QA')
|
||||
If Error_Services('NoError') then
|
||||
WCCurrMode = ''
|
||||
If RowExists('TOOL', WCToolID) then
|
||||
WCCurrModeKey = Xlate('TOOL', WCToolID, 'CURR_MODE_KEY', 'X')
|
||||
WCCurrMode = Xlate('TOOL_LOG', WCCurrModeKey, 'TOOL_MODE', 'X')
|
||||
Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY', 'ENABLED', (WCCurrMode NE 'PROD'))
|
||||
end else
|
||||
ErrMsg(Error_Services('GetMessage'))
|
||||
ErrMsg('Verify wafer count error. Invalid wafer counter tool ID "':WCToolID:'".')
|
||||
end
|
||||
end else
|
||||
ErrMsg('Verify wafer count error. Invalid wafer size "':WaferSize:'" returned for WMO "':WMOKey:'".')
|
||||
ErrMsg(Error_Services('GetMessage'))
|
||||
end
|
||||
end
|
||||
end else
|
||||
ErrMsg('Verify wafer count error. Invalid wafer size "':WaferSize:'" returned for WMO "':WMOKey:'".')
|
||||
end
|
||||
end
|
||||
|
||||
Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','BACKCOLOR', QtyBackColor)
|
||||
|
||||
Set_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','BACKCOLOR', QtyBackColor)
|
||||
|
||||
end else
|
||||
Set_Property(@Window:'.LBL_WAFER_COUNTER_QTY', 'VISIBLE', False$)
|
||||
Set_Property(@Window:'.EDL_WAFER_COUNTER_QTY', 'VISIBLE', False$)
|
||||
end
|
||||
|
||||
return
|
||||
|
||||
|
@ -881,24 +881,19 @@ Event SIGN_BUTTON.CLICK()
|
||||
******************************************
|
||||
* Verify Unload Stage QA Metrology Tests *
|
||||
******************************************
|
||||
|
||||
DevelopmentFlag = Xlate('DEVELOPMENT', 'HGCV', 'STATUS', 'X')
|
||||
|
||||
If (DevelopmentFlag EQ True$) then
|
||||
WOMatQAKey = WONo : '*' : CassNo
|
||||
WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatQAKey)
|
||||
OutOfSpec = WOMatQARec<WO_MAT_QA_OUT_OF_SPEC$>
|
||||
OutOfSpec = Sum(OutOfSpec)
|
||||
If OutOfSpec GT 0 then
|
||||
FailReasons = WOMatQARec<WO_MAT_QA_FAIL_REASON$>
|
||||
ErrorMsg = 'Process Error':@SVM
|
||||
For each FailReason in FailReasons using @VM
|
||||
ErrorMsg := FailReason:CRLF$
|
||||
Next FailReason
|
||||
ErrMsg(ErrorMsg)
|
||||
Return
|
||||
end
|
||||
end
|
||||
WOMatQAKey = WONo : '*' : CassNo
|
||||
WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatQAKey)
|
||||
OutOfSpec = WOMatQARec<WO_MAT_QA_OUT_OF_SPEC$>
|
||||
OutOfSpec = Sum(OutOfSpec)
|
||||
If OutOfSpec GT 0 then
|
||||
FailReasons = WOMatQARec<WO_MAT_QA_FAIL_REASON$>
|
||||
ErrorMsg = 'Process Error':@SVM
|
||||
For each FailReason in FailReasons using @VM
|
||||
ErrorMsg := FailReason:CRLF$
|
||||
Next FailReason
|
||||
ErrMsg(ErrorMsg)
|
||||
Return
|
||||
end
|
||||
|
||||
*******************************************
|
||||
* Verify if all steps have been completed *
|
||||
@ -1965,7 +1960,3 @@ ClearForm:
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -388,6 +388,7 @@ end service
|
||||
// Looks for available Metrology files that are ready to be imported into the MES system.
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
Service ImportMetrologyFiles(Machine)
|
||||
|
||||
If Machine NE '' then
|
||||
hSysLists = Database_Services('GetTableHandle', 'SYSLISTS')
|
||||
Lock hSysLists, ServiceKeyID:'*':Machine then
|
||||
@ -935,14 +936,8 @@ Service ImportBioRadData(RunData, FileName)
|
||||
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSKeyID)
|
||||
If Error_Services('NoError') then
|
||||
WorkOrderNo = RDSRec<RDS_WO$>
|
||||
|
||||
// HgCV Project Development Code -------------------------------------------------------------------------------
|
||||
DevelopmentFlag = Xlate('DEVELOPMENT', 'HGCV', 'STATUS', 'X')
|
||||
If (DevelopmentFlag EQ True$) then
|
||||
IsProdTest = ( Indexc(ScanRecipe, 'PROD', 1) GT 0 )
|
||||
If IsProdTest EQ True$ then Metrology_Services('LogResults',RDSKeyID,Machine,'HgCV','Product test recognized. Recipe name: ':ScanRecipe)
|
||||
end
|
||||
// -------------------------------------------------------------------------------------------------------------
|
||||
IsProdTest = ( Indexc(ScanRecipe, 'PROD', 1) GT 0 )
|
||||
If IsProdTest EQ True$ then Metrology_Services('LogResults',RDSKeyID,Machine,'HgCV','Product test recognized. Recipe name: ':ScanRecipe)
|
||||
CassNo = RDSRec<RDS_CASS_NO$>
|
||||
WorkOrder = Work_Order_Services('GetWorkOrder', WorkOrderNo, False$)
|
||||
GoSub ParseWorkOrder
|
||||
@ -1288,14 +1283,9 @@ Service ImportCDEData(RunData, FileName)
|
||||
RDSNo@ = RDSKeyID
|
||||
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSKeyID)
|
||||
If Error_Services('NoError') then
|
||||
|
||||
// HgCV Project Development Code -------------------------------------------------------------------------------
|
||||
DevelopmentFlag = Xlate('DEVELOPMENT', 'HGCV', 'STATUS', 'X')
|
||||
If (DevelopmentFlag EQ True$) then
|
||||
IsProdTest = ( Indexc(ScanRecipe, 'PROD', 1) GT 0 )
|
||||
If IsProdTest EQ True$ then Metrology_Services('LogResults',RDSKeyID,Machine,'HgCV','Product test recognized. Recipe name: ':ScanRecipe)
|
||||
end
|
||||
// -------------------------------------------------------------------------------------------------------------
|
||||
|
||||
IsProdTest = ( Indexc(ScanRecipe, 'PROD', 1) GT 0 )
|
||||
If IsProdTest EQ True$ then Metrology_Services('LogResults',RDSKeyID,Machine,'HgCV','Product test recognized. Recipe name: ':ScanRecipe)
|
||||
|
||||
WorkOrderNo = RDSRec<RDS_WO$>
|
||||
CassNo = RDSRec<RDS_CASS_NO$>
|
||||
@ -3253,5 +3243,3 @@ LoadRunDataToDatabase:
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
||||
|
@ -229,12 +229,6 @@ Service CalculateHgCVData(Datapoints)
|
||||
Min = Min(Min, DataPoint)
|
||||
Max = Max(Max, DataPoint)
|
||||
// Edge Mean Delta
|
||||
* If Index GE 6 AND Index LE 9 then
|
||||
* Delta1 = Delta1 + DataPoint
|
||||
* end
|
||||
* If Index GE 2 AND Index LE 5 then
|
||||
* Delta2 = Delta2 + DataPoint
|
||||
* end
|
||||
end
|
||||
// Range %
|
||||
Locate Index in RangePoints using ',' setting unusedIndex then
|
||||
@ -256,25 +250,15 @@ Service CalculateHgCVData(Datapoints)
|
||||
EdgeMean4mm = Edge4mmSum / 4
|
||||
EdgeMean10mm = Edge10mmSum / 4
|
||||
If EdgeMean10mm GT 0 then
|
||||
* Delta1Avg = Delta1/4
|
||||
* Delta2Avg = Delta2/4
|
||||
EdgeMeanDelta = ( (Edge4mmSum - Edge10mmSum) / Edge10mmSum) * 100 ; // Changed divisor to Delta2Avg to match SPC - DJS
|
||||
|
||||
// Range %
|
||||
Range = RangeMax - RangeMin
|
||||
NumRangePoints = DCount(RangePoints, ',')
|
||||
RangeAvg = RangeAvg / NumRangePoints
|
||||
RangePct = (Range / RangeAvg) * 100
|
||||
|
||||
* EdgeMeanDelta = OConv(IConv(EdgeMeanDelta, 'MD3L'), 'MD3L')
|
||||
* RangePct = OConv(IConv(RangePct, 'MD3L'), 'MD3L')
|
||||
end
|
||||
// Average
|
||||
Average = Sum / NumDataPoints
|
||||
* Average = OConv(IConv(Average, 'MD3L'), 'MD3L')
|
||||
* Min = OConv(IConv(Min, 'MD3L'), 'MD3L')
|
||||
* Max = OConv(IConv(Max, 'MD3L'), 'MD3L')
|
||||
|
||||
|
||||
Average = Sum / NumDataPoints
|
||||
FullAvg = ''
|
||||
TotalDataPoints = DCount(DataPoints, @VM)
|
||||
If TotalDataPoints GT 0 then FullAvg = Sum(DataPoints)/DCount(DataPoints, @VM)
|
||||
@ -361,25 +345,18 @@ Service PostROTRRequest(RDSNo)
|
||||
If Flag EQ 0 then
|
||||
If RequestKeyID EQ '' then
|
||||
WOMatKey = Xlate('RDS', RDSNo, 'WO_MAT_KEY', 'X')
|
||||
FinalSigComp = False$
|
||||
* FinalSigComp = Signature_Services('FinalSigComp', WOMatKey)
|
||||
If FinalSigComp NE True$ then
|
||||
// This is a new request
|
||||
RequestDate = Date()
|
||||
RequestTime = Time()
|
||||
RequestKeyID = RDSNo:'*':RequestDate :'*':RequestTime
|
||||
RequestRow = ''
|
||||
Database_Services('WriteDataRow', 'ROTR_REQUESTS', RequestKeyID, RequestRow, True$, False$, True$)
|
||||
If Error_Services('NoError') then
|
||||
// Log success
|
||||
LogData<3> = 'Successfully posted ROTR request for ':RDSNo:'.'
|
||||
Logging_Services('AppendLog', objErrorLog, LogData, @RM, @FM)
|
||||
end else
|
||||
ErrorMessage = Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMessage = 'FQA signed for RDS ':RDSNo:' ignoring ROTR request.'
|
||||
end
|
||||
RequestDate = Date()
|
||||
RequestTime = Time()
|
||||
RequestKeyID = RDSNo:'*':RequestDate :'*':RequestTime
|
||||
RequestRow = ''
|
||||
Database_Services('WriteDataRow', 'ROTR_REQUESTS', RequestKeyID, RequestRow, True$, False$, True$)
|
||||
If Error_Services('NoError') then
|
||||
// Log success
|
||||
LogData<3> = 'Successfully posted ROTR request for ':RDSNo:'.'
|
||||
Logging_Services('AppendLog', objErrorLog, LogData, @RM, @FM)
|
||||
end else
|
||||
ErrorMessage = Error_Services('GetMessage')
|
||||
end
|
||||
end else
|
||||
ErrorMessage = 'Duplicate request found for RDS ':RDSNo:'. Request ignored.'
|
||||
end
|
||||
@ -509,14 +486,7 @@ Service ProcessROTRRequest(RDSNo)
|
||||
ResponseCopy = Response
|
||||
Swap @FM with ',' in ResponseCopy
|
||||
LogData<3> = 'ROTR Status response: ':Response
|
||||
Logging_Services('AppendLog', objErrorLog, LogData, @RM, @FM)
|
||||
* ROTRRec = ''
|
||||
* ROTRRec<ROTR.REACTOR_STATUS$> = Response<1>
|
||||
* ROTRRec<ROTR.REACTOR_STATUS_REASON$> = Response<2>
|
||||
* ROTRRec<ROTR.REACTOR_NCR_COUNT$> = Response<3>
|
||||
* ROTRRec<ROTR.REACTOR_ZERO_NCR_RUN_COUNT$> = Response<4>
|
||||
* ROTRRec<ROTR.REACTOR_UCL_EXCEEDED_RUN_COUNT$> = Response<5>
|
||||
* Database_Services('WriteDataRow', 'ROTR', LWICINo, ROTRRec, True$, False$, True$)
|
||||
Logging_Services('AppendLog', objErrorLog, LogData, @RM, @FM)
|
||||
CIRec<CLEAN_INSP_ROTR_REACTOR_STATUS$> = Response<1>
|
||||
CIRec<CLEAN_INSP_ROTR_REACTOR_STATUS_REASON$> = Response<2>
|
||||
CIRec<CLEAN_INSP_ROTR_REACTOR_NCR_COUNT$> = Response<3>
|
||||
@ -524,7 +494,6 @@ Service ProcessROTRRequest(RDSNo)
|
||||
CIRec<CLEAN_INSP_ROTR_REACTOR_UCL_EXCEEDED_RUN_COUNT$> = Response<5>
|
||||
// Set ROTR Update Flag to trigger CLEAN_INSP_ACTIONS routine (via BASE_MFS).
|
||||
// That routine will recalculate the final ROTR status.
|
||||
* CIRec<CLEAN_INSP_ROTR_UPDATE_FLAG$> = True$
|
||||
Database_Services('WriteDataRow', 'CLEAN_INSP', LWICINo, CIRec, True$, False$, True$)
|
||||
end else
|
||||
ErrorMessage = 'Error in service ':Service:'. Failed to retrieve ROTR status. Error message: ':Error_Services('GetMessage')
|
||||
@ -569,6 +538,7 @@ end service
|
||||
//
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
Service GetROTRStatus(RDSKey)
|
||||
|
||||
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSKey)
|
||||
WONo = RDSRec<RDS_WO$>
|
||||
RDSCassNo = RDSRec<RDS_CASS_NO$>
|
||||
@ -1287,100 +1257,6 @@ Service ProcessWaferImageRequests()
|
||||
end service
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
// ProcessWaferImageRequests
|
||||
//
|
||||
// Service that attempts to process all wafer map image requests. These requests are queued in the
|
||||
// WAFER_IMAGE_REQUESTS table.
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
Service ProcessWaferImageRequestsOld()
|
||||
|
||||
hSysLists = Database_Services('GetTableHandle', 'SYSLISTS')
|
||||
Lock hSysLists, ServiceKeyID then
|
||||
hWaferImageRequests = Database_Services('GetTableHandle', 'WAFER_IMAGE_REQUESTS')
|
||||
If Error_Services('NoError') then
|
||||
Sentence = 'SELECT WAFER_IMAGE_REQUESTS WITH RESPONSE_DATE EQ "" BY REQUEST_DATE BY REQUEST_TIME'
|
||||
Set_Status(0)
|
||||
RList(Sentence, TARGET_ACTIVELIST$, '', '', '')
|
||||
EOF = False$
|
||||
Loop
|
||||
ReadNext RequestKeyID else EOF = True$
|
||||
Until EOF
|
||||
RequestDate = Field(RequestKeyID, '*', 1)
|
||||
RequestTime = Field(RequestKeyID, '*', 2)
|
||||
RequestTime = RequestTime / 86400
|
||||
RequestTime = RequestTime[3, 5]
|
||||
RequestDTM = RequestDate:'.':RequestTime
|
||||
CurrDTM = Datetime()
|
||||
TimeInQueue = CurrDTM - RequestDTM
|
||||
If TimeInQueue LT 1 then
|
||||
Lock hWaferImageRequests, RequestKeyID then
|
||||
EncodedPDF = ''
|
||||
ResponseBody = ''
|
||||
RequestRow = Database_Services('ReadDataRow', 'WAFER_IMAGE_REQUESTS', RequestKeyID)
|
||||
RDSNo = RequestRow<WAFER_IMAGE_REQUESTS.RDS_NO$>
|
||||
WaferNo = RequestRow<WAFER_IMAGE_REQUESTS.WAFER_NO$>
|
||||
TencorRecipe = RequestRow<WAFER_IMAGE_REQUESTS.TENCOR_RECIPE$>
|
||||
ReturnPDF = RequestRow<WAFER_IMAGE_REQUESTS.RETURN_PDF$>
|
||||
Reactor = Xlate('RDS', RDSNo, 'REACTOR', 'X')
|
||||
PSN = Xlate('RDS', RDSNo, 'PROD_SPEC_ID', 'X')
|
||||
// Format Wafer Number for SQL Query
|
||||
WaferNo = TrimF(WaferNo)
|
||||
If WaferNo < 10 then
|
||||
WaferNo = '*0' : WaferNo
|
||||
end else
|
||||
WaferNo = '*' : WaferNo
|
||||
end
|
||||
Query = "DECLARE @RDS varchar(10) " |
|
||||
: "DECLARE @RECIPE varchar(30) " |
|
||||
: "DECLARE @WFRID varchar(10) " |
|
||||
: "SET @RDS = '":RDSNo:"' " |
|
||||
: "SET @RECIPE = '":TencorRecipe:"' " |
|
||||
: "SET @WFRID = '":WaferNo:"' " |
|
||||
: "SELECT child.AttachmentID " |
|
||||
: "FROM Metrology.dbo.TencorRunHeader header " |
|
||||
: "INNER JOIN Metrology.dbo.TencorRunData child on header.id = child.headerid " |
|
||||
: "WHERE header.rds = @RDS and header.recipe like @RECIPE + '%' and child.slot = @WFRID " |
|
||||
: "ORDER BY header.insertDate DESC, child.slot ASC"
|
||||
|
||||
WaferMapDB = Environment_Services('GetMetrologyProductionPath')
|
||||
AttachmentID = SQL_Services('GetDataRows', 'SPC', Query)
|
||||
AttachmentID = SRP_Trim(AttachmentID, 'FB', '{}')
|
||||
WaferMapRoot = Environment_Services('GetWaferMapProductionPath')
|
||||
PDFPath = WaferMapRoot:'\':AttachmentID:'\image.pdf'
|
||||
Set_Status(0)
|
||||
PDFFile = ''
|
||||
OSRead PDFFile from PDFPath then
|
||||
// "Cache" PDF on app server
|
||||
QA_Services('PostToWaferImageQueue', RDSNo, WaferNo, TencorRecipe, PDFFile)
|
||||
If ReturnPDF EQ True$ then
|
||||
ResponseBody = SRP_Encode(PDFFile)
|
||||
RequestRow<WAFER_IMAGE_REQUESTS.RESPONSE_BODY$> = ResponseBody
|
||||
RequestRow<WAFER_IMAGE_REQUESTS.RESPONSE_DATE$> = Date()
|
||||
RequestRow<WAFER_IMAGE_REQUESTS.RESPONSE_TIME$> = Time()
|
||||
Database_Services('WriteDataRow', 'WAFER_IMAGE_REQUESTS', RequestKeyID, RequestRow, True$)
|
||||
end else
|
||||
Database_Services('DeleteDataRow', 'WAFER_IMAGE_REQUESTS', RequestKeyID, True$)
|
||||
end
|
||||
|
||||
end else
|
||||
ErrorCode = Status()
|
||||
Error_Services('Add', 'Error retrieving wafer map image for AttachmentID ':AttachmentID)
|
||||
end
|
||||
Unlock hWaferImageRequests, RequestKeyID else Null
|
||||
end
|
||||
end else
|
||||
// Delete request because wafer image may never become available.
|
||||
Database_Services('DeleteDataRow', 'WAFER_IMAGE_REQUESTS', RequestKeyID, True$)
|
||||
end
|
||||
Repeat
|
||||
end
|
||||
Unlock hSysLists, ServiceKeyID else Null
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
// PostToWaferImageQueue
|
||||
//
|
||||
@ -1748,9 +1624,7 @@ Service ROTRImpactReport()
|
||||
column = OleGetProperty( xlSht, 'Range' , 'K:K' )
|
||||
OlePutProperty( column , 'ColumnWidth' , '15' )
|
||||
OlePutProperty( column , 'NumberFormat' , '0.0%' )
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end service
|
||||
@ -1962,71 +1836,66 @@ Service SignPreEpiStage(RDSNo, Username, WaferQty, Reactor, ScanEntry)
|
||||
|
||||
PreEpiSig = RDSRec<RDS_PRE_EPI_SIG$>
|
||||
ReactorType = Xlate('RDS', RDSNo, 'REACTOR_TYPE', 'X')
|
||||
// Removing OI_SUPERUSER wrappers to alleviate signature issues. 11/18/19 djs
|
||||
* IF MemberOf(Username, 'OI_SUPERUSER') THEN
|
||||
|
||||
IF ReactorType NE 'EPP' THEN
|
||||
|
||||
WOMatKey = WONo:'*':CassNo
|
||||
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
|
||||
WOMatSigProfile = WOMatRec<WO_MAT_SIG_PROFILE$>
|
||||
SigAction = WOStep:'VER'
|
||||
IF ReactorType NE 'EPP' THEN
|
||||
|
||||
WOMatKey = WONo:'*':CassNo
|
||||
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
|
||||
WOMatSigProfile = WOMatRec<WO_MAT_SIG_PROFILE$>
|
||||
SigAction = WOStep:'VER'
|
||||
|
||||
LOCATE SigAction IN WOMatSigProfile USING @VM SETTING Pos THEN
|
||||
WOMatSig = WOMatRec<WO_MAT_SIGNATURE$,Pos>
|
||||
CurrDTM = OCONV(WOMatRec<WO_MAT_SIG_DTM$,Pos>,'DT/4^HS')
|
||||
END ELSE
|
||||
WOMatSig = ''
|
||||
END
|
||||
|
||||
RDSSig = PreEpiSig
|
||||
|
||||
BEGIN CASE
|
||||
CASE (WOMatSig EQ '') AND (RDSSig NE '')
|
||||
|
||||
* Signature missing on WO_MAT
|
||||
SigDate = RDSRec<RDS_PRE_EPI_SIG_DATE$>
|
||||
SigTime = RDSRec<RDS_PRE_EPI_SIG_TIME$>
|
||||
owmParms = WONo:@RM:CassNo:@RM:WOStep:@RM:'VER':@RM:RDSSig:@RM:SigDate:' ':SigTime
|
||||
* Sets VER signature
|
||||
* obj_WO_Mat('SetSignature',owmParms)
|
||||
errCode = ''
|
||||
IF Get_Status(errCode) THEN
|
||||
ErrorMsg = 'Process Error: Error calling Obj_WO_Mat("SetSignature") within ':Service:'. Error code: ':errCode
|
||||
Error_Services('Set', ErrorMsg)
|
||||
Response = False$
|
||||
END else
|
||||
Response = True$
|
||||
end
|
||||
return
|
||||
|
||||
CASE (RDSSig = '') AND (WOMatSig NE '')
|
||||
|
||||
* Signature missing on RDS
|
||||
CurrDate = CurrDTM[1,' ']
|
||||
CurrTime = CurrDTM[COL2()+1,' ']
|
||||
RDSRec<RDS_PRE_EPI_SIG$> = WOMatSig
|
||||
RDSRec<RDS_PRE_EPI_SIG_DATE$> = IConv(CurrDate, 'D')
|
||||
RDSRec<RDS_PRE_EPI_SIG_TIME$> = IConv(CurrTime, 'MT')
|
||||
Database_Services('WriteDataRow', 'RDS', RDSNo, RDSRec, True$, False$, True$)
|
||||
Response = True$
|
||||
return
|
||||
|
||||
CASE RDSSig NE '' AND WOMatSig NE ''
|
||||
|
||||
ErrorMessage = 'Process Error: Pre Epi stage has already been signed.'
|
||||
Error_Services('Set', ErrorMessage)
|
||||
Response = False$
|
||||
return
|
||||
|
||||
CASE Otherwise$
|
||||
Null
|
||||
|
||||
END CASE
|
||||
|
||||
END ;* End of check for Reactor Type
|
||||
|
||||
* END
|
||||
LOCATE SigAction IN WOMatSigProfile USING @VM SETTING Pos THEN
|
||||
WOMatSig = WOMatRec<WO_MAT_SIGNATURE$,Pos>
|
||||
CurrDTM = OCONV(WOMatRec<WO_MAT_SIG_DTM$,Pos>,'DT/4^HS')
|
||||
END ELSE
|
||||
WOMatSig = ''
|
||||
END
|
||||
|
||||
RDSSig = PreEpiSig
|
||||
|
||||
BEGIN CASE
|
||||
CASE (WOMatSig EQ '') AND (RDSSig NE '')
|
||||
|
||||
* Signature missing on WO_MAT
|
||||
SigDate = RDSRec<RDS_PRE_EPI_SIG_DATE$>
|
||||
SigTime = RDSRec<RDS_PRE_EPI_SIG_TIME$>
|
||||
owmParms = WONo:@RM:CassNo:@RM:WOStep:@RM:'VER':@RM:RDSSig:@RM:SigDate:' ':SigTime
|
||||
* Sets VER signature
|
||||
errCode = ''
|
||||
IF Get_Status(errCode) THEN
|
||||
ErrorMsg = 'Process Error: Error calling Obj_WO_Mat("SetSignature") within ':Service:'. Error code: ':errCode
|
||||
Error_Services('Set', ErrorMsg)
|
||||
Response = False$
|
||||
END else
|
||||
Response = True$
|
||||
end
|
||||
return
|
||||
|
||||
CASE (RDSSig = '') AND (WOMatSig NE '')
|
||||
|
||||
* Signature missing on RDS
|
||||
CurrDate = CurrDTM[1,' ']
|
||||
CurrTime = CurrDTM[COL2()+1,' ']
|
||||
RDSRec<RDS_PRE_EPI_SIG$> = WOMatSig
|
||||
RDSRec<RDS_PRE_EPI_SIG_DATE$> = IConv(CurrDate, 'D')
|
||||
RDSRec<RDS_PRE_EPI_SIG_TIME$> = IConv(CurrTime, 'MT')
|
||||
Database_Services('WriteDataRow', 'RDS', RDSNo, RDSRec, True$, False$, True$)
|
||||
Response = True$
|
||||
return
|
||||
|
||||
CASE RDSSig NE '' AND WOMatSig NE ''
|
||||
|
||||
ErrorMessage = 'Process Error: Pre Epi stage has already been signed.'
|
||||
Error_Services('Set', ErrorMessage)
|
||||
Response = False$
|
||||
return
|
||||
|
||||
CASE Otherwise$
|
||||
Null
|
||||
|
||||
END CASE
|
||||
|
||||
END ;* End of check for Reactor Type
|
||||
|
||||
SigDate = OCONV( Date(), 'D2/' )
|
||||
SigTime = OCONV( Time(), 'MTS' )
|
||||
@ -2040,7 +1909,6 @@ Service SignPreEpiStage(RDSNo, Username, WaferQty, Reactor, ScanEntry)
|
||||
|
||||
owmParms = WONo:@RM:CassNo:@RM:WOStep:@RM:'VER':@RM:Username:@RM:SigDate:' ':SigTime ;* Sets VER signature
|
||||
|
||||
* obj_WO_Mat('SetSignature',owmParms)
|
||||
IF Get_Status(errCode) THEN
|
||||
ErrorMessage = 'Process Error: Error calling obj_WO_Mat("SetSignature"). Error code: ':errCode
|
||||
Error_Services('Set', ErrorMessage)
|
||||
@ -2205,18 +2073,9 @@ Service LoadSignatureReady(RDSNo, Username, WaferQty, LLSide, PreFlag, ReactNoOp
|
||||
return
|
||||
end
|
||||
|
||||
//Added 8/18/2021 JRO - checks to make sure recipe limits aren't oos
|
||||
* IF ParamOutOfSpec then
|
||||
* IF Supplement NE True$ then
|
||||
* ErrorMsg = 'Process Error: Recipe parameters are out of spec and no supplement has been set.'
|
||||
* Error_Services('Set', ErrorMsg)
|
||||
* Response = False$
|
||||
* return
|
||||
* end
|
||||
* end
|
||||
Locate True$ in ParamOutOfSpec using @VM setting oPos then
|
||||
|
||||
IF Supplement NE True$ AND WONo NE '173485' then
|
||||
IF Supplement NE True$ then
|
||||
ErrorMsg = 'Process Error: Recipe parameters are out of spec and no supplement has been set.'
|
||||
Error_Services('Set', ErrorMsg)
|
||||
Response = False$
|
||||
@ -2229,13 +2088,6 @@ Service LoadSignatureReady(RDSNo, Username, WaferQty, LLSide, PreFlag, ReactNoOp
|
||||
Response = False$
|
||||
return
|
||||
end
|
||||
|
||||
* IF (ReactorType = 'ASM+' OR ReactorType = 'HTR') AND (LoadLockVal EQ '') THEN
|
||||
* ErrorMsg = 'Process Error: Load Lock Side must be set to either Left or Right before signing.'
|
||||
* Error_Services('Set', ErrorMsg)
|
||||
* Response = False$
|
||||
* return
|
||||
* END
|
||||
|
||||
//Added JRO 3/16/2021
|
||||
//Load Lock Required Check
|
||||
@ -2309,50 +2161,27 @@ Service LoadSignatureReady(RDSNo, Username, WaferQty, LLSide, PreFlag, ReactNoOp
|
||||
Response = False$
|
||||
Return
|
||||
END
|
||||
|
||||
If PreFlag EQ True$ then
|
||||
// PRE and LOAD stages are being signed together. This is usually because the operator is loading a reactor
|
||||
// using the barcode scanner, which attempts to sign both stages at once to save time.
|
||||
Stage = 'VER'
|
||||
end else
|
||||
Stage = 'LOAD'
|
||||
end
|
||||
|
||||
* IF ReactorType NE 'EPP' THEN
|
||||
|
||||
If PreFlag EQ True$ then
|
||||
// PRE and LOAD stages are being signed together. This is usually because the operator is loading a reactor
|
||||
// using the barcode scanner, which attempts to sign both stages at once to save time.
|
||||
Stage = 'VER'
|
||||
end else
|
||||
Stage = 'LOAD'
|
||||
end
|
||||
|
||||
If ReactorType EQ 'EPP' then
|
||||
WOMatKey = ''
|
||||
end else
|
||||
WOMatKey = WONo:'*':CassNo
|
||||
end
|
||||
|
||||
Signature_Services('CheckSigOrder', WOMatKey, Stage, False$, RDSNo)
|
||||
|
||||
If Error_Services('HasError') then
|
||||
Response = False$
|
||||
Return
|
||||
end
|
||||
|
||||
! Deprecated 11/20/2019
|
||||
* Set_Status(0)
|
||||
* obj_WO_Mat('CheckSigOrder',WONo:'*':CassNo:@RM:WOStep:'LOAD')
|
||||
* IF Get_Status(errCode) THEN
|
||||
* ErrorMsg = 'Process Error: Error calling obj_WO_Mat("CheckSigOrder"). Error code: ':errCode
|
||||
* Error_Services('Set', ErrorMsg)
|
||||
* Response = False$
|
||||
* RETURN
|
||||
* END
|
||||
|
||||
* END ;* End of check for Epi Pro
|
||||
|
||||
// Deprecated in favor of stage specific supplements
|
||||
* SupplAckReq = Xlate('RDS', RDSNo, 'SUPPL_ACK_REQ', 'X')
|
||||
* IF (SupplAckReq EQ True$) then
|
||||
* ErrorMsg = 'The RDS Supplement must be acknowledged before the load operation can be signed.'
|
||||
* Error_Services('Set', ErrorMsg)
|
||||
* Response = False$
|
||||
* Return
|
||||
* END
|
||||
If ReactorType EQ 'EPP' then
|
||||
WOMatKey = ''
|
||||
end else
|
||||
WOMatKey = WONo:'*':CassNo
|
||||
end
|
||||
|
||||
Signature_Services('CheckSigOrder', WOMatKey, Stage, False$, RDSNo)
|
||||
|
||||
If Error_Services('HasError') then
|
||||
Response = False$
|
||||
Return
|
||||
end
|
||||
|
||||
SigDate = RDSRec<RDS_PRE_EPI_SIG_DATE$>
|
||||
SigTime = RDSrec<RDS_PRE_EPI_SIG_TIME$>
|
||||
@ -2400,7 +2229,9 @@ Service LoadSignatureReady(RDSNo, Username, WaferQty, LLSide, PreFlag, ReactNoOp
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service LoadExtra1stReady(RDSNo)
|
||||
|
||||
Response = False$
|
||||
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
|
||||
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
|
||||
@ -2412,9 +2243,12 @@ Service LoadExtra1stReady(RDSNo)
|
||||
If StandardLoadSignature NE '' AND UnloadExtra1Signature NE '' AND LoadExtra1Signature EQ '' And LoadExtra2Signature EQ ''AND UnloadExtra2Signature EQ '' and StandardUnloadSignature EQ '' then
|
||||
Response = True$
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service UnsignLoadExtra1stReady(RDSNo)
|
||||
|
||||
Response = False$
|
||||
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
|
||||
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
|
||||
@ -2431,7 +2265,9 @@ Service UnsignLoadExtra1stReady(RDSNo)
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service LoadExtra2ndReady(RDSNo)
|
||||
|
||||
Response = False$
|
||||
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
|
||||
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
|
||||
@ -2443,9 +2279,12 @@ Service LoadExtra2ndReady(RDSNo)
|
||||
If StandardLoadSignature NE '' AND UnloadExtra1Signature NE '' AND LoadExtra1Signature NE '' AND UnloadExtra2Signature NE '' And LoadExtra2Signature EQ '' and StandardUnloadSignature EQ '' then
|
||||
Response = True$
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service UnsignLoadExtra2ndReady(RDSNo)
|
||||
|
||||
Response = False$
|
||||
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
|
||||
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
|
||||
@ -2459,8 +2298,10 @@ Service UnsignLoadExtra2ndReady(RDSNo)
|
||||
Response = True$
|
||||
end
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------------------------------------------------
|
||||
// SignLoadStage
|
||||
//
|
||||
@ -2745,39 +2586,17 @@ Service UnloadSignatureReady(RDSNo, Username, Reactor)
|
||||
end
|
||||
ReactorType = XLATE('RDS',RDSNo,'REACTOR_TYPE','X')
|
||||
|
||||
|
||||
* IF ReactorType NE 'EPP' THEN
|
||||
|
||||
|
||||
If ReactorType EQ 'EPP' then
|
||||
WOMatKey = ''
|
||||
end else
|
||||
WOMatKey = WONo:'*':CassNo
|
||||
end
|
||||
|
||||
Signature_Services('CheckSigOrder', WOMatKey, 'UNLOAD', RDSNo)
|
||||
If Error_Services('HasError') then
|
||||
Response = False$
|
||||
return
|
||||
end
|
||||
|
||||
* END ELSE
|
||||
*
|
||||
* ReactRunRec = XLATE('REACT_RUN',RDSNo,'','X')
|
||||
* LOCATE 'LWI' IN ReactRunRec<REACT_RUN_CI_STAGE$> USING @VM SETTING Pos THEN
|
||||
* CINo = ReactRunRec<REACT_RUN_CI_NO$>
|
||||
* Actions = obj_Clean_Insp('GetActions',CINo)
|
||||
* LOCATE 'Inspection' IN Actions<ACTION$ACTIONS> USING @FM SETTING Pos THEN
|
||||
* IF Actions<ACTION$SIGS,1> = '' THEN
|
||||
* ErrorMsg = 'Process Error: A Wafer Inspection is required and has not been completed.'
|
||||
* Error_Services('Set', ErrorMsg)
|
||||
* Response = False$
|
||||
* return
|
||||
* END
|
||||
* END
|
||||
* END
|
||||
*
|
||||
* END ;* End of check for EpiPRO (EPP) reactor type
|
||||
If ReactorType EQ 'EPP' then
|
||||
WOMatKey = ''
|
||||
end else
|
||||
WOMatKey = WONo:'*':CassNo
|
||||
end
|
||||
|
||||
Signature_Services('CheckSigOrder', WOMatKey, 'UNLOAD', RDSNo)
|
||||
If Error_Services('HasError') then
|
||||
Response = False$
|
||||
return
|
||||
end
|
||||
|
||||
LWIInstAckReq = Xlate('RDS', RDSNo, 'LWI_INST_ACK_REQ', 'X')
|
||||
If LWIInstAckReq EQ True$ then
|
||||
@ -2795,7 +2614,6 @@ Service UnloadSignatureReady(RDSNo, Username, Reactor)
|
||||
return
|
||||
end
|
||||
|
||||
! Todo: We will have to define special logic for the barcode application to handle extra loads and unloads.
|
||||
* Check for extra unloads without corresponding extra load
|
||||
IF RDSRec<RDS_OP_OUT_EX1_DATE$> <> '' THEN
|
||||
IF RDSRec<RDS_OP_IN_EX2_DATE$> = '' THEN
|
||||
@ -2867,7 +2685,9 @@ Service UnloadSignatureReady(RDSNo, Username, Reactor)
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service UnloadExtra1stReady(RDSNo)
|
||||
|
||||
Response = False$
|
||||
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
|
||||
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
|
||||
@ -2879,9 +2699,12 @@ Service UnloadExtra1stReady(RDSNo)
|
||||
If StandardLoadSignature NE '' AND UnloadExtra1Signature EQ '' AND LoadExtra1Signature EQ '' AND UnloadExtra2Signature EQ '' And LoadExtra2Signature eq '' and StandardUnloadSignature EQ '' then
|
||||
Response = True$
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service UnloadExtra2ndReady(RDSNo)
|
||||
|
||||
Response = False$
|
||||
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
|
||||
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
|
||||
@ -2893,9 +2716,12 @@ Service UnloadExtra2ndReady(RDSNo)
|
||||
If StandardLoadSignature NE '' AND UnloadExtra1Signature NE '' AND LoadExtra1Signature NE '' And LoadExtra2Signature EQ ''AND UnloadExtra2Signature EQ '' and StandardUnloadSignature EQ '' then
|
||||
Response = True$
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service UnsignUnloadExtra1stReady(RDSNo)
|
||||
|
||||
Response = False$
|
||||
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
|
||||
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
|
||||
@ -2912,7 +2738,9 @@ Service UnsignUnloadExtra1stReady(RDSNo)
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service UnsignUnloadExtra2ndReady(RDSNo)
|
||||
|
||||
Response = False$
|
||||
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
|
||||
StandardLoadSignature = RDSRec<RDS_OPERATOR_IN$>
|
||||
@ -2926,6 +2754,7 @@ Service UnsignUnloadExtra2ndReady(RDSNo)
|
||||
Response = True$
|
||||
end
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
|
||||
@ -3012,7 +2841,6 @@ Service SignUnloadStage(RDSNo, Username, ScanEntry)
|
||||
|
||||
* 4/30/2013 JCH added parms for merging of two methods
|
||||
owmParms = WONo:@RM:CassNo:@RM:WOStep:@RM:'UNLOAD':@RM:Username:@RM:SigDt:' ':SigTm:@RM:ReactID:@RM:ReactWH:@RM:ReactLoc:@RM:Tag
|
||||
* obj_WO_Mat('SetSignature',owmParms)
|
||||
|
||||
IF Get_Status(errCode) THEN
|
||||
ErrorMsg = 'Process Error: Error calling Obj_WO_Mat("SetSignature") within the ':Service:' service'
|
||||
@ -3046,9 +2874,6 @@ Service SignUnloadStage(RDSNo, Username, ScanEntry)
|
||||
|
||||
obj_React_Status('CassUnload',Reactor:@RM:WONo:@RM:CassNo:@RM:UnloadDTM:@RM:RDSNo)
|
||||
IF Get_Status(errCode) THEN
|
||||
* ErrorMsg = 'Process Error: Error calling Obj_React_Status("CassUnload") within the ':Service:' service'
|
||||
* Error_Services('Add', ErrorMsg)
|
||||
* Response = False$
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = @User4
|
||||
@ -3064,7 +2889,6 @@ Service SignUnloadStage(RDSNo, Username, ScanEntry)
|
||||
InCassettes = RDSRec<RDS_IN_CASS_NO$>
|
||||
InCassettes = SRP_Array('Clean', InCassettes, 'TrimAndMakeUnique', @VM)
|
||||
obj_React_Status('ReactorUnload',Reactor:@RM:WONo:@RM:InCassettes:@RM:UnloadDTM:@RM:RDSNo)
|
||||
//Reactor_Services('IncrementWfrMetrics', RDSNo)
|
||||
end
|
||||
|
||||
RDSRec<RDS_OPERATOR_OUT$> = SigBy
|
||||
@ -3470,98 +3294,10 @@ Service SignFQAStage(RDSNo, Username)
|
||||
END
|
||||
NEXT Index
|
||||
END
|
||||
|
||||
|
||||
**********************************************
|
||||
* Verify the FlatFinder information *
|
||||
**********************************************
|
||||
EpiPartNo = {EPI_PART_NO}
|
||||
WaferSize = Xlate('EPI_PART', EpiPartNo, 'SUB_WAFER_SIZE', 'X')
|
||||
WaferSizeInch = Field(WaferSize, ' ', 3, 1)
|
||||
CustNo = {CUST_NO}
|
||||
CompanyRow = Xlate('COMPANY', CustNo, '', 'X')
|
||||
WafersOut = {WFRS_OUT}
|
||||
|
||||
Begin Case
|
||||
|
||||
Case WaferSizeInch = '6'
|
||||
|
||||
WaferFlatSizeInches = CompanyRow<COMPANY_WAFER_FLAT_WAFER_SIZE_INCH$>
|
||||
WaferFlatLengthMins = Oconv(CompanyRow<COMPANY_WAFER_FLAT_LENGTH_MIN$>, 'MD1')
|
||||
WaferFlatLengthMaxes = Oconv(CompanyRow<COMPANY_WAFER_FLAT_LENGTH_MAX$>, 'MD1')
|
||||
|
||||
Locate WaferSizeInch in WaferFlatSizeInches using @VM setting vPos then
|
||||
WaferFlatLengthMin = WaferFlatLengthMins<0, vPos>
|
||||
WaferFlatLengthMax = WaferFlatLengthMaxes<0, vPos>
|
||||
end else
|
||||
WaferFlatLengthMin = ''
|
||||
WaferFlatLengthMax = ''
|
||||
end
|
||||
|
||||
// Get FlatFinder Read Value
|
||||
* FlatFinderWafersQty = {FLATFINDER_WAFER_CNT}
|
||||
FlatFinderWaferLength = {FLATFINDER_FLAT_LENGTH}
|
||||
|
||||
***************************************
|
||||
* FlatFinder - Wafers Quatity Section *
|
||||
***************************************
|
||||
* If (FlatFinderWafersQty NE '') then
|
||||
* If (FlatFinderWafersQty NE WafersOut) then
|
||||
* ErrorMsg = 'Unable to sign FQA because Flat Finder and Wafers Out quantities do not match.'
|
||||
* Error_Services('Add', ErrorMsg)
|
||||
* return
|
||||
* end
|
||||
* end else
|
||||
* ErrorMsg = 'Unable to sign FQA because the Flat Finder quantity is missing.'
|
||||
* Error_Services('Add', ErrorMsg)
|
||||
* return
|
||||
* end
|
||||
************************************
|
||||
* FlatFinder - Flat Length Section *
|
||||
************************************
|
||||
If (WaferFlatLengthMin NE '') AND (WaferFlatLengthMax NE '') then
|
||||
If (FlatFinderWaferLength NE '') then
|
||||
If (FlatFinderWaferLength GE WaferFlatLengthMin) AND (FlatFinderWaferLength LE WaferFlatLengthMax) then
|
||||
end else
|
||||
ErrorMsg = 'Unable to sign FQA because Flat Finder wafer lengths are out of bounds.'
|
||||
Error_Services('Add', ErrorMsg)
|
||||
return
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Unable to sign FQA because the Flat Finder wafer length is missing.'
|
||||
Error_Services('Add', ErrorMsg)
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
Case WaferSizeInch = '8'
|
||||
|
||||
// Get NotchFinder Read Value
|
||||
* NotchFinderWafersQty = {FLATFINDER_WAFER_CNT}
|
||||
*
|
||||
* ***************************************
|
||||
* * NotchFinder - Wafers Quatity Section *
|
||||
* ***************************************
|
||||
* If (NotchFinderWafersQty NE '') then
|
||||
* If (NotchFinderWafersQty NE WafersOut) then
|
||||
* ErrorMsg = 'Unable to sign FQA because Notch Finder and Wafers Out quantities do not match.'
|
||||
* Error_Services('Add', ErrorMsg)
|
||||
* return
|
||||
* end
|
||||
* end else
|
||||
* ErrorMsg = 'Unable to sign FQA because the Notch Finder quantity is missing.'
|
||||
* Error_Services('Add', ErrorMsg)
|
||||
* return
|
||||
* end
|
||||
|
||||
Case 1
|
||||
End Case
|
||||
|
||||
*************************
|
||||
* Verify Wafer Quantity *
|
||||
*************************
|
||||
! The barcode application will need to inform the user that an override is required. We will return an error for
|
||||
! now. Once the user is informed, a LEAD or SUPERVISOR can scan their badge to override and complete the scan.
|
||||
CassSchedWafers = {CASS_SHIP_QTY}
|
||||
WafersOut = {WFRS_OUT}
|
||||
|
||||
@ -3581,23 +3317,18 @@ Service SignFQAStage(RDSNo, Username)
|
||||
|
||||
end
|
||||
|
||||
|
||||
*********************************
|
||||
* Verify NCR total >= USL Fails *
|
||||
*********************************
|
||||
! The barcode application will need to inform the user that an override is required. We will return an error for
|
||||
! now. Once the user is informed, a LEAD or SUPERVISOR can scan their badge to override and complete the scan.
|
||||
If Username EQ 'FRANCOIS_R' then
|
||||
NCRStatus = QA_Services('GetNCRStatus', RDSNo)
|
||||
If NCRStatus EQ False$ then
|
||||
If NOT( MemberOf(Username, 'LEAD') OR MemberOf(Username, 'SUPERVISOR') ) then
|
||||
ErrorMsg = 'Unable to sign FQA because the total quantity of NCR wafers is less than the '|
|
||||
: 'number of wafers above the USL threshold. A lead or supervisor must override.'
|
||||
Error_Services('Add', ErrorMsg)
|
||||
return
|
||||
end
|
||||
end
|
||||
end
|
||||
NCRStatus = QA_Services('GetNCRStatus', RDSNo)
|
||||
If NCRStatus EQ False$ then
|
||||
If NOT( MemberOf(Username, 'LEAD') OR MemberOf(Username, 'SUPERVISOR') ) then
|
||||
ErrorMsg = 'Unable to sign FQA because the total quantity of NCR wafers is less than the '|
|
||||
: 'number of wafers above the USL threshold. A lead or supervisor must override.'
|
||||
Error_Services('Add', ErrorMsg)
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
*************************
|
||||
* Verify if Shift exist *
|
||||
@ -3659,21 +3390,19 @@ Service SignFQAStage(RDSNo, Username)
|
||||
Next Test
|
||||
|
||||
******************************************
|
||||
* Verify Unload Stage QA Metrology Tests * On hold until approved for release to production
|
||||
* Verify Unload Stage QA Metrology Tests *
|
||||
******************************************
|
||||
If Username EQ 'FRANCOIS_R' then
|
||||
WONo = {WO}
|
||||
CassNo = {CASS_NO}
|
||||
WOMatQAKey = WONo : '*' : CassNo
|
||||
WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatQAKey)
|
||||
OutOfSpec = WOMatQARec<WO_MAT_QA_OUT_OF_SPEC$>
|
||||
OutOfSpec = Sum(OutOfSpec)
|
||||
If OutOfSpec GT 0 then
|
||||
ErrorMsg = 'Process Error: One or more Unload QA Metrology results are out of specification.'
|
||||
Error_Services('Add', ErrorMsg)
|
||||
return
|
||||
end
|
||||
end
|
||||
WONo = {WO}
|
||||
CassNo = {CASS_NO}
|
||||
WOMatQAKey = WONo : '*' : CassNo
|
||||
WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatQAKey)
|
||||
OutOfSpec = WOMatQARec<WO_MAT_QA_OUT_OF_SPEC$>
|
||||
OutOfSpec = Sum(OutOfSpec)
|
||||
If OutOfSpec GT 0 then
|
||||
ErrorMsg = 'Process Error: One or more Unload QA Metrology results are out of specification.'
|
||||
Error_Services('Add', ErrorMsg)
|
||||
return
|
||||
end
|
||||
|
||||
*******************************************
|
||||
* Verify if all steps have been completed *
|
||||
@ -3746,8 +3475,6 @@ Service SignFQAStage(RDSNo, Username)
|
||||
;* 4/30/2013 JCH added parms for merging of two methods
|
||||
owmParms = WONo:@RM:CassNo:@RM:WOStep:@RM:'QA':@RM:Username:@RM:SigDt:' ':SigTm:@RM:ToolID:@RM:WHCd:@RM:LocCd:@RM:Tag
|
||||
|
||||
* obj_WO_Mat('SetSignature',owmParms) ; * * * * * S I G N A T U R E * * * * * *
|
||||
|
||||
IF Get_Status(errCode) THEN
|
||||
ErrorMsg = 'Error calling Obj_WO_Mat("SetSignature") within ':Service:'. Error code: ':errCode
|
||||
Error_Services('Add', ErrorMsg)
|
||||
|
@ -254,26 +254,23 @@ Event SIGN_BUTTON.CLICK()
|
||||
end
|
||||
|
||||
RDSNo = Get_Property(@Window : '.RDS_NO','DEFPROP')
|
||||
WCCheckEnabled = Xlate('APP_INFO', 'WAFER_COUNTER_CHECK', '', 'X')
|
||||
If WCCheckEnabled then
|
||||
****************************************
|
||||
* Verify the Wafer Counter information *
|
||||
****************************************
|
||||
WafersOut = Get_Property(@WINDOW:'.WAFERS_OUT','TEXT')
|
||||
WaferCounterQty = Get_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','DEFPROP')
|
||||
|
||||
*************************************
|
||||
* Wafer Counter - Quantity Section *
|
||||
*************************************
|
||||
If (WaferCounterQty NE '') then
|
||||
If (WaferCounterQty NE WafersOut) then
|
||||
ErrMsg('Unable to sign FQA because Wafer Counter and Wafers Out quantities do not match.')
|
||||
RETURN 0
|
||||
end
|
||||
end else
|
||||
ErrMsg('Unable to sign FQA because the Wafer Counter quantity is missing.')
|
||||
****************************************
|
||||
* Verify the Wafer Counter information *
|
||||
****************************************
|
||||
WafersOut = Get_Property(@WINDOW:'.WAFERS_OUT','TEXT')
|
||||
WaferCounterQty = Get_Property(@WINDOW:'.EDL_WAFER_COUNTER_QTY','DEFPROP')
|
||||
|
||||
*************************************
|
||||
* Wafer Counter - Quantity Section *
|
||||
*************************************
|
||||
If (WaferCounterQty NE '') then
|
||||
If (WaferCounterQty NE WafersOut) then
|
||||
ErrMsg('Unable to sign FQA because Wafer Counter and Wafers Out quantities do not match.')
|
||||
RETURN 0
|
||||
end
|
||||
end else
|
||||
ErrMsg('Unable to sign FQA because the Wafer Counter quantity is missing.')
|
||||
RETURN 0
|
||||
end
|
||||
|
||||
***********************************
|
||||
@ -446,26 +443,21 @@ Event SIGN_BUTTON.CLICK()
|
||||
******************************************
|
||||
* Verify Unload Stage QA Metrology Tests *
|
||||
******************************************
|
||||
|
||||
DevelopmentFlag = Xlate('DEVELOPMENT', 'HGCV', 'STATUS', 'X')
|
||||
|
||||
If (DevelopmentFlag EQ True$) then
|
||||
WONo = Get_Property(@WINDOW:'.WO','DEFPROP')
|
||||
CassNo = Get_Property(@WINDOW:'.CASS_NO','DEFPROP')
|
||||
WOMatQAKey = WONo : '*' : CassNo
|
||||
WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatQAKey)
|
||||
OutOfSpec = WOMatQARec<WO_MAT_QA_OUT_OF_SPEC$>
|
||||
OutOfSpec = Sum(OutOfSpec)
|
||||
If OutOfSpec GT 0 then
|
||||
FailReasons = WOMatQARec<WO_MAT_QA_FAIL_REASON$>
|
||||
ErrorMsg = 'Process Error':@SVM
|
||||
For each FailReason in FailReasons using @VM
|
||||
ErrorMsg := FailReason:CRLF$
|
||||
Next FailReason
|
||||
ErrMsg(ErrorMsg)
|
||||
Return
|
||||
end
|
||||
end
|
||||
WONo = Get_Property(@WINDOW:'.WO','DEFPROP')
|
||||
CassNo = Get_Property(@WINDOW:'.CASS_NO','DEFPROP')
|
||||
WOMatQAKey = WONo : '*' : CassNo
|
||||
WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatQAKey)
|
||||
OutOfSpec = WOMatQARec<WO_MAT_QA_OUT_OF_SPEC$>
|
||||
OutOfSpec = Sum(OutOfSpec)
|
||||
If OutOfSpec GT 0 then
|
||||
FailReasons = WOMatQARec<WO_MAT_QA_FAIL_REASON$>
|
||||
ErrorMsg = 'Process Error':@SVM
|
||||
For each FailReason in FailReasons using @VM
|
||||
ErrorMsg := FailReason:CRLF$
|
||||
Next FailReason
|
||||
ErrMsg(ErrorMsg)
|
||||
Return
|
||||
end
|
||||
|
||||
*******************************************
|
||||
* Verify if all steps have been completed *
|
||||
|
@ -114,7 +114,7 @@ end service
|
||||
|
||||
|
||||
Service CheckQALabelStatus(WOMatKey)
|
||||
|
||||
|
||||
rec = Xlate('WO_MAT', WoMatKey,'', '')
|
||||
locRec = rec<WO_MAT_INV_LOCATION$>
|
||||
actionRec = rec<WO_MAT_INV_ACTION$>
|
||||
@ -282,7 +282,7 @@ end service
|
||||
|
||||
|
||||
Service GetSigInfo(WOMatKey, Stage, UseCaching, RDSNo)
|
||||
|
||||
|
||||
If UseCaching EQ '' then UseCaching = True$
|
||||
Signature = ''
|
||||
SigDTM = ''
|
||||
@ -2010,20 +2010,17 @@ Service QASigReady(RDSNo)
|
||||
* Verify Unload Stage QA Metrology Tests *
|
||||
******************************************
|
||||
If ErrorMessage EQ '' then
|
||||
DevelopmentFlag = Xlate('DEVELOPMENT', 'HGCV', 'STATUS', 'X')
|
||||
If (DevelopmentFlag EQ True$) then
|
||||
WOMatQAKey = WOMatKey
|
||||
WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatQAKey)
|
||||
OutOfSpec = WOMatQARec<WO_MAT_QA_OUT_OF_SPEC$>
|
||||
OutOfSpec = Sum(OutOfSpec)
|
||||
If OutOfSpec GT 0 then
|
||||
FailReasons = WOMatQARec<WO_MAT_QA_FAIL_REASON$>
|
||||
ErrorMessage = 'Error in ':Service:' service. '
|
||||
For each FailReason in FailReasons using @VM
|
||||
ErrorMessage := FailReason:' '
|
||||
Next FailReason
|
||||
end
|
||||
end
|
||||
WOMatQAKey = WOMatKey
|
||||
WOMatQARec = Database_Services('ReadDataRow', 'WO_MAT_QA', WOMatQAKey)
|
||||
OutOfSpec = WOMatQARec<WO_MAT_QA_OUT_OF_SPEC$>
|
||||
OutOfSpec = Sum(OutOfSpec)
|
||||
If OutOfSpec GT 0 then
|
||||
FailReasons = WOMatQARec<WO_MAT_QA_FAIL_REASON$>
|
||||
ErrorMessage = 'Error in ':Service:' service. '
|
||||
For each FailReason in FailReasons using @VM
|
||||
ErrorMessage := FailReason:' '
|
||||
Next FailReason
|
||||
end
|
||||
end
|
||||
|
||||
************************************************************************
|
||||
@ -2844,4 +2841,3 @@ GetMostRecentSig:
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user