Re-adding from old branch
This commit is contained in:
parent
ef1744c8b1
commit
3a2ff00722
@ -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
@ -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
|
||||
|
||||
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
121
LSL2/STPROC/TESTRUNTYPES_API.txt
Normal file
121
LSL2/STPROC/TESTRUNTYPES_API.txt
Normal 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
|
||||
|
@ -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
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -22,3 +22,4 @@ compile insert LOT_OPERATION_EQUATES
|
||||
equ LOT_OPERATION_DATETIME_STOP$ to 13
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -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
|
||||
|
@ -14,3 +14,4 @@ compile insert TEST_WAFER_PROD_EQUATES
|
||||
equ TEST_WAFER_PROD_PRODUCT_OPERATIONS$ to 5
|
||||
|
||||
#endif
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user