Re-adding from old branch

This commit is contained in:
Infineon\Ouellette 2024-11-19 15:51:39 -07:00 committed by Ouellette Jonathan (CSC FI SPS MESLEO)
parent ef1744c8b1
commit 3a2ff00722
14 changed files with 2821 additions and 1783 deletions

View File

@ -17,11 +17,11 @@
"<1,4>": "",
"<1,5>": "0",
"<1,6>": "0",
"<1,7>": "-428",
"<1,7>": "-429",
"<1,8>": "-377",
"<1,9>": "Log Test Wafer Usage",
"<1,10>": {
"<1,10,1>": "0x94CF0000",
"<1,10,1>": "0x84CF0000",
"<1,10,2>": "0x100"
},
"<1,11>": {
@ -65,9 +65,39 @@
"<1,18,1,14>": "",
"<1,18,1,15>": "COMMEVT",
"<1,18,1,16>": "0"
},
"<1,18,2>": {
"<1,18,2,1>": "X",
"<1,18,2,2>": "EXECUTE",
"<1,18,2,3>": "@WINDOW_EVENTS",
"<1,18,2,4>": {
"<1,18,2,4,1>": "@SELF",
"<1,18,2,4,2>": "@EVENT",
"<1,18,2,4,3>": "@PARAM1",
"<1,18,2,4,4>": "@PARAM2",
"<1,18,2,4,5>": "@PARAM3",
"<1,18,2,4,6>": "@PARAM4",
"<1,18,2,4,7>": "@PARAM5",
"<1,18,2,4,8>": "@PARAM6"
},
"<1,18,2,5>": "",
"<1,18,2,6>": "",
"<1,18,2,7>": "",
"<1,18,2,8>": "",
"<1,18,2,9>": "",
"<1,18,2,10>": "",
"<1,18,2,11>": "",
"<1,18,2,12>": "",
"<1,18,2,13>": "",
"<1,18,2,14>": "",
"<1,18,2,15>": "COMMEVT",
"<1,18,2,16>": "0"
}
},
"<1,19>": "CREATE",
"<1,19>": {
"<1,19,1>": "CREATE",
"<1,19,2>": "CLOSE"
},
"<1,20>": "",
"<1,21>": "",
"<1,22>": "",
@ -717,7 +747,7 @@
"<4,10,2>": "0x200"
},
"<4,11>": {
"<4,11,1>": "0x60000",
"<4,11,1>": "0x880",
"<4,11,2>": "0x80000000"
},
"<4,12>": "14",
@ -745,8 +775,36 @@
},
"<4,16>": "",
"<4,17>": "",
"<4,18>": "",
"<4,19>": "",
"<4,18>": {
"<4,18,1>": {
"<4,18,1,1>": "X",
"<4,18,1,2>": "EXECUTE",
"<4,18,1,3>": "@WINDOW_EVENTS",
"<4,18,1,4>": {
"<4,18,1,4,1>": "@SELF",
"<4,18,1,4,2>": "@EVENT",
"<4,18,1,4,3>": "@PARAM1",
"<4,18,1,4,4>": "@PARAM2",
"<4,18,1,4,5>": "@PARAM3",
"<4,18,1,4,6>": "@PARAM4",
"<4,18,1,4,7>": "@PARAM5",
"<4,18,1,4,8>": "@PARAM6"
},
"<4,18,1,5>": "",
"<4,18,1,6>": "",
"<4,18,1,7>": "",
"<4,18,1,8>": "",
"<4,18,1,9>": "",
"<4,18,1,10>": "",
"<4,18,1,11>": "",
"<4,18,1,12>": "",
"<4,18,1,13>": "",
"<4,18,1,14>": "",
"<4,18,1,15>": "COMMEVT",
"<4,18,1,16>": "0"
}
},
"<4,19>": "ROWSELCHANGED",
"<4,20>": "",
"<4,21>": "",
"<4,22>": "",
@ -786,53 +844,7 @@
"<4,32>": "",
"<4,33>": "",
"<4,34>": "",
"<4,35>": {
"<4,35,1>": {
"<4,35,1,1>": "",
"<4,35,1,2>": "",
"<4,35,1,3>": ""
},
"<4,35,2>": {
"<4,35,2,1>": "",
"<4,35,2,2>": "",
"<4,35,2,3>": ""
},
"<4,35,3>": {
"<4,35,3,1>": "",
"<4,35,3,2>": "",
"<4,35,3,3>": ""
},
"<4,35,4>": {
"<4,35,4,1>": "",
"<4,35,4,2>": "",
"<4,35,4,3>": ""
},
"<4,35,5>": {
"<4,35,5,1>": "",
"<4,35,5,2>": "",
"<4,35,5,3>": ""
},
"<4,35,6>": {
"<4,35,6,1>": "",
"<4,35,6,2>": "",
"<4,35,6,3>": ""
},
"<4,35,7>": {
"<4,35,7,1>": "",
"<4,35,7,2>": "",
"<4,35,7,3>": ""
},
"<4,35,8>": {
"<4,35,8,1>": "",
"<4,35,8,2>": "",
"<4,35,8,3>": ""
},
"<4,35,9>": {
"<4,35,9,1>": "",
"<4,35,9,2>": "",
"<4,35,9,3>": ""
}
},
"<4,35>": "",
"<4,36>": "",
"<4,37>": "",
"<4,38>": "",
@ -2793,8 +2805,36 @@
},
"<15,16>": "",
"<15,17>": "",
"<15,18>": "",
"<15,19>": "",
"<15,18>": {
"<15,18,1>": {
"<15,18,1,1>": "X",
"<15,18,1,2>": "EXECUTE",
"<15,18,1,3>": "@WINDOW_EVENTS",
"<15,18,1,4>": {
"<15,18,1,4,1>": "@SELF",
"<15,18,1,4,2>": "@EVENT",
"<15,18,1,4,3>": "@PARAM1",
"<15,18,1,4,4>": "@PARAM2",
"<15,18,1,4,5>": "@PARAM3",
"<15,18,1,4,6>": "@PARAM4",
"<15,18,1,4,7>": "@PARAM5",
"<15,18,1,4,8>": "@PARAM6"
},
"<15,18,1,5>": "",
"<15,18,1,6>": "",
"<15,18,1,7>": "",
"<15,18,1,8>": "",
"<15,18,1,9>": "",
"<15,18,1,10>": "",
"<15,18,1,11>": "",
"<15,18,1,12>": "",
"<15,18,1,13>": "",
"<15,18,1,14>": "",
"<15,18,1,15>": "COMMEVT",
"<15,18,1,16>": "0"
}
},
"<15,19>": "CLICK",
"<15,20>": "",
"<15,21>": "",
"<15,22>": "",

File diff suppressed because it is too large Load Diff

View File

@ -28,7 +28,7 @@ LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' L
Headers = 'Logging DTM' : @FM : 'Lot Id' : @FM : 'Event Type' : @FM : 'Operator' : @FM : 'Begin Wafer Qty' : @FM : 'End Wafer Qty' : @FM : 'Bonus Wafer Qty' : @FM : 'Reduce Wafer Qty' : @FM : 'Message'
objLotEventLog = 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'
Options EVENT_TYPES = 'MOVE_IN', 'MOVE_OUT', 'HOLD_ON', 'HOLD_OFF', 'REDUCE_WAFER_QTY', 'BONUS_WAFER_QTY', 'COMMENT', 'LOCATION', 'LOAD', 'UNSIGN_LOAD', 'TW_USE'
Options LOT_TYPES = 'TW', 'RDS', 'WM_OUT', 'WM_IN'
GoToService
@ -81,6 +81,7 @@ end service
Service CreateNewLot(LotType, ProdName, LotQty, VendorPartNo, VendorLotNo, VendorCode, Username, PrinterID, LotId)
; //649491 , 03M6241, 814474, SP
debug
CreatedLotNumber = ''
ErrorMessage = ''
Begin Case
@ -135,9 +136,10 @@ Service CreateNewLot(LotType, ProdName, LotQty, VendorPartNo, VendorLotNo, Vendo
If Error_Services('NoError') then
//Check in at first operation
//Get Curr Operation(Should be first one in sequence)
ThisLotCurrOpId = Lot_Services('GetLotCurrOperation', CreatedLotNumber)
ThisLotCurrOpId = Lot_Services('GetLotCurrOperationId', CreatedLotNumber)
If ThisLotCurrOpId NE '' then
Lot_Services('MoveInLot', NewLotId, LotQty, Username)
Lot_Services('CreateLotEvent', CreatedLotNumber, 'TW', Datetime(), 'MOVE_IN', 'Move Lot in.', '', 0, 0, ThisLotCurrOpId, Username)
//Lot_Services('MoveInLot', NewLotId, Username)
if Error_Services('NoError') then
//Set lot to open
Lot_Services('OpenLot', CreatedLotNumber)
@ -149,9 +151,11 @@ Service CreateNewLot(LotType, ProdName, LotQty, VendorPartNo, VendorLotNo, Vendo
ErrorMessage = 'Error in Create New Test Wafer Lot Process, lot id: ' : CreatedLotNumber : ' , ' : Error_Services('GetMessage')
end
end
Lot_Services('MoveOutLot', NewLotId, LotQty, Username)
Lot_Services('CreateLotEvent', CreatedLotNumber, 'TW', Datetime(), 'MOVE_OUT', 'Move Lot out.', '', 0, 0, '', Username)
//Lot_Services('MoveOutLot', NewLotId, Username)
If Error_Services('NoError') then
Lot_Services('MoveInLot', NewLotId, LotQty, Username)
//Lot_Services('MoveInLot', NewLotId, Username)
Lot_Services('CreateLotEvent', CreatedLotNumber, 'TW', Datetime(), 'MOVE_IN', 'Move in out.', '', 0, 0, '', Username)
If Error_Services('HasError') then
ErrorMessage = 'Error in Create New Test Wafer Lot Process, lot id: ' : NewLotId : ' , ' : Error_Services('GetMessage')
end
@ -249,9 +253,9 @@ Service CreateNewTestWaferLot(LotType, ProdName, LotQty, VendorPartNo, VendorLot
If Error_Services('NoError') then
//Check in at first operation
//Get Curr Operation(Should be first one in sequence)
ThisLotCurrOpId = Lot_Services('GetLotCurrOperation', CreatedLotNumber)
ThisLotCurrOpId = Lot_Services('GetLotCurrOperationId', CreatedLotNumber)
If ThisLotCurrOpId NE '' then
Lot_Services('MoveInLot', NewLotId, LotQty, Username)
Lot_Services('MoveInLot', NewLotId, Username)
if Error_Services('NoError') then
//Set lot to open
Lot_Services('OpenLot', CreatedLotNumber)
@ -263,9 +267,9 @@ Service CreateNewTestWaferLot(LotType, ProdName, LotQty, VendorPartNo, VendorLot
ErrorMessage = 'Error in Create New Test Wafer Lot Process, lot id: ' : CreatedLotNumber : ' , ' : Error_Services('GetMessage')
end
end
Lot_Services('MoveOutLot', NewLotId, LotQty, Username)
Lot_Services('MoveOutLot', NewLotId, Username)
If Error_Services('NoError') then
Lot_Services('MoveInLot', NewLotId, LotQty, Username)
Lot_Services('MoveInLot', NewLotId, Username)
If Error_Services('HasError') then
ErrorMessage = 'Error in Create New Test Wafer Lot Process, lot id: ' : NewLotId : ' , ' : Error_Services('GetMessage')
end
@ -454,7 +458,7 @@ Service GetLotEventsInSequence(LotId)
Response = LotEventsToReturn
end service
Service GetLotCurrOperation(LotId)
Service GetLotCurrOperationId(LotId)
CurrOperation = ''
If LotID NE '' then
//Get them in sequence first
@ -473,13 +477,34 @@ Service GetLotCurrOperation(LotId)
Response = CurrOperation
end service
Service GetLotCurrOperationName(LotId)
CurrOperationId = ''
CurrOperationName = ''
If LotID NE '' then
//Get them in sequence first
LotOperationsInSequence = Lot_Services('GetLotOperationSequence', LotId)
for each LotOperation in LotOperationsInSequence using @FM
ThisLotOperationStartDTM = Xlate('LOT_OPERATION', LotOperation, LOT_OPERATION_DATETIME_IN$, 'X')
ThisLotOperationEndDTM = Xlate('LOT_OPERATION', LotOperation, LOT_OPERATION_DATETIME_OUT$, 'X')
If ThisLotOperationEndDTM Eq '' then
CurrOperationId = LotOperation
CurrOperationName = Database_Services('ReadDataColumn', 'LOT_OPERATION', CurrOperationId, LOT_OPERATION_OPERATION_ID$, True$, 0, False$)
end
until CurrOperationName
Next LotOperation
end else
//error: lot id was null
end
Response = CurrOperationName
end service
Service AddLotOperationIntoSequence(LotId, NewOperationId, NewSequence, Rework)
ErrorMessage = ''
If LotId NE '' then
If NewSequence NE '' AND Num(NewSequence) then
//Get Current Operations in sequence
//CurrSequence = Lot_Services('GetLotOperationSequence', LotId)
LotCurrOperation = Lot_Services('GetLotCurrOperation', LotId)
LotCurrOperation = Lot_Services('GetLotCurrOperationId', LotId)
CurrOperationSequence = Xlate('LOT_OPERATION', LotCurrOperation, LOT_OPERATION_OPERATION_SEQUENCE$, 'X')
If CurrOperationSequence LE NewSequence then
//Get Curr Operation Sequence
@ -526,16 +551,30 @@ Service AddLotOperationIntoSequence(LotId, NewOperationId, NewSequence, Rework)
end
end service
Service MoveInLot(LotID, WaferQty, Operator)
Service IsLotMovedIn(LotId)
Response = ''
If RowExists('LOT', LotId) then
CurrOperId = Lot_Services('GetLotCurrOperationId', LotId)
CurrOperDtmIn = Database_Services('ReadDataColumn', 'LOT_OPERATION', CurrOperId, LOT_OPERATION_DATETIME_IN$, True$, 0, False$)
If CurrOperDtmIn LE Datetime() AND CurrOperDtmIn NE '' then
Response = True$
end else
Response = False$
end
end
end service
Service MoveInLot(LotID, Operator)
debug
ErrorMessage = ''
ThisLotCurrOperationID = ''
If LotId NE '' then
If WaferQty NE '' then
If RowExists('LOT', LotId) then
ThisLotRec = Database_Services('ReadDataRow', 'LOT', LotId)
WaferQty = ThisLotRec<LOT_WAFER_QTY$>
//Possibly Add locking here
If Error_Services('NoError') then
ThisLotCurrOperationID = Lot_Services('GetLotCurrOperation', LotId)
ThisLotCurrOperationID = Lot_Services('GetLotCurrOperationId', LotId)
If ThisLotCurrOperationID NE '' then
ThisLotCurrOperationRec = Database_Services('ReadDataRow', 'LOT_OPERATION', ThisLotCurrOperationID)
ThisLotCurrOperationRec<LOT_OPERATION_DATETIME_IN$> = Datetime()
@ -545,7 +584,7 @@ Service MoveInLot(LotID, WaferQty, Operator)
If Error_Services('NoError') then
LotType = XLATE('LOT', LotId, LOT_TYPE$, 'X')
CurrOperation = XLATE('LOT_OPERATION', ThisLotCurrOperationID, LOT_OPERATION_OPERATION_ID$, 'X')
Lot_Services('CreateLotEvent', LotId, LotType, Datetime(), 'MOVE_IN', '', '', 0, 0, CurrOperation, Operator)
//Lot_Services('CreateLotEvent', LotId, LotType, Datetime(), 'MOVE_IN', '', '', 0, 0, CurrOperation, Operator)
If Error_Services('HasError') then
ErrorMessage = 'Error in Move In process for Lot id ' : LotId : '. ' : Error_Services('GetMessage')
end
@ -561,9 +600,6 @@ Service MoveInLot(LotID, WaferQty, Operator)
end else
ErrorMessage = 'Error in Move In process for Lot id ' : LotId : '. Lot ID not found in LOT table.'
end
end else
ErrorMessage = 'Error in Move In process for Lot id ' : LotId : '. Lot Qty was not passed to routine.'
end
end else
ErrorMessage = 'Error in Move In process. Lot id was not passed to routine.'
end
@ -578,27 +614,15 @@ Service MoveInLot(LotID, WaferQty, Operator)
end
end service
Service MoveOutLot(LotID, WaferQty, Operator)
Service MoveOutLot(LotID, Operator)
ErrorMessage = ''
ThisLotCurrOperationID = ''
If LotId NE '' then
If WaferQty NE '' then
If RowExists('LOT', LotId) then
ThisLotRec = Database_Services('ReadDataRow', 'LOT', LotId)
CurrLotQty = ThisLotRec<LOT_WAFER_QTY$>
BonusQty = 0
ReduceQty = 0
If WaferQty NE CurrLotQty then
Begin Case
Case WaferQty GT CurrLotQty
//Addition of wafers
BonusQty = WaferQty - CurrLotQty
Case WaferQty LT CurrLotQty
ReduceQty = CurrLotQty - WaferQty
End Case
end
WaferQty = ThisLotRec<LOT_WAFER_QTY$>
If Error_Services('NoError') then
ThisLotCurrOperationID = Lot_Services('GetLotCurrOperation', LotId)
ThisLotCurrOperationID = Lot_Services('GetLotCurrOperationId', LotId)
If ThisLotCurrOperationID NE '' then
ThisLotCurrOperationRec = Database_Services('ReadDataRow', 'LOT_OPERATION', ThisLotCurrOperationID)
ThisLotCurrOperationRec<LOT_OPERATION_DATETIME_OUT$> = Datetime()
@ -608,7 +632,7 @@ Service MoveOutLot(LotID, WaferQty, Operator)
If Error_Services('NoError') then
LotType = XLATE('LOT', LotId, LOT_TYPE$, 'X')
CurrOperation = XLATE('LOT_OPERATION', ThisLotCurrOperationID, LOT_OPERATION_OPERATION_ID$, 'X')
Lot_Services('CreateLotEvent', LotId, LotType, Datetime(), 'MOVE_OUT', '', '', ReduceQty, BonusQty, CurrOperation, Operator)
//Lot_Services('CreateLotEvent', LotId, LotType, Datetime(), 'MOVE_OUT', '', '', ReduceQty, BonusQty, CurrOperation, Operator)
If Error_Services('HasError') then
ErrorMessage = 'Error in Move In process for Lot id ' : LotId : '. ' : Error_Services('GetMessage')
end
@ -624,9 +648,6 @@ Service MoveOutLot(LotID, WaferQty, Operator)
end else
ErrorMessage = 'Error in Move Out process for Lot id ' : LotId : '. Lot ID not found in LOT table.'
end
end else
ErrorMessage = 'Error in Move Out process for Lot id ' : LotId : '. Lot Qty was not passed to routine.'
end
end else
ErrorMessage = 'Error in Move Out process. Lot id was not passed to routine.'
end
@ -650,14 +671,14 @@ Service MoveOutLot(LotID, WaferQty, Operator)
end service
Service CreateLotEvent(LotId, LotType=LOT_TYPES, EventDatetime, EventType=EVENT_TYPES, EventNote, EventEquipmentId, ReduceWaferQty, BonusWaferQty, OperationId, OperatorId)
ErrorMessage = ''
BeginWaferQty = ''
EndWaferQty = ''
ErrorMessage = ''
BeginWaferQty = 0
EndWaferQty = 0
WaferQtyChange = 0
If LotId NE '' then
Begin Case
Case LotType EQ 'TW'
If EventType NE '' AND OperatorId NE '' then
If OperatorId NE '' then
If RowExists('LOT', LotId) then
ValidId = False$
NewEventId = ''
@ -670,40 +691,101 @@ Service CreateLotEvent(LotId, LotType=LOT_TYPES, EventDatetime, EventType=EVENT_
Repeat
BeginWaferQty = Xlate('LOT', LotId, LOT_WAFER_QTY$, 'X')
If OperationID EQ '' then
OperationID = Lot_Services('GetLotCurrOperation', LotId)
OperationID = XLATE('LOT_OPERATION', OperationID, LOT_OPERATION_OPERATION_ID$, 'X')
OperationID = Lot_Services('GetLotCurrOperationId', LotId)
//CurrOperationName = XLATE('LOT_OPERATION', OperationID, LOT_OPERATION_OPERATION_ID$, 'X')
end
//OperationId should be set by now, if not, it is an error. Raise the error and cancel any processing.
If OperationID NE '' then
If ReduceWaferQty NE '' then
If Num(ReduceWaferQty) then
EndWaferQty = BeginWaferQty - ReduceWaferQty
end
end
If BonusWaferQty NE '' then
If Num(BonusWaferQty) then
EndWaferQty = BeginWaferQty + BonusWaferQty
end
end
NewEventRec = ''
NewEventRec<LOT_EVENT_LOT_ID$> = LotId
NewEventRec<LOT_EVENT_LOT_EVENT_TYPE$> = EventType
NewEventRec<LOT_EVENT_EVENT_DATETIME$> = EventDatetime
NewEventRec<LOT_EVENT_EVENT_NOTE$> = EventNote
NewEventRec<LOT_EVENT_EQUIPMENT_ID$> = EventEquipmentId
NewEventRec<LOT_EVENT_EVENT_REDUCE_WAFER_QTY$> = ReduceWaferQty
NewEventRec<LOT_EVENT_EVENT_BONUS_WAFER_QTY$> = BonusWaferQty
NewEventRec<LOT_EVENT_EVENT_BEGIN_WAFER_QTY$> = BeginWaferQty
NewEventRec<LOT_EVENT_EVENT_END_WAFER_QTY$> = EndWaferQty
NewEventRec<LOT_EVENT_EVENT_OPERATION_ID$> = OperationId
NewEventRec<LOT_EVENT_EVENT_OPERATOR_ID$> = OperatorId
*
NewEventSequence = Lot_Services('GetLotEventNextSequence', LotId)
NewEventRec<LOT_EVENT_SEQUENCE$> = NewEventSequence
Database_Services('WriteDataRow', 'LOT_EVENT', NewEventId, NewEventRec)
if Error_Services('HasError') then
ErrorMessage = 'Error in Create Lot Event routine, Error writing Lot Event record, ' : Error_Services('GetMessage')
end
Begin Case
Case EventType EQ 'MOVE_IN'
Lot_Services('MoveInLot', LotId, OperatorId)
If Error_Services('NoError') then
end else
ErrorMessage = Error_Services('GetMessage')
end
Case EventType EQ 'MOVE_OUT'
Lot_Services('MoveOutLot', LotId, OperatorId)
If Error_Services('NoError') then
end else
ErrorMessage = Error_Services('GetMessage')
end
Case EventType EQ 'HOLD_ON'
Lot_Services('HoldLot', LotId, OperatorId)
If Error_Services('NoError') then
end else
ErrorMessage = Error_Services('GetMessage')
end
Case EventType EQ 'HOLD_OFF'
Lot_Services('UnholdLot', LotId, OperatorId)
If Error_Services('NoError') then
end else
ErrorMessage = Error_Services('GetMessage')
end
Case EventType EQ 'REDUCE_WAFER_QTY'
Lot_Services('ReduceLotWaferCount', LotId, ReduceWaferQty)
If Error_Services('NoError') then
end else
ErrorMessage = Error_Services('GetMessage')
end
Case EventType EQ 'BONUS_WAFER_QTY'
Lot_Services('IncreaseLotWaferCount', LotId, BonusWaferQty)
If Error_Services('NoError') then
end else
ErrorMessage = Error_Services('GetMessage')
end
Case EventType EQ 'COMMENT'
//Do Nothing Extra
Case EventType EQ 'LOCATION'
//Do nothing for now.
Case EventType EQ 'CLOSE'
//Do nothing for now.
Case Otherwise$
ErrorMessage = 'Error in Create Lot Event routine, event type of ' : EventType : ' passed to routine is not valid for a lot of type TW.'
End Case
* If Error_Services('HasError') then
* ErrorMessage = Error_Services('GetMessage')
* end
If ErrorMessage EQ '' then
EndWaferQty = (BeginWaferQty + BonusWaferQty) - ReduceWaferQty
NewEventRec = ''
NewEventRec<LOT_EVENT_LOT_ID$> = LotId
NewEventRec<LOT_EVENT_LOT_EVENT_TYPE$> = EventType
NewEventRec<LOT_EVENT_EVENT_DATETIME$> = EventDatetime
NewEventRec<LOT_EVENT_EVENT_NOTE$> = EventNote
NewEventRec<LOT_EVENT_EQUIPMENT_ID$> = EventEquipmentId
NewEventRec<LOT_EVENT_EVENT_REDUCE_WAFER_QTY$> = ReduceWaferQty
NewEventRec<LOT_EVENT_EVENT_BONUS_WAFER_QTY$> = BonusWaferQty
NewEventRec<LOT_EVENT_EVENT_BEGIN_WAFER_QTY$> = BeginWaferQty
NewEventRec<LOT_EVENT_EVENT_END_WAFER_QTY$> = EndWaferQty
NewEventRec<LOT_EVENT_EVENT_OPERATION_ID$> = OperationId
NewEventRec<LOT_EVENT_EVENT_OPERATOR_ID$> = OperatorId
NewEventSequence = Lot_Services('GetLotEventNextSequence', LotId)
NewEventRec<LOT_EVENT_SEQUENCE$> = NewEventSequence
Database_Services('WriteDataRow', 'LOT_EVENT', NewEventId, NewEventRec)
if Error_Services('NoError') then
If BeginWaferQty NE EndWaferQty then
//Adjust LOT wafer qty
LotRecord = Database_Services('ReadDataRow', 'LOT', LotId, True$, 0, False$)
If LotRecord NE '' then
LotRecord<LOT_WAFER_QTY$> = EndWaferQty
Database_Services('WriteDataRow', 'LOT', LotId, LotRecord, True$, False$, False$)
If Error_Services('HasError') then
ErrorMessage = 'Error in CreateLotEvent routine, failed attempt to close lot ':LotId:'. Failed to write to LOT record.'
end
end
end
end else
ErrorMessage = 'Error in Create Lot Event routine, Error writing Lot Event record, ' : Error_Services('GetMessage')
end
end
end else
ErrorMessage = 'Error in Create Lot Event routine, Current Operation for lot id ' : LotId : ' could not be determined.'
end
@ -711,7 +793,7 @@ Service CreateLotEvent(LotId, LotType=LOT_TYPES, EventDatetime, EventType=EVENT_
ErrorMessage = 'Error in Create Lot Event routine, Lot Id passed to routine was not found in LOT table.'
end
end else
ErrorMessage = 'Error in Create Lot Event routine, Missing event type or Operator ID.'
ErrorMessage = 'Error in Create Lot Event routine, Operator ID was null.'
end
Case LotType EQ 'RDS'
If EventType NE '' AND OperatorId NE '' then
@ -854,7 +936,7 @@ Service ConvertLotRecordToJson(LotId, ItemURL, CurrUser, FullObject=BOOLEAN)
SRP_JSON(objLot, 'SetValue', 'VendorPartNo', LotRec<LOT_VENDOR_PART_NO$>)
SRP_JSON(objLot, 'SetValue', 'VendorLotNo', LotRec<LOT_VENDOR_LOT_NO$>)
SRP_JSON(objLot, 'SetValue', 'Vendor', LotRec<LOT_VENDOR_CODE$>)
CurrOperation = Lot_Services('GetLotCurrOperation', LotId)
CurrOperation = Lot_Services('GetLotCurrOperationId', LotId)
CurrOperation = Field(CurrOperation, '*', 2)
SRP_JSON(objLot, 'SetValue', 'CurrOperation', CurrOperation)
If FullObject then
@ -978,11 +1060,70 @@ Service CloseLot(LotId)
end
end service
Service HoldLot(LotId)
Service HoldLot(LotId, OperatorId)
end service
Service UnholdLot(LotId)
Service UnholdLot(LotId, OperatorId)
end service
Service ReduceLotWaferCount(LotId, ReductionQty)
ErrorMessage = ''
If RowExists('LOT', LotId) then
LotRec = Database_Services('ReadDataRow', 'LOT', LotId, True$, 0, False$)
LotCurrWfrQty = LotRec<LOT_WAFER_QTY$>
LotNewWfrQty = LotCurrWfrQty - ReductionQty
If LotNewWfrQty LE 25 AND LotNewWfrQty GE 0 then
LotRec<LOT_WAFER_QTY$> = LotNewWfrQty
Database_Services('WriteDataRow', 'LOT', LotId, LotRec, True$, False$, False$)
If Error_Services('HasError') then
ErrorMessage = 'Error in Increase Lot Wafer Count service, Error writing Lot Id ' : LotId : ' with new quantity.'
end
end else
Begin Case
Case LotNewWfrQty GT 25
ErrorMessage = 'Error in Reduce Lot Wafer Count service, Lot Id ' : LotId : ' cannot have a quantity great than 25.'
Case LotNewWfrQty LT 0
ErrorMessage = 'Error in Reduce Lot Wafer Count service, Lot Id ' : LotId : ' cannot have a quantity less than 0.'
End Case
end
end else
ErrorMessage = 'Error in Reduce Lot Wafer Count service, Lot Id ' : LotId : ' not found in lot table.'
end
if ErrorMessage NE '' then
Error_Services('Add', ErrorMessage)
end
end service
Service IncreaseLotWaferCount(LotId, IncreaseQty)
ErrorMessage = ''
If RowExists('LOT', LotId) then
LotRec = Database_Services('ReadDataRow', 'LOT', LotId, True$, 0, False$)
LotCurrWfrQty = LotRec<LOT_WAFER_QTY$>
LotNewWfrQty = LotCurrWfrQty + IncreaseQty
If LotNewWfrQty LE 25 AND LotNewWfrQty GT 0 then
LotRec<LOT_WAFER_QTY$> = LotNewWfrQty
Database_Services('WriteDataRow', 'LOT', LotId, LotRec, True$, False$, False$)
If Error_Services('HasError') then
ErrorMessage = 'Error in Increase Lot Wafer Count service, Error writing Lot Id ' : LotId : ' with new quantity.'
end
end else
Begin Case
Case LotNewWfrQty GT 25
ErrorMessage = 'Error in Increase Lot Wafer Count service, Lot Id ' : LotId : ' cannot have a quantity great than 25.'
Case LotNewWfrQty LT 0
ErrorMessage = 'Error in Increase Lot Wafer Count service, Lot Id ' : LotId : ' cannot have a quantity less than 0.'
End Case
end
end else
ErrorMessage = 'Error in Increase Lot Wafer Count service, Lot Id ' : LotId : ' not found in lot table.'
end
if ErrorMessage NE '' then
Error_Services('Add', ErrorMessage)
end
end service

View File

@ -2,12 +2,15 @@ Compile function NDW_LOG_TEST_WAFER_USAGE_EVENTS(CtrlEntId, Event, @PARAMS)
#pragma precomp SRP_PreCompiler
#window NDW_LOG_TEST_WAFER_USAGE
Declare function Get_Property, Error_Services, Test_Run_Services, Reactor_Services, Tool_Services
Declare subroutine Set_Property, Error_Services
Declare function Get_Property, Error_Services, Test_Run_Services, Reactor_Services, Tool_Services, Database_Services, Lot_Services
Declare subroutine Set_Property, Error_Services, Msg, End_Dialog, Lot_Services, PlaceDialog
$Insert LOGICAL
$Insert APP_INSERTS
$Insert TEST_RUN_EQUATES
$Insert RDS_EQUATES
$Insert LOT_EQUATES
$Insert TEST_WAFER_PROD_EQUATES
$Insert LOT_OPERATION_EQUATES
GoToEvent Event for CtrlEntId else
// Event not implemented
@ -20,8 +23,9 @@ Return EventFlow or 1
//-----------------------------------------------------------------------------
Event WINDOW.CREATE(CreateParam)
PlaceDialog(-2, -2)
Set_Property(@Window, 'VISIBLE', 1)
GoSub FillFormMasterData
debug
PresetRDSNo = ''
PresetTestType = ''
PresetEquipmentType = ''
@ -69,6 +73,168 @@ Event WINDOW.CREATE(CreateParam)
End Event
Event Window.CLOSE(CancelFlag, CloseFlags)
Result = ''
Result<1> = False$
End_Dialog(@Window, Result)
end event
Event EDL_LOT_ID.LOSTFOCUS(Flag, FocusID)
LotIdString = Get_Property(@Window : '.EDL_LOT_ID', 'TEXT')
If LotIdString[1, 4] EQ '1TTW' then
Set_Property(@Window : '.EDL_LOT_ID', 'TEXT', LotIdString[3, 999])
end
end event
Event PUB_ADD_LOT.CLICK()
TWLotUseArray = Get_Property(@Window: '.EDT_TW_USAGE', 'LIST')
LotId = Get_Property(@Window : '.EDL_LOT_ID', 'TEXT')
If LotId NE '' then
Found = False$
for i = 1 to DCount(TWLotUseArray, @FM)
if LotId EQ TWLotUseArray<i, 1> then
Found = True$
end
until Found
Next i
If Not(Found) then
If RowExists('LOT', LotId) then
//Check if lot is a test wafer type
LotRec = Database_Services('ReadDataRow', 'LOT', LotId, True$, 0, False$)
if Error_Services('NoError') AND LotRec NE '' then
LotType = LotRec<LOT_TYPE$>
LotOpen = LotRec<LOT_OPEN$>
LotOnHold = LotRec<LOT_HOLD$>
If LotType EQ 'TW' then
If LotOpen then
If Not(LotOnHold) then
LotCurrOperationId = Lot_Services('GetLotCurrOperationId', LotId)
LotCurrOperation = XLATE('LOT_OPERATION', LotCurrOperationId, LOT_OPERATION_OPERATION_ID$, 'X')
If LotCurrOperation EQ 'TW_CREATE' Or LotCurrOperation EQ 'TW_CLOSE' then
Msg(@Window, 'Error: Lot ':LotId:' is currently at ' : LotCurrOperation : '. It cannot be used at this time.')
Set_Property(@Window : '.EDL_LOT_ID', 'TEXT', '')
end else
TestWaferProdName = Database_Services('ReadDataColumn', 'TEST_WAFER_PROD', LotRec<LOT_PROD_ID$>, TEST_WAFER_PROD_PART_NAME$, True$, 0, False$)
TWLotUseArray<-1> = LotId : @VM : TestWaferProdName : @VM : ''
Set_Property(@Window : '.EDT_TW_USAGE', 'LIST', TWLotUseArray)
Set_Property(@Window : '.EDL_LOT_ID', 'TEXT', '')
end
end else
Msg(@Window, 'Error: Lot ':LotId:' is on hold and cannot be used.')
Set_Property(@Window : '.EDL_LOT_ID', 'TEXT', '')
end
end else
Msg(@Window, 'Error: Lot ':LotId:' is not in an open status.')
Set_Property(@Window : '.EDL_LOT_ID', 'TEXT', '')
end
end else
Msg(@Window, 'Error: Lot ':LotId:' is not a test wafer lot.')
Set_Property(@Window : '.EDL_LOT_ID', 'TEXT', '')
end
end else
Msg(@Window, 'Error: Error reading Lot ':LotId:' from LOT table.')
Set_Property(@Window : '.EDL_LOT_ID', 'TEXT', '')
end
end else
Msg(@Window, 'Error: Lot not found in LOT table.')
Set_Property(@Window : '.EDL_LOT_ID', 'TEXT', '')
end
end else
Msg(@Window, 'Error: Lot ':LotId:' already exists in the list.')
Set_Property(@Window : '.EDL_LOT_ID', 'TEXT', '')
end
end
end event
Event EDT_TW_USAGE.ROWSELCHANGED(SelRow, SelState)
If SelRow NE '' then
Set_Property(@Window: '.PUB_REMOVE_SELECTED', 'ENABLED', True$)
end else
Set_Property(@Window: '.PUB_REMOVE_SELECTED', 'ENABLED', False$)
end
end event
Event PUB_REMOVE_SELECTED.CLICK()
SelectedRow = Get_Property(@Window : '.EDT_TW_USAGE', 'SELPOS')<2>
TWLotUseArray = Get_Property(@Window: '.EDT_TW_USAGE', 'LIST')
If SelectedRow LE DCount(TWLotUseArray, @FM) then
TWLotUseArray = Delete(TWLotUseArray, SelectedRow , 0, 0)
end
Set_Property(@Window : '.EDT_TW_USAGE', 'LIST', TWLotUseArray)
end event
Event PUB_CLEAR.CLICK()
GoSub ClearFormData
end event
Event PUB_SUBMIT.CLICK()
debug
NotReadyReason = ''
//Gather all field information
ReasonForTest = Get_Property(@Window : '.CMB_TEST_TYPE', 'TEXT')
RelatedRDS = Get_Property(@Window : '.EDL_RDS', 'TEXT')
RelatedPSN = Get_Property(@Window : '.EDL_PSN', 'TEXT')
EquipmentType = Get_Property(@Window : '.CMB_EQUIP_TYPE', 'TEXT')
EquipmentID = Get_Property(@Window : '.CMB_EQUIPMENT_ID', 'TEXT')
//Translate selection to IDs. Get Run Type ID
SelRunTypeID = '';*Test Run Obj variable
RunTypeOpts = Get_Property(@Window, '@RUN_TYPE_OPTS')
Locate ReasonForTest in RunTypeOpts<2> using @VM setting rPos then
SelRunTypeID = RunTypeOpts<1, rPos>
end else
NotReadyReason := 'Must select a valid run type reason.' : CRLF$
end
//Translate Equipment Type. R for Reactor, T for non-reactor
SelEquipType = '';*Test Run Obj variable
Begin Case
Case EquipmentType EQ 'Reactor'
SelEquipType = 'R'
Case EquipmentType EQ 'Non-Reactor'
SelEquipType = 'T'
End Case
//Get Test wafer usage data from table
TWUsageData = Get_Property(@Window: '.EDT_TW_USAGE', 'LIST')
TWLots = ''
TWLotQtys = ''
for each TWRow in TWUsageData using @FM
Quantity = TWRow<1,3>
ProdName = TWRow<1,2>
TWLot = TWRow<1,1>
If Quantity NE '' AND TWLot NE '' then
if Num(Quantity) then
Begin Case
Case Quantity GT 0 AND Quantity LT 25
TWLots<1, -1> = TWRow<1,1>
TWLotQtys<1, -1> = TWRow<1,3>
Case Quantity GT 25
NotReadyReason := 'Quantity value for test wafer lot ' : TWLot : ' must be less than 25.' : CRLF$
Case Quantity LE 0
NotReadyReason := 'Quantity value for test wafer lot ' : TWLot : ' must be greater than 0.' : CRLF$
End Case
end else
NotReadyReason := 'Quantity value for test wafer lot ' : TWLot : ' must be a number' : CRLF$
end
end else
NotReadyReason := 'A quantity of test wafers used is required for test wafer lot ' : TWLot : CRLF$
end
Next TWRow
If NotReadyReason EQ '' then
TRWaferKey = Test_Run_Services('CreateTestRunRecord', SelRunTypeID, EquipmentType, EquipmentID, RelatedPSN, RelatedRDS, @User4, TWLots, TWLotQtys)
If Error_Services('NoError') then
Msg(@Window, 'Test Run Created Successfully!')
Result = ''
Result<1> = True$
End_Dialog(@Window, Result)
end else
ErrorMessage = Error_Services('GetMessage')
Msg(@Window, 'Error! - ' : ErrorMessage)
end
end else
Msg(@Window, NotReadyReason)
end
end event
//-----------------------------------------------------------------------------
// Internal GoSubs
//-----------------------------------------------------------------------------
@ -87,7 +253,6 @@ FillFormMasterData:
//Get Tool and Reactor Identifiers and buffer them in user defined window properties @REACTOR_OPTS and @NON_REACTOR_OPTS
//Reactors
ReactorOpts = Reactor_Services('GetReactorNumbers')
//Set_Property(@Window : '.EDT_REACTORS', 'TEXT', ReactorOpts)
Set_Property(@Window, '@REACTOR_OPTS', ReactorOpts)
//Non Reactors
@ -102,3 +267,13 @@ FillFormMasterData:
Set_Property(@Window, '@TW_PROD_OPTS', Prods)
Return
ClearFormData:
Set_Property(@Window : '.EDL_LOT_ID', 'TEXT', '')
Set_Property(@Window : '.EDL_RDS', 'TEXT', '')
Set_Property(@Window : '.EDL_PSN', 'TEXT', '')
Set_Property(@Window : '.CMB_EQUIPMENT_ID', 'TEXT', '')
Set_Property(@Window : 'CMB_TEST_TYPE', 'TEXT', '')
Set_Property(@Window : '.EDT_TW_USAGE', 'LIST', '')
return

View File

@ -67,7 +67,8 @@ Return EventFlow or 1
//-----------------------------------------------------------------------------
Event WINDOW.CREATE(CreateParam)
PlaceDialog(-2, -2)
Set_Property(@Window, 'VISIBLE', 1)
GoSub SetupOLEControls
GoSub FillFormMasterData
EventFlow = 1
@ -204,7 +205,7 @@ Event PUB_SUBMIT.CLICK()
for each Prod in ProdUsages using @FM setting pPos
for i = 1 to Prod<1,2>
TWPartID = Prod<1,1>
TRWaferKey = Test_Run_Services('CreateTestRunWaferRecord', NewTWRunKey, TWPartID)
TRWaferKey = Test_Run_Services('CreateTestRunWaferRecord', NewTWRunKey, TWPartID, @USER4)
If RowExists('TEST_RUN_WAFER', TRWaferKey) then
//Do Nothing for now.
end else
@ -352,3 +353,4 @@ SetupOLEControls:
return

View File

@ -5,6 +5,7 @@ Compile function NDW_VIEW_LOT_EVENTS(CtrlEntId, Event, @PARAMS)
Declare function Get_Property, Lot_Services, Database_Services
Declare subroutine Set_Property
$Insert APP_INSERTS
$Insert LOT_EQUATES
$Insert LOT_OPERATION_EQUATES
$Insert LOT_EVENT_EQUATES
@ -61,8 +62,9 @@ GetLot:
If RowExists('LOT', LotIdText) then
ThisLotId = LotIdText
ThisLotRec = Database_Services('ReadDataRow', 'LOT', ThisLotId)
ThisLotCurrOperationID = Lot_Services('GetLotCurrOperation', ThisLotId)
ThisLotCurrOperationID = Lot_Services('GetLotCurrOperationId', ThisLotId)
ThisLotCurrOperationName = Xlate('LOT_OPERATION', ThisLotCurrOperationId, LOT_OPERATION_OPERATION_ID$, 'X')
ThisLotCurrWaferQty = Database_Services('ReadDataColumn', 'LOT', ThisLotId, LOT_WAFER_QTY$, True$, 0, False$)
//Lot Operation Status'
LotOperationsInSequence = Lot_Services('GetLotOperationSequence', ThisLotId)
@ -87,12 +89,14 @@ GetLot:
LotEventTableData<1, ThisEventSequence> = OConv(LotEventRec<LOT_EVENT_EVENT_DATETIME$>, 'DT')
LotEventTableData<2, ThisEventSequence> = LotEventRec<LOT_EVENT_LOT_EVENT_TYPE$>
LotEventTableData<3, ThisEventSequence> = LotEventRec<LOT_EVENT_EVENT_OPERATOR_ID$>
LotEventTableData<4, ThisEventSequence> = LotEventRec<LOT_EVENT_EVENT_OPERATION_ID$>
ThisLotEventOperationName = Field(LotEventRec<LOT_EVENT_EVENT_OPERATION_ID$>, '*', 2)
LotEventTableData<4, ThisEventSequence> = ThisLotEventOperationName
LotEventTableData<5, ThisEventSequence> = LotEventRec<LOT_EVENT_EVENT_NOTE$>
Next LotEvent
//Fill form
Set_Property(@Window : '.EDL_CURR_OPERATION', 'TEXT', ThisLotCurrOperationName)
Set_Property(@Window : '.EDL_CURR_WAFER_QTY', 'TEXT', ThisLotCurrWaferQty)
Set_Property(@Window : '.EDT_LOT_OPERATIONS', 'ARRAY', LotOperationTableData)
Set_Property(@Window : '.EDT_LOT_EVENTS', 'ARRAY', LotEventTableData)
end else
@ -100,3 +104,4 @@ GetLot:
end
return

View File

@ -37,7 +37,7 @@ Return Success
MoveIn:
debug
//Get TW Create Operation ID
ThisOperationID = Lot_Services('GetLotCurrOperation', LotId)
ThisOperationID = Lot_Services('GetLotCurrOperationId', LotId)
If Field(ThisOperationId, '*', 1) EQ 'TW_CREATE' then
ThisLotCurrOperationRec = Database_Services('ReadDataRow', 'LOT_OPERATION', ThisOperationID)
ThisLotCurrOperationRec<LOT_OPERATION_DATETIME_IN$> = Datetime()
@ -56,7 +56,7 @@ MoveIn:
return
MoveOut:
ThisOperationID = Lot_Services('GetLotCurrOperation', LotId)
ThisOperationID = Lot_Services('GetLotCurrOperationID', LotId)
If Field(ThisOperationId, '*', 1) EQ 'TW_CREATE' then
ThisLotCurrOperationRec = Database_Services('ReadDataRow', 'LOT_OPERATION', ThisLotCurrOperationID)
LotMovedIn = ThisLotCurrOperationRec<LOT_OPERATION_DATETIME_IN$>
@ -105,3 +105,4 @@ return

View File

@ -349,10 +349,36 @@ Event PUB_SIGN.CLICK()
Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, initParams)
Valid = Response<1>
If (Valid EQ True$) then
QA_Services('SignLoadStage', RDSNo, @USER4, WfrQty, LLSide)
UsingTestWafers = Msg(@Window, '', 'YESNO', '', 'Log Test Wafer Usage':@FM:'Are any test wafers loaded?')
If UsingTestWafers then
TWLogResult = Dialog_Box('NDW_LOG_TEST_WAFER_USAGE', @Window, RDSNo : @VM : 'STANDARD' : @VM : 'REACTOR' : @VM : Reactor)
If TWLogResult then
QA_Services('SignLoadStage', RDSNo, @USER4, WfrQty, LLSide)
end else
ContinueLoad = Msg(@Window, '', 'YESNO', '', 'Continue?':@FM:'Test wafer logging was cancelled. Do you wish to continue signing?')
If ContinueLoad then
QA_Services('SignLoadStage', RDSNo, @USER4, WfrQty, LLSide)
end
end
end else
QA_Services('SignLoadStage', RDSNo, @USER4, WfrQty, LLSide)
end
end
end else
QA_Services('SignLoadStage', RDSNo, @USER4, WfrQty, LLSide)
UsingTestWafers = Msg(@Window, '', 'YESNO', '', 'Log Test Wafer Usage':@FM:'Are any test wafers loaded?')
If UsingTestWafers then
TWLogResult = Dialog_Box('NDW_LOG_TEST_WAFER_USAGE', @Window, RDSNo : @VM : 'STANDARD' : @VM : 'REACTOR' : @VM : Reactor)
If TWLogResult then
QA_Services('SignLoadStage', RDSNo, @USER4, WfrQty, LLSide)
end else
ContinueLoad = Msg(@Window, '', 'YESNO', '', 'Continue?':@FM:'Test wafer logging was cancelled. Do you wish to continue signing?')
If ContinueLoad then
QA_Services('SignLoadStage', RDSNo, @USER4, WfrQty, LLSide)
end
end
end else
QA_Services('SignLoadStage', RDSNo, @USER4, WfrQty, LLSide)
end
end
end
If Error_Services('HasError') then
@ -672,3 +698,4 @@ return

View File

@ -38,14 +38,18 @@ $INSERT REACT_LL_EQUATES
$insert RLIST_EQUATES
$Insert ROTR_OVERRIDE_COMMENT_OPTIONS_EQUATES
$Insert SUPPLEMENTS_EQUATES
$Insert Lot_Equates
$Insert Test_Run_Type_Equates
Common /ScanServices/ NotAcceptableReasons@, Unused2@, Unused3@, Unused4@, Unused5@, Unused6@, Unused7@, Unused8@
Declare Function Scan_Services, Memory_Services, Database_Services, SRP_JSON, RTI_CreateGUID, Rds_Services, Datetime
Declare Function QA_Services, Error_Services, Security_Services, SRP_Array, obj_WO_Mat, Memberof, Override_Log_Services
Declare Function Keyboard_Sim_Services, Environment_Services, Logging_Services, Reactor_Services, Supplement_Services
Declare function Test_Run_Services, Lot_Services
Declare Subroutine Scan_Services, Memory_Services, Database_Services, SRP_JSON, QA_Services, Error_Services
Declare Subroutine obj_WO_Mat_Log, Tool_Parms_Services, RDS_Services, Logging_Services, Supplement_Services
Declare Subroutine Test_Run_Services
Equ CRLF$ to \0D0A\
@ -268,15 +272,32 @@ Service ProcessScanData(ScanID, ScanJSON)
Case ( (ScanData[1, 2] EQ '1T') or (ScanData[1, 2] EQ '2T') )
// Supplier lot scan.
Convert '_' to '-' in ScanData
SupplierLotID = ScanData[3, 999]
If ( RowExists('RDS', SupplierLotID) EQ True$ AND ScanData[1, 2] EQ '1T') then
ScansRow<SCANS.CASSETTE_IDS$> = SupplierLotID
//If ( RowExists('RDS', SupplierLotID) EQ True$ ) then
// Error_Services('Add', 'Not a valid supplier lot')
end else
ScansRow<SCANS.SUPPLIER_LOT$> = SupplierLotID
end
LotID = ScanData[3, 999]
Begin Case
Case ( RowExists('RDS', LotId) EQ True$ AND ScanData[1, 2] EQ '1T')
ScansRow<SCANS.CASSETTE_IDS$> = LotID
Case ScanData[1, 4] EQ '1TTW'
ValidTWLot = False$
If RowExists('LOT', LotId) then
LotCurrentOperation = Lot_Services('GetLotCurrOperationName', LotId)
If LotCurrentOperation NE 'TW_CREATE' AND LotCurrentOperation NE 'TW_CLOSE' then
LotCurrWfrQty = Database_Services('ReadDataColumn', 'LOT', LotId, LOT_WAFER_QTY$, True$, 0, False$)
If LotCurrWfrQty GT 0 then
ScansRow<SCANS.TW_LOT_ID$, -1> = LotID
end else
Error_Services('Add', LotID : ' does not have enough wafers to be used.')
end
end else
Error_Services('Add', LotID : ' is not at a valid operation for use.')
end
end else
Error_Services('Add', LotID : ' is not a valid test wafer lot ID.')
end
Case Otherwise$
ScansRow<SCANS.SUPPLIER_LOT$> = LotID
End Case
Case ScanData[1, 5] EQ 'RESET'
ScansRow<SCANS.SCAN_TYPE$> = 'RESET'
@ -500,6 +521,16 @@ Service ProcessScanData(ScanID, ScanJSON)
//Tencor Scan - Note this is only for loading cassette ID into Tencor tool
ScansRow<SCANS.SCAN_TYPE$> = 'TENCOR_LOAD'
ScansRow<SCANS.TOOL_ID$>= ScanData[3,99]
Case ScanData[1, 16] EQ 'TWQUANTITYUPDATE'
TWLot = Field(ScanData, '|', 2)
TWLotQuantity = Field(ScanData, '|', 3)
ThisScanTWLots = ScansRow<SCANS.TW_LOT_ID$>
Locate TWLot in ThisScanTWLots using @VM setting twPOS then
ScansRow<SCANS.TW_LOT_QTY$> = TWLotQuantity
end
Case ScanData[1, 17] EQ 'TESTRUNTYPEUPDATE'
TestRunTypeId = Field(ScanData, '|', 2)
ScansRow<SCANS.TEST_RUN_TYPE_ID$> = TestRunTypeId
Case ScanData EQ ''
// Most likely receiving RDS data, so nothing to do here.
Null
@ -1009,7 +1040,24 @@ Service ProcessScanData(ScanID, ScanJSON)
Error_Services('Add', '(':CassetteID:') Only one cassette can be loaded onto a tool at a time.')
end
end else
Scan_Services('AddNotAcceptableReason', 'A cassette must be scanned in order to complete a tool scan.')
If ScansRow<SCANS.TW_LOT_ID$> NE '' then
//Test Wafer Lot Loading
TestWaferLotData = ScansRow<SCANS.TW_LOT_ID$>
Abort = False$
for each TWLot in TestWaferLotData using @VM setting twPOS
If ScansRow<SCANS.TW_LOT_QTY$, twPOS> EQ '' OR ScansRow<SCANS.TW_LOT_QTY$, twPOS> LE 0 then
Scan_Services('AddNotAcceptableReason', 'Each test wafer lot logged must have a quantity associated with it.')
end else
ThisUser = ScansRow<SCANS.EMPLOYEE_ID$>
If Not(RowExists('LSL_USERS', ThisUser)) then
Scan_Services('AddNotAcceptableReason', 'A User ID Scan is required to log test wafer usage.')
end
end
Until False$
Next TWLot
end else
Scan_Services('AddNotAcceptableReason', 'A cassette must be scanned in order to complete a tool scan.')
end
end
Case Otherwise$
@ -1218,67 +1266,86 @@ Service AcceptScan(ScanID, ScanJSON)
Case ScanType _EQC 'TOOL'
// Check if cassette field is populated. If so, then check the cassette's current status to
// determine what the next action will be (i.e. Pre-Epi+Load, Unload, etc.)
CassetteID = CassetteIDs<0, 1>
RDSNo = CassetteID
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
ToolID = ScansRow<SCANS.TOOL_ID$>
Reactor = ToolID[-1, 'BR']
Username = ScansRow<SCANS.EMPLOYEE_ID$>
LLSide = ScansRow<SCANS.LOAD_LOCK$>
WaferQty = RDSRec<RDS_CASS_WAFER_QTY$>
// Check signature fields to determine where the lot is in the RDS process. The service should
// use the signatures in the RDS table, not the WO_MAT table, so that we can support both
// EpiPro and non-EpiPro lots.
CurrStage = Xlate('RDS', RDSNo, 'CURR_STAGE', 'X')
CurrDTM = Datetime()
LogData = ''
LogData<1> = OConv(CurrDTM, 'DT')
LogData<2> = RDSNo
LogData<3> = Username
LogData<4> = CurrStage
LogData<5> = ScanID
CassetteID = CassetteIDs<0, 1>
TestWaferLots = ScansRow<SCANS.TW_LOT_ID$>
Begin Case
Case CurrStage _EQC 'VER'
Action = 'LOAD'
// Check if both the PRE and LOAD stages are ready to sign
PreStageSigned = False$
LoadStageSigned = False$
PreStageSigned = QA_Services('SignPreEpiStage', RDSNo, Username, WaferQty, Reactor, 1)
If PreStageSigned EQ True$ then
LoadStageSigned = QA_Services('SignLoadStage', RDSNo, USername, WaferQty, LLSide, 1)
end
If ( (PreStageSigned EQ True$) and (LoadStageSigned EQ True$) ) then
Result = '(':CassetteID:') Load stage signed.'
end
LogData<6> = Action
LogData<7> = Result
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
Case CurrStage _EQC 'LOAD'
Action = 'LOAD'
// Check if LOAD stage is ready to sign
LoadStageSigned = QA_Services('SignLoadStage', RDSNo, Username, WaferQty, LLSide, 1)
If LoadStageSigned EQ True$ then
Result = '(':CassetteID:') Load stage signed.'
end
LogData<6> = Action
LogData<7> = Result
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
Case CurrStage _EQC 'UNLOAD'
Action = 'UNLOAD'
// Check if UNLOAD stage is ready to sign
UnloadStageSigned = QA_Services('SignUnloadStage', RDSNo, Username, 1)
If UnloadStageSigned EQ True$ then
Result = '(':CassetteID:') Unload stage signed.'
end
LogData<6> = Action
LogData<7> = Result
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
Case CurrStage _EQC 'COMP'
Action = 'COMP'
Error_Services('Set', '(':CassetteID:") Cassette has already been FQA'd.")
Case Otherwise$
Action = CurrStage
Error_Services('Set', '(':CassetteID:') The ':CurrStage:' is not currently supported by the barcode application.')
Case CassetteID NE ''
//Tool Cassette scan, check for test wafers after everything is signed.
RDSNo = CassetteID
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
ToolID = ScansRow<SCANS.TOOL_ID$>
Reactor = ToolID[-1, 'BR']
Username = ScansRow<SCANS.EMPLOYEE_ID$>
LLSide = ScansRow<SCANS.LOAD_LOCK$>
WaferQty = RDSRec<RDS_CASS_WAFER_QTY$>
// Check signature fields to determine where the lot is in the RDS process. The service should
// use the signatures in the RDS table, not the WO_MAT table, so that we can support both
// EpiPro and non-EpiPro lots.
CurrStage = Xlate('RDS', RDSNo, 'CURR_STAGE', 'X')
CurrDTM = Datetime()
LogData = ''
LogData<1> = OConv(CurrDTM, 'DT')
LogData<2> = RDSNo
LogData<3> = Username
LogData<4> = CurrStage
LogData<5> = ScanID
Begin Case
Case CurrStage _EQC 'VER'
Action = 'LOAD'
// Check if both the PRE and LOAD stages are ready to sign
PreStageSigned = False$
LoadStageSigned = False$
PreStageSigned = QA_Services('SignPreEpiStage', RDSNo, Username, WaferQty, Reactor, 1)
If PreStageSigned EQ True$ then
LoadStageSigned = QA_Services('SignLoadStage', RDSNo, USername, WaferQty, LLSide, 1)
end
If ( (PreStageSigned EQ True$) and (LoadStageSigned EQ True$) ) then
Result = '(':CassetteID:') Load stage signed.'
end
LogData<6> = Action
LogData<7> = Result
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
Case CurrStage _EQC 'LOAD'
Action = 'LOAD'
// Check if LOAD stage is ready to sign
LoadStageSigned = QA_Services('SignLoadStage', RDSNo, Username, WaferQty, LLSide, 1)
If LoadStageSigned EQ True$ then
Result = '(':CassetteID:') Load stage signed.'
end
LogData<6> = Action
LogData<7> = Result
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
Case CurrStage _EQC 'UNLOAD'
Action = 'UNLOAD'
// Check if UNLOAD stage is ready to sign
UnloadStageSigned = QA_Services('SignUnloadStage', RDSNo, Username, 1)
If UnloadStageSigned EQ True$ then
Result = '(':CassetteID:') Unload stage signed.'
end
LogData<6> = Action
LogData<7> = Result
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
Case CurrStage _EQC 'COMP'
Action = 'COMP'
Error_Services('Set', '(':CassetteID:") Cassette has already been FQA'd.")
Case Otherwise$
Action = CurrStage
Error_Services('Set', '(':CassetteID:') The ':CurrStage:' is not currently supported by the barcode application.')
End Case
Case CassetteID EQ '' AND TestWaferLots NE ''
debug
//Tool scan with ONLY test wafers being logged.
ToolID = ScansRow<SCANS.TOOL_ID$>
Reactor = ToolID[-1, 'BR']
Username = ScansRow<SCANS.EMPLOYEE_ID$>
TestWaferLotQtys = ScansRow<SCANS.TW_LOT_QTY$>
NewTestRunId = Test_Run_Services('CreateTestRunRecord', 3, 'REACTOR', Reactor, '', '',Username , TestWaferLots, TestWaferLotQtys)
If Error_Services('HasError') then
ErrorMessage = Error_Services('GetMessage')
Error_Services('Set', ErrorMessage)
end
Case Otherwise$
//null
End Case
End Case
end
@ -1336,6 +1403,8 @@ Service ConvertMVScanToJSON(ScanID, mvScan, itemURL)
SRP_JSON(objScan, 'SetValue', 'ID', @ID, 'String')
SRP_JSON(objScan, 'SetValue', 'type', {SCAN_TYPE}, 'String')
SRP_JSON(objScan, 'SetValue', 'action', {ACTION}, 'String')
SRP_JSON(objScan, 'SetValue', 'testRunTypeId', {TEST_RUN_TYPE_ID}, 'Integer')
SRP_JSON(objScan, 'SetValue', 'testRunTypeName', XLate('TEST_RUN_TYPE', {TEST_RUN_TYPE_ID}, TEST_RUN_TYPE_RUN_TYPE$, 'X'), 'String')
SRP_JSON(objScan, 'SetValue', 'acceptable', {ACCEPTABLE}, 'Boolean')
SRP_JSON(objScan, 'SetValue', 'notAcceptableReason', {NOT_ACCEPTABLE_REASON}, 'String')
SRP_JSON(objScan, 'SetValue', 'result', {RESULT}, 'String')
@ -1367,6 +1436,43 @@ Service ConvertMVScanToJSON(ScanID, mvScan, itemURL)
SRP_JSON(objJSONScan, 'Set', 'supplierLot', objSupplierLot)
SRP_JSON(objSupplierLot, 'Release')
end
// TestWafer Lot Object.
If SRP_JSON(hTWLotArray, 'New', 'Array') then
Abort = False$
TestWaferLots = {TW_LOT_ID}
for each TestWaferLotId in TestWaferLots using @VM setting twPos
thisTWLotJson = ''
If SRP_JSON(thisTWLotJson, 'New', 'Object') then
SRP_JSON(thisTWLotJson, 'SetValue', 'testWaferLotId', {TW_LOT_ID}<1, twPos>)
SRP_JSON(thisTWLotJson, 'SetValue', 'quantity', {TW_LOT_QTY}<1, twPos>, 'Integer')
SRP_JSON(hTWLotArray, 'Add', thisTWLotJson)
SRP_JSON(thisTWLotJson, 'Release')
end
Next TestWaferLotId
SRP_JSON(objJSONScan, 'Set', 'testWaferLots', hTWLotArray)
SRP_JSON(hTWLotArray, 'Release')
end
SRP_JSON(objScan, 'SetValue', 'testRunTypeId', {TEST_RUN_TYPE_ID}, 'Integer')
// TestRun Type Option Array
TestRunTypeList = Test_Run_Services('GetAllTestRunTypes')
If SRP_JSON(hTestRunTypeArray, 'New', 'Array') then
For each TestRunTypeId in TestRunTypeList<1> using @VM setting fPos
hTestRunTypeObj = ''
If SRP_JSON(hTestRunTypeObj, 'New', 'Object') then
SRP_JSON(hTestRunTypeObj, 'SetValue', 'testRunTypeId', TestRunTypeId, 'Number')
SRP_JSON(hTestRunTypeObj, 'SetValue', 'testRunTypeName', TestRunTypeList<2, fPos>, 'String')
SRP_JSON(hTestRunTypeArray, 'Add', hTestRunTypeObj)
SRP_JSON(hTestRunTypeObj, 'Release')
end else
Abort = True$
end
Until Abort
Next TestRunTypeId
If Abort EQ False$ then
SRP_JSON(objJSONScan, 'Set', 'testRunTypeOptions', hTestRunTypeArray)
end
SRP_JSON(hTestRunTypeArray, 'Release')
end
// Created object.
objCreated = ''
If SRP_JSON(objCreated, 'New', 'Object') then
@ -2011,14 +2117,3 @@ ClearCursors:
Next counter
return

View File

@ -0,0 +1,121 @@
Function Testruntypes_API(@API)
/***********************************************************************************************************************
This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written
permission from SRP Computer Solutions, Inc.
Name : Testruntypes_API
Description : API logic for the Testruntypes resource.
Notes : All web APIs should include the API_SETUP insert. This will provide several useful variables:
HTTPMethod - The HTTP Method (Verb) submitted by the client (e.g., GET, POST, etc.)
APIURL - The URL for the API entry point (e.g., api.mysite.com/v1).
FullEndpointURL - The URL submitted by the client, including query params.
FullEndpointURLNoQuery - The URL submitted by the client, excluding query params.
EndpointSegment - The URL endpoint segment.
ParentURL - The URL path preceeding the current endpoint.
CurrentAPI - The name of this stored procedure.
Parameters :
API [in] -- Web API to process. Format is [APIPattern].[HTTPMethod]:
- APIPattern must follow this structure Testruntypes[.ID.[<Property>]]
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
Examples:
- Testruntypes.POST
- Testruntypes.ID.PUT
- Testruntypes.ID.firstName.GET
Response [out] -- Response to be sent back to the Controller (HTTP_MCP) or requesting procedure. Web API
services do not rely upon anything being returned in the response. This is what the
various services like SetResponseBody and SetResponseStatus services are for. A response
value is only helpful if the developers want to use it for debug purposes.
History : (Date, Initials, Notes)
11/05/24 xxx Original programmer.
***********************************************************************************************************************/
#pragma precomp SRP_PreCompiler
Declare function OI_Wizard_Services, Test_Run_Services
$insert APP_INSERTS
$insert API_SETUP
$insert HTTP_INSERTS
GoToAPI else
// The specific resource endpoint doesn't have a API handler yet.
HTTP_Services('SetResponseStatus', 204, 'This is a valid endpoint but a web API handler has not yet been created.')
end
Return Response OR ''
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Endpoint Handlers
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
API testruntypes.HEAD
API testruntypes.GET
OIWizardID = ''
Cookies = HTTP_Services('GetHTTPCookie')
For each Cookie in Cookies using ';'
Key = Field(Cookie, '=', 1)
If Key EQ 'sessionID' then
OIWizardID = Field(Cookie, '=', 2)
end
Next Cookie
If OIWizardID NE '' then
ValidSession = OI_Wizard_Services('ValidateSession', OIWizardID)
end
StatusCode = 201
Message = 'Success'
GoSub CreateHALCollection
end api
CreateHALCollection:
JSONCollection = ''
Abort = False$
TestRunTypeList = Test_Run_Services('GetAllTestRunTypes')
hJSONCollection = ''
If SRP_JSON(hJSONCollection, 'New', 'Object') then
hTestRunTypeArray = ''
If SRP_JSON(hTestRunTypeArray, 'New', 'Array') then
For each TestRunTypeId in TestRunTypeList<1> using @VM setting fPos
If SRP_JSON(hTestRunTypeObj, 'New', 'Object') then
SRP_JSON(hTestRunTypeObj, 'SetValue', 'testRunTypeId', TestRunTypeId, 'Number')
SRP_JSON(hTestRunTypeObj, 'SetValue', 'testRunTypeName', TestRunTypeList<2, fPos>, 'String')
SRP_JSON(hTestRunTypeArray, 'Add', hTestRunTypeObj)
SRP_JSON(hTestRunTypeObj, 'Release')
end else
Abort = True$
end
Until Abort
Next TestRunTypeId
If Abort EQ False$ then
SRP_JSON(hJSONCollection, 'Set', 'TestRunTypes', hTestRunTypeArray)
end
SRP_JSON(hTestRunTypeArray, 'Release')
end
JSONCollection = SRP_JSON(hJSONCollection, 'Stringify', 'Styled')
SRP_JSON(hJSONCollection, 'Release')
end
If Error_Services('NoError') then
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
HTTP_Services('SetResponseBody', JSONCollection, False$, 'application/hal+json')
If Assigned(Message) then
HTTP_Services('SetResponseStatus', StatusCode, Message)
end else
HTTP_Services('SetResponseStatus', StatusCode)
end
end else
Message = Error_Services('GetMessage')
HTTP_Services('SetResponseStatus', 500, 'Error in the ' : CurrentAPI : ' API. Message: ': Message)
end
return

View File

@ -7,6 +7,8 @@ $Insert TEST_WAFER_TYPES_DISPO_OPTIONS_EQUATES
$Insert TEST_RUN_EQUATES
$Insert TEST_RUN_WAFER_EQUATES
$Insert TEST_RUN_OBJ_EQUATES
$Insert LOT_EQUATES
$Insert LOT_OPERATION_EQUATES
Declare function Nextkey, Error_Services, Environment_Services, OConv, Logging_Services, SRP_Hashtable, Lot_Services
Declare function SRP_Datetime, Database_Services, Test_Run_Services, File_Services, Status, delete, Insert, Datetime, SRP_Json
@ -315,7 +317,9 @@ Service GetTestWaferLots(ShowOnlyOpenLots)
Response = TestWaferLotKeys
end service
Service CreateTestRunRecord(RunTypeID, EqpType, EqpID, PSNo, RDSNo, UserID)
Service CreateTestRunRecord(RunTypeID, EqpType, EqpID, PSNo, RDSNo, UserID, TWLotIds, TWLotQtys)
TWRunKey = ''
Response = ''
ErrorMessage = ''
If RunTypeID NE '' AND EqpType NE '' AND EqpID NE '' AND UserID NE '' then
@ -331,11 +335,112 @@ Service CreateTestRunRecord(RunTypeID, EqpType, EqpID, PSNo, RDSNo, UserID)
TWRunKey = nextkey('TEST_RUN')
Database_Services('WriteDataRow', 'TEST_RUN', TWRunKey, TWRunRec)
If Error_Services('NoError') then
LogData = ''
LogData<1, 1> = LoggingDTM
LogData<1, 2> = @User4
LogData<1, 3> = 'Successfully created new TEST_RUN record with ID of ' : TWRunKey
Logging_Services('AppendLog', objLogTR, LogData, @FM, @VM)
If RowExists('TEST_RUN', TWRunKey) then
LogData = ''
LogData<1, 1> = LoggingDTM
LogData<1, 2> = UserID
LogData<1, 3> = 'Successfully created new TEST_RUN record with ID of ' : TWRunKey
Logging_Services('AppendLog', objLogTR, LogData, @FM, @VM)
//Now create the test wafer usages
Success = False$
If TWLotIds NE '' then
//Supports new logging methods.
for each TWLotId in TWLotIds using @VM setting twlPos
LotRec = Database_Services('ReadDataRow', 'LOT', TWLotId, True$, 0, False$)
IsThisLotOnHold = LotRec<LOT_HOLD$>
IsThisLotOpen = LotRec<LOT_OPEN$>
IsThisLotATWLot = LotRec<LOT_TYPE$> EQ 'TW'
ThisLotCurrQty = LotRec<LOT_WAFER_QTY$>
ThisLotPartId = LotRec<LOT_PROD_ID$>
//
ThisUsageQty = TWLotQtys<1, twlPos>
If IsThisLotOpen then
If Not(IsThisLotOnHold) then
If IsThisLotATWLot then
InAtTWInUse = False$
Loop
LotMovedIn = Lot_Services('IsLotMovedIn', TWLotId)
ThisLotCurrOperationId = Lot_Services('GetLotCurrOperationId', TWLotId)
ThisLotCurrOperation = Database_Services('ReadDataColumn', 'LOT_OPERATION', ThisLotCurrOperationId, LOT_OPERATION_OPERATION_ID$, True$, 0, False$)
Begin Case
Case ThisLotCurrOperation EQ 'TW_IN_USE'
If Not(LotMovedIn) then
Lot_Services('CreateLotEvent', TWLotId, 'TW', Datetime(), 'MOVE_IN', 'Move into TW_IN_USE', '', 0, 0, '', UserID)
If Error_Services('HasError') then
ErrorMessage = Error_Services('GetMessage')
end
end else
InAtTWInUse = True$
end
Case ThisLotCurrOperation EQ 'TW_READY_TO_USE'
If Not(LotMovedIn) then
Lot_Services('CreateLotEvent', TWLotId, 'TW', Datetime(), 'MOVE_IN', 'Move into TW_READY_TO_USE', '', 0, 0, '', UserID)
end else
Lot_Services('CreateLotEvent', TWLotId, 'TW', Datetime(), 'MOVE_OUT', 'Move out of TW_READY_TO_USE', '', 0, 0, '', UserID)
end
If Error_Services('HasError') then
ErrorMessage = Error_Services('GetMessage')
end
Case Otherwise$
ErrorMessage = 'Error: Lot ':TWLotId:' is currently at ' : ThisLotCurrOperation : '. It cannot be used at this time.'
End Case
Until ErrorMessage NE '' Or InAtTWInUse
Repeat
If InAtTWInUse then
if Num(ThisUsageQty) then
If ThisUsageQty GT 0 then
//Now check that the usage QTY can be consumed from the TW Lot
ThisLotCurrQty = Database_Services('ReadDataColumn', 'LOT', TWLotId, LOT_WAFER_QTY$, True$, 0, False$)
If ThisUsageQty LE ThisLotCurrQty then
Abort = false$
for i = 1 to ThisUsageQty
Test_Run_Services('CreateTestRunWaferRecord',TWRunKey, ThisLotPartId, RunTypeID, TWLotId, UserID)
If Error_Services('HasError') then
ErrorMessage = Error_Services('GetMessage')
end
until ErrorMessage NE ''
Next i
If ErrorMessage EQ '' then
Lot_Services('CreateLotEvent', TWLotId, 'TW', Datetime(), 'REDUCE_WAFER_QTY', ThisUsageQty : ' wafers consumed from lot.', EqpID, ThisUsageQty, 0, '', UserID)
end
end else
ErrorMessage = 'Error in Create Test Run Record routine, ' : TWLotId : ' does not have enough wafers.'
end
end
end else
ErrorMessage = 'Error in Create Test Run Record routine, Invalid qty for lot ' : TWLotId : ' passed to routine.'
end
end
end else
//Lot is not classified as a test wafer lot.
end
end else
//Lot is on hold
end
end else
//Lot is not open
end
until ErrorMessage NE ''
Next TWLotId
If ErrorMessage EQ '' then
//commit everything
end else
//commit nothing, there was an error.
end
end else
//Supports legacy TW logging
Response = TWRunKey
end
end else
ErrorMessage = 'Error in Create Test Run Record routine, Generated Test Run Key did not exist in TEST Run table.'
end
Response = TWRunKey
end else
ErrorMessage = Error_Services('GetMessage')
@ -364,30 +469,32 @@ Service CreateTestRunRecord(RunTypeID, EqpType, EqpID, PSNo, RDSNo, UserID)
end
end service
Service CreateTestRunWaferRecord(TestRunID, TWPartID, TWUsageTypeID, SourceLotID)
Service CreateTestRunWaferRecord(TestRunID, TWPartID, TWUsageTypeID, SourceLotId, Username)
ErrorMessage = ''
If TestRunID NE '' AND TWPartID NE '' then
If RowExists('TEST_RUN', TestRunID) then
TRWaferRec = ''
TRWaferRec<TEST_RUN_WAFER_TEST_RUN_ID$> = TestRunID
TRWaferRec<TEST_RUN_WAFER_TEST_WAFER_PROD_ID$> = TWPartID
TRWaferRec<TEST_RUN_WAFER_TEST_USAGE_TYPE_ID$> = TWUsageTypeID
TRWaferRec<TEST_RUN_WAFER_SOURCE_LOT_ID$> = SourceLotID
TRWaferKey = Nextkey('TEST_RUN_WAFER')
Database_Services('WriteDataRow', 'TEST_RUN_WAFER', TRWaferKey, TRWaferRec)
If Error_Services('NoError') AND RowExists('TEST_RUN_WAFER', TRWaferKey) then
LogData = ''
LogData<1, 1> = LoggingDTM
LogData<1, 2> = @User4
LogData<1, 3> = 'Successfully wrote ' : TRWaferKey : ' to the TEST_RUN_WAFER table.'
Logging_Services('AppendLog', objLogTR, LogData, @FM, @VM)
//Increment Usage in TEST_WAFER_PROD Record
Test_Run_Services('IncrementTWProdUsage', TWPartID)
Response = TRWaferKey
end else
ErrorMessage := 'Error writing TEST_RUN_WAFER record with key of ' : TRWaferKey '. '
end
//Legacy Code: Pre LOT usage
TRWaferRec = ''
TRWaferRec<TEST_RUN_WAFER_TEST_RUN_ID$> = TestRunID
TRWaferRec<TEST_RUN_WAFER_TEST_WAFER_PROD_ID$> = TWPartID
TRWaferRec<TEST_RUN_WAFER_TEST_USAGE_TYPE_ID$> = TWUsageTypeID
TRWaferRec<TEST_RUN_WAFER_SOURCE_LOT_ID$> = SourceLotID
TRWaferKey = Nextkey('TEST_RUN_WAFER')
Database_Services('WriteDataRow', 'TEST_RUN_WAFER', TRWaferKey, TRWaferRec)
If Error_Services('NoError') AND RowExists('TEST_RUN_WAFER', TRWaferKey) then
LogData = ''
LogData<1, 1> = LoggingDTM
LogData<1, 2> = @User4
LogData<1, 3> = 'Successfully wrote ' : TRWaferKey : ' to the TEST_RUN_WAFER table.'
Logging_Services('AppendLog', objLogTR, LogData, @FM, @VM)
//Increment Usage in TEST_WAFER_PROD Record
If ErrorMessage = '' then
Test_Run_Services('IncrementTWProdUsage', TWPartID)
Response = TRWaferKey
end
end else
ErrorMessage := 'Error writing TEST_RUN_WAFER record with key of ' : TRWaferKey '. '
end
end else
ErrorMessage := 'Unable to find parent TEST_RUN record. '
end
@ -403,10 +510,12 @@ Service CreateTestRunWaferRecord(TestRunID, TWPartID, TWUsageTypeID, SourceLotID
LogData = ''
LogData<1, 1> = LoggingDTM
LogData<1, 2> = @User4
LogData<1, 3> = 'Error Writing ' : TWRunKey : ' to the TEST_RUN_WAFER table. ' : ErrorMessage
LogData<1, 3> = 'Error Writing to the TEST_RUN_WAFER table. ' : ErrorMessage
Logging_Services('AppendLog', objLogTR, LogData, @FM, @VM)
Error_Services('Add', 'Error creating new test run record: ' : ErrorMessage)
end
end service
Service UseTWFromLot(LotId, UsageQty, Username)
ErrorMessage = ''
If RowExists('LOT', LotId) then
@ -635,3 +744,4 @@ end service

View File

@ -22,3 +22,4 @@ compile insert LOT_OPERATION_EQUATES
equ LOT_OPERATION_DATETIME_STOP$ to 13
#endif

View File

@ -1,38 +1,43 @@
compile insert SCANS_EQUATES
/*----------------------------------------
Author : Table Create Insert Routine
Written : 03/09/2018
Author : Table Create Insert Routine
Written : 18/11/2024
Description : Insert for Table SCANS
----------------------------------------*/
#ifndef __SCANS_EQUATES__
#define __SCANS_EQUATES__
equ SCANS.CREATED_DATE$ to 1
equ SCANS.CREATED_TIME$ to 2
equ SCANS.SCAN_TYPE$ to 3
equ SCANS.EMPLOYEE_ID$ to 4
equ SCANS.CASSETTE_IDS$ to 5
equ SCANS.LOCATION_ID$ to 6
equ SCANS.TOOL_ID$ to 7
equ SCANS.ACCEPTED$ to 8
equ SCANS.ACCEPTED_DATE$ to 9
equ SCANS.ACCEPTED_TIME$ to 10
equ SCANS.SCANNED_DATES$ to 11
equ SCANS.SCANNED_TIMES$ to 12
equ SCANS.SCANNED_DATA$ to 13
equ SCANS.ACTION$ to 14
equ SCANS.WAFER_COUNT_CONFIRMED$ to 15
equ SCANS.BOAT_ID$ to 16
equ SCANS.PL_NUMBER$ to 17
equ SCANS.UNLOAD_PL_CONFIRMED$ to 18
equ SCANS.LOAD_LOCK$ to 19
equ SCANS.TRANSFER_TOOL_ID$ to 20
equ SCANS.ACCEPTABLE$ to 21
equ SCANS.NOT_ACCEPTABLE_REASON$ to 22
equ SCANS.RESULT$ to 23
equ SCANS.SUPPLIER_LOT$ to 24
equ SCANS.ERROR_CASS_IDS$ to 25
equ SCANS.OVERRIDE_REQD$ to 26
equ SCANS.OVERRIDE_REASON$ to 27
equ SCANS.AUTHENTICATED$ to 28
equ SCANS.OVERRIDE_TYPE$ to 29
equ SCANS.TW_LOT_ID$ to 30
equ SCANS.TW_LOT_QTY$ to 31
equ SCANS.TEST_RUN_TYPE_ID$ to 32
Equ SCANS.SCAN_ID$ To 0
Equ SCANS.CREATED_DATE$ To 1
Equ SCANS.CREATED_TIME$ To 2
Equ SCANS.SCAN_TYPE$ To 3
Equ SCANS.EMPLOYEE_ID$ To 4
Equ SCANS.CASSETTE_IDS$ To 5
Equ SCANS.LOCATION_ID$ To 6
Equ SCANS.TOOL_ID$ To 7
Equ SCANS.ACCEPTED$ To 8
Equ SCANS.ACCEPTED_DATE$ To 9
Equ SCANS.ACCEPTED_TIME$ To 10
Equ SCANS.SCANNED_DATES$ To 11
Equ SCANS.SCANNED_TIMES$ To 12
Equ SCANS.SCANNED_DATA$ To 13
Equ SCANS.ACTION$ To 14
Equ SCANS.WAFER_COUNT_CONFIRMED$ To 15
Equ SCANS.BOAT_ID$ To 16
Equ SCANS.PL_NUMBER$ To 17
Equ SCANS.UNLOAD_PL_CONFIRMED$ To 18
Equ SCANS.LOAD_LOCK$ To 19
Equ SCANS.TRANSFER_TOOL_ID$ To 20
Equ SCANS.ACCEPTABLE$ To 21
Equ SCANS.NOT_ACCEPTABLE_REASON$ To 22
Equ SCANS.RESULT$ To 23
Equ SCANS.SUPPLIER_LOT$ To 24
Equ SCANS.ERROR_CASS_IDS$ To 25
Equ SCANS.OVERRIDE_REQD$ To 26
Equ SCANS.OVERRIDE_REASON$ To 27
Equ SCANS.AUTHENTICATED$ To 28
Equ SCANS.OVERRIDE_TYPE$ To 29
#endif

View File

@ -14,3 +14,4 @@ compile insert TEST_WAFER_PROD_EQUATES
equ TEST_WAFER_PROD_PRODUCT_OPERATIONS$ to 5
#endif