From f07e4476a78db83f9051316a3437e754a2c30cc8 Mon Sep 17 00:00:00 2001 From: "Infineon\\StieberD" Date: Wed, 24 Sep 2025 16:00:16 -0700 Subject: [PATCH] updated schedule related services to account for voided cassettes --- LSL2/STPROC/NDW_WO_LOG_EVENTS.txt | 4 +- LSL2/STPROC/SCHEDULE_SERVICES.txt | 375 ++++++++++++++++++---------- LSL2/STPROC/WORK_ORDER_SERVICES.txt | 50 ++++ 3 files changed, 294 insertions(+), 135 deletions(-) diff --git a/LSL2/STPROC/NDW_WO_LOG_EVENTS.txt b/LSL2/STPROC/NDW_WO_LOG_EVENTS.txt index 2aa9eac..c2eb70a 100644 --- a/LSL2/STPROC/NDW_WO_LOG_EVENTS.txt +++ b/LSL2/STPROC/NDW_WO_LOG_EVENTS.txt @@ -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 diff --git a/LSL2/STPROC/SCHEDULE_SERVICES.txt b/LSL2/STPROC/SCHEDULE_SERVICES.txt index 433df1f..e221c6a 100644 --- a/LSL2/STPROC/SCHEDULE_SERVICES.txt +++ b/LSL2/STPROC/SCHEDULE_SERVICES.txt @@ -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' @@ -1245,14 +1246,59 @@ Service AdjustScheduleEvents(ReactNo) LogData<3> = 'Event quantity: ':EventRec Schedule_Services('LogActivity', ReactNo, LogData) LogData<3> = 'Event complete: ':OConv(EventRec, "Btrue,false") + Schedule_Services('LogActivity', ReactNo, LogData) + LogData<3> = 'Event unprocessed cassettes: ':EventRec + Schedule_Services('LogActivity', ReactNo, LogData) + LogData<3> = 'Event processed cassettes: ':EventRec Schedule_Services('LogActivity', ReactNo, LogData) - EventAdjustment = Schedule_Services('GetEventAdjustment', EventKey) UnprocessedCass = EventRec ProcessedCass = EventRec 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 + EventWfrs = EventRec + 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 = UnprocessedCass + EventRec = ProcessedCass + EventRec = 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 + ProcessedCass = EventRec + 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) and EventComp then LogData = '' @@ -1263,9 +1309,7 @@ Service AdjustScheduleEvents(ReactNo) end EventRec = EventComp - WONo = EventRec ReactNo = EventRec - EventWfrs = EventRec 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) @@ -2256,8 +2300,9 @@ end service // Saves the event to the database. //---------------------------------------------------------------------------------------------------------------------- Service AddSchedEvent(ReactorNo, WorkOrderNo, StartDTM, StopDTM, Description, WaferQty) - + // Create a unique key ID for the new event + ErrorMsg = '' NewEventKeyID = RTI_CreateGUID() NewEventRec = '' NewEventRec = ReactorNo @@ -2267,16 +2312,17 @@ Service AddSchedEvent(ReactorNo, WorkOrderNo, StartDTM, StopDTM, Description, Wa NewEventRec = 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)) - If StartCass EQ 0 then StartCass = 1 + 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 + If Not(Voided) then + WMIRdsList = WMIRec + 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 + TimeOut = RDSRec + 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 + 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) 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) - 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 + If Not(Voided) then + RDSKey = WOMatRec + RDSRec = Database_Services('ReadDataRow', 'RDS', RDSKey) + If Error_Services('NoError') then + DateOut = RDSRec + TimeOut = RDSRec + 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 = EventComp - NewEventRec = EventProcCassList - NewEventRec = EventUnprocCassList - NewEventRec = StopDtm - Database_Services('WriteDataRow', 'SCHED_DET_NG', NewEventKeyID, NewEventRec) - - 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 - 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 = ReactSchedEvents - Database_Services('WriteDataRow', 'REACTOR', ReactorNo, ReactRec) + EventComp = (EventUnprocCassList EQ '') + If EventComp then StopDtm = Xlate('RDS', LastUnloadedRDS, 'DATETIME_OUT', 'X') - // 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 - If PrevEventStopDTM GT StartDTM then - PrevEventStopDTM = StartDTM - PrevEventRec = PrevEventStopDTM - Database_Services('WriteDataRow', 'SCHED_DET_NG', PrevEventKey, PrevEventRec, True$, False$, True$) + // Update event + NewEventRec = EventComp + NewEventRec = EventProcCassList + NewEventRec = EventUnprocCassList + NewEventRec = StopDtm + Database_Services('WriteDataRow', 'SCHED_DET_NG', NewEventKeyID, NewEventRec) + + 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 + 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 = 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 + If PrevEventStopDTM GT StartDTM then + PrevEventStopDTM = StartDTM + PrevEventRec = 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 @@ -3152,7 +3249,7 @@ end service Service MarkCassProcessed(WONo, CassNo, ProcessedDTM) - + If ((WONo NE '') and (CassNo NE '') and (ProcessedDTM NE '') ) then If Num(ProcessedDTM) then ProcessedDTM = OConv(ProcessedDTM, 'DT2/^H') // Find the SCHED_DET_NG event record that contains the cassette number @@ -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 + If CassComp then + RecChanged = False$ + UnprocessedCassettes = SchedDetNGRec Locate CassNo in UnprocessedCassettes using @VM setting vPos then - UnprocessedCassettes = Delete(UnprocessedCassettes, 0, vPos, 0) - ProcessedCassettes = SchedDetNGRec - ProcessedCassettes<0, -1> = CassNo + UnprocessedCassettes = Delete(UnprocessedCassettes, 0, vPos, 0) + RecChanged = True$ + end + ProcessedCassettes = SchedDetNGRec + 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 = UnprocessedCassettes SchedDetNGRec = ProcessedCassettes Database_Services('WriteDataRow', 'SCHED_DET_NG', SchedDetNGKey, SchedDetNGRec, True$, False$, True$) - Done = True$ end + Done = True$ end Until Done EQ True$ Repeat diff --git a/LSL2/STPROC/WORK_ORDER_SERVICES.txt b/LSL2/STPROC/WORK_ORDER_SERVICES.txt index 55665bc..48b1324 100644 --- a/LSL2/STPROC/WORK_ORDER_SERVICES.txt +++ b/LSL2/STPROC/WORK_ORDER_SERVICES.txt @@ -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 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////