COMPILE FUNCTION obj_RDS_Layer(Method,Parms) /* Methods for RDS Layer (RDS_LAYER) table 03/01/2006 JCH - Initial Coding Properties: Methods: Create() ;* Creates New Records */ #pragma precomp SRP_PreCompiler DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, ErrMsg, Logging_Services, Environment_Services DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, Dialog_Box, obj_WO_Log, NextKey, Logging_Services DECLARE FUNCTION obj_Prod_Spec, obj_RDS_Test, obj_Recipe, Tool_Parms_Services, Database_Services, Environment_Services $INSERT MSG_EQUATES $INSERT RDS_EQU $INSERT RDS_LAYER_EQUATES $INSERT RDS_TEST_EQUATES $INSERT PRS_LAYER_EQU $INSERT PROD_SPEC_EQUATES $INSERT QUOTE_SPEC_EQU $INSERT RECIPE_EQU $INSERT RECIPE_PARMS_EQU $INSERT DICT_EQUATES $INSERT TOOL_PARMS_EQUATES EQU CRLF$ TO \0D0A\ ErrTitle = 'Error in Stored Procedure "obj_RDS_Layer"' 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 = 'Create' ; GOSUB Create CASE Method = 'Delete' ; GOSUB Delete CASE Method = 'OutOfSpec' ; GOSUB OutOfSpec CASE Method = 'Complete' ; GOSUB Complete CASE Method = 'UpdateLimits' ; GOSUB UpdateLimits CASE 1 ErrorMsg = 'Unknown Method ':QUOTE(Method):' passed to routine.' END CASE IF ErrorMsg NE '' THEN Set_Status(-1,ErrTitle:@SVM:ErrorMsg) RETURN '' END RETURN Result * * * * * * * Create: * * * * * * * RDSNo = Parms[1,@RM] LayerSet = Parms[COL2()+1,@RM] PSNId = Parms[COL2()+1,@RM] NoCombinedLayerSetFlag = Parms[COL2()+1,@RM] IF RDSNo = '' THEN ErrorMsg = 'Null parameter "RDSNo" passed to routine (':Method:').' IF LayerSet = '' THEN ErrorMsg = 'Null parameter "LayerSet" passed to routine (':Method:').' IF PSNId = '' THEN ErrorMsg = 'Null parameter "PSNId" passed to routine (':Method:').' IF ErrorMsg NE '' THEN RETURN PSNRec = XLATE('PROD_SPEC',PSNId,'','X') IF PSNRec = '' THEN ErrorMsg = 'Invalid PSNId ':QUOTE(PSNId):' passed to routine (':Method:').' RETURN END BEGIN CASE CASE LayerSet = 'L1' ; LayerNo = 1 ;* This is needed to deal with the incorrect data layouts in the old system CASE LayerSet = 'L2' ; LayerNo = 2 CASE LayerSet = '2' ; LayerNo = 3 CASE LayerSet = 'L3' ; LayerNo = 4 CASE LayerSet = '3' ; LayerNo = 5 CASE LayerSet = 'L4' ; LayerNo = 6 CASE LayerSet = '4' ; LayerNo = 7 END CASE IF NoCombinedLayerSetFlag THEN LayerNo = LayerSet EpiLayers = PSNRec CONVERT CHAR(248) TO @RM IN EpiLayers CONVERT @VM TO @FM IN EpiLayers CONVERT @SVM TO @VM IN EpiLayers CONVERT '~' TO @VM IN EpiLayers FirstLayer = FIELD(EpiLayers,@RM,1,1) RecipeNo = FirstLayer EpiLayer = FIELD(EpiLayers,@RM,LayerNo,1) RDSLayerRec = '' *RDSLayerRec = PSNRec ;* Added 4/19/2010 JCH for HTR IGBT runs IF INDEX(LayerSet,'L',1) OR NoCombinedLayerSetFlag THEN IF NoCombinedLayerSetFlag THEN LayerLimits = obj_Recipe('GetLimits',RecipeNo:@RM:PSNId:@RM:'L':LayerNo) END ELSE LayerLimits = obj_Recipe('GetLimits',RecipeNo:@RM:PSNId:@RM:LayerSet) END RDSLayerRec = RecipeNo RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits END obj_Tables('WriteRec','RDS_LAYER':@RM:RDSNo:'*':LayerSet:@RM:@RM:RDSLayerRec) RETURN * * * * * * * Delete: * * * * * * * LayerKeys = Parms[1,@RM] IF LayerKeys = '' THEN RETURN CONVERT @VM:@SVM TO @FM:@FM IN LayerKeys OPEN 'RDS_LAYER' TO RDSLayerFile THEN KeyCnt = COUNT(LayerKeys,@FM) + (LayerKeys NE '') FOR I = 1 TO KeyCnt DELETE RDSLayerFile,LayerKeys ELSE NULL NEXT I END RETURN * * * * * * * OutOfSpec: * * * * * * * RDSLayerKey = Parms[1,@RM] RDSLayerRec = Parms[COL2()+1,@RM] IF RDSLayerKey = '' THEN ErrorMsg = 'Null parameter "RDSLayerKey" passed to routine (':Method:').' IF ErrorMsg NE '' THEN RETURN IF RDSLayerRec = '' THEN RDSLayerRec = XLATE('RDS_LAYER',RDSLayerKey,'','X') IF RDSLayerRec = '' THEN RETURN END EpiTime = RDSLayerRec Diluent = RDSLayerRec DopantFlow = RDSLayerRec HCLFlow = RDSLayerRec BakeTime = RDSLayerRec EpiH2Flow = RDSLayerRec TCSFlow = RDSLayerRec DCSFLow = RDSLayerRec Aux1 = RDSLayerRec Aux2 = RDSLayerRec FOffset = RDSLayerRec SOffset = RDSLayerRec ROffset = RDSLayerRec SuscEtch = RDSLayerRec Etch1 = RDSLayerRec Etch2 = RDSLayerRec Etch3 = RDSLayerRec ULTemp = RDSLayerRec IF EpiTime NE '' THEN IF EpiTime < RDSLayerRec OR EpiTime > RDSLayerRec THEN Result = 1 RETURN END END IF Diluent NE '' THEN IF Diluent < RDSLayerRec OR Diluent > RDSLayerRec THEN Result = 1 RETURN END END IF DopantFlow NE '' THEN IF DopantFlow < RDSLayerRec OR DopantFlow > RDSLayerRec THEN Result = 1 RETURN END END IF HCLFlow NE '' THEN IF HCLFlow < RDSLayerRec OR HCLFlow > RDSLayerRec THEN Result = 1 RETURN END END IF BakeTime NE '' THEN IF BakeTime < RDSLayerRec OR BakeTime > RDSLayerRec THEN Result = 1 RETURN END END IF EpiH2Flow NE '' THEN IF EpiH2Flow < RDSLayerRec OR EpiH2Flow > RDSLayerRec THEN Result = 1 RETURN END END IF TCSFlow NE '' THEN IF TCSFlow < RDSLayerRec OR TCSFlow > RDSLayerRec THEN Result = 1 RETURN END END IF DCSFlow NE '' THEN IF DCSFlow < RDSLayerRec OR DCSFlow > RDSLayerRec THEN Result = 1 RETURN END END IF Aux1 NE '' THEN IF Aux1 < RDSLayerRec OR Aux1 > RDSLayerRec THEN Result = 1 RETURN END END IF Aux2 NE '' THEN IF Aux2 < RDSLayerRec OR Aux2 > RDSLayerRec THEN Result = 1 RETURN END END IF FOffset NE '' THEN IF FOffset < RDSLayerRec OR FOffset > RDSLayerRec THEN Result = 1 RETURN END END IF SOffset NE '' THEN IF SOffset < RDSLayerRec OR SOffset > RDSLayerRec THEN Result = 1 RETURN END END IF ROffset NE '' THEN IF ROffset < RDSLayerRec OR ROffset > RDSLayerRec THEN Result = 1 RETURN END END IF SuscEtch NE '' THEN IF SuscEtch OR SuscEtch > RDSLayerRec THEN Result = 1 RETURN END END IF Etch1 NE '' THEN IF Etch1 < RDSLayerRec OR Etch1 > RDSLayerRec THEN Result = 1 RETURN END END IF Etch2 NE '' THEN IF Etch2 < RDSLayerRec OR Etch2 > RDSLayerRec THEN Result = 1 RETURN END END IF Etch3 NE '' THEN IF Etch3 < RDSLayerRec OR Etch3 > RDSLayerRec THEN Result = 1 RETURN END END IF ULTemp NE '' THEN IF ULTemp < RDSLayerRec OR ULTemp > RDSLayerRec THEN Result = 1 RETURN END END RETURN * * * * * * * Complete: * * * * * * * RDSLayerKey = Parms[1,@RM] RDSLayerRec = Parms[COL2()+1,@RM] IF RDSLayerKey = '' THEN ErrorMsg = 'Null parameter "RDSLayerKey" passed to routine (':Method:').' IF ErrorMsg NE '' THEN RETURN IF RDSLayerRec = '' THEN RDSLayerRec = XLATE('RDS_LAYER',RDSLayerKey,'','X') IF RDSLayerRec = '' THEN RETURN END EpiTime = RDSLayerRec Diluent = RDSLayerRec DopantFlow = RDSLayerRec HCLFlow = RDSLayerRec BakeTime = RDSLayerRec EpiH2Flow = RDSLayerRec TCSFlow = RDSLayerRec DCSFLow = RDSLayerRec Aux1 = RDSLayerRec Aux2 = RDSLayerRec FOffset = RDSLayerRec SOffset = RDSLayerRec ROffset = RDSLayerRec Etch1 = RDSLayerRec Etch2 = RDSLayerRec Etch3 = RDSLayerRec SuscEtch = RDSLayerRec ULTemp = RDSLayerRec Result = 1 IF EpiTime = '' AND (RDSLayerRec NE '' OR RDSLayerRec NE '' ) THEN Result = 0 RETURN END IF Diluent = '' AND (RDSLayerRec NE '' OR RDSLayerRec NE '') THEN Result = 0 RETURN END IF DopantFlow = '' AND ( RDSLayerRec NE '' OR RDSLayerRec NE '') THEN Result = 0 RETURN END IF HCLFlow = '' AND ( RDSLayerRec NE '' OR RDSLayerRec NE '') THEN Result = 0 RETURN END IF BakeTime = '' AND ( RDSLayerRec NE '' OR RDSLayerRec NE '') THEN Result = 0 RETURN END IF EpiH2Flow = '' AND ( RDSLayerRec NE '' OR RDSLayerRec NE '' ) THEN Result = 0 RETURN END IF TCSFlow = '' AND ( RDSLayerRec NE '' OR RDSLayerRec NE '' ) THEN Result = 0 RETURN END IF DCSFlow = '' AND ( RDSLayerRec NE '' OR RDSLayerRec NE '' ) THEN Result = 0 RETURN END IF Aux1 = '' AND ( RDSLayerRec NE '' OR RDSLayerRec NE '' ) THEN Result = 0 RETURN END IF Aux2 = '' AND ( RDSLayerRec NE '' OR RDSLayerRec NE '' ) THEN Result = 0 RETURN END IF FOffset = '' AND ( RDSLayerRec NE '' OR RDSLayerRec NE '' ) THEN Result = 0 RETURN END IF SOffset = '' AND ( RDSLayerRec NE '' OR RDSLayerRec NE '' ) THEN Result = 0 RETURN END IF ROffset = '' AND ( RDSLayerRec NE '' OR RDSLayerRec NE '' ) THEN Result = 0 RETURN END IF SuscEtch = '' AND ( RDSLayerRec NE '' OR RDSLayerRec NE '' ) THEN Result = 0 RETURN END IF Etch1 = '' AND ( RDSLayerRec NE '' OR RDSLayerRec NE '' ) THEN Result = 0 RETURN END IF Etch2 = '' AND ( RDSLayerRec NE '' OR RDSLayerRec NE '' ) THEN Result = 0 RETURN END IF Etch3 = '' AND ( RDSLayerRec NE '' OR RDSLayerRec NE '' ) THEN Result = 0 RETURN END IF ULTemp = '' AND (RDSLayerRec NE '' OR RDSLayerRec NE '') then Result = 0 RETURN end RETURN * * * * * * * UpdateLimits: * * * * * * * RDSNo = Parms[1,@RM] LayerSet = Parms[COL2()+1,@RM] RecipeNo = Parms[COL2()+1,@RM] IF RDSNo = '' THEN ErrorMsg = 'Null parameter "RDSNo" passed to routine (':Method:').' IF LayerSet = '' THEN ErrorMsg = 'Null parameter "LayerSet" passed to routine (':Method:').' IF ErrorMsg NE '' THEN RETURN RLKey = RDSNo:'*':LayerSet Set_Status(0) RLParms = 'RDS_LAYER':@RM:RLKey RDSLayerRec = obj_Tables('ReadOnlyRec',RLParms) IF Get_Status(errCode) THEN ErrorMsg = 'Unable to read RDS_LAYER record ':QUOTE(RLKey):' for Limits Update.' RETURN END IF RDSLayerRec = '' AND RecipeNo NE '' THEN RDSLayerRec = RecipeNo ;* Added 8/24/2012 JCH END RecipeNo = RDSLayerRec WOStepKey = XLATE('RDS',RDSNo,RDS_WO_STEP_KEY$,'X') PSNId = XLATE('WO_STEP',WOStepKey,1,'X') IF INDEX(LayerSet,'L',1) THEN LayerLimits = obj_Recipe('GetLimits',RecipeNo:@RM:PSNId:@RM:LayerSet) RDSLayerRec = RecipeNo RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits RDSLayerRec = LayerLimits END RLParms = FieldStore(RLParms, @RM, 4, 1, RDSLayerRec) obj_Tables('WriteOnlyRec',RLParms) RETURN