Compile function TEST_RUN_Services(@Service, @Params) #pragma precomp SRP_PreCompiler $insert LOGICAL $Insert APP_INSERTS $Insert TEST_WAFER_PROD_EQUATES $Insert TEST_WAFER_TYPES_DISPO_OPTIONS_EQUATES $Insert TEST_RUN_EQUATES $Insert TEST_RUN_WAFER_EQUATES $Insert TEST_RUN_OBJ_EQUATES Declare function Nextkey, Error_Services, Environment_Services, OConv, Logging_Services, SRP_Hashtable Declare function SRP_Datetime, Database_Services, Test_Run_Services, File_Services, Status, delete, Insert Declare subroutine Database_Services, Btree.Extract, Error_Services, Logging_Services, Rlist, Test_Run_Services, LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\TEST_RUN_SERVICES\TestWaferProduct' LogDate = Oconv(Date(), 'D4/') LogTime = Oconv(Time(), 'MTS') LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' Material Log.csv' Headers = 'Logging DTM' : @FM : 'User' : @FM : 'Notes' objLogTWP = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$) LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\TEST_RUN_SERVICES\TestRun' LogDate = Oconv(Date(), 'D4/') LogTime = Oconv(Time(), 'MTS') LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' Material Log.csv' Headers = 'Logging DTM' : @FM : 'User' : @FM : 'Notes' objLogTR = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$) LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM GoToService Return Response or "" //----------------------------------------------------------------------------- // SERVICES //----------------------------------------------------------------------------- //Test Wafer Product Methods - related to TEST_WAFER_PROD table /* Create New Test Wafer Product Creates a new entry in the TEST_WAFER_PROD table. */ Service CreateNewTestWaferProduct(ProductName) If ProductName NE '' then //Check for existing table = 'TEST_WAFER_PROD' Open "DICT ":table To @DICT Else Error_Services('Add', 'Error opening Test wafer product table') Return End Column = "PART_NAME" Value = ProductName search_criteria = Column:@VM:Value:@FM keylist = "" option = "" flag = "" Btree.Extract(search_criteria, table, @DICT, keylist, option, flag) IF keylist EQ '' then NewTestWaferProdRec = '' NewTestWaferProdRec = ProductName NewTestWaferProdKey = Nextkey('TEST_WAFER_PROD') Database_Services('WriteDataRow', table, NewTestWaferProdKey, NewTestWaferProdRec) If Error_Services('NoError') then LogData = '' LogData<1, 1> = LoggingDTM LogData<1, 2> = @User4 LogData<1, 3> = 'Successfully created new product type with ID of ' : NewTestWaferProdKey Logging_Services('AppendLog', objLogTWP, LogData, @FM, @VM) Response = NewTestWaferProdKey end else //Todo Add Logging for failure LogData = '' LogData<1, 1> = LoggingDTM LogData<1, 2> = @User4 LogData<1, 3> = 'Error Creating new test wafer product. ' : Error_Services('GetMessage') Logging_Services('AppendLog', objLogTWP, LogData, @FM, @VM) Response = '' end end else LogData = '' LogData<1, 1> = LoggingDTM LogData<1, 2> = @User4 LogData<1, 3> = 'Error Creating new test wafer product. Product already exists!' Logging_Services('AppendLog', objLogTWP, LogData, @FM, @VM) Error_Services('Add', 'Product already exists!') Response = '' end end else //Todo Add logging for failure LogData = '' LogData<1, 1> = LoggingDTM LogData<1, 2> = @User4 LogData<1, 3> = 'Product name was missing' Logging_Services('AppendLog', objLogTWP, LogData, @FM, @VM) Error_Services('Add', 'Product name was missing') Response = '' end end service Service DisableTWProd(TWProdKey) If TWProdKey NE '' then TWProdRec = Database_Services('ReadDataRow', 'TEST_WAFER_PROD', TWProdKey) TWProdRec = 0 Database_Services('WriteDataRow', 'TEST_WAFER_PROD', TWProdKey, TWProdRec) end else Error_Services('Add', 'Error in TEST_RUN_SERVICES -> DisableTWProd: No TWProdKeySupplied') end end service /* Add disposition option to a test wafer product Creates a new disposition entry in the TEST_WAFER_TYPES_DISPO_OPTION table, related to a TEST_WAFER_PROD record */ Service AddTestWaferProductDispo(TestWaferProdID, DispoName) If TestWaferProdID NE '' then IF DispoName NE '' then MatchingIDs = False$ CurrentDispoIDs = XLATE('TEST_WAFER_PROD', TestWaferProdID, TEST_WAFER_PROD_WAFER_DISPO_IDS$, 'X') For i = 1 to DCount(CurrentDispoIDs, @VM) DispoID = CurrentDispoIDs<1, i> DispoDescription = Xlate('TEST_WAFER_TYPES_DISPO_OPTIONS', DispoID, TEST_WAFER_TYPES_DISPO_OPTIONS_DISPO_DESCRIPTION$, 'X') if DispoName EQ DispoDescription then MatchingIDs = true$ Until MatchingIDs Next i if NOT(MatchingIDs) then NewTestWaferProdDispoRec = '' NewTestWaferProdDispoRec = TestWaferProdID NewTestWaferProdDispoRec = DispoName NewTestWaferProdDispoKey = Nextkey('TEST_WAFER_TYPES_DISPO_OPTIONS') Database_Services('WriteDataRow', 'TEST_WAFER_TYPES_DISPO_OPTIONS', NewTestWaferProdDispoKey, NewTestWaferProdDispoRec) If Error_Services('NoError') then LogData = '' LogData<1, 1> = LoggingDTM LogData<1, 2> = @User4 LogData<1, 3> = 'Dispo added to ' : TestWaferProdID : '. The dispo key is ' : NewTestWaferProdDispoKey Logging_Services('AppendLog', objLogTWP, LogData, @FM, @VM) end else LogData = '' LogData<1, 1> = LoggingDTM LogData<1, 2> = @User4 LogData<1, 3> = 'Error adding dispo to TW Prod, ' : Error_Services('GetMessage') Logging_Services('AppendLog', objLogTWP, LogData, @FM, @VM) end end else LogData = '' LogData<1, 1> = LoggingDTM LogData<1, 2> = @User4 LogData<1, 3> = 'Error adding dispo to TW Prod. dispo option already existed.' Logging_Services('AppendLog', objLogTWP, LogData, @FM, @VM) Error_Services('Add', 'Error adding dispo to TW Prod. dispo option already existed.') end end else LogData = '' LogData<1, 1> = LoggingDTM LogData<1, 2> = @User4 LogData<1, 3> = 'Error adding dispo to TW Prod. The dispo name was missing' Logging_Services('AppendLog', objLogTWP, LogData, @FM, @VM) end end else LogData = '' LogData<1, 1> = LoggingDTM LogData<1, 2> = @User4 LogData<1, 3> = 'Error adding dispo to TW Prod. The product name was missing' Logging_Services('AppendLog', objLogTWP, LogData, @FM, @VM) end end service Service DeleteTestWaferProductDispo(DispoID) If DispoID NE '' then If RowExists('TEST_WAFER_TYPES_DISPO_OPTIONS', DispoID) then Database_Services('DeleteDataRow', 'TEST_WAFER_TYPES_DISPO_OPTIONS', DispoID, True$, False$) end else errorMessage = 'Error deleting dispo to TW Prod. The dispo id was not found.' LogData = '' LogData<1, 1> = LoggingDTM LogData<1, 2> = @User4 LogData<1, 3> = errorMessage Logging_Services('AppendLog', objLogTWP, LogData, @FM, @VM) Error_Services('Add', errorMessage) end end else errorMessage = 'Error deleting dispo to TW Prod. The dispo id was missing' LogData = '' LogData<1, 1> = LoggingDTM LogData<1, 2> = @User4 LogData<1, 3> = errorMessage Logging_Services('AppendLog', objLogTWP, LogData, @FM, @VM) Error_Services('Add', errorMessage) end end service Service GetAllTWProdKeysUnformatted() keylist = '' RList("SELECT TEST_WAFER_PROD WITH SORT_ORDER NE '' BY SORT_ORDER", 5, '', '', '') Done = False$ Loop Readnext TWProdKey else Done = True$ Until Done keylist<-1> = TWProdKey Repeat Response = keylist end service Service GetAllTWProdKeys(ShowSorted) keylist = '' ProdList = '' If ShowSorted then RList("SELECT TEST_WAFER_PROD WITH SORT_ORDER NE 0 AND WITH SORT_ORDER NE '' BY SORT_ORDER", 5, '', '', '') end else RList("SELECT TEST_WAFER_PROD BY SORT_ORDER", 5, '', '', '') end Done = False$ Loop Readnext TWProdKey else Done = True$ Until Done keylist<1, -1> = TWProdKey Repeat for each ProdKey in keylist using @VM setting pPos ProdName = Xlate('TEST_WAFER_PROD', ProdKey, TEST_WAFER_PROD_PART_NAME$, 'X') if ProdName NE '' then ProdList<1, pPos> = ProdKey ProdList<2, pPos> = ProdName end Next ProdKey Response = ProdList end service Service UpdateTWProdSortOrder(TWProdKey, NewOrder) //First get current sort order TWProdRec = Database_Services('ReadDataRow', 'TEST_WAFER_PROD', TWProdKey) OldSortOrder = TWProdRec AllTWProdsSorted = Test_Run_Services('GetAllTWProdKeysUnformatted') //Get rid of all zero value sort orders i = 1 LOOP UNTIL AllTWProdsSorted = '' currSortOrder = Xlate('TEST_WAFER_PROD', AllTWProdsSorted, TEST_WAFER_PROD_SORT_ORDER$, 'X') If currSortOrder EQ 0 then //Remove it from the list of TWProds with Sorting enabled. The zero's will screw up the next part. AllTWProdsSorted = delete(AllTWProdsSorted, i, 0, 0) end i = i + 1 REPEAT If NewOrder GT 0 then AllTWProdsSorted = Insert(AllTWProdsSorted, NewOrder, 0, 0, TWProdKey) //Locate the old order and remove it i = 1 LOOP UNTIL AllTWProdsSorted = '' If i NE NewOrder AND AllTWProdsSorted EQ TWProdKey then //Remove it from the list of TWProds with Sorting enabled. The zero's will screw up the next part. AllTWProdsSorted = delete(AllTWProdsSorted, i, 0, 0) end i = i + 1 REPEAT end else //Disabling Locate TWProdKey in AllTWProdsSorted using @FM setting tPos then AllTWProdsSorted = delete(AllTWProdsSorted, tPos, 0, 0) end TWProdRecToWrite = Database_Services('ReadDataRow', 'TEST_WAFER_PROD', TWProdKey) TWProdRecToWrite = 0 Database_Services('WriteDataRow', 'TEST_WAFER_PROD', TWProdKey, TWProdRecToWrite, 1, 0, 1) end //Rewrite the entire sort order for all prods For each TWProd in AllTWProdsSorted using @FM setting SortOrder TWProdRecToWrite = Database_Services('ReadDataRow', 'TEST_WAFER_PROD', TWProd) TWProdRecToWrite = SortOrder Database_Services('WriteDataRow', 'TEST_WAFER_PROD', TWProd, TWProdRecToWrite, 1, 0, 1) Next TWProd end service Service GetAllTestRunTypes() keylist = '' rtList = '' RList('SELECT TEST_RUN_TYPE BY RUN_TYPE', 5, '', '', '') Done = False$ Loop Readnext RunTypeKey else Done = True$ Until Done keylist<1, -1> = RunTypeKey Repeat for each RTKey in keylist using @VM setting rPos RunTypeName = Xlate('TEST_RUN_TYPE', RTKey, TEST_RUN_TYPE_RUN_TYPE$, 'X') if RunTypeName NE '' then rtList<1, rPos> = RTKey rtList<2, rPos> = RunTypeName end Next ProdKey Response = rtList end service Service CreateTestRunRecord(RunTypeID, EqpType, EqpID, PSNo, RDSNo, UserID) Response = '' ErrorMessage = '' If RunTypeID NE '' AND EqpType NE '' AND EqpID NE '' AND UserID NE '' then RunDTM = SRP_Datetime('Now') TWRunRec = '' TWRunRec = RunDTM TWRunRec = RunTypeID TWRunRec = EqpID TWRunRec = EqpType TWRunRec = PSNo TWRunRec = UserID TWRunRec = RDSNo TWRunKey = nextkey('TEST_RUN') Database_Services('WriteDataRow', 'TEST_RUN', TWRunKey, TWRunRec) If Error_Services('NoError') then LogData = '' LogData<1, 1> = LoggingDTM LogData<1, 2> = @User4 LogData<1, 3> = 'Successfully created new TEST_RUN record with ID of ' : TWRunKey Logging_Services('AppendLog', objLogTR, LogData, @FM, @VM) Response = TWRunKey end else ErrorMessage = Error_Services('GetMessage') end end else If RunTypeID EQ '' then ErrorMessage := 'Run Type ID Missing. ' end If EqpTypeID EQ '' then ErrorMessage := 'Equipment Type ID Missing. ' end If EqpID EQ '' then ErrorMessage := 'Equipment ID Missing. ' end If UserID EQ '' then ErrorMessage := 'User ID Missing. ' end end If ErrorMessage NE '' then LogData = '' LogData<1, 1> = LoggingDTM LogData<1, 2> = @User4 LogData<1, 3> = 'Error writing TEST_RUN Record ' : TWRunKey : ': ' : ErrorMessage Logging_Services('AppendLog', objLogTR, LogData, @FM, @VM) Response = '' end end service Service CreateTestRunWaferRecord(TestRunID, TWPartID, TWUsageTypeID, SourceLotID) ErrorMessage = '' If TestRunID NE '' AND TWPartID NE '' then If RowExists('TEST_RUN', TestRunID) then TRWaferRec = '' TRWaferRec = TestRunID TRWaferRec = TWPartID TRWaferRec = TWUsageTypeID TRWaferRec = SourceLotID TRWaferKey = Nextkey('TEST_RUN_WAFER') Database_Services('WriteDataRow', 'TEST_RUN_WAFER', TRWaferKey, TRWaferRec) If Error_Services('NoError') AND RowExists('TEST_RUN_WAFER', TRWaferKey) then LogData = '' LogData<1, 1> = LoggingDTM LogData<1, 2> = @User4 LogData<1, 3> = 'Successfully wrote ' : TRWaferKey : ' to the TEST_RUN_WAFER table.' Logging_Services('AppendLog', objLogTR, LogData, @FM, @VM) //Increment Usage in TEST_WAFER_PROD Record Test_Run_Services('IncrementTWProdUsage', TWPartID) Response = TRWaferKey end else ErrorMessage := 'Error writing TEST_RUN_WAFER record with key of ' : TRWaferKey '. ' end end else ErrorMessage := 'Unable to find parent TEST_RUN record. ' end end else If TestRunID EQ '' then ErrorMessage := 'TestRunID parameter was not passed to CreateTestRunWaferRecord method. ' end If TWPartID EQ '' then ErrorMessage := 'TWPartID parameter was not passed to CreateTestRunWaferRecord method. ' end end If ErrorMessage NE '' then LogData = '' LogData<1, 1> = LoggingDTM LogData<1, 2> = @User4 LogData<1, 3> = 'Error Writing ' : TWRunKey : ' to the TEST_RUN_WAFER table. ' : ErrorMessage Logging_Services('AppendLog', objLogTR, LogData, @FM, @VM) end end service Service GetTestRunById(TestRunID) If TestRunID NE '' then If RowExists('TEST_RUN', TestRunID) then TRRec = Database_Services('ReadDataRow', 'TEST_RUN', TestRunID) Response = TRRec end else Error_Services('Add', 'Test Run ID does not exist in TEST_RUN table') end end else Error_Services('Add', 'Test Run ID parameter was not passed to routine.') end end service Service IncrementTWProdUsage(TWProdKey) If TWProdKey NE '' then TWProdRec = Database_Services('ReadDataRow', 'TEST_WAFER_PROD', TWProdKey) TWProdRec = TWProdRec + 1 Database_Services('WriteDataRow', 'TEST_WAFER_PROD', TWProdKey, TWProdRec) end end service Service GetTestRunObj(TestRunID) TestRunObj = '' TestRunRec = Test_Run_Services('GetTestRunById', TestRunID) //Start getting translated values for object TestRunObj = TestRunID TestRunObj = OConv(TestRunRec, 'DT') TestRunObj = Xlate('TEST_RUN_TYPE', TestRunRec, TEST_RUN_TYPE_RUN_TYPE$, 'X') TestRunObj = TestRunRec EqpType = TestRunRec Begin Case Case EqpType EQ 'R' TestRunObj = 'Reactor' Case EqpType EQ 'T' TestRunObj = 'Non-Reactor' End Case TestRunObj = TestRunRec TestRunObj = TestRunRec TestRunObj = TestRunRec TWKeys = TestRunRec TWUsageProds = '' TWUsageQtys = '' for each TWKey in TWKeys using @VM setting tPos TRWRec = Test_Run_Services('GetTestRunWaferByID', TWKey) TestWaferProdName = XLATE('TEST_WAFER_PROD', TRWRec, TEST_WAFER_PROD_PART_NAME$, 'X') Locate TestWaferProdName in TWUsageProds setting iPos then TWUsageProds<1,iPos> = TestWaferProdName TWUsageQtys<1,iPos> = TWUsageQtys<1,iPos> + 1 end else TWUsageProds<1,-1> = TestWaferProdName TWUsageQtys<1,-1> = 1 end Next TWKey TestRunObj = TWUsageProds TestRunObj = TWUsageQtys Response = TestRunObj end service Service GetTestWaferUsageByDateSpan(StartDtm, StopDtm) TestWaferData = '' if StopDTM EQ '' then StopDTM = SRP_Datetime('Now') end If StartDTM EQ '' then StartDTM = SRP_Datetime('AddDays', StopDtm, -30) end //Get a list of Test Run keys TestRunKeys = Test_Run_Services('GetTestRunKeysByDateSpan', StartDtm, StopDtm) For each TestRunKey in TestRunKeys using @VM setting tPos //Get all Product usages and their quantities TestRunRec = Database_Services('ReadDataRow', 'TEST_RUN', TestRunKey) TWUsageKeys = TestRunRec TWUsageData = '' for each TWUsageKey in TWUsageKeys using @VM setting twPos TWProdTypeKey = Xlate('TEST_RUN_WAFER', TWUsageKey, TEST_RUN_WAFER_TEST_WAFER_PROD_ID$, 'X') TWProdType = Xlate('TEST_WAFER_PROD', TWProdTypeKey, TEST_WAFER_PROD_PART_NAME$, 'X') Locate TWProdType in TWUsageData<1> using @VM setting twuPos then TWUsageData<2, twuPos> = TWUsageData<2, twuPos> + 1 end else TWUsageData<1, -1> = TWProdType TWUsageData<2, -1> = 1 end Next TWUsageKey For each TWUsage in TWUsageData<1> using @VM setting aPos TWLine = '' TWLine<1, TEST_RUN_OBJ_TEST_RUN_ID$> = TestRunKey TWLine<1, TEST_RUN_OBJ_RUN_DTM$> = OConv(TestRunRec, 'DT') TWLine<1, TEST_RUN_OBJ_RUN_TYPE$> = XLATE('TEST_RUN_TYPE', TestRunRec, 'RUN_TYPE', 'X') TWLine<1, TEST_RUN_OBJ_EQUIPMENT_ID$> = TestRunRec TWLine<1, TEST_RUN_OBJ_EQUIPMENT_TYPE$> = TestRunRec TWLine<1, TEST_RUN_OBJ_PROD_SPEC_ID$> = TestRunRec TWLine<1, TEST_RUN_OBJ_LSL_USER_ID$> = TestRunRec TWLine<1, TEST_RUN_OBJ_RDS_ID$> = TestRunRec TWLine<1, TEST_RUN_OBJ_TEST_RUN_WAFER_PRODS$> = TWUsage TWLine<1, TEST_RUN_OBJ_TEST_RUN_WAFER_PRODS_QTYS$> = TWUsageData<2, aPos> TestWaferData<-1> = TWLine Next TWUsage Next TestRunKey Response = TestWaferData end service Service GetTestRunKeysByDateSpan(StartDtm, StopDtm) Begin Case Case StartDTM EQ '' AND StopDTM EQ '' //Set search date for last 24 hour period StopDTM = SRP_Datetime('Now') StartDTM = SRP_Datetime('AddHours', StopDTM, -24) Case StartDTM EQ '' AND StopDTM NE '' //Set search start date 24 hours prior to stopDTM StartDTM = SRP_Datetime('AddHours', StopDTM, -24) Case StartDTM NE '' AND StopDTM EQ '' //Set search start date to current dtm StopDTM = SRP_Datetime('Now') End Case table = "TEST_RUN" Open "DICT ":table To @DICT Else Error_Services('Add', 'Error opening TEST_RUN dictionary') End If Error_Services('NoError') then srch_strng = "RUN_DTM":@VM:StartDTM:'~':StopDTM:@FM keylist = "" option = "" flag = "" Btree.Extract(srch_strng, table, @DICT, keylist, option, flag) Response = keylist end end service Service GetTestRunKeysByEqp(EquipType, EquipID) end service Service GetTestRunKeysByEqpType(EqpType) end service Service GetTestRunKeysByPSN(PSNo) end service Service GetTestRunKeysByRDS(RDSNo) end service Service GetTestRunWaferByID(TRWaferID) If TRWaferID NE '' then If RowExists('TEST_RUN_WAFER', TRWaferID) then Response = Database_Services('ReadDataRow', 'TEST_RUN_WAFER', TRWaferID) If Error_Services('HasError') then Response = '' Error_Services('Add', 'Error reading TEST_RUN_WAFER record with ID ' : TRWaferID) end end else Error_Services('Add', 'No TEST_RUN_WAFER record found that matches key value.') end end else Error_Services('Add', 'TRWaferID was null') end end service Service GetTestRunWaferKeysByProdID(ProdID) end service Service GenerateTWCSVReport(StartDTM, StopDTM, SavePath) If SavePath NE '' then CSVData = 'ID' : @VM : 'Run Time' : @VM : 'Test Run Type' : @VM : 'Equipment ID' : @VM : 'Equipment Type' : @VM : 'PSN' : @VM : 'User' : @VM : 'RDS' : @VM : 'Test Wafer Type' : @VM : 'Wfr Qty' : @FM CSVData := Test_Run_Services('GetTestWaferUsageByDateSpan', StartDTM, StopDTM) swap @VM with ',' in CSVData swap @FM with CRLF$ in CSVData If Not(File_Services('CheckFileExtension', SavePath, 'csv')) then SavePath = SavePath : '.csv' end OSWrite CSVData To SavePath WriteFailure = Status() If WriteFailure then Begin Case Case WriteFailure EQ 1 Error_Services('Add', 'Error in TEST_RUN_SERVICES -> GenerateTWCSVReport, Bad OS filename.') Case WriteFailure EQ 2 Error_Services('Add', 'Error in TEST_RUN_SERVICES -> GenerateTWCSVReport, Access denied by operating system.') Case WriteFailure EQ 3 Error_Services('Add', 'Error in TEST_RUN_SERVICES -> GenerateTWCSVReport, Disk or directory full.') Case WriteFailure EQ 4 Error_Services('Add', 'Error in TEST_RUN_SERVICES -> GenerateTWCSVReport, File does not exist.') Case WriteFailure EQ 5 Error_Services('Add', 'Error in TEST_RUN_SERVICES -> GenerateTWCSVReport, Unknown error.') Case WriteFailure EQ 6 Error_Services('Add', 'Error in TEST_RUN_SERVICES -> GenerateTWCSVReport, Attempt to write to a read-only file.') End Case end end else Error_Services('Add', 'Error in TEST_RUN_SERVICES -> GenerateTWCSVReport, No SavePath provided.') end end service