COMPILE FUNCTION obj_Prod_Spec(Method,Parms) /* Methods for Prod_Spec original product specification table Used to wrap messy original file in something cleaner while working on a transistion 08/08/2004 JCH - Initial Coding 06/13/24 djm Add support for EPP signature profile. Properties: Methods: GetLayerProp(PSNo,LayerSet) SpecType(PSNo) */ #pragma precomp SRP_PreCompiler DECLARE FUNCTION Get_Status, Msg, Utility, obj_Tables, Dialog_Box, OBJ_POPUP DECLARE SUBROUTINE Set_Status, Msg, obj_Tables, Make.List, Btree.Extract, ErrMsg, obj_Epi_Part, obj_Cust_Epi_Part, obj_PRS_Stage DECLARE SUBROUTINE Send_Dyn, Update_Index $INSERT MSG_EQUATES $INSERT POPUP_EQUATES $INSERT PROD_SPEC_EQUATES $INSERT QUOTE_SPEC_EQU $INSERT PRS_LAYER_EQU $INSERT PROD_VER_EQUATES $INSERT PRS_LAYER_EQUATES $INSERT PRS_PROP_EQUATES $INSERT PRS_STAGE_EQUATES $INSERT RECIPE_EQUATES $INSERT RECIPE_LAYER_INFO_EQU ;* Used with LAYER_INFO field rathole data in the RECIPE table $INSERT QA_MET_EQUATES ;* Used in GetQAMet return data structure $INSERT LOGICAL EQU LS_ID$ TO 1 ;* Use these equates for the PRS_LAYER records until converstion is done and PRS_LAYER_EQU can go away. EQU LAYER_TYPE$ TO 2 EQU RECIPE$ TO 3 EQU UNIT$THICK TO CHAR(230):'m' ;* Microns EQU UNIT$THICKA TO CHAR(143) ;* Angstroms EQU UNIT$RES TO CHAR(234):'-cm' ;* Ohms.Cm EQU UNIT$SRES TO CHAR(234):'/':CHAR(220) ;* Ohms/Square EQU UNIT$CRES TO CHAR(234):'-cm' ;* Ohms.Cm EQU UNIT$CONC TO 'CM-3' ;* Carriers.Cubic Centimeter EQU UNIT$STRESS TO 'dyne/cm-2' ;* Dyne/Square Centimeter EQU UNIT$BOW TO CHAR(230):'m' ;* Microns EQU UNIT$TRANS TO CHAR(230):'m' ;* Microns EQU MET_PROP$CODE TO 1 ;* Used with MET_PROPERTY popup contents EQU MET_PROP$PROPERTY TO 2 EQU MET_PROP$IN_CONV TO 3 EQU MET_PROP$OUT_CONV TO 4 EQU MET_PROP$SYMBOL TO 5 EQU MET_PROP$UNITS TO 6 ErrTitle = 'Error in Stored Procedure "obj_Prod_Spec"' 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 = 'GetSpec' ; GOSUB GetSpec CASE Method = 'GetProp' ; GOSUB GetProp CASE Method = 'GetLayerProp' ; GOSUB GetLayerProp CASE Method = 'SpecType' ; GOSUB SpecType CASE Method = 'Quotes' ; GOSUB Quotes CASE Method = 'GetSubSupplier' ; GOSUB GetSubSupplier CASE Method = 'CheckLastActivity' ; GOSUB CheckLastActivity CASE Method = 'GetSigProfile' ; GOSUB GetSigProfile CASE Method = 'GetRunSigProfile' ; GOSUB GetRunSigProfile CASE Method = 'GetWfrSigProfile' ; GOSUB GetWfrSigProfile CASE Method = 'GetCIProfile' ; GOSUB GetCIProfile CASE Method = 'AvailMUWafers' ; GOSUB AvailMUWafers CASE Method = 'PartNos' ; GOSUB PartNos CASE Method = 'PSNId' ; GOSUB PSNId CASE Method = 'GetStage' ; GOSUB GetStage CASE Method = 'PushSplit' ; GOSUB PushSplit CASE Method = 'ProdVerSortKeys' ; GOSUB ProdVerSortKeys CASE Method = 'PushTech' ; GOSUB PushTech CASE Method = 'StageSortKeys' ; GOSUB StageSortKeys CASE Method = 'CEPSortKeys' ; GOSUB CEPSortKeys CASE Method = 'Duplicate' ; GOSUB Duplicate CASE Method = 'GetQAMet' ; GOSUB GetQAMet CASE 1 END CASE IF ErrorMsg NE '' THEN Set_Status(-1,ErrTitle:@SVM:ErrorMsg) RETURN '' END RETURN Result * * * * * * * GetSpec: * * * * * * * PSNo = Parms[1,@RM] PSRec = Parms[COL2()+1,@RM] ;* LayerNo = Parms[COL2()+1,@RM] ;* Pass Null for all Layers PropCode = Parms[COL2()+1,@RM] ;* Pass Property Code or pass as null for Fields in the PRS_LAYER table FieldNo = Parms[COL2()+1,@RM] ;* Pass FieldNo as an equate IF PSNo = '' THEN RETURN IF PSRec = '' THEN PSRec = XLATE('PROD_SPEC',PSNo,'','X') END IF PSRec = '' THEN RETURN LayerKeys = PSRec LayerCnt = COUNT(LayerKeys,@VM) + (LayerKeys NE '') FOR I = 1 TO LayerCnt LayerKey = LayerKeys<1,I> IF PropCode NE '' THEN PropVal = ICONV(XLATE('PRS_PROP',LayerKey:'*':PropCode,FieldNo,'X'),'[MET_PROP_CONV,':PropCode:']') Result<1,I> = OCONV( PropVal,'[MET_PROP_CONV,':PropCode:']') END ELSE LayerRec = XLATE('PRS_LAYER',LayerKey,'','X') Result = LayerRec END NEXT I RETURN * * * * * * * GetProp: * * * * * * * PSNo = Parms[1,@RM] PSRec = Parms[COL2()+1,@RM] DictFieldName = Parms[COL2()+1,@RM] IF PSNo = '' THEN RETURN IF PSRec = '' THEN PSRec = XLATE('PROD_SPEC',PSNo,'','X') END IF PSRec = '' THEN RETURN PropCds = obj_Popup('AllCodes','MET_PROPERTY') PropCd = DictFieldName[1,'_'] IF PropCd = 'CON' THEN PropCd = 'CONC' LOCATE PropCd IN PropCds USING @VM SETTING Pos THEN DictFieldName[1,COL2()] = '' LayerNo = DictFieldName[-1,'B_'] DictFieldName[COL1(),COL2()] = '' IF DictFieldName = 'MIN' OR DictFieldName = 'MAX' THEN DictfieldName = 'RAW_':DictFieldName END IF LayerNo[1,1] _eqc 'A' THEN * All Layers LSKeys = PSRec lsCnt = COUNT(LSKeys,@VM) + (LSKeys NE '') FOR I = 1 TO lsCnt LSKey = LSKeys<1,I> Val = XLATE('PRS_PROP',LSKey:'*':PropCd,DictFieldName,'X') Result<1,I> = OCONV(Val,'[MET_PROP_CONV,':PropCd:']') NEXT I END ELSE * Single Layer CONVERT 'L' TO '' IN LayerNo Val = XLATE('PRS_PROP',PSNo:'*':LayerNo:'*':PropCd,DictFieldName,'X') Result = OCONV(Val,'[MET_PROP_CONV,':PropCd:']') END END ;* End of check for Met Property code in the first postion RETURN * * * * * * * GetLayerProp: * * * * * * * PSNo = Parms[1,@RM] LayerSets = Parms[COL2()+1,@RM] ;* @VM Delimited list of LayerSets - Returns all layers if passed null NoConversion = Parms[COL2()+1,@RM] ;* Don't do output conversion IF PSNo = '' THEN RETURN PSRec = XLATE('PROD_SPEC',PSNo,'','X') IF PSRec = '' THEN Return EpiLayers = PSRec<15> CONVERT CHAR(248) TO @RM IN EpiLayers CONVERT @VM TO @FM IN EpiLayers CONVERT @SVM TO @VM IN EpiLayers CONVERT '~' TO @VM IN EpiLayers SpecAddtls = PSRec<25> CONVERT CHAR(248) TO @RM IN SpecAddtls CONVERT @VM TO @FM IN SpecAddtls CONVERT @SVM TO @VM IN SpecAddtls CONVERT '~' TO @VM IN SpecAddtls CompResult = '' LayerCount = COUNT(EpiLayers,@RM) + (EpiLayers NE '') FOR I = 1 TO LayerCount EpiLayer = FIELD(EpiLayers,@RM,I,1) SpecAddtl = FIELD(SpecAddtls,@RM,I,1) BEGIN CASE CASE I = 1 Layer = 'L1' CASE I = 2 IF LayerCount = 3 THEN Layer = 'L2' END ELSE Layer = '2' END CASE I = 3 ; Layer = '2' CASE 1 ; Layer = I-1 END CASE ResultLine = '' Dopant = EpiLayer<10> Recipe = EpiLayer<11> RecipeName = EpiLayer<12> ConcMin = EpiLayer<1,1> ;* This could have @SVM's in it - (old stuff-not used anymore) ConcMax = EpiLayer<2,1> ;* This could have @SVM's in it - (old stuff-not used anymore) ConcUnits = EpiLayer<3> ConcMeasure = EpiLayer<15> ;* This is a measurment data structure ResMin = EpiLayer<4> ResMax = EpiLayer<5> ResUnits = EpiLayer<6> ResMeasure = EpiLayer<14> ;* This is a measurment data structure ThickMin = EpiLayer<7> ThickMax = EpiLayer<8> ThickUnits = EpiLayer<9> ThickMeasure = Epilayer<13> ;* This is a measurment data structure CResMin = Epilayer<16> ;* CRes Added 4/9/2009 JCH CResMax = Epilayer<17> CresUnits = Epilayer<18> CResMeasure = Epilayer<19> ;* This is a measurment data structure CResPhaseMin = Epilayer<20> StressMin = SpecAddtl StressMax = SpecAddtl StressMeasure = SpecAddtl ;* This is a measurment data structure TransSpec = SpecAddtl TransMeasure = SpecAddtl ;* This is a measurment data structure ResultLine = Dopant ResultLine = Recipe ResultLine = RecipeName IF NoConversion THEN ResultLine = ConcMin ResultLine = ConcMax END ELSE ResultLine = OCONV(ConcMin,'MS21') ResultLine = OCONV(ConcMax,'MS21') END ResultLine = ConcUnits ResultLine = ConcMeasure * CRes Added 4/9/2009 JCH IF NoConversion THEN ResultLine = CResMin ResultLine = CResMax END ELSE ResultLine = OCONV(CResMin,'MD3') ResultLine = OCONV(CResMax,'MD3') END ResultLine = CResUnits ResultLine = CResMeasure ResultLine = CResPhaseMin IF NoConversion THEN ResultLine = ResMin ResultLine = ResMax END ELSE ResultLine = OCONV(ResMin,'MD3') ResultLine = OCONV(ResMax,'MD3') END ResultLine = ResUnits ResultLine = ResMeasure IF NoConversion THEN ResultLine = ThickMin ResultLine = ThickMax END ELSE ResultLine = OCONV(ThickMin,'MD3') ResultLine = OCONV(ThickMax,'MD3') END ResultLine = ThickUnits ResultLine = ThickMeasure ResultLine = StressMin ResultLine = StressMax ResultLine = StressMeasure ResultLine = TransSpec ResultLine = TransMeasure ConcMin = ICONV(ConcMin,'MS') ConcMax = ICONV(ConcMax,'MS') IF ConcMin NE '' AND ConcMax NE '' THEN IF NUM(ConcMin) AND NUM(ConcMax) THEN IF ConcMin = ConcMax THEN ConcTarget = ConcMin END ELSE ConcDelta = INT((ConcMax - ConcMin)/2) ConcTarget = (ConcMin + ConcDelta) END IF NoConversion THEN ResultLine = ConcTarget END ELSE ResultLine = OCONV(ConcTarget,'MS21') END END END * CRes Added 4/9/2009 JCH IF CResMin NE '' AND CResMax NE '' THEN IF NUM(CResMin) AND NUM(CResMax) THEN IF CResMin = CResMax THEN CResTarget = CResMin END ELSE CResDelta = INT((CResMax - CResMin)/2) CResTarget = (CResMin + CResDelta) END IF NoConversion THEN ResultLine = CResTarget END ELSE ResultLine = OCONV(CResTarget,'MD3') END END END IF ResMin NE '' AND ResMax NE '' THEN IF NUM(ResMin) AND NUM(ResMax) THEN IF ResMin = ResMax THEN ResTarget = ResMin END ELSE ResDelta = INT((ResMax - ResMin)/2) ResTarget = (ResMin + ResDelta) END IF NoConversion THEN ResultLine = ResTarget END ELSE ResultLine = OCONV(ResTarget,'MD3') END END END IF ThickMin NE '' AND ThickMax NE '' THEN IF NUM(ThickMin) AND NUM(ThickMax) THEN IF ThickMin = ThickMax THEN ThickTarget = ThickMin END ELSE ThickDelta = INT((ThickMax - ThickMin)/2) ;* Same as above ThickTarget = (ThickMin + ThickDelta) END IF NoConversion THEN ResultLine = ThickTarget END ELSE ResultLine = OCONV(ThickTarget,'MD2') END END END IF LayerSets = '' THEN CompResult := Layer:@FM:ResultLine:@RM END ELSE LOCATE Layer IN LayerSets USING @VM Setting Pos THEN CompResult := Layer:@FM:ResultLine:@RM END END NEXT I IF CompResult[-1,1] = @RM THEN CompResult[-1,1] = '' Result = CompResult RETURN * * * * * * * SpecType: * * * * * * * PSNo = Parms[1,@RM] IF NOT(ASSIGNED(PSNo)) THEN RETURN IF PSNo = '' THEN RETURN PSRec = XLATE('PROD_SPEC',PSNo,'','X') PSStatus = PSRec IF PSStatus = 'I' THEN RETURN ;* Return null - Specification is inactive END IF PSRec = '' THEN ErrorMsg = 'No PROD_SPEC record found for PSNo ':QUOTE(PSNo):'. (':Method:')' RETURN END SpecAddtls = PSRec<25> NumSigs = DCount(PSRec, @VM) CurrMode = PSRec * ProdSig = PSRec * QualSig = PSRec * PreProdSig = PSRec * PreQualSig = PSRec BEGIN CASE Case CurrMode EQ 'U' StatText = 'PreQualification' Case CurrMode EQ 'Q' StatText = 'Qualification' Case CurrMode EQ 'E' StatText = 'PreProduction' Case CurrMode EQ 'P' StatText = 'Production' Case Otherwise$ StatText = 'Setup' End Case Result = StatText Return * CASE ProdSig NE '' * StatText = 'Production' * * CASE PreProdSig NE '' * StatText = 'PreProduction' * * CASE QualSig NE '' * StatText = 'Qualification' * * CASE PreQualSig NE '' * StatText = 'PreQualification' * * * * * * * Quotes: * * * * * * * PSNo = Parms[1,@RM] IF NOT(ASSIGNED(PSNo)) THEN RETURN IF PSNo = '' THEN RETURN OPEN 'DICT.QUOTE' TO DictVar ELSE ErrorMsg = 'Unable to open "DICT.QUOTE" in routine.' RETURN END SearchString = 'PROC_STEP_PSN':@VM:PSNo:@FM QuoteNos = '' Btree.Extract(SearchString,'QUOTE',DictVar,QuoteNos,'',Flag) errCode = '' IF Get_Status(errCode) THEN DEBUG FOR I = 1 TO COUNT(QuoteNos,@VM) + (QuoteNos NE '') QuoteNo = QuoteNos<0, I> LOCATE QuoteNo IN Result BY 'AR' USING @VM SETTING Pos ELSE Result = INSERT(Result,1,Pos,0,QuoteNo) END NEXT I RETURN * * * * * * * GetSubSupplier: * * * * * * * PSNo = Parms[1,@RM] SubPartNo = Parms[COL2()+1,@RM] IF PSNo = '' THEN RETURN IF SubPartNo = '' THEN RETURN PSRec = XLATE('PROD_SPEC',PSNo,'','X') SubPartNos = PSRec SubSuppliers = PSRec LOCATE SubPartNo IN SubPartNos USING @VM SETTING Pos THEN Result = SubSuppliers<1,Pos> END RETURN * * * * * * * CheckLastActivity: * * * * * * * Days = Parms[1,@RM] PSNo = Parms[COL2()+1,@RM] * Checks for activity in the last N days IF PSNo = '' THEN RETURN IF Days = '' THEN RETURN OPEN 'DICT.WO_LOG' TO DictVar ELSE RETURN SearchString = 'PS_NO':@VM:'[':PSNo:']':@FM SearchString := 'ENTRY_DATE':@VM:'>=':OConv(DATE()-Days, 'D4/'):@FM Option = '' Flag = '' Keys = '' Btree.Extract(SearchString, 'WO_LOG', Dictvar, Keys, Option, Flag) IF Keys NE '' THEN Result = 1 Return * * * * * * * GetWfrSigProfile: * * * * * * * PSNo = Parms[1,@RM] PSRec = Parms[COL2()+1,@RM] IF PSNo = '' THEN RETURN IF PSRec = '' THEN PSRec = XLATE('PROD_SPEC',PSNo,'','X') END IF PSRec = '' THEN Return GOSUB GetStage StageKeys = Result<2> Result = '' SWAP PSNo:'*' WITH '' IN StageKeys Result = StageKeys RETURN * * * * * * * GetRunSigProfile: * * * * * * * PSNo = Parms[1,@RM] PSRec = Parms[COL2()+1,@RM] IF PSNo = '' THEN RETURN IF PSRec = '' THEN PSRec = XLATE('PROD_SPEC',PSNo,'','X') END IF PSRec = '' THEN Return GOSUB GetStage StageKeys = Result<1> Result = '' SWAP PSNo:'*' WITH '' IN StageKeys Result = StageKeys RETURN * * * * * * * GetSigProfile: * * * * * * * PSNo = Parms[1,@RM] PSRec = Parms[COL2()+1,@RM] WOMatKey = Parms[COL2()+1,@RM] RDSNo = Parms[COL2()+1,@RM] IF PSNo = '' THEN RETURN IF PSRec = '' THEN PSRec = XLATE('PROD_SPEC',PSNo,'','X') END IF PSRec = '' THEN Return ReactorType = PSRec Sigs = '' Begin CASE Case ReactorType = 'P' OR ReactorType = 'EPP' /* * * * * * * * * * * * * * * * * * * * * No signatures on the inbound material * * * * * * * * Sigs<1,-1> = 'MI_VER' * * WM_IN Cleaning and Inspection * * SCSubOxide = PSRec SCAngstroms = PSRec SCTool = PSRec SCToolRecipe = PSRec IF SCTool[1,2] _EQC 'NO' THEN SCTool = '' IF SCToolRecipe[1,2] _EQC 'NO' THEN SCToolRecipe = '' SBrightLight = PSRec SMicroscope = PSRec SSurfscan = PSRec SSurfscanRecipe = PSRec IF SCSubOxide = 1 OR SCAngstroms NE '' OR SCTool NE '' OR SCToolRecipe NE '' THEN Sigs<1,-1> = 'MI_PREC' IF SBrightLight = 1 OR SMicroscope = 1 THEN Sigs<1,-1> = 'MI_PREI' IF SSurfscan = 1 OR SSurfscanRecipe NE '' THEN Sigs<1,-1> = 'MI_PRES' * * Reactor Run Sigs<1,-1> = 'RN_LOAD' Sigs<1,-1> = 'RN_UNLOAD' * * First/Last Wafer Cleaning and Inspection * * Spec_FWI_LWI = PSRec ;* FWI OR LWI SCTool = PSRec SCToolRecipe = PSRec IF SCTool[1,2] _EQC 'NO' THEN SCTool = '' IF SCToolRecipe[1,2] _EQC 'NO' THEN SCToolRecipe = '' SBrightLight = PSRec SMicroscope = PSRec SSurfscan = PSRec SSurfscanRecipe = PSRec IF SCTool NE '' OR SCToolRecipe NE '' THEN Sigs<1,-1> = 'RN_WFRC' IF SBrightLight = 1 OR SMicroscope = 1 THEN Sigs<1,-1> = 'RN_WFRI' IF SSurfscan = 1 OR SSurfscanRecipe NE '' THEN Sigs<1,-1> = 'RN_WFRS' *Sigs<1,-1> = 'PVER' ;************ This is conditional from somewhere */ * * WM_OUT - Cleaning and Inspection * * If RDSNo NE '' then Sigs<1,-1> = 'VER' * * Pre Epi Cleaning and Inspection * * StageRec = XLATE('PRS_STAGE',PSNo:'*PRE','','X') ;* 1/15/2013 JCH ********** IF StageRec = 1 THEN Sigs<1,-1> = 'PREC' IF StageRec = 1 THEN Sigs<1,-1> = 'PREI' IF StageRec = 1 THEN Sigs<1,-1> = 'PRES' Sigs<1,-1> = 'LOAD' * * First Wafer Inspection and Surfscan * * StageRec = XLATE('PRS_STAGE',PSNo:'*FWI','','X') ;* 1/15/2013 JCH ********** IF StageRec = 1 THEN Sigs<1,-1> = 'FWII' IF StageRec = 1 THEN Sigs<1,-1> = 'FWIS' Sigs<1,-1> = 'UNLOAD' * * Last Wafer Inspection and Surfscan ****************** ;* 1/15/2013 JCH ********** StageRec = XLATE('PRS_STAGE',PSNo:'*LWI','','X') ;* 1/15/2013 JCH ********** InspReq = True$ InspSig = '' // Old records may have more than one RDS If RowExists('RDS', RDSNo) then LWICINo = Xlate('RDS', RDSNo, 'LWI_CI_NO', 'X')<0, 1> InspInterval = Xlate('CLEAN_INSP', LWICINo, 'INSP_INTERVAL', 'X')<0, 1> If InspInterval NE '' then // Use the stored interval StageKey = PSNo:'*LWI' WONo = Field(WOMatKey, '*', 1)<0, 1> WOQty = Xlate('WO_LOG', WONo, 'QTY', 'X')<0, 1> RunNo = Xlate('RDS', RDSNo, 'RUN_ORDER_NUM', 'X')<0, 1> LastRun = ( (RunNo * 25) EQ WOQty ) InspReq = ( (Mod((RunNo - 1), InspInterval) EQ 0) or LastRun ) end else // Use the current PRS_STAGE interval InspReq = Xlate('CLEAN_INSP', LWICINo, 'INSP_REQ', 'X') end InspReq = Xlate('CLEAN_INSP', LWICINo, 'SPEC_INSP_REQ', 'X') If InspReq EQ '' then InspReq = Xlate('CLEAN_INSP', LWICINo, 'INSP_REQ', 'X') InspReq = Xlate('CLEAN_INSP', LWICINo, 'INSP_REQ', 'X') InspSig = Xlate('CLEAN_INSP', LWICINo, 'INSP_SIG', 'X') end If ( (StageRec = 1) and ( (InspReq EQ True$) or (InspSig NE '') ) ) then Sigs<1,-1> = 'LWII' end IF StageRec = 1 THEN Sigs<1,-1> = 'LWIS' * * Post Epi Clean and Inspection ****************** ;* 1/15/2013 JCH ********** StageRec = XLATE('PRS_STAGE',PSNo:'*POST','','X') ;* 1/15/2013 JCH ********** IF StageRec = 1 THEN Sigs<1,-1> = 'PSTC' IF StageRec = 1 THEN Sigs<1,-1> = 'PSTI' IF StageRec = 1 THEN Sigs<1,-1> = 'PSTS' end If WOMatKey NE '' then StageRec = XLATE('PRS_STAGE',PSNo:'*POST','','X') ;* 1/15/2013 JCH ********** IF StageRec = 1 THEN Sigs<1,-1> = 'MO_PSTC' IF StageRec = 1 THEN Sigs<1,-1> = 'MO_PSTI' IF StageRec = 1 THEN Sigs<1,-1> = 'MO_PSTS' Sigs<1,-1> = 'MO_QA' end Case ReactorType = 'GAN' Sigs<1,-1> = 'G_FQA' ;* This is the Final QA on the shipping cassette Case 1 Sigs<1,-1> = 'VER' * * Pre Epi Cleaning and Inspection * * StageRec = XLATE('PRS_STAGE',PSNo:'*PRE','','X') ;* 1/15/2013 JCH ********** IF StageRec = 1 THEN Sigs<1,-1> = 'PREC' IF StageRec = 1 THEN Sigs<1,-1> = 'PREI' IF StageRec = 1 THEN Sigs<1,-1> = 'PRES' Sigs<1,-1> = 'LOAD' * * First Wafer Inspection and Surfscan * * StageRec = XLATE('PRS_STAGE',PSNo:'*FWI','','X') ;* 1/15/2013 JCH ********** IF StageRec = 1 THEN Sigs<1,-1> = 'FWII' IF StageRec = 1 THEN Sigs<1,-1> = 'FWIS' Sigs<1,-1> = 'UNLOAD' * * Last Wafer Inspection and Surfscan ****************** ;* 1/15/2013 JCH ********** StageRec = XLATE('PRS_STAGE',PSNo:'*LWI','','X') ;* 1/15/2013 JCH ********** InspReq = True$ InspSig = '' If WOMatKey NE '' then // Old records may have more than one RDS RDSNo = Xlate('WO_MAT', WOMatKey, 'RDS_NO', 'X')<0, 1> If RowExists('RDS', RDSNo) then LWICINo = Xlate('RDS', RDSNo, 'LWI_CI_NO', 'X')<0, 1> InspInterval = Xlate('CLEAN_INSP', LWICINo, 'INSP_INTERVAL', 'X')<0, 1> If InspInterval NE '' then // Use the stored interval StageKey = PSNo:'*LWI' WONo = Field(WOMatKey, '*', 1)<0, 1> WOQty = Xlate('WO_LOG', WONo, 'QTY', 'X')<0, 1> RunNo = Xlate('RDS', RDSNo, 'RUN_ORDER_NUM', 'X')<0, 1> LastRun = ( (RunNo * 25) EQ WOQty ) InspReq = ( (Mod((RunNo - 1), InspInterval) EQ 0) or LastRun ) end else // Use the current PRS_STAGE interval InspReq = Xlate('CLEAN_INSP', LWICINo, 'INSP_REQ', 'X') end InspReq = Xlate('CLEAN_INSP', LWICINo, 'SPEC_INSP_REQ', 'X') If InspReq EQ '' then InspReq = Xlate('CLEAN_INSP', LWICINo, 'INSP_REQ', 'X') InspReq = Xlate('CLEAN_INSP', LWICINo, 'INSP_REQ', 'X') InspSig = Xlate('CLEAN_INSP', LWICINo, 'INSP_SIG', 'X') end end If ( (StageRec = 1) and ( (InspReq EQ True$) or (InspSig NE '') ) ) then Sigs<1,-1> = 'LWII' end IF StageRec = 1 THEN Sigs<1,-1> = 'LWIS' * * Post Epi Clean and Inspection ****************** ;* 1/15/2013 JCH ********** StageRec = XLATE('PRS_STAGE',PSNo:'*POST','','X') ;* 1/15/2013 JCH ********** IF StageRec = 1 THEN Sigs<1,-1> = 'PSTC' IF StageRec = 1 THEN Sigs<1,-1> = 'PSTI' IF StageRec = 1 THEN Sigs<1,-1> = 'PSTS' Sigs<1,-1> = 'QA' End CASE Result = Sigs RETURN * * * * * * * GetCIProfile: * * * * * * * PSNo = Parms[1,@RM] PSRec = Parms[COL2()+1,@RM] IF PSNo = '' THEN RETURN IF PSRec = '' THEN PSRec = XLATE('PROD_SPEC',PSNo,'','X') END IF PSRec = '' THEN Return ReactorType = PSRec Stages = '' TypeCodes = '' *IF ReactorType = 'P' OR ReactorType = 'EPP' THEN * * WM_IN Cleaning and Inspection * * SCSubOxide = PSRec SCAngstroms = PSRec SCTool = PSRec SCToolRecipe = PSRec IF SCTool[1,2] _EQC 'NO' THEN SCTool = '' IF SCToolRecipe[1,2] _EQC 'NO' THEN SCToolRecipe = '' SBrightLight = PSRec SMicroscope = PSRec SSurfscan = PSRec SSurfscanRecipe = PSRec TypeCode = '' IF SCSubOxide = 1 OR SCAngstroms NE '' OR SCTool NE '' OR SCToolRecipe NE '' THEN TypeCode := 'C' IF SBrightLight = 1 OR SMicroscope = 1 THEN TypeCode := 'I' IF SSurfscan = 1 OR SSurfscanRecipe NE '' THEN TypeCode := 'S' IF TypeCode NE '' THEN Stages<1,-1> = 'PRE' TypeCodes<1,-1> = TypeCode END * * First/Last Wafer Cleaning and Inspection * * Spec_FWI_LWI = PSRec ;* FWI OR LWI SCTool = PSRec SCToolRecipe = PSRec IF SCTool[1,2] _EQC 'NO' THEN SCTool = '' IF SCToolRecipe[1,2] _EQC 'NO' THEN SCToolRecipe = '' SBrightLight = PSRec SMicroscope = PSRec SSurfscan = PSRec SSurfscanRecipe = PSRec TypeCode = '' IF SCTool NE '' OR SCToolRecipe NE '' THEN TypeCode := 'C' IF SBrightLight = 1 OR SMicroscope = 1 THEN TypeCode := 'I' IF SSurfscan = 1 OR SSurfscanRecipe NE '' THEN TypeCode := 'S' IF TypeCode NE '' THEN Stages<1,-1> = Spec_FWI_LWI TypeCodes<1,-1> = TypeCode END * * WM_OUT - Cleaning and Inspection * * SBrightLight = PSRec SSurfscan = PSRec SSurfscanRecipe = PSRec SCTool = PSRec SCToolRecipe = PSRec IF SCTool[1,2] _EQC 'NO' THEN SCTool = '' IF SCToolRecipe[1,2] _EQC 'NO' THEN SCToolRecipe = '' TypeCode = '' IF SCTool NE '' OR SCToolRecipe NE '' THEN TypeCode := 'C' IF SSurfscan = 1 OR SSurfscanRecipe NE '' THEN TypeCode := 'I' IF SBrightLight = 1 THEN TypeCode := 'S' IF TypeCode NE '' THEN Stages<1,-1> = 'POST' TypeCodes<1,-1> = TypeCode END *END ELSE /* * * Pre Epi Cleaning and Inspection * * SCSubOxide = PSRec SCAngstroms = PSRec SCAngstroms = '' SCTool = PSRec SCToolRecipe = PSRec IF SCTool[1,2] _EQC 'NO' THEN SCTool = '' IF SCToolRecipe[1,2] _EQC 'NO' THEN SCToolRecipe = '' SBrightLight = PSRec SMicroscope = PSRec SSurfscan = PSRec SSurfscanRecipe = PSRec IF SCSubOxide = 1 OR SCAngstroms NE '' OR SCTool NE '' OR SCToolRecipe NE '' THEN Sigs<1,-1> = 'PREC' END IF SBrightLight = 1 OR SMicroscope = 1 THEN Sigs<1,-1> = 'PREI' END IF SSurfscan = 1 OR SSurfscanRecipe NE '' THEN Sigs<1,-1> = 'PRES' END Sigs<1,-1> = 'LOAD' * * First/Last Wafer Cleaning and Inspection * * Spec_FWI_LWI = PSRec ;* FWI OR LWI SBrightLight = PSRec SMicroscope = PSRec SSurfscan = PSRec SSurfscanRecipe = PSRec IF SBrightLight = 1 OR SMicroscope = 1 THEN Sigs<1,-1> = 'WFRI' END IF SSurfscan = 1 OR SSurfscanRecipe NE '' THEN Sigs<1,-1> = 'WFRS' END *Sigs<1,-1> = 'PVER' ;************ This is conditional from somewhere Sigs<1,-1> = 'UNLOAD' * * Post Epi Cleaning and Inspection * * SCTool = PSRec SCToolRecipe = PSRec IF SCTool[1,2] _EQC 'NO' THEN SCTool = '' IF SCToolRecipe[1,2] _EQC 'NO' THEN SCToolRecipe = '' SBrightLight = PSRec SSurfscan = PSRec SSurfscanRecipe = PSRec IF SCTool NE '' OR SCToolRecipe NE '' THEN Sigs<1,-1> = 'PSTC' END IF SBrightLight = 1 THEN Sigs<1,-1> = 'PSTI' END IF SSurfscan = 1 OR SSurfscanRecipe NE '' THEN Sigs<1,-1> = 'PSTS' END Sigs<1,-1> = 'QA' */ *END Result = Stages:@FM:TypeCodes RETURN * * * * * * * AvailMUWafers: * * * * * * * PSNo = Parms[1,@RM] IF PSNo = '' THEN RETURN PSRec = XLATE('PROD_SPEC',PSNo,'','X') IF PSRec = '' THEN Return ReactorType = PSRec IF ReactorType = 'P' OR ReactorType = 'EPP' THEN OPEN 'DICT.WM_OUT' TO DictVar ELSE ErrMsg('Unable to open DICT.WM_OUT in COMM_WM_OUT.') END SearchString = 'MU_PS_NO':@VM:PSNo:@FM Set_Status(0) MUWMOutIDs = "" Option = "" Flag = "" Btree.Extract(SearchString, 'WM_OUT', DictVar, MUWMOutIDs, option, flag) IF Get_Status(errCode) THEN RETURN ;* Called from dictionary Result = SUM(XLATE('WM_OUT',MUWMOutIDs,'WFRS_OUT','X')) END ELSE TableName = 'WO_MAT' OPEN 'DICT.':TableName TO DictVar ELSE ErrMsg('Unable to open DICT.':TableName:' in obj_MUWafers.') RETURN END SearchString = 'MU_PS_NO':@VM:PSNo:@FM SearchString := 'CURR_STATUS':@VM:'RTU':@FM Set_Status(0) OpenRecordIDs = "" Option = "" Flag = "" Btree.Extract(SearchString, TableName, DictVar, OpenRecordIDs, option, flag) IF Get_Status(errCode) THEN RETURN ;* Called from dictionary Result = SUM(XLATE('WO_MAT',OpenRecordIDs,'CURR_WFR_CNT','X')) END RETURN * * * * * * * PartNos: * * * * * * * PSNo = Parms[1,@RM] PSRec = Parms[COL2()+1,@RM] IF PSNo = '' THEN RETURN PSRec = XLATE('PROD_SPEC',PSNo,'','X') IF PSRec = '' THEN Return ReactType = OCONV(PSRec,'[REACT_TYPE_CONV,CODE]') SubPartNos = PSRec<97> PSNIDs = XLATE('PROD_SPEC',PSNo,'PSN_ID','X') SPNCnt = COUNT(SubPartNos,@VM) + (SubPartNos NE '') PSNIdCnt = COUNT(PSNIDs,@VM) + (PSNIDs NE '') Ans = '' FOR I = 1 TO SPNCnt SubPartNo = TRIM(SubPartNos<1,I>) CONVERT @LOWER_CASE TO @UPPER_CASE IN SubPartNo PartWorkKeys = '' FOR N = 1 TO PSNIdCnt PartWorkKeys = SubPartNo:'*':ReactType:'*':PSNIDs<1,N> NEXT N PartNos = XLATE('PART_WORK',PartWorkKeys,1,'X') CONVERT @VM TO ',' IN PartNos Ans<1,I> = PartNos NEXT I Result = Ans RETURN * * * * * * * PSNId: * * * * * * * PSNo = Parms[1,@RM] PSRec = Parms[COL2()+1,@RM] IF PSNo = '' THEN RETURN PSRec = XLATE('PROD_SPEC',PSNo,'','X') IF PSRec = '' THEN Return QuoteStatii = XLATE('PROD_SPEC',PSNo,'QUOTE_STATUS','X') QuotePSNIDs = XLATE('PROD_SPEC',PSNo,'QUOTE_PSN_ID','X') QSCnt = COUNT(QuoteStatii,@VM) + (QuoteStatii NE '') PSNIDs = '' FOR N = 1 TO QSCnt IF QuoteStatii<1,N> = 'O' THEN QuotePSNID = QuotePSNIDs<1,N> LOCATE QuotePSNID IN PSNIDs USING @VM SETTING Pos ELSE PSNIDs = INSERT(PSNIDs,1,Pos,0,QuotePSNID) END END NEXT N Result = PSNIDs RETURN * * * * * * * GetStage: * * * * * * * PSNo = Parms[1,@RM] PSRec = Parms[COL2()+1,@RM] IF PSNo = '' THEN RETURN IF PSRec = '' THEN PSRec = XLATE('PROD_SPEC',PSNo,'','X') END IF PSRec = '' THEN Return StageKeys = PSRec AllStages = obj_Popup('AllCodes','STAGE') SortedKeys = '' SortedWfrKeys = '' skCnt = COUNT(StageKeys,@VM) + (StageKeys NE '') FOR I = 1 TO skCnt StageKey = StageKeys<1,I> Stage = FIELD(StageKey,'*',2) WfrFlag = obj_Popup('CodeDesc','STAGE':@RM:Stage:@RM:4) IF WfrFlag = 1 THEN LOCATE Stage IN AllStages USING @VM SETTING Pos THEN SortedWfrKeys<1,Pos> = StageKey END END ELSE LOCATE Stage IN AllStages USING @VM SETTING Pos THEN SortedKeys<1,Pos> = StageKey END END NEXT I CONVERT @VM TO ' ' IN SortedKeys SortedKeys = TRIM(SortedKeys) CONVERT ' ' TO @VM IN SortedKeys CONVERT @VM TO ' ' IN SortedWfrKeys SortedWfrKeys = TRIM(SortedWfrKeys) CONVERT ' ' TO @VM IN SortedWfrKeys Result = SortedKeys:@FM:SortedWfrKeys RETURN * * * * * * * PushSplit: * * * * * * * * Push data to EPI_PART, CUST_EPI_PART AND PROD_VER Tables until we cut over JCH 5/26/2011 * Called as a POST WRITE event from event handler in window RETURN PSNo = Parms[1,@RM] IF PSNo = '' THEN RETURN PSRec = XLATE('PROD_SPEC',PSNo,'','X') EpiPN = '' *EpiPN = PSRec IF EpiPN NE '' THEN obj_Epi_Part('SetSubstrate',EpiPN:@RM:PSNo:@RM:PSRec) obj_Cust_Epi_Part('Convert',PSNo:@RM:PSRec) END RETURN * * * * * * * PushTech: * * * * * * * ****************************************************************************** ****************************************************************************** PSNo = Parms[1,@RM] * Added 4/2/2015 JCH * Properties and layers deleted from the rathole data are not being removed from the PRS_LAYER and PRS_PROP tables * Check keys from last push, remove newly built keys during process, anything left over -> delete from new tables OrgPRSLayerKeys = XLATE('PROD_SPEC',PSNo,PROD_SPEC_PRS_LAYER_KEY$,'X') OrgPRSPropKeys = XLATE('PRS_LAYER',OrgPRSLayerKeys,PRS_LAYER_PRS_PROP_KEY$,'X') GOSUB GetLayerProp LayerSpecs = Result Result = '' LayerCnt = COUNT(LayerSpecs,@RM) + (LayerSpecs NE '') FOR N = 1 TO LayerCnt LayerNo = N LayerSpec = FIELD(LayerSpecs,@RM,N) LSID = LayerSpec<1> LayerSpec = FIELD(LayerSpec,@FM,2,99) Dopant = LayerSpec IF LSID = 'L1' THEN Recipe = LayerSpec END IF NUM(LSID) THEN LSType = 'CMB' Recipe = '' END ELSE LSType = 'DEP' END PRSLayerKey = PSNo:'*':LayerNo PRSLayerRec = LSID:@FM:LSType:@FM:Recipe LOCATE PRSLayerKey IN OrgPRSLayerKeys USING @VM SETTING Pos THEN OrgPRSLayerKeys = DELETE(OrgPRSLayerKeys,1,Pos,0) END OtParms = 'PRS_LAYER':@RM:PRSLayerKey:@RM:@RM:PRSLayerRec obj_Tables('WriteRec',OtParms) IF LayerSpec NE '' OR LayerSpec NE ''THEN IF LayerSpec = UNIT$THICK THEN Prop = 'THICK' END ELSE Prop = 'THICKA' END PRSPropKey = PSNo:'*':LayerNo:'*':Prop LOCATE PRSPropKey IN OrgPRSPropKeys USING @VM SETTING Pos THEN OrgPRSPropKeys = DELETE(OrgPRSPropKeys,1,Pos,0) END PRSRec = '' *PRSRec = LSID PRSRec = ICONV(LayerSpec,'MD5') PRSRec = ICONV(LayerSpec,'MD5') PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = 1 Freq = LayerSpec First = LayerSpec Last = LayerSpec BEGIN CASE CASE NUM(Freq) AND Freq NE '' PRSRec = Freq PRSRec = 1 CASE First = 1 PRSRec = 'F' PRSRec = '' CASE Last = 1 PRSRec = 'L' PRSRec = '' END CASE OtParms = 'PRS_PROP':@RM:PRSPropKey:@RM:@RM:PRSRec obj_Tables('WriteRec',OtParms) END ;* End of Thickness Property IF LayerSpec NE '' OR LayerSpec NE '' THEN Prop = '' IF LayerSpec = UNIT$RES THEN Prop = 'RES' END IF LayerSpec = UNIT$SRES THEN Prop = 'SRES' END IF Prop NE '' THEN PRSPropKey = PSNo:'*':LayerNo:'*':Prop LOCATE PRSPropKey IN OrgPRSPropKeys USING @VM SETTING Pos THEN OrgPRSPropKeys = DELETE(OrgPRSPropKeys,1,Pos,0) END PRSRec = '' *PRSRec = LSID PRSRec = ICONV(LayerSpec,'MD5') PRSRec = ICONV(LayerSpec,'MD5') PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = 1 Freq = LayerSpec First = LayerSpec Last = LayerSpec BEGIN CASE CASE NUM(Freq) AND Freq NE '' PRSRec = Freq PRSRec = 1 CASE First = 1 PRSRec = 'F' PRSRec = '' CASE Last = 1 PRSRec = 'L' PRSRec = '' END CASE OtParms = 'PRS_PROP':@RM:PRSPropKey:@RM:@RM:PRSRec obj_Tables('WriteRec',OtParms) END ELSE Send_Dyn("PSN: ":PSNo:" Prop: ":Prop:" Units: ":LayerSpec) END END ;* End of Resistivity Property IF LayerSpec NE '' OR LayerSpec NE '' THEN PRSPropKey = PSNo:'*':LayerNo:'*CRES' LOCATE PRSPropKey IN OrgPRSPropKeys USING @VM SETTING Pos THEN OrgPRSPropKeys = DELETE(OrgPRSPropKeys,1,Pos,0) END PRSRec = '' *PRSRec = LSID PRSRec = ICONV(LayerSpec,'MD5') PRSRec = ICONV(LayerSpec,'MD5') PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = 1 Freq = LayerSpec First = LayerSpec Last = LayerSpec BEGIN CASE CASE NUM(Freq) AND Freq NE '' PRSRec = Freq PRSRec = 1 CASE First = 1 PRSRec = 'F' PRSRec = '' CASE Last = 1 PRSRec = 'L' PRSRec = '' END CASE OtParms = 'PRS_PROP':@RM:PRSPropKey:@RM:@RM:PRSRec obj_Tables('WriteRec',OtParms) END ;* End of HgCvResistivity Property IF LayerSpec NE '' OR LayerSpec NE '' THEN PRSPropKey = PSNo:'*':LayerNo:'*CONC' LOCATE PRSPropKey IN OrgPRSPropKeys USING @VM SETTING Pos THEN OrgPRSPropKeys = DELETE(OrgPRSPropKeys,1,Pos,0) END PRSRec = '' *PRSRec = LSID PRSRec = ICONV(LayerSpec,'MS21') PRSRec = ICONV(LayerSpec,'MS21') PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = 1 Freq = LayerSpec First = LayerSpec Last = LayerSpec BEGIN CASE CASE NUM(Freq) AND Freq NE '' PRSRec = Freq PRSRec = 1 CASE First = 1 PRSRec = 'F' PRSRec = '' CASE Last = 1 PRSRec = 'L' PRSRec = '' END CASE OtParms = 'PRS_PROP':@RM:PRSPropKey:@RM:@RM:PRSRec obj_Tables('WriteRec',OtParms) END ;* End of Concentration Property IF LayerSpec NE '' OR LayerSpec NE '' THEN PRSPropKey = PSNo:'*':LayerNo:'*STRESS' LOCATE PRSPropKey IN OrgPRSPropKeys USING @VM SETTING Pos THEN OrgPRSPropKeys = DELETE(OrgPRSPropKeys,1,Pos,0) END SpecAddtl = XLATE('PROD_SPEC',PSNo,PROD_SPEC_SPEC_ADDTL$,'X') StressMeasure = SpecAddtl<1,QSAddStressMeasure$> PRSRec = '' *PRSRec = LSID PRSRec = ICONV(LayerSpec,'MS21') PRSRec = ICONV(LayerSpec,'MS21') PRSRec = UNIT$STRESS PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = 1 Freq = LayerSpec First = LayerSpec Last = LayerSpec BEGIN CASE CASE NUM(Freq) AND Freq NE '' PRSRec = Freq PRSRec = 1 CASE First = 1 PRSRec = 'F' PRSRec = '' CASE Last = 1 PRSRec = 'L' PRSRec = '' END CASE OtParms = 'PRS_PROP':@RM:PRSPropKey:@RM:@RM:PRSRec obj_Tables('WriteRec',OtParms) END ;* End of Stress Property IF LayerSpec NE '' OR LayerSpec NE '' THEN PRSPropKey = PSNo:'*':LayerNo:'*TRANS' LOCATE PRSPropKey IN OrgPRSPropKeys USING @VM SETTING Pos THEN OrgPRSPropKeys = DELETE(OrgPRSPropKeys,1,Pos,0) END PRSRec = '' *PRSRec = LSID PRSRec = ICONV(LayerSpec,'MD0') *PRSRec = ICONV(LayerSpec,'MD0') PRSRec = UNIT$TRANS PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = LayerSpec PRSRec = 1 Freq = LayerSpec First = LayerSpec Last = LayerSpec BEGIN CASE CASE NUM(Freq) AND Freq NE '' PRSRec = Freq PRSRec = 1 CASE First = 1 PRSRec = 'F' PRSRec = '' CASE Last = 1 PRSRec = 'L' PRSRec = '' END CASE OtParms = 'PRS_PROP':@RM:PRSPropKey:@RM:@RM:PRSRec obj_Tables('WriteRec',OtParms) END ;* End of Resistivity Property * Where is the BOW property coming from???????? NEXT N IF OrgPRSPropKeys NE '' THEN pCnt = COUNT(OrgPRSPropKeys,@VM) + (OrgPRSPropKeys NE '') FOR I = 1 TO pCnt OrgPRSPropKey = OrgPRSPropKeys<1,I> IF OrgPRSPropKey NE '' THEN otParms = 'PRS_PROP':@RM:OrgPRSPropKey obj_Tables('DeleteRec',otParms) IF Get_Status(errCode) THEN DEBUG END END NEXT I END IF OrgPRSLayerKeys NE '' THEN lCnt = COUNT(OrgPRSLayerKeys,@VM) + (OrgPRSLayerKeys NE '') FOR I = 1 TO lCnt OrgPRSLayerKey = OrgPRSLayerKeys<1,I> IF OrgPRSLayerKey NE '' THEN otParms = 'PRS_LAYER':@RM:OrgPRSLayerKey obj_Tables('DeleteRec',otParms) IF Get_Status(errCode) THEN DEBUG END END NEXT I END * obj_PRS_Stage('Convert',PSNo) ;* Dead JCH 3/11/2013 // Flush pending index transactions Update_Index("PRS_LAYER", "PRS_PROP_KEY", False$, True$) RETURN * * * * * * * ProdVerSortKeys: * * * * * * * PSNo = Parms[1,@RM] PSRec = Parms[COL2()+1,@RM] IF PSNo = '' THEN RETURN IF PSRec = '' THEN PSRec = XLATE('PROD_SPEC',PSNo,'','X') END IF PSRec = '' THEN RETURN IF PSRec NE 'A' THEN RETURN SubSuppBy = PSRec ReactType = OCONV(PSRec,'[REACT_TYPE_CONV,CODE]') ProdVerNo = XLATE('PRS_PROD_VER',PSNo,1,'X')<1,1> PSNId = XLATE('PROD_VER',ProdVerNo,PROD_VER_PROC_STEP_PSN$,'X') CONVERT @VM TO '.' IN PSNId Result = '' IF SubSuppBy = 'L' THEN * Supplied by IR SubPartNos = PSRec PNCnt = COUNT(SubPartNos,@VM) + (SubPartNos NE '') FOR I = 1 TO PNCnt Result<1,-1> = TRIM(SubPartNos<1,I>):'*':ReactType:'*':PSNId:'*' NEXT I END ELSE * Customer Supplied CustPartNos = PSRec PNCnt = COUNT(CustPartNos,@VM) + (CustPartNos NE '') FOR I = 1 TO PNCnt Result<1,-1> = '*':ReactType:'*':PSNId:'*':TRIM(CustPartNos<1,I>) NEXT I END RETURN * * * * * * * StageSortKeys: * * * * * * * IF NOT(Assigned(PSNo)) THEN PSNo = Parms[1,@RM] PSRec = Parms[COL2()+1,@RM] END IF PSNo = '' THEN RETURN IF PSRec = '' THEN PSRec = XLATE('PROD_SPEC',PSNo,'','X') END IF PSRec = '' THEN RETURN StageKeys = PSRec AllStages = obj_Popup('AllCodes','STAGE') SortedKeys = '' skCnt = COUNT(StageKeys,@VM) + (StageKeys NE '') FOR I = 1 TO skCnt StageKey = StageKeys<1,I> Stage = FIELD(StageKey,'*',2) LOCATE Stage IN AllStages USING @VM SETTING Pos THEN SortedKeys<1,Pos> = StageKey END NEXT I CONVERT @VM TO ' ' IN SortedKeys SortedKeys = TRIM(SortedKeys) CONVERT ' ' TO @VM IN SortedKeys Result = SortedKeys RETURN * * * * * * * CEPSortKeys: * * * * * * * PSNo = Parms[1,@RM] PSRec = Parms[COL2()+1,@RM] IF PSNo = '' THEN RETURN IF PSRec = '' THEN PSRec = XLATE('PROD_SPEC',PSNo,'','X') END IF PSRec = '' THEN RETURN ProdVerKeys = XLATE('PRS_PROD_VER',PSNo,1,'X') CustNos = XLATE('PROD_VER',ProdVerKeys,PROD_VER_CUST_NO$,'X') EpiParts = XLATE('PROD_VER',ProdVerKeys,PROD_VER_EPI_PART_NO$,'X') CEPKeys = '' CustCnt = COUNT(CustNos,@VM) + (CustNos NE '') FOR I = 1 TO CustCnt CEPKey = CustNos<1,I>:'*':EpiParts<1,I> LOCATE CEPKey IN CEPKeys USING @VM SETTING Pos ELSE CEPKeys = INSERT(CEPKeys,1,Pos,0,CEPKey) END NEXT I Result = CEPKeys RETURN * * * * * * * Duplicate: * * * * * * * PSNo = Parms[1,@RM] PSRec = XLATE('PROD_SPEC',PSNo,'','X') * * * Build New PROD_SPEC record from original * * * NewRec = '' NewRec = @USER4 NewRec = Date() NewRec = PSRec NewRec = PSRec NewRec = PSRec NewRec = PSRec NewRec = PSRec NewRec = PSRec NewRec = PSRec NewRec = PSRec NewRec = PSRec NewRec = PSRec NewRec = PSRec NewRec = PSRec NewRec = PSRec NewRec = PSRec NewRec = PSRec NewRec = PSRec NewRec = PSRec NewRec = PSRec NewRec = PSRec NewRec = PSRec NewRec = PSRec NewRec = PSRec NewRec = PSRec NewRec = PSRec NewRec = PSRec NewRec = PSRec NewRec = PSRec NewRec = PSRec NewPSNo = '9999' *NewPSNo = NextKey('PROD_SPEC') otParms = 'PROD_SPEC':@RM:NewPSNo:@RM:@RM:NewRec obj_Tables('WriteRec',otParms) IF Get_Status(errCode) THEN RETURN ;***** Check for error in the commuter that called this PRSLayerKeys = PSRec PRSStageKeys = PSRec NewPRSLayerKeys = PRSLayerKeys SWAP PSNo WITH NewPSNo IN NewPRSLayerKeys lCnt = COUNT(NewPRSLayerKeys,@VM) + (NewPRSLayerKeys NE '') FOR I = 1 TO lCnt PRSLayerKey = PRSLayerKeys<1,I> NewPRSLayerKey = NewPRSLayerKeys<1,I> PRSLayerRec = XLATE('PRS_LAYER',PRSLayerKey,'','X') NewLayerRec = '' NewLayerRec = PRSLayerRec NewLayerRec = PRSLayerRec NewLayerRec = PRSLayerRec otParms = 'PRS_LAYER':@RM:NewPRSLayerKey:@RM:@RM:NewLayerRec obj_Tables('WriteRec',otParms) IF Get_Status(errCode) THEN RETURN PRSPropKeys = PRSLayerRec NewPRSPropKeys = PRSPropKeys SWAP PSNo WITH NewPSNo IN NewPRSPropKeys pCnt = COUNT(NewPRSPropKeys,@VM) + (NewPRSPropKeys NE '') FOR N = 1 TO PCnt PRSPropKey = PRSPropKeys<1,N> NewPRSPropKEy = NewPRSPropKeys<1,N> PRSPropRec = XLATE('PRS_PROP',PRSPropKey, '','X') NewPropRec = '' NewPropRec = PRSPropRec NewPropRec = PRSPropRec NewPropRec = PRSPropRec NewPropRec = PRSPropRec NewPropRec = PRSPropRec NewPropRec = PRSPropRec NewPropRec = PRSPropRec NewPropRec = PRSPropRec NewPropRec = PRSPropRec NewPropRec = PRSPropRec NewPropRec = PRSPropRec otParms = 'PRS_PROP':@RM:NewPRSPropKey:@RM:@RM:NewPropRec obj_Tables('WriteRec',otParms) IF Get_Status(errCode) THEN RETURN NEXT N NEXT I NewPRSStageKeys = PRSStageKeys SWAP PSNo WITH NewPSNo IN NewPRSStageKeys sCnt = COUNT(NewPRSStageKeys,@VM) + (NewPRSStageKeys NE '') FOR I = 1 TO sCnt PRSStageKey = PRSStageKeys<1,I> NewPRSStageKey = NewPRSStageKeys<1,I> PRSStageRec = XLATE('PRS_STAGE',PRSStageKey,'','X') NewStageRec = '' NewStageRec = PRSStageRec NewStageRec = PRSStageRec NewStageRec = PRSStageRec NewStageRec = PRSStageRec NewStageRec = PRSStageRec NewStageRec = PRSStageRec NewStageRec = PRSStageRec NewStageRec = PRSStageRec NewStageRec = PRSStageRec NewStageRec = PRSStageRec NewStageRec = PRSStageRec NewStageRec = PRSStageRec NewStageRec = PRSStageRec NewStageRec = PRSStageRec NewStageRec = PRSStageRec NewStageRec = PRSStageRec NewStageRec = PRSStageRec NewStageRec = PRSStageRec NewStageRec = PRSStageRec NewStageRec = PRSStageRec NewStageRec = PRSStageRec NewStageRec = PRSStageRec NewStageRec = PRSStageRec otParms = 'PRS_STAGE':@RM:NewPRSStageKey:@RM:@RM:NewStageRec obj_Tables('WriteRec',otParms) IF Get_Status(errCode) THEN RETURN NEXT I RETURN * * * * * * * GetQAMet: * * * * * * * PSNo = Parms[1,@RM] PSRec = Parms[COL2()+1,@RM] ReactSchedFlag = Parms[COL2()+1,@RM] GOSUB StageSortKeys PSStageKeys = Result Result = '' pssCnt = COUNT(PSStageKeys,@VM) + (PSStageKeys NE '') ResLineCnt = 0 FOR N = 1 TO pssCnt PSStageKey = PSStageKeys<1,N> PSStageRec = XLATE('PRS_STAGE',PSStageKey,'','X') MetCnt = COUNT(PSStageRec,@VM) + (PSStageRec NE '') FOR TestNo = 1 TO MetCnt IF PSStageRec NE '' THEN IF ReactSchedFlag = 1 THEN IF PSStageRec = 1 THEN ResLineCnt += 1 Result = FIELD(PSStageKey,'*',2) Result = PSStageRec Result = PSStageRec Result = PSStageRec Result = PSStageRec Result = PSStageRec Result = PSStageRec Result = PSStageRec Result = PSStageRec Result = PSStageRec Result = PSStageRec Result = PSStageRec Result = PSStageRec Result = PSStageRec ;* Possible Future Result = PSStageRec ;* 12/3/2016 JCH for Mark Result = PSStageRec END END ELSE ResLineCnt += 1 Result = FIELD(PSStageKey,'*',2) Result = PSStageRec Result = PSStageRec Result = PSStageRec Result = PSStageRec Result = PSStageRec Result = PSStageRec Result = PSStageRec Result = PSStageRec Result = PSStageRec Result = PSStageRec Result = PSStageRec Result = PSStageRec Result = PSStageRec ;* Possible future Result = PSStageRec ;* 12/3/2016 JCH for Mark Result = PSStageRec END ;* End of check for ReactSchedFlag END NEXT TestNo NEXT N RETURN