COMPILE FUNCTION obj_RDS2(Method,Parms) #pragma precomp SRP_PreCompiler /* Methods for RDS table ;Original object (obj_RDS) is full with methods for original data structures 05/12/2005 JCH - Initial Coding Properties: Methods: Find() ;* Lookup RDS record Delete(RdsNos) ;* Delete RDS records (@VM'd list of keys) LockSet(RdsNos) ;* Returns TableVar if all records were locked UnlockSet(RdsNos,TableVar) ;* Uses TableVar returned from LockSet call ChangeWOStepProps(RSNos,CommitDts,HotLots,MUBoxes) ;* Changes RDS stuff 'en-mass' from WOStep window AdjStepWafersIn( GetMetKeys( MetConversion( LoadEpi( ReloadEpi( RemovePocketNCR( */ DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, NextKey, obj_Prod_Spec, Dialog_Box, obj_RDS_Test DECLARE FUNCTION obj_React_Status, Logging_Services, Environment_Services, Database_Services, Error_Services DECLARE FUNCTION Material_Services, SRP_Array DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, obj_WO_Step, obj_RDS_Layer, obj_RDS_Test, obj_React_Status, obj_WO_Wfr DECLARE SUBROUTINE RDS_React_Run, obj_WM_Out, obj_WM_In, ErrMsg, Send_Info, obj_Clean_Insp, Database_Services DECLARE SUBROUTINE Logging_Services $INSERT MSG_EQUATES $INSERT WO_VERIFY_EQU $INSERT WO_LOG_EQU $INSERT RDS_EQUATES $INSERT RDS_MAKEUP_EQU $INSERT RDS_LAYER_EQUATES $INSERT RDS_TEST_EQUATES $INSERT RDS_LAYER_INFO_EQU $INSERT QUOTE_SPEC_EQU $INSERT PROD_SPEC_EQUATES $INSERT SCHEDULE_EQU $INSERT WO_STEP_EQU $INSERT REACT_RUN_EQUATES $INSERT DICT_EQUATES $INSERT LOGICAL $INSERT PRS_LAYER_EQU ;* Used to return obj_Prod_Spec values EQU SHEETRHO_SPEC_UNITS$ TO 'ê/Ü' EQU RES_SPEC_UNITS$ TO \EA2D636D\ * Equates used with LoadEpi and UnloadEpi (EpiPRO wafers) EQU COL$POCKET TO 1 EQU COL$USAGE TO 2 EQU COL$ZONE TO 3 EQU COL$IN_CASS TO 4 EQU COL$IN_SLOT TO 5 EQU COL$WAFER_TYPE TO 6 EQU COL$OUT_CASS TO 7 EQU COL$OUT_SLOT TO 8 EQU COL$OUT_NCR TO 9 equ RDS_TW_PPLUS$ to 102 equ RDS_TW_PMINUS$ to 103 equ RDS_TW_NPLUS$ to 104 equ RDS_TW_NMINUS$ to 105 equ RDS_TW_PPLUS_CODE$ to 106 equ RDS_TW_PMINUS_CODE$ to 107 equ RDS_TW_NPLUS_CODE$ to 108 equ RDS_TW_NMINUS_CODE$ to 109 equ RDS_TW_PPLUS_CNT$ to 110 equ RDS_TW_PMINUS_CNT$ to 111 equ RDS_TW_NPLUS_CNT$ to 112 equ RDS_TW_NMINUS_CNT$ to 113 equ RDS_TW_PROD_CODE$ to 164 equ RDS_TW_PROD_CNT$ to 165 equ RDS_TW_PPLUS_TOOL$ to 166 equ RDS_TW_PMINUS_TOOL$ to 167 equ RDS_TW_NPLUS_TOOL$ to 168 equ RDS_TW_NMINUS_TOOL$ to 169 equ RDS_TW_PROD_TOOL$ to 170 equ RDS_TW_PPLUS_THICK$ to 171 equ RDS_TW_PMINUS_THICK$ to 172 equ RDS_TW_NPLUS_THICK$ to 173 equ RDS_TW_NMINUS_THICK$ to 174 equ RDS_TW_PROD_THICK$ to 175 equ RDS_TW_PPLUS_RES$ to 176 equ RDS_TW_PMINUS_RES$ to 177 equ RDS_TW_NPLUS_RES$ to 178 equ RDS_TW_NMINUS_RES$ to 179 equ RDS_TW_PROD_RES$ to 180 equ RDS_TW_PPLUS_CON$ to 181 equ RDS_TW_PMINUS_CON$ to 182 equ RDS_TW_NPLUS_CON$ to 183 equ RDS_TW_NMINUS_CON$ to 184 equ RDS_TW_PROD_CON$ to 185 equ RDS_TW_PPLUS_STRESS$ to 186 equ RDS_TW_PMINUS_STRESS$ to 187 equ RDS_TW_NPLUS_STRESS$ to 188 equ RDS_TW_NMINUS_STRESS$ to 189 equ RDS_TW_RECLAIM$ to 240 equ RDS_TW_RECLAIM_CODE$ to 241 equ RDS_TW_RECLAIM_CNT$ to 242 equ RDS_TW_RECLAIM_CON$ to 243 equ RDS_TW_RECLAIM_RES$ to 244 equ RDS_TW_RECLAIM_RHO$ to 245 equ RDS_TW_RECLAIM_STRESS$ to 246 equ RDS_TW_RECLAIM_THICK$ TO 247 equ RDS_TW_RECLAIM_TOOL$ to 248 equ RDS_TW_RECLAIM_TRANS$ to 249 LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\EpiPro' LogDate = Oconv(Date(), 'D4/') LogTime = Oconv(Time(), 'MTS') LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' Unload Log.csv' Headers = 'Logging DTM' : @FM : 'RDS Key ID' : @FM : 'Error' objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$) LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM ErrTitle = 'Error in Stored Procedure "obj_RDS2"' ErrorMsg = '' ErrCode = '' IF NOT(ASSIGNED(Method)) THEN ErrorMsg = 'Unassigned parameter "Method" passed to subroutine' IF NOT(ASSIGNED(Parms)) THEN Parms = '' IF ErrorMsg NE '' THEN Set_Status(-1,ErrTitle:@SVM:ErrorMsg) RETURN '' END Result = '' BEGIN CASE CASE Method = 'Find' ; GOSUB Find CASE Method = 'Delete' ; GOSUB Delete CASE Method = 'LockSet' ; GOSUB LockSet CASE Method = 'UnlockSet' ; GOSUB UnlockSet CASE Method = 'ChangeWOStepProps' ; GOSUB ChangeWOStepProps CASE Method = 'AdjStepWafersIn' ; GOSUB AdjStepWafersIn CASE Method = 'GetMetKeys' ; GOSUB GetMetKeys CASE Method = 'MetConversion' ; GOSUB MetConversion CASE Method = 'UnloadEpi' ; GOSUB UnloadEpi CASE Method = 'ReloadEpi' ; GOSUB ReloadEpi CASE Method = 'ClearEpiUnload' ; GOSUB ClearEpiUnload CASE Method = 'LoadMat' ; GOSUB LoadMat CASE Method = 'ReturnMat' ; GOSUB ReturnMat CASE Method = 'RemovePocketNCR' ; GOSUB RemovePocketNCR CASE Method = 'SetPartNo' ; GOSUB SetPartNo CASE Method = 'FieldsUsed' ; GOSUB FieldsUsed CASE 1 END CASE IF ErrorMsg NE '' THEN Set_Status(-1,ErrTitle:@SVM:ErrorMsg) END RETURN Result * * * * * * * FieldsUsed: * * * * * * * RDSNo = Parms[1,@RM] RDSRec = Parms[COL2()+1,@RM] Fields = XLATE('DICT.RDS','%FIELDS%','','X') KList = 2:@VM:3:@VM:4:@VM:6:@VM:8:@VM:9:@VM:10:@VM:12:@VM:14:@VM:34:@VM:31:@VM:35:@VM:36:@VM:37:@VM:38:@VM:39:@VM:40 Ans = '' FOR I = 1 TO 278 IF RDSRec NE '' THEN LOCATE I IN KList USING @VM SETTING Dummy ELSE LOCATE I IN Fields USING @VM SETTING Pos THEN Ans<1,-1> = I:' ':Fields END END END ;* End of check for field null NEXT I Result = Ans RETURN * * * * * * * Find: * * * * * * * RDSKeys = Dialog_Box('DIALOG_RDS_QUERY',@WINDOW,'') Result = RDSKeys RETURN * * * * * * * Delete: * * * * * * * RdsNos = Parms[1,@RM] TableVar = Parms[COL2()+1,@RM] IF RdsNos = '' THEN RETURN IF TableVar = '' THEN * This section of code should be removed after all calls to obj_RDS('Delete'....) have been checked Set_Status(0) RTParms = 'RDS' LockedRDSNos = '' FOR I = 1 TO COUNT(RdsNos,@VM) + (RdsNos NE '') RdsNo = RdsNos<1,I> RTParms = FieldStore(RTParms, @RM, 2, 1, RdsNo) obj_Tables('LockRec',RTParms) IF Get_Status(errCode) THEN FOR N = 1 TO COUNT(LockedRDSNos,@VM) + (LockedRDSNos NE '') RTParms = FieldStore(RTParms, @RM, 2, 1, LockedRDSNos<1,N>) obj_Tables('UnlockRec',RTParms) ;* Unlock everything locked up to here NEXT N ErrorMsg = 'Unable to lock RDS ':QUOTE(RdsNo):' for delete.' RETURN END ELSE LockedRDSNos<1,I> = RdsNo END NEXT I TableVar = FIELD(RTParms,@RM,3,1) END FOR I = 1 TO COUNT(RdsNos,@VM) + (RdsNos NE '') RdsNo = RdsNos<1,I> RDSRec = XLATE('RDS',RdsNo,'','X') LSKeys = RDSRec NCRKeys = RDSRec SurfScanKeys = RDSRec CIKeys = XLATE('REACT_RUN',RdsNo,REACT_RUN_CI_NO$,'X') MetKeys = XLATE('RDS_LAYER',LSKeys,RDS_LAYER_RDS_TEST_KEYS$,'X') RTParms = 'RDS':@RM:RdsNo:@RM:TableVar:@RM obj_Tables('UnlockRec',RTParms) IF NCRKeys NE '' THEN OPEN 'NCR' TO NCRFile THEN NCRCnt = COUNT(NCRKeys,@VM) FOR NCR = 1 TO NCRCnt DELETE NCRFile,NCRKeys<1,NCR> NEXT NCR END END ;* End of NCR section IF SurfScanKeys NE '' THEN OPEN 'SURFACE_SCAN' TO SurfScanTable THEN ScanCnt = COUNT(SurfScanKeys,@VM) + (SurfScanKeys NE '') FOR Scan = 1 TO ScanCnt DELETE SurfScanTable,SurfScanKeys<1,Scan> NEXT Scan END ;* End of SURFACE_SCAN open END ;* End of SurfScan sectioin obj_RDS_Test('Delete',MetKeys) obj_RDS_Layer('Delete',LSKeys) obj_Clean_Insp('Delete',CIKeys) obj_Tables('DeleteRec','RDS':RTParms) ;* Deletes and removes the lock NEXT I RETURN * * * * * * * LockSet: * * * * * * * RdsNos = Parms[1,@RM] IF RdsNos = '' THEN RETURN Set_Status(0) RTParms = 'RDS' LockedRDSNos = '' FOR I = 1 TO COUNT(RdsNos,@VM) + (RdsNos NE '') RdsNo = RdsNos<1,I> RTParms = FieldStore(RTParms, @RM, 2, 1, RdsNo) obj_Tables('LockRec',RTParms) IF Get_Status(errCode) THEN FOR N = 1 TO COUNT(LockedRDSNos,@VM) + (LockedRDSNos NE '') RTParms = FieldStore(RTParms, @RM, 2, 1, LockedRDSNos<1,N>) obj_Tables('UnlockRec',RTParms) ;* Unlock everything locked up to here NEXT N ErrorMsg = 'Unable to lock RDS ':QUOTE(RdsNo):'.' RETURN END ELSE LockedRDSNos<1,I> = RdsNo END NEXT I TableVar = FIELD(RTParms,@RM,3,1) Result = TableVar RETURN * * * * * * * UnlockSet: * * * * * * * RdsNos = Parms[1,@RM] TableVar = Parms[COL2()+1,@RM] IF RdsNos = '' THEN RETURN IF TableVar = '' THEN RETURN Set_Status(0) RTParms = 'RDS':@RM:@RM:TableVar LockedRDSNos = '' FOR I = 1 TO COUNT(RdsNos,@VM) + (RdsNos NE '') RdsNo = RdsNos<1,I> RTParms = FieldStore(RTParms, @RM, 2, 1, RdsNo) obj_Tables('UnlockRec',RTParms) NEXT I RETURN * * * * * * * ChangeWOStepProps: * * * * * * * RDSNos = Parms[1,@RM] CommitDts = Parms[COL2()+1,@RM] HotLots = Parms[COL2()+1,@RM] MUBoxes = Parms[COL2()+1,@RM] IF NOT(ASSIGNED(RDSNos)) THEN ErrorMsg = 'Unassigned Parm "RDSNos" passed to routine. (':Method:')' IF NOT(ASSIGNED(CommitDts)) THEN CommitDts = '' IF NOT(ASSIGNED(HotLots)) THEN HotLots = '' IF NOT(ASSIGNED(MUBoxes)) THEN MUBoxes = '' IF ErrorMsg NE '' THEN RETURN IF RDSNos = '' THEN RETURN Set_Status(0) RTParms = 'RDS' LockedRDSNos = '' FOR I = 1 TO COUNT(RdsNos,@VM) + (RdsNos NE '') RdsNo = RdsNos<1,I> RTParms = FieldStore(RTParms, @RM, 2, 1, RdsNo) obj_Tables('LockRec',RTParms) IF Get_Status(errCode) THEN FOR N = 1 TO COUNT(LockedRDSNos,@VM) + (LockedRDSNos NE '') RTParms = FieldStore(RTParms, @RM, 2, 1, LockedRDSNos<1,N>) obj_Tables('UnlockRec',RTParms) ;* Unlock everything locked up to here NEXT N ErrorMsg = 'Unable to lock RDS ':QUOTE(RdsNo):' for update.' RETURN END ELSE LockedRDSNos<1,I> = RdsNo END NEXT I CommitDts = ICONV(CommitDts,'D') ;* Move to internal format HotLots = ICONV(HotLots,'B') MUBoxes = ICONV(MUBoxes,'B') RDSTableVar = FIELD(RTParms,@RM,3) FOR I = 1 TO COUNT(LockedRDSNos,@VM) + (LockedRDSNos NE '') LockedRDSNo = LockedRDSNos<1,I> READ RDSRec FROM RDSTableVar,LockedRDSNo THEN CommitDt = CommitDts<1,I> HotLot = HotLots<1,I> MUBox = MUBoxes<1,I> IF CommitDt NE RDSRec THEN RDSRec = CommitDt *IF HotLot NE RDSRec THEN RDSRec = HotLot ;* No longer used *IF MUBox NE RDSRec THEN RDSRec = MUBox ;* No longer used RTParms = FieldStore(RTParms, @RM, 2, 1, LockedRDSNo) RTParms = FieldStore(RTParms, @RM, 4, 1, RDSRec) obj_Tables('WriteRec',RTParms) ;* Write and unlock RDS records END NEXT I RETURN * * * * * * * AdjStepWafersIn: * * * * * * * RETURN * Dead as of 11/5/2008 JCH StepCompRdsNos = Parms[1,@RM] AdjRdsNos = Parms[COL2()+1,@RM] IF StepCompRdsNos = '' THEN ErrorMsg = 'Null parameter "StepCompRdsNos" passed to routine. (':Method:')' IF AdjRdsNos = '' THEN ErrorMsg = 'Null parameter "AdjRdsNos" passed to routine. (':Method:')' IF ErrorMsg NE '' THEN RETURN Set_Status(0) RTParms = 'RDS' LockedRDSNos = '' FOR I = 1 TO COUNT(AdjRdsNos,@VM) + (AdjRdsNos NE '') AdjRdsNo = AdjRdsNos<1,I> RTParms = FieldStore(RTParms, @RM, 2, 1, AdjRdsNo) obj_Tables('LockRec',RTParms) IF Get_Status(errCode) THEN FOR N = 1 TO COUNT(LockedRDSNos,@VM) + (LockedRDSNos NE '') RTParms = FieldStore(RTParms, @RM, 2, 1, LockedRDSNos<1,N>) obj_Tables('UnlockRec',RTParms) ;* Unlock everything locked up to here NEXT N ErrorMsg = 'Unable to lock RDS ':QUOTE(AdjRdsNo):' for update.' RETURN END ELSE LockedRDSNos<1,I> = AdjRdsNo END NEXT I RDSTableVar = FIELD(RTParms,@RM,3) FOR I = 1 TO COUNT(LockedRDSNos,@VM) + (LockedRDSNos NE '') LockedRDSNo = LockedRDSNos<1,I> READ RDSRec FROM RDSTableVar,LockedRDSNo THEN SCRdsNo = StepCompRdsNos<1,I> SCWafersOut = XLATE('RDS',SCRdsNo,'WFRS_OUT','X') ;* Wafers out from previous step RDSRec = SCWafersOut RTParms = FieldStore(RTParms, @RM, 2, 1, LockedRDSNo) RTParms = FieldStore(RTParms, @RM, 4, 1, RDSRec) obj_Tables('WriteRec',RTParms) ;* Write and unlock RDS records END ELSE status = Set_FSError() FOR N = 1 TO COUNT(LockedRDSNos,@VM) + (LockedRDSNos NE '') RTParms = FieldStore(RTParms, @RM, 2, 1, LockedRDSNos<1,N>) obj_Tables('UnlockRec',RTParms) ;* Unlock everything locked up to here NEXT N END NEXT I RETURN * * * * * * * GetMetKeys: * * * * * * * * Returns data structure of 'LSID*ZONE' - @VM in first column associated RDS_TEST numbers in 2nd Column. RdsNo = Parms[1,@RM] IF RdsNo = '' THEN RETURN SortedLSKeys = XLATE('RDS',RdsNo,'RDS_LS_SORTED','X') CONVERT @VM TO @FM IN SortedLSKeys IF SortedLSKeys NE '' THEN LSMetKeys = XLATE('RDS_LAYER',SortedLSKeys,RDS_LAYER_RDS_TEST_KEYS$,'X') RDSMetZones = XLATE('RDS_TEST',LSMetKeys,RDS_TEST_ZONE$,'X') ResultLine = 0 FOR I = 1 TO COUNT(SortedLSKeys,@FM) + (SortedLSKeys NE '') SortedLSKey = SortedLSKeys LSMetKey = LSMetKeys FOR N = 1 TO COUNT(LSMetKey,@VM) + (LSMetKey NE '') ResultLine += 1 Result<1,ResultLine> = FIELD(SortedLSKey,'*',2):'*':RDSMetZones Result<2,ResultLine> = LSMetKeys NEXT N NEXT I END RETURN * * * * * * * UnloadEpi: * * * * * * * RdsNo = Parms[1,@RM] ReactorList = Parms[COL2()+1,@RM] AvailSlotKeys = Parms[COL2()+1,@RM] IF RdsNo = '' THEN ErrorMsg = 'Null parameter "RdsNo" passeed to routine.' IF ReactorList = '' THEN ErrorMsg = 'Null parameter "ReactorList" passeed to routine.' IF AvailSlotKeys = '' THEN ErrorMsg = 'Null parameter "AvailSlotKeys" passeed to routine.' IF ErrorMsg NE '' THEN RETURN Send_Info('Reading RDS ':RdsNo:'...') Set_Status(0) RTParms = 'RDS':@RM:RdsNo * RDSRec = obj_Tables('ReadRec',RTParms) RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo) IF Get_Status(errCode) THEN ErrorMsg = 'Unable to read RDS ':QUOTE(RdsNo):' for UnloadEpi update.' RETURN END Reactor = RDSRec RLCnt = COUNT(ReactorList,@FM) + (ReactorList NE '') LoadFailed = 0 LoadCnt = 0 OutCassettes = '' CassIDs = '' OutSlotNos = '' RDSNos = '' PocketNos = '' Zones = '' InCassNos = '' InSlotNos = '' Send_Info('Building WM_OUT Load Data ...') FOR I = 1 TO RLCnt IF ReactorList = 'PROD' AND ReactorList = '' AND ReactorList = '' THEN AvailSlotKey = AvailSlotKeys[1,@VM] AvailSlotKeys[1,COL2()] = '' WONo = AvailSlotKey[1,'*'] WOStep = AvailSlotKey[COL2()+1,'*'] OutCassNo = AvailSlotKey[COL2()+1,'*'] OutSlotNo = AvailSlotKey[COL2()+1,'*'] PocketNo = ReactorList Zone = ReactorList InCass = ReactorList InSlot = ReactorList LOCATE OutCassNo IN OutCassettes USING @VM SETTING Pos ELSE OutCassettes = INSERT(OutCassettes,1,Pos,0,OutCassNo) END CassID = WONo:'*':WOStep:'*':OutCassNo LOCATE CassID IN CassIDs USING @FM SETTING Pos THEN OutSlotNos = INSERT(OutSlotNos,Pos,-1,0,OutSlotNo) RDSNos = INSERT(RDSNos,Pos,-1,0,RDSNo) PocketNos = INSERT(PocketNos,Pos,-1,0,PocketNo) Zones = INSERT(Zones,Pos,-1,0,Zone) InCassNos = INSERT(InCassNos,Pos,-1,0,InCass) InSlotNos = INSERT(InSlotNos,Pos,-1,0,InSlot) END ELSE CassIDs = INSERT(CassIDs,Pos,0,0,CassID) OutSlotNos = INSERT(OutSlotNos,Pos,-1,0,OutSlotNo) RDSNos = INSERT(RDSNos,Pos,-1,0,RDSNo) PocketNos = INSERT(PocketNos,Pos,-1,0,PocketNo) Zones = INSERT(Zones,Pos,-1,0,Zone) InCassNos = INSERT(InCassNos,Pos,-1,0,InCass) InSlotNos = INSERT(InSlotNos,Pos,-1,0,InSlot) END RDSRec = OutCassNo RDSRec = OutSlotNo IF RDSRec = 'PROD' THEN LoadCnt += 1 END UNTIL LoadFailed NEXT I * RDSRec = @USER4 * RDSRec = Date() * RDSRec = Time() UnloadDTM = OCONV(RDSRec, 'D4/' ):' ':OCONV( RDSRec, 'MTH' ) RemCassIDs = '' RemOutSlotNos = '' UnloadFailed = 0 CassCnt = COUNT(CassIDs,@FM) + (CassIDs NE '') Def = "" Def = "Unloading material... Please, do not interupt this process. This may take a while!" Def = "G" Def = CassCnt Def = 600 MsgUp = Msg(@WINDOW, Def) ;* Start gas guage message FOR N = 1 TO CassCnt CassID = CassIDs Send_Info('Adding Wafers to WM_OUT ':CassID:'...') WONo = CassID[1,'*'] WOStep = CassID[COL2()+1,'*'] OutCass = CassID[COL2()+1,'*'] owParms = WONo:@RM owParms := WOStep:@RM owParms := OutCass:@RM owParms := OutSlotNos:@RM owParms := RDSNos:@RM owParms := PocketNos:@RM owParms := Zones:@RM owParms := InCassNos:@RM owParms := InSlotNos Set_Status(0) obj_WM_Out('AddWafer',owParms) ErrorMessage = '' If Error_Services('HasError') then ErrorMessage = Error_Services('GetMessage') Status = Get_Status(errCode) IF (Error_Services('HasError') or Get_Status(errCode) ) THEN LogData = '' LogData<1> = LoggingDTM LogData<2> = @User4 LogData<3> = RDSNo LogData<4> = 'Epi Unload Error. Error code: ':errCode:'.' Logging_Services('AppendLog', objLog, LogData, @RM, @FM) UnloadFailed = 1 RemCnt = COUNT(RemCassIDs,@FM) + (RemCassIDs NE '') FOR R = 1 TO RemCnt RemCassID = RemCassIDs Send_Info('Epi Unload Error - Clearing Partial Unload data ':RemCassID:'...') WONo = RemCassID[1,'*'] WOStep = RemCassID[COL2()+1,'*'] OutCass = RemCassID[COL2()+1,'*'] OutSlotNos = RemOutSlotNos Set_Status(0) obj_WM_Out('RemoveWafer',WONo:@RM:WOStep:@RM:OutCass:@RM:OutSlotNos) NEXT R END ELSE RemCassIDs<-1> = CassID RemOutSlotNos<-1> = OutSlotNos END Running = Msg(@WINDOW, MsgUp, N, MSGINSTUPDATE$) ;* Update message UNTIL UnloadFailed NEXT N IF NOT(UnloadFailed) THEN Send_Info('Saving Updated RDS ':RdsNo:'...') Database_Services('WriteDataRow', 'RDS', RDSNo, RDSRec, True$, False$, True$) If Error_Services('HasError') then UnloadFailed = True$ ErrorMsg = Error_Services('GetMessage') LogData = '' LogData<1> = LoggingDTM LogData<2> = @User4 LogData<3> = RDSNo LogData<4> = ErrorMsg Logging_Services('AppendLog', objLog, LogData, @RM, @FM) ErrMsg(ErrorMsg) end * Update Reactor Status with load data If UnloadFailed EQ False$ then * Send_Info('Updating Reactor ':Reactor:' Status...') * InCassettes = SRP_Array('Clean', InCassNos, 'TrimAndMakeUnique', @VM) * obj_React_Status('ReactorUnload',Reactor:@RM:WONo:@RM:InCassettes:@RM:UnloadDTM:@RM:RDSNo) IF Get_Status(errCode) THEN ErrMsg(errCode) Send_Info('Updating REACT_RUN record...') RDS_React_Run(RDSNo) ;* Conversion to REACT_RUN code 9/25/2008 JCH ******* end // Verify RDS, REACT_RUN, and WM_OUT cassette & slot data match. DataMatch = Material_Services('VerifyEPPUnload', RDSNo) // If data does not match, then back out all changes and log the error. If ( (DataMatch EQ False$) or (UnloadFailed EQ True$) ) then ErrorMsg = Error_Services('GetMessage') LogData = '' LogData<1> = LoggingDTM LogData<2> = @User4 LogData<3> = RDSNo LogData<4> = ErrorMsg Logging_Services('AppendLog', objLog, LogData, @RM, @FM) // Clear WM_OUT data UnloadFailed = 1 RemCnt = COUNT(RemCassIDs,@FM) + (RemCassIDs NE '') FOR R = 1 TO RemCnt RemCassID = RemCassIDs Send_Info('Epi Unload Error - Clearing Partial Unload data ':RemCassID:'...') WONo = RemCassID[1,'*'] WOStep = RemCassID[COL2()+1,'*'] OutCass = RemCassID[COL2()+1,'*'] OutSlotNos = RemOutSlotNos Set_Status(0) obj_WM_Out('RemoveWafer',WONo:@RM:WOStep:@RM:OutCass:@RM:OutSlotNos) If Error_Services('HasError') then ErrorMsg = Error_Services('GetMessage') LogData = '' LogData<1> = LoggingDTM LogData<2> = @User4 LogData<3> = WONo:'*':WOStep:'*':OutCass LogData<4> = ErrorMsg Logging_Services('AppendLog', objLog, LogData, @RM, @FM) end NEXT R // Clear RDS Data RDSRec = '' RDSRec = '' RDSRec = '' RDSRec = '' RDSRec = '' Database_Services('WriteDataRow', 'RDS', RDSNo, RDSRec, True$, False$, False$) // Clear REACT_RUN data (copy cleared RDS data to REACT_RUN) RDS_React_Run(RDSNo) end END ELSE obj_Tables('UnlockRec',RTParms) END Msg(@WINDOW,MsgUp) ;* Take message down RETURN * * * * * * * ReloadEpi: * * * * * * * RdsNo = Parms[1,@RM] IF RdsNo = '' THEN ErrorMsg = 'Null parameter "RdsNo" passeed to routine.' RETURN END Send_Info('Reading RDS ':RdsNo:'...') LocalLockFlag = 1 Set_Status(0) RTParms = 'RDS':@RM:RdsNo RDSRec = obj_Tables('ReadRec',RTParms) IF Get_Status(errCode) THEN ErrorMsg = 'Unable to read RDS ':QUOTE(RdsNo):' for ReloadEpi update.' RETURN END WONo = RDSRec WOStep = RDSRec[-1,'B*'] ReactNo = RDSRec ToolID = 'R':ReactNo RLCnt = COUNT(RDSRec,@VM) + (RDSRec NE '') ReloadFailed = 0 LoadCnt = 0 RLWaferIDs = '' OutCassIDs = '' PocketNos = '' Zones = '' WaferChars = '' PocketChars = '' InCassNos = '' InSlotNos = '' OutSlots = '' CurrDTM = OCONV(Date(),'D4/'):' ':OCONV(Time(),'MTS') Send_Info('Building WM_OUT Reload Data ...') WfrIDs = '' ;* Added 9/7/2016 JCH RunLocs = '' ;* Added 9/7/2016 JCH CurrSlotIDs = '' ;* Added 9/7/2016 JCH FOR I = 1 TO RLCnt PocketNo = RDSRec Zone = RDSRec WaferChar = RDSRec PocketChar = RDSRec InCass = RDSRec InSlot = RDSRec OutCass = RDSRec OutSlot = RDSRec IF WaferChar = 'PROD' AND PocketChar = '' AND OutCass NE '' THEN WfrIDs<1,-1> = WONo:'*':InCass:'*':InSlot ;* Added 9/7/2016 JCH RunLocs<1,-1> = RDSNo:'*':PocketNo:'*':Zone ;* Added 9/7/2016 JCH CurrSlotIDs<1,-1> = WONo:'*':OutCass:'*':Outslot ;* Added 9/7/2016 JCH * * * * Added 3/22/2016 JCH - wafer history * * * * Parms = WONo:'*':InCass:'*':InSlot:@RM ;* WfrID Parms := CurrDTM:@RM ;* EventDtm Parms := @USER4:@RM ;* EventBy Parms := 'RELOAD':@RM ;* Event Parms := '':@RM ;* NewSlotID Parms := RDSNo:'*':PocketNo:'*':Zone:@RM ;* RunLoc Parms := '':@RM ;* NCRNo Parms := '':@RM ;* TWUse Parms := WONo:'*':OutCass:'*':Outslot:@RM ;* CurrSlotID Parms := ToolID:@RM ;* NewToolID (Load Tool) Parms := '':@RM ;* CurrToolID (Unload Tool) Parms := '':@RM ;* NewInvLoc Parms := '':@RM ;* CurrInvLoc Parms := 'O' ;* Wfr Side obj_WO_Wfr('AddEvent',Parms) OutCassID = WONo:'*':WOStep:'*':OutCass LOCATE OutCassID IN OutCassIDs USING @FM SETTING Pos THEN PocketNos = INSERT(PocketNos,Pos,-1,0,PocketNo) Zones = INSERT(Zones,Pos,-1,0,Zone) WaferChars = INSERT(WaferChars,Pos,-1,0,WaferChar) PocketChars = INSERT(PocketChars,Pos,-1,0,PocketChar) InCassNos = INSERT(InCassNos,Pos,-1,0,InCass) InSlotNos = INSERT(InSlotNos,Pos,-1,0,InSlot) OutSlots = INSERT(OutSlots,Pos,-1,0,OutSlot) END ELSE OutCassIDs = INSERT(OutCassIDs,Pos,0,0,OutCassID) PocketNos = INSERT(PocketNos,Pos,-1,0,PocketNo) Zones = INSERT(Zones,Pos,-1,0,Zone) WaferChars = INSERT(WaferChars,Pos,-1,0,WaferChar) PocketChars = INSERT(PocketChars,Pos,-1,0,PocketChar) InCassNos = INSERT(InCassNos,Pos,-1,0,InCass) InSlotNos = INSERT(InSlotNos,Pos,-1,0,InSlot) OutSlots = INSERT(OutSlots,Pos,-1,0,OutSlot) END RDSRec = '' RDSRec = '' END UNTIL ReloadFailed NEXT I /* * * * * Added 9/7/2016 JCH - wafer history * * * * IF WfrIDs NE '' THEN Parms = WfrIDs:@RM ;* WfrIDs Parms := CurrDTM:@RM ;* EventDtm Parms := @USER4:@RM ;* EventBy Parms := 'RELOAD':@RM ;* Event Parms := '':@RM ;* NewSlotIDs Parms := RunLocs:@RM ;* RunLocs Parms := '':@RM ;* NCRNo Parms := '':@RM ;* TWUse Parms := CurrSlotIDs:@RM ;* CurrSlotIDs Parms := ToolID:@RM ;* NewToolID (Load Tool) Parms := '':@RM ;* CurrToolID (Unload Tool) Parms := '':@RM ;* NewInvLoc Parms := '':@RM ;* CurrInvLoc Parms := 'O' ;* Wfr Side obj_WO_Wfr('AddEvent',Parms) END */ RepCassIDs = '' RepOutSlotNos = '' RepRDSNos = '' RepPocketNos = '' RepZones = '' RepInCassNos = '' RepInSlotNos = '' ReloadFailed = 0 CassCnt = COUNT(OutCassIDs,@FM) + (OutCassIDs NE '') FOR I = 1 TO CassCnt OutCassID = OutCassIDs Send_Info('Removing Run Data from WM_OUT ':OutCassID:'...') WONo = OutCassID[1,'*'] WOStep = OutCassID[COL2()+1,'*'] OutCass = OutCassID[COL2()+1,'*'] owParms = WONo:@RM owParms := WOStep:@RM owParms := OutCass:@RM owParms := OutSlots Set_Status(0) obj_WM_Out('RemoveWafer',owParms) IF Get_Status(ErrCode) THEN ReloadFailed = 1 RepCnt = COUNT(RepCassIDs,@FM) + (RepCassIDs NE '') FOR N = 1 TO RepCnt RepCassID = RepCassIDs Send_Info('Epi Reload Error - Restoring Unload Data ':RepCassID:'...') WONo = RepCassID[1,'*'] WOStep = RepCassID[COL2()+1,'*'] OutCass = RepCassID[COL2()+1,'*'] owParms = WONo:@RM owParms := WOStep:@RM owParms := OutCass:@RM owParms := RepOutSlotNos:@RM owParms := RepRDSNos:@RM owParms := RepPocketNos:@RM owParms := RepZones:@RM owParms := RepInCassNos:@RM owParms := RepInSlotNos Set_Status(0) obj_WM_Out('AddWafer',owParms) NEXT N END ELSE RepCassIDs<-1> = OutCassID RepOutSlotNos<-1> = OutSlots RepRDSNos<-1> = RDSNo RepPocketNos<-1> = PocketNos RepZones<-1> = Zones RepInCassNos<-1> = InCassNos RepInSlotNos<-1> = InSlotNos END UNTIL ReloadFailed NEXT I IF NOT(ReloadFailed) THEN Send_Info('Saving RDS record ':RdsNo:'...') RTParms = FieldStore(RTParms, @RM, 4, 1, RDSRec) obj_Tables('WriteRec',RTParms) Send_Info('Updating REACT_RUN record...') RDS_React_Run(RDSNo) ;* Conversion to REACT_RUN code 9/25/2008 JCH ********************************************** END ELSE obj_Tables('UnlockRec',RTParms) END RETURN * * * * * * * ClearEpiUnload: * * * * * * * * Clears unload destination data - used when RDS & WM_OUT get completely out of sync RdsNo = Parms[1,@RM] IF RdsNo = '' THEN ErrorMsg = 'Null parameter "RdsNo" passeed to routine.' RETURN END Send_Info('Reading RDS ':RdsNo:'...') Set_Status(0) RTParms = 'RDS':@RM:RdsNo RDSRec = obj_Tables('ReadRec',RTParms) IF Get_Status(errCode) THEN ErrorMsg = 'Unable to read RDS ':QUOTE(RdsNo):' for ClearEpiUnload process.' RETURN END RLCnt = COUNT(RDSRec,@VM) + (RDSRec NE '') FOR I = 1 TO RLCnt RDSRec = '' RDSRec = '' NEXT I RTParms = FieldStore(RTParms, @RM, 4, 1, RDSRec) obj_Tables('WriteRec',RTParms) Send_Info('Updating REACT_RUN record...') RDS_React_Run(RDSNo) ;* Conversion to REACT_RUN code 9/25/2008 JCH ********************************************** RETURN * * * * * * * LoadMat: * * * * * * * RdsNo = Parms[1,@RM] ReactorList = Parms[COL2()+1,@RM] ;* Contains susceptor load configuration WMIKeys = Parms[COL2()+1,@RM] ;* Contains list of locked WMI slots to use IF RdsNo = '' THEN ErrorMsg = 'Null parameter "RdsNo" passeed to routine.' IF ReactorList = '' THEN ErrorMsg = 'Null parameter "ReactorList" passeed to routine.' IF WMIKeys = '' THEN ErrorMsg = 'Null parameter "AvailSlotKeys" passeed to routine.' IF ErrorMsg NE '' THEN RETURN Send_Info('Reading RDS ':RdsNo:'...') Set_Status(0) RTParms = 'RDS':@RM:RdsNo RDSRec = obj_Tables('ReadRec',RTParms) IF Get_Status(errCode) THEN ErrorMsg = 'Unable to read RDS ':QUOTE(RdsNo):' for UnloadEpi update.' RETURN END // Set BLOCK_LOAD flag until the process completes RDSRec = True$ Database_Services('WriteDataRow', 'RDS', RDSNo, RDSRec, True$, False$, True$) Reactor = RDSRec RLCnt = COUNT(ReactorList,@FM) + (ReactorList NE '') LOOP LastLine = ReactorList[-1,'B':@FM] UNTIL LastLine<1,COL$POCKET> NE '' OR ReactorList = '' ReactorList[COL1(),99] = '' RLCnt -= 1 REPEAT LoadFailed = 0 LoadCnt = 0 InCassettes = '' CassIDs = '' CassSlots = '' CassSlotRDSNos = '' CassSlotPkts = '' CassSlotZones = '' Send_Info('Building Cassette Unload Data ...') FOR I = 1 TO RLCnt IF ReactorList = '' AND ReactorList = '' AND ReactorList NE 'DUMMY' THEN WMIKey = WMIKeys[1,@VM] WMIKeys[1,COL2()] = '' WONo = WMIKey[1,'*'] WOStep = WMIKey[COL2()+1,'*'] InCass = WMIKey[COL2()+1,'*'] InSlot = WMIKey[COL2()+1,'*'] PocketNo = ReactorList Usage = ReactorList Zone = ReactorList CassID = WONo:'*':WOStep:'*':InCass LOCATE CassID IN CassIDs USING @FM SETTING Pos THEN CassSlots = INSERT(CassSlots,Pos,-1,0,InSlot) CassSlotRDSNos = INSERT(CassSlotRDSNos,Pos,-1,0,RDSNo) CassSlotPkts = INSERT(CassSlotPkts,Pos,-1,0,PocketNo) CassSlotZones = INSERT(CassSlotZones,Pos,-1,0,Zone) END ELSE CassIDs = INSERT(CassIDs,Pos,0,0,CassID) CassSlots = INSERT(CassSlots,Pos,-1,0,InSlot) CassSlotRDSNos = INSERT(CassSlotRDSNos,Pos,-1,0,RDSNo) CassSlotPkts = INSERT(CassSlotPkts,Pos,-1,0,PocketNo) CassSlotZones = INSERT(CassSlotZones,Pos,-1,0,Zone) END RDSRec = PocketNo RDSRec = Zone RDSRec = Usage RDSRec = InCass RDSRec = InSlot RDSRec = 'PROD' LoadCnt += 1 LOCATE InCass IN InCassettes USING @VM SETTING Pos ELSE InCassettes = INSERT(InCassettes,1,Pos,0,InCass) END END ELSE RDSRec = ReactorList RDSRec = ReactorList RDSRec = ReactorList RDSRec = ReactorList END UNTIL LoadFailed NEXT I LoadFailed = 0 CassIDCnt = COUNT(CassIDs,@FM) + (CassIDs NE '') RepCassIDs = '' RepCassSlots = '' Def = "" Def = "Loading material... Please, do not interupt this process. This may take a while!" Def = "G" Def = CassIDCnt Def = 600 MsgUp = Msg(@WINDOW, Def) ;* Start gas guage message FOR I = 1 TO CassIDCnt CassID = CassIDs Send_Info('Pulling Material from WM_IN ':CassID:'...') WONo = CassID[1,'*'] WOStep = CassID[COL2()+1,'*'] InCass = CassID[COL2()+1,'*'] owParms = WONo:@RM owParms := WOStep:@RM owParms := InCass:@RM owParms := CassSlots:@RM owParms := CassSlotRDSNos:@RM owParms := CassSlotPkts:@RM owParms := CassSlotZones:@RM Set_Status(0) obj_WM_In('RemoveWafer',owParms) IF Get_Status(errCode) THEN ErrorMsg = 'Unable to read RDS ':QUOTE(RdsNo):' for UnloadEpi update.' LoadFailed = 1 RepCnt = COUNT(RepCassIDs,@FM) + (RepCassIDs NE '') FOR N = 1 TO RepCnt RepCassID = RepCassIDs Send_Info('Replacing Material in WM_IN ':RepCassID:'...') WONo = RepCassID[1,'*'] WOStep = RepCassID[COL2()+1,'*'] InCass = RepCassID[COL2()+1,'*'] owParms = WONo:@RM owParms := WOStep:@RM owParms := InCass:@RM owParms := RepCassSlots:@RM obj_WM_In('ReplaceWafer',owParms) NEXT N END ELSE RepCassIDs<-1> = CassID RepCassSlots<-1> = CassSlots END Running = Msg(@WINDOW, MsgUp, I, MSGINSTUPDATE$) ;* Update message UNTIL LoadFailed NEXT I IF NOT(LoadFailed) THEN * Update Reactor Status with load data *Send_Info('Updating Reactor ':Reactor:' status...') LoadDTM = OCONV( Date(), 'D2/' ):' ':OCONV( Time(), 'MTH' ) *IdleTime = obj_React_Status('ReactorLoad',Reactor:@RM:WONo:@RM:InCassettes:@RM:LoadDTM) IF Get_Status(errCode) THEN ErrMsg(errCode) RDSRec = LoadCnt RDSRec = LoadCnt RDSRec = LoadCnt *RDSRec = ICONV(IdleTime,'MD2') ;* hours to 2 decimal places Send_Info('Saving Updated RDS ':RDSNo:'...') * RTParms = FieldStore(RTParms, @RM, 4, 1, RDSRec) // Remove BLOCK_LOAD flag since the process has completed RDSRec = False$ * obj_Tables('WriteRec',RTParms) Database_Services('WriteDataRow', 'RDS', RDSNo, RDSRec, True$, False$, True$) Database_Services('ReleaseKeyIDLock', 'RDS', RDSNo) Send_Info('Updating REACT_RUN record...') RDS_React_Run(RDSNo) ;* Conversion to REACT_RUN code 9/25/2008 JCH ********************************************** END ELSE RDSRec = obj_Tables('UnlockRec',RTParms) END Msg(@WINDOW,MsgUp) ;* Take message down RETURN * * * * * * * ReturnMat: * * * * * * * RdsNo = Parms[1,@RM] IF RdsNo = '' THEN ErrorMsg = 'Null parameter "RdsNo" passeed to routine.' IF ErrorMsg NE '' THEN RETURN Send_Info('Reading RDS Record ':RdsNo:'...') Set_Status(0) RTParms = 'RDS':@RM:RdsNo RDSRec = obj_Tables('ReadRec',RTParms) IF Get_Status(errCode) THEN ErrorMsg = 'Unable to read RDS ':QUOTE(RdsNo):' for ReturnMat update.' RETURN END WONo = RDSRec WOStep = RDSRec[-1,'B*'] RLCnt = COUNT(RDSRec,@VM) + (RDSRec NE '') ReloadFailed = 0 LoadCnt = 0 RLWaferData = '' CassIDs = '' CassSlots = '' CassSlotRDSNos = '' CassSlotPkts = '' CassSlotZones = '' Send_Info('Building Cassette Material Return data...') FOR I = 1 TO RLCnt PocketNo = RDSRec Zone = RDSRec WaferChar = RDSRec PocketChar = RDSRec InCass = RDSRec InSlot = RDSRec OutCass = RDSRec OutSlot = RDSRec IF WaferChar = 'PROD' AND InCass NE '' THEN CassID = WONo:'*':WOStep:'*':InCass LOCATE CassID IN CassIDs USING @FM SETTING Pos THEN CassSlots = INSERT(CassSlots,Pos,-1,0,InSlot) CassSlotRDSNos = INSERT(CassSlotRDSNos,Pos,-1,0,RdsNo) CassSlotPkts = INSERT(CassSlotPkts,Pos,-1,0,PocketNo) CassSlotZones = INSERT(CassSlotZones,Pos,-1,0,Zone) END ELSE CassIDs = INSERT(CassIDs,Pos,0,0,CassID) CassSlots = INSERT(CassSlots,Pos,-1,0,InSlot) CassSlotRDSNos = INSERT(CassSlotRDSNos,Pos,-1,0,RDSNo) CassSlotPkts = INSERT(CassSlotPkts,Pos,-1,0,PocketNo) CassSlotZones = INSERT(CassSlotZones,Pos,-1,0,Zone) END RDSRec = '' RDSRec = '' RDSRec = '' RDSRec = '' END ;* End of test for PROD wafers UNTIL ReloadFailed NEXT I RepCassIDs = '' RepCassSlots = '' RepCassSlotRDSNos = '' RepCassSlotPkts = '' RepCassSlotZones = '' ReloadFailed = 0 CassIDCnt = COUNT(CassIDs,@FM) + (CassIDs NE '') FOR I = 1 TO CassIDCnt CassID = CassIDs Send_Info('Returning Material to WM_IN ':CassID:'...') WONo = CassID[1,'*'] WOStep = CassID[COL2()+1,'*'] InCass = CassID[COL2()+1,'*'] owParms = WONo:@RM owParms := WOStep:@RM owParms := InCass:@RM owParms := CassSlots Set_Status(0) obj_WM_In('ReplaceWafer',owParms) ;* Puts wafer back in the WM_IN record IF Get_Status(errCode) THEN ReloadFailed = 1 RepCnt = COUNT(RepCassIDs,@FM) + (RepCassIDs NE '') FOR N = 1 TO RepCnt RepCassID = RepCassIDs Send_Info('Restoring WM_IN record ':RepCassID:'...') WONo = RepCassID[1,'*'] WOStep = RepCassID[COL2()+1,'*'] InCass = RepCassID[COL2()+1,'*'] owParms = WONo:@RM owParms := WOStep:@RM owParms := InCass:@RM owParms := RepCassSlots owParms := RepCassSlotRDSNos owParms := RepCassSlotPkts owParms := RepCassSlotZones obj_WM_In('ReplaceWafer',owParms) NEXT N END ELSE RepCassIDs<-1> = CassIDs RepCassSlots<-1> = CassSlots RepCassSlotRDSNos<-1> = CassSlotRDSNos RepCassSlotPkts<-1> = CassSlotPkts RepCassSlotZones<-1> = CassSlotZones END UNTIL ReloadFailed NEXT I IF NOT(ReloadFailed) THEN Send_Info('Saving RDS record ':RdsNo:'...') RDSRec = 0 RDSRec = 0 RDSRec = 0 RTParms = FieldStore(RTParms, @RM, 4, 1, RDSRec) obj_Tables('WriteRec',RTParms) Send_Info('Updating REACT_RUN record...') RDS_React_Run(RDSNo) ;* Conversion to REACT_RUN code 9/25/2008 JCH ********************************************** END ELSE obj_Tables('UnlockRec',RTParms) END RETURN * * * * * * * RemovePocketNCR: * * * * * * * RDSNo = Parms[1,@RM] NCRNo = Parms[COL2()+1,@RM] IF RDSNo = '' THEN RETURN IF NCRNo = '' THEN RETURN IF RDSNo = '' THEN ErrorMsg = 'Null parameter "RDSNo" passed to routine. (':Method:')' IF NCRNo = '' THEN ErrorMsg = 'Null parameter "NCRNo" passed to routine. (':Method:')' IF ErrorMsg NE '' THEN RETURN Set_Status(0) RTParms = 'RDS':@RM:RdsNo RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo) * RDSRec = obj_Tables('ReadRec',RTParms) IF Get_Status(errCode) THEN ErrorMsg = 'Unable to read RDS ':QUOTE(RdsNo):' for LoadEpi update.' RETURN END OutNCRs = RDSRec Done = 0 LOOP LOCATE NCRNo IN RDSRec USING @VM SETTING Pos THEN RDSRec = '' END ELSE Done = 1 END UNTIL Done REPEAT * RTParms = FieldStore(RTParms, @RM, 4, 1, RDSRec) * obj_Tables('WriteRec',RTParms) Database_Services('WriteDataRow', 'RDS', RDSNo, RDSRec, True$, False$, True$) RETURN * * * * * * * MetConversion: * * * * * * * * Updates entered data into RDS_LAYER and RDS_TEST records from RDS record RETURN ;* Dead 4/16/2006 with installation of metrology and NCR updates * * * * * * * LoadTestWafers: * * * * * * * TWLine = 0 RDSTestRec = '' IF RDSRec NE '' THEN TWType = 'N-' FOR T = 1 TO COUNT(RDSRec,@VM) + (RDSRec NE '') TWTool = RDSRec TWCode = RDSRec TWTrans = RDSRec TWCnt = RDSRec TWCon = RDSRec TWRes = RDSRec TWRho = RDSRec TWStress = RDSRec TWThick = RDSRec GOSUB LoadTWLine NEXT T END IF RDSRec NE '' THEN TWType = 'N+' FOR T = 1 TO COUNT(RDSRec,@VM) + (RDSRec NE '') TWTool = RDSRec TWCode = RDSRec TWTrans = RDSRec TWCnt = RDSRec TWCon = RDSRec TWRes = RDSRec TWRho = RDSRec TWStress = RDSRec TWThick = RDSRec GOSUB LoadTWLine NEXT T END IF RDSRec NE '' THEN TWType = 'P-' FOR T = 1 TO COUNT(RDSRec,@VM) + (RDSRec NE '') TWTool = RDSRec TWCode = RDSRec TWTrans = RDSRec TWCnt = RDSRec TWCon = RDSRec TWRes = RDSRec TWRho = RDSRec TWStress = RDSRec TWThick = RDSRec GOSUB LoadTWLine NEXT T END IF RDSRec NE '' THEN TWType = 'P+' FOR T = 1 TO COUNT(RDSRec,@VM) + (RDSRec NE '') TWTool = RDSRec TWCode = RDSRec TWTrans = RDSRec TWCnt = RDSRec TWCon = RDSRec TWRes = RDSRec TWRho = RDSRec TWStress = RDSRec TWThick = RDSRec GOSUB LoadTWLine NEXT T END IF RDSRec NE '' THEN TWType = 'Prod' FOR T = 1 TO COUNT(RDSRec,@VM) + (RDSRec NE '') TWTool = RDSRec TWCode = RDSRec TWTrans = RDSRec TWCnt = RDSRec TWCon = RDSRec TWRes = RDSRec TWRho = RDSRec TWStress = RDSRec TWThick = RDSRec GOSUB LoadTWLine NEXT T END IF RDSRec NE '' THEN TWType = 'Reclaim' FOR T = 1 TO COUNT(RDSRec,@VM) + (RDSRec NE '') TWTool = RDSRec TWCode = RDSRec TWTrans = RDSRec TWCnt = RDSRec TWCon = RDSRec TWRes = RDSRec TWRho = RDSRec TWStress = RDSRec TWThick = RDSRec GOSUB LoadTWLine NEXT T END RETURN * * * * * * * LoadTWLine: * * * * * * * TWLine += 1 RDSTestRec = TWType RDSTestRec = TWTool RDSTestRec = TWCode RDSTestRec = TWTrans RDSTestRec = TWCnt RDSTestRec = TWCon RDSTestRec = TWRes RDSTestRec = TWRho RDSTestRec = TWStress RDSTestRec = TWThick RETURN * * * * * * * SetPartNo: * * * * * * * RdsNos = Parms[1,@RM] NewPartNo = Parms[COL2()+1,@RM] RDSTableVar = Parms[COL2()+1,@RM] IF RDSNos = '' THEN ErrorMsg = 'Null parameter "RDSNos" passed to routine. (':Method:')' IF NewPartNo = '' THEN ErrorMsg = 'Null parameter "NewPartNo" passed to routine. (':Method:')' IF ErrorMsg NE '' THEN RETURN IF RDSTableVar = '' THEN rtParms = 'RDS':@RM:RdsNos RDSTableVar = obj_Tables('LockSet',rtParms) IF Get_Status(errCode) THEN RETURN END RdsCnt = COUNT(RdsNos,@VM) + (RdsNos NE '') FOR I = 1 TO RdsCnt RdsNo = RdsNos<1,I> READ RDSRec FROM RDSTableVar,RdsNo THEN RDSRec = NewPartNo rtParms = 'RDS':@RM:RDSNo:@RM:RDSTableVar:@RM:RDSRec obj_Tables('WriteRec',rtParms) ;* Writes and unlocks the RDS records Send_Info(' RDS record ':RDSNo:' Updated. ':I:'/':RdsCnt) END NEXT I RETURN