Compile function SPC_Services(@Service, @Params) /*********************************************************************************************************************** This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written permission from Infineon Name : SPC_Services Description : Handler program for all module related services. Notes : The generic parameters should contain all the necessary information to process the services. Often this will be information like the data Record and Key ID. Parameters : Service [in] -- Name of the service being requested Param1-10 [in/out] -- Additional request parameter holders Response [out] -- Response to be sent back to the Controller (MCP) or requesting procedure Metadata : History : (Date, Initials, Notes) 10/24/18 djs Original programmer. - [EPIOI-8] ***********************************************************************************************************************/ #pragma precomp SRP_PreCompiler $Insert APP_INSERTS $Insert SERVICE_SETUP $Insert SPC_QUEUE_EQUATES $Insert RLIST_EQUATES $Insert RDS_LAYER_EQUATES $Insert DICT_EQUATES Declare function Database_Services, Environment_Services, Status, Error_Services, Get_Status Declare subroutine Database_Services, Set_Status, Error_Services, RList, Get_Status GoToService Return Response or "" //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Services //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //---------------------------------------------------------------------------------------------------------------------- // ProcessQueue // // Checks the SPC queue to see if any documents need to be written to the SPC directory located within the EC domain. //---------------------------------------------------------------------------------------------------------------------- Service ProcessQueue() hSysLists = Database_Services('GetTableHandle', 'SYSLISTS') Lock hSysLists, ServiceKeyID then SPCDir = Environment_Services('GetSPCDataPath') hSPCQueue = Database_Services('GetTableHandle', 'SPC_QUEUE') If Error_Services('NoError') then Set_Status(0) SelectStatement = 'SELECT SPC_QUEUE' RList(SelectStatement, 5) StatusCode = '' If Get_Status(StatusCode) Then Null end else EOF = False$ Loop Readnext SPCQueueID else EOF = True$ Until EOF Read QPCQueueRec from hSPCQueue, SPCQueueID then Filename = QPCQueueRec SPCDoc = QPCQueueRec FullDir = SPCDir:'\':Filename Set_Status(0) OSWrite SPCDoc on FullDir If Get_Status(StatusCode) then ErrMsg = 'Error writing ':Filename:' to ':SPCDir:'. Error code: ':StatusCode Error_Services('Add', ErrMsg) end else Delete hSPCQueue, SPCQueueID else ErrCode = Status() ErrMsg = 'Error deleting SPC Record ':SPCQueueID:'from queue. Error code: ':ErrCode Error_Services('Add', ErrMsg) end end end Repeat end end ClearSelect 0 Unlock hSysLists, ServiceKeyID else Null end end service //---------------------------------------------------------------------------------------------------------------------- // PostToQueue // // Posts an SPC document to the SPC Queue for processing on the EC server. //---------------------------------------------------------------------------------------------------------------------- Service PostToQueue(Tablename, KeyID) Username = @USER4 Begin Case Case Tablename _EQC 'RDS_TEST' Filename = 'SPC_Data.txt' SPCQueueKey = Date():'*':Time():'*':Username DupRequest = RowExists('SPC_QUEUE', SPCQueueKey) If DupRequest then return SPCQueueRec = '' SPCQueueRec = Filename Database_Services('ActivateRecord', Tablename, KeyID) DataLine = '' PSNo = {PS_NO} RDSNo = {RDS_NO} LSId = {LS_ID} Reactor = {REACTOR} Zone = {ZONE} ThickAvg = OConv({THICK_AVG}, 'MD2') ThickStdv = OConv({THICK_STDV}, 'MD4') SheetRhoAvg = OConv({SHEETRHO_AVG}, 'MD3') SheetRhoStdv = OConv({SHEETRHO_STDV}, 'MD4') ResAvg = OConv({RES_AVG}, 'MD4') ResStdv = Oconv({RES_STDV}, 'MD4') HgcvAvg = OConv({HGCV1_RES_AVG}, 'MD3') HgCvStdv = OConv({HGCV1_RES_STDV}, 'MD3') GrowthRate = OConv({GROWTH_RATE}, 'MD2') ThickRange = OConv({THICK_RANGE}, 'MD2') ThickRangePcnt = OConv({THICK_RANGE_PCNT}, 'MD4') SheetRhoRange = OConv({SHEETRHO_RANGE}, 'MD3') SheetRhoRangePcnt = OConv({SHEETRHO_RANGE_PCNT}, 'MD4') ResRange = OConv({RES_RANGE}, 'MD4') ResRangePcnt = OConv({RES_RANGE_PCNT}, 'MD4') Hgcv1ResRange = OConv({HGCV1_RES_RANGE}, 'MD3') Hgcv1ResRangePcnt = OConv({HGCV1_RES_RANGE_PCNT}, 'MD4') CONVERT '%' TO '' IN ThickRangePcnt CONVERT '%' TO '' IN SheetRhoRangePcnt CONVERT '%' TO '' IN ResRangePcnt CONVERT '%' TO '' IN Hgcv1ResRangePcnt IF NUM(LSId) THEN DepositTime = '' DopantFlow = '' EpiH2Flow = '' FOffset = '' ROffset= '' SOffset = '' TcsFlow = '' END ELSE LayerRec = XLATE('RDS_LAYER',RDSNo:'*':LSId,'','X') DictInfo = XLATE('DICT.RDS_LAYER','%FIELDS%','','X') LOCATE RDS_LAYER_EPI_TIME$ IN DictInfo SETTING Pos THEN DepositTime = OCONV(LayerRec,DictInfo) END ELSE DepositTime = LayerRec END LOCATE RDS_LAYER_DOPANT_FLOW$ IN DictInfo SETTING Pos THEN DopantFlow = OCONV(LayerRec,DictInfo) END ELSE DopantFlow = LayerRec END LOCATE RDS_LAYER_EPI_H2_FLOW$ IN DictInfo SETTING Pos THEN EpiH2Flow = OCONV(LayerRec,DictInfo) END ELSE EpiH2Flow = LayerRec END LOCATE RDS_LAYER_F_OFFSET$ IN DictInfo SETTING Pos THEN FOffset = OCONV(LayerRec,DictInfo) END ELSE FOffset = LayerRec END LOCATE RDS_LAYER_R_OFFSET$ IN DictInfo SETTING Pos THEN ROffset = OCONV(LayerRec,DictInfo) END ELSE ROffset = LayerRec END LOCATE RDS_LAYER_S_OFFSET$ IN DictInfo SETTING Pos THEN SOffset = OCONV(LayerRec,DictInfo) END ELSE SOffset = LayerRec END LOCATE RDS_LAYER_TCS_FLOW$ IN DictInfo SETTING Pos THEN TcsFlow = OCONV(LayerRec,DictInfo) END ELSE TcsFlow = LayerRec END END ;* End of check for Numeric Layer Set ID UserName = OCONV(Username,'[XLATE_CONV,LSL_USERS*FIRST_LAST]') DataLine = QUOTE(PSNo):TAB$ DataLine := QUOTE(RDSNo):TAB$ DataLine := QUOTE(LSId):TAB$ DataLine := QUOTE(Reactor):TAB$ DataLine := QUOTE(Zone):TAB$ DataLine := QUOTE(ThickAvg):TAB$ DataLine := QUOTE(ThickStdv):TAB$ DataLine := QUOTE(SheetRhoAvg):TAB$ DataLine := QUOTE(SheetRhoStdv):TAB$ DataLine := QUOTE(ResAvg):TAB$ DataLine := QUOTE(ResStdv):TAB$ DataLine := QUOTE(HgcvAvg):TAB$ DataLine := QUOTE(HgcvStdv):TAB$ DataLine := QUOTE(GrowthRate):TAB$ DataLine := QUOTE(DepositTime):TAB$ DataLine := QUOTE(DopantFlow):TAB$ DataLine := QUOTE(EpiH2Flow):TAB$ DataLine := QUOTE(FOffset):TAB$ DataLine := QUOTE(ROffset):TAB$ DataLine := QUOTE(SOffset):TAB$ DataLine := QUOTE(TcsFlow):TAB$ DataLine := QUOTE(UserName):TAB$ DataLine := QUOTE(ThickRange):TAB$ DataLine := QUOTE(ThickRangePcnt):TAB$ DataLine := QUOTE(SheetRhoRange):TAB$ DataLine := QUOTE(SheetRhoRangePcnt):TAB$ DataLine := QUOTE(ResRange):TAB$ DataLine := QUOTE(ResRangePcnt):TAB$ DataLine := QUOTE(Hgcv1ResRange):TAB$ DataLine := QUOTE(Hgcv1ResRangePcnt):TAB$ SPCQueueRec = DataLine:CRLF$ Database_Services('WriteDataRow', 'SPC_QUEUE', SPCQueueKey, SPCQueueRec, True$, False$, True$) Case Tablename _EQC 'NCR' Filename = 'NCR_Data.txt' SPCQueueKey = Date():'*':Time():'*':@USER4 DupRequest = RowExists('SPC_QUEUE', SPCQueueKey) If DupRequest then return SPCQueueRec = '' SPCQueueRec = Filename Database_Services('ActivateRecord', TableName, KeyID) DataLine = '' NCRNo = KeyID CustName = {CUST_NAME} PSNo = {PROD_SPEC_NO} RDSIDs = {RDS_ID} RDSReactors = {REACTOR} RejCnt = {REJ_CNT} DeptResp = {DEPT_RESP} LossCode = {LOSS_CODE} LossDesc = {LOSS_DESC} LossStage = {LOSS_STAGE} LossBy = {LOSS_BY} ACCode = {AC_CODE} ACDesc = {AC_DESC} ReactorType = {REACTOR_TYPE} RDSCnt = DCount(RDSIDs, @VM) FOR RDSIndex = 1 TO RDSCnt DataLine = QUOTE(NCRNo):TAB$ DataLine := QUOTE(RDSIDs<1, RDSIndex>):TAB$ IF ReactorType = 'P' OR ReactorType = 'EPP' THEN * EpiPRO reactors in SPC have "EP" on the front. DataLine := QUOTE('EP':RDSReactors<1, RDSIndex>):TAB$ END ELSE DataLine := QUOTE(RDSReactors<1, RDSIndex>):TAB$ END DataLine := QUOTE(RejCnt<1, RDSIndex>):TAB$ DataLine := QUOTE(PSNo):TAB$ DataLine := QUOTE(DeptResp):TAB$ DataLine := QUOTE(LossCode):TAB$ DataLine := QUOTE(LossDesc):TAB$ DataLine := QUOTE(LossStage):TAB$ DataLine := QUOTE(LossBy):TAB$ DataLine := QUOTE(ACCode):TAB$ DataLine := QUOTE(ACDesc):TAB$ Next RDSIndex SPCQueueRec = DataLine:CRLF$ Database_Services('WriteDataRow', 'SPC_QUEUE', SPCQueueKey, SPCQueueRec, True$, False$, True$) End Case end service //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Internal GoSubs ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////