diff --git a/LSL2/STPROC/RDS_ACTIONS.txt b/LSL2/STPROC/RDS_ACTIONS.txt index c4f3ba3..f1885d5 100644 --- a/LSL2/STPROC/RDS_ACTIONS.txt +++ b/LSL2/STPROC/RDS_ACTIONS.txt @@ -905,11 +905,11 @@ WRITE_RECORD: WMIKeys = {WM_IN_KEY} For each WMIKey in WMIKeys using @VM setting vPos CassNo = Field(WMIKey, '*', 3) - Service_Services('PostProcedure', 'SCHEDULE_SERVICES', 'MarkCassProcessed':SD$:WONo:SD$:CassNo:SD$:DatetimeOut) + Service_Services('PostProcedure', 'SCHEDULE_SERVICES', 'UpdateCassProcStatus':SD$:WONo:SD$:CassNo:SD$:DatetimeOut) Next WMIKey end else CassNo = Record - Service_Services('PostProcedure', 'SCHEDULE_SERVICES', 'MarkCassProcessed':SD$:WONo:SD$:CassNo:SD$:DatetimeOut) + Service_Services('PostProcedure', 'SCHEDULE_SERVICES', 'UpdateCassProcStatus':SD$:WONo:SD$:CassNo:SD$:DatetimeOut) end end diff --git a/LSL2/STPROC/SCHEDULE_SERVICES.txt b/LSL2/STPROC/SCHEDULE_SERVICES.txt index 6f63be4..e39a49f 100644 --- a/LSL2/STPROC/SCHEDULE_SERVICES.txt +++ b/LSL2/STPROC/SCHEDULE_SERVICES.txt @@ -1287,10 +1287,8 @@ Service AdjustScheduleEvents(ReactNo) 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 + // Check each cassette in the event to see if it is now processed or unprocessed (i.e., unload un-signed) + Schedule_Services('UpdateEventCassLists', EventKey) EventRec = Schedule_Services('GetScheduleDetail', EventKey) UnprocessedCass = EventRec @@ -2549,7 +2547,7 @@ end service // Modifies an event's details. //---------------------------------------------------------------------------------------------------------------------- Service ModifySchedEvent(SchedDetNGKey, ReactorNo, WorkOrderNo, StartDTM, StopDTM, Description, WaferQty, AdjustNextEvent=BOOLEAN) - + Response = False$ If SchedDetNGKey NE '' then EventRec = Database_Services('ReadDataRow', 'SCHED_DET_NG', SchedDetNGKey) @@ -3261,87 +3259,155 @@ Service GetAvailableWorkOrders(ReactorType, SusceptorSize, ReactorNo) end service -Service MarkCassProcessed(WONo, CassNo, ProcessedDTM) +Service UpdateCassProcStatus(WONo, CassNo, ProcessedDTM) + ErrorMsg = '' 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 Query = 'SELECT SCHED_DET_NG WITH WO_NO EQ ':WONo:' AND WITH START_DTM LE "':ProcessedDTM:'" ' - Query := 'AND WITH UNPROCESSED_CASS EQ ':CassNo:' BY START_DTM' + Query := 'AND WITH UNPROCESSED_CASS EQ ':CassNo:' OR WITH PROCESSED_CASS EQ ':CassNo:' BY START_DTM' GoSub ClearCursors RList(Query, TARGET_ACTIVELIST$, '', '', '') EOF = False$ Done = False$ Loop Readnext SchedDetNGKey else EOF = True$ - Until EOF = True$ - SchedDetNGRec = Database_Services('ReadDataRow', 'SCHED_DET_NG', SchedDetNGKey) - CassComp = False$ - ReactType = Xlate('WO_LOG', WONo, 'REACT_TYPE', 'X') + Until EOF + Schedule_Services('UpdateEventCassProcStatus', WONo, CassNo, SchedDetNGKey) + If Error_Services('HasError') then ErrorMsg = Error_Services('GetMessage') + Done = True$ + Until Done + Repeat + end else + ErrorMsg = 'Error in ':Service:' service. WONo, CassNo, and ProcessedDTM cannot be null' + end + + If ErrorMsg NE '' then Error_Services('Add', ErrorMsg) + +end service + + +Service UpdateEventCassProcStatus(WONo, CassNo, SchedDetNGKey) + + ErrorMsg = '' + If ( (WONo NE '') and (CassNo NE '') and (SchedDetNGKey NE '') ) then + SchedDetNGRec = Database_Services('ReadDataRow', 'SCHED_DET_NG', SchedDetNGKey) + If Error_Services('NoError') then + RecChanged = False$ + CassComp = False$ + UnprocCassList = SchedDetNGRec + ProcCassList = SchedDetNGRec + AllSchedCass = SRP_Array('Join', UnprocCassList, ProcCassList, 'OR', @VM) + AllSchedCass = SRP_Array('SortSimpleList', AllSchedCass, 'AscendingNumbers', @VM) + ReactType = Xlate('WO_LOG', WONo, 'REACT_TYPE', 'X') If ReactType EQ 'EPP' then - // Since EpiPro splits WM_IN cassettes out into RDS runs, we need to determine if the - // cassette has been emptied out or if enough wafers have been consumed such that - // the wafer count equals the split work order event quantity. - StopDtm = SchedDetNGRec - SchedWfrQty = Schedule_Services('GetScheduledWfrQty', WONo, StopDtm) - // Determine the cassette and slot this event should end on. This will be used to identify - // cassettes that should be marked as complete when the event ends in the middle of the cassette. - // That is, the EpiPro work order events should end on an RDS when they are split around block - // out events. - UnprocCassList = SchedDetNGRec - ProcCassList = SchedDetNGRec - AllSchedCass = SRP_Array('Join', UnprocCassList, ProcCassList, 'OR', @VM) - AllSchedCass = SRP_Array('SortSimpleList', AllSchedCass, 'AscendingNumbers', @VM) - NumSchedCass = DCount(AllSchedCass, @VM) - EndCassNo = AllSchedCass<0, NumSchedCass> - EndSlotNo = Mod(SchedWfrQty, 25) - If EndSlotNo EQ 0 then EndSlotNo = 25 WMIKey = WONo:'*1*':CassNo - WMIRdsList = Xlate('WM_IN', WMIKey, 'RDS_NO', 'X') - UnloadDtms = Xlate('RDS', WMIRdsList, 'DATETIME_OUT', 'X') - NumUnloadedWfrs = 0 - If UnloadDtms NE '' then - For each UnloadDtm in UnloadDtms using @VM - NumUnloadedWfrs += (UnloadDtm NE '') - Next UnloadDtm - end - CassRemWfrs = Xlate('WM_IN', WMIKey, 'REM_WFRS', 'X') - If ( (NumUnloadedWfrs EQ 25) or ( (CassNo EQ EndCassNo) and (NumUnloadedWfrs GE EndSlotNo) ) or (CassRemWfrs EQ 0) ) then - CassComp = True$ + If RowExists('WM_IN', WMIKey) then + // Since EpiPro splits WM_IN cassettes out into RDS runs, we need to determine if the + // cassette has been emptied out or if enough wafers have been consumed such that + // the wafer count equals the split work order event quantity. + StopDtm = SchedDetNGRec + SchedWfrQty = Schedule_Services('GetScheduledWfrQty', WONo, StopDtm) + // Determine the cassette and slot this event should end on. This will be used to identify + // cassettes that should be marked as complete when the event ends in the middle of the cassette. + // That is, the EpiPro work order events should end on an RDS when they are split around block + // out events. + NumSchedCass = DCount(AllSchedCass, @VM) + EndCassNo = AllSchedCass<0, NumSchedCass> + EndSlotNo = Mod(SchedWfrQty, 25) + If EndSlotNo EQ 0 then EndSlotNo = 25 + WMIRdsList = Xlate('WM_IN', WMIKey, 'RDS_NO', 'X') + UnloadDtms = Xlate('RDS', WMIRdsList, 'DATETIME_OUT', 'X') + NumUnloadedWfrs = 0 + If UnloadDtms NE '' then + For each UnloadDtm in UnloadDtms using @VM + NumUnloadedWfrs += (UnloadDtm NE '') + Next UnloadDtm + end + CassRemWfrs = Xlate('WM_IN', WMIKey, 'REM_WFRS', 'X') + If ( (NumUnloadedWfrs EQ 25) or ( (CassNo EQ EndCassNo) and (NumUnloadedWfrs GE EndSlotNo) ) or (CassRemWfrs EQ 0) ) then + CassComp = True$ + end end end else 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 '') ) + If RowExists('WO_MAT', WOMatKey) then + 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 end If CassComp then - RecChanged = False$ - UnprocessedCassettes = SchedDetNGRec - Locate CassNo in UnprocessedCassettes using @VM setting vPos then - UnprocessedCassettes = Delete(UnprocessedCassettes, 0, vPos, 0) - RecChanged = True$ + Locate CassNo in UnprocCassList using @VM setting vPos then + UnprocCassList = Delete(UnprocCassList, 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$ + Locate CassNo in ProcCassList using @VM setting vPos else + ProcCassList<0, -1> = CassNo + ProcCassList = SRP_Array('Clean', ProcCassList, 'TrimAndMakeUnique', @VM) + ProcCassList = SRP_Array('SortSimpleList', ProcCassList, 'AscendingNumbers', @VM) + RecChanged = True$ end - If RecChanged then - SchedDetNGRec = UnprocessedCassettes - SchedDetNGRec = ProcessedCassettes - Database_Services('WriteDataRow', 'SCHED_DET_NG', SchedDetNGKey, SchedDetNGRec, True$, False$, True$) + end else + Locate CassNo in ProcCassList using @VM setting vPos then + ProcCassList = Delete(ProcCassList, 0, vPos, 0) + RecChanged = True$ + end + Locate CassNo in UnprocCassList using @VM setting vPos else + UnprocCassList<0, -1> = CassNo + UnprocCassList = SRP_Array('Clean', UnprocCassList, 'TrimAndMakeUnique', @VM) + UnprocCassList = SRP_Array('SortSimpleList', UnprocCassList, 'AscendingNumbers', @VM) + RecChanged = True$ end - Done = True$ end - Until Done EQ True$ - Repeat + end else + ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage') + end + If RecChanged then + SchedDetNGRec = UnprocCassList + SchedDetNGRec = ProcCassList + Database_Services('WriteDataRow', 'SCHED_DET_NG', SchedDetNGKey, SchedDetNGRec, True$, False$, True$) + If Error_Services('HasError') then ErrorMsg = Error_Services('GetMessage') + end end + If ErrorMsg NE '' then Error_Services('Add', ErrorMsg) + +end service + + +Service UpdateEventCassLists(SchedDetNGKey) + + ErrorMsg = '' + If (SchedDetNGKey NE '') then + If RowExists('SCHED_DET_NG', SchedDetNGKey) then + SchedDetNGRec = Database_Services('ReadDataRow', 'SCHED_DET_NG', SchedDetNGKey) + If Error_Services('NoError') then + UnprocCassList = SchedDetNGRec + ProcCassList = SchedDetNGRec + AllSchedCass = SRP_Array('Join', UnprocCassList, ProcCassList, 'OR', @VM) + AllSchedCass = SRP_Array('SortSimpleList', AllSchedCass, 'AscendingNumbers', @VM) + WONo = SchedDetNGRec + For each CassNo in AllSchedCass using @VM + Schedule_Services('UpdateEventCassProcStatus', WONo, CassNo, SchedDetNGKey) + If Error_Services('HasError') then ErrorMsg = Error_Services('GetMessage') + Until (ErrorMsg NE '') + Next CassNo + end else + ErrorMsg = 'Error in ':Service:' service. Error message: ':Error_Services('GetMessage') + end + end else + ErrorMsg = 'Error in ':Service:' service. SCHED_DET_NG ':SchedDetNGKey:' does not exist.' + end + end else + ErrorMsg = 'Error in ':Service:' service. SchedDetNGKey cannot be null.' + end + + If ErrorMsg NE '' then Error_Services('Add', ErrorMsg) + end service diff --git a/LSL2/STPROC/WM_IN_ACTIONS.txt b/LSL2/STPROC/WM_IN_ACTIONS.txt index 0e94837..2d5e7fc 100644 --- a/LSL2/STPROC/WM_IN_ACTIONS.txt +++ b/LSL2/STPROC/WM_IN_ACTIONS.txt @@ -165,7 +165,7 @@ WRITE_RECORD: CassNo = Field(Name, '*', 3) ProcessedDTM = Datetime() // This service will determine if the cassette needs to be marked as complete. - Service_Services('PostProcedure', 'SCHEDULE_SERVICES', 'MarkCassProcessed':SD$:WONo:SD$:CassNo:SD$:ProcessedDtm) + Service_Services('PostProcedure', 'SCHEDULE_SERVICES', 'UpdateCassProcStatus':SD$:WONo:SD$:CassNo:SD$:ProcessedDtm) WfrCount = DCount(Record, @VM) If WfrCount LT 25 then diff --git a/LSL2/STPROC/WO_DAILY_SCHED_ALL_COMM.txt b/LSL2/STPROC/WO_DAILY_SCHED_ALL_COMM.txt index 0686ff9..9642610 100644 --- a/LSL2/STPROC/WO_DAILY_SCHED_ALL_COMM.txt +++ b/LSL2/STPROC/WO_DAILY_SCHED_ALL_COMM.txt @@ -215,15 +215,20 @@ FORM_CREATE: END DailySchedName = 'WO_DAILY_SCHED':I - DSR = XLATE( 'CONFIG', DailySchedName, '', 'X' ) - WOCust = DSR - WO = FIELD( WOCust, ' ', 1 ) - Cust = FIELD( WOCust, ' ', 2, 999 ) + DSR = XLATE( 'CONFIG', DailySchedName, '', 'X' ) + WOCust = DSR + WO = FIELD( WOCust, ' ', 1 ) + Cust = FIELD( WOCust, ' ', 2, 999 ) Size = Xlate('REACTOR', I, REACTOR_SUSC_POCKET_SIZE$, 'X') - Size = Field(Size, ' ' , 3, 2) - - CONVERT ' ' TO '' IN Size + Begin Case + Case Index(Size, '6', 1) + Size = '6in' + Case Index(Size, '8', 1) + Size = '8in' + Case Otherwise$ + Size = '' + End Case WONo = WO[1,'.'] @@ -325,4 +330,3 @@ REACT_DETAIL: return *===============================================================================================* - diff --git a/LSL2/STPROC/WO_MAT_ACTIONS.txt b/LSL2/STPROC/WO_MAT_ACTIONS.txt index e52d2da..7fdd168 100644 --- a/LSL2/STPROC/WO_MAT_ACTIONS.txt +++ b/LSL2/STPROC/WO_MAT_ACTIONS.txt @@ -269,45 +269,45 @@ return WRITE_RECORD_PRE: WOMatKeyID = Name - - CriticalFields = WO_MAT_RDS_NO$:@VM:WO_MAT_LOT_NO$:@VM:WO_MAT_WAFER_QTY$:@VM:WO_MAT_CUST_PART_NO$:@VM - CriticalFields := WO_MAT_SUB_PART_NO$:@VM:WO_MAT_INV_ACTION$:@VM:WO_MAT_SLOT_NO$:@VM:WO_MAT_RX_DTM$:@VM - CriticalFields := WO_MAT_RX_BY$:@VM:WO_MAT_REL_DTM$:@VM:WO_MAT_REL_BY$:@VM:WO_MAT_SUB_VEND_CD$:@VM - CriticalFields := WO_MAT_CASS_SHIP_QTY$:@VM:WO_MAT_SHIP_SHORT$:@VM:WO_MAT_MU_WAFER_FLAG$ - - For each CriticalField in CriticalFields using @VM setting vPos - - If ( (OrigRecord NE '') and (Record EQ '') ) then - WOMatFieldNos = Xlate('DICT.WO_MAT', '%FIELDS%', DICT_PART$, 'X') - WOMatFieldNames = Xlate('DICT.WO_MAT', '%FIELDS%', DICT_DISPLAY$, 'X') - Locate CriticalField in WOMatFieldNos using @VM setting FieldNo then - CriticalFieldName = WOMatFieldNames<0, FieldNo> - end else - CriticalFieldName = 'Error determining field name' - end - - Recipients = '' - SentFrom = 'SYSTEM' - Subject = 'WO_MAT_ACTIONS - Critical Field Erased' - Message = OConv(Datetime(), 'DT2/^H') - Message<2> = 'Computer: ':@Station - Message<3> = 'User: ':@User4 - Message<4> = 'WO_MAT key: ':Name - NoteMessage = 'Readonly field ':CriticalField:' (':CriticalFieldName:') erased. Value erased ':Quote(OrigRecord) - Message<5> = NoteMessage - Message<6> = 'Call Stack:':CRLF$:RetStack() - Swap @FM with \0D0A\ in Message - Swap @VM with ',' in Message - AttachWindow = 'WO_MAT' - AttachKey = Name - SendToGroup = 'OI_SYSADMIN' - Parms = Recipients:@RM:SentFrom:@RM:Subject:@RM:Message:@RM:AttachWindow:@RM:AttachKey:@RM:SendToGroup - obj_Notes('Create',Parms) - end + Void = Record + If (Void NE True$) then + CriticalFields = WO_MAT_RDS_NO$:@VM:WO_MAT_LOT_NO$:@VM:WO_MAT_WAFER_QTY$:@VM:WO_MAT_CUST_PART_NO$:@VM + CriticalFields := WO_MAT_SUB_PART_NO$:@VM:WO_MAT_INV_ACTION$:@VM:WO_MAT_SLOT_NO$:@VM:WO_MAT_RX_DTM$:@VM + CriticalFields := WO_MAT_RX_BY$:@VM:WO_MAT_REL_DTM$:@VM:WO_MAT_REL_BY$:@VM:WO_MAT_SUB_VEND_CD$:@VM + CriticalFields := WO_MAT_CASS_SHIP_QTY$:@VM:WO_MAT_SHIP_SHORT$:@VM:WO_MAT_MU_WAFER_FLAG$ + + For each CriticalField in CriticalFields using @VM setting vPos + + If ( (OrigRecord NE '') and (Record EQ '') ) then + WOMatFieldNos = Xlate('DICT.WO_MAT', '%FIELDS%', DICT_PART$, 'X') + WOMatFieldNames = Xlate('DICT.WO_MAT', '%FIELDS%', DICT_DISPLAY$, 'X') + Locate CriticalField in WOMatFieldNos using @VM setting FieldNo then + CriticalFieldName = WOMatFieldNames<0, FieldNo> + end else + CriticalFieldName = 'Error determining field name' + end + + Recipients = '' + SentFrom = 'SYSTEM' + Subject = 'WO_MAT_ACTIONS - Critical Field Erased' + Message = OConv(Datetime(), 'DT2/^H') + Message<2> = 'Computer: ':@Station + Message<3> = 'User: ':@User4 + Message<4> = 'WO_MAT key: ':Name + NoteMessage = 'Readonly field ':CriticalField:' (':CriticalFieldName:') erased. Value erased ':Quote(OrigRecord) + Message<5> = NoteMessage + Message<6> = 'Call Stack:':CRLF$:RetStack() + Swap @FM with \0D0A\ in Message + Swap @VM with ',' in Message + AttachWindow = 'WO_MAT' + AttachKey = Name + SendToGroup = 'OI_SYSADMIN' + Parms = Recipients:@RM:SentFrom:@RM:Subject:@RM:Message:@RM:AttachWindow:@RM:AttachKey:@RM:SendToGroup + obj_Notes('Create',Parms) + end - Next CriticalField - - SaveRecord = Record + Next CriticalField + end WaferQty = Record If ( (WaferQty LT 0) or (WaferQty GT 25) ) then @@ -878,7 +878,7 @@ WRITE_RECORD: CurrWaferCount = obj_WO_Mat('CurrWaferCnt', WOMatKeyID) If CurrWaferCount EQ 0 then // This should catch cases where the entire cassette is "peeled off", NCR'ed, or used for destructive testing. - Service_Services('PostProcedure', 'SCHEDULE_SERVICES', 'MarkCassProcessed':SD$:WONo:SD$:CassNo:SD$:Datetime()) + Service_Services('PostProcedure', 'SCHEDULE_SERVICES', 'UpdateCassProcStatus':SD$:WONo:SD$:CassNo:SD$:Datetime()) end return