COMPILE FUNCTION obj_RDS2(Method,Parms) /* 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 */ DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, NextKey, obj_Prod_Spec, Dialog_Box, obj_RDS_Test DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, obj_WO_Step, obj_RDS_Layer, obj_RDS_Test $INSERT MSG_EQUATES $INSERT WO_VERIFY_EQU $INSERT WO_LOG_EQU $INSERT RDS_EQU $INSERT RDS_MAKEUP_EQU $INSERT RDS_LAYER_EQUATES $INSERT RDS_TEST_EQUATES $INSERT RDS_LAYER_INFO_EQU $INSERT QUOTE_SPEC_EQU $INSERT PROD_SPEC_EQU $INSERT SCHEDULE_EQU $INSERT WO_STEP_EQU $INSERT PRS_LAYER_EQU ;* Used to return obj_Prod_Spec values EQU SHEETRHO_SPEC_UNITS$ TO 'ê/Ü' EQU RES_SPEC_UNITS$ TO \EA2D636D\ ErrTitle = 'Error in Stored Procedure "obj_RDS2"' ErrorMsg = '' 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 = 'LoadEpi' ; GOSUB LoadEpi CASE Method = 'RemovePocketNCR' ; GOSUB RemovePocketNCR CASE 1 END CASE IF ErrorMsg NE '' THEN Set_Status(-1,ErrTitle:@SVM:ErrorMsg) END RETURN Result * * * * * * * 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 RdsDateIns = XLATE('RDS',RdsNos,35,'X') ;* Field 35 = RDS_DATE_IN$ CONVERT @FM TO @VM IN RdsDateIns IF @USERNAME = 'BRYCE_BARB' THEN DEBUG TestString = RdsDateIns CONVERT @VM TO '' IN TestString IF TestString NE '' THEN FOR I = 1 TO COUNT(RdsDateIns,@VM) + (RdsDateIns NE '') IF RdsDateIns<1,I> NE '' THEN Result<1,-1> = RdsNos<1,I> ;* Return list of RdsNos that have started processing and cannot be deleted END NEXT I ErrorMsg = 'Production started on one or more RDS No(s).' RETURN END 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> LSKeys = XLATE('RDS',RdsNo,RDS_RDS_LAYER_KEYS$,'X') MetKeys = XLATE('RDS_LAYER',LSKeys,RDS_LAYER_RDS_TEST_KEYS$,'X') RTParms = 'RDS':@RM:RdsNo:@RM:TableVar:@RM obj_Tables('UnlockRec',RTParms) obj_RDS_Test('Delete',MetKeys) obj_RDS_Layer('Delete',LSKeys) 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 IF MUBox NE RDSRec THEN RDSRec = MUBox 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 * * * * * * * LoadEpi: * * * * * * * RdsNo = Parms[1,@RM] Pockets = Parms[COL2()+1,@RM] PocketChars = Parms[COL2()+1,@RM] Zones = Parms[COL2()+1,@RM] InCassettes = Parms[COL2()+1,@RM] InSlots = Parms[COL2()+1,@RM] WaferChars = Parms[COL2()+1,@RM] OutCassettes = Parms[COL2()+1,@RM] OutSlots = Parms[COL2()+1,@RM] OutNCRs = Parms[COL2()+1,@RM] IF RdsNo = '' THEN RETURN 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 LoadEpi update.' RETURN END RDSRec = Pockets RDSRec = PocketChars RDSRec = Zones RDSRec = InCassettes RDSRec = Inslots RDSRec = OutCassettes RDSRec = OutSlots RDSRec = WaferChars RDSRec = OutNCRs LoadCnt = 0 FOR I = 1 TO COUNT(WaferChars,@VM) + (WaferChars NE '') IF WaferChars<1,I> = 'PROD' THEN LoadCnt += 1 NEXT I RDSRec = LoadCnt RDSRec = LoadCnt RDSRec = LoadCnt RTParms = FieldStore(RTParms, @RM, 4, 1, RDSRec) obj_Tables('WriteRec',RTParms) 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 = 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) 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 RDSNo = Parms[1,@RM] IF RDSNo = '' THEN RETURN SortedLSKeys = XLATE('RDS',RDSNo,'RDS_LS_SORTED','X') RDSRec = XLATE('RDS',RDSNo,'','X') PSNId = RDSRec ResUnits = RDSRec LayerMess = RDSRec CONVERT CHAR(248) TO @FM IN LayerMess LayerCnt = COUNT(LayerMess,@FM) + (LayerMess NE '') IF SortedLSKeys = '' THEN SortedLSKeys = 'L1' FOR N = 1 TO COUNT(LayerMess,@FM) + (LayerMess NE '') IF N = LayerCnt THEN LS_ID = N END ELSE LS_ID = 'L':N END SortedLSKeys<1,-1> = LS_ID NEXT N END FOR I = 1 TO COUNT(SortedLSKeys,@VM) + (SortedLSKeys NE '') LSKey = SortedLSKeys<1,I> LS_ID = FIELD(LSKey,'*',2) RLParms = 'RDS_LAYER':@RM:LSKey RDSLayerRec = obj_Tables('ReadRec',RLParms) ;* Try reading record IF RDSLayerRec = '' THEN obj_RDS_Layer('Create',RDSNo:@RM:LS_ID:@RM:PSNId) ;* Wasn't there - create it RDSLayerRec = obj_Tables('ReadRec',RLParms) ;* Read it again END WaferSize = XLATE( 'PROD_SPEC', PSNId, 'SUB_WAFER_SIZE', 'X' ) SubOrientation = XLATE('PROD_SPEC',PSNId,'SUB_ORIENTATION','X') ResUnits = RDSRec IF I = 1 THEN RDSLayerRec = RDSRec RDSLayerRec = RDSRec RDSLayerRec = RDSRec RDSLayerRec = RDSRec RDSLayerRec = RDSRec RDSLayerRec = RDSRec RDSLayerRec = RDSRec RDSLayerRec = RDSRec RDSLayerRec = RDSRec RDSLayerRec = RDSRec RDSLayerRec = RDSRec RDSLayerRec = RDSRec RDSLayerRec = RDSRec RDSLayerRec = RDSRec RDSLayerRec = RDSRec RDSLayerRec = RDSRec IF RDSLayerRec = '' THEN RDSTestRec = '' RDSTestRec = RDSNo RDSTestRec = 'L1' RDSTestRec = WaferSize RDSTestRec = SubOrientation RDSTestRec = RDSRec RDSTestRec = RDSRec RDSTestRec = RDSRec RDSTestRec = RDSRec RDSTestRec = RDSRec RDSTestRec = RDSRec RDSTestRec = RDSRec RDSTestRec = RDSRec RDSTestRec = RDSRec RDSTestRec = RDSRec RDSTestRec = RDSRec RDSTestRec = RDSRec * Now load the specification stuff that was not copied in the org system SpecLayerData = obj_Prod_Spec('GetLayerProp',PSNId:@RM:LS_ID:@RM:1) ;* Gets 1st layer WO/Conversiion SpecLayerID = SpecLayerData[1,@FM] SpecLayerData = FIELD(SpecLayerData,@FM,2,999) RDSTestRec = SpecLayerData RDSTestRec = SpecLayerData RDSTestRec = SpecLayerData FOR A = 11 TO 19 RDSTestRec = SpecLayerData NEXT A FOR A = 24 TO 32 RDSTestRec = SpecLayerData NEXT A FOR A = 37 TO 45 RDSTestRec = SpecLayerData NEXT A FOR A = 50 to 58 RDSTestRec = SpecLayerData NEXT A RDSTestRec = SpecLayerData RDSTestRec = SpecLayerData RTKey = NextKey('RDS_TEST') RTParms = 'RDS_TEST':@RM:RTKey END ELSE RTKey = RDSLayerRec RTParms = 'RDS_TEST':@RM:RTKey RDSTestRec = obj_Tables('ReadRec',RTParms) ;* Try reading record END RDSTestRec = ICONV(OCONV(RDSRec,'MD2'),'MD3') RDSTestRec = RDSRec RDSTestRec = RDSRec RDSTestRec = RDSRec RDSTestRec = RDSRec RDSTestRec = RDSRec RDSTestRec = RDSRec IF ResUnits = SHEETRHO_SPEC_UNITS$ THEN RDSTestRec = RDSRec RDSTestRec = RDSRec RDSTestRec = RDSRec RDSTestRec = RDSRec RDSTestRec = RDSRec RDSTestRec = '' RDSTestRec = '' RDSTestRec = '' RDSTestRec = '' RDSTestRec = '' END ELSE RDSTestRec = '' RDSTestRec = '' RDSTestRec = '' RDSTestRec = '' RDSTestRec = '' RDSTestRec = RDSRec RDSTestRec = RDSRec RDSTestRec = RDSRec RDSTestRec = RDSRec RDSTestRec = RDSRec END RDSTestRec = RDSRec RDSTestRec = RDSRec GOSUB LoadTestWafers RDSTestRec = obj_RDS_Test('CalcMissing',RDSTestRec) END ELSE RecipeNo = LayerMess IF INDEX(LS_ID,'L',1) THEN RDSLayerRec = RecipeNo RDSLayerRec = LayerMess RDSLayerRec = LayerMess END IF RDSLayerRec = '' THEN PSNLayerData = obj_Prod_Spec('GetLayerProp',PSNId:@RM:LS_ID) PSNLayerData = FIELD(PSNLayerData,@FM,2,999) ;* Layer ID is returned in the 1st field position RDSTestRec = '' RDSTestRec = RDSNo RDSTestRec = LS_ID RDSTestRec = LayerMess RDSTestRec = LayerMess RDSTestRec = LayerMess RDSTestRec = LayerMess RDSTestRec = LayerMess RDSTestRec = LayerMess RDSTestRec = LayerMess RDSTestRec = LayerMess RDSTestRec = LayerMess RDSTestRec = LayerMess RDSTestRec = LayerMess RDSTestRec = LayerMess RDSTestRec = PSNLayerData RDSTestRec = PSNLayerData RDSTestRec = PSNLayerData RDSTestRec = PSNLayerData RDSTestRec = WaferSize RDSTestRec = SubOrientation FOR A = 11 TO 19 RDSTestRec = SpecLayerData NEXT A FOR A = 24 TO 32 RDSTestRec = SpecLayerData NEXT A FOR A = 37 TO 45 RDSTestRec = SpecLayerData NEXT A FOR A = 50 to 58 RDSTestRec = SpecLayerData NEXT A RTKey = NextKey('RDS_TEST') RTParms = 'RDS_TEST':@RM:RTKey END ELSE RTKey = RDSLayerRec RTParms = 'RDS_TEST':@RM:RTKey RDSTestRec = obj_Tables('ReadRec',RTParms) ;* Try reading record END * Update results data in Metrology record SheetRHOReads = LayerMess ThicknessReads = LayerMess CONVERT @SVM TO @VM IN SheetRHOReads CONVERT @SVM TO @VM IN ThicknessReads A1 = SheetRHOReads RDSTestRec = ICONV(OCONV(SheetRHOReads,'MD2'),'MD3') RDSTestRec = ThicknessReads RDSTestRec = LayerMess RDSTestRec = LayerMess RDSTestRec = LayerMess RDSTestRec = LayerMess RDSTestRec = LayerMess IF ResUnits = SHEETRHO_SPEC_UNITS$ THEN RDSTestRec = LayerMess RDSTestRec = LayerMess RDSTestRec = LayerMess RDSTestRec = LayerMess RDSTestRec = LayerMess RDSTestRec = '' RDSTestRec = '' RDSTestRec = '' RDSTestRec = '' RDSTestRec = '' END ELSE RDSTestRec = '' RDSTestRec = '' RDSTestRec = '' RDSTestRec = '' RDSTestRec = '' RDSTestRec = LayerMess RDSTestRec = LayerMess RDSTestRec = LayerMess RDSTestRec = LayerMess RDSTestRec = LayerMess END * GOSUB LoadTestWafers RDSTestRec = obj_RDS_Test('CalcMissing',RDSTestRec) END * Write and unlock the RDS_Layer Record RLParms = FieldStore(RLParms, @RM, 4, 1, RDSLayerRec) obj_Tables('WriteRec',RLParms) * Write and unlock the RDS_Test Record RTParms = FieldStore(RTParms, @RM, 4, 1, RDSTestRec) obj_Tables('WriteRec',RTParms) NEXT I RETURN * * * * * * * LoadTestWafers: * * * * * * * TWLine = 0 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