updated schedule related services to account for voided cassettes
This commit is contained in:
@ -1221,7 +1221,6 @@ Event PUB_REM_CASS.CLICK()
|
||||
WmInKeys = ''
|
||||
for each CassetteToVoid in CassettesToVoid using @FM
|
||||
WmInKeys<1, -1> = CassetteToVoid<1,4>
|
||||
//Work_Order_Services('SignVoidWMI', WMIToVoid, @USER4)
|
||||
Next CassetteToVoid
|
||||
Service_Services('PostProcedure', 'WORK_ORDER_SERVICES', 'SignVoidWMI':SD$:WmInKeys:SD$:WoNo:SD$:@USER4)
|
||||
If Error_Services('HasError') then
|
||||
@ -1240,7 +1239,6 @@ Event PUB_REM_CASS.CLICK()
|
||||
CassNo = XLATE('RDS', RDSToVoid, RDS_CASS_NO$, 'X')
|
||||
WOMatKey = WONo : '*' : CassNo
|
||||
WoMatKeyList<1, -1> = WoMatKey
|
||||
//Work_Order_Services('SignVoidNonEPP', WOMatKey, @USER4)
|
||||
If Error_Services('HasError') then
|
||||
ErrorMessage = Error_Services('GetMessage')
|
||||
end
|
||||
@ -1332,7 +1330,7 @@ Event PUB_REM_WM_OUT.CLICK()
|
||||
WmOutKeys<1, -1> = CassetteToVoid<1,3>
|
||||
Until ErrorMessage NE ''
|
||||
Next CassetteToVoid
|
||||
Service_Services('PostProcedure', 'WORK_ORDER_SERVICES', 'SignVoidWMO':SD$:WmInKeys:SD$:WoNo:SD$:@USER4)
|
||||
Service_Services('PostProcedure', 'WORK_ORDER_SERVICES', 'SignVoidWMO':SD$:WmOutKeys:SD$:WoNo:SD$:@USER4)
|
||||
If Error_Services('HasError') then
|
||||
ErrorMessage = Error_Services('GetMessage')
|
||||
end
|
||||
|
@ -30,22 +30,23 @@ Function Schedule_Services(@Service, @Params)
|
||||
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
$insert APP_INSERTS
|
||||
$insert SERVICE_SETUP
|
||||
$insert RLIST_EQUATES
|
||||
$insert REACTOR_EQUATES
|
||||
$insert SCHED_DET_NG_EQUATES
|
||||
$insert WO_LOG_EQUATES
|
||||
$Insert APP_INSERTS
|
||||
$Insert SERVICE_SETUP
|
||||
$Insert RLIST_EQUATES
|
||||
$Insert REACTOR_EQUATES
|
||||
$Insert SCHED_DET_NG_EQUATES
|
||||
$Insert WO_LOG_EQUATES
|
||||
$Insert WO_MAT_EQUATES
|
||||
$insert WO_SCHEDULE_NG_EQUATES
|
||||
$insert COMPANY_EQUATES
|
||||
$insert PROD_VER_EQUATES
|
||||
$insert PRS_LAYER_EQU
|
||||
$insert SCHEDULE_EVENT_SUMMMARY_EQUATES
|
||||
$insert EPI_PART_EQUATES
|
||||
$insert PROD_SPEC_EQUATES
|
||||
$insert SCHED_HIST_EQUATES
|
||||
$Insert WO_SCHEDULE_NG_EQUATES
|
||||
$Insert COMPANY_EQUATES
|
||||
$Insert PROD_VER_EQUATES
|
||||
$Insert PRS_LAYER_EQU
|
||||
$Insert SCHEDULE_EVENT_SUMMMARY_EQUATES
|
||||
$Insert EPI_PART_EQUATES
|
||||
$Insert PROD_SPEC_EQUATES
|
||||
$Insert SCHED_HIST_EQUATES
|
||||
$Insert RDS_EQUATES
|
||||
$Insert WM_IN_EQUATES
|
||||
|
||||
Equ new_exist$ To 0 ; * Reduce Mode 0
|
||||
Equ next_cur$ To 1
|
||||
@ -59,7 +60,7 @@ Declare subroutine Mona_Services
|
||||
Declare function SRP_Array, Schedule_Services, Memory_Services, Database_Services, SRP_Sort_Array, Datetime
|
||||
Declare function Epi_Part_Services, SRP_Math, SRP_Hash, obj_Prod_Spec, Logging_Services, Environment_Services
|
||||
Declare function Work_Order_Services, RTI_CreateGUID, Reactor_Services, Schedule_Services, NextKey, SRP_Datetime
|
||||
Declare function SRP_Time, Lsl_Users_Services, GetTickCount
|
||||
Declare function SRP_Time, Lsl_Users_Services, GetTickCount, obj_WO_Mat
|
||||
|
||||
Date = Oconv(Date(), 'D4/')
|
||||
LogFileName = Date[7, 4] : '-' : Date[1, 2] : '-' : Date[4, 2] : ' Scheduler Log.csv'
|
||||
@ -1246,13 +1247,58 @@ Service AdjustScheduleEvents(ReactNo)
|
||||
Schedule_Services('LogActivity', ReactNo, LogData)
|
||||
LogData<3> = 'Event complete: ':OConv(EventRec<SCHED_DET_NG.EVENT_COMP$>, "Btrue,false")
|
||||
Schedule_Services('LogActivity', ReactNo, LogData)
|
||||
LogData<3> = 'Event unprocessed cassettes: ':EventRec<SCHED_DET_NG.UNPROCESSED_CASS$>
|
||||
Schedule_Services('LogActivity', ReactNo, LogData)
|
||||
LogData<3> = 'Event processed cassettes: ':EventRec<SCHED_DET_NG.PROCESSED_CASS$>
|
||||
Schedule_Services('LogActivity', ReactNo, LogData)
|
||||
|
||||
EventAdjustment = Schedule_Services('GetEventAdjustment', EventKey)
|
||||
UnprocessedCass = EventRec<SCHED_DET_NG.UNPROCESSED_CASS$>
|
||||
ProcessedCass = EventRec<SCHED_DET_NG.PROCESSED_CASS$>
|
||||
AllCassList = SRP_Array('Join', UnprocessedCass, ProcessedCass, 'OR', @VM)
|
||||
AllCassList = SRP_Array('SortSimpleList', AllCassList, 'AscendingNumbers', @VM)
|
||||
EventComp = (UnprocessedCass EQ '')
|
||||
|
||||
// Check each cassette to see if it was voided
|
||||
VoidedQty = 0
|
||||
WONo = EventRec<SCHED_DET_NG.WO_NO$>
|
||||
EventWfrs = EventRec<SCHED_DET_NG.EVENT_TOTAL_WFRS$>
|
||||
VoidedCassList = ''
|
||||
VoidedWfrQty = 0
|
||||
For each CassNo in AllCassList using @VM
|
||||
If Epipro then
|
||||
WmInKey = WoNo:'*1*':CassNo
|
||||
Voided = Xlate('WM_IN', WmInKey, 'VOID', 'X')
|
||||
CassQty = Xlate('WM_IN', WmInKey, 'WFR_CNT', 'X')
|
||||
end else
|
||||
WOMatKey = WoNo:'*':CassNo
|
||||
Voided = Xlate('WO_MAT', WOMatKey, 'VOID', 'X')
|
||||
CassQty = Xlate('WO_MAT', WOMatKey, 'WAFER_QTY', 'X')
|
||||
end
|
||||
If Voided then
|
||||
VoidedCassList<0, -1> = CassNo
|
||||
VoidedWfrQty += CassQty
|
||||
end
|
||||
Next CassNo
|
||||
UnprocessedCass = SRP_Array('Join', UnprocessedCass, VoidedCassList, 'NOT', @VM)
|
||||
ProcessedCass = SRP_Array('Join', ProcessedCass, VoidedCassList, 'NOT', @VM)
|
||||
AllCassList = SRP_Array('Join', AllCassList, VoidedCassList, 'NOT', @VM)
|
||||
EventWfrs -= VoidedWfrQty
|
||||
EventRec<SCHED_DET_NG.UNPROCESSED_CASS$> = UnprocessedCass
|
||||
EventRec<SCHED_DET_NG.PROCESSED_CASS$> = ProcessedCass
|
||||
EventRec<SCHED_DET_NG.EVENT_TOTAL_WFRS$> = EventWfrs
|
||||
Database_Services('WriteDataRow', 'SCHED_DET_NG', EventKey, EventRec, True$, False$, True$)
|
||||
|
||||
// Check each unprocessed cassette to ensure it does not need to be moved to the processed column
|
||||
For each CassNo in UnprocessedCass using @VM
|
||||
Schedule_Services('MarkCassProcessed', WONo, CassNo, Datetime())
|
||||
Next CassNo
|
||||
|
||||
EventRec = Schedule_Services('GetScheduleDetail', EventKey)
|
||||
UnprocessedCass = EventRec<SCHED_DET_NG.UNPROCESSED_CASS$>
|
||||
ProcessedCass = EventRec<SCHED_DET_NG.PROCESSED_CASS$>
|
||||
AllCassList = SRP_Array('Join', UnprocessedCass, ProcessedCass, 'OR', @VM)
|
||||
AllCassList = SRP_Array('SortSimpleList', AllCassList, 'AscendingNumbers', @VM)
|
||||
EventAdjustment = Schedule_Services('GetEventAdjustment', EventKey)
|
||||
EventComp = (UnprocessedCass EQ '')
|
||||
|
||||
If Not(EventRec<SCHED_DET_NG.EVENT_COMP$>) and EventComp then
|
||||
LogData = ''
|
||||
@ -1263,9 +1309,7 @@ Service AdjustScheduleEvents(ReactNo)
|
||||
end
|
||||
|
||||
EventRec<SCHED_DET_NG.EVENT_COMP$> = EventComp
|
||||
WONo = EventRec<SCHED_DET_NG.WO_NO$>
|
||||
ReactNo = EventRec<SCHED_DET_NG.REACT_NO$>
|
||||
EventWfrs = EventRec<SCHED_DET_NG.EVENT_TOTAL_WFRS$>
|
||||
WOQty = Xlate('WO_LOG', WONo, 'QTY', 'X')
|
||||
// If work order event is engaged then set start DTM to first cassette DTM in.
|
||||
// If previous event end time overlaps (e.g. soft block finished sooner than scheduled)
|
||||
@ -2258,6 +2302,7 @@ end service
|
||||
Service AddSchedEvent(ReactorNo, WorkOrderNo, StartDTM, StopDTM, Description, WaferQty)
|
||||
|
||||
// Create a unique key ID for the new event
|
||||
ErrorMsg = ''
|
||||
NewEventKeyID = RTI_CreateGUID()
|
||||
NewEventRec = ''
|
||||
NewEventRec<SCHED_DET_NG.REACT_NO$> = ReactorNo
|
||||
@ -2267,16 +2312,17 @@ Service AddSchedEvent(ReactorNo, WorkOrderNo, StartDTM, StopDTM, Description, Wa
|
||||
NewEventRec<SCHED_DET_NG.EVENT_TOTAL_WFRS$> = WaferQty
|
||||
EpiPro = (Xlate('WO_LOG', WorkOrderNo, 'REACT_TYPE', 'X') EQ 'EPP')
|
||||
CurrDTM = Datetime()
|
||||
EventProcCassList = ''
|
||||
EventUnprocCassList = ''
|
||||
LastLoadedRDS = ''
|
||||
LastUnloadedRDS = ''
|
||||
EventProcCassList = ''
|
||||
EventUnprocCassList = ''
|
||||
LastLoadedRDS = ''
|
||||
LastUnloadedRDS = ''
|
||||
// Determine start cassette and slot number
|
||||
PrevSchedQty = Schedule_Services('GetScheduledWfrQty', WorkOrderNo)
|
||||
StartCass = SRP_Math('CEILING', ( (PrevSchedQty + 1) / 25))
|
||||
PrevSchedQty = Schedule_Services('GetScheduledWfrQty', WorkOrderNo)
|
||||
VoidedQty = Work_Order_Services('GetVoidedWaferCount', WorkOrderNo)
|
||||
StartCass = SRP_Math('CEILING', ( (PrevSchedQty + VoidedQty + 1) / 25))
|
||||
If StartCass EQ 0 then StartCass = 1
|
||||
StartSlot = Mod(PrevSchedQty, 25) + 1
|
||||
TotalSchedQty = PrevSchedQty + WaferQty
|
||||
TotalSchedQty = PrevSchedQty + WaferQty + VoidedQty
|
||||
StopCass = SRP_Math('CEILING', ( TotalSchedQty / 25 ) )
|
||||
StopSlot = Mod(TotalSchedQty, 25)
|
||||
If StopSlot EQ 0 then StopSlot = 25
|
||||
@ -2284,128 +2330,179 @@ Service AddSchedEvent(ReactorNo, WorkOrderNo, StartDTM, StopDTM, Description, Wa
|
||||
RDSKeys = ''
|
||||
If EpiPro then
|
||||
For CassNo = StartCass to StopCass
|
||||
WMIKey = WorkOrderNo:'*1*':CassNo
|
||||
WMIRdsList = Xlate('WM_IN', WMIKey, 'RDS_NO', 'X')
|
||||
If WMIRdsList NE '' then
|
||||
Begin Case
|
||||
Case ( (CassNo EQ StartCass) and (CassNo EQ StopCass) )
|
||||
StartIndex = StartSlot
|
||||
StopIndex = StopSlot
|
||||
Case CassNo EQ StartCass
|
||||
StartIndex = StartSlot
|
||||
StopIndex = 25
|
||||
Case CassNo EQ StopCass
|
||||
StartIndex = 1
|
||||
StopIndex = StopSlot
|
||||
Case Otherwise$
|
||||
StartIndex = 1
|
||||
StopIndex = 25
|
||||
End Case
|
||||
For SlotIndex = StartIndex to StopIndex
|
||||
RDSKeys<0, -1> = WMIRdsList<0, SlotIndex>
|
||||
Next SlotIndex
|
||||
WMIKey = WorkOrderNo:'*1*':CassNo
|
||||
WMIRec = Database_Services('ReadDataRow', 'WM_IN', WMIKey)
|
||||
If Error_Services('NoError') then
|
||||
Voided = WMIRec<WM_IN_VOID$>
|
||||
If Not(Voided) then
|
||||
WMIRdsList = WMIRec<WM_IN_RDS_NO$>
|
||||
If WMIRdsList NE '' then
|
||||
Begin Case
|
||||
Case ( (CassNo EQ StartCass) and (CassNo EQ StopCass) )
|
||||
StartIndex = StartSlot
|
||||
StopIndex = StopSlot
|
||||
Case CassNo EQ StartCass
|
||||
StartIndex = StartSlot
|
||||
StopIndex = 25
|
||||
Case CassNo EQ StopCass
|
||||
StartIndex = 1
|
||||
StopIndex = StopSlot
|
||||
Case Otherwise$
|
||||
StartIndex = 1
|
||||
StopIndex = 25
|
||||
End Case
|
||||
For SlotIndex = StartIndex to StopIndex
|
||||
RDSKeys<0, -1> = WMIRdsList<0, SlotIndex>
|
||||
Next SlotIndex
|
||||
end else
|
||||
// No RDS keys exist for this cassette yet, so it's unprocessed
|
||||
EventUnprocCassList<0, -1> = CassNo
|
||||
end
|
||||
end
|
||||
end else
|
||||
// No RDS keys exist for this cassette yet, so it's unprocessed
|
||||
EventUnprocCassList<0, -1> = CassNo
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
Until (ErrorMsg NE '')
|
||||
Next CassNo
|
||||
|
||||
If RDSKeys NE '' then
|
||||
RDSKeys = SRP_Array('Clean', RDSKeys, 'TrimAndMakeUnique', @VM)
|
||||
For each RDSKey in RDSKeys using @VM setting vPos
|
||||
DtmOut = Xlate('RDS', RDSKey, 'DATETIME_OUT', 'X')
|
||||
WMIKeys = Xlate('RDS', RDSKey, 'WM_IN_KEY', 'X')
|
||||
For each WMIKey in WMIKeys using @VM
|
||||
CassNo = Field(WMIKey, '*', 3)
|
||||
If DtmOut NE '' then
|
||||
LastUnloadedRDS = RDSKey
|
||||
Locate CassNo in EventProcCassList using @VM setting Dummy else
|
||||
EventProcCassList<0, -1> = CassNo
|
||||
end
|
||||
If (ErrorMsg EQ '') then
|
||||
If RDSKeys NE '' then
|
||||
RDSKeys = SRP_Array('Clean', RDSKeys, 'TrimAndMakeUnique', @VM)
|
||||
For each RDSKey in RDSKeys using @VM setting vPos
|
||||
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSKey)
|
||||
If Error_Services('NoError') then
|
||||
DateOut = RDSRec<RDS_DATE_OUT$>
|
||||
TimeOut = RDSRec<RDS_TIME_OUT$>
|
||||
TimeOut = TimeOut/86400
|
||||
TimeOut = SRP_Math('ROUND', TimeOut, 5)
|
||||
TimeOut = TimeOut[2, 6]
|
||||
DtmOut = DateOut:TimeOut
|
||||
end else
|
||||
Locate CassNo in EventUnprocCassList using @VM setting Dummy else
|
||||
EventUnprocCassList<0, -1> = CassNo
|
||||
end
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
Next WMIKey
|
||||
Next RDSKey
|
||||
end
|
||||
If (ErrorMsg EQ '' ) then
|
||||
WMIKeys = Xlate('RDS', RDSKey, 'WM_IN_KEY', 'X')
|
||||
For each WMIKey in WMIKeys using @VM
|
||||
CassNo = Field(WMIKey, '*', 3)
|
||||
If DtmOut NE '' then
|
||||
LastUnloadedRDS = RDSKey
|
||||
Locate CassNo in EventProcCassList using @VM setting Dummy else
|
||||
EventProcCassList<0, -1> = CassNo
|
||||
end
|
||||
end else
|
||||
Locate CassNo in EventUnprocCassList using @VM setting Dummy else
|
||||
EventUnprocCassList<0, -1> = CassNo
|
||||
end
|
||||
end
|
||||
Next WMIKey
|
||||
end
|
||||
Until (ErrorMsg NE '')
|
||||
Next RDSKey
|
||||
end
|
||||
|
||||
EventUnprocCassList = SRP_Array('SortSimpleList', EventUnprocCassList, 'AscendingNumbers', @VM)
|
||||
// This line ensures EpiPro cassettes are not recorded as both processed and unprocessed.
|
||||
EventProcCassList = SRP_Array('Join', EventProcCassList, EventUnprocCassList, 'NOT', @VM)
|
||||
EventUnprocCassList = SRP_Array('SortSimpleList', EventUnprocCassList, 'AscendingNumbers', @VM)
|
||||
// This line ensures EpiPro cassettes are not recorded as both processed and unprocessed.
|
||||
EventProcCassList = SRP_Array('Join', EventProcCassList, EventUnprocCassList, 'NOT', @VM)
|
||||
end
|
||||
|
||||
end else
|
||||
|
||||
For CassNo = StartCass to StopCass
|
||||
WOMatKey = WorkOrderNo:'*':CassNo
|
||||
RDSKey = Xlate('WO_MAT', WOMatKey, 'RDS_NO', 'X')
|
||||
DtmOut = Xlate('RDS', RDSKey, 'DATETIME_OUT', 'X')
|
||||
If DtmOut NE '' then
|
||||
LastUnloadedRDS = RDSKey
|
||||
Locate CassNo in EventProcCassList using @VM setting Dummy else
|
||||
EventProcCassList<0, -1> = CassNo
|
||||
WOMatKey = WorkOrderNo:'*':CassNo
|
||||
WOMatRec = Database_Services('ReadDataRow', 'WO_MAT', WOMatKey)
|
||||
If Error_Services('NoError') then
|
||||
Voided = WOMatRec<WO_MAT_VOID$>
|
||||
If Not(Voided) then
|
||||
RDSKey = WOMatRec<WO_MAT_RDS_NO$>
|
||||
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSKey)
|
||||
If Error_Services('NoError') then
|
||||
DateOut = RDSRec<RDS_DATE_OUT$>
|
||||
TimeOut = RDSRec<RDS_TIME_OUT$>
|
||||
TimeOut = TimeOut/86400
|
||||
TimeOut = SRP_Math('ROUND', TimeOut, 5)
|
||||
TimeOut = TimeOut[2, 6]
|
||||
DtmOut = DateOut:TimeOut
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
end
|
||||
end else
|
||||
Locate CassNo in EventUnprocCassList using @VM setting Dummy else
|
||||
EventUnprocCassList<0, -1> = CassNo
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
end
|
||||
|
||||
If (ErrorMsg EQ '') then
|
||||
If DtmOut NE '' then
|
||||
LastUnloadedRDS = RDSKey
|
||||
Locate CassNo in EventProcCassList using @VM setting Dummy else
|
||||
EventProcCassList<0, -1> = CassNo
|
||||
end
|
||||
end else
|
||||
Locate CassNo in EventUnprocCassList using @VM setting Dummy else
|
||||
EventUnprocCassList<0, -1> = CassNo
|
||||
end
|
||||
end
|
||||
end
|
||||
Until (ErrorMsg NE '')
|
||||
Next CassNo
|
||||
end
|
||||
|
||||
EventComp = (EventUnprocCassList EQ '')
|
||||
If EventComp then StopDtm = Xlate('RDS', LastUnloadedRDS, 'DATETIME_OUT', 'X')
|
||||
If (ErrorMsg EQ '') then
|
||||
|
||||
// Update event
|
||||
NewEventRec<SCHED_DET_NG.EVENT_COMP$> = EventComp
|
||||
NewEventRec<SCHED_DET_NG.PROCESSED_CASS$> = EventProcCassList
|
||||
NewEventRec<SCHED_DET_NG.UNPROCESSED_CASS$> = EventUnprocCassList
|
||||
NewEventRec<SCHED_DET_NG.STOP_DTM$> = StopDtm
|
||||
Database_Services('WriteDataRow', 'SCHED_DET_NG', NewEventKeyID, NewEventRec)
|
||||
EventComp = (EventUnprocCassList EQ '')
|
||||
If EventComp then StopDtm = Xlate('RDS', LastUnloadedRDS, 'DATETIME_OUT', 'X')
|
||||
|
||||
If Error_Services('NoError') then
|
||||
// Determine where to insert the event in the REACTOR record linked list
|
||||
// Add the event to the REACTOR record event list
|
||||
ReactRec = Database_Services('ReadDataRow', 'REACTOR', ReactorNo)
|
||||
ReactSchedEvents = ReactRec<REACTOR_SCHED_EVENTS$>
|
||||
CurrNumEvents = DCount(ReactSchedEvents, @VM)
|
||||
// Add our new event key ID to the reactor event list
|
||||
NewNumEvents = CurrNumEvents + 1
|
||||
InsertPos = ''
|
||||
For EventIndex = 1 to CurrNumEvents Step 1
|
||||
ThisEventKey = ReactSchedEvents<0, EventIndex>
|
||||
ThisStartDTM = Xlate('SCHED_DET_NG', ThisEventKey, 'START_DTM', 'X')
|
||||
IF ThisStartDTM GT StartDTM then
|
||||
// We found our location
|
||||
InsertPos = EventIndex
|
||||
end
|
||||
Until InsertPos NE ''
|
||||
Next EventIndex
|
||||
If InsertPos EQ '' then InsertPos = NewNumEvents
|
||||
ReactSchedEvents = Insert(ReactSchedEvents, 0, InsertPos, 0, NewEventKeyID)
|
||||
ReactRec<REACTOR_SCHED_EVENTS$> = ReactSchedEvents
|
||||
Database_Services('WriteDataRow', 'REACTOR', ReactorNo, ReactRec)
|
||||
// Update event
|
||||
NewEventRec<SCHED_DET_NG.EVENT_COMP$> = EventComp
|
||||
NewEventRec<SCHED_DET_NG.PROCESSED_CASS$> = EventProcCassList
|
||||
NewEventRec<SCHED_DET_NG.UNPROCESSED_CASS$> = EventUnprocCassList
|
||||
NewEventRec<SCHED_DET_NG.STOP_DTM$> = StopDtm
|
||||
Database_Services('WriteDataRow', 'SCHED_DET_NG', NewEventKeyID, NewEventRec)
|
||||
|
||||
// Check if there is an overlap with the previous event. If so, then set previous event's stop DTM to this event's
|
||||
// start DTM.
|
||||
If NewNumEvents GT 1 then
|
||||
PrevEventKey = ReactSchedEvents<0, (NewNumEvents - 1)>
|
||||
If PrevEventKey NE '' then
|
||||
PrevEventRec = Database_Services('ReadDataRow', 'SCHED_DET_NG', PrevEventKey)
|
||||
PrevEventStopDTM = PrevEventRec<SCHED_DET_NG.STOP_DTM$>
|
||||
If PrevEventStopDTM GT StartDTM then
|
||||
PrevEventStopDTM = StartDTM
|
||||
PrevEventRec<SCHED_DET_NG.STOP_DTM$> = PrevEventStopDTM
|
||||
Database_Services('WriteDataRow', 'SCHED_DET_NG', PrevEventKey, PrevEventRec, True$, False$, True$)
|
||||
If Error_Services('NoError') then
|
||||
// Determine where to insert the event in the REACTOR record linked list
|
||||
// Add the event to the REACTOR record event list
|
||||
ReactRec = Database_Services('ReadDataRow', 'REACTOR', ReactorNo)
|
||||
ReactSchedEvents = ReactRec<REACTOR_SCHED_EVENTS$>
|
||||
CurrNumEvents = DCount(ReactSchedEvents, @VM)
|
||||
// Add our new event key ID to the reactor event list
|
||||
NewNumEvents = CurrNumEvents + 1
|
||||
InsertPos = ''
|
||||
For EventIndex = 1 to CurrNumEvents Step 1
|
||||
ThisEventKey = ReactSchedEvents<0, EventIndex>
|
||||
ThisStartDTM = Xlate('SCHED_DET_NG', ThisEventKey, 'START_DTM', 'X')
|
||||
IF ThisStartDTM GT StartDTM then
|
||||
// We found our location
|
||||
InsertPos = EventIndex
|
||||
end
|
||||
Until InsertPos NE ''
|
||||
Next EventIndex
|
||||
If InsertPos EQ '' then InsertPos = NewNumEvents
|
||||
ReactSchedEvents = Insert(ReactSchedEvents, 0, InsertPos, 0, NewEventKeyID)
|
||||
ReactRec<REACTOR_SCHED_EVENTS$> = ReactSchedEvents
|
||||
Database_Services('WriteDataRow', 'REACTOR', ReactorNo, ReactRec)
|
||||
|
||||
// Check if there is an overlap with the previous event. If so, then set previous event's stop DTM to this event's
|
||||
// start DTM.
|
||||
If NewNumEvents GT 1 then
|
||||
PrevEventKey = ReactSchedEvents<0, (NewNumEvents - 1)>
|
||||
If PrevEventKey NE '' then
|
||||
PrevEventRec = Database_Services('ReadDataRow', 'SCHED_DET_NG', PrevEventKey)
|
||||
PrevEventStopDTM = PrevEventRec<SCHED_DET_NG.STOP_DTM$>
|
||||
If PrevEventStopDTM GT StartDTM then
|
||||
PrevEventStopDTM = StartDTM
|
||||
PrevEventRec<SCHED_DET_NG.STOP_DTM$> = PrevEventStopDTM
|
||||
Database_Services('WriteDataRow', 'SCHED_DET_NG', PrevEventKey, PrevEventRec, True$, False$, True$)
|
||||
end
|
||||
end
|
||||
end
|
||||
// Record schedule change in SCHED_HIST table
|
||||
Schedule_Services('AddSchedHist', NewEventKeyID, ReactorNo, 'ADD', @User4)
|
||||
Response = NewEventKeyID
|
||||
end
|
||||
// Record schedule change in SCHED_HIST table
|
||||
Schedule_Services('AddSchedHist', NewEventKeyID, ReactorNo, 'ADD', @User4)
|
||||
Response = NewEventKeyID
|
||||
end
|
||||
|
||||
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
|
||||
|
||||
end service
|
||||
|
||||
|
||||
@ -3200,19 +3297,33 @@ Service MarkCassProcessed(WONo, CassNo, ProcessedDTM)
|
||||
CassComp = True$
|
||||
end
|
||||
end else
|
||||
CassComp = True$
|
||||
WOMatKey = WoNo:'*':CassNo
|
||||
CurrWaferCount = obj_WO_Mat('CurrWaferCnt', WOMatKey)
|
||||
RDSNo = Xlate('WO_MAT', WOMatKey, 'RDS_NO', 'X')
|
||||
DateOut = Xlate('RDS', RDSNo, 'DATE_OUT', 'X')
|
||||
CassComp = ( (CurrWaferCount EQ 0) or (DateOut NE '') )
|
||||
end
|
||||
UnprocessedCassettes = SchedDetNGRec<SCHED_DET_NG.UNPROCESSED_CASS$>
|
||||
|
||||
If CassComp then
|
||||
RecChanged = False$
|
||||
UnprocessedCassettes = SchedDetNGRec<SCHED_DET_NG.UNPROCESSED_CASS$>
|
||||
Locate CassNo in UnprocessedCassettes using @VM setting vPos then
|
||||
UnprocessedCassettes = Delete(UnprocessedCassettes, 0, vPos, 0)
|
||||
ProcessedCassettes = SchedDetNGRec<SCHED_DET_NG.PROCESSED_CASS$>
|
||||
ProcessedCassettes<0, -1> = CassNo
|
||||
UnprocessedCassettes = Delete(UnprocessedCassettes, 0, vPos, 0)
|
||||
RecChanged = True$
|
||||
end
|
||||
ProcessedCassettes = SchedDetNGRec<SCHED_DET_NG.PROCESSED_CASS$>
|
||||
Locate CassNo in ProcessedCassettes using @VM setting vPos else
|
||||
ProcessedCassettes<0, -1> = CassNo
|
||||
ProcessedCassettes = SRP_Array('Clean', ProcessedCassettes, 'TrimAndMakeUnique', @VM)
|
||||
ProcessedCassettes = SRP_Array('SortSimpleList', ProcessedCassettes, 'AscendingNumbers', @VM)
|
||||
RecChanged = True$
|
||||
end
|
||||
If RecChanged then
|
||||
SchedDetNGRec<SCHED_DET_NG.UNPROCESSED_CASS$> = UnprocessedCassettes
|
||||
SchedDetNGRec<SCHED_DET_NG.PROCESSED_CASS$> = ProcessedCassettes
|
||||
Database_Services('WriteDataRow', 'SCHED_DET_NG', SchedDetNGKey, SchedDetNGRec, True$, False$, True$)
|
||||
Done = True$
|
||||
end
|
||||
Done = True$
|
||||
end
|
||||
Until Done EQ True$
|
||||
Repeat
|
||||
|
@ -2579,6 +2579,56 @@ Service GetWoLogZpl(WoNo)
|
||||
|
||||
end service
|
||||
|
||||
|
||||
Service GetVoidedWaferCount(WorkOrderNo)
|
||||
|
||||
ErrorMsg = ''
|
||||
VoidedWaferCount = 0
|
||||
If WorkOrderNo NE '' then
|
||||
If RowExists('WO_LOG', WorkOrderNo) then
|
||||
ReactorType = Xlate('WO_LOG', WorkOrderNo, 'PS_REACTOR_TYPE', 'X')
|
||||
If ReactorType EQ 'EPP' then
|
||||
Query = 'SELECT WM_IN WITH WO_NO EQ ':WorkOrderNo:' AND WITH VOID EQ ':True$
|
||||
Rlist(Query, TARGET_ACTIVELIST$, '', '', '')
|
||||
ErrCode = ''
|
||||
If Not(Get_Status(ErrCode)) then
|
||||
EOF = False$
|
||||
Loop
|
||||
Readnext WmInKey else EOF = True$
|
||||
Until EOF
|
||||
VoidedWaferCount += Xlate('WM_IN', WmInKey, 'WFR_CNT', 'X')
|
||||
Repeat
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service: 'service. Error calling RList. Error code: ':ErrCode
|
||||
end
|
||||
end else
|
||||
Query = 'SELECT WO_MAT WITH WO_NO EQ ':WorkOrderNo:' AND WITH VOID EQ ':True$
|
||||
Rlist(Query, TARGET_ACTIVELIST$, '', '', '')
|
||||
ErrCode = ''
|
||||
If Not(Get_Status(ErrCode)) then
|
||||
EOF = False$
|
||||
Loop
|
||||
Readnext WoMatKey else EOF = True$
|
||||
Until EOF
|
||||
VoidedWaferCount += Xlate('WO_MAT', WoMatKey, 'WAFER_QTY', 'X')
|
||||
Repeat
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service: 'service. Error calling RList. Error code: ':ErrCode
|
||||
end
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service: 'service. WO_LOG ':WorkOrderNo:' does not exist.'
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Error in ':Service: 'service. Null WorkOrderNo passed into service.'
|
||||
end
|
||||
|
||||
If ErrorMsg NE '' then Error_Services('Add', ErrorMsg)
|
||||
Response = VoidedWaferCount
|
||||
|
||||
end service
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Internal GoSubs
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
Reference in New Issue
Block a user