Merged PR 19143: Require 100 percent centerpoint on MU conversion.
Initial commit. Create FQASignatureReady service in QA_SERVICES. Create SignFQA service in SIGNATURE_SERVICES. Commit remaining portion of project. Implement changes requested in review meeting. Fix typo. Add new MU logic to final entry point. Restrict logic to only apply to 'THICK' inspections. Bypass new logic if Biorad 4 and 5 are down.
This commit is contained in:
parent
5cb17c6d52
commit
273b7f67a6
@ -7,7 +7,7 @@ COMPILE FUNCTION Comm_WO_Mat(Instruction, Parm1,Parm2)
|
||||
10/18/2006 - John C. Henry, J.C. Henry & Co., Inc.
|
||||
*/
|
||||
|
||||
DECLARE SUBROUTINE Set_Property, Set_Status, ErrMsg, Set_Property, obj_AppWindow, Send_Message
|
||||
DECLARE SUBROUTINE Set_Property, Set_Status, ErrMsg, Set_Property, obj_AppWindow, Send_Message, Wo_Mat_Services
|
||||
DECLARE SUBROUTINE Btree.Extract, Send_Event, Security_Err_Msg, Forward_Event, End_Window, Start_Window
|
||||
DECLARE SUBROUTINE EditCell, obj_NCR, obj_Notes, obj_WO_Mat, obj_Tables, SAP_Services, Hold_Services
|
||||
|
||||
@ -627,6 +627,7 @@ MakeUpClick:
|
||||
LotId = Xlate('WO_MAT', WOMatKey, 'WMO_KEY', 'X')
|
||||
end else
|
||||
LotId = Xlate('WO_MAT', WOMatKey, 'RDS_NO', 'X')
|
||||
RDSNo = LotID
|
||||
end
|
||||
|
||||
If LotId NE '' then
|
||||
@ -636,12 +637,22 @@ MakeUpClick:
|
||||
Parms<3> = 'MU' ; // Wafer counter tool location
|
||||
Proceed = Dialog_Box('NDW_WAFER_COUNTER', @Window, Parms)
|
||||
If Proceed EQ True$ then
|
||||
Set_Property(@WINDOW,'SAVEWARN', False$)
|
||||
Send_Event(@WINDOW,'CLEAR')
|
||||
obj_WO_Mat('ChangeFlag',WOMatKey:@RM:FieldNo:@RM:CheckValue)
|
||||
IF Get_Status(errCode) THEN
|
||||
ErrMsg(errCode)
|
||||
END
|
||||
obj_WO_Mat('ChangeFlag',WOMatKey:@RM:FieldNo:@RM:CheckValue)
|
||||
If EpiPro EQ False$ then
|
||||
IF Get_Status(errCode) THEN
|
||||
ErrMsg('Unable to set makeup flag until Unload stage is signed.')
|
||||
InvalidRequest = True$
|
||||
END else
|
||||
Set_Property(@WINDOW,'SAVEWARN', False$)
|
||||
Send_Event(@WINDOW,'CLEAR')
|
||||
If (CheckValue EQ True$) then
|
||||
Wo_Mat_Services('MakeupFlagOn', RDSNo)
|
||||
end
|
||||
end
|
||||
end else
|
||||
Set_Property(@WINDOW,'SAVEWARN', False$)
|
||||
Send_Event(@WINDOW,'CLEAR')
|
||||
end
|
||||
end else
|
||||
InvalidRequest = True$
|
||||
end
|
||||
|
@ -17,11 +17,11 @@ DECLARE SUBROUTINE Set_Property, Set_Status, ErrMsg, Set_Property, obj_AppWindo
|
||||
DECLARE SUBROUTINE Btree.Extract, Send_Event, Security_Err_Msg, Forward_Event, End_Window, Start_Window
|
||||
DECLARE SUBROUTINE EditCell, obj_NCR, obj_Notes, Post_Event, obj_WO_Mat, obj_WO_Mat_Log, obj_WO_Wfr, obj_Tables
|
||||
DECLARE SUBROUTINE SRP_Stopwatch, Update_Index, Database_Services, obj_RDS, Create_Dialog, Dialog_Box
|
||||
DECLARE SUBROUTINE Sleepery
|
||||
DECLARE SUBROUTINE Sleepery, Wo_Mat_Services
|
||||
DECLARE FUNCTION Get_Property, Get_Status, Popup, Send_Message, Msg, Security_Check, Dialog_Box, RowExists
|
||||
DECLARE FUNCTION Dialog_Box, obj_WO_Log, obj_NCR, Check_Notes, obj_MUWafers, obj_WO_Mat, Signature_Services
|
||||
DECLARE FUNCTION MemberOf, obj_Tables, obj_RDS, Environment_Services, Logging_Services, Material_Services
|
||||
DECLARE FUNCTION Database_Services, RetStack, Datetime, Error_Services
|
||||
DECLARE FUNCTION Database_Services, RetStack, Datetime, Error_Services, Rds_Services
|
||||
|
||||
$INSERT POPUP_EQUATES
|
||||
$INSERT LOGICAL
|
||||
@ -830,8 +830,18 @@ AddMakeup:
|
||||
|
||||
FieldNo = WO_MAT_MAKEUP_BOX$
|
||||
CheckValue = 1
|
||||
EpiCheck = Rds_Services('IsEpiPro', RDSNo)
|
||||
|
||||
obj_WO_Mat('ChangeFlag',WOMatKey:@RM:FieldNo:@RM:CheckValue)
|
||||
|
||||
If EpiCheck EQ False$ then
|
||||
IF Get_Status(errCode) THEN
|
||||
ErrMsg('Unable to set makeup flag until Unload stage is signed.')
|
||||
Return
|
||||
END else
|
||||
Wo_Mat_Services('MakeupFlagOn', RDSNo)
|
||||
end
|
||||
end
|
||||
|
||||
SlotWaferIDs = Xlate('WO_MAT', WOMatKey, 'SLOT_WAFER_ID', 'X')
|
||||
Convert @VM to '' in SlotWaferIDs
|
||||
@ -1057,6 +1067,7 @@ MakeUpLot:
|
||||
|
||||
If Not(InvalidRequest) then
|
||||
RDSNo = Get_Property(@Window:'.RDS_NO', 'TEXT')
|
||||
EpiCheck = Rds_Services('IsEpiPro', RDSNo)
|
||||
If RDSNo NE '' then
|
||||
Parms = ''
|
||||
Parms<1> = RDSNo ; // Cassette to verify wafer count of.
|
||||
@ -1064,12 +1075,22 @@ MakeUpLot:
|
||||
Parms<3> = 'MU' ; // Wafer counter tool location
|
||||
Proceed = Dialog_Box('NDW_WAFER_COUNTER', @Window, Parms)
|
||||
If Proceed EQ True$ then
|
||||
Set_Property(@WINDOW,'SAVEWARN', False$)
|
||||
Send_Event(@WINDOW,'CLEAR')
|
||||
obj_WO_Mat('ChangeFlag',WOMatKey:@RM:FieldNo:@RM:CheckValue)
|
||||
IF Get_Status(errCode) THEN
|
||||
ErrMsg(errCode)
|
||||
END
|
||||
If EpiCheck EQ False$ then
|
||||
IF Get_Status(errCode) THEN
|
||||
ErrMsg('Unable to set makeup flag until Unload stage is signed.')
|
||||
InvalidRequest = True$
|
||||
END else
|
||||
Set_Property(@WINDOW,'SAVEWARN', False$)
|
||||
Send_Event(@WINDOW,'CLEAR')
|
||||
If (CheckValue EQ True$) then
|
||||
Wo_Mat_Services('MakeupFlagOn', RDSNo)
|
||||
end
|
||||
end
|
||||
end else
|
||||
Set_Property(@WINDOW,'SAVEWARN', False$)
|
||||
Send_Event(@WINDOW,'CLEAR')
|
||||
end
|
||||
end else
|
||||
InvalidRequest = True$
|
||||
end
|
||||
|
@ -11,7 +11,7 @@ $Insert LOT_EVENT_EQUATES
|
||||
$Insert LOT_EQUATES
|
||||
$Insert LOT_OPERATION_EQUATES
|
||||
|
||||
Options EVENT_TYPES = 'MOVE_IN', 'MOVE_OUT', 'HOLD_ON', 'HOLD_OFF', 'REDUCE_WAFER_QTY', 'BONUS_WAFER_QTY', 'COMMENT', 'LOCATION', 'LOAD', 'UNSIGN_LOAD', 'TW_USE', 'CLOSE'
|
||||
Options EVENT_TYPES = 'MOVE_IN', 'MOVE_OUT', 'HOLD_ON', 'HOLD_OFF', 'REDUCE_WAFER_QTY', 'BONUS_WAFER_QTY', 'COMMENT', 'LOCATION', 'LOAD', 'UNSIGN_LOAD', 'TW_USE', 'CLOSE', 'SIGN_FQA', 'UNSIGN_FQA'
|
||||
Options LOT_TYPES = 'TW', 'RDS', 'WM_OUT', 'WM_IN', 'WO_MAT', 'LOT'
|
||||
Options LEGACY_LOT_TYPES = 'RDS', 'WM_OUT', 'WM_IN'
|
||||
Options BOOLEAN = 'True', 'False'
|
||||
|
@ -35,7 +35,7 @@ LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' T
|
||||
Headers = 'Logging DTM' : @FM : 'Lot Id' : @FM : 'Operator' : @FM : 'Message'
|
||||
objLotClosureLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ',', Headers, '', False$, False$)
|
||||
|
||||
Options EVENT_TYPES = 'MOVE_IN', 'MOVE_OUT', 'HOLD_ON', 'HOLD_OFF', 'REDUCE_WAFER_QTY', 'BONUS_WAFER_QTY', 'COMMENT', 'LOCATION', 'LOAD', 'UNSIGN_LOAD', 'TW_USE', 'CLOSE'
|
||||
Options EVENT_TYPES = 'MOVE_IN', 'MOVE_OUT', 'HOLD_ON', 'HOLD_OFF', 'REDUCE_WAFER_QTY', 'BONUS_WAFER_QTY', 'COMMENT', 'LOCATION', 'LOAD', 'UNSIGN_LOAD', 'TW_USE', 'CLOSE', 'SIGN_FQA', 'UNSIGN_FQA'
|
||||
Options LOT_TYPES = 'TW', 'RDS', 'WM_OUT', 'WM_IN', 'WO_MAT', 'LOT'
|
||||
|
||||
IsProd = Environment_Services('IsProd')
|
||||
|
@ -1834,11 +1834,13 @@ ChangeFlag:
|
||||
WMTableParms = FieldStore(WMTableParms,@RM,4,0,WOMatRec) ;* Put record in 4th field of OtParms
|
||||
|
||||
obj_Tables('WriteRec',WMTableParms)
|
||||
|
||||
IF Get_Status(errCode) THEN
|
||||
|
||||
* Logging
|
||||
|
||||
If FieldNo EQ WO_MAT_MAKEUP_BOX$ then
|
||||
IF Get_Status(errCode) THEN
|
||||
ErrorMsg = 'Makeup flag cannot be set until Unload is signed.'
|
||||
END
|
||||
end
|
||||
LogRec = 'obj_WO_Mat':TAB$:'Change Flag: Error':TAB$:WOMatKey:TAB$:FieldName:TAB$:Value:TAB$:'Unable to WRITE WO_MAT record. ':errCode
|
||||
LogRec := TAB$:@STATION:TAB$:@USER4:TAB$:OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS')
|
||||
|
||||
|
@ -118,6 +118,7 @@ $insert EXCEL_EQU
|
||||
$insert ROTR_REQUESTS_EQUATES
|
||||
$insert ROTR_EQUATES
|
||||
$insert REACT_LL_EQUATES
|
||||
$Insert WAFER_COUNTER_EQUATES
|
||||
|
||||
* Clean Insp Actions
|
||||
EQU ACTION$ACTIONS TO 1
|
||||
@ -143,8 +144,8 @@ Declare subroutine RTI_Set_Debugger, Database_Services, Btree.Extract, Extract_
|
||||
Declare subroutine Set_Status, Sleepery, Winyield, Yield, SRP_COM, QA_Services, Logging_Services, Obj_RDS
|
||||
Declare subroutine Validate, obj_WO_Mat, obj_WO_Mat_Log, obj_React_Status, Record_Lock, obj_React_State, obj_Post_Log
|
||||
Declare subroutine RDS_Services, obj_WO_React, RDS_React_Run, Signature_Services, SQL_Services, SRP_Stopwatch
|
||||
Declare subroutine Override_Services, Reactor_Services, Lot_Services, Mona_Services
|
||||
Declare function SRP_Sort_Array, Metrology_Services, obj_RDS_Test, obj_Test_Point_Map, Database_Services
|
||||
Declare subroutine Override_Services, Reactor_Services, Lot_Services, Obj_Notes, Mona_Services
|
||||
Declare function SRP_Sort_Array, Metrology_Services, obj_RDS_Test, obj_Test_Point_Map, Database_Services, Wafer_Counter_Services
|
||||
Declare function Work_Order_Services, SRP_JSON, Logging_Services, Environment_Services, SRP_Trim, Error_Services
|
||||
Declare function Min, Max, SRPSendMail, Btree.Extract, GetTickCount, HTTPClient_Services, Obj_RDS, SQL_Services
|
||||
Declare function SRP_Encode, SRP_Decode, SRP_COM, QA_Services, RDS_Services, Obj_NCR, Logging_Services, Obj_Reactor
|
||||
|
@ -89,7 +89,7 @@ EQU APPRED$ TO 255 + (128*256) + (128*65536)
|
||||
EQU APPORANGE$ TO 255 + (176*256) + (0*65536)
|
||||
|
||||
Declare subroutine ErrMsg, Set_Status, obj_WO_Mat, obj_WO_Mat_Log, obj_RDS, RDS_Services, Signature_Services, obj_Notes
|
||||
Declare subroutine Comm_RDS, WO_Mat_QA_Services, Wafer_Counter_Services, Dialog_Box
|
||||
Declare subroutine Comm_RDS, WO_Mat_QA_Services, Wafer_Counter_Services, Dialog_Box, Lot_Event_Services
|
||||
Declare function Dialog_Box, Msg, MemberOf, obj_WO_Mat, Database_Services, QA_Services, Signature_Services
|
||||
Declare function RDS_Services, Wafer_Counter_Services, Datetime, Supplement_Services
|
||||
|
||||
@ -603,6 +603,9 @@ Event SIGN_BUTTON.CLICK()
|
||||
Set_Property(@Window : '.POST_EPI_SUP_SIG_DATE', 'TEXT', SigDt)
|
||||
Set_Property(@Window : '.POST_EPI_SUP_SIG_TIME', 'TEXT', SigTmPlusOne)
|
||||
|
||||
** Create LOT_EVENT **
|
||||
Lot_Event_Services('CreateLotEvent', RDSNo, Datetime(), 'SIGN_FQA', '', '', @USER4, True$, 'RDS')
|
||||
|
||||
/* Sync up the RDS record with WO_MAT */
|
||||
IOOptions = Get_Property(@Window, 'IOOPTIONS')
|
||||
IOOptions<6> = True$
|
||||
|
@ -1722,6 +1722,84 @@ Service UnsignLoadExtra2(RDSNo, LSLUserName)
|
||||
|
||||
end service
|
||||
|
||||
Service ApplyQA100PercentADE(RDSNo)
|
||||
|
||||
Result = False$
|
||||
ErrorMsg = ''
|
||||
If RDSNo NE '' then
|
||||
// Change the QA metrology requirements to all wafers
|
||||
WoNo = Xlate('RDS', RDSNo, RDS_WO$, 'X')
|
||||
CassNo = Xlate('RDS', RDSNo, 'CASS_NO', 'X')
|
||||
WoMatQaKey = WoNo : '*' : CassNo
|
||||
WoMatQaRec = Xlate('WO_MAT_QA', WoMatQaKey, '', 'X')
|
||||
EpiCheck = Rds_Services('IsEpiPro', RDSNo)
|
||||
If EpiCheck EQ True$ then
|
||||
WoWaferQty = Xlate('WO_MAT', WoMatQaKey, WO_MAT_WAFER_QTY$, 'X')
|
||||
end else
|
||||
WoWaferQty = Xlate('RDS', RDSNo, 'WFRS_OUT', 'X')
|
||||
end
|
||||
|
||||
WoMatQaStages = WoMatQaRec<WO_MAT_QA_STAGE$>
|
||||
WoMatQaProfiles = WoMatQaRec<WO_MAT_QA_PROFILE$>
|
||||
WoMatQaSlots = WoMatQaRec<WO_MAT_QA_SLOT$>
|
||||
WoMatQaWfrQtys = WoMatQaRec<WO_MAT_QA_WFR_QTY$>
|
||||
WoMatQaProps = WoMatQaRec<WO_MAT_QA_PROP$>
|
||||
WoMatQaToolClasses = WoMatQaRec<WO_MAT_QA_TOOL_CLASS$>
|
||||
WoMatQaRecipes = WoMatQaRec<WO_MAT_QA_RECIPE$>
|
||||
WoMatQaRecipePatterns = WoMatQaRec<WO_MAT_QA_RECIPE_PATTERN$>
|
||||
WoMatQaMin = WoMatQaRec<WO_MAT_QA_MIN$>
|
||||
WoMatQaMax = WoMatQaRec<WO_MAT_QA_MAX$>
|
||||
WoMatQaOOS = WoMatQaRec<WO_MAT_QA_OUT_OF_SPEC$>
|
||||
StageCount = DCount(WoMatQaStages, @VM)
|
||||
For stageIdx = 1 to StageCount
|
||||
If (WoMatQaStages<0, stageIdx> _EQC 'QA') and (WoMatQaProfiles<0, stageIdx> _EQC '1ADE') then
|
||||
Slot = WoMatQaSlots<0, stageIdx>
|
||||
If (Slot _NEC 'L') then
|
||||
WoMatQaSlots<0, stageIdx> = 'A'
|
||||
WoMatQaWfrQtys<0, stageIdx> = WoWaferQty
|
||||
end
|
||||
If (Slot _EQC 'L') then
|
||||
WoMatQaStages<0, stageIdx> = ''
|
||||
WoMatQaProfiles<0, stageIdx> = ''
|
||||
WoMatQaSlots<0, stageIdx> = ''
|
||||
WoMatQaWfrQtys<0, stageIdx> = ''
|
||||
WoMatQaProps<0, stageIdx> = ''
|
||||
WoMatQaToolClasses<0, stageIdx> = ''
|
||||
WoMatQaRecipes<0, stageIdx> = ''
|
||||
WoMatQaRecipePatterns<0, stageIdx> = ''
|
||||
WoMatQaMin<0, stageIdx> = ''
|
||||
WoMatQaMax<0, stageIdx> = ''
|
||||
WoMatQaOOS<0, stageIdx> = ''
|
||||
end
|
||||
end
|
||||
Next stageIdx
|
||||
WoMatQaRec<WO_MAT_QA_STAGE$> = WoMatQaStages
|
||||
WoMatQaRec<WO_MAT_QA_PROFILE$> = WoMatQaProfiles
|
||||
WoMatQaRec<WO_MAT_QA_SLOT$> = WoMatQaSlots
|
||||
WoMatQaRec<WO_MAT_QA_WFR_QTY$> = WoMatQaWfrQtys
|
||||
WoMatQaRec<WO_MAT_QA_PROP$> = WoMatQaProps
|
||||
WoMatQaRec<WO_MAT_QA_TOOL_CLASS$> = WoMatQaToolClasses
|
||||
WoMatQaRec<WO_MAT_QA_RECIPE$> = WoMatQaRecipes
|
||||
WoMatQaRec<WO_MAT_QA_RECIPE_PATTERN$> = WoMatQaRecipePatterns
|
||||
WoMatQaRec<WO_MAT_QA_MIN$> = WoMatQaMin
|
||||
WoMatQaRec<WO_MAT_QA_MAX$> = WoMatQaMax
|
||||
WoMatQaRec<WO_MAT_QA_OUT_OF_SPEC$> = WoMatQaOOS
|
||||
WoMatQaRec<WO_MAT_QA_SIG$> = ''
|
||||
WoMatQaRec<WO_MAT_QA_SIG_DTM$> = ''
|
||||
WoMatQaRec<WO_MAT_QA_RESULT$> = ''
|
||||
Database_Services('WriteDataRow', 'WO_MAT_QA', WoMatQaKey, WoMatQaRec, True$, False$, False$)
|
||||
If Error_Services('HasError') then ErrorMsg = Error_Services('GetMessage')
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service:' service. Null RdsKey passed into service!'
|
||||
end
|
||||
|
||||
If ErrorMsg NE '' then
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end else
|
||||
Result = True$
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
Service ApplyAbortMetrology(RdsKeys)
|
||||
|
||||
@ -1740,58 +1818,8 @@ Service ApplyAbortMetrology(RdsKeys)
|
||||
Database_Services('WriteDataRow', 'CLEAN_INSP', CleanInspKey, CIRec, True$, False$, False$)
|
||||
If Error_Services('HasError') then ErrorMsg = Error_Services('GetMessage')
|
||||
|
||||
If ErrorMsg EQ '' then
|
||||
// Change the QA metrology requirements to all wafers
|
||||
CassNo = Xlate('RDS', RdsKey, 'CASS_NO', 'X')
|
||||
WoMatQaKey = WoNo : '*' : CassNo
|
||||
WoMatQaRec = Xlate('WO_MAT_QA', WoMatQaKey, '', 'X')
|
||||
WoWaferQty = Xlate('WO_MAT', WoMatQaKey, WO_MAT_WAFER_QTY$, 'X')
|
||||
WoMatQaStages = WoMatQaRec<WO_MAT_QA_STAGE$>
|
||||
WoMatQaProfiles = WoMatQaRec<WO_MAT_QA_PROFILE$>
|
||||
WoMatQaSlots = WoMatQaRec<WO_MAT_QA_SLOT$>
|
||||
WoMatQaWfrQtys = WoMatQaRec<WO_MAT_QA_WFR_QTY$>
|
||||
WoMatQaProps = WoMatQaRec<WO_MAT_QA_PROP$>
|
||||
WoMatQaToolClasses = WoMatQaRec<WO_MAT_QA_TOOL_CLASS$>
|
||||
WoMatQaRecipes = WoMatQaRec<WO_MAT_QA_RECIPE$>
|
||||
WoMatQaRecipePatterns = WoMatQaRec<WO_MAT_QA_RECIPE_PATTERN$>
|
||||
WoMatQaMin = WoMatQaRec<WO_MAT_QA_MIN$>
|
||||
WoMatQaMax = WoMatQaRec<WO_MAT_QA_MAX$>
|
||||
WoMatQaOOS = WoMatQaRec<WO_MAT_QA_OUT_OF_SPEC$>
|
||||
StageCount = DCount(WoMatQaStages, @VM)
|
||||
For stageIdx = 1 to StageCount
|
||||
If (WoMatQaStages<0, stageIdx> _EQC 'QA') and (WoMatQaProfiles<0, stageIdx> _EQC '1ADE') then
|
||||
Slot = WoMatQaSlots<0, stageIdx>
|
||||
If (Slot _NEC 'L') then
|
||||
WoMatQaSlots<0, stageIdx> = 'A'
|
||||
WoMatQaWfrQtys<0, stageIdx> = WoWaferQty
|
||||
end
|
||||
If (Slot _EQC 'L') then
|
||||
WoMatQaStages<0, stageIdx> = ''
|
||||
WoMatQaProfiles<0, stageIdx> = ''
|
||||
WoMatQaSlots<0, stageIdx> = ''
|
||||
WoMatQaWfrQtys<0, stageIdx> = ''
|
||||
WoMatQaProps<0, stageIdx> = ''
|
||||
WoMatQaToolClasses<0, stageIdx> = ''
|
||||
WoMatQaRecipes<0, stageIdx> = ''
|
||||
WoMatQaRecipePatterns<0, stageIdx> = ''
|
||||
WoMatQaMin<0, stageIdx> = ''
|
||||
WoMatQaMax<0, stageIdx> = ''
|
||||
WoMatQaOOS<0, stageIdx> = ''
|
||||
end
|
||||
end
|
||||
Next stageIdx
|
||||
WoMatQaRec<WO_MAT_QA_STAGE$> = WoMatQaStages
|
||||
WoMatQaRec<WO_MAT_QA_PROFILE$> = WoMatQaProfiles
|
||||
WoMatQaRec<WO_MAT_QA_SLOT$> = WoMatQaSlots
|
||||
WoMatQaRec<WO_MAT_QA_WFR_QTY$> = WoMatQaWfrQtys
|
||||
WoMatQaRec<WO_MAT_QA_PROP$> = WoMatQaProps
|
||||
WoMatQaRec<WO_MAT_QA_TOOL_CLASS$> = WoMatQaToolClasses
|
||||
WoMatQaRec<WO_MAT_QA_RECIPE$> = WoMatQaRecipes
|
||||
WoMatQaRec<WO_MAT_QA_RECIPE_PATTERN$> = WoMatQaRecipePatterns
|
||||
WoMatQaRec<WO_MAT_QA_MIN$> = WoMatQaMin
|
||||
WoMatQaRec<WO_MAT_QA_MAX$> = WoMatQaMax
|
||||
WoMatQaRec<WO_MAT_QA_OUT_OF_SPEC$> = WoMatQaOOS
|
||||
Database_Services('WriteDataRow', 'WO_MAT_QA', WoMatQaKey, WoMatQaRec, True$, False$, False$)
|
||||
If ErrorMsg EQ '' then
|
||||
Result = Rds_Services('ApplyQA100PercentADE', RDSKey)
|
||||
If Error_Services('HasError') then ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
|
||||
@ -1855,7 +1883,3 @@ return
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -62,10 +62,11 @@ Equ COL$TAGS to 9
|
||||
Equ COL$TOOL_ID to 10
|
||||
|
||||
Declare function obj_Prod_Spec, RDS_Services, Error_Services, Signature_Services, Memory_Services, obj_RDS_Test
|
||||
Declare function SRP_Array
|
||||
Declare function Database_Services, obj_WO_Mat, Dialog_Box, MemberOf, Msg, QA_Services, Datetime, Supplement_Services
|
||||
Declare function Environment_Services, GetTickCount
|
||||
Declare subroutine Error_Services, Popup, Memory_Services, SRP_Stopwatch, Set_Status, Database_Services, obj_WO_Mat
|
||||
Declare subroutine Obj_Notes, Signature_Services, Obj_WO_Mat_Log, ErrMsg, Mona_Services
|
||||
Declare subroutine Obj_Notes, Signature_Services, Obj_WO_Mat_Log, ErrMsg, Obj_Rds, Lot_Event_Services, Mona_Services
|
||||
|
||||
PSNKey = ServiceKeyID
|
||||
ReactorKey = ServiceKeyID
|
||||
@ -2841,6 +2842,64 @@ Service SignSupplement(RDSNo, User)
|
||||
end service
|
||||
|
||||
|
||||
Service UnsignFQAStage(RDSNo)
|
||||
|
||||
IsEPP = Rds_Services('IsEpiPro', RDSNo)
|
||||
If IsEpp EQ False$ then
|
||||
Database_Services('ActivateRecord', 'RDS', RDSNo)
|
||||
If Error_Services('NoError') then
|
||||
Valid = ''
|
||||
CurRdsNo = RDSNo
|
||||
WONo = {WO}
|
||||
CassNo = {CASS_NO}
|
||||
WOStep = {WO_STEP}
|
||||
WOMatKey = WONo:'*':CassNo
|
||||
WOMatRec = XLATE('WO_MAT',WOMatKey,'','X')
|
||||
// Unsign WO_MAT
|
||||
InvWH = WOMatRec<WO_MAT_INV_WH$>
|
||||
InvLoc = WOMatRec<WO_MAT_INV_LOCATION$>
|
||||
InvAction = WOMatRec<WO_MAT_INV_ACTION$>
|
||||
InvDTM = WOMatRec<WO_MAT_INV_DTM$>
|
||||
InvUser = WOMatRec<WO_MAT_INV_USER$>
|
||||
// Get List of keys to delete
|
||||
InvCount = Dcount(InvWH, @VM)
|
||||
DeleteList = ''
|
||||
For I = 1 to InvCount
|
||||
ThisLoc = InvAction<1,I>
|
||||
If ThisLoc EQ '1QA' or ThisLoc EQ 'POST' then
|
||||
DeleteList<-1> = I
|
||||
end
|
||||
Next I
|
||||
// Reverse array to work backwards through deletions
|
||||
DeleteList = SRP_Array('Reverse', DeleteList, @FM)
|
||||
If DeleteList NE '' then
|
||||
For Each Item in DeleteList Using @FM
|
||||
WOMatRec = Delete(WOMatRec, WO_MAT_INV_WH$, Item, 0)
|
||||
WOMatRec = Delete(WOMatRec, WO_MAT_INV_LOCATION$, Item, 0)
|
||||
WOMatRec = Delete(WOMatRec, WO_MAT_INV_ACTION$, Item, 0)
|
||||
WOMatRec = Delete(WOMatRec, WO_MAT_INV_DTM$, Item, 0)
|
||||
WOMatRec = Delete(WOMatRec, WO_MAT_INV_USER$, Item, 0)
|
||||
Next Item
|
||||
Database_Services('WriteDataRow', 'WO_MAT', WOMatKey, WOMatRec, True$, False$, False$)
|
||||
end
|
||||
|
||||
// Unsign RDS
|
||||
{SUP_VER_SIG} = ''
|
||||
{SUP_VER_SIG_DATE} = ''
|
||||
{SUP_VER_SIG_TIME} = ''
|
||||
Database_Services('WriteDataRow', 'RDS', RDSNo, @Record, True$, False$, False$)
|
||||
** Create LOT_EVENT **
|
||||
Lot_Event_Services('CreateLotEvent', RDSNo, Datetime(), 'UNSIGN_FQA', '', '', @USER4, True$, 'RDS')
|
||||
end else
|
||||
Error_Services('Add', 'Error accessing RDS.')
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'This service is currently only available for non-EpiPro lots.')
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Internal GoSubs
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
@ -2858,3 +2917,7 @@ GetMostRecentSig:
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -58,7 +58,7 @@ Equ Comma$ to ','
|
||||
Declare function Error_Services, Database_Services, Environment_Services, Logging_Services, obj_WO_Mat, Max
|
||||
Declare function GaN_Services, Signature_Services, obj_WO_LOG, SRP_Array, MemberOf, Datetime
|
||||
Declare subroutine Error_Services, Database_Services, Environment_Services, Logging_Services, Obj_SAP, obj_Notes
|
||||
Declare subroutine SAP_Services, Material_Services, RList, Work_Order_Services, Service_Services
|
||||
Declare subroutine SAP_Services, Material_Services, RList, Work_Order_Services, Service_Services, Set_Status
|
||||
|
||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_Mat'
|
||||
LogDate = Oconv(Date(), 'D4/')
|
||||
@ -406,6 +406,18 @@ WRITE_RECORD_PRE:
|
||||
Record<WO_MAT_SLOT_NCR$> = SlotNCRs
|
||||
SaveRecord = Record
|
||||
end
|
||||
NewMUFlag = Record<WO_MAT_MAKEUP_BOX$>
|
||||
OrigMUFlag = OrigRecord<WO_MAT_MAKEUP_BOX$>
|
||||
UnloadCheck = Signature_Services('GetStageSummary', WOMatKeyID, 'UNLOAD')<2>
|
||||
If (NewMUFlag EQ True$) AND (OrigMUFlag NE True$) then
|
||||
If UnloadCheck NE True$ then
|
||||
OrigFileError = 104:': Cassette ineligible to be converted to makeup wafer until unload is signed.'
|
||||
Status = 0
|
||||
Record = ''
|
||||
ActionFlow = ACTION_STOP$
|
||||
end
|
||||
end
|
||||
|
||||
End Case
|
||||
|
||||
TWChangeDetected = (OrigRecord<WO_MAT_SLOT_MET_NO$> NE Record<WO_MAT_SLOT_MET_NO$>)
|
||||
@ -486,7 +498,8 @@ WRITE_RECORD_PRE:
|
||||
Record = RecordCopy
|
||||
Record<WO_MAT_SLOT_MET_NO$> = SlotMetNos
|
||||
SaveRecord = Record
|
||||
end
|
||||
end
|
||||
|
||||
End Case
|
||||
end
|
||||
|
||||
|
@ -2,9 +2,9 @@ Compile function WO_MAT_Services(@Service, @Params)
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
Declare function Database_Services, Error_Services, SRP_Json, SRP_Com, Environment_Services, Logging_Services
|
||||
Declare function Datetime, GetTickCount
|
||||
Declare function Datetime, Rds_Services, GetTickCount
|
||||
Declare subroutine Error_Services, SRP_Json, SRP_Com, Wo_Mat_Services, Database_Services, Logging_Services
|
||||
Declare subroutine obj_wo_mat_log, Set_Status, Mona_Services
|
||||
Declare subroutine obj_wo_mat_log, Set_Status, Rds_Services, Signature_Services, Mona_Services
|
||||
|
||||
$insert LOGICAL
|
||||
$Insert APP_INSERTS
|
||||
@ -487,3 +487,36 @@ end service
|
||||
|
||||
|
||||
|
||||
Service MakeupFlagOn(RDSNo)
|
||||
|
||||
EpiCheck = Rds_Services('IsEpiPro', RDSNo)
|
||||
BioRadDown = False$
|
||||
Bio4Down = False$
|
||||
Bio5Down = False$
|
||||
Bio4LogKey = Xlate('TOOL', 'BIORAD4', 'CURR_MODE_KEY', 'X')
|
||||
Bio5LogKey = Xlate('TOOL', 'BIORAD5', 'CURR_MODE_KEY', 'X')
|
||||
Bio4Mode = Xlate('TOOL_LOG', Bio4LogKey, 'TOOL_MODE', 'X')
|
||||
Bio5Mode = Xlate('TOOL_LOG', Bio5LogKey, 'TOOL_MODE', 'X')
|
||||
|
||||
If (Bio4Mode NE 'PROD') AND (Bio4Mode NE 'LIM') then Bio4Down = True$
|
||||
If (Bio5Mode NE 'PROD') AND (Bio5Mode NE 'LIM') then Bio5Down = True$
|
||||
|
||||
If (Bio4Down) AND (Bio5Down) then BioRadDown = True$
|
||||
|
||||
If EpiCheck EQ False$ then
|
||||
WOMatKey = Xlate('RDS', RDSNo, 'WO_MAT_KEY', 'X')
|
||||
WOMatQARec = XLATE('WO_MAT_QA',WOMatKey,'','X')
|
||||
PropRow = WOMatQARec<3>
|
||||
If (Count(PropRow, 'THICK') NE 0) AND (BioRadDown EQ False$) then
|
||||
CurrentStage = Rds_Services('GetCurrentStage', RDSNo)
|
||||
If CurrentStage EQ 'COMP' then
|
||||
Signature_Services('UnsignFQAStage', RDSNo)
|
||||
end
|
||||
Rds_Services('ApplyQA100PercentADE', RDSNo)
|
||||
end
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user