added logic to RDS_ACTIONS to restore load signatures if erased unexpectedly
refactored solution to leverage the LOT and LOT_EVENT tables minor fix
This commit is contained in:
parent
b84cfb970f
commit
24a246a99b
@ -794,7 +794,7 @@ CreateRDS:
|
|||||||
CassSubPartNo = WOMatRec<WO_MAT_SUB_PART_NO$>
|
CassSubPartNo = WOMatRec<WO_MAT_SUB_PART_NO$>
|
||||||
CassSubInvID = '' ;* This isn't being used
|
CassSubInvID = '' ;* This isn't being used
|
||||||
CassOrderItem = WOMatRec<WO_MAT_ORDER_ITEM$>
|
CassOrderItem = WOMatRec<WO_MAT_ORDER_ITEM$>
|
||||||
|
CassSubVendCode = WOMatRec<WO_MAT_SUB_VEND_CD$>
|
||||||
|
|
||||||
WORec = XLATE('WO_LOG',WONo,'','X')
|
WORec = XLATE('WO_LOG',WONo,'','X')
|
||||||
|
|
||||||
@ -845,7 +845,9 @@ CreateRDS:
|
|||||||
Parms := CassLotNo:@RM
|
Parms := CassLotNo:@RM
|
||||||
Parms := CassPartNo:@RM
|
Parms := CassPartNo:@RM
|
||||||
Parms := CassWaferQty:@RM
|
Parms := CassWaferQty:@RM
|
||||||
Parms := CassSubPartNo
|
Parms := CassSubPartNo:@RM
|
||||||
|
Parms := '':@RM ; // QXJ flag
|
||||||
|
Parms := CassSubVendCode
|
||||||
|
|
||||||
RDSNo = obj_RDS('Create',Parms)
|
RDSNo = obj_RDS('Create',Parms)
|
||||||
|
|
||||||
@ -1015,3 +1017,4 @@ RETURN
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -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'
|
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$)
|
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'
|
Options EVENT_TYPES = 'MOVE_IN', 'MOVE_OUT', 'HOLD_ON', 'HOLD_OFF', 'REDUCE_WAFER_QTY', 'BONUS_WAFER_QTY', 'COMMENT', 'LOCATION', 'LOAD', 'UNSIGN_LOAD'
|
||||||
Options LOT_TYPES = 'TW', 'RDS', 'WM_OUT', 'WM_IN'
|
Options LOT_TYPES = 'TW', 'RDS', 'WM_OUT', 'WM_IN'
|
||||||
|
|
||||||
GoToService
|
GoToService
|
||||||
@ -78,6 +78,145 @@ Service GenerateNewLotId(LotType)
|
|||||||
Response = NewLotID
|
Response = NewLotID
|
||||||
end service
|
end service
|
||||||
|
|
||||||
|
|
||||||
|
Service CreateNewLot(LotType, ProdName, LotQty, VendorPartNo, VendorLotNo, VendorCode, Username, PrinterID, LotId)
|
||||||
|
; //649491 , 03M6241, 814474, SP
|
||||||
|
CreatedLotNumber = ''
|
||||||
|
ErrorMessage = ''
|
||||||
|
Begin Case
|
||||||
|
Case LotType EQ 'RDS'
|
||||||
|
NewLotId = LotId
|
||||||
|
If NewLotId NE '' then
|
||||||
|
If RowExists('LOT', NewLotId) EQ False$ then
|
||||||
|
LotRec = ''
|
||||||
|
LotRec<LOT_TYPE$> = LotType
|
||||||
|
LotRec<LOT_PROD_ID$> = ''
|
||||||
|
LotRec<LOT_ORIG_WAFER_QTY$> = LotQty
|
||||||
|
LotRec<LOT_WAFER_QTY$> = LotQty
|
||||||
|
LotRec<LOT_VENDOR_PART_NO$> = VendorPartNo
|
||||||
|
LotRec<LOT_VENDOR_LOT_NO$> = VendorLotNo
|
||||||
|
LotRec<LOT_VENDOR_CODE$> = VendorCode
|
||||||
|
Database_Services('WriteDataRow', 'LOT', NewLotId, LotRec)
|
||||||
|
If Error_Services('HasError') then
|
||||||
|
ErrorMessage = 'Error in ':Service:' service. ':Error_Services('GetMessage')
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMessage = 'Error in ':Service:' service. LOT record "':NewLotId:'" already exists.'
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMessage = 'Error in ':Service:' service. No lot ID passed in.'
|
||||||
|
end
|
||||||
|
Case LotType EQ 'TW'
|
||||||
|
If ProdName NE '' then
|
||||||
|
TWProdID = Test_Wafer_Prod_Services('GetTestWaferProdIDsByPartName', ProdName)
|
||||||
|
If TWProdID NE '' then
|
||||||
|
If DCount(TWProdID, @VM) EQ 1 then
|
||||||
|
NewLotId = Lot_Services('GenerateNewLotId', 'TW');//Don't use this
|
||||||
|
If NewLotId NE '' then
|
||||||
|
If RowExists('LOT', NewLotId) then
|
||||||
|
LotRec = Database_Services('ReadDataRow', 'LOT', NewLotId)
|
||||||
|
//Ensure the lot record is empty
|
||||||
|
If LotRec<LOT_TYPE$> EQ '' AND LotRec<LOT_PROD_ID$> EQ '' AND LotRec<LOT_ORIG_WAFER_QTY$> EQ '' AND LotRec<LOT_WAFER_QTY$> EQ '' then
|
||||||
|
LotRec<LOT_TYPE$> = LotType
|
||||||
|
LotRec<LOT_PROD_ID$> = TWProdID
|
||||||
|
LotRec<LOT_ORIG_WAFER_QTY$> = LotQty
|
||||||
|
LotRec<LOT_WAFER_QTY$> = LotQty
|
||||||
|
LotRec<LOT_VENDOR_PART_NO$> = VendorPartNo
|
||||||
|
LotRec<LOT_VENDOR_LOT_NO$> = VendorLotNo
|
||||||
|
LotRec<LOT_VENDOR_CODE$> = VendorCode
|
||||||
|
Database_Services('WriteDataRow', 'LOT', NewLotId, LotRec)
|
||||||
|
//Now Ensure that the written lot matches what was just written
|
||||||
|
LotRecCheck = Database_Services('ReadDataRow', 'LOT', NewLotId)
|
||||||
|
If LotRecCheck EQ LotRec then
|
||||||
|
//Lot Created successfully
|
||||||
|
CreatedLotNumber = NewLotId
|
||||||
|
If RowExists('LOT', CreatedLotNumber) then
|
||||||
|
Lot_Services('CreateInitialLotOperationRecords', CreatedLotNumber)
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
//Check in at first operation
|
||||||
|
//Get Curr Operation(Should be first one in sequence)
|
||||||
|
ThisLotCurrOpId = Lot_Services('GetLotCurrOperation', CreatedLotNumber)
|
||||||
|
If ThisLotCurrOpId NE '' then
|
||||||
|
Lot_Services('MoveInLot', NewLotId, LotQty, Username)
|
||||||
|
if Error_Services('NoError') then
|
||||||
|
//Set lot to open
|
||||||
|
Lot_Services('OpenLot', CreatedLotNumber)
|
||||||
|
if Error_Services('NoError') then
|
||||||
|
If PrinterID NE 'WEB' then
|
||||||
|
//If PrinterID is set to WEB this means the request comes from OI_Wizard and the client is going to handle printing.
|
||||||
|
Labeling_Services('PrintTestWaferLotLabel', CreatedLotNumber, Username, PrinterID)
|
||||||
|
If Error_Services('HasError') then
|
||||||
|
ErrorMessage = 'Error in Create New Test Wafer Lot Process, lot id: ' : CreatedLotNumber : ' , ' : Error_Services('GetMessage')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
Lot_Services('MoveOutLot', NewLotId, LotQty, Username)
|
||||||
|
If Error_Services('NoError') then
|
||||||
|
Lot_Services('MoveInLot', NewLotId, LotQty, Username)
|
||||||
|
If Error_Services('HasError') then
|
||||||
|
ErrorMessage = 'Error in Create New Test Wafer Lot Process, lot id: ' : NewLotId : ' , ' : Error_Services('GetMessage')
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMessage = 'Error in Create New Test Wafer Lot Process, lot id: ' : NewLotId : ' , ' : Error_Services('GetMessage')
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMessage = 'Error in Create New Test Wafer Lot Process, lot id: ' : NewLotId : ' , ' : Error_Services('GetMessage')
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMessage = 'Error in Create New Test Wafer Lot Process, lot id: ' : NewLotId : ' , ' : Error_Services('GetMessage')
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMessage = 'Error in Create New Test Wafer Lot Process, error getting current operation for lot: ' : NewLotId
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMessage = 'Error in Create New Test Wafer Lot Process, lot id: ' : NewLotId : ' , ' : Error_Services('GetMessage')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMessage = 'Error in Create New Test Wafer Lot Process, Lot attributes did not write correctly for lot: ' : NewLotId
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMessage = 'Error in Create New Test Wafer Lot Process, Lot already had data, lot: ' : NewLotId
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMessage = 'Error in Create New Test Wafer Lot Process, Created lot: ' : NewLotId : ' not found in LOT table.'
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMessage = 'Error in Create New Test Wafer Lot Process, no lot id returned.'
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMessage = 'Error in Create New Test Wafer Lot Process, ambiguous product passed to routine OR no matching products found.'
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMessage = 'Error in Create New Test Wafer Lot Process, product(':ProdName:') passed to routine not found.'
|
||||||
|
end
|
||||||
|
end else
|
||||||
|
ErrorMessage = 'Null value passed in for ProdID'
|
||||||
|
end
|
||||||
|
Case Otherwise$
|
||||||
|
ErrorMessage = 'Error in ':Service:' service. Lot Type "':LotType:'" is not currently supported.'
|
||||||
|
End Case
|
||||||
|
|
||||||
|
If ErrorMessage EQ '' then
|
||||||
|
LogData = ''
|
||||||
|
LogData<1> = LoggingDTM
|
||||||
|
LogData<2> = ProdName
|
||||||
|
LogData<3> = Username
|
||||||
|
LogData<4> = 'Successfully created lot id ' : CreatedLotNumber : ' of product type ' : ProdName '.'
|
||||||
|
Logging_Services('AppendLog', objTWCreationLog, LogData, @RM, @FM, False$)
|
||||||
|
end else
|
||||||
|
Error_Services('Add', ErrorMessage)
|
||||||
|
LogData = ''
|
||||||
|
LogData<1> = LoggingDTM
|
||||||
|
LogData<2> = ProdName
|
||||||
|
LogData<3> = Username
|
||||||
|
LogData<4> = ErrorMessage
|
||||||
|
Logging_Services('AppendLog', objTWCreationLog, LogData, @RM, @FM, False$)
|
||||||
|
end
|
||||||
|
Response = CreatedLotNumber
|
||||||
|
|
||||||
|
End Service
|
||||||
|
|
||||||
|
|
||||||
Service CreateNewTestWaferLot(LotType, ProdName, LotQty, VendorPartNo, VendorLotNo, VendorCode, Username, PrinterID)
|
Service CreateNewTestWaferLot(LotType, ProdName, LotQty, VendorPartNo, VendorLotNo, VendorCode, Username, PrinterID)
|
||||||
CreatedLotNumber = ''
|
CreatedLotNumber = ''
|
||||||
ErrorMessage = ''
|
ErrorMessage = ''
|
||||||
@ -511,6 +650,7 @@ Service MoveOutLot(LotID, WaferQty, Operator)
|
|||||||
end service
|
end service
|
||||||
|
|
||||||
Service CreateLotEvent(LotId, LotType=LOT_TYPES, EventDatetime, EventType=EVENT_TYPES, EventNote, EventEquipmentId, ReduceWaferQty, BonusWaferQty, OperationId, OperatorId)
|
Service CreateLotEvent(LotId, LotType=LOT_TYPES, EventDatetime, EventType=EVENT_TYPES, EventNote, EventEquipmentId, ReduceWaferQty, BonusWaferQty, OperationId, OperatorId)
|
||||||
|
|
||||||
ErrorMessage = ''
|
ErrorMessage = ''
|
||||||
BeginWaferQty = ''
|
BeginWaferQty = ''
|
||||||
EndWaferQty = ''
|
EndWaferQty = ''
|
||||||
@ -574,7 +714,55 @@ Service CreateLotEvent(LotId, LotType=LOT_TYPES, EventDatetime, EventType=EVENT_
|
|||||||
ErrorMessage = 'Error in Create Lot Event routine, Missing event type or Operator ID.'
|
ErrorMessage = 'Error in Create Lot Event routine, Missing event type or Operator ID.'
|
||||||
end
|
end
|
||||||
Case LotType EQ 'RDS'
|
Case LotType EQ 'RDS'
|
||||||
ErrorMessage = 'Error in Create Lot Event routine, Lot type RDS was passed to routine and this is currently not supported.'
|
If EventType NE '' AND OperatorId NE '' then
|
||||||
|
If RowExists('LOT', LotId) then
|
||||||
|
ValidId = False$
|
||||||
|
NewEventId = ''
|
||||||
|
Loop
|
||||||
|
NewEventId = RTI_CreateGUID()
|
||||||
|
If Not(RowExists('LOT_EVENT', NewEventId)) then
|
||||||
|
ValidId = True$
|
||||||
|
end
|
||||||
|
Until ValidId EQ True$
|
||||||
|
Repeat
|
||||||
|
BeginWaferQty = Xlate('LOT', LotId, LOT_WAFER_QTY$, 'X')
|
||||||
|
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
|
||||||
|
If Not(Num(EventDatetime)) then EventDatetime = IConv(EventDatetime, 'DT')
|
||||||
|
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
|
||||||
|
end else
|
||||||
|
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.'
|
||||||
|
end
|
||||||
|
|
||||||
Case LotType EQ 'WM_OUT'
|
Case LotType EQ 'WM_OUT'
|
||||||
ErrorMessage = 'Error in Create Lot Event routine, Lot type WM_OUT was passed to routine and this is currently not supported.'
|
ErrorMessage = 'Error in Create Lot Event routine, Lot type WM_OUT was passed to routine and this is currently not supported.'
|
||||||
Case LotType EQ 'WM_IN'
|
Case LotType EQ 'WM_IN'
|
||||||
@ -799,3 +987,4 @@ end service
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -21,7 +21,7 @@ DECLARE FUNCTION obj_RDS2, obj_RDS_Test, obj_WO_Mat, obj_Clean_Insp, obj_PRS_Pro
|
|||||||
DECLARE FUNCTION Logging_Services, Environment_Services, Error_Services, Signature_Services
|
DECLARE FUNCTION Logging_Services, Environment_Services, Error_Services, Signature_Services
|
||||||
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn, obj_WO_Step, obj_RDS_Layer, obj_RDS_Test, obj_WM_In
|
DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Send_Dyn, obj_WO_Step, obj_RDS_Layer, obj_RDS_Test, obj_WM_In
|
||||||
DECLARE SUBROUTINE Btree.Extract, RDS_React_Run, Environment_Services, Logging_Services, Error_Services, Send_Info
|
DECLARE SUBROUTINE Btree.Extract, RDS_React_Run, Environment_Services, Logging_Services, Error_Services, Send_Info
|
||||||
DECLARE SUBROUTINE SRP_Stopwatch, Database_Services
|
DECLARE SUBROUTINE SRP_Stopwatch, Database_Services, Lot_Services
|
||||||
|
|
||||||
$INSERT MSG_EQUATES
|
$INSERT MSG_EQUATES
|
||||||
$INSERT WO_VERIFY_EQU
|
$INSERT WO_VERIFY_EQU
|
||||||
@ -264,6 +264,7 @@ Create:
|
|||||||
WaferQty = Parms[COL2()+1,@RM]
|
WaferQty = Parms[COL2()+1,@RM]
|
||||||
SubPartNo = Parms[COL2()+1,@RM]
|
SubPartNo = Parms[COL2()+1,@RM]
|
||||||
QXJFlag = Parms[COL2()+1,@RM]
|
QXJFlag = Parms[COL2()+1,@RM]
|
||||||
|
SubVendCd = Parms[COL2()+1,@RM]
|
||||||
|
|
||||||
ErrorMsg = ''
|
ErrorMsg = ''
|
||||||
IF WONo = '' THEN ErrorMsg := 'Null Parameter "WONo" passed to routine. (':Method:')'
|
IF WONo = '' THEN ErrorMsg := 'Null Parameter "WONo" passed to routine. (':Method:')'
|
||||||
@ -499,7 +500,8 @@ Create:
|
|||||||
Logging_Services('AppendLog', objLog, LoggingDTM : ',' : @USER4 : ',' : RDSNo : ',' : 'Error writing new RDS record. Error code: ':errCode)
|
Logging_Services('AppendLog', objLog, LoggingDTM : ',' : @USER4 : ',' : RDSNo : ',' : 'Error writing new RDS record. Error code: ':errCode)
|
||||||
Result = ''
|
Result = ''
|
||||||
END ELSE
|
END ELSE
|
||||||
Result = RDSNo
|
Lot_Services('CreateNewLot', 'RDS', '', WaferQty, SubPartNo, LotNo, SubVendCd, @User4, '', RDSNo)
|
||||||
|
Result = RDSNo
|
||||||
END
|
END
|
||||||
|
|
||||||
* * * * * * *
|
* * * * * * *
|
||||||
@ -1471,3 +1473,4 @@ CalcThickTarget:
|
|||||||
|
|
||||||
RETURN
|
RETURN
|
||||||
|
|
||||||
|
|
||||||
|
@ -1089,13 +1089,14 @@ FOR WOStep = 1 TO WOStepCnt
|
|||||||
IF WOStepRec<WO_STEP_RDS_KEY$,CassNo> = '' THEN
|
IF WOStepRec<WO_STEP_RDS_KEY$,CassNo> = '' THEN
|
||||||
WOMatRec = XLATE('WO_MAT',WoNo:'*':CassNo,'','X')
|
WOMatRec = XLATE('WO_MAT',WoNo:'*':CassNo,'','X')
|
||||||
|
|
||||||
CassLotNo = WOMatRec<WO_MAT_LOT_NO$>
|
CassLotNo = WOMatRec<WO_MAT_LOT_NO$>
|
||||||
CassWaferQty = WOMatRec<WO_MAT_WAFER_QTY$>
|
CassWaferQty = WOMatRec<WO_MAT_WAFER_QTY$>
|
||||||
CassCustPartNo = WOMatRec<WO_MAT_CUST_PART_NO$>
|
CassCustPartNo = WOMatRec<WO_MAT_CUST_PART_NO$>
|
||||||
CassSubPartNo = WOMatRec<WO_MAT_SUB_PART_NO$>
|
CassSubPartNo = WOMatRec<WO_MAT_SUB_PART_NO$>
|
||||||
CassSubInvID = ''
|
CassSubInvID = ''
|
||||||
CassOrderItem = WOMatRec<WO_MAT_ORDER_ITEM$>
|
CassOrderItem = WOMatRec<WO_MAT_ORDER_ITEM$>
|
||||||
ReprocessedMat = WOMatRec<WO_MAT_REPROCESSED_MAT$>
|
ReprocessedMat = WOMatRec<WO_MAT_REPROCESSED_MAT$>
|
||||||
|
CassSubVendCd = WOMatRec<WO_MAT_SUB_VEND_CD$>
|
||||||
|
|
||||||
IF OrderNo = '' THEN
|
IF OrderNo = '' THEN
|
||||||
QuoteNo = ''
|
QuoteNo = ''
|
||||||
@ -1121,7 +1122,8 @@ FOR WOStep = 1 TO WOStepCnt
|
|||||||
Parms := CassCustPartNo:@RM
|
Parms := CassCustPartNo:@RM
|
||||||
Parms := CassWaferQty:@RM
|
Parms := CassWaferQty:@RM
|
||||||
Parms := CassSubPartNo:@RM
|
Parms := CassSubPartNo:@RM
|
||||||
Parms := '' ;* QXJ Flag
|
Parms := '':@RM ;* QXJ Flag
|
||||||
|
Parms := CassSubVendCd
|
||||||
|
|
||||||
Send_Info('Creating RDS for Cass No: ':CassNo:'...') ;** - Messaging - **
|
Send_Info('Creating RDS for Cass No: ':CassNo:'...') ;** - Messaging - **
|
||||||
|
|
||||||
@ -3016,3 +3018,4 @@ RETURN
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -143,7 +143,7 @@ Declare subroutine RTI_Set_Debugger, Database_Services, Btree.Extract, Extract_
|
|||||||
Declare subroutine Set_Status, Sleepery, Winyield, Yield, SRP_COM, QA_Services, Logging_Services, Obj_RDS
|
Declare subroutine Set_Status, Sleepery, Winyield, Yield, SRP_COM, QA_Services, Logging_Services, Obj_RDS
|
||||||
Declare subroutine Validate, obj_WO_Mat, obj_WO_Mat_Log, obj_React_Status, Record_Lock, obj_React_State, obj_Post_Log
|
Declare subroutine Validate, obj_WO_Mat, obj_WO_Mat_Log, obj_React_Status, Record_Lock, obj_React_State, obj_Post_Log
|
||||||
Declare subroutine RDS_Services, obj_WO_React, RDS_React_Run, Signature_Services, SQL_Services, SRP_Stopwatch
|
Declare subroutine RDS_Services, obj_WO_React, RDS_React_Run, Signature_Services, SQL_Services, SRP_Stopwatch
|
||||||
Declare subroutine Override_Services, Reactor_Services
|
Declare subroutine Override_Services, Reactor_Services, Lot_Services
|
||||||
Declare function SRP_Sort_Array, Metrology_Services, obj_RDS_Test, obj_Test_Point_Map, Database_Services
|
Declare function SRP_Sort_Array, Metrology_Services, obj_RDS_Test, obj_Test_Point_Map, Database_Services
|
||||||
Declare function Work_Order_Services, SRP_JSON, Logging_Services, Environment_Services, SRP_Trim, Error_Services
|
Declare function Work_Order_Services, SRP_JSON, Logging_Services, Environment_Services, SRP_Trim, Error_Services
|
||||||
Declare function Min, Max, SRPSendMail, Btree.Extract, GetTickCount, HTTPClient_Services, Obj_RDS, SQL_Services
|
Declare function Min, Max, SRPSendMail, Btree.Extract, GetTickCount, HTTPClient_Services, Obj_RDS, SQL_Services
|
||||||
@ -2517,6 +2517,8 @@ Service SignLoadStage(RDSNo, Username, WaferQty, LLSide, ScanEntry)
|
|||||||
Error_Services('Set', ErrorMsg)
|
Error_Services('Set', ErrorMsg)
|
||||||
Response = False$
|
Response = False$
|
||||||
return
|
return
|
||||||
|
end else
|
||||||
|
Lot_Services('CreateLotEvent', RDSNo, 'RDS', Datetime(), 'LOAD', 'Load stage signed', Reactor, '', '', '', Username)
|
||||||
end
|
end
|
||||||
|
|
||||||
IF ReactorType NE 'EPP' THEN
|
IF ReactorType NE 'EPP' THEN
|
||||||
@ -2541,7 +2543,6 @@ Service SignLoadStage(RDSNo, Username, WaferQty, LLSide, ScanEntry)
|
|||||||
SigTime = RDSRec<RDS_TIME_IN$>
|
SigTime = RDSRec<RDS_TIME_IN$>
|
||||||
owmParms = WONo:@RM:CassNo:@RM:WOStep:@RM:'LOAD':@RM:RDSSig:@RM:SigDate:' ':SigTime
|
owmParms = WONo:@RM:CassNo:@RM:WOStep:@RM:'LOAD':@RM:RDSSig:@RM:SigDate:' ':SigTime
|
||||||
* Sets LOAD signature
|
* Sets LOAD signature
|
||||||
* obj_WO_Mat('SetSignature',owmParms)
|
|
||||||
IF Get_Status(errCode) THEN
|
IF Get_Status(errCode) THEN
|
||||||
ErrorMsg = 'Process Error: Error calling obj_WO_Mat("SetSignature"). Error code: ':errCode
|
ErrorMsg = 'Process Error: Error calling obj_WO_Mat("SetSignature"). Error code: ':errCode
|
||||||
Error_Services('Set', ErrorMsg)
|
Error_Services('Set', ErrorMsg)
|
||||||
@ -2659,10 +2660,6 @@ Service SignLoadStage(RDSNo, Username, WaferQty, LLSide, ScanEntry)
|
|||||||
IdleTime = obj_React_Status('ReactorLoad',Reactor:@RM:WONo:@RM:InCassettes:@RM:LoadDTM:@RM:RDSNo)
|
IdleTime = obj_React_Status('ReactorLoad',Reactor:@RM:WONo:@RM:InCassettes:@RM:LoadDTM:@RM:RDSNo)
|
||||||
|
|
||||||
IF Get_Status(errCode) THEN
|
IF Get_Status(errCode) THEN
|
||||||
* ErrorMsg = 'Process Error: Error calling obj_React_Status("ReactorLoad"). Error code: ':errCode
|
|
||||||
* Error_Services('Set', ErrorMsg)
|
|
||||||
* Response = False$
|
|
||||||
* Return
|
|
||||||
LogData = ''
|
LogData = ''
|
||||||
LogData<1> = LoggingDTM
|
LogData<1> = LoggingDTM
|
||||||
LogData<2> = @User4
|
LogData<2> = @User4
|
||||||
@ -3904,3 +3901,4 @@ return
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -58,12 +58,13 @@ $Insert QA_MET_EQUATES
|
|||||||
$Insert PRS_STAGE_EQUATES
|
$Insert PRS_STAGE_EQUATES
|
||||||
$Insert WO_MAT_EQUATES
|
$Insert WO_MAT_EQUATES
|
||||||
$Insert WO_MAT_QA_EQUATES
|
$Insert WO_MAT_QA_EQUATES
|
||||||
|
$Insert LOT_EVENT_EQUATES
|
||||||
|
|
||||||
Equ COMMA$ to ','
|
Equ COMMA$ to ','
|
||||||
|
|
||||||
Declare function Error_Services, Database_Services, obj_RDS_Test, Logging_Services, Environment_Services, SRP_Math
|
Declare function Error_Services, Database_Services, obj_RDS_Test, Logging_Services, Environment_Services
|
||||||
Declare function Tool_Parms_Services, Signature_Services, obj_WO_Mat_QA, Datetime, Override_Services, obj_WO_Mat
|
Declare function Tool_Parms_Services, Signature_Services, obj_WO_Mat_QA, Datetime, Override_Services
|
||||||
Declare function Rds_Services
|
Declare function Rds_Services, SRP_DateTime, SRP_Math, obj_WO_Mat, Lot_Services, SRP_Array
|
||||||
Declare subroutine Error_Services, Database_Services, Logging_Services, Set_Status, Schedule_Services
|
Declare subroutine Error_Services, Database_Services, Logging_Services, Set_Status, Schedule_Services
|
||||||
Declare subroutine Work_Order_Services, Material_Services, Set_FSError
|
Declare subroutine Work_Order_Services, Material_Services, Set_FSError
|
||||||
|
|
||||||
@ -86,8 +87,6 @@ Headers = 'Logging DTM' : @FM : 'Results'
|
|||||||
ColumnWidths = 20 : @FM : 100
|
ColumnWidths = 20 : @FM : 100
|
||||||
objLog2 = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ' ', Headers, ColumnWidths, False$, False$)
|
objLog2 = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, ' ', Headers, ColumnWidths, False$, False$)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
If KeyID then GoSub Initialize_System_Variables
|
If KeyID then GoSub Initialize_System_Variables
|
||||||
|
|
||||||
Begin Case
|
Begin Case
|
||||||
@ -691,6 +690,46 @@ WRITE_RECORD_PRE:
|
|||||||
PostDTM = IConv(OConv({POST_EPI_SIG_DATE}, 'D'):' ':OConv({POST_EPI_SIG_TIME}, 'MT'), 'DT')
|
PostDTM = IConv(OConv({POST_EPI_SIG_DATE}, 'D'):' ':OConv({POST_EPI_SIG_TIME}, 'MT'), 'DT')
|
||||||
FQADTM = IConv(OConv({SUP_VER_SIG_DATE}, 'D'):' ':OConv({SUP_VER_SIG_TIME}, 'MT'), 'DT')
|
FQADTM = IConv(OConv({SUP_VER_SIG_DATE}, 'D'):' ':OConv({SUP_VER_SIG_TIME}, 'MT'), 'DT')
|
||||||
|
|
||||||
|
If NewLoadSig EQ '' then
|
||||||
|
// Audit the LOT_EVENT table for missing LOAD event (i.e., signature)
|
||||||
|
If RowExists('LOT', RDSNo) then
|
||||||
|
LotEvents = Lot_Services('GetLotEventsInSequence', RDSNo)
|
||||||
|
If LotEvents NE '' then
|
||||||
|
LotEventsRev = SRP_Array('Reverse', LotEvents, @FM)
|
||||||
|
LotEventsTypesRev = Xlate('LOT_EVENT', LotEventsRev, LOT_EVENT_LOT_EVENT_TYPE$, 'X')
|
||||||
|
If LotEventsTypesRev NE '' then
|
||||||
|
Done = False$
|
||||||
|
For each LotEventType in LotEventsTypesRev using @FM setting EventPos
|
||||||
|
Begin Case
|
||||||
|
Case LotEventType EQ 'LOAD'
|
||||||
|
Done = True$
|
||||||
|
If NewLoadSig EQ '' then
|
||||||
|
// Load signature is missing from RDS record
|
||||||
|
NewLoadSig = Xlate('LOT_EVENT', LotEventsRev<EventPos>, LOT_EVENT_EVENT_OPERATOR_ID$, 'X')
|
||||||
|
NewLoadSigDtm = Xlate('LOT_EVENT', LotEventsRev<EventPos>, LOT_EVENT_EVENT_DATETIME$, 'X')
|
||||||
|
NewLoadDate = SRP_DateTime("Date", NewLoadSigDtm)
|
||||||
|
NewLoadTime = SRP_DateTime("Time", NewLoadSigDtm)
|
||||||
|
Record<RDS_OPERATOR_IN$> = NewLoadSig
|
||||||
|
Record<RDS_DATE_IN$> = NewLoadDate
|
||||||
|
Record<RDS_TIME_IN$> = NewLoadTime
|
||||||
|
LogData = ''
|
||||||
|
LogData<1> = LoggingDTM
|
||||||
|
LogData<2> = @User4
|
||||||
|
LogData<3> = RDSKeyID
|
||||||
|
LogData<4> = 'Detected missing LOAD signature from RDS record. Restored signature from LOT_EVENT table.'
|
||||||
|
Logging_Services('AppendLog', objLog, LogData, @RM, @FM, False$)
|
||||||
|
end
|
||||||
|
Case LotEventType EQ 'UNSIGN_LOAD'
|
||||||
|
Done = True$
|
||||||
|
// No need to check for missing load signature
|
||||||
|
End Case
|
||||||
|
Until Done
|
||||||
|
Next LotEventType
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
Begin Case
|
Begin Case
|
||||||
Case LoadDTM NE '' and UnloadDTM EQ '' and UnloadEx1DTM EQ ''
|
Case LoadDTM NE '' and UnloadDTM EQ '' and UnloadEx1DTM EQ ''
|
||||||
// Cassette still running...
|
// Cassette still running...
|
||||||
@ -1005,4 +1044,3 @@ Restore_System_Variables:
|
|||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
|
@ -86,8 +86,10 @@ EQU READONLY_GREEN$ TO 192 + (220*256) + (192*65536)
|
|||||||
|
|
||||||
Declare subroutine ErrMsg, Set_Status, obj_WO_Mat, obj_WO_Mat_Log, obj_RDS, Set_Property, Send_Event, Database_Services
|
Declare subroutine ErrMsg, Set_Status, obj_WO_Mat, obj_WO_Mat_Log, obj_RDS, Set_Property, Send_Event, Database_Services
|
||||||
Declare subroutine Dialog_Box, Qa_Services, Obj_React_Ll, Start_Window, obj_React_Status, Reactor_Services, Rds_Services
|
Declare subroutine Dialog_Box, Qa_Services, Obj_React_Ll, Start_Window, obj_React_Status, Reactor_Services, Rds_Services
|
||||||
|
Declare subroutine Lot_Services
|
||||||
Declare function Dialog_Box, Msg, MemberOf, obj_WO_Mat, Database_Services, Get_Property, obj_React_Status, Get_Status
|
Declare function Dialog_Box, Msg, MemberOf, obj_WO_Mat, Database_Services, Get_Property, obj_React_Status, Get_Status
|
||||||
Declare function QA_Services, Database_Services, Rds_Services, Obj_Calendar, Override_Log_Services, Max, Supplement_Services
|
Declare function QA_Services, Database_Services, Rds_Services, Obj_Calendar, Override_Log_Services, Max, Supplement_Services
|
||||||
|
Declare function Datetime
|
||||||
|
|
||||||
SubclassInfo = Form_Services('FindSubclassControl')
|
SubclassInfo = Form_Services('FindSubclassControl')
|
||||||
Subclass = SubclassInfo<1>
|
Subclass = SubclassInfo<1>
|
||||||
@ -396,23 +398,17 @@ Event PUB_SIGN.CLICK()
|
|||||||
ErrMsg(ErrorMessage)
|
ErrMsg(ErrorMessage)
|
||||||
Return 0
|
Return 0
|
||||||
end
|
end
|
||||||
|
|
||||||
// 3. Lead/Supervisor/Engineer/EngTech override
|
// 3. Lead/Supervisor/Engineer/EngTech override
|
||||||
Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4 : @FM : 'LEAD' : @VM : 'SUPERVISOR':@VM:'ENGINEER':@VM:'ENG_TECH')
|
Response = Dialog_Box('NDW_VERIFY_USER', @WINDOW, @USER4 : @FM : 'LEAD' : @VM : 'SUPERVISOR':@VM:'ENGINEER':@VM:'ENG_TECH')
|
||||||
Valid = Response<1>
|
Valid = Response<1>
|
||||||
OverrideUser = Response<2>
|
OverrideUser = Response<2>
|
||||||
|
|
||||||
If Valid then
|
If Valid then
|
||||||
// 4. Remove RDS Unload signature, date, and time
|
|
||||||
Set_Property(@Window:'.OP_IN', 'TEXT', '')
|
Lot_Services('CreateLotEvent', RDSNo, 'RDS', Datetime(), 'UNSIGN_LOAD', 'Load stage unsigned', Reactor, '', '', '', @User4)
|
||||||
Set_Property(@Window:'.OP_IN_NAME', 'TEXT', '')
|
|
||||||
Set_Property(@Window:'.OP_IN_DATE', 'TEXT', '')
|
// 4. Remove WO_MAT Unload signature, date, and time
|
||||||
Set_Property(@Window:'.OP_IN_TIME', 'TEXT', '')
|
|
||||||
IOOptions = Get_Property(@Window, 'IOOPTIONS')
|
|
||||||
IOOptions<6> = True$
|
|
||||||
Set_Property(@Window, 'IOOPTIONS', IOOptions)
|
|
||||||
Send_Event(@Window, 'WRITE')
|
|
||||||
IOOptions<6> = False$
|
|
||||||
Set_Property(@Window, 'IOOPTIONS', IOOptions)
|
|
||||||
// 5. Remove WO_MAT Unload signature, date, and time
|
|
||||||
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
|
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
|
||||||
SigProf = WOMatRec<WO_MAT_SIG_PROFILE$>
|
SigProf = WOMatRec<WO_MAT_SIG_PROFILE$>
|
||||||
Sigs = WOMatRec<WO_MAT_SIGNATURE$>
|
Sigs = WOMatRec<WO_MAT_SIGNATURE$>
|
||||||
@ -424,7 +420,8 @@ Event PUB_SIGN.CLICK()
|
|||||||
WOMatRec<WO_MAT_SIG_DTM$> = SigDTMs
|
WOMatRec<WO_MAT_SIG_DTM$> = SigDTMs
|
||||||
obj_React_Status('HandleLoadUnsign',Reactor:@RM:WONo:@RM:CassNo:@RM:RDSNo:@RM:OverrideUser)
|
obj_React_Status('HandleLoadUnsign',Reactor:@RM:WONo:@RM:CassNo:@RM:RDSNo:@RM:OverrideUser)
|
||||||
end
|
end
|
||||||
// 6. Remove '1LOAD' material log entry (i.e. WO_MAT<INV...> columns)
|
|
||||||
|
// 5. Remove '1LOAD' material log entry (i.e. WO_MAT<INV...> columns)
|
||||||
InvActions = WOMatRec<WO_MAT_INV_ACTION$>
|
InvActions = WOMatRec<WO_MAT_INV_ACTION$>
|
||||||
Locate '1LOAD' in InvActions using @VM setting vPos then
|
Locate '1LOAD' in InvActions using @VM setting vPos then
|
||||||
WOMatRec<WO_MAT_INV_WH$> = Delete(WOMatRec<WO_MAT_INV_WH$>, 0, vPos, 0)
|
WOMatRec<WO_MAT_INV_WH$> = Delete(WOMatRec<WO_MAT_INV_WH$>, 0, vPos, 0)
|
||||||
@ -439,10 +436,24 @@ Event PUB_SIGN.CLICK()
|
|||||||
end
|
end
|
||||||
Database_Services('WriteDataRow', 'WO_MAT', WOMatKey, WOMatRec, True$, False$, True$)
|
Database_Services('WriteDataRow', 'WO_MAT', WOMatKey, WOMatRec, True$, False$, True$)
|
||||||
|
|
||||||
|
// 6. Remove RDS Unload signature, date, and time
|
||||||
|
// NOTE: This needs to occur before item #5 to avoid RDS_ACTIONS restoring the load signature
|
||||||
|
Set_Property(@Window:'.OP_IN', 'TEXT', '')
|
||||||
|
Set_Property(@Window:'.OP_IN_NAME', 'TEXT', '')
|
||||||
|
Set_Property(@Window:'.OP_IN_DATE', 'TEXT', '')
|
||||||
|
Set_Property(@Window:'.OP_IN_TIME', 'TEXT', '')
|
||||||
|
IOOptions = Get_Property(@Window, 'IOOPTIONS')
|
||||||
|
IOOptions<6> = True$
|
||||||
|
Set_Property(@Window, 'IOOPTIONS', IOOptions)
|
||||||
|
Send_Event(@Window, 'WRITE')
|
||||||
|
IOOptions<6> = False$
|
||||||
|
Set_Property(@Window, 'IOOPTIONS', IOOptions)
|
||||||
|
|
||||||
Reactor = Get_Property(@Window:'.REACTOR', 'TEXT')
|
Reactor = Get_Property(@Window:'.REACTOR', 'TEXT')
|
||||||
Rds_Services('AddComment', RDSNo, 'Load Stage Unsigned from Reactor ' : Reactor)
|
Rds_Services('AddComment', RDSNo, 'Load Stage Unsigned from Reactor ' : Reactor)
|
||||||
ReactorRec = Database_Services('ReadDataRow', 'REACTOR', Reactor)
|
ReactorRec = Database_Services('ReadDataRow', 'REACTOR', Reactor)
|
||||||
PreviousRotrOverrideRds = ReactorRec<REACTOR_PREVIOUS_ROTR_OVERRIDE_RDS$>
|
PreviousRotrOverrideRds = ReactorRec<REACTOR_PREVIOUS_ROTR_OVERRIDE_RDS$>
|
||||||
|
|
||||||
// Check if ROTR override was preformed when signing this load
|
// Check if ROTR override was preformed when signing this load
|
||||||
If (PreviousRotrOverrideRds EQ RDSNo) then
|
If (PreviousRotrOverrideRds EQ RDSNo) then
|
||||||
// Reset the override flag
|
// Reset the override flag
|
||||||
@ -456,7 +467,8 @@ Event PUB_SIGN.CLICK()
|
|||||||
If ReactorType EQ 'EPP' then
|
If ReactorType EQ 'EPP' then
|
||||||
Reactor_Services('DecrementWfrMetrics', RDSNo)
|
Reactor_Services('DecrementWfrMetrics', RDSNo)
|
||||||
end
|
end
|
||||||
Set_Property(@Window:'.PUB_SIGN', 'TEXT', 'Sign')
|
Set_Property(@Window:'.PUB_SIGN', 'TEXT', 'Sign')
|
||||||
|
|
||||||
end else
|
end else
|
||||||
Return 0
|
Return 0
|
||||||
end
|
end
|
||||||
@ -659,3 +671,4 @@ return
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user