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:
Mitchem Dakota (CSC FI SPS MESLEO External)
2025-06-18 22:23:57 +02:00
parent 5cb17c6d52
commit 273b7f67a6
11 changed files with 254 additions and 83 deletions

View File

@ -7,7 +7,7 @@ COMPILE FUNCTION Comm_WO_Mat(Instruction, Parm1,Parm2)
10/18/2006 - John C. Henry, J.C. Henry & Co., Inc. 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 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 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') LotId = Xlate('WO_MAT', WOMatKey, 'WMO_KEY', 'X')
end else end else
LotId = Xlate('WO_MAT', WOMatKey, 'RDS_NO', 'X') LotId = Xlate('WO_MAT', WOMatKey, 'RDS_NO', 'X')
RDSNo = LotID
end end
If LotId NE '' then If LotId NE '' then
@ -636,12 +637,22 @@ MakeUpClick:
Parms<3> = 'MU' ; // Wafer counter tool location Parms<3> = 'MU' ; // Wafer counter tool location
Proceed = Dialog_Box('NDW_WAFER_COUNTER', @Window, Parms) Proceed = Dialog_Box('NDW_WAFER_COUNTER', @Window, Parms)
If Proceed EQ True$ then If Proceed EQ True$ then
Set_Property(@WINDOW,'SAVEWARN', False$) obj_WO_Mat('ChangeFlag',WOMatKey:@RM:FieldNo:@RM:CheckValue)
Send_Event(@WINDOW,'CLEAR') If EpiPro EQ False$ then
obj_WO_Mat('ChangeFlag',WOMatKey:@RM:FieldNo:@RM:CheckValue) IF Get_Status(errCode) THEN
IF Get_Status(errCode) THEN ErrMsg('Unable to set makeup flag until Unload stage is signed.')
ErrMsg(errCode) InvalidRequest = True$
END 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 end else
InvalidRequest = True$ InvalidRequest = True$
end end

View File

@ -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 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 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 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 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 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 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 POPUP_EQUATES
$INSERT LOGICAL $INSERT LOGICAL
@ -830,9 +830,19 @@ AddMakeup:
FieldNo = WO_MAT_MAKEUP_BOX$ FieldNo = WO_MAT_MAKEUP_BOX$
CheckValue = 1 CheckValue = 1
EpiCheck = Rds_Services('IsEpiPro', RDSNo)
obj_WO_Mat('ChangeFlag',WOMatKey:@RM:FieldNo:@RM:CheckValue) 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') SlotWaferIDs = Xlate('WO_MAT', WOMatKey, 'SLOT_WAFER_ID', 'X')
Convert @VM to '' in SlotWaferIDs Convert @VM to '' in SlotWaferIDs
@ -1057,6 +1067,7 @@ MakeUpLot:
If Not(InvalidRequest) then If Not(InvalidRequest) then
RDSNo = Get_Property(@Window:'.RDS_NO', 'TEXT') RDSNo = Get_Property(@Window:'.RDS_NO', 'TEXT')
EpiCheck = Rds_Services('IsEpiPro', RDSNo)
If RDSNo NE '' then If RDSNo NE '' then
Parms = '' Parms = ''
Parms<1> = RDSNo ; // Cassette to verify wafer count of. Parms<1> = RDSNo ; // Cassette to verify wafer count of.
@ -1064,12 +1075,22 @@ MakeUpLot:
Parms<3> = 'MU' ; // Wafer counter tool location Parms<3> = 'MU' ; // Wafer counter tool location
Proceed = Dialog_Box('NDW_WAFER_COUNTER', @Window, Parms) Proceed = Dialog_Box('NDW_WAFER_COUNTER', @Window, Parms)
If Proceed EQ True$ then If Proceed EQ True$ then
Set_Property(@WINDOW,'SAVEWARN', False$)
Send_Event(@WINDOW,'CLEAR')
obj_WO_Mat('ChangeFlag',WOMatKey:@RM:FieldNo:@RM:CheckValue) obj_WO_Mat('ChangeFlag',WOMatKey:@RM:FieldNo:@RM:CheckValue)
IF Get_Status(errCode) THEN If EpiCheck EQ False$ then
ErrMsg(errCode) IF Get_Status(errCode) THEN
END 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 end else
InvalidRequest = True$ InvalidRequest = True$
end end

View File

@ -11,7 +11,7 @@ $Insert LOT_EVENT_EQUATES
$Insert LOT_EQUATES $Insert LOT_EQUATES
$Insert LOT_OPERATION_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 LOT_TYPES = 'TW', 'RDS', 'WM_OUT', 'WM_IN', 'WO_MAT', 'LOT'
Options LEGACY_LOT_TYPES = 'RDS', 'WM_OUT', 'WM_IN' Options LEGACY_LOT_TYPES = 'RDS', 'WM_OUT', 'WM_IN'
Options BOOLEAN = 'True', 'False' Options BOOLEAN = 'True', 'False'

View File

@ -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' Headers = 'Logging DTM' : @FM : 'Lot Id' : @FM : 'Operator' : @FM : 'Message'
objLotClosureLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ',', Headers, '', False$, False$) 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' Options LOT_TYPES = 'TW', 'RDS', 'WM_OUT', 'WM_IN', 'WO_MAT', 'LOT'
IsProd = Environment_Services('IsProd') IsProd = Environment_Services('IsProd')

View File

@ -1834,11 +1834,13 @@ ChangeFlag:
WMTableParms = FieldStore(WMTableParms,@RM,4,0,WOMatRec) ;* Put record in 4th field of OtParms WMTableParms = FieldStore(WMTableParms,@RM,4,0,WOMatRec) ;* Put record in 4th field of OtParms
obj_Tables('WriteRec',WMTableParms) obj_Tables('WriteRec',WMTableParms)
IF Get_Status(errCode) THEN IF Get_Status(errCode) THEN
* Logging * 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 = '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') LogRec := TAB$:@STATION:TAB$:@USER4:TAB$:OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS')

View File

@ -118,6 +118,7 @@ $insert EXCEL_EQU
$insert ROTR_REQUESTS_EQUATES $insert ROTR_REQUESTS_EQUATES
$insert ROTR_EQUATES $insert ROTR_EQUATES
$insert REACT_LL_EQUATES $insert REACT_LL_EQUATES
$Insert WAFER_COUNTER_EQUATES
* Clean Insp Actions * Clean Insp Actions
EQU ACTION$ACTIONS TO 1 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 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 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 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 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 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 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 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 Declare function SRP_Encode, SRP_Decode, SRP_COM, QA_Services, RDS_Services, Obj_NCR, Logging_Services, Obj_Reactor

View File

@ -89,7 +89,7 @@ EQU APPRED$ TO 255 + (128*256) + (128*65536)
EQU APPORANGE$ TO 255 + (176*256) + (0*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 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 Dialog_Box, Msg, MemberOf, obj_WO_Mat, Database_Services, QA_Services, Signature_Services
Declare function RDS_Services, Wafer_Counter_Services, Datetime, Supplement_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_DATE', 'TEXT', SigDt)
Set_Property(@Window : '.POST_EPI_SUP_SIG_TIME', 'TEXT', SigTmPlusOne) 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 */ /* Sync up the RDS record with WO_MAT */
IOOptions = Get_Property(@Window, 'IOOPTIONS') IOOptions = Get_Property(@Window, 'IOOPTIONS')
IOOptions<6> = True$ IOOptions<6> = True$

View File

@ -1722,6 +1722,84 @@ Service UnsignLoadExtra2(RDSNo, LSLUserName)
end service 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) Service ApplyAbortMetrology(RdsKeys)
@ -1741,57 +1819,7 @@ Service ApplyAbortMetrology(RdsKeys)
If Error_Services('HasError') then ErrorMsg = Error_Services('GetMessage') If Error_Services('HasError') then ErrorMsg = Error_Services('GetMessage')
If ErrorMsg EQ '' then If ErrorMsg EQ '' then
// Change the QA metrology requirements to all wafers Result = Rds_Services('ApplyQA100PercentADE', RDSKey)
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 Error_Services('HasError') then ErrorMsg = Error_Services('GetMessage') If Error_Services('HasError') then ErrorMsg = Error_Services('GetMessage')
end end
@ -1855,7 +1883,3 @@ return

View File

@ -62,10 +62,11 @@ Equ COL$TAGS to 9
Equ COL$TOOL_ID to 10 Equ COL$TOOL_ID to 10
Declare function obj_Prod_Spec, RDS_Services, Error_Services, Signature_Services, Memory_Services, obj_RDS_Test 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 Database_Services, obj_WO_Mat, Dialog_Box, MemberOf, Msg, QA_Services, Datetime, Supplement_Services
Declare function Environment_Services, GetTickCount Declare function Environment_Services, GetTickCount
Declare subroutine Error_Services, Popup, Memory_Services, SRP_Stopwatch, Set_Status, Database_Services, obj_WO_Mat 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 PSNKey = ServiceKeyID
ReactorKey = ServiceKeyID ReactorKey = ServiceKeyID
@ -2841,6 +2842,64 @@ Service SignSupplement(RDSNo, User)
end service 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 // Internal GoSubs
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@ -2858,3 +2917,7 @@ GetMostRecentSig:
return return

View File

@ -58,7 +58,7 @@ Equ Comma$ to ','
Declare function Error_Services, Database_Services, Environment_Services, Logging_Services, obj_WO_Mat, Max 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 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 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' LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\WO_Mat'
LogDate = Oconv(Date(), 'D4/') LogDate = Oconv(Date(), 'D4/')
@ -406,6 +406,18 @@ WRITE_RECORD_PRE:
Record<WO_MAT_SLOT_NCR$> = SlotNCRs Record<WO_MAT_SLOT_NCR$> = SlotNCRs
SaveRecord = Record SaveRecord = Record
end 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 End Case
TWChangeDetected = (OrigRecord<WO_MAT_SLOT_MET_NO$> NE Record<WO_MAT_SLOT_MET_NO$>) TWChangeDetected = (OrigRecord<WO_MAT_SLOT_MET_NO$> NE Record<WO_MAT_SLOT_MET_NO$>)
@ -487,6 +499,7 @@ WRITE_RECORD_PRE:
Record<WO_MAT_SLOT_MET_NO$> = SlotMetNos Record<WO_MAT_SLOT_MET_NO$> = SlotMetNos
SaveRecord = Record SaveRecord = Record
end end
End Case End Case
end end

View File

@ -2,9 +2,9 @@ Compile function WO_MAT_Services(@Service, @Params)
#pragma precomp SRP_PreCompiler #pragma precomp SRP_PreCompiler
Declare function Database_Services, Error_Services, SRP_Json, SRP_Com, Environment_Services, Logging_Services 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 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 LOGICAL
$Insert APP_INSERTS $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