3787 lines
		
	
	
		
			256 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			3787 lines
		
	
	
		
			256 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| Function Engineering_Services(@Service, @Params)
 | |
| /***********************************************************************************************************************
 | |
| 
 | |
|     Name        :   Engineering_Services
 | |
| 
 | |
|     Description :   Handler program for all Disposition services.
 | |
| 
 | |
|     Notes       :   Application errors should be logged using the Error Services module. There are a few methodological
 | |
|                     assumptions built into way errors are managed which are important to understand in order to properly
 | |
|                     work with Error Services:
 | |
| 
 | |
|                     - The term 'top' refers to the originating procedure of a call stack and the term 'bottom' refers to
 | |
|                       the last routine (or the current routine) within a call stack. Within the OpenInsight Debugger
 | |
|                       this will appear backwards since the originating procedure always appears at the bottom of the
 | |
|                       list and the current routine appears at the top of the list. We are using this orientation because
 | |
|                       it is common to refer to the process of calling other procedures as 'drilling down'.
 | |
| 
 | |
|                     - The reason for defining the orientation of the call stack is because Error_Services allows for
 | |
|                       multiple error conditions to be appended to an original error. In most cases this will happen when
 | |
|                       a procedure at the bottom of the stack generates an error condition and then returns to its
 | |
|                       calling procedure. This higher level procedure can optionally add more information relevant to
 | |
|                       itself. This continues as the call stack 'bubbles' its way back to the top to where the
 | |
|                       originating procedure is waiting.
 | |
| 
 | |
|                     - Native OpenInsight commands that handle errors (e.g., Set_Status, Set_FSError, Set_EventStatus)
 | |
|                       preserve their error state until explicitly cleared. This can hinder the normal execution of code
 | |
|                       since subsequent procedures (usually SSPs) will fail if a pre-existing error condition exists.
 | |
|                       Our philosophy is that error conditions should automatically be cleared before a new procedure
 | |
|                       is executed to avoid this problem. However, the nature of Basic+ does not make this easy to
 | |
|                       automate for any given stored procedure. Therefore, if a stored procedure wants to conform to our
 | |
|                       philosophy then it should include a call into the 'Clear' service request at the top of the
 | |
|                       program. Alternatively this can be done through a common insert (see SERVICE_SETUP for example.)
 | |
| 
 | |
|                     - Service modules will use the SERVICE_SETUP insert and therefore automatically clear out any
 | |
|                       error conditions that were set before.
 | |
| 
 | |
|     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)
 | |
|         08/24/20    djs     Original programmer.
 | |
| 														
 | |
| 
 | |
| ***********************************************************************************************************************/
 | |
| #pragma precomp SRP_PreCompiler
 | |
| 
 | |
| $insert SERVICE_SETUP
 | |
| $insert REACT_RUN_EQUATES
 | |
| $insert WO_WFR_EQUATES
 | |
| $insert RUN_STAGE_WFR_EQUATES
 | |
| $insert APP_INSERTS
 | |
| $insert RLIST_EQUATES
 | |
| $insert EA_REQUESTS_EQUATES
 | |
| $insert FILE_SERVICES_EQUATES
 | |
| 
 | |
| Declare subroutine  Error_Services, Database_Services, GaN_Services, Disposition_Services, Engineering_Services, RList
 | |
| Declare subroutine  Excel_Services, Set_Status, Engineering_Services, Btree.Extract
 | |
| Declare subroutine  Logging_Services, File_Services, GetTempPath
 | |
| Declare function    Database_Services, Error_Services, DateTime, GaN_Services, Engineering_Services, Excel_Services
 | |
| Declare function    Engineering_Services, Environment_Services, Logging_Services, File_Services, SQL_Services
 | |
| Declare Function    Math_Services
 | |
| 
 | |
| LogPath          = Environment_Services('GetApplicationRootPath') : '\LogFiles\EngineeringAnalysis'
 | |
| LogDate          = Oconv(Date(), 'D4/')
 | |
| LogTime          = Oconv(Time(), 'MTS')
 | |
| LogFileName      = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' PostToExcelLog.csv'
 | |
| Headers          = 'Logging DTM' : @FM : 'RDS Key ID' : @FM : 'Notes'
 | |
| objLog           = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$)
 | |
| QueueLogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' QueueLog.csv'
 | |
| QueueObjLog      = Logging_Services('NewLog', LogPath, QueueLogFileName, CRLF$, Comma$, Headers, '', False$, False$)
 | |
| SQLLogFileName   = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' SQL Response Log.csv'
 | |
| Headers          = 'Logging DTM' : @FM : 'RDS Key ID' : @FM : 'SQL Response'
 | |
| objSQLLog        = Logging_Services('NewLog', LogPath, SQLLogFileName, CRLF$, Comma$, Headers, '', False$, False$)
 | |
| LoggingDTM       = LogDate : ' ' : LogTime
 | |
| LogData          = ''
 | |
| 
 | |
| GoToService else
 | |
| 	Error_Services('Set', Service : ' is not a valid service request within the ' : ServiceModule : ' services module.')
 | |
| end
 | |
| 
 | |
| Return Response else ''
 | |
| 
 | |
| ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 | |
| // Service Parameter Options
 | |
| ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 | |
| * Options STAGES        = 'GROWTH','UV','WARP','CAN','XRD','AFM','BV'
 | |
| * Options BV_PARAMETERS = 'Breakdown Voltage','Breakdown Voltage - Edge','Breakdown Voltage - Middle'
 | |
| 
 | |
| ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 | |
| // Services
 | |
| ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 | |
| 
 | |
| 
 | |
| Service GetSpreadSheetInfo(RDSNo)
 | |
| 
 | |
|     If RDSNo NE '' then
 | |
|         
 | |
|         ReactRunRec  = Database_Services('ReadDataRow', 'REACT_RUN', RDSNo)
 | |
|         WONo         = ReactRunRec<REACT_RUN_WO_NO$>
 | |
|         Reactor      = ReactRunRec<REACT_RUN_REACTOR$>
 | |
|         Voltage      = Xlate('WO_LOG', WONo, 'GAN_COST_TYPE', 'X')
 | |
|         EpiStructure = Xlate('WO_LOG', WONo, 'EPI_STRUCTURE', 'X')
 | |
|         Begin Case
 | |
|             Case (Reactor EQ '69')                        
 | |
|                 SpreadsheetName = '8-inch New HV Epi Development.xlsx'
 | |
|                 WorksheetName   = '8inch HELENS'
 | |
|                 Password        = 'IRMN2714'
 | |
|                 Directory       = '\\messv02ecc1.ec.local\EC_GaN_Development\R69 EPI DEVELOPMENT\DAILY RUN RECORD\'
 | |
|                 Offset          = 18
 | |
|                 EndCol          = 'CC'
 | |
|                 
 | |
|             Case ( (Reactor EQ '71') and ( (Voltage _EQC 'Mid Voltage') or (EpiStructure EQ 'MV') ) )
 | |
|                 SpreadsheetName = 'MV_R71_6-inch Epi Development.xlsx'
 | |
|                 WorksheetName   = 'R71-MV_With CAN02'
 | |
|                 Password        = 'IRMN2714'
 | |
|                 Directory       = '\\messv02ecc1.ec.local\EC_GaN_Development\R71 EPI DEVELOPMENT\Daily Run Record\'
 | |
|                 Offset          = 16
 | |
|                 EndCol          = 'CF'
 | |
|                 
 | |
|             Case ( (Reactor EQ '71') and ( (Voltage _EQC 'High Voltage') or (EpiStructure EQ 'HV') ) )
 | |
|                 SpreadsheetName = 'HV_R71_6-inch Epi Development.xlsx'
 | |
|                 WorksheetName   = 'HV_with_CAN02'
 | |
|                 Password        = 'IRMN2714'
 | |
|                 Directory       = '\\messv02ecc1.ec.local\EC_GaN_Development\R71 EPI DEVELOPMENT\Daily Run Record\'
 | |
|                 Offset          = 18
 | |
|                 EndCol          = 'CG'
 | |
|                 
 | |
|             Case Otherwise$
 | |
|                 ErrorMsg = 'Error in service ':Service:'. Failed to determine Excel Spreadsheet information.'
 | |
|                 Error_Services('Add', ErrorMsg)
 | |
|         End Case
 | |
|     end
 | |
|     If Error_Services('NoError') then
 | |
|         Response<1> = SpreadsheetName
 | |
|         Response<2> = WorksheetName
 | |
|         Response<3> = Password
 | |
|         Response<4> = Directory
 | |
|         Response<5> = Offset
 | |
|         Response<6> = EndCol
 | |
|     end
 | |
|     
 | |
| end service
 | |
| 
 | |
| 
 | |
| Service GetSpreadSheets()
 | |
| 
 | |
|     SpreadsheetNames = ''
 | |
|     WorksheetNames   = ''
 | |
|     Passwords        = ''
 | |
|     Directories      = ''
 | |
|     Offsets          = ''
 | |
|     EndCols          = ''
 | |
|                     
 | |
|     SpreadsheetNames<0, -1> = '8-inch New HV Epi Development.xlsx'
 | |
|     WorksheetNames<0, -1>   = '8inch HELENS'
 | |
|     Passwords<0, -1>        = 'IRMN2714'
 | |
|     Offsets<0, -1>          = 18
 | |
|     Directories<0, -1>      = '\\messv02ecc1.ec.local\EC_GaN_Development\R69 EPI DEVELOPMENT\DAILY RUN RECORD\'
 | |
|     EndCols<0, -1>          = 'CC'
 | |
| 
 | |
|     SpreadsheetNames<0, -1> = 'MV_R71_6-inch Epi Development.xlsx'
 | |
|     WorksheetNames<0, -1>   = 'R71-MV_With CAN02'
 | |
|     Passwords<0, -1>        = 'IRMN2714'
 | |
|     Offsets<0, -1>          = 16
 | |
|     Directories<0, -1>      = '\\messv02ecc1.ec.local\EC_GaN_Development\R71 EPI DEVELOPMENT\Daily Run Record\'
 | |
|     EndCols<0, -1>          = 'CF'
 | |
| 
 | |
|     SpreadsheetNames<0, -1> = 'HV_R71_6-inch Epi Development.xlsx'
 | |
|     WorksheetNames<0, -1>   = 'HV_with_CAN02'
 | |
|     Passwords<0, -1>        = 'IRMN2714'
 | |
|     Offsets<0, -1>          = 18
 | |
|     Directories<0, -1>      = '\\messv02ecc1.ec.local\EC_GaN_Development\R71 EPI DEVELOPMENT\Daily Run Record\'
 | |
|     EndCols<0, -1>          = 'CG'
 | |
| 
 | |
|     If Error_Services('NoError') then
 | |
|         Response<1> = SpreadsheetNames
 | |
|         Response<2> = WorksheetNames
 | |
|         Response<3> = Passwords
 | |
|         Response<4> = Directories
 | |
|         Response<5> = Offsets
 | |
|         Response<6> = EndCols
 | |
|     end
 | |
|     
 | |
| end service
 | |
| 
 | |
| 
 | |
| Service PostGrowthData(RDSNo)
 | |
| 
 | |
|     DocObj       = ''
 | |
|     ErrorMessage = ''
 | |
|     FileHandle   = ''
 | |
|     If RDSNo NE '' then       
 | |
|         ReactRunRec         = Database_Services('ReadDataRow', 'REACT_RUN', RDSNo, True$, 0, False$)
 | |
|         GaNRunID            = ReactRunRec<REACT_RUN_GAN_RUN_ID$>
 | |
|         InWfrIDs            = ReactRunRec<REACT_RUN_IN_WFR_ID$>
 | |
|         WONo                = ReactRunRec<REACT_RUN_WO_NO$>
 | |
|         Reactor             = ReactRunRec<REACT_RUN_REACTOR$>
 | |
|         SpreadsheetRowIndex = ReactRunRec<REACT_RUN_EA_ROW_INDEX$>
 | |
|         RunRecipe           = ReactRunRec<REACT_RUN_GAN_RECIPE$>
 | |
|         LoadDTM             = ReactRunRec<REACT_RUN_LOAD_SIG_DTM$>
 | |
|         LoadDT              = OConv(LoadDTM[1, 'F.'], 'D/')
 | |
|         NewRun              = False$        
 | |
|         SpreadsheetInfo     = Engineering_Services('GetSpreadSheetInfo', RDSNo)
 | |
|         SpreadsheetName     = SpreadsheetInfo<1>
 | |
|         WorksheetName       = SpreadsheetInfo<2>
 | |
|         SpreadsheetPW       = SpreadsheetInfo<3>
 | |
|         SpreadsheetDir      = SpreadsheetInfo<4>
 | |
|         Offset              = SpreadsheetInfo<5>
 | |
|         EndCol              = SpreadsheetInfo<6>
 | |
|         
 | |
|         // i.e. LOAD -> write the recipe, scribes, and satellite IDs to the appropriate spreadsheet
 | |
|         If SpreadsheetRowIndex EQ '' then
 | |
|             // RunID does not yet exist in the spreadsheet, so assign the next available row in the
 | |
|             // worksheet to the REACT_RUN record
 | |
|             SpreadsheetRowIndex                  = Database_Services('ReadDataRow', 'APP_INFO', WorksheetName)
 | |
|             ReactRunRec<REACT_RUN_EA_ROW_INDEX$> = SpreadsheetRowIndex           
 | |
|             NewRun                               = True$                                  
 | |
|         end       
 | |
|         If SpreadsheetRowIndex NE '' then
 | |
|             If GaNRunID NE '' then            
 | |
|                 RunInfo    = GaN_Services('GetRunInfo', GaNRunID)
 | |
|                 // Log SQL response
 | |
|                 LogData<1> = LoggingDTM
 | |
|                 LogData<2> = RDSNo
 | |
|                 LogData<3> = RunInfo
 | |
|                 Logging_Services('AppendLog', objSQLLog, LogData, @RM, @FM)
 | |
|                 If ( (RunInfo NE '') and (RunInfo NE 0) ) then
 | |
|                     Pockets      = RunInfo<3>
 | |
|                     Scribes      = RunInfo<4>
 | |
|                     SatIDs       = RunInfo<5> 
 | |
|                     DocumentPath = SpreadsheetDir:SpreadsheetName
 | |
|                     FileHandle   = File_Services('LockFile', DocumentPath, GENERIC_WRITE$, FILE_SHARE_READ$, OPEN_EXISTING$)
 | |
|                     If FileHandle NE FILE_ERROR$ then
 | |
|                         // Make a temporary backup in case the Excel file fails to save and becomes corrupted
 | |
|                         Datetime      = OConv(Datetime(), 'DT')
 | |
|                         Swap ' ' with '-' in Datetime
 | |
|                         Swap ':' with ';' in Datetime
 | |
|                         TempFilename  = GaNRunID:'-':Datetime:'.xlsx'                    
 | |
|                         TempDirectory = Str(\00\, 1024)
 | |
|                         GetTempPath(Len(TempDirectory), TempDirectory)
 | |
|                         Convert \00\ to '' in TempDirectory                       
 | |
|                         TempPath      = TempDirectory:TempFilename
 | |
|                         File_Services('CopyFile', DocumentPath, TempPath)                  
 | |
|                         DocObj        = Excel_Services('OpenDocument', TempPath, SpreadsheetPW)
 | |
|                         If Error_Services('NoError') then
 | |
|                             // Write the Run Recipe, Scribes, and Satellite IDs to the spreadsheet
 | |
|                             // Verify spreadsheet row index is correct
 | |
|                             RunIDCellText = Excel_Services('GetCellValue', DocObj, WorksheetName, 'A', SpreadsheetRowIndex)
 | |
|                             RowRunID      = RunIDCellText[1, 12]
 | |
|                             If ( (RowRunID EQ GaNRunID) or (NewRun EQ True$) ) then
 | |
|                                 // Verified row index is correct or run is not yet in spreadsheet, so continue.
 | |
|                                 If NewRun EQ True$ then
 | |
|                                     // Copy formatted cell range (i.e. the cell "block")
 | |
|                                     BeginRow       = SpreadsheetRowIndex
 | |
|                                     CellRangeBegin = 'A':BeginRow 
 | |
|                                     EndRow         = SpreadsheetRowIndex + (Offset - 1)
 | |
|                                     CellRangeEnd   = EndCol:EndRow
 | |
|                                     CopyToCell     = 'A':(SpreadsheetRowIndex + Offset)
 | |
|                                     Excel_Services('CopyCellRange', DocObj, WorksheetName, CellRangeBegin, CellRangeEnd, CopyToCell)
 | |
|                                     Excel_Services('SetCellValue', DocObj, WorksheetName, 'A', SpreadsheetRowIndex, GaNRunID)
 | |
|                                 end                                
 | |
|                                 // Run Recipe
 | |
|                                 Excel_Services('SetCellValue', DocObj, WorksheetName, 'D', SpreadsheetRowIndex, RunRecipe)                                
 | |
|                                 If WorksheetName EQ 'R71-MV_With CAN02' then
 | |
|                                     DateCol   = 'Z'
 | |
|                                     DateCol2  = 'AA'                                
 | |
|                                     SatCol    = 'AB'
 | |
|                                     ScribeCol = 'AC'
 | |
|                                 end else
 | |
|                                     DateCol   = 'AA'
 | |
|                                     DateCol2  = 'AB'
 | |
|                                     SatCol    = 'AC'
 | |
|                                     ScribeCol = 'AD'                            
 | |
|                                 end
 | |
|                                 // Unload Date
 | |
|                                 DateRow = (SpreadsheetRowIndex + 9)
 | |
|                                 Excel_Services('SetCellValue', DocObj, WorksheetName, DateCol, DateRow, 'Date')
 | |
|                                 Excel_Services('SetCellValue', DocObj, WorksheetName, DateCol2, DateRow, LoadDT)
 | |
|                                 // Scribes and Satellite IDs                            
 | |
|                                 For each Scribe in Scribes using @VM setting wPos
 | |
|                                     SatID         = SatIDs<0, wPos>
 | |
|                                     WaferRowIndex = SpreadsheetRowIndex + (wPos - 1)
 | |
|                                     Excel_Services('SetCellValue', DocObj, WorksheetName, ScribeCol, WaferRowIndex, Scribe)
 | |
|                                     Excel_Services('SetCellValue', DocObj, WorksheetName, SatCol, WaferRowIndex, SatID)
 | |
|                                 Next Scribe
 | |
|                                 Excel_Services('SaveDocument', DocObj, TempPath, SpreadsheetPW)
 | |
|                                 If Error_Services('NoError') then
 | |
|                                     TempFileHandle     = File_Services('LockFile', TempPath, GENERIC_WRITE$, FILE_SHARE_READ$, OPEN_EXISTING$)
 | |
|                                     TempFileHandleCopy = TempFileHandle
 | |
|                                     TempFileSize       = 0
 | |
|                                     If FileHandle NE FILE_ERROR$ then
 | |
|                                         // We were able to get the lock
 | |
|                                         TempFileSize = File_Services('GetFileSize', TempFileHandle)
 | |
|                                         File_Services('UnlockFile', TempFileHandle)
 | |
|                                     end
 | |
|                                     Begin Case
 | |
|                                         Case TempFileHandleCopy EQ FILE_ERROR$
 | |
|                                             // Failed to lock file again to verify file size (i.e. that the save operation worked)
 | |
|                                             ErrorMessage = 'Error in ':Service:' service. Failed to lock document ':TempPath:' to verify the save operation was successful.'      
 | |
|                                         Case TempFileSize EQ 0
 | |
|                                             // Save failed - file corrupted
 | |
|                                             ErrorMessage = 'Error in ':Service:' service. File size equal to zero. Document ':TempPath:' failed to save.'   
 | |
|                                         Case Otherwise$
 | |
|                                             // Save successful, so copy temp file back to document (PROD) path.
 | |
|                                             File_Services('UnlockFile', FileHandle)
 | |
|                                             CopySucceeded = File_Services('CopyFile', TempPath, DocumentPath)
 | |
|                                             If CopySucceeded EQ False$ then
 | |
|                                                 ErrorMessage = 'Error in ':Service:' service. Failed to copy ':TempPath:' to ':DocumentPath:'.'
 | |
|                                             end else
 | |
|                                                 If NewRun EQ True$ then
 | |
|                                                     // Advance APP_INFO next row index for the worksheet
 | |
|                                                     NextSpreadsheetRowIndex = SpreadsheetRowIndex + (Offset + 1)
 | |
|                                                     Database_Services('WriteDataRow', 'APP_INFO', WorksheetName, NextSpreadsheetRowIndex, True$, False$, True$)
 | |
|                                                     // Save REACT_RUN record with row index.
 | |
|                                                     Database_Services('WriteDataRow', 'REACT_RUN', RDSNo, ReactRunRec, True$, False$, True$)
 | |
|                                                 end    
 | |
|                                             end                                            
 | |
|                                     End Case    
 | |
|                                 end else
 | |
|                                     // SaveDocument call failed. Get internal error for logging purposes.
 | |
|                                     ErrorMessage = Error_Services('GetMessage') 
 | |
|                                 end                                                                
 | |
|                             end else
 | |
|                                 // Row index did not match. Log error.
 | |
|                                 ErrorMessage  = 'Error in ':Service:' service. Run ID in row ':SpreadsheetRowIndex
 | |
|                                 ErrorMessage := ' column A in 'SpreadsheetName:' worksheet ':WorksheetName
 | |
|                                 ErrorMessage := ' did not match GaNRunID ':GaNRunID:' in REACT_RUN record ':RDSNo:'.'
 | |
|                                 Excel_Services('CloseDocument', DocObj)       
 | |
|                             end                                                                                           
 | |
|                         end else
 | |
|                             ErrorMessage = 'Error in ':Service:' service. ':DocumentPath:' file could not be opened by Excel_Services.'                              
 | |
|                         end
 | |
|                         OSDelete TempPath                                     
 | |
|                     end else
 | |
|                         ErrorMessage = 'Error in ':Service:' service. ':DocumentPath:' file is in use an cannot be updated at this time.'                       
 | |
|                     end
 | |
|                 end else
 | |
|                     ErrorMessage = 'Error in ':Service:' service. Run info for Run ID ':GaNRunID:' is not available in IQS at this time.'
 | |
|                 end
 | |
|             end else
 | |
|                 ErrorMessage = 'Error in ':Service:' service. Run ID for RDS ':RDSNo:' is null.'
 | |
|             end
 | |
|         end else
 | |
|             ErrorMessage = 'Error in ':Service:' service. No Excel row index found for RDS ':RDSNo:' - Run ID ':GaNRunID:'.'   
 | |
|         end
 | |
|     end else
 | |
|         ErrorMessage = 'Error in ':Service:' service. RDSNo is null.'
 | |
|     end
 | |
|     
 | |
|     If DocObj NE '' then Excel_Services('CloseDocument', DocObj)
 | |
|     If ( (FileHandle NE '') and (FileHandle NE FILE_ERROR$) ) then File_Services('UnlockFile', FileHandle)
 | |
|     If ErrorMessage NE '' then Error_Services('Add', ErrorMessage)
 | |
|     
 | |
| end service
 | |
| 
 | |
| 
 | |
| Service PostAFMData(RDSNo)
 | |
| 
 | |
|     DocObj       = ''
 | |
|     ErrorMessage = ''
 | |
|     FileHandle   = ''
 | |
|     If RDSNo NE '' then       
 | |
|         ReactRunRec         = Database_Services('ReadDataRow', 'REACT_RUN', RDSNo)
 | |
|         GaNRunID            = ReactRunRec<REACT_RUN_GAN_RUN_ID$>
 | |
|         WONo                = ReactRunRec<REACT_RUN_WO_NO$>
 | |
|         Reactor             = ReactRunRec<REACT_RUN_REACTOR$>
 | |
|         SpreadsheetRowIndex = ReactRunRec<REACT_RUN_EA_ROW_INDEX$>
 | |
|         RunRecipe           = ReactRunRec<REACT_RUN_GAN_RECIPE$>      
 | |
|         SpreadsheetInfo     = Engineering_Services('GetSpreadSheetInfo', RDSNo)
 | |
|         SpreadsheetName     = SpreadsheetInfo<1>
 | |
|         WorksheetName       = SpreadsheetInfo<2>
 | |
|         SpreadsheetPW       = SpreadsheetInfo<3>
 | |
|         SpreadsheetDir      = SpreadsheetInfo<4>
 | |
|         Offset              = SpreadsheetInfo<5>        
 | |
|               
 | |
|         If SpreadsheetRowIndex NE '' then
 | |
|             If GaNRunID NE '' then            
 | |
|                 AFMData    = Engineering_Services('GetAFMData', RDSNo)
 | |
|                 // Log SQL response
 | |
|                 LogData<1> = LoggingDTM
 | |
|                 LogData<2> = RDSNo
 | |
|                 LogData<3> = AFMData
 | |
|                 Logging_Services('AppendLog', objSQLLog, LogData, @RM, @FM)
 | |
|                 If ( (AFMData NE '') and (AFMData NE 0) ) then
 | |
|                     DocumentPath = SpreadsheetDir:SpreadsheetName
 | |
|                     FileHandle   = File_Services('LockFile', DocumentPath, GENERIC_WRITE$, FILE_SHARE_READ$, OPEN_EXISTING$)
 | |
|                     If FileHandle NE FILE_ERROR$ then
 | |
|                         // Make a temporary backup in case the Excel file fails to save and becomes corrupted
 | |
|                         Datetime     = OConv(Datetime(), 'DT')
 | |
|                         Swap ' ' with '-' in Datetime
 | |
|                         Swap ':' with ';' in Datetime
 | |
|                         TempFilename = GaNRunID:'-':Datetime:'.xlsx'                       
 | |
|                         TempDirectory = Str(\00\, 1024)
 | |
|                         GetTempPath(Len(TempDirectory), TempDirectory)
 | |
|                         Convert \00\ to '' in TempDirectory                       
 | |
|                         TempPath     = TempDirectory:TempFilename
 | |
|                         File_Services('CopyFile', DocumentPath, TempPath)                  
 | |
|                         DocObj       = Excel_Services('OpenDocument', TempPath, SpreadsheetPW)
 | |
|                         If Error_Services('NoError') then                            
 | |
|                             // Verify spreadsheet row index is correct
 | |
|                             RunIDCellText = Excel_Services('GetCellValue', DocObj, WorksheetName, 'A', SpreadsheetRowIndex)
 | |
|                             RowRunID      = RunIDCellText[1, 12]
 | |
|                             If RowRunID EQ GaNRunID then
 | |
|                                 // Verified row index is correct so continue.
 | |
|                                 // Write the AFM Pit Count and AFM Roughness to the spreadsheet                               
 | |
|                                 If WorksheetName EQ 'R71-MV_With CAN02' then
 | |
|                                     PitCountCol  = 'Z'
 | |
|                                     RoughnessCol = 'AA'
 | |
|                                 end else
 | |
|                                     PitCountCol  = 'AA'
 | |
|                                     RoughnessCol = 'AB'                            
 | |
|                                 end                 
 | |
|                                 For each Row in AFMData using @FM setting fPos
 | |
|                                     Parameter = Row<0, 1>
 | |
|                                     Pocket    = Row<0, 2>
 | |
|                                     Value     = Row<0, 3>
 | |
|                                     Begin Case
 | |
|                                         Case Parameter EQ 'AFM Pit Count'
 | |
|                                             Col = PitCountCol
 | |
|                                         Case Parameter EQ 'AFM Roughness'
 | |
|                                             Col = RoughnessCol
 | |
|                                         Case Otherwise$
 | |
|                                             ErrorMessage = 'Error in service ':Service:'. Unrecognized parameter ':Parameter:'.'
 | |
|                                     End Case
 | |
|                                 Until ErrorMessage NE ''
 | |
|                                     RowIndex = SpreadsheetRowIndex + (Pocket - 1)
 | |
|                                     Excel_Services('SetCellValue', DocObj, WorksheetName, Col, RowIndex, Value)
 | |
|                                 Next Row
 | |
|                                 If ErrorMessage EQ '' then
 | |
|                                     Excel_Services('SaveDocument', DocObj, TempPath, SpreadsheetPW)
 | |
|                                     If Error_Services('NoError') then
 | |
|                                         TempFileHandle     = File_Services('LockFile', TempPath, GENERIC_WRITE$, FILE_SHARE_READ$, OPEN_EXISTING$)
 | |
|                                         TempFileHandleCopy = TempFileHandle
 | |
|                                         TempFileSize       = 0
 | |
|                                         If FileHandle NE FILE_ERROR$ then
 | |
|                                             // We were able to get the lock
 | |
|                                             TempFileSize = File_Services('GetFileSize', TempFileHandle)
 | |
|                                             File_Services('UnlockFile', TempFileHandle)
 | |
|                                         end
 | |
|                                         Begin Case
 | |
|                                             Case TempFileHandleCopy EQ FILE_ERROR$
 | |
|                                                 // Failed to lock file again to verify file size (i.e. that the save operation worked)
 | |
|                                                 ErrorMessage = 'Error in ':Service:' service. Failed to lock document ':TempPath:' to verify the save operation was successful.'      
 | |
|                                             Case TempFileSize EQ 0
 | |
|                                                 // Save failed - file corrupted
 | |
|                                                 ErrorMessage = 'Error in ':Service:' service. File size equal to zero. Document ':TempPath:' failed to save.'   
 | |
|                                             Case Otherwise$
 | |
|                                                 // Save successful, so copy temp file back to document (PROD) path.
 | |
|                                                 File_Services('UnlockFile', FileHandle)
 | |
|                                                 CopySucceeded = File_Services('CopyFile', TempPath, DocumentPath)
 | |
|                                                 If CopySucceeded EQ False$ then
 | |
|                                                     ErrorMessage = 'Error in ':Service:' service. Failed to copy ':TempPath:' to ':DocumentPath:'.'
 | |
|                                                 end
 | |
|                                         End Case    
 | |
|                                     end else
 | |
|                                         // SaveDocument call failed. Get internal error for logging purposes.
 | |
|                                         ErrorMessage = Error_Services('GetMessage') 
 | |
|                                     end
 | |
|                                 end                                                            
 | |
|                             end else
 | |
|                                 // Row index did not match. Log error.
 | |
|                                 ErrorMessage  = 'Error in ':Service:' service. Run ID in row ':SpreadsheetRowIndex
 | |
|                                 ErrorMessage := ' column A in 'SpreadsheetName:' worksheet ':WorksheetName
 | |
|                                 ErrorMessage := ' did not match GaNRunID ':GaNRunID:' in REACT_RUN record ':RDSNo:'.'
 | |
|                                 Excel_Services('CloseDocument', DocObj)       
 | |
|                             end                                                                                    
 | |
|                         end else
 | |
|                             ErrorMessage = 'Error in ':Service:' service. ':TempPath:' file could not be opened by Excel_Services.'   
 | |
|                         end
 | |
|                         OSDelete TempPath                                                                                                
 | |
|                     end else
 | |
|                         ErrorMessage = 'Error in ':Service:' service. ':DocumentPath:' file is in use an cannot be updated at this time.'                        
 | |
|                     end
 | |
|                 end else
 | |
|                     ErrorMessage = 'Error in ':Service:' service. AFM data for Run ID ':GaNRunID:' is not available in IQS at this time.'
 | |
|                 end
 | |
|             end else
 | |
|                 ErrorMessage = 'Error in ':Service:' service. Run ID for RDS ':RDSNo:' is null.'    
 | |
|             end
 | |
|         end else
 | |
|             ErrorMessage = 'Error in ':Service:' service. No Excel row index found for RDS ':RDSNo:' - Run ID ':GaNRunID:'.'   
 | |
|         end
 | |
|     end else
 | |
|         ErrorMessage = 'Error in ':Service:' service. RDSNo is null.'
 | |
|     end
 | |
|     
 | |
|     If DocObj NE '' then Excel_Services('CloseDocument')
 | |
|     If ( (FileHandle NE '') and (FileHandle NE FILE_ERROR$) ) then File_Services('UnlockFile', FileHandle)
 | |
|     If ErrorMessage NE '' then Error_Services('Add', ErrorMessage)
 | |
|     
 | |
| end service
 | |
| 
 | |
| 
 | |
| Service PostCHARData(RDSNo)
 | |
| 
 | |
|     DocObj       = ''
 | |
|     ErrorMessage = ''
 | |
|     FileHandle   = ''
 | |
|     If RDSNo NE '' then       
 | |
|         ReactRunRec         = Database_Services('ReadDataRow', 'REACT_RUN', RDSNo)
 | |
|         GaNRunID            = ReactRunRec<REACT_RUN_GAN_RUN_ID$>
 | |
|         WONo                = ReactRunRec<REACT_RUN_WO_NO$>
 | |
|         Reactor             = ReactRunRec<REACT_RUN_REACTOR$>
 | |
|         SpreadsheetRowIndex = ReactRunRec<REACT_RUN_EA_ROW_INDEX$>
 | |
|         RunRecipe           = ReactRunRec<REACT_RUN_GAN_RECIPE$>
 | |
|         InWfrIDs            = ReactRunRec<REACT_RUN_IN_WFR_ID$>  
 | |
|         SpreadsheetInfo     = Engineering_Services('GetSpreadSheetInfo', RDSNo)
 | |
|         SpreadsheetName     = SpreadsheetInfo<1>
 | |
|         WorksheetName       = SpreadsheetInfo<2>
 | |
|         SpreadsheetPW       = SpreadsheetInfo<3>
 | |
|         SpreadsheetDir      = SpreadsheetInfo<4>
 | |
|         Offset              = SpreadsheetInfo<5>        
 | |
|               
 | |
|         If SpreadsheetRowIndex NE '' then
 | |
|             If GaNRunID NE '' then                           
 | |
|                 DestroyedList = ''
 | |
|                 For each WfrID in InWfrIDs using @VM setting wPos
 | |
|                     WaferDestroyed = GaN_Services('GetDestroyedStatus', WfrID)
 | |
|                     If WaferDestroyed EQ True$ then DestroyedList<0, -1> = wPos
 | |
|                 Next WfrID
 | |
|                 LogData<1>   = LoggingDTM
 | |
|                 LogData<2>   = RDSNo
 | |
|                 LogData<3>   = DestroyedList
 | |
|                 Logging_Services('AppendLog', objSQLLog, LogData, @RM, @FM)
 | |
|                 DocumentPath = SpreadsheetDir:SpreadsheetName
 | |
|                 FileHandle   = File_Services('LockFile', DocumentPath, GENERIC_WRITE$, FILE_SHARE_READ$, OPEN_EXISTING$)
 | |
|                 If FileHandle NE FILE_ERROR$ then
 | |
|                     // Make a temporary backup in case the Excel file fails to save and becomes corrupted
 | |
|                     Datetime      = OConv(Datetime(), 'DT')
 | |
|                     Swap ' ' with '-' in Datetime
 | |
|                     Swap ':' with ';' in Datetime
 | |
|                     TempFilename  = GaNRunID:'-':Datetime:'.xlsx'                       
 | |
|                     TempDirectory = Str(\00\, 1024)
 | |
|                     GetTempPath(Len(TempDirectory), TempDirectory)
 | |
|                     Convert \00\ to '' in TempDirectory                       
 | |
|                     TempPath      = TempDirectory:TempFilename
 | |
|                     File_Services('CopyFile', DocumentPath, TempPath)                  
 | |
|                     DocObj        = Excel_Services('OpenDocument', TempPath, SpreadsheetPW)
 | |
|                     If Error_Services('NoError') then                            
 | |
|                         // Verify spreadsheet row index is correct
 | |
|                         RunIDCellText = Excel_Services('GetCellValue', DocObj, WorksheetName, 'A', SpreadsheetRowIndex)
 | |
|                         RowRunID      = RunIDCellText[1, 12]
 | |
|                         If RowRunID EQ GaNRunID then
 | |
|                             // Verified row index is correct so continue.                             
 | |
|                             If WorksheetName EQ 'R71-MV_With CAN02' then
 | |
|                                 ScribeCol = 'AC'
 | |
|                                 RowIndex = SpreadsheetRowIndex + Offset - 1
 | |
|                             end else    
 | |
|                                 ScribeCol = 'AD'
 | |
|                                 RowIndex = SpreadsheetRowIndex + Offset - 3
 | |
|                             end
 | |
|                             CharString = ''
 | |
|                             If DestroyedList NE '' then     
 | |
|                                 For each WfrPos in DestroyedList using @VM
 | |
|                                     CharString := 'W0':WfrPos:','
 | |
|                                 Next WfrPos
 | |
|                             end else
 | |
|                                 CharString = '#N/A'
 | |
|                             end
 | |
|                             // Erase last comma
 | |
|                             CharString[-1, 1] = ''
 | |
|                             Excel_Services('SetCellValue', DocObj, WorksheetName, ScribeCol, RowIndex, CharString)
 | |
|                             // Attempt to save changes to spreadsheet
 | |
|                             Excel_Services('SaveDocument', DocObj, TempPath, SpreadsheetPW)
 | |
|                             If Error_Services('NoError') then
 | |
|                                 TempFileHandle     = File_Services('LockFile', TempPath, GENERIC_WRITE$, FILE_SHARE_READ$, OPEN_EXISTING$)
 | |
|                                 TempFileHandleCopy = TempFileHandle
 | |
|                                 TempFileSize       = 0
 | |
|                                 If FileHandle NE FILE_ERROR$ then
 | |
|                                     // We were able to get the lock
 | |
|                                     TempFileSize = File_Services('GetFileSize', TempFileHandle)
 | |
|                                     File_Services('UnlockFile', TempFileHandle)
 | |
|                                 end
 | |
|                                 Begin Case
 | |
|                                     Case TempFileHandleCopy EQ FILE_ERROR$
 | |
|                                         // Failed to lock file again to verify file size (i.e. that the save operation worked)
 | |
|                                         ErrorMessage = 'Error in ':Service:' service. Failed to lock document ':TempPath:' to verify the save operation was successful.'      
 | |
|                                     Case TempFileSize EQ 0
 | |
|                                         // Save failed - file corrupted
 | |
|                                         ErrorMessage = 'Error in ':Service:' service. File size equal to zero. Document ':TempPath:' failed to save.'   
 | |
|                                     Case Otherwise$
 | |
|                                         // Save successful, so copy temp file back to document (PROD) path.
 | |
|                                         File_Services('UnlockFile', FileHandle)
 | |
|                                         CopySucceeded = File_Services('CopyFile', TempPath, DocumentPath)
 | |
|                                         If CopySucceeded EQ False$ then
 | |
|                                             ErrorMessage = 'Error in ':Service:' service. Failed to copy ':TempPath:' to ':DocumentPath:'.'
 | |
|                                         end
 | |
|                                 End Case    
 | |
|                             end else
 | |
|                                 // SaveDocument call failed. Get internal error for logging purposes.
 | |
|                                 ErrorMessage = Error_Services('GetMessage') 
 | |
|                             end                                                                
 | |
|                         end else
 | |
|                             // Row index did not match. Log error.
 | |
|                             ErrorMessage  = 'Error in ':Service:' service. Run ID in row ':SpreadsheetRowIndex
 | |
|                             ErrorMessage := ' column A in 'SpreadsheetName:' worksheet ':WorksheetName
 | |
|                             ErrorMessage := ' did not match GaNRunID ':GaNRunID:' in REACT_RUN record ':RDSNo:'.'
 | |
|                             Excel_Services('CloseDocument', DocObj)       
 | |
|                         end                                                                                               
 | |
|                     end else
 | |
|                         ErrorMessage = 'Error in ':Service:' service. ':DocumentPath:' file could not be opened by Excel_Services.'   
 | |
|                     end
 | |
|                     OSDelete TempPath                                  
 | |
|                 end else
 | |
|                     ErrorMessage = 'Error in ':Service:' service. ':DocumentPath:' file is in use an cannot be updated at this time.'                        
 | |
|                 end
 | |
|             end else
 | |
|                 ErrorMessage = 'Error in ':Service:' service. Run ID for RDS ':RDSNo:' is null.'    
 | |
|             end
 | |
|         end else
 | |
|             ErrorMessage = 'Error in ':Service:' service. No Excel row index found for RDS ':RDSNo:' - Run ID ':GaNRunID:'.'   
 | |
|         end
 | |
|     end else
 | |
|         ErrorMessage = 'Error in ':Service:' service. RDSNo is null.'
 | |
|     end
 | |
|     
 | |
|     If DocObj NE '' then Excel_Services('CloseDocument')
 | |
|     If ( (FileHandle NE '') and (FileHandle NE FILE_ERROR$) ) then File_Services('UnlockFile', FileHandle)
 | |
|     If ErrorMessage NE '' then Error_Services('Add', ErrorMessage)
 | |
|     
 | |
| end service
 | |
| 
 | |
| 
 | |
| Service PostRPMData(RDSNo)
 | |
| 
 | |
|     DocObj       = ''
 | |
|     ErrorMessage = ''
 | |
|     FileHandle   = ''
 | |
|     If RDSNo NE '' then       
 | |
|         ReactRunRec         = Database_Services('ReadDataRow', 'REACT_RUN', RDSNo)
 | |
|         GaNRunID            = ReactRunRec<REACT_RUN_GAN_RUN_ID$>
 | |
|         WONo                = ReactRunRec<REACT_RUN_WO_NO$>
 | |
|         Reactor             = ReactRunRec<REACT_RUN_REACTOR$>
 | |
|         SpreadsheetRowIndex = ReactRunRec<REACT_RUN_EA_ROW_INDEX$>
 | |
|         RunRecipe           = ReactRunRec<REACT_RUN_GAN_RECIPE$>      
 | |
|         SpreadsheetInfo     = Engineering_Services('GetSpreadSheetInfo', RDSNo)
 | |
|         SpreadsheetName     = SpreadsheetInfo<1>
 | |
|         WorksheetName       = SpreadsheetInfo<2>
 | |
|         SpreadsheetPW       = SpreadsheetInfo<3>
 | |
|         SpreadsheetDir      = SpreadsheetInfo<4>
 | |
|         Offset              = SpreadsheetInfo<5>
 | |
|               
 | |
|         If SpreadsheetRowIndex NE '' then
 | |
|             If GaNRunID NE '' then
 | |
|                 RPMData    = Engineering_Services('GetRPMData', RDSNo)
 | |
|                 // Log SQL response
 | |
|                 LogData<1> = LoggingDTM
 | |
|                 LogData<2> = RDSNo
 | |
|                 LogData<3> = RPMData
 | |
|                 Logging_Services('AppendLog', objSQLLog, LogData, @RM, @FM)
 | |
|                 If ( Error_Services('NoError') and (RPMData NE '') and (RPMData NE 0) ) then
 | |
|                     PLData = Engineering_Services('GetPLData', RDSNo)
 | |
|                     If ( Error_Services('NoError') and (PLData NE '') and (PLData NE 0) ) then  
 | |
|                         DocumentPath = SpreadsheetDir:SpreadsheetName
 | |
|                         FileHandle   = File_Services('LockFile', DocumentPath, GENERIC_WRITE$, FILE_SHARE_READ$, OPEN_EXISTING$)
 | |
|                         If FileHandle NE FILE_ERROR$ then
 | |
|                             // Make a temporary backup in case the Excel file fails to save and becomes corrupted
 | |
|                             Datetime      = OConv(Datetime(), 'DT')
 | |
|                             Swap ' ' with '-' in Datetime
 | |
|                             Swap ':' with ';' in Datetime
 | |
|                             TempFilename  = GaNRunID:'-':Datetime:'.xlsx'                       
 | |
|                             TempDirectory = Str(\00\, 1024)
 | |
|                             GetTempPath(Len(TempDirectory), TempDirectory)
 | |
|                             Convert \00\ to '' in TempDirectory                       
 | |
|                             TempPath      = TempDirectory:TempFilename
 | |
|                             File_Services('CopyFile', DocumentPath, TempPath)                  
 | |
|                             DocObj        = Excel_Services('OpenDocument', TempPath, SpreadsheetPW)
 | |
|                             If Error_Services('NoError') then                            
 | |
|                                 // Verify spreadsheet row index is correct
 | |
|                                 RunIDCellText = Excel_Services('GetCellValue', DocObj, WorksheetName, 'A', SpreadsheetRowIndex)
 | |
|                                 RowRunID      = RunIDCellText[1, 12]
 | |
|                                 If RowRunID EQ GaNRunID then
 | |
|                                     // Verified row index is correct so continue.
 | |
|                                     Begin Case
 | |
|                                         Case SpreadsheetName EQ 'MV_R71_6-inch Epi Development.xlsx'
 | |
|                                             PLEdgeCol       = 'AY'
 | |
|                                             PLYellowCol     = 'AZ'
 | |
|                                             PLRatioCol      = 'AZ'
 | |
|                                             RPMThicknessCol = 'BA'
 | |
|                                             RPMStdDevCol    = 'BB'                                      
 | |
|                                         Case SpreadsheetName EQ 'HV_R71_6-inch Epi Development.xlsx'
 | |
|                                             PLEdgeCol       = 'AZ'
 | |
|                                             PLYellowCol     = 'BA'
 | |
|                                             PLRatioCol      = 'BA'
 | |
|                                             RPMThicknessCol = 'BB'
 | |
|                                             RPMStdDevCol    = 'BC'
 | |
|                                         Case SpreadsheetName EQ '8-inch New HV Epi Development.xlsx'
 | |
|                                             PLEdgeCol       = 'BC'
 | |
|                                             PLYellowCol     = 'BD'
 | |
|                                             PLRatioCol      = 'BD'
 | |
|                                             RPMThicknessCol = 'BE'
 | |
|                                             RPMStdDevCol    = 'BF'                                   
 | |
|                                     End Case
 | |
|                                     // Write constant values
 | |
|                                     Excel_Services('SetCellValue', DocObj, WorksheetName, PLEdgeCol, (SpreadsheetRowIndex + 1), 'Ratio')                           
 | |
|                                     // Write RPM values                           
 | |
|                                     RowIndex = SpreadsheetRowIndex
 | |
|                                     For each Row in RPMData using @FM setting fPos
 | |
|                                         Parameter = Row<0, 1>
 | |
|                                         Value     = Row<0, 2>
 | |
|                                         Begin Case
 | |
|                                             Case Parameter EQ 'Epi Thickness Mean'
 | |
|                                                 Col = RPMThicknessCol                                           
 | |
|                                             Case Parameter EQ 'Epi Thickness Std Dev %'
 | |
|                                                 Col = RPMStdDevCol
 | |
|                                         End Case                                    
 | |
|                                         Excel_Services('SetCellValue', DocObj, WorksheetName, Col, RowIndex, Value)
 | |
|                                     Next Row                                  
 | |
|                                     // Write PL values                                                                
 | |
|                                     For each Row in PLData using @FM setting fPos
 | |
|                                         Parameter = Row<0, 1>
 | |
|                                         Value     = Row<0, 2>
 | |
|                                         Begin Case
 | |
|                                             Case Parameter EQ 'PL Ratio'
 | |
|                                                 Col = PLRatioCol
 | |
|                                                 RowIndex = SpreadsheetRowIndex + 1                                      
 | |
|                                             Case Parameter EQ 'BandEdge_V'
 | |
|                                                 RowIndex = SpreadsheetRowIndex
 | |
|                                                 Col = PLEdgeCol
 | |
|                                             Case Parameter EQ 'YellowBand_V'
 | |
|                                                 RowIndex = SpreadsheetRowIndex
 | |
|                                                 Col = PLYellowCol
 | |
|                                             Case Otherwise$
 | |
|                                                 ErrorMessage = 'Error in service ':Service:'. Unrecognized parameter ':Parameter:'.'
 | |
|                                         End Case
 | |
|                                     Until ErrorMessage NE ''                         
 | |
|                                         Excel_Services('SetCellValue', DocObj, WorksheetName, Col, RowIndex, Value)
 | |
|                                     Next Row
 | |
|                                     If ErrorMessage EQ '' then              
 | |
|                                         Excel_Services('SaveDocument', DocObj, TempPath, SpreadsheetPW)
 | |
|                                         If Error_Services('NoError') then
 | |
|                                             TempFileHandle     = File_Services('LockFile', TempPath, GENERIC_WRITE$, FILE_SHARE_READ$, OPEN_EXISTING$)
 | |
|                                             TempFileHandleCopy = TempFileHandle
 | |
|                                             TempFileSize       = 0
 | |
|                                             If FileHandle NE FILE_ERROR$ then
 | |
|                                                 // We were able to get the lock
 | |
|                                                 TempFileSize = File_Services('GetFileSize', TempFileHandle)
 | |
|                                                 File_Services('UnlockFile', TempFileHandle)
 | |
|                                             end
 | |
|                                             Begin Case
 | |
|                                                 Case TempFileHandleCopy EQ FILE_ERROR$
 | |
|                                                     // Failed to lock file again to verify file size (i.e. that the save operation worked)
 | |
|                                                     ErrorMessage = 'Error in ':Service:' service. Failed to lock document ':TempPath:' to verify the save operation was successful.'      
 | |
|                                                 Case TempFileSize EQ 0
 | |
|                                                     // Save failed - file corrupted
 | |
|                                                     ErrorMessage = 'Error in ':Service:' service. File size equal to zero. Document ':TempPath:' failed to save.'   
 | |
|                                                 Case Otherwise$
 | |
|                                                     // Save successful, so copy temp file back to document (PROD) path.
 | |
|                                                     File_Services('UnlockFile', FileHandle)
 | |
|                                                     CopySucceeded = File_Services('CopyFile', TempPath, DocumentPath)
 | |
|                                                     If CopySucceeded EQ False$ then
 | |
|                                                         ErrorMessage = 'Error in ':Service:' service. Failed to copy ':TempPath:' to ':DocumentPath:'.'
 | |
|                                                     end
 | |
|                                             End Case    
 | |
|                                         end else
 | |
|                                             // SaveDocument call failed. Get internal error for logging purposes.
 | |
|                                             ErrorMessage = Error_Services('GetMessage') 
 | |
|                                         end
 | |
|                                     end                                                        
 | |
|                                 end else
 | |
|                                     // Row index did not match. Log error.
 | |
|                                     ErrorMessage  = 'Error in ':Service:' service. Run ID in row ':SpreadsheetRowIndex
 | |
|                                     ErrorMessage := ' column A in 'SpreadsheetName:' worksheet ':WorksheetName
 | |
|                                     ErrorMessage := ' did not match GaNRunID ':GaNRunID:' in REACT_RUN record ':RDSNo:'.'
 | |
|                                     Excel_Services('CloseDocument', DocObj)       
 | |
|                                 end                                                                                      
 | |
|                             end else
 | |
|                                 ErrorMessage = 'Error in ':Service:' service. ':DocumentPath:' file could not be opened by Excel_Services.'   
 | |
|                             end
 | |
|                             OSDelete TempPath                                     
 | |
|                         end else
 | |
|                             ErrorMessage = 'Error in ':Service:' service. ':DocumentPath:' file is in use an cannot be updated at this time.'                        
 | |
|                         end
 | |
|                     end else
 | |
|                         ErrorMessage = 'Error in ':Service:' service. PL data missing in IQS.'    
 | |
|                     end
 | |
|                 end else
 | |
|                     ErrorMessage = 'Error in ':Service:' service. RPM data missing in IQS.'
 | |
|                 end
 | |
|             end else
 | |
|                 ErrorMessage = 'Error in ':Service:' service. Run ID for RDS ':RDSNo:' is null.'        
 | |
|             end
 | |
|         end else
 | |
|             ErrorMessage = 'Error in ':Service:' service. No Excel row index found for RDS ':RDSNo:' - Run ID ':GaNRunID:'.'   
 | |
|         end
 | |
|     end else
 | |
|         ErrorMessage = 'Error in ':Service:' service. RDSNo is null.'      
 | |
|     end
 | |
|     
 | |
|     If DocObj NE '' then Excel_Services('CloseDocument', DocObj)
 | |
|     If ( (FileHandle NE '') and (FileHandle NE FILE_ERROR$) ) then File_Services('UnlockFile', FileHandle)
 | |
|     If ErrorMessage NE '' then Error_Services('Add', ErrorMessage)
 | |
|     
 | |
| end service
 | |
| 
 | |
| 
 | |
| Service PostPRData(RDSNo)
 | |
| 
 | |
|     DocObj       = ''
 | |
|     ErrorMessage = ''
 | |
|     FileHandle   = ''
 | |
|     If RDSNo NE '' then       
 | |
|         ReactRunRec         = Database_Services('ReadDataRow', 'REACT_RUN', RDSNo)
 | |
|         GaNRunID            = ReactRunRec<REACT_RUN_GAN_RUN_ID$>
 | |
|         WONo                = ReactRunRec<REACT_RUN_WO_NO$>
 | |
|         Reactor             = ReactRunRec<REACT_RUN_REACTOR$>
 | |
|         SpreadsheetRowIndex = ReactRunRec<REACT_RUN_EA_ROW_INDEX$>
 | |
|         RunRecipe           = ReactRunRec<REACT_RUN_GAN_RECIPE$>      
 | |
|         SpreadsheetInfo     = Engineering_Services('GetSpreadSheetInfo', RDSNo)
 | |
|         SpreadsheetName     = SpreadsheetInfo<1>
 | |
|         WorksheetName       = SpreadsheetInfo<2>
 | |
|         SpreadsheetPW       = SpreadsheetInfo<3>
 | |
|         SpreadsheetDir      = SpreadsheetInfo<4>
 | |
|         Offset              = SpreadsheetInfo<5>
 | |
|               
 | |
|         If SpreadsheetRowIndex NE '' then
 | |
|             If GaNRunID NE '' then
 | |
|                 PRData     = Engineering_Services('GetPRData', RDSNo)
 | |
|                 // Log SQL response
 | |
|                 LogData<1> = LoggingDTM
 | |
|                 LogData<2> = RDSNo
 | |
|                 LogData<3> = PRData
 | |
|                 Logging_Services('AppendLog', objSQLLog, LogData, @RM, @FM)
 | |
|                 If ( Error_Services('NoError') and (PRData NE '') and (PRData NE 0) ) then            
 | |
|                     DocumentPath = SpreadsheetDir:SpreadsheetName
 | |
|                     FileHandle   = File_Services('LockFile', DocumentPath, GENERIC_WRITE$, FILE_SHARE_READ$, OPEN_EXISTING$)
 | |
|                     If FileHandle NE FILE_ERROR$ then
 | |
|                         // Make a temporary backup in case the Excel file fails to save and becomes corrupted
 | |
|                         Datetime     = OConv(Datetime(), 'DT')
 | |
|                         Swap ' ' with '-' in Datetime
 | |
|                         Swap ':' with ';' in Datetime
 | |
|                         TempFilename = GaNRunID:'-':Datetime:'.xlsx'                       
 | |
|                         TempDirectory = Str(\00\, 1024)
 | |
|                         GetTempPath(Len(TempDirectory), TempDirectory)
 | |
|                         Convert \00\ to '' in TempDirectory                       
 | |
|                         TempPath     = TempDirectory:TempFilename
 | |
|                         File_Services('CopyFile', DocumentPath, TempPath)                  
 | |
|                         DocObj       = Excel_Services('OpenDocument', TempPath, SpreadsheetPW)
 | |
|                         If Error_Services('NoError') then                            
 | |
|                             // Verify spreadsheet row index is correct
 | |
|                             RunIDCellText = Excel_Services('GetCellValue', DocObj, WorksheetName, 'A', SpreadsheetRowIndex)
 | |
|                             RowRunID      = RunIDCellText[1, 12]
 | |
|                             If RowRunID EQ GaNRunID then
 | |
|                                 // Verified row index is correct so continue.
 | |
|                                 Begin Case
 | |
|                                     Case SpreadsheetName EQ 'MV_R71_6-inch Epi Development.xlsx'
 | |
|                                         PRPeakCol        = 'BC'
 | |
|                                         PRBarrierCompCol = 'BD'
 | |
|                                         PRStdDevCol      = 'BD'
 | |
|                                         NumValues        = 9
 | |
|                                     Case SpreadsheetName EQ 'HV_R71_6-inch Epi Development.xlsx'
 | |
|                                         PRPeakCol        = 'BD'
 | |
|                                         PRBarrierCompCol = 'BE'
 | |
|                                         NumValues        = 5
 | |
|                                     Case SpreadsheetName EQ '8-inch New HV Epi Development.xlsx'
 | |
|                                         PRPosCol         = 'BG'
 | |
|                                         PRBarrierCompCol = 'BH'
 | |
|                                         NumValues        = 7                                   
 | |
|                                 End Case
 | |
|                                 // Write constant values
 | |
|                                 Excel_Services('SetCellValue', DocObj, WorksheetName, PLEdgeCol, (SpreadsheetRowIndex + 1), 'Ratio')                           
 | |
|                                 // Write PR values
 | |
|                                 PeakCounter        = 0
 | |
|                                 PRBarrCompCounter  = 0
 | |
|                                 RPMBarrCompCounter = 0
 | |
|                                 PRBarrCompValues   = ''
 | |
|                                 YCoordCounter      = 0
 | |
|                                 BarrierMax         = 0
 | |
|                                 BarrierMin         = 0
 | |
|                                 BarrierRange       = 0
 | |
|                                 For each Row in PRData using @FM setting fPos
 | |
|                                     Parameter = Row<0, 1>
 | |
|                                     SBNo      = Row<0, 2>
 | |
|                                     Value     = Row<0, 3>
 | |
|                                     Begin Case
 | |
|                                         Case Parameter EQ 'PR Peak'
 | |
|                                             Col          = PRPeakCol
 | |
|                                             If SBNo GT 0 then
 | |
|                                                 RowOffset = PeakCounter
 | |
|                                             end else
 | |
|                                                 RowOffset = 9
 | |
|                                             end
 | |
|                                             PeakCounter += 1                                           
 | |
|                                         Case Parameter EQ 'PR Barrier Composition'
 | |
|                                             Col                      = PRBarrierCompCol
 | |
|                                             If SBNo GT 0 then
 | |
|                                                 RowOffset = PRBarrCompCounter
 | |
|                                             end else
 | |
|                                                 RowOffset = 9
 | |
|                                             end
 | |
|                                             If ( (SBNo NE 0) and (Value NE '') ) then PRBarrCompValues<0, -1> = Value
 | |
|                                             PRBarrCompCounter += 1                                           
 | |
|                                         Case Parameter EQ 'Barrier_Composition_RPM_XY'
 | |
|                                             Col       = PRBarrierCompCol
 | |
|                                             RowOffset = RPMBarrCompCounter
 | |
|                                             If BarrierMax EQ 0 then BarrierMax = Value
 | |
|                                             If BarrierMin EQ 0 then BarrierMin = Value
 | |
|                                             If Value GT BarrierMax then BarrierMax = Value
 | |
|                                             If Value LT BarrierMin then BarrierMin = Value
 | |
|                                             If ( (SpreadsheetName EQ '8-inch New HV Epi Development.xlsx') and (SBNo EQ 0) ) then
 | |
|                                                 // Write the Barrier Comp average
 | |
|                                                 BarrierAvg = Value
 | |
|                                                 RowIndex   = NumValues 
 | |
|                                                 Excel_Services('SetCellValue', DocObj, WorksheetName, Col, RowIndex, BarrierAvg)
 | |
|                                             end
 | |
|                                             RPMBarrCompCounter += 1
 | |
|                                         Case Parameter EQ 'Y-Coord'
 | |
|                                             Col            = PRPosCol
 | |
|                                             RowOffset      = YCoordCounter
 | |
|                                             YCoordCounter += 1
 | |
|                                         Case Otherwise$
 | |
|                                             ErrorMessage = 'Error in service ':Service:'. Unrecognized parameter ':Parameter:'.'                        
 | |
|                                     End Case
 | |
|                                 Until ErrorMessage NE ''                                                     
 | |
|                                     RowIndex  = SpreadsheetRowIndex + RowOffset
 | |
|                                     If ( (Parameter NE 'Y-Coord') or (SBNo GT 0) ) then
 | |
|                                         Excel_Services('SetCellValue', DocObj, WorksheetName, Col, RowIndex, Value)
 | |
|                                     end                                   
 | |
|                                 Next Row
 | |
|                                 If ErrorMessage EQ '' then
 | |
|                                     If SpreadsheetName EQ '8-inch New HV Epi Development.xlsx' then
 | |
|                                         RowIndex     = SpreadsheetRowIndex + NumValues + 1
 | |
|                                         BarrierRange = BarrierMax - BarrierMin
 | |
|                                         Excel_Services('SetCellValue', DocObj, WorksheetName, PRBarrierCompCol, RowIndex, BarrierRange)                                                  
 | |
|                                     end
 | |
|                                     If SpreadsheetName EQ 'MV_R71_6-inch Epi Development.xlsx' then
 | |
|                                         RowIndex = SpreadsheetRowIndex + 10
 | |
|                                         PRCV     = Math_Services('GetCoefficientOfVariation', PRBarrCompValues, 'SAMPLE')
 | |
|                                         Excel_Services('SetCellValue', DocObj, WorksheetName, PRStdDevCol, RowIndex, PRCV)       
 | |
|                                     end
 | |
|                                     Excel_Services('SaveDocument', DocObj, TempPath, SpreadsheetPW)
 | |
|                                     If Error_Services('NoError') then
 | |
|                                         TempFileHandle     = File_Services('LockFile', TempPath, GENERIC_WRITE$, FILE_SHARE_READ$, OPEN_EXISTING$)
 | |
|                                         TempFileHandleCopy = TempFileHandle
 | |
|                                         TempFileSize       = 0
 | |
|                                         If FileHandle NE FILE_ERROR$ then
 | |
|                                             // We were able to get the lock
 | |
|                                             TempFileSize = File_Services('GetFileSize', TempFileHandle)
 | |
|                                             File_Services('UnlockFile', TempFileHandle)
 | |
|                                         end
 | |
|                                         Begin Case
 | |
|                                             Case TempFileHandleCopy EQ FILE_ERROR$
 | |
|                                                 // Failed to lock file again to verify file size (i.e. that the save operation worked)
 | |
|                                                 ErrorMessage = 'Error in ':Service:' service. Failed to lock document ':TempPath:' to verify the save operation was successful.'      
 | |
|                                             Case TempFileSize EQ 0
 | |
|                                                 // Save failed - file corrupted
 | |
|                                                 ErrorMessage = 'Error in ':Service:' service. File size equal to zero. Document ':TempPath:' failed to save.'   
 | |
|                                             Case Otherwise$
 | |
|                                                 // Save successful, so copy temp file back to document (PROD) path.
 | |
|                                                 File_Services('UnlockFile', FileHandle)
 | |
|                                                 CopySucceeded = File_Services('CopyFile', TempPath, DocumentPath)
 | |
|                                                 If CopySucceeded EQ False$ then
 | |
|                                                     ErrorMessage = 'Error in ':Service:' service. Failed to copy ':TempPath:' to ':DocumentPath:'.'
 | |
|                                                 end
 | |
|                                         End Case    
 | |
|                                     end else
 | |
|                                         // SaveDocument call failed. Get internal error for logging purposes.
 | |
|                                         ErrorMessage = Error_Services('GetMessage') 
 | |
|                                     end                                                                  
 | |
|                                 end
 | |
|                             end else
 | |
|                                 // Row index did not match. Log error.
 | |
|                                 ErrorMessage  = 'Error in ':Service:' service. Run ID in row ':SpreadsheetRowIndex
 | |
|                                 ErrorMessage := ' column A in 'SpreadsheetName:' worksheet ':WorksheetName
 | |
|                                 ErrorMessage := ' did not match GaNRunID ':GaNRunID:' in REACT_RUN record ':RDSNo:'.'
 | |
|                                 Excel_Services('CloseDocument', DocObj)       
 | |
|                             end                                                                                     
 | |
|                         end else
 | |
|                             ErrorMessage = 'Error in ':Service:' service. ':DocumentPath:' file could not be opened by Excel_Services.' 
 | |
|                         end
 | |
|                         OSDelete TempPath                                     
 | |
|                     end else
 | |
|                         ErrorMessage = 'Error in ':Service:' service. ':DocumentPath:' file is in use an cannot be updated at this time.'                       
 | |
|                     end
 | |
|                 end else
 | |
|                     ErrorMessage = 'Error in ':Service:' service. PR data missing in IQS.'    
 | |
|                 end
 | |
|             end else
 | |
|                 ErrorMessage = 'Error in ':Service:' service. Run ID for RDS ':RDSNo:' is null.'    
 | |
|             end
 | |
|         end else
 | |
|             ErrorMessage = 'Error in ':Service:' service. No Excel row index found for RDS ':RDSNo:' - Run ID ':GaNRunID:'.'   
 | |
|         end
 | |
|     end else
 | |
|         ErrorMessage = 'Error in ':Service:' service. RDSNo is null.'
 | |
|     end
 | |
|     
 | |
|     If DocObj NE '' then Excel_Services('CloseDocument', DocObj)
 | |
|     If ( (FileHandle NE '') and (FileHandle NE FILE_ERROR$) ) then File_Services('UnlockFile', FileHandle)
 | |
|     If ErrorMessage NE '' then Error_Services('Add', ErrorMessage)
 | |
|     
 | |
| end service
 | |
| 
 | |
| 
 | |
| Service PostXRDData(RDSNo)
 | |
| 
 | |
|     DocObj       = ''
 | |
|     ErrorMessage = ''
 | |
|     FileHandle   = ''
 | |
|     If RDSNo NE '' then
 | |
|         ReactRunRec         = Database_Services('ReadDataRow', 'REACT_RUN', RDSNo)
 | |
|         GaNRunID            = ReactRunRec<REACT_RUN_GAN_RUN_ID$>
 | |
|         WONo                = ReactRunRec<REACT_RUN_WO_NO$>
 | |
|         Reactor             = ReactRunRec<REACT_RUN_REACTOR$>
 | |
|         SpreadsheetRowIndex = ReactRunRec<REACT_RUN_EA_ROW_INDEX$>
 | |
|         RunRecipe           = ReactRunRec<REACT_RUN_GAN_RECIPE$>      
 | |
|         SpreadsheetInfo     = Engineering_Services('GetSpreadSheetInfo', RDSNo)
 | |
|         SpreadsheetName     = SpreadsheetInfo<1>
 | |
|         WorksheetName       = SpreadsheetInfo<2>
 | |
|         SpreadsheetPW       = SpreadsheetInfo<3>
 | |
|         SpreadsheetDir      = SpreadsheetInfo<4>
 | |
|         Offset              = SpreadsheetInfo<5>             
 | |
|         If SpreadsheetRowIndex NE '' then
 | |
|             If GaNRunID NE '' then
 | |
|                 // Log SQL response
 | |
|                 LogData<1>       = LoggingDTM
 | |
|                 LogData<2>       = RDSNo
 | |
|                 XRDAlumData      = Engineering_Services('GetXRDAlumData', RDSNo)                
 | |
|                 LogData<3>       = XRDAlumData
 | |
|                 Logging_Services('AppendLog', objSQLLog, LogData, @RM, @FM)
 | |
|                 XRDThicknessData = Engineering_Services('GetXRDThicknessData', RDSNo)
 | |
|                 LogData<3>       = XRDThicknessData
 | |
|                 Logging_Services('AppendLog', objSQLLog, LogData, @RM, @FM)
 | |
|                 If SpreadsheetName NE '8-inch New HV Epi Development.xlsx' then
 | |
|                     // 6-inch
 | |
|                     XRDCoordData = Engineering_Services('GetXRDXCoordData', RDSNo)
 | |
|                     LogData<3>   = XRDCoordData
 | |
|                     Logging_Services('AppendLog', objSQLLog, LogData, @RM, @FM)
 | |
|                     XRDWtAvgData = Engineering_Services('GetXRDWtAvgData', RDSNo)
 | |
|                     LogData<3>   = XRDWtAvgData
 | |
|                     Logging_Services('AppendLog', objSQLLog, LogData, @RM, @FM)
 | |
|                 end else
 | |
|                     // 8-inch
 | |
|                     XRDCoordData = Engineering_Services('GetXRDYCoordData', RDSNo)
 | |
|                     LogData<3>   = XRDCoordData
 | |
|                     Logging_Services('AppendLog', objSQLLog, LogData, @RM, @FM)
 | |
|                 end                
 | |
|                 If ( Error_Services('NoError') and (XRDAlumData NE '') and (XRDThicknessData NE '') and (XRDCoordData NE '') and (XRDAlumData NE 0) and (XRDThicknessData NE 0) and (XRDCoordData NE 0) ) then
 | |
|                     If SpreadsheetName NE '8-inch New HV Epi Development.xlsx' then
 | |
|                         XRDWtAvgData = Engineering_Services('GetXRDWtAvgData', RDSNo)
 | |
|                         LogData<3>   = XRDWtAvgData
 | |
|                         Logging_Services('AppendLog', objSQLLog, LogData, @RM, @FM)
 | |
|                         If ( (XRDWtAvgData EQ 0) or (XRDWtAvgData EQ '') ) then
 | |
|                             ErrorMessage = 'Error in service':Service:'. XRD data missing in IQS.'
 | |
|                         end
 | |
|                     end
 | |
|                     If ErrorMessage EQ '' then
 | |
|                         DocumentPath = SpreadsheetDir:SpreadsheetName
 | |
|                         FileHandle   = File_Services('LockFile', DocumentPath, GENERIC_WRITE$, FILE_SHARE_READ$, OPEN_EXISTING$)
 | |
|                         If FileHandle NE FILE_ERROR$ then
 | |
|                             // Make a temporary backup in case the Excel file fails to save and becomes corrupted
 | |
|                             Datetime      = OConv(Datetime(), 'DT')
 | |
|                             Swap ' ' with '-' in Datetime
 | |
|                             Swap ':' with ';' in Datetime
 | |
|                             TempFilename  = GaNRunID:'-':Datetime:'.xlsx'                       
 | |
|                             TempDirectory = Str(\00\, 1024)
 | |
|                             GetTempPath(Len(TempDirectory), TempDirectory)
 | |
|                             Convert \00\ to '' in TempDirectory                       
 | |
|                             TempPath      = TempDirectory:TempFilename
 | |
|                             File_Services('CopyFile', DocumentPath, TempPath)                  
 | |
|                             DocObj        = Excel_Services('OpenDocument', TempPath, SpreadsheetPW)
 | |
|                             If Error_Services('NoError') then                            
 | |
|                                 // Verify spreadsheet row index is correct
 | |
|                                 RunIDCellText = Excel_Services('GetCellValue', DocObj, WorksheetName, 'A', SpreadsheetRowIndex)
 | |
|                                 RowRunID      = RunIDCellText[1, 12]
 | |
|                                 If RowRunID EQ GaNRunID then
 | |
|                                     Begin Case
 | |
|                                         Case SpreadsheetName EQ 'MV_R71_6-inch Epi Development.xlsx'
 | |
|                                             BBCol         = 'BE'
 | |
|                                             BarrierCol    = 'BF'
 | |
|                                             SLSCol        = 'BG'
 | |
|                                             TL1Col        = 'BH'
 | |
|                                             TL0Col        = 'BI'
 | |
|                                             AVECol        = 'BJ'
 | |
|                                             SLPeriodCol   = 'BK'
 | |
|                                             ThickCoordCol = 'AP'
 | |
|                                             ThicknessCol  = 'AQ'
 | |
|                                             FWHM006Col    = 'AW'
 | |
|                                             FWHM105Col    = 'AX'
 | |
|                                             NumValues     = 3
 | |
|                                             Excel_Services('SetCellValue', DocObj, WorksheetName, AVECol, (SpreadsheetRowIndex + 3), 'AVE')
 | |
|                                             Excel_Services('SetCellValue', DocObj, WorksheetName, TL0Col, (SpreadsheetRowIndex + 6), 'Coordinate')                                       
 | |
|                                         Case SpreadsheetName EQ 'HV_R71_6-inch Epi Development.xlsx'
 | |
|                                             BBCol         = 'BF'
 | |
|                                             BarrierCol    = 'BG'
 | |
|                                             SLSCol        = 'BH'
 | |
|                                             TL1Col        = 'BI'
 | |
|                                             TL0Col        = 'BJ'
 | |
|                                             AVECol        = 'BK'
 | |
|                                             SLPeriodCol   = 'BL'
 | |
|                                             ThickCoordCol = 'AQ'
 | |
|                                             ThicknessCol  = 'AR'
 | |
|                                             FWHM006Col    = 'AX'
 | |
|                                             FWHM105Col    = 'AY'
 | |
|                                             NumValues     = 3
 | |
|                                             Excel_Services('SetCellValue', DocObj, WorksheetName, 'AP' , SpreadsheetRowIndex, 'XRR')
 | |
|                                             Excel_Services('SetCellValue', DocObj, WorksheetName, AVECol , SpreadsheetRowIndex, 'SL thickness')
 | |
|                                             Excel_Services('SetCellValue', DocObj, WorksheetName, AVECol, (SpreadsheetRowIndex + 3), 'AVE')
 | |
|                                             Excel_Services('SetCellValue', DocObj, WorksheetName, TL0Col, (SpreadsheetRowIndex + 6), 'Coordinate')
 | |
|                                         Case SpreadsheetName EQ '8-inch New HV Epi Development.xlsx'
 | |
|                                             BBCol         = 'BI'
 | |
|                                             BarrierCol    = 'BJ'
 | |
|                                             SLSCol        = 'BK'
 | |
|                                             TL2Col        = 'BL'
 | |
|                                             TL1Col        = 'BM'
 | |
|                                             TL0Col        = 'BN'
 | |
|                                             SLPeriodCol   = 'BO'
 | |
|                                             ThickCoordCol = 'AT'
 | |
|                                             ThicknessCol  = 'AU'
 | |
|                                             FWHM006Col    = 'BA'
 | |
|                                             FWHM105Col    = 'BB'
 | |
|                                             NumValues     = 4
 | |
|                                             RangeOffset   = 5
 | |
|                                             Excel_Services('SetCellValue', DocObj, WorksheetName, 'AS' , SpreadsheetRowIndex, 'XRR')
 | |
|                                             Excel_Services('SetCellValue', DocObj, WorksheetName, BBCol,        (SpreadsheetRowIndex + 17), 'B.B.')
 | |
|                                             Excel_Services('SetCellValue', DocObj, WorksheetName, BarrierCol,   (SpreadsheetRowIndex + 17), 'Barrier')
 | |
|                                             Excel_Services('SetCellValue', DocObj, WorksheetName, SLSCol,       (SpreadsheetRowIndex + 17), 'SLS')
 | |
|                                             Excel_Services('SetCellValue', DocObj, WorksheetName, TL2Col,       (SpreadsheetRowIndex + 17), 'TL2')
 | |
|                                             Excel_Services('SetCellValue', DocObj, WorksheetName, TL1Col,       (SpreadsheetRowIndex + 17), 'TL1')
 | |
|                                             Excel_Services('SetCellValue', DocObj, WorksheetName, TL0Col,       (SpreadsheetRowIndex + 17), 'TL0')
 | |
|                                             Excel_Services('SetCellValue', DocObj, WorksheetName, SLPeriodCol,  (SpreadsheetRowIndex + 17), 'SL Period')                                        
 | |
|                                     End Case                                                                    
 | |
|                                     // Write Al% values
 | |
|                                     BBMin         = ''
 | |
|                                     BBMax         = ''
 | |
|                                     BBRange       = ''
 | |
|                                     BarrierMin    = ''
 | |
|                                     BarrierMax    = ''
 | |
|                                     BarrierRange  = ''
 | |
|                                     SLSMin        = ''
 | |
|                                     SLSMax        = ''
 | |
|                                     SLSRange      = ''
 | |
|                                     TL1Min        = ''
 | |
|                                     TL1Max        = ''
 | |
|                                     TL1Range      = ''
 | |
|                                     SLPeriodMin   = ''
 | |
|                                     SLPeriodMax   = ''
 | |
|                                     SLPeriodRange = ''
 | |
|                                     For each Row in XRDAlumData using @FM setting fPos
 | |
|                                         Parameter = Row<0, 1>
 | |
|                                         SBNo      = Row<0, 2>
 | |
|                                         Pocket    = Row<0, 3>
 | |
|                                         Value     = Row<0, 4>
 | |
|                                         Begin Case
 | |
|                                             Case Parameter EQ 'Al% B.B.'
 | |
|                                                 Col = BBCol
 | |
|                                                 If SBNo EQ 0 then
 | |
|                                                     // Average value is SBNo 0
 | |
|                                                     RowOffset = NumValues
 | |
|                                                 end else
 | |
|                                                     RowOffset = SBNo - 1
 | |
|                                                     If BBMin EQ '' then BBMin = Value
 | |
|                                                     If BBMax EQ '' then BBMax = Value
 | |
|                                                     If Value LT BBMin then BBMin = Value
 | |
|                                                     If Value GT BBMax then BBMax = Value
 | |
|                                                 end                                          
 | |
|                                             Case Parameter EQ 'Al% Barrier'
 | |
|                                                 Col = BarrierCol
 | |
|                                                 If SBNo EQ 0 then
 | |
|                                                     // Average value is SBNo 0
 | |
|                                                     RowOffset = NumValues
 | |
|                                                 end else
 | |
|                                                     RowOffset = SBNo - 1
 | |
|                                                     If BarrierMin EQ '' then BarrierMin = Value
 | |
|                                                     If BarrierMax EQ '' then BarrierMax = Value
 | |
|                                                     If Value LT BarrierMin then BarrierMin = Value
 | |
|                                                     If Value GT BarrierMax then BarrierMax = Value
 | |
|                                                 end
 | |
|                                             Case Parameter EQ 'Al% SLS'
 | |
|                                                 Col = SLSCol
 | |
|                                                 If SBNo EQ 0 then
 | |
|                                                     // Average value is SBNo 0
 | |
|                                                     RowOffset = NumValues
 | |
|                                                 end else
 | |
|                                                     RowOffset = SBNo - 1
 | |
|                                                     If SLSMin EQ '' then SLSMin = Value
 | |
|                                                     If SLSMax EQ '' then SLSMax = Value
 | |
|                                                     If Value LT SLSMin then SLSMin = Value
 | |
|                                                     If Value GT SLSMax then SLSMax = Value
 | |
|                                                 end
 | |
|                                             Case Parameter EQ 'Al% TL1'
 | |
|                                                 Col = TL1Col
 | |
|                                                 If SBNo EQ 0 then
 | |
|                                                     // Average value is SBNo 0
 | |
|                                                     RowOffset = NumValues
 | |
|                                                 end else
 | |
|                                                     RowOffset = SBNo - 1
 | |
|                                                     If TL1Min EQ '' then TL1Min = Value
 | |
|                                                     If TL1Max EQ '' then TL1Max = Value
 | |
|                                                     If Value LT TL1Min then TL1Min = Value
 | |
|                                                     If Value GT TL1Max then TL1Max = Value
 | |
|                                                 end
 | |
|                                             Case Parameter EQ 'SL Period'
 | |
|                                                 Col = SLPeriodCol
 | |
|                                                 If SBNo EQ 0 then
 | |
|                                                     // Average value is SBNo 0
 | |
|                                                     RowOffset = NumValues
 | |
|                                                 end else
 | |
|                                                     RowOffset = SBNo - 1
 | |
|                                                     If SLPeriodMin EQ '' then SLPeriodMin = Value
 | |
|                                                     If SLPeriodMax EQ '' then SLPeriodMax = Value
 | |
|                                                     If Value LT SLPeriodMin then SLPeriodMin = Value
 | |
|                                                     If Value GT SLPeriodMax then SLPeriodMax = Value
 | |
|                                                 end
 | |
|                                             Case Otherwise$
 | |
|                                                 ErrorMessage = 'Error in service ':Service:'. Unrecognized parameter ':Parameter:'.'
 | |
|                                         End Case
 | |
|                                     Until ErrorMessage NE ''                                                                              
 | |
|                                         RowIndex  = SpreadsheetRowIndex + RowOffset
 | |
|                                         Excel_Services('SetCellValue', DocObj, WorksheetName, Col, RowIndex, Value)
 | |
|                                     Next Row
 | |
|                                     If ErrorMessage EQ '' then
 | |
|                                         // Write Coordinate Data
 | |
|                                         If SpreadsheetName NE '8-inch New HV Epi Development.xlsx' then
 | |
|                                             // 6-inch spreadsheets                                      
 | |
|                                             Excel_Services('SetCellValue', DocObj, WorksheetName, ThickCoordCol, (SpreadsheetRowIndex + NumValues), 'Avg.')
 | |
|                                             For each Row in XRDCoordData using @FM setting fPos
 | |
|                                                 SBNo  = Row<0, 2>
 | |
|                                                 Value = Abs(Row<0, 4>)
 | |
|                                                 Excel_Services('SetCellValue', DocObj, WorksheetName, TL0Col, (SpreadsheetRowIndex + 6 + SBNo), Value)
 | |
|                                                 Excel_Services('SetCellValue', DocObj, WorksheetName, ThickCoordCol, ( SpreadsheetRowIndex + (SBNo - 1) ), Value:'mm')                                               
 | |
|                                             Next Row 
 | |
|                                             // Write Wt. Avg. Data (applies to 6-inch spreadsheets only)
 | |
|                                             RowIndex = SpreadsheetRowIndex + NumValues + 3
 | |
|                                             For each Row in XRDWtAvgData using @FM setting fPos
 | |
|                                                 Parameter = Row<0, 1>
 | |
|                                                 SBNo      = Row<0, 2>
 | |
|                                                 Pocket    = Row<0, 3>
 | |
|                                                 Value     = Row<0, 4>
 | |
|                                                 Begin Case
 | |
|                                                     Case Parameter EQ 'Al% B.B. WTAVG'
 | |
|                                                         Col = BBCol                                           
 | |
|                                                     Case Parameter EQ 'Al% Barrier WTAVG'
 | |
|                                                         Col = BarrierCol
 | |
|                                                     Case Parameter EQ 'Al% SLS WTAVG'
 | |
|                                                         Col = SLSCol
 | |
|                                                     Case Parameter EQ 'Al% TL1 WTAVG'
 | |
|                                                         Col = TL1Col
 | |
|                                                     Case Parameter EQ 'SL Period WTAVG'
 | |
|                                                         Col = SLPeriodCol
 | |
|                                                     Case Otherwise$
 | |
|                                                     ErrorMessage = 'Error in service ':Service:'. Unrecognized parameter ':Parameter:'.'
 | |
|                                                 End Case
 | |
|                                             Until ErrorMessage NE ''
 | |
|                                                 Excel_Services('SetCellValue', DocObj, WorksheetName, Col, RowIndex, Value)
 | |
|                                             Next Row                                                                                                                                           
 | |
|                                         end else
 | |
|                                             // 8-inch spreadsheet
 | |
|                                             Excel_Services('SetCellValue', DocObj, WorksheetName, ThickCoordCol, (SpreadsheetRowIndex + NumValues), 'Avg.')
 | |
|                                             Excel_Services('SetCellValue', DocObj, WorksheetName, ThickCoordCol, (SpreadsheetRowIndex + NumValues + 1), 'Range')   
 | |
|                                             For each Row in XRDCoordData using @FM setting fPos
 | |
|                                                 SBNo  = Row<0, 2>
 | |
|                                                 Value = Abs(Row<0, 4>)
 | |
|                                                 Excel_Services('SetCellValue', DocObj, WorksheetName, ThickCoordCol, ( SpreadsheetRowIndex + (SBNo - 1) ), Value:'mm')     
 | |
|                                             Next Row
 | |
|                                             // Calculate Range Values
 | |
|                                             BBRange       = BBMax - BBMin
 | |
|                                             BarrierRange  = BarrierMax - BarrierMin
 | |
|                                             SLSRange      = SLSMax - SLSMin
 | |
|                                             TL1Range      = TL1Max - TL1Min
 | |
|                                             SLPeriodRange = SLPeriodMax - SLPeriodMin
 | |
|                                             // Write Range Values
 | |
|                                             RowIndex      = SpreadsheetRowIndex + RangeOffset
 | |
|                                             Excel_Services('SetCellValue', DocObj, WorksheetName, BBCol, RowIndex, BBRange)
 | |
|                                             Excel_Services('SetCellValue', DocObj, WorksheetName, BarrierCol, RowIndex, BarrierRange)
 | |
|                                             Excel_Services('SetCellValue', DocObj, WorksheetName, SLSCol, RowIndex, SLSRange)
 | |
|                                             Excel_Services('SetCellValue', DocObj, WorksheetName, TL1Col, RowIndex, TL1Range)
 | |
|                                             Excel_Services('SetCellValue', DocObj, WorksheetName, SLPeriodCol, RowIndex, SLPeriodRange)                          
 | |
|                                         end                                       
 | |
|                                         // Write thickness and FWHM data
 | |
|                                         ThicknessMin   = 0
 | |
|                                         ThicknessMax   = 0
 | |
|                                         ThicknessRange = 0
 | |
|                                         FWHM006Min     = 0
 | |
|                                         FWHM006Max     = 0
 | |
|                                         FWHM006Range   = 0
 | |
|                                         FWHM105Min     = 0
 | |
|                                         FWHM105Max     = 0
 | |
|                                         FWHM105Range   = 0
 | |
|                                         For each Row in XRDThicknessData using @FM setting fPos
 | |
|                                             Parameter = Row<0, 1>
 | |
|                                             SBNo      = Row<0, 2>
 | |
|                                             Pocket    = Row<0, 3>
 | |
|                                             Value     = Row<0, 4>
 | |
|                                             Begin Case
 | |
|                                                 Case Parameter EQ 'XRR Thickness (nm)'
 | |
|                                                     Col = ThicknessCol
 | |
|                                                     If ThicknessMin EQ 0 then
 | |
|                                                         // Initialize min and max variables
 | |
|                                                         ThicknessMin = Value
 | |
|                                                         ThicknessMax = Value
 | |
|                                                     end
 | |
|                                                     If Value LT ThicknessMin then ThicknessMin = Value
 | |
|                                                     If Value GT ThicknessMax then ThicknessMax = Value
 | |
|                                                 Case Parameter EQ 'FWHM 006'
 | |
|                                                     Col = FWHM006Col
 | |
|                                                     If FWHM006Min EQ 0 then
 | |
|                                                         // Initialize min and max variables
 | |
|                                                         FWHM006Min = Value
 | |
|                                                         FWHM006Max = Value
 | |
|                                                     end
 | |
|                                                     If Value LT FWHM006Min then FWHM006Min = Value
 | |
|                                                     If Value GT FWHM006Max then FWHM006Max = Value
 | |
|                                                 Case Parameter EQ 'FWHM 105'
 | |
|                                                     Col = FWHM105Col
 | |
|                                                     If FWHM105Min EQ 0 then
 | |
|                                                         FWHM105Min = Value
 | |
|                                                         FWHM105Max = Value
 | |
|                                                     end
 | |
|                                                     If Value LT FWHM105Min then FWHM105Min = Value
 | |
|                                                     If Value GT FWHM105Max then FWHM105Max = Value
 | |
|                                                 Case Otherwise$                                                    
 | |
|                                                     ErrorMessage = 'Error in service ':Service:'. Unrecognized parameter ':Parameter:'.'
 | |
|                                             End Case
 | |
|                                         Until ErrorMessage NE '' 
 | |
|                                             // The following code to used to place the average in the correct row
 | |
|                                             If SBNo EQ 0 then
 | |
|                                                 // Average value is SBNo 0
 | |
|                                                 RowOffset = NumValues
 | |
|                                             end else
 | |
|                                                 RowOffset = SBNo - 1
 | |
|                                             end                                        
 | |
|                                             RowIndex  = SpreadsheetRowIndex + RowOffset
 | |
|                                             If ( (SBNo NE 0) or (SpreadsheetName EQ '8-inch New HV Epi Development.xlsx') or (Parameter EQ 'XRR Thickness (nm)') ) then
 | |
|                                                 // Do not write the average values (i.e. SBNo = 0) for 6-inch spreadsheets
 | |
|                                                 Excel_Services('SetCellValue', DocObj, WorksheetName, Col, RowIndex, Value)                                                                                                                             
 | |
|                                             end
 | |
|                                             If SpreadsheetName EQ '8-inch New HV Epi Development.xlsx' then
 | |
|                                                 RowIndex       = SpreadsheetRowIndex + NumValues + 1    
 | |
|                                                 ThicknessRange = ThicknessMax - ThicknessMin
 | |
|                                                 FWHM006Range   = FWHM006Max - FWHM006Min
 | |
|                                                 FWHM105Range   = FWHM105Max - FWHM105Min                                     
 | |
|                                                 Excel_Services('SetCellValue', DocObj, WorksheetName, ThicknessCol, RowIndex, ThicknessRange)
 | |
|                                                 Excel_Services('SetCellValue', DocObj, WorksheetName, FWHM006Col, RowIndex, FWHM006Range)
 | |
|                                                 Excel_Services('SetCellValue', DocObj, WorksheetName, FWHM105Col, RowIndex, FWHM105Range) 
 | |
|                                             end
 | |
|                                         Next Row
 | |
|                                     end
 | |
|                                     If ErrorMessage EQ '' then
 | |
|                                         Excel_Services('SaveDocument', DocObj, TempPath, SpreadsheetPW)
 | |
|                                         If Error_Services('NoError') then
 | |
|                                             TempFileHandle     = File_Services('LockFile', TempPath, GENERIC_WRITE$, FILE_SHARE_READ$, OPEN_EXISTING$)
 | |
|                                             TempFileHandleCopy = TempFileHandle
 | |
|                                             TempFileSize       = 0
 | |
|                                             If FileHandle NE FILE_ERROR$ then
 | |
|                                                 // We were able to get the lock
 | |
|                                                 TempFileSize = File_Services('GetFileSize', TempFileHandle)
 | |
|                                                 File_Services('UnlockFile', TempFileHandle)
 | |
|                                             end
 | |
|                                             Begin Case
 | |
|                                                 Case TempFileHandleCopy EQ FILE_ERROR$
 | |
|                                                     // Failed to lock file again to verify file size (i.e. that the save operation worked)
 | |
|                                                     ErrorMessage = 'Error in ':Service:' service. Failed to lock document ':TempPath:' to verify the save operation was successful.'      
 | |
|                                                 Case TempFileSize EQ 0
 | |
|                                                     // Save failed - file corrupted
 | |
|                                                     ErrorMessage = 'Error in ':Service:' service. File size equal to zero. Document ':TempPath:' failed to save.'   
 | |
|                                                 Case Otherwise$
 | |
|                                                     // Save successful, so copy temp file back to document (PROD) path.
 | |
|                                                     File_Services('UnlockFile', FileHandle)
 | |
|                                                     CopySucceeded = File_Services('CopyFile', TempPath, DocumentPath)
 | |
|                                                     If CopySucceeded EQ False$ then
 | |
|                                                         ErrorMessage = 'Error in ':Service:' service. Failed to copy ':TempPath:' to ':DocumentPath:'.'
 | |
|                                                     end
 | |
|                                             End Case    
 | |
|                                         end else
 | |
|                                             // SaveDocument call failed. Get internal error for logging purposes.
 | |
|                                             ErrorMessage = Error_Services('GetMessage') 
 | |
|                                         end
 | |
|                                     end                                                                
 | |
|                                 end else
 | |
|                                     // Row index did not match. Log error.
 | |
|                                     ErrorMessage  = 'Error in ':Service:' service. Run ID in row ':SpreadsheetRowIndex
 | |
|                                     ErrorMessage := ' column A in 'SpreadsheetName:' worksheet ':WorksheetName
 | |
|                                     ErrorMessage := ' did not match GaNRunID ':GaNRunID:' in REACT_RUN record ':RDSNo:'.'
 | |
|                                     Excel_Services('CloseDocument', DocObj)       
 | |
|                                 end                                                                                   
 | |
|                             end else                        
 | |
|                                 ErrorMessage = 'Error in ':Service:' service. ':DocumentPath:' file could not be opened by Excel_Services.' 
 | |
|                             end
 | |
|                             OSDelete TempPath                                     
 | |
|                         end else
 | |
|                             ErrorMessage = 'Error in ':Service:' service. ':DocumentPath:' file is in use an cannot be updated at this time.'                       
 | |
|                         end    
 | |
|                     end else
 | |
|                         ErrorMessage = 'Error in ':Service:' service. XRD data is missing in IQS.'
 | |
|                     end
 | |
|                 end else
 | |
|                     ErrorMessage = 'Error in ':Service:' service. XRD data is missing in IQS.'
 | |
|                 end
 | |
|             end else
 | |
|                 ErrorMessage = 'Error in ':Service:' service. Run ID for RDS ':RDSNo:' is null.'      
 | |
|             end
 | |
|         end else
 | |
|             ErrorMessage = 'Error in ':Service:' service. No Excel row index found for RDS ':RDSNo:' - Run ID ':GaNRunID:'.'
 | |
|         end
 | |
|     end else
 | |
|         ErrorMessage = 'Error in ':Service:' service. RDSNo is null.'     
 | |
|     end
 | |
|     
 | |
|     If DocObj NE '' then Excel_Services('CloseDocument', DocObj)
 | |
|     If ( (FileHandle NE '') and (FileHandle NE FILE_ERROR$) ) then File_Services('UnlockFile', FileHandle)
 | |
|     If ErrorMessage NE '' then Error_Services('Add', ErrorMessage)
 | |
|     
 | |
| end service
 | |
| 
 | |
| 
 | |
| Service PostHALLData(RDSNo)
 | |
| 
 | |
|     DocObj       = ''
 | |
|     ErrorMessage = ''
 | |
|     FileHandle   = ''
 | |
|     If RDSNo NE '' then
 | |
|         ReactRunRec         = Database_Services('ReadDataRow', 'REACT_RUN', RDSNo)
 | |
|         GaNRunID            = ReactRunRec<REACT_RUN_GAN_RUN_ID$>
 | |
|         WONo                = ReactRunRec<REACT_RUN_WO_NO$>
 | |
|         Reactor             = ReactRunRec<REACT_RUN_REACTOR$>
 | |
|         SpreadsheetRowIndex = ReactRunRec<REACT_RUN_EA_ROW_INDEX$>
 | |
|         RunRecipe           = ReactRunRec<REACT_RUN_GAN_RECIPE$>      
 | |
|         SpreadsheetInfo     = Engineering_Services('GetSpreadSheetInfo', RDSNo)
 | |
|         SpreadsheetName     = SpreadsheetInfo<1>
 | |
|         WorksheetName       = SpreadsheetInfo<2>
 | |
|         SpreadsheetPW       = SpreadsheetInfo<3>
 | |
|         SpreadsheetDir      = SpreadsheetInfo<4>
 | |
|         Offset              = SpreadsheetInfo<5>
 | |
|               
 | |
|         If SpreadsheetName NE '8-inch New HV Epi Development.xlsx' then
 | |
|             // Hall data is currently only recorded for 6-inch wafers       
 | |
|             If SpreadsheetRowIndex NE '' then
 | |
|                 If GaNRunID NE '' then
 | |
|                     HallData   = Engineering_Services('GetHallData', RDSNo)
 | |
|                     // Log SQL response
 | |
|                     LogData<1> = LoggingDTM
 | |
|                     LogData<2> = RDSNo
 | |
|                     LogData<3> = HallData
 | |
|                     Logging_Services('AppendLog', objSQLLog, LogData, @RM, @FM)
 | |
|                     If ( (HallData NE '') and (HallData NE 0) ) then          
 | |
|                         DocumentPath = SpreadsheetDir:SpreadsheetName
 | |
|                         FileHandle   = File_Services('LockFile', DocumentPath, GENERIC_WRITE$, FILE_SHARE_READ$, OPEN_EXISTING$)
 | |
|                         If FileHandle NE FILE_ERROR$ then
 | |
|                             // Make a temporary backup in case the Excel file fails to save and becomes corrupted
 | |
|                             Datetime      = OConv(Datetime(), 'DT')
 | |
|                             Swap ' ' with '-' in Datetime
 | |
|                             Swap ':' with ';' in Datetime
 | |
|                             TempFilename  = GaNRunID:'-':Datetime:'.xlsx'                       
 | |
|                             TempDirectory = Str(\00\, 1024)
 | |
|                             GetTempPath(Len(TempDirectory), TempDirectory)
 | |
|                             Convert \00\ to '' in TempDirectory                       
 | |
|                             TempPath      = TempDirectory:TempFilename
 | |
|                             File_Services('CopyFile', DocumentPath, TempPath)                  
 | |
|                             DocObj        = Excel_Services('OpenDocument', TempPath, SpreadsheetPW)
 | |
|                             If Error_Services('NoError') then                            
 | |
|                                 Set_Status(0)
 | |
|                                 // Verify spreadsheet row index is correct
 | |
|                                 RunIDCellText = Excel_Services('GetCellValue', DocObj, WorksheetName, 'A', SpreadsheetRowIndex)
 | |
|                                 RowRunID      = RunIDCellText[1, 12]
 | |
|                                 If RowRunID EQ GaNRunID then
 | |
|                                     Begin Case
 | |
|                                         Case SpreadsheetName EQ 'MV_R71_6-inch Epi Development.xlsx'
 | |
|                                             RSCol       = 'AR'
 | |
|                                             MobilityCol = 'AS'
 | |
|                                             NSCol       = 'AT'                                   
 | |
|                                         Case SpreadsheetName EQ 'HV_R71_6-inch Epi Development.xlsx'
 | |
|                                             RSCol       = 'AS'
 | |
|                                             MobilityCol = 'AT'
 | |
|                                             NSCol       = 'AU'                                      
 | |
|                                     End Case
 | |
|                                     NumRSVals          = 0
 | |
|                                     NumMobilityVals    = 0
 | |
|                                     NumNSVals          = 0
 | |
|                                     RSVals             = ''
 | |
|                                     MobilityVals       = ''
 | |
|                                     NSVals             = ''
 | |
|                                     RSDeviations       = ''
 | |
|                                     MobilityDeviations = ''
 | |
|                                     NSDeviations       = ''
 | |
|                                     RSAvg              = ''
 | |
|                                     MobilityAvg        = ''
 | |
|                                     NSAvg              = ''
 | |
|                                     RSCV               = ''
 | |
|                                     MobilityCV         = ''
 | |
|                                     NSCV               = ''                     
 | |
|                                     // Write Hall values                                                                        
 | |
|                                     For each Row in HallData using @FM setting fPos
 | |
|                                         Parameter = Row<0, 1>
 | |
|                                         SBNo      = Row<0, 2>
 | |
|                                         Value     = Row<0, 3>
 | |
|                                         Begin Case
 | |
|                                             Case Parameter EQ 'Hall Rs'
 | |
|                                                 Col = RSCol
 | |
|                                                 If SBNo EQ 0 then
 | |
|                                                     RowOffset = 7
 | |
|                                                     RSAvg     = Value
 | |
|                                                 end else
 | |
|                                                     RowOffset      = SBNo - 1
 | |
|                                                     NumRSVals     += 1
 | |
|                                                     RSVals<0, -1>  = Value
 | |
|                                                 end                              
 | |
|                                             Case Parameter EQ 'Mobility'
 | |
|                                                 Col = MobilityCol
 | |
|                                                 If SBNo EQ 0 then
 | |
|                                                     RowOffset   = 7
 | |
|                                                     MobilityAvg = Value
 | |
|                                                 end else
 | |
|                                                     RowOffset            = SBNo - 1
 | |
|                                                     NumMobilityVals     += 1
 | |
|                                                     MobilityVals<0, -1>  = Value
 | |
|                                                 end       
 | |
|                                             Case Parameter EQ 'Sheet Concentration'
 | |
|                                                 Col = NSCol
 | |
|                                                 If SBNo EQ 0 then
 | |
|                                                     RowOffset = 7
 | |
|                                                     NSAvg     = Value
 | |
|                                                 end else
 | |
|                                                     RowOffset      = SBNo - 1
 | |
|                                                     NumNSVals     += 1
 | |
|                                                     NSVals<0, -1>  = Value
 | |
|                                                 end
 | |
|                                             Case Otherwise$
 | |
|                                                 ErrorMessage = 'Error in service ':Service:'. Unrecognized parameter ':Parameter:'.'       
 | |
|                                         End Case
 | |
|                                     Until ErrorMessage NE ''                                                                                                                       
 | |
|                                         RowIndex  = SpreadsheetRowIndex + RowOffset
 | |
|                                         Excel_Services('SetCellValue', DocObj, WorksheetName, Col, RowIndex, Value)                                                                                             
 | |
|                                     Next Row
 | |
|                                     If ErrorMessage EQ '' then
 | |
|                                         // Calculate Std Dev for RS
 | |
|                                         For each Value in RSVals using @VM setting vPos
 | |
|                                             Deviation             = Value - RSAvg
 | |
|                                             RSDeviations<0, vPos> = Deviation ** 2
 | |
|                                         Next Value
 | |
|                                         RSDevsSum = Sum(RSDeviations)
 | |
|                                         // Std Dev for a sample, not population
 | |
|                                         If (NumRSVals - 1) GT 0 then
 | |
|                                             Variance = RSDevsSum / (NumRSVals - 1)
 | |
|                                             RSStdDev  = Variance ** 0.5
 | |
|                                             // Coefficient of Variation
 | |
|                                             If RSAvg GT 0 then RSCV = RSStdDev / RSAvg
 | |
|                                         end                                    
 | |
|                                         // Calculate Std Dev for Mobility
 | |
|                                         For each Value in MobilityVals using @VM setting vPos
 | |
|                                             Deviation             = Value - MobilityAvg
 | |
|                                             MobilityDeviations<0, vPos> = Deviation ** 2
 | |
|                                         Next Value
 | |
|                                         MobilityDevsSum = Sum(MobilityDeviations)
 | |
|                                         If (NumMobilityVals - 1) GT 0 then
 | |
|                                             Variance = MobilityDevsSum / (NumMobilityVals - 1)
 | |
|                                             MobilityStdDev  = Variance ** 0.5
 | |
|                                             // Coefficient of Variation
 | |
|                                             If MobilityAvg GT 0 then MobilityCV = MobilityStdDev / MobilityAvg
 | |
|                                         end                                   
 | |
|                                         // Calculate Std Dev for NS
 | |
|                                         For each Value in NSVals using @VM setting vPos
 | |
|                                             Deviation             = Value - NSAvg
 | |
|                                             NSDeviations<0, vPos> = Deviation ** 2
 | |
|                                         Next Value
 | |
|                                         NSDevsSum  = Sum(NSDeviations)
 | |
|                                         // Std Dev for a sample, not population
 | |
|                                         If (NumNSVals - 1) GT 0 then
 | |
|                                             Variance = NSDevsSum / (NumNSVals - 1)
 | |
|                                             NSStdDev  = Variance ** 0.5
 | |
|                                             // Coefficient of Variation
 | |
|                                             If NSAvg GT 0 then NSCV = NSStdDev / NSAvg
 | |
|                                         end                                    
 | |
|                                         // Write Std Dev Values
 | |
|                                         StdDevRow = 8
 | |
|                                         RowIndex  = SpreadsheetRowIndex + StdDevRow
 | |
|                                         Excel_Services('SetCellValue', DocObj, WorksheetName, RSCol, RowIndex, RSCV)
 | |
|                                         Excel_Services('SetCellValue', DocObj, WorksheetName, MobilityCol, RowIndex, MobilityCV)
 | |
|                                         Excel_Services('SetCellValue', DocObj, WorksheetName, NSCol, RowIndex, NSCV)
 | |
|                                         // Save document                                                                                                                                                        
 | |
|                                         Excel_Services('SaveDocument', DocObj, TempPath, SpreadsheetPW)
 | |
|                                         If Error_Services('NoError') then
 | |
|                                             TempFileHandle     = File_Services('LockFile', TempPath, GENERIC_WRITE$, FILE_SHARE_READ$, OPEN_EXISTING$)
 | |
|                                             TempFileHandleCopy = TempFileHandle
 | |
|                                             TempFileSize       = 0
 | |
|                                             If FileHandle NE FILE_ERROR$ then
 | |
|                                                 // We were able to get the lock
 | |
|                                                 TempFileSize = File_Services('GetFileSize', TempFileHandle)
 | |
|                                                 File_Services('UnlockFile', TempFileHandle)
 | |
|                                             end
 | |
|                                             Begin Case
 | |
|                                                 Case TempFileHandleCopy EQ FILE_ERROR$
 | |
|                                                     // Failed to lock file again to verify file size (i.e. that the save operation worked)
 | |
|                                                     ErrorMessage = 'Error in ':Service:' service. Failed to lock document ':TempPath:' to verify the save operation was successful.'      
 | |
|                                                 Case TempFileSize EQ 0
 | |
|                                                     // Save failed - file corrupted
 | |
|                                                     ErrorMessage = 'Error in ':Service:' service. File size equal to zero. Document ':TempPath:' failed to save.'   
 | |
|                                                 Case Otherwise$
 | |
|                                                     // Save successful, so copy temp file back to document (PROD) path.
 | |
|                                                     File_Services('UnlockFile', FileHandle)
 | |
|                                                     CopySucceeded = File_Services('CopyFile', TempPath, DocumentPath)
 | |
|                                                     If CopySucceeded EQ False$ then
 | |
|                                                         ErrorMessage = 'Error in ':Service:' service. Failed to copy ':TempPath:' to ':DocumentPath:'.'
 | |
|                                                     end
 | |
|                                             End Case    
 | |
|                                         end else
 | |
|                                             // SaveDocument call failed. Get internal error for logging purposes.
 | |
|                                             ErrorMessage = Error_Services('GetMessage') 
 | |
|                                         end
 | |
|                                     end                                                           
 | |
|                                 end else
 | |
|                                     // Row index did not match. Log error.
 | |
|                                     ErrorMessage  = 'Error in ':Service:' service. Run ID in row ':SpreadsheetRowIndex
 | |
|                                     ErrorMessage := ' column A in 'SpreadsheetName:' worksheet ':WorksheetName
 | |
|                                     ErrorMessage := ' did not match GaNRunID ':GaNRunID:' in REACT_RUN record ':RDSNo:'.'
 | |
|                                     Excel_Services('CloseDocument', DocObj)       
 | |
|                                 end                                                                                           
 | |
|                             end else
 | |
|                                 ErrorMessage = 'Error in ':Service:' service. ':DocumentPath:' file could not be opened by Excel_Services.'  
 | |
|                             end
 | |
|                             OSDelete TempPath                                     
 | |
|                         end else
 | |
|                             ErrorMessage = 'Error in ':Service:' service. ':DocumentPath:' file is in use an cannot be updated at this time.'                        
 | |
|                         end
 | |
|                     end else
 | |
|                         ErrorMessage = 'Error in ':Service:' service. Hall data missing in IQS.'
 | |
|                     end
 | |
|                 end else
 | |
|                     ErrorMessage = 'Error in ':Service:' service. Run ID for RDS ':RDSNo:' is null.'
 | |
|                 end
 | |
|             end else
 | |
|                 ErrorMessage = 'Error in ':Service:' service. No Excel row index found for RDS ':RDSNo:' - Run ID ':GaNRunID:'.'   
 | |
|             end
 | |
|         end
 | |
|     end else
 | |
|         ErrorMessage = 'Error in ':Service:' service. RDSNo is null.'
 | |
|     end
 | |
|     
 | |
|     If DocObj NE '' then Excel_Services('CloseDocument', DocObj)
 | |
|     If ( (FileHandle NE '') and (FileHandle NE FILE_ERROR$) ) then File_Services('UnlockFile', FileHandle)
 | |
|     If ErrorMessage NE '' then Error_Services('Add', ErrorMessage)
 | |
| 
 | |
| end service
 | |
| 
 | |
| 
 | |
| Service PostBVData(RDSNo)
 | |
| 
 | |
|     DocObj       = ''
 | |
|     ErrorMessage = ''
 | |
|     FileHandle   = ''
 | |
|     If RDSNo NE '' then
 | |
|         ReactRunRec         = Database_Services('ReadDataRow', 'REACT_RUN', RDSNo)
 | |
|         GaNRunID            = ReactRunRec<REACT_RUN_GAN_RUN_ID$>
 | |
|         WONo                = ReactRunRec<REACT_RUN_WO_NO$>
 | |
|         Reactor             = ReactRunRec<REACT_RUN_REACTOR$>
 | |
|         SpreadsheetRowIndex = ReactRunRec<REACT_RUN_EA_ROW_INDEX$>
 | |
|         RunRecipe           = ReactRunRec<REACT_RUN_GAN_RECIPE$>      
 | |
|         SpreadsheetInfo     = Engineering_Services('GetSpreadSheetInfo', RDSNo)
 | |
|         SpreadsheetName     = SpreadsheetInfo<1>
 | |
|         WorksheetName       = SpreadsheetInfo<2>
 | |
|         SpreadsheetPW       = SpreadsheetInfo<3>
 | |
|         SpreadsheetDir      = SpreadsheetInfo<4>
 | |
|         Offset              = SpreadsheetInfo<5>
 | |
|               
 | |
|         If SpreadsheetRowIndex NE '' then
 | |
|             If GaNRunID NE '' then
 | |
|                 BVData     = Engineering_Services('GetBVData', RDSNo, 'Breakdown Voltage')
 | |
|                 // Log SQL response
 | |
|                 LogData<1> = LoggingDTM
 | |
|                 LogData<2> = RDSNo
 | |
|                 LogData<3> = BVData
 | |
|                 Logging_Services('AppendLog', objSQLLog, LogData, @RM, @FM)             
 | |
|                 If ( Error_Services('NoError') and (BVData NE '') and (BVData NE 0) ) then
 | |
|                     BVEdgeData = Engineering_Services('GetBVData', RDSNo, 'Breakdown Voltage - Edge')
 | |
|                     // Log SQL response
 | |
|                     LogData<1> = LoggingDTM
 | |
|                     LogData<2> = RDSNo
 | |
|                     LogData<3> = BVEdgeData
 | |
|                     Logging_Services('AppendLog', objSQLLog, LogData, @RM, @FM)
 | |
|                     If ( Error_Services('NoError') and (BVEdgeData NE '') and (BVEdgeData NE 0) ) then
 | |
|                         If SpreadsheetName EQ '8-inch New HV Epi Development.xlsx' then
 | |
|                             // 8-inch spreadsheet - Middle = Left, Edge = Right                                   
 | |
|                             BVMiddleData = Engineering_Services('GetBVData', RDSNo, 'Breakdown Voltage - Middle')
 | |
|                             // Log SQL response
 | |
|                             LogData<1>   = LoggingDTM
 | |
|                             LogData<2>   = RDSNo
 | |
|                             LogData<3>   = BVMiddleData
 | |
|                             Logging_Services('AppendLog', objSQLLog, LogData, @RM, @FM)
 | |
|                             If ( Error_Services('HasError') or (BVMiddleData EQ '') or (BVMiddleData EQ 0) ) then
 | |
|                                 ErrorMessage = 'Error in service ':Service:'. Breakdown Voltage - Middle data is missing in IQS.'
 | |
|                             end
 | |
|                         end
 | |
|                         If ErrorMessage EQ '' then
 | |
|                             DocumentPath = SpreadsheetDir:SpreadsheetName
 | |
|                             FileHandle   = File_Services('LockFile', DocumentPath, GENERIC_WRITE$, FILE_SHARE_READ$, OPEN_EXISTING$)
 | |
|                             If FileHandle NE FILE_ERROR$ then
 | |
|                                 // Make a temporary backup in case the Excel file fails to save and becomes corrupted
 | |
|                                 Datetime      = OConv(Datetime(), 'DT')
 | |
|                                 Swap ' ' with '-' in Datetime
 | |
|                                 Swap ':' with ';' in Datetime
 | |
|                                 TempFilename  = GaNRunID:'-':Datetime:'.xlsx'                       
 | |
|                                 TempDirectory = Str(\00\, 1024)
 | |
|                                 GetTempPath(Len(TempDirectory), TempDirectory)
 | |
|                                 Convert \00\ to '' in TempDirectory                       
 | |
|                                 TempPath      = TempDirectory:TempFilename
 | |
|                                 File_Services('CopyFile', DocumentPath, TempPath)                  
 | |
|                                 DocObj        = Excel_Services('OpenDocument', TempPath, SpreadsheetPW)
 | |
|                                 If Error_Services('NoError') then                            
 | |
|                                     // Verify spreadsheet row index is correct
 | |
|                                     RunIDCellText = Excel_Services('GetCellValue', DocObj, WorksheetName, 'A', SpreadsheetRowIndex)
 | |
|                                     RowRunID      = RunIDCellText[1, 12]
 | |
|                                     If RowRunID EQ GaNRunID then
 | |
|                                         Begin Case
 | |
|                                             Case SpreadsheetName EQ 'MV_R71_6-inch Epi Development.xlsx'
 | |
|                                                 LeftCol   = 'BL'
 | |
|                                                 CenterCol = 'BM'
 | |
|                                                 RightCol  = 'BN'
 | |
|                                                 AvgCol    = 'BO'
 | |
|                                                 NumValues = 5                                      
 | |
|                                             Case SpreadsheetName EQ 'HV_R71_6-inch Epi Development.xlsx'
 | |
|                                                 LeftCol   = 'BM'
 | |
|                                                 CenterCol = 'BN'
 | |
|                                                 RightCol  = 'BO'
 | |
|                                                 AvgCol    = 'BP'
 | |
|                                                 NumValues = 5
 | |
|                                             Case SpreadsheetName EQ '8-inch New HV Epi Development.xlsx'
 | |
|                                                 LeftCol   = 'BP'
 | |
|                                                 CenterCol = 'BQ'
 | |
|                                                 RightCol  = 'BR'
 | |
|                                                 AvgCol    = 'BS'
 | |
|                                                 NumValues = 5                                     
 | |
|                                         End Case                             
 | |
|                                         // Write Breakdown Voltage values
 | |
|                                         BVAvgTotal  = 0
 | |
|                                         BVAvgPoints = 0
 | |
|                                         BVAvgMax    = 0
 | |
|                                         BVAvgMin    = 0            
 | |
|                                         Col         = CenterCol
 | |
|                                         For each Row in BVData using @FM setting fPos
 | |
|                                             SBNo      = Row<0, 2>
 | |
|                                             Value     = Row<0, 3>
 | |
|                                             // The following code to used to place the average in the correct row
 | |
|                                             If SBNo EQ 0 then
 | |
|                                                 // Average value is SBNo 0
 | |
|                                                 RowOffset    = NumValues + 1
 | |
|                                                 BVAvgTotal  += Value
 | |
|                                                 BVAvgPoints += 1
 | |
|                                                 // Initialize BV Avg Max and Min to the Center Avg
 | |
|                                                 BVAvgMax     = Value
 | |
|                                                 BVAvgMin     = Value
 | |
|                                             end else
 | |
|                                                 RowOffset = SBNo - 1
 | |
|                                             end                                        
 | |
|                                             RowIndex  = SpreadsheetRowIndex + RowOffset
 | |
|                                             Excel_Services('SetCellValue', DocObj, WorksheetName, Col, RowIndex, Value)
 | |
|                                         Next Row      
 | |
|                                         // Write Left (or Middle) and Right (or Edge) BV Data
 | |
|                                         If SpreadsheetName NE '8-inch New HV Epi Development.xlsx' then
 | |
|                                             // 6-inch spreadsheets - SBNo = 1 -> Left, SBNo = 2 -> Right
 | |
|                                             RowIndex = SpreadsheetRowIndex
 | |
|                                             For each Row in BVEdgeData using @FM setting fPos
 | |
|                                                 SBNo      = Row<0, 2>
 | |
|                                                 Value     = Row<0, 3>                                       
 | |
|                                                 Begin Case
 | |
|                                                     Case SBNo EQ 1
 | |
|                                                         // Left                                                    
 | |
|                                                         Excel_Services('SetCellValue', DocObj, WorksheetName, LeftCol, RowIndex, Value)
 | |
|                                                         BVAvgTotal  += Value
 | |
|                                                         BVAvgPoints += 1
 | |
|                                                         If Value GT BVAvgMax then BVAvgMax = Value
 | |
|                                                         If Value LT BVAvgMin then BVAvgMin = Value
 | |
|                                                     Case SBNo EQ 2
 | |
|                                                         // Right
 | |
|                                                         Excel_Services('SetCellValue', DocObj, WorksheetName, RightCol, RowIndex, Value)
 | |
|                                                         BVAvgTotal  += Value
 | |
|                                                         BVAvgPoints += 1
 | |
|                                                         If Value GT BVAvgMax then BVAvgMax = Value
 | |
|                                                         If Value LT BVAvgMin then BVAvgMin = Value
 | |
|                                                     Case Otherwise$
 | |
|                                                         // 6 inch spreadsheets currently don't record the average (i.e. SBNo = 0)
 | |
|                                                         Null
 | |
|                                                 End Case                                                                                                                              
 | |
|                                             Next Row
 | |
|                                             // Calculate the average of the Left, Center average, and Right values
 | |
|                                             If BVAvgPoints GT 0 then
 | |
|                                                 BVAvg    = BVAvgTotal / BVAvgPoints
 | |
|                                                 RowIndex = SpreadsheetRowIndex + NumValues + 1
 | |
|                                                 Excel_Services('SetCellValue', DocObj, WorksheetName, AvgCol, RowIndex, BVAvg)                          
 | |
|                                             end
 | |
|                                             // Calculate the range of the averages
 | |
|                                             AvgRange = BVAvgMax - BVAvgMin
 | |
|                                             RowIndex = SpreadsheetRowIndex + NumValues + 1
 | |
|                                             Excel_Services('SetCellValue', DocObj, WorksheetName, AvgCol, RowIndex, AvgRange)      
 | |
|                                         end else
 | |
|                                             // 8-inch spreadsheet - Middle = Left, Edge = Right
 | |
|                                             MiddleAvg = 0                                  
 | |
|                                             For each Row in BVMiddleData using @FM setting fPos
 | |
|                                                 SBNo  = Row<0, 2>
 | |
|                                                 Value = Row<0, 3>
 | |
|                                                 // The following code to used to place the average in the correct row
 | |
|                                                 If SBNo EQ 0 then
 | |
|                                                     // Average value is SBNo 0
 | |
|                                                     RowOffset    = NumValues + 1
 | |
|                                                     BVAvgTotal  += Value
 | |
|                                                     BVAvgPoints += 1
 | |
|                                                     If Value GT BVAvgMax then BVAvgMax = Value
 | |
|                                                     If Value LT BVAvgMin then BVAvgMin = Value
 | |
|                                                 end else
 | |
|                                                     RowOffset = SBNo - 1
 | |
|                                                 end                                        
 | |
|                                                 RowIndex  = SpreadsheetRowIndex + RowOffset
 | |
|                                                 Excel_Services('SetCellValue', DocObj, WorksheetName, LeftCol, RowIndex, Value)                       
 | |
|                                             Next Row   
 | |
|                                             For each Row in BVEdgeData using @FM setting fPos
 | |
|                                                 SBNo  = Row<0, 2>
 | |
|                                                 Value = Row<0, 3>
 | |
|                                                 // The following code to used to place the average in the correct row
 | |
|                                                 If SBNo EQ 0 then
 | |
|                                                     // Average value is SBNo 0
 | |
|                                                     RowOffset    = NumValues + 1
 | |
|                                                     BVAvgTotal  += Value
 | |
|                                                     BVAvgPoints += 1
 | |
|                                                     If Value GT BVAvgMax then BVAvgMax = Value
 | |
|                                                     If Value LT BVAvgMin then BVAvgMin = Value
 | |
|                                                 end else
 | |
|                                                     RowOffset = SBNo - 1
 | |
|                                                 end                                        
 | |
|                                                 RowIndex  = SpreadsheetRowIndex + RowOffset
 | |
|                                                 Excel_Services('SetCellValue', DocObj, WorksheetName, RightCol, RowIndex, Value)                                                                                                    
 | |
|                                             Next Row
 | |
|                                             // Calculate the average of the Middle, Center, and Edge average values
 | |
|                                             If BVAvgPoints GT 0 then
 | |
|                                                 BVAvg    = BVAvgTotal / BVAvgPoints
 | |
|                                                 RowIndex = SpreadsheetRowIndex + NumValues + 3
 | |
|                                                 Excel_Services('SetCellValue', DocObj, WorksheetName, CenterCol, RowIndex, BVAvg)                             
 | |
|                                             end
 | |
|                                             // Calculate the range of the averages
 | |
|                                             AvgRange = BVAvgMax - BVAvgMin
 | |
|                                             RowIndex = SpreadsheetRowIndex + NumValues + 1
 | |
|                                             Excel_Services('SetCellValue', DocObj, WorksheetName, AvgCol, RowIndex, AvgRange)
 | |
|                                         end                                                                   
 | |
|                                         Excel_Services('SaveDocument', DocObj, TempPath, SpreadsheetPW)
 | |
|                                         If Error_Services('NoError') then
 | |
|                                             TempFileHandle     = File_Services('LockFile', TempPath, GENERIC_WRITE$, FILE_SHARE_READ$, OPEN_EXISTING$)
 | |
|                                             TempFileHandleCopy = TempFileHandle
 | |
|                                             TempFileSize       = 0
 | |
|                                             If FileHandle NE FILE_ERROR$ then
 | |
|                                                 // We were able to get the lock
 | |
|                                                 TempFileSize = File_Services('GetFileSize', TempFileHandle)
 | |
|                                                 File_Services('UnlockFile', TempFileHandle)
 | |
|                                             end
 | |
|                                             Begin Case
 | |
|                                                 Case TempFileHandleCopy EQ FILE_ERROR$
 | |
|                                                     // Failed to lock file again to verify file size (i.e. that the save operation worked)
 | |
|                                                     ErrorMessage = 'Error in ':Service:' service. Failed to lock document ':TempPath:' to verify the save operation was successful.'      
 | |
|                                                 Case TempFileSize EQ 0
 | |
|                                                     // Save failed - file corrupted
 | |
|                                                     ErrorMessage = 'Error in ':Service:' service. File size equal to zero. Document ':TempPath:' failed to save.'   
 | |
|                                                 Case Otherwise$
 | |
|                                                     // Save successful, so copy temp file back to document (PROD) path.
 | |
|                                                     File_Services('UnlockFile', FileHandle)
 | |
|                                                     CopySucceeded = File_Services('CopyFile', TempPath, DocumentPath)
 | |
|                                                     If CopySucceeded EQ False$ then
 | |
|                                                         ErrorMessage = 'Error in ':Service:' service. Failed to copy ':TempPath:' to ':DocumentPath:'.'
 | |
|                                                     end
 | |
|                                             End Case    
 | |
|                                         end else
 | |
|                                             // SaveDocument call failed. Get internal error for logging purposes.
 | |
|                                             ErrorMessage = Error_Services('GetMessage') 
 | |
|                                         end                                                                
 | |
|                                     end else
 | |
|                                         // Row index did not match. Log error.
 | |
|                                         ErrorMessage  = 'Error in ':Service:' service. Run ID in row ':SpreadsheetRowIndex
 | |
|                                         ErrorMessage := ' column A in 'SpreadsheetName:' worksheet ':WorksheetName
 | |
|                                         ErrorMessage := ' did not match GaNRunID ':GaNRunID:' in REACT_RUN record ':RDSNo:'.'
 | |
|                                         Excel_Services('CloseDocument', DocObj)       
 | |
|                                     end                                                              
 | |
|                                 end else
 | |
|                                     ErrorMessage = 'Error in ':Service:' service. ':DocumentPath:' file could not be opened by Excel_Services.'   
 | |
|                                 end
 | |
|                                 OSDelete TempPath                                   
 | |
|                             end else
 | |
|                                 ErrorMessage = 'Error in ':Service:' service. ':DocumentPath:' file is in use an cannot be updated at this time.'                        
 | |
|                             end
 | |
|                         end
 | |
|                     end else
 | |
|                         ErrorMessage = 'Error in ':Service:' service. Breakdown Voltage data missing in IQS.'    
 | |
|                     end
 | |
|                 end else
 | |
|                     ErrorMessage = 'Error in ':Service:' service. Breakdown Voltage data missing in IQS.'   
 | |
|                 end
 | |
|             end else
 | |
|                 ErrorMessage = 'Error in ':Service:' service. Run ID for RDS ':RDSNo:' is null.'   
 | |
|             end
 | |
|         end else
 | |
|             ErrorMessage = 'Error in ':Service:' service. No Excel row index found for RDS ':RDSNo:' - Run ID ':GaNRunID:'.'   
 | |
|         end
 | |
|     end else
 | |
|         ErrorMessage = 'Error in ':Service:' service. RDSNo is null.'   
 | |
|     end
 | |
|     
 | |
|     If DocObj NE '' then Excel_Services('CloseDocument')
 | |
|     If ( (FileHandle NE '') and (FileHandle NE FILE_ERROR$) ) then File_Services('UnlockFile', FileHandle)
 | |
|     If ErrorMessage NE '' then Error_Services('Add', ErrorMessage)
 | |
|     
 | |
| end service
 | |
| 
 | |
| 
 | |
| Service PostUVData(RDSNo)
 | |
| 
 | |
|     DocObj       = ''
 | |
|     ErrorMessage = ''
 | |
|     FileHandle   = ''
 | |
|     If RDSNo NE '' then
 | |
|         ReactRunRec         = Database_Services('ReadDataRow', 'REACT_RUN', RDSNo)
 | |
|         GaNRunID            = ReactRunRec<REACT_RUN_GAN_RUN_ID$>
 | |
|         WONo                = ReactRunRec<REACT_RUN_WO_NO$>
 | |
|         Reactor             = ReactRunRec<REACT_RUN_REACTOR$>
 | |
|         SpreadsheetRowIndex = ReactRunRec<REACT_RUN_EA_ROW_INDEX$>
 | |
|         RunRecipe           = ReactRunRec<REACT_RUN_GAN_RECIPE$>      
 | |
|         SpreadsheetInfo     = Engineering_Services('GetSpreadSheetInfo', RDSNo)
 | |
|         SpreadsheetName     = SpreadsheetInfo<1>
 | |
|         WorksheetName       = SpreadsheetInfo<2>
 | |
|         SpreadsheetPW       = SpreadsheetInfo<3>
 | |
|         SpreadsheetDir      = SpreadsheetInfo<4>
 | |
|         Offset              = SpreadsheetInfo<5>
 | |
|               
 | |
|         If SpreadsheetRowIndex NE '' then
 | |
|             If GaNRunID NE '' then
 | |
|                 UVData     = Engineering_Services('GetUVData', RDSNo)
 | |
|                 // Log SQL response
 | |
|                 LogData<1> = LoggingDTM
 | |
|                 LogData<2> = RDSNo
 | |
|                 LogData<3> = UVData
 | |
|                 Logging_Services('AppendLog', objSQLLog, LogData, @RM, @FM)
 | |
|                 If ( Error_Services('NoError') and (UVData NE '') and (UVData NE 0) ) then            
 | |
|                     DocumentPath = SpreadsheetDir:SpreadsheetName
 | |
|                     FileHandle   = File_Services('LockFile', DocumentPath, GENERIC_WRITE$, FILE_SHARE_READ$, OPEN_EXISTING$)
 | |
|                     If FileHandle NE FILE_ERROR$ then
 | |
|                         // Make a temporary backup in case the Excel file fails to save and becomes corrupted
 | |
|                         Datetime     = OConv(Datetime(), 'DT')
 | |
|                         Swap ' ' with '-' in Datetime
 | |
|                         Swap ':' with ';' in Datetime
 | |
|                         TempFilename = GaNRunID:'-':Datetime:'.xlsx'                       
 | |
|                         TempDirectory = Str(\00\, 1024)
 | |
|                         GetTempPath(Len(TempDirectory), TempDirectory)
 | |
|                         Convert \00\ to '' in TempDirectory                       
 | |
|                         TempPath     = TempDirectory:TempFilename
 | |
|                         File_Services('CopyFile', DocumentPath, TempPath)                  
 | |
|                         DocObj       = Excel_Services('OpenDocument', TempPath, SpreadsheetPW)
 | |
|                         If Error_Services('NoError') then                            
 | |
|                             // Verify spreadsheet row index is correct
 | |
|                             RunIDCellText = Excel_Services('GetCellValue', DocObj, WorksheetName, 'A', SpreadsheetRowIndex)
 | |
|                             RowRunID      = RunIDCellText[1, 12]
 | |
|                             If RowRunID EQ GaNRunID then
 | |
|                                 Begin Case
 | |
|                                     Case SpreadsheetName EQ 'MV_R71_6-inch Epi Development.xlsx'
 | |
|                                         BrokenCol       = 'BW'
 | |
|                                         NonRotationCol  = 'BX'
 | |
|                                         ScratchCol      = 'BY'
 | |
|                                         Cracking3to7Col = 'BZ'
 | |
|                                         CrackingGT7Col  = 'CA'
 | |
|                                         TrueHazeCol     = 'CB'
 | |
|                                         CrazingCol      = 'CC'
 | |
|                                         SlipCountCol    = 'CD'
 | |
|                                         SPEGT1mmCol     = 'CE'
 | |
|                                         SPECountCol     = 'CF'
 | |
|                                         NumValues       = 8                                       
 | |
|                                     Case SpreadsheetName EQ 'HV_R71_6-inch Epi Development.xlsx'
 | |
|                                         BrokenCol       = 'BX'
 | |
|                                         NonRotationCol  = 'BY'
 | |
|                                         ScratchCol      = 'BZ'
 | |
|                                         Cracking3to7Col = 'CA'
 | |
|                                         CrackingGT7Col  = 'CB'
 | |
|                                         TrueHazeCol     = 'CC'
 | |
|                                         CrazingCol      = 'CD'
 | |
|                                         SlipCountCol    = 'CE'
 | |
|                                         SPEGT1mmCol     = 'CF'
 | |
|                                         SPECountCol     = 'CG'
 | |
|                                         NumValues       = 8
 | |
|                                     Case SpreadsheetName EQ '8-inch New HV Epi Development.xlsx'
 | |
|                                         BrokenCol       = 'BT'
 | |
|                                         NonRotationCol  = 'BU'
 | |
|                                         ScratchCol      = 'BV'
 | |
|                                         Cracking3to7Col = 'BW'
 | |
|                                         CrackingGT7Col  = 'BX'
 | |
|                                         TrueHazeCol     = 'BY'
 | |
|                                         CrazingCol      = 'BZ'
 | |
|                                         SlipCountCol    = 'CA'
 | |
|                                         SPEGT1mmCol     = 'CB'
 | |
|                                         SPECountCol     = 'CC'
 | |
|                                         NumValues       = 5                                      
 | |
|                                 End Case                             
 | |
|                                 // Write UV values
 | |
|                                 SPEAvg = 0
 | |
|                                 For each Row in UVData using @FM setting fPos
 | |
|                                     Parameter = Row<0, 1>
 | |
|                                     Pocket    = Row<0, 2>
 | |
|                                     Value     = Row<0, 3>
 | |
|                                     Begin Case
 | |
|                                         Case Parameter EQ 'UV Broken'
 | |
|                                             Col = BrokenCol                                           
 | |
|                                         Case Parameter EQ 'UV Non-rotation'
 | |
|                                             Col = NonRotationCol
 | |
|                                         Case Parameter EQ 'UV Scratch (count)'
 | |
|                                             Col = ScratchCol
 | |
|                                         Case Parameter EQ 'UV Cracking (3-7mm)'
 | |
|                                             Col = Cracking3to7Col
 | |
|                                         Case Parameter EQ 'UV Cracking (>7mm)'
 | |
|                                             Col = CrackingGT7Col
 | |
|                                         Case Parameter EQ 'UV True Haze'
 | |
|                                             Col = TrueHazeCol
 | |
|                                         Case Parameter EQ 'UV Crazing'
 | |
|                                             Col = CrazingCol
 | |
|                                         Case Parameter EQ 'UV Slip (count)' 
 | |
|                                             Col = SlipCountCol
 | |
|                                         Case Parameter EQ 'UV-SPE (>1mm) count'
 | |
|                                             Col = SPEGT1mmCol
 | |
|                                         Case Parameter EQ 'UV-SPE (count)'
 | |
|                                             Col     = SPECountCol
 | |
|                                             SPEAvg += Value
 | |
|                                         Case Otherwise$
 | |
|                                             ErrorMessage = 'Error in service ':Service:'. Unrecognized parameter ':Parameter:'.'
 | |
|                                     End Case
 | |
|                                 Until ErrorMessage NE ''                    
 | |
|                                     RowIndex  = SpreadsheetRowIndex + Pocket - 1
 | |
|                                     Excel_Services('SetCellValue', DocObj, WorksheetName, Col, RowIndex, Value)
 | |
|                                 Next Row
 | |
|                                 If ErrorMessage EQ '' then
 | |
|                                     If SpreadsheetName EQ '8-inch New HV Epi Development.xlsx' then
 | |
|                                         // Write SPE Avg
 | |
|                                         If NumValues GT 0 then SPEAvg = SPEAvg / NumValues
 | |
|                                         RowIndex = SpreadsheetRowIndex + NumValues
 | |
|                                         Excel_Services('SetCellValue', DocObj, WorksheetName, SPECountCol, RowIndex, SPEAvg)
 | |
|                                     end
 | |
|                                     Excel_Services('SaveDocument', DocObj, TempPath, SpreadsheetPW)
 | |
|                                     If Error_Services('NoError') then
 | |
|                                         TempFileHandle     = File_Services('LockFile', TempPath, GENERIC_WRITE$, FILE_SHARE_READ$, OPEN_EXISTING$)
 | |
|                                         TempFileHandleCopy = TempFileHandle
 | |
|                                         TempFileSize       = 0
 | |
|                                         If FileHandle NE FILE_ERROR$ then
 | |
|                                             // We were able to get the lock
 | |
|                                             TempFileSize = File_Services('GetFileSize', TempFileHandle)
 | |
|                                             File_Services('UnlockFile', TempFileHandle)
 | |
|                                         end
 | |
|                                         Begin Case
 | |
|                                             Case TempFileHandleCopy EQ FILE_ERROR$
 | |
|                                                 // Failed to lock file again to verify file size (i.e. that the save operation worked)
 | |
|                                                 ErrorMessage = 'Error in ':Service:' service. Failed to lock document ':TempPath:' to verify the save operation was successful.'      
 | |
|                                             Case TempFileSize EQ 0
 | |
|                                                 // Save failed - file corrupted
 | |
|                                                 ErrorMessage = 'Error in ':Service:' service. File size equal to zero. Document ':TempPath:' failed to save.'   
 | |
|                                             Case Otherwise$
 | |
|                                                 // Save successful, so copy temp file back to document (PROD) path.
 | |
|                                                 File_Services('UnlockFile', FileHandle)
 | |
|                                                 CopySucceeded = File_Services('CopyFile', TempPath, DocumentPath)
 | |
|                                                 If CopySucceeded EQ False$ then
 | |
|                                                     ErrorMessage = 'Error in ':Service:' service. Failed to copy ':TempPath:' to ':DocumentPath:'.'
 | |
|                                                 end
 | |
|                                         End Case    
 | |
|                                     end else
 | |
|                                         // SaveDocument call failed. Get internal error for logging purposes.
 | |
|                                         ErrorMessage = Error_Services('GetMessage') 
 | |
|                                     end
 | |
|                                 end                                                         
 | |
|                             end else
 | |
|                                 // Row index did not match. Log error.
 | |
|                                 ErrorMessage  = 'Error in ':Service:' service. Run ID in row ':SpreadsheetRowIndex
 | |
|                                 ErrorMessage := ' column A in 'SpreadsheetName:' worksheet ':WorksheetName
 | |
|                                 ErrorMessage := ' did not match GaNRunID ':GaNRunID:' in REACT_RUN record ':RDSNo:'.'
 | |
|                                 Excel_Services('CloseDocument', DocObj)       
 | |
|                             end                                                                                  
 | |
|                         end else
 | |
|                             ErrorMessage = 'Error in ':Service:' service. ':DocumentPath:' file could not be opened by Excel_Services.'   
 | |
|                         end
 | |
|                         OSDelete TempPath                                                            
 | |
|                     end else
 | |
|                         ErrorMessage = 'Error in ':Service:' service. ':DocumentPath:' file is in use an cannot be updated at this time.'
 | |
|                     end
 | |
|                 end else
 | |
|                     ErrorMessage = 'Error in ':Service:' service. UV data missing in IQS.'    
 | |
|                 end
 | |
|             end else
 | |
|                 ErrorMessage = 'Error in ':Service:' service. Run ID for RDS ':RDSNo:' is null.'    
 | |
|             end
 | |
|         end else
 | |
|             ErrorMessage = 'Error in ':Service:' service. No Excel row index found for RDS ':RDSNo:' - Run ID ':GaNRunID:'.'   
 | |
|         end
 | |
|     end else
 | |
|         ErrorMessage = 'Error in ':Service:' service. RDSNo is null.'      
 | |
|     end
 | |
|     
 | |
|     If DocObj NE '' then Excel_Services('CloseDocument', DocObj)
 | |
|     If ( (FileHandle NE '') and (FileHandle NE FILE_ERROR$) ) then File_Services('UnlockFile', FileHandle)
 | |
|     If ErrorMessage NE '' then Error_Services('Add', ErrorMessage)
 | |
|     
 | |
| end service
 | |
| 
 | |
| 
 | |
| Service PostCANData(RDSNo)
 | |
| 
 | |
|     DocObj       = ''
 | |
|     ErrorMessage = ''
 | |
|     FileHandle   = ''
 | |
|     If RDSNo NE '' then
 | |
|         ReactRunRec         = Database_Services('ReadDataRow', 'REACT_RUN', RDSNo)
 | |
|         GaNRunID            = ReactRunRec<REACT_RUN_GAN_RUN_ID$>
 | |
|         WONo                = ReactRunRec<REACT_RUN_WO_NO$>
 | |
|         Reactor             = ReactRunRec<REACT_RUN_REACTOR$>
 | |
|         SpreadsheetRowIndex = ReactRunRec<REACT_RUN_EA_ROW_INDEX$>
 | |
|         RunRecipe           = ReactRunRec<REACT_RUN_GAN_RECIPE$>      
 | |
|         SpreadsheetInfo     = Engineering_Services('GetSpreadSheetInfo', RDSNo)
 | |
|         SpreadsheetName     = SpreadsheetInfo<1>
 | |
|         WorksheetName       = SpreadsheetInfo<2>
 | |
|         SpreadsheetPW       = SpreadsheetInfo<3>
 | |
|         SpreadsheetDir      = SpreadsheetInfo<4>
 | |
|         Offset              = SpreadsheetInfo<5>
 | |
|               
 | |
|         If SpreadsheetRowIndex NE '' then
 | |
|             If GaNRunID NE '' then            
 | |
|                 CandelaData = Engineering_Services('GetCandelaData', RDSNo)
 | |
|                 // Log SQL response
 | |
|                 LogData<1>  = LoggingDTM
 | |
|                 LogData<2>  = RDSNo
 | |
|                 LogData<3>  = CandelaData
 | |
|                 Logging_Services('AppendLog', objSQLLog, LogData, @RM, @FM)               
 | |
|                 If ( (CandelaData NE '') and (CandelaData NE 0) ) then
 | |
|                     DocumentPath = SpreadsheetDir:SpreadsheetName
 | |
|                     FileHandle   = File_Services('LockFile', DocumentPath, GENERIC_WRITE$, FILE_SHARE_READ$, OPEN_EXISTING$)
 | |
|                     If FileHandle NE FILE_ERROR$ then
 | |
|                         // Make a temporary backup in case the Excel file fails to save and becomes corrupted
 | |
|                         Datetime     = OConv(Datetime(), 'DT')
 | |
|                         Swap ' ' with '-' in Datetime
 | |
|                         Swap ':' with ';' in Datetime
 | |
|                         TempFilename = GaNRunID:'-':Datetime:'.xlsx'                       
 | |
|                         TempDirectory = Str(\00\, 1024)
 | |
|                         GetTempPath(Len(TempDirectory), TempDirectory)
 | |
|                         Convert \00\ to '' in TempDirectory                       
 | |
|                         TempPath     = TempDirectory:TempFilename
 | |
|                         File_Services('CopyFile', DocumentPath, TempPath)                  
 | |
|                         DocObj       = Excel_Services('OpenDocument', TempPath, SpreadsheetPW)
 | |
|                         If Error_Services('NoError') then                            
 | |
|                             // Verify spreadsheet row index is correct
 | |
|                             RunIDCellText = Excel_Services('GetCellValue', DocObj, WorksheetName, 'A', SpreadsheetRowIndex)
 | |
|                             RowRunID      = RunIDCellText[1, 12]
 | |
|                             If RowRunID EQ GaNRunID then
 | |
|                                 Begin Case
 | |
|                                     Case SpreadsheetName EQ 'MV_R71_6-inch Epi Development.xlsx'
 | |
|                                         PitsCol           = 'AD'
 | |
|                                         LPDSmallCol       = 'AE'
 | |
|                                         LPDMedCol         = 'AF'
 | |
|                                         LPDLargeCol       = 'AG'
 | |
|                                         SPECol            = 'AH'
 | |
|                                         SpiralsCol        = 'AI'
 | |
|                                         CraterCol         = 'AJ'
 | |
|                                         CrackingAcceptCol = 'AK'
 | |
|                                         CrackingCol       = 'AL'
 | |
|                                         TotalDefectsCol   = '' ; // Currently not being recorded in spreadsheet                                       
 | |
|                                     Case SpreadsheetName EQ 'HV_R71_6-inch Epi Development.xlsx'
 | |
|                                         PitsCol           = 'AE'
 | |
|                                         LPDSmallCol       = 'AF'
 | |
|                                         LPDMedCol         = 'AG'
 | |
|                                         LPDLargeCol       = 'AH'
 | |
|                                         SPECol            = 'AI'
 | |
|                                         SpiralsCol        = 'AJ'
 | |
|                                         CraterCol         = 'AK'
 | |
|                                         CrackingAcceptCol = 'AL'
 | |
|                                         CrackingCol       = 'AM'
 | |
|                                         TotalDefectsCol   = '' ; // Currently not being recorded in spreadsheet
 | |
|                                     Case SpreadsheetName EQ '8-inch New HV Epi Development.xlsx'
 | |
|                                         PitsCol           = 'AL'
 | |
|                                         LPDSmallCol       = 'AJ'
 | |
|                                         LPDMedCol         = 'AI'
 | |
|                                         LPDLargeCol       = 'AH'
 | |
|                                         SPECol            = 'AG'
 | |
|                                         SpiralsCol        = 'AM'
 | |
|                                         CraterCol         = 'AK'
 | |
|                                         CrackingAcceptCol = 'AO'
 | |
|                                         CrackingCol       = 'AN'
 | |
|                                         TotalDefectsCol   = 'AP'
 | |
|                                         AvgRowOffset      = 5                                      
 | |
|                                 End Case                             
 | |
|                                 // Write Candela values
 | |
|                                 CrackingAvg        = 0
 | |
|                                 NumCrackingVals    = 0
 | |
|                                 CrackingAccAvg     = 0
 | |
|                                 NumCrackingAccVals = 0
 | |
|                                 CraterAvg          = 0
 | |
|                                 NumCraterVals      = 0
 | |
|                                 LPDLargeAvg        = 0
 | |
|                                 NumLPDLargeVals    = 0
 | |
|                                 LPDMedAvg          = 0
 | |
|                                 NumLPDMedVals      = 0
 | |
|                                 LPDSmallAvg        = 0
 | |
|                                 NumLPDSmallVals    = 0
 | |
|                                 PitsAvg            = 0
 | |
|                                 NumPitsVals        = 0
 | |
|                                 SPEAvg             = 0
 | |
|                                 NumSPEVals         = 0
 | |
|                                 SpiralsAvg         = 0
 | |
|                                 NumSpiralsVals     = 0
 | |
|                                 CanTotDefAvg       = 0
 | |
|                                 NumCanTotDefVals   = 0
 | |
|                                 For each Row in CandelaData using @FM setting fPos
 | |
|                                     Parameter = Row<0, 1>
 | |
|                                     Pocket    = Row<0, 2>
 | |
|                                     Value     = Row<0, 3>
 | |
|                                     Begin Case
 | |
|                                         Case Parameter EQ 'Candela Cracking'
 | |
|                                             Col              = CrackingCol
 | |
|                                             CrackingAvg     += Value
 | |
|                                             NumCrackingVals += 1                                        
 | |
|                                         Case Parameter EQ 'Candela Cracking Acceptable'
 | |
|                                             Col                 = CrackingAcceptCol
 | |
|                                             CrackingAccAvg     += Value
 | |
|                                             NumCrackingAccVals += 1
 | |
|                                         Case Parameter EQ 'Candela Crater'
 | |
|                                             Col            = CraterCol
 | |
|                                             CraterAvg     += Value
 | |
|                                             NumCraterVals += 1
 | |
|                                         Case Parameter EQ 'Candela LPD Large'
 | |
|                                             Col              = LPDLargeCol
 | |
|                                             LPDLargeAvg     += Value
 | |
|                                             NumLPDLargeVals += 1
 | |
|                                         Case Parameter EQ 'Candela LPD Medium'
 | |
|                                             Col            = LPDMedCol
 | |
|                                             LPDMedAvg     += Value
 | |
|                                             NumLPDMedVals += 1
 | |
|                                         Case Parameter EQ 'Candela LPD Small'
 | |
|                                             Col              = LPDSmallCol
 | |
|                                             LPDSmallAvg     += Value
 | |
|                                             NumLPDSmallVals += 1
 | |
|                                         Case Parameter EQ 'Candela Pits'
 | |
|                                             Col          = PitsCol
 | |
|                                             PitsAvg     += Value
 | |
|                                             NumPitsVals += 1
 | |
|                                         Case Parameter EQ 'Candela SPE'
 | |
|                                             Col         = SPECol
 | |
|                                             SPEAvg     += Value
 | |
|                                             NumSPEVals += 1
 | |
|                                         Case Parameter EQ 'Candela Spirals'
 | |
|                                             Col             = SpiralsCol
 | |
|                                             SpiralsAvg     += Value
 | |
|                                             NumSpiralsVals += 1
 | |
|                                         Case Parameter EQ 'Candela Total Defects'
 | |
|                                             Col               = TotalDefectsCol
 | |
|                                             CanTotDefAvg     += Value
 | |
|                                             NumCanTotDefVals += 1
 | |
|                                         Case Otherwise$
 | |
|                                             ErrorMessage = 'Error in service ':Service:'. Unrecognized parameter ':Parameter:'.'
 | |
|                                     End Case
 | |
|                                 Until ErrorMessage NE ''                  
 | |
|                                     RowIndex  = SpreadsheetRowIndex + Pocket - 1
 | |
|                                     Excel_Services('SetCellValue', DocObj, WorksheetName, Col, RowIndex, Value)
 | |
|                                 Next Row
 | |
|                                 If ErrorMessage EQ '' then
 | |
|                                     If SpreadsheetName EQ '8-inch New HV Epi Development.xlsx' then
 | |
|                                         // Calculate averages
 | |
|                                         If NumCrackingVals    GT 0 then CrackingAvg    = CrackingAvg    / NumCrackingVals
 | |
|                                         If NumCrackingAccVals GT 0 then CrackingAccAvg = CrackingAccAvg / NumCrackingAccVals
 | |
|                                         If NumCraterVals      GT 0 then CraterAvg      = CraterAvg      / NumCraterVals
 | |
|                                         If NumLPDLargeVals    GT 0 then LPDLargeAvg    = LPDLargeAvg    / NumLPDLargeVals
 | |
|                                         If NumLPDMedVals      GT 0 then LPDMedAvg      = LPDMedAvg      / NumLPDMedVals
 | |
|                                         If NumLPDSmallVals    GT 0 then LPDSmallAvg    = LPDSmallAvg    / NumLPDSmallVals
 | |
|                                         If NumPitsVals        GT 0 then PitsAvg        = PitsAvg        / NumPitsVals
 | |
|                                         If NumSPEVals         GT 0 then SPEAvg         = SPEAvg         / NumSPEVals
 | |
|                                         If NumSpiralsVals     GT 0 then SpiralsAvg     = SpiralsAvg     / NumSpiralsVals
 | |
|                                         If NumCanTotDefVals   GT 0 then CanTotDefAvg   = CanTotDefAvg   / NumCanTotDefVals
 | |
|                                         // Write averages
 | |
|                                         RowIndex       = SpreadsheetRowIndex + AvgRowOffset
 | |
|                                         Excel_Services('SetCellValue', DocObj, WorksheetName, CrackingCol, RowIndex, CrackingAvg)
 | |
|                                         Excel_Services('SetCellValue', DocObj, WorksheetName, CrackingAcceptCol, RowIndex, CrackingAccAvg)
 | |
|                                         Excel_Services('SetCellValue', DocObj, WorksheetName, CraterCol, RowIndex, CraterAvg)
 | |
|                                         Excel_Services('SetCellValue', DocObj, WorksheetName, LPDLargeCol, RowIndex, LPDLargeAvg)
 | |
|                                         Excel_Services('SetCellValue', DocObj, WorksheetName, LPDMedCol, RowIndex, LPDMedAvg)
 | |
|                                         Excel_Services('SetCellValue', DocObj, WorksheetName, LPDSmallCol, RowIndex, LPDSmallAvg)
 | |
|                                         Excel_Services('SetCellValue', DocObj, WorksheetName, PitsCol, RowIndex, PitsAvg)
 | |
|                                         Excel_Services('SetCellValue', DocObj, WorksheetName, SPECol, RowIndex, SPEAvg)
 | |
|                                         Excel_Services('SetCellValue', DocObj, WorksheetName, SpiralsCol, RowIndex, SpiralsAvg)
 | |
|                                         Excel_Services('SetCellValue', DocObj, WorksheetName, TotalDefectsCol, RowIndex, CanTotDefAvg)
 | |
|                                     end                                                             
 | |
|                                     Excel_Services('SaveDocument', DocObj, TempPath, SpreadsheetPW)
 | |
|                                     If Error_Services('NoError') then
 | |
|                                         TempFileHandle     = File_Services('LockFile', TempPath, GENERIC_WRITE$, FILE_SHARE_READ$, OPEN_EXISTING$)
 | |
|                                         TempFileHandleCopy = TempFileHandle
 | |
|                                         TempFileSize       = 0
 | |
|                                         If FileHandle NE FILE_ERROR$ then
 | |
|                                             // We were able to get the lock
 | |
|                                             TempFileSize = File_Services('GetFileSize', TempFileHandle)
 | |
|                                             File_Services('UnlockFile', TempFileHandle)
 | |
|                                         end
 | |
|                                         Begin Case
 | |
|                                             Case TempFileHandleCopy EQ FILE_ERROR$
 | |
|                                                 // Failed to lock file again to verify file size (i.e. that the save operation worked)
 | |
|                                                 ErrorMessage = 'Error in ':Service:' service. Failed to lock document ':TempPath:' to verify the save operation was successful.'      
 | |
|                                             Case TempFileSize EQ 0
 | |
|                                                 // Save failed - file corrupted
 | |
|                                                 ErrorMessage = 'Error in ':Service:' service. File size equal to zero. Document ':TempPath:' failed to save.'   
 | |
|                                             Case Otherwise$
 | |
|                                                 // Save successful, so copy temp file back to document (PROD) path.
 | |
|                                                 File_Services('UnlockFile', FileHandle)
 | |
|                                                 CopySucceeded = File_Services('CopyFile', TempPath, DocumentPath)
 | |
|                                                 If CopySucceeded EQ False$ then
 | |
|                                                     ErrorMessage = 'Error in ':Service:' service. Failed to copy ':TempPath:' to ':DocumentPath:'.'
 | |
|                                                 end
 | |
|                                         End Case    
 | |
|                                     end else
 | |
|                                         // SaveDocument call failed. Get internal error for logging purposes.
 | |
|                                         ErrorMessage = Error_Services('GetMessage') 
 | |
|                                     end
 | |
|                                 end                                                                
 | |
|                             end else
 | |
|                                 // Row index did not match. Log error.
 | |
|                                 ErrorMessage  = 'Error in ':Service:' service. Run ID in row ':SpreadsheetRowIndex
 | |
|                                 ErrorMessage := ' column A in 'SpreadsheetName:' worksheet ':WorksheetName
 | |
|                                 ErrorMessage := ' did not match GaNRunID ':GaNRunID:' in REACT_RUN record ':RDSNo:'.'
 | |
|                                 Excel_Services('CloseDocument', DocObj)       
 | |
|                             end                                                                                    
 | |
|                         end else
 | |
|                             ErrorMessage = 'Error in ':Service:' service. ':TempPath:' file could not be opened by Excel_Services.'   
 | |
|                         end
 | |
|                         OSDelete TempPath                                   
 | |
|                     end else
 | |
|                         ErrorMessage = 'Error in ':Service:' service. ':DocumentPath:' file is in use an cannot be updated at this time.'                        
 | |
|                     end
 | |
|                 end else
 | |
|                     ErrorMessage = 'Error in ':Service:' service. Candela data for Run ID ':GaNRunID:' is not available in IQS at this time.'
 | |
|                 end
 | |
|             end else
 | |
|                 ErrorMessage = 'Error in ':Service:' service. Run ID for RDS ':RDSNo:' is null.' 
 | |
|             end
 | |
|         end else
 | |
|             ErrorMessage = 'Error in ':Service:' service. No Excel row index found for RDS ':RDSNo:' - Run ID ':GaNRunID:'.'   
 | |
|         end
 | |
|     end else
 | |
|         ErrorMessage = 'Error in ':Service:' service. RDSNo is null.'
 | |
|     end
 | |
|     
 | |
|     If DocObj NE '' then Excel_Services('CloseDocument', DocObj)
 | |
|     If ( (FileHandle NE '') and (FileHandle NE FILE_ERROR$) ) then File_Services('UnlockFile', FileHandle)
 | |
|     If ErrorMessage NE '' then Error_Services('Add', ErrorMessage)
 | |
|     
 | |
| end service
 | |
| 
 | |
| 
 | |
| Service PostWARPData(RDSNo)
 | |
| 
 | |
|     DocObj       = ''
 | |
|     ErrorMessage = ''
 | |
|     FileHandle   = ''
 | |
|     If RDSNo NE '' then
 | |
|         ReactRunRec         = Database_Services('ReadDataRow', 'REACT_RUN', RDSNo)
 | |
|         GaNRunID            = ReactRunRec<REACT_RUN_GAN_RUN_ID$>
 | |
|         WONo                = ReactRunRec<REACT_RUN_WO_NO$>
 | |
|         Reactor             = ReactRunRec<REACT_RUN_REACTOR$>
 | |
|         SpreadsheetRowIndex = ReactRunRec<REACT_RUN_EA_ROW_INDEX$>
 | |
|         RunRecipe           = ReactRunRec<REACT_RUN_GAN_RECIPE$>      
 | |
|         SpreadsheetInfo     = Engineering_Services('GetSpreadSheetInfo', RDSNo)
 | |
|         SpreadsheetName     = SpreadsheetInfo<1>
 | |
|         WorksheetName       = SpreadsheetInfo<2>
 | |
|         SpreadsheetPW       = SpreadsheetInfo<3>
 | |
|         SpreadsheetDir      = SpreadsheetInfo<4>
 | |
|         Offset              = SpreadsheetInfo<5>
 | |
|               
 | |
|         If SpreadsheetRowIndex NE '' then
 | |
|             If GaNRunID NE '' then
 | |
|                 WarpData   = Engineering_Services('GetWARPData', RDSNo)
 | |
|                 // Log SQL response
 | |
|                 LogData<1> = LoggingDTM
 | |
|                 LogData<2> = RDSNo
 | |
|                 LogData<3> = WarpData
 | |
|                 Logging_Services('AppendLog', objSQLLog, LogData, @RM, @FM)                
 | |
|                 If ( Error_Services('NoError') and (WarpData NE '') and (WarpData NE 0) ) then
 | |
|                     DocumentPath = SpreadsheetDir:SpreadsheetName
 | |
|                     FileHandle   = File_Services('LockFile', DocumentPath, GENERIC_WRITE$, FILE_SHARE_READ$, OPEN_EXISTING$)
 | |
|                     If FileHandle NE FILE_ERROR$ then
 | |
|                         // Make a temporary backup in case the Excel file fails to save and becomes corrupted
 | |
|                         Datetime     = OConv(Datetime(), 'DT')
 | |
|                         Swap ' ' with '-' in Datetime
 | |
|                         Swap ':' with ';' in Datetime
 | |
|                         TempFilename = GaNRunID:'-':Datetime:'.xlsx'                       
 | |
|                         TempDirectory = Str(\00\, 1024)
 | |
|                         GetTempPath(Len(TempDirectory), TempDirectory)
 | |
|                         Convert \00\ to '' in TempDirectory                       
 | |
|                         TempPath     = TempDirectory:TempFilename
 | |
|                         File_Services('CopyFile', DocumentPath, TempPath)                  
 | |
|                         DocObj       = Excel_Services('OpenDocument', TempPath, SpreadsheetPW)
 | |
|                         If Error_Services('NoError') then                            
 | |
|                             // Verify spreadsheet row index is correct
 | |
|                             RunIDCellText = Excel_Services('GetCellValue', DocObj, WorksheetName, 'A', SpreadsheetRowIndex)
 | |
|                             RowRunID      = RunIDCellText[1, 12]
 | |
|                             If RowRunID EQ GaNRunID then
 | |
|                                 Begin Case
 | |
|                                     Case SpreadsheetName EQ 'MV_R71_6-inch Epi Development.xlsx'
 | |
|                                         WarpCol   = 'AM'
 | |
|                                         BowCol    = 'AN'
 | |
|                                         AvgRow    = SpreadsheetRowIndex + 10
 | |
|                                         RangeRow  = SpreadsheetRowIndex + 11                                      
 | |
|                                     Case SpreadsheetName EQ 'HV_R71_6-inch Epi Development.xlsx'
 | |
|                                         WarpCol   = 'AN'
 | |
|                                         BowCol    = 'AO'
 | |
|                                         AvgRow    = SpreadsheetRowIndex + 10
 | |
|                                         RangeRow  = SpreadsheetRowIndex + 11
 | |
|                                     Case SpreadsheetName EQ '8-inch New HV Epi Development.xlsx'
 | |
|                                         WarpCol   = 'AQ'
 | |
|                                         BowCol    = 'AR'
 | |
|                                         AvgRow    = SpreadsheetRowIndex + 6
 | |
|                                         RangeRow  = SpreadsheetRowIndex + 7
 | |
|                                         Excel_Services('SetCellValue', DocObj, WorksheetName, BowCol, (RangeRow + 2), 'BowCenter')                                     
 | |
|                                 End Case                        
 | |
|                                 // Write Warp values
 | |
|                                 BowMin      = ''
 | |
|                                 BowMax      = ''
 | |
|                                 WarpMin     = ''
 | |
|                                 WarpMax     = ''
 | |
|                                 BowTotal    = 0
 | |
|                                 WarpTotal   = 0
 | |
|                                 NumWarpVals = 0
 | |
|                                 NumBowVals  = 0
 | |
|                                 For each Row in WarpData using @FM setting fPos
 | |
|                                     Parameter = Row<0, 1>
 | |
|                                     Pocket    = Row<0, 2>
 | |
|                                     Value     = Row<0, 3>
 | |
|                                     Begin Case                                        
 | |
|                                         Case ( (Parameter EQ 'Bow') or (Parameter EQ 'BowCenter') )
 | |
|                                             Col       = BowCol
 | |
|                                             BowTotal += Value
 | |
|                                             If BowMin EQ '' then BowMin = Value
 | |
|                                             If BowMax EQ '' then BowMax = Value
 | |
|                                             If Value LT BowMin then
 | |
|                                                 BowMin = Value
 | |
|                                             end
 | |
|                                             If Value GT BowMax then
 | |
|                                                 BowMax = Value
 | |
|                                             end
 | |
|                                             NumBowVals += 1
 | |
|                                         Case Parameter EQ 'Warp'
 | |
|                                             Col        = WarpCol
 | |
|                                             WarpTotal += Value
 | |
|                                             If WarpMin EQ '' then WarpMin = Value
 | |
|                                             If WarpMax EQ '' then WarpMax = Value
 | |
|                                             If Value LT WarpMin then
 | |
|                                                 WarpMin = Value
 | |
|                                             end
 | |
|                                             If Value GT WarpMax then
 | |
|                                                 WarpMax = Value
 | |
|                                             end
 | |
|                                             NumWarpVals += 1
 | |
|                                         Case Otherwise$
 | |
|                                             ErrorMessage = 'Error in service ':Service:'. Unrecognized parameter ':Parameter:'.'
 | |
|                                     End Case
 | |
|                                 Until ErrorMessage NE ''                            
 | |
|                                     RowIndex  = SpreadsheetRowIndex + Pocket - 1
 | |
|                                     Excel_Services('SetCellValue', DocObj, WorksheetName, Col, RowIndex, Value)
 | |
|                                 Next Row
 | |
|                                 If ErrorMessage EQ '' then
 | |
|                                     BowRange  = BowMax  - BowMin
 | |
|                                     WarpRange = WarpMax - WarpMin
 | |
|                                     If NumBowVals  GT 0 then BowAvg  = BowTotal  / NumBowVals
 | |
|                                     If NumWarpVals GT 0 then WarpAvg = WarpTotal / NumWarpVals
 | |
|                                     Excel_Services('SetCellValue', DocObj, WorksheetName, WarpCol, AvgRow, WarpAvg)
 | |
|                                     Excel_Services('SetCellValue', DocObj, WorksheetName, WarpCol, RangeRow, WarpRange)
 | |
|                                     Excel_Services('SetCellValue', DocObj, WorksheetName, BowCol, AvgRow, BowAvg)
 | |
|                                     Excel_Services('SetCellValue', DocObj, WorksheetName, BowCol, RangeRow, BowRange)
 | |
|                                     Excel_Services('SaveDocument', DocObj, TempPath, SpreadsheetPW)
 | |
|                                     If Error_Services('NoError') then
 | |
|                                         TempFileHandle     = File_Services('LockFile', TempPath, GENERIC_WRITE$, FILE_SHARE_READ$, OPEN_EXISTING$)
 | |
|                                         TempFileHandleCopy = TempFileHandle
 | |
|                                         TempFileSize       = 0
 | |
|                                         If FileHandle NE FILE_ERROR$ then
 | |
|                                             // We were able to get the lock
 | |
|                                             TempFileSize = File_Services('GetFileSize', TempFileHandle)
 | |
|                                             File_Services('UnlockFile', TempFileHandle)
 | |
|                                         end
 | |
|                                         Begin Case
 | |
|                                             Case TempFileHandleCopy EQ FILE_ERROR$
 | |
|                                                 // Failed to lock file again to verify file size (i.e. that the save operation worked)
 | |
|                                                 ErrorMessage = 'Error in ':Service:' service. Failed to lock document ':TempPath:' to verify the save operation was successful.'      
 | |
|                                             Case TempFileSize EQ 0
 | |
|                                                 // Save failed - file corrupted
 | |
|                                                 ErrorMessage = 'Error in ':Service:' service. File size equal to zero. Document ':TempPath:' failed to save.'   
 | |
|                                             Case Otherwise$
 | |
|                                                 // Save successful, so copy temp file back to document (PROD) path.
 | |
|                                                 File_Services('UnlockFile', FileHandle)
 | |
|                                                 CopySucceeded = File_Services('CopyFile', TempPath, DocumentPath)
 | |
|                                                 If CopySucceeded EQ False$ then
 | |
|                                                     ErrorMessage = 'Error in ':Service:' service. Failed to copy ':TempPath:' to ':DocumentPath:'.'
 | |
|                                                 end
 | |
|                                         End Case    
 | |
|                                     end else
 | |
|                                         // SaveDocument call failed. Get internal error for logging purposes.
 | |
|                                         ErrorMessage = Error_Services('GetMessage') 
 | |
|                                     end
 | |
|                                 end                                                           
 | |
|                             end else
 | |
|                                 // Row index did not match. Log error.
 | |
|                                 ErrorMessage  = 'Error in ':Service:' service. Run ID in row ':SpreadsheetRowIndex
 | |
|                                 ErrorMessage := ' column A in 'SpreadsheetName:' worksheet ':WorksheetName
 | |
|                                 ErrorMessage := ' did not match GaNRunID ':GaNRunID:' in REACT_RUN record ':RDSNo:'.'
 | |
|                                 Excel_Services('CloseDocument', DocObj)       
 | |
|                             end                                                                                          
 | |
|                         end else
 | |
|                             ErrorMessage = 'Error in ':Service:' service. ':DocumentPath:' file could not be opened by Excel_Services.'
 | |
|                         end
 | |
|                         OSDelete TempPath                                     
 | |
|                     end else
 | |
|                         ErrorMessage = 'Error in ':Service:' service. ':DocumentPath:' file is in use an cannot be updated at this time.'                        
 | |
|                     end
 | |
|                 end else
 | |
|                     ErrorMessage = 'Error in ':Service:' service. WARP data is missing in IQS.' 
 | |
|                 end
 | |
|             end else
 | |
|                 ErrorMessage = 'Error in ':Service:' service. Run ID for RDS ':RDSNo:' is null.'      
 | |
|             end
 | |
|         end else
 | |
|             ErrorMessage = 'Error in ':Service:' service. No Excel row index found for RDS ':RDSNo:' - Run ID ':GaNRunID:'.' 
 | |
|         end
 | |
|     end else
 | |
|         ErrorMessage = 'Error in ':Service:' service. RDSNo is null.'
 | |
|     end
 | |
|     
 | |
|     If DocObj NE '' then Excel_Services('CloseDocument', DocObj)
 | |
|     If ( (FileHandle NE '') and (FileHandle NE FILE_ERROR$) ) then File_Services('UnlockFile', FileHandle)
 | |
|     If ErrorMessage NE '' then Error_Services('Add', ErrorMessage)
 | |
|     
 | |
| end service
 | |
| 
 | |
| 
 | |
| 
 | |
| //----------------------------------------------------------------------------------------------------------------------
 | |
| // GetAFMData
 | |
| //
 | |
| //
 | |
| //----------------------------------------------------------------------------------------------------------------------
 | |
| Service GetAFMData(RDSNo)
 | |
| 
 | |
|     If RDSNo NE '' then
 | |
|            
 | |
|         ReactRunRec = Database_Services('ReadDataRow', 'REACT_RUN', RDSNo)
 | |
|         If Error_Services('NoError') then 										 
 | |
|             RunNo    = ReactRunRec<REACT_RUN_GAN_RUN_ID$>
 | |
|             Reactor  = 'R':ReactRunRec<REACT_RUN_REACTOR$>
 | |
|             PartNo   = Xlate('REACT_RUN', RDSNo, 'WFR_TRACK_PART', 'X')                                                                           
 | |
|             Query    = "SELECT td.F_NAME, dd.F_NAME, se.F_VAL "                                            
 | |
|             Query   := "FROM [IRMNSPC].[dbo].[SGRP_EXT] se "                                                          
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[PART_LOT] pl on se.F_LOT  = pl.F_LOT "                                  
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[TEST_DAT] td on se.F_TEST = td.F_TEST "                                 
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[PART_DAT] pd on se.F_PART = pd.F_PART "                                 
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[PRCS_DAT] pr on se.F_PRCS = pr.F_PRCS "                                 
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[SGRP_DSC] sd on se.F_SGRP = sd.F_SGRP "                                 
 | |
|             Query   := "LEFT JOIN [IRMNSPC].[dbo].[DESC_DAT] dd on sd.F_DESC = dd.F_DESC "                            
 | |
|             Query   := "WHERE pd.F_NAME = '":PartNo:"'	AND "                                                   
 | |
|             Query   := "      pr.F_NAME = '":Reactor:"'	AND "                                                       
 | |
|             Query   := "      pl.F_NAME = '":RunNo:"'	AND "                                                       
 | |
|             Query   := "      se.F_FLAG = 0				AND "
 | |
|             Query   := "      (td.F_NAME = 'AFM Pit Count' or td.F_NAME = 'AFM Roughness') AND "
 | |
|             Query   := "      dd.F_DSGP  = 1342510661 AND "                            
 | |
|             Query   := "dd.F_NAME IS NOT NULL AND "
 | |
|             Query   := "sd.F_SGRP = "
 | |
| 	        Query   := "(SELECT MAX(sd.F_SGRP) "
 | |
| 	        Query   := "FROM [IRMNSPC].[dbo].[SGRP_EXT] se "
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[PART_LOT] pl on se.F_LOT        = pl.F_LOT "
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[TEST_DAT] td on se.F_TEST       = td.F_TEST "
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[PART_DAT] pd on se.F_PART       = pd.F_PART "
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[PRCS_DAT] pr on se.F_PRCS       = pr.F_PRCS "
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[SGRP_DSC] sd on se.F_SGRP       = sd.F_SGRP "
 | |
|             Query   := "LEFT JOIN [IRMNSPC].[dbo].[DESC_DAT] dd on sd.F_DESC  = dd.F_DESC "
 | |
|             Query   := "WHERE pd.F_NAME = '":PartNo:"'  AND "
 | |
|             Query   := "      pr.F_NAME = '":Reactor:"' AND "
 | |
|             Query   := "      pl.F_NAME = '":RunNo:"'   AND "
 | |
|             Query   := "      se.F_FLAG = 0 AND "
 | |
|             Query   := "      (td.F_NAME = 'AFM Pit Count' or td.F_NAME = 'AFM Roughness') AND "
 | |
|             Query   := "      dd.F_DSGP  = 1342510661 AND dd.F_NAME IS NOT NULL) "
 | |
|             Query   := "ORDER BY td.F_NAME"
 | |
| 
 | |
|             If Query NE '' then Response = SQL_Services('PostSQLRequest', 'IQSDMS1', Query)
 | |
| 
 | |
|             Convert @FM to @VM in Response
 | |
|             Convert @RM to @FM in Response
 | |
|             
 | |
|         end
 | |
|     end
 | |
|     
 | |
| end service
 | |
| 
 | |
| 
 | |
| //----------------------------------------------------------------------------------------------------------------------
 | |
| // GetUVData
 | |
| //
 | |
| //
 | |
| //----------------------------------------------------------------------------------------------------------------------
 | |
| Service GetUVData(RDSNo)
 | |
| 
 | |
|     If RDSNo NE '' then
 | |
|            
 | |
|         ReactRunRec = Database_Services('ReadDataRow', 'REACT_RUN', RDSNo)
 | |
|         If Error_Services('NoError') then 										 
 | |
|             RunNo    = ReactRunRec<REACT_RUN_GAN_RUN_ID$>
 | |
|             Reactor  = 'R':ReactRunRec<REACT_RUN_REACTOR$>
 | |
|             PartNo   = Xlate('REACT_RUN', RDSNo, 'WFR_TRACK_PART', 'X')       
 | |
|             Query    = ''                                                                    
 | |
|             Query    = "SELECT td.F_NAME, se.F_TSNO, se.F_VAL "                                            
 | |
|             Query   := "FROM [IRMNSPC].[dbo].[SGRP_EXT] se "                                                          
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[PART_LOT] pl on se.F_LOT  = pl.F_LOT "                                  
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[TEST_DAT] td on se.F_TEST = td.F_TEST "                                 
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[PART_DAT] pd on se.F_PART = pd.F_PART "                                 
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[PRCS_DAT] pr on se.F_PRCS = pr.F_PRCS "                                 
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[SGRP_DSC] sd on se.F_SGRP = sd.F_SGRP "                                 
 | |
|             Query   := "LEFT JOIN [IRMNSPC].[dbo].[DESC_DAT] dd on sd.F_DESC = dd.F_DESC "                            
 | |
|             Query   := "WHERE pd.F_NAME = '":PartNo:"'	AND "                                                   
 | |
|             Query   := "      pr.F_NAME = '":Reactor:"'	AND "                                                       
 | |
|             Query   := "      pl.F_NAME = '":RunNo:"'	AND "                                                       
 | |
|             Query   := "      se.F_FLAG = 0				AND "
 | |
|             Query   := "      (td.F_NAME = 'UV Broken' or td.F_NAME = 'UV Cracking (>7mm)' or "
 | |
|             Query   := "       td.F_NAME = 'UV Cracking (3-7mm)' or td.F_NAME = 'UV Crazing' or "
 | |
|             Query   := "       td.F_NAME = 'UV Non-rotation' or td.F_NAME = 'UV Scratch (count)' or "
 | |
|             Query   := "       td.F_NAME = 'UV Slip (count)' or td.F_NAME = 'UV-SPE (>1mm) count' or "
 | |
|             Query   := "       td.F_NAME = 'UV-SPE (count)' or td.F_NAME = 'UV True Haze') AND "
 | |
|             Query   := "       dd.F_DSGP  = 1337859646 AND dd.F_NAME IS NOT NULL AND "                            
 | |
|             Query   := "       sd.F_SGRP = "
 | |
| 	        Query   := "       (SELECT MAX(sd.F_SGRP) "
 | |
| 	        Query   := "       FROM [IRMNSPC].[dbo].[SGRP_EXT] se "
 | |
| 	        Query   := "       JOIN [IRMNSPC].[dbo].[PART_LOT] pl on se.F_LOT  = pl.F_LOT "
 | |
| 	        Query   := "       JOIN [IRMNSPC].[dbo].[TEST_DAT] td on se.F_TEST  = td.F_TEST "
 | |
| 	        Query   := "       JOIN [IRMNSPC].[dbo].[PART_DAT] pd on se.F_PART  = pd.F_PART "
 | |
| 	        Query   := "       JOIN [IRMNSPC].[dbo].[PRCS_DAT] pr on se.F_PRCS  = pr.F_PRCS "
 | |
| 	        Query   := "       JOIN [IRMNSPC].[dbo].[SGRP_DSC] sd on se.F_SGRP  = sd.F_SGRP "
 | |
| 	        Query   := "       LEFT JOIN [IRMNSPC].[dbo].[DESC_DAT] dd on sd.F_DESC  = dd.F_DESC "
 | |
| 	        Query   := "       WHERE pd.F_NAME = '":PartNo:"'	AND       pr.F_NAME = '":Reactor:"'	AND "
 | |
| 	        Query   := "            pl.F_NAME = '":RunNo:"'	AND se.F_FLAG = 0 AND "
 | |
| 	        Query   := "            (td.F_NAME = 'UV Broken' or td.F_NAME = 'UV Cracking (>7mm)' or td.F_NAME = 'UV Cracking (3-7mm)' or "
 | |
| 		    Query   := "            td.F_NAME  = 'UV Crazing' or td.F_NAME = 'UV Non-rotation' or td.F_NAME = 'UV Scratch (count)' or "
 | |
| 		    Query   := "            td.F_NAME  = 'UV Slip (count)' or td.F_NAME = 'UV-SPE (>1mm) count' or td.F_NAME = 'UV-SPE (count)' or "
 | |
| 		    Query   := "            td.F_NAME  = 'UV True Haze') AND " 
 | |
| 	        Query   := "            dd.F_DSGP  = 1337859646 and dd.F_NAME IS NOT NULL) "
 | |
|             Query   := "ORDER BY td.F_NAME, se.F_TSNO"
 | |
| 
 | |
|             If Query NE '' then Response = SQL_Services('PostSQLRequest', 'IQSDMS1', Query)
 | |
| 
 | |
|             Convert @FM to @VM in Response
 | |
|             Convert @RM to @FM in Response
 | |
|             
 | |
|         end
 | |
|     end
 | |
|     
 | |
| end service
 | |
| 
 | |
| 
 | |
| //----------------------------------------------------------------------------------------------------------------------
 | |
| // GetRPMData
 | |
| //
 | |
| //
 | |
| //----------------------------------------------------------------------------------------------------------------------
 | |
| Service GetRPMData(RDSNo)
 | |
| 
 | |
|     If RDSNo NE '' then
 | |
|            
 | |
|         ReactRunRec = Database_Services('ReadDataRow', 'REACT_RUN', RDSNo)
 | |
|         If Error_Services('NoError') then 										 
 | |
|             RunNo    = ReactRunRec<REACT_RUN_GAN_RUN_ID$>
 | |
|             Reactor  = 'R':ReactRunRec<REACT_RUN_REACTOR$>
 | |
|             PartNo   = Xlate('REACT_RUN', RDSNo, 'WFR_TRACK_PART', 'X')       
 | |
|             Query    = ''                                                                    
 | |
|             Query    = "SELECT td.F_NAME, se.F_VAL "                                            
 | |
|             Query   := "FROM [IRMNSPC].[dbo].[SGRP_EXT] se "                                                          
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[PART_LOT] pl on se.F_LOT  = pl.F_LOT "                                  
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[TEST_DAT] td on se.F_TEST = td.F_TEST "                                 
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[PART_DAT] pd on se.F_PART = pd.F_PART "                                 
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[PRCS_DAT] pr on se.F_PRCS = pr.F_PRCS "                                 
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[SGRP_DSC] sd on se.F_SGRP = sd.F_SGRP "                                 
 | |
|             Query   := "LEFT JOIN [IRMNSPC].[dbo].[DESC_DAT] dd on sd.F_DESC = dd.F_DESC "                            
 | |
|             Query   := "WHERE pd.F_NAME = '":PartNo:"'	AND "                                                   
 | |
|             Query   := "      pr.F_NAME = '":Reactor:"'	AND "                                                       
 | |
|             Query   := "      pl.F_NAME = '":RunNo:"'	AND "                                                       
 | |
|             Query   := "      se.F_FLAG = 0				AND "
 | |
|             Query   := "      (td.F_NAME = 'Epi Thickness Mean' or td.F_NAME = 'Epi Thickness Std Dev %') AND "
 | |
|             Query   := "      dd.F_DSGP  = 1337859646 AND "                            
 | |
|             Query   := "      dd.F_NAME IS NOT NULL AND "
 | |
|             Query   := "	  sd.F_SGRP = "
 | |
|             Query   := "      (SELECT MAX(sd.F_SGRP) "
 | |
|             Query   := "      FROM [IRMNSPC].[dbo].[SGRP_EXT] se "
 | |
|             Query   := "      JOIN [IRMNSPC].[dbo].[PART_LOT] pl on se.F_LOT        = pl.F_LOT "
 | |
|             Query   := "      JOIN [IRMNSPC].[dbo].[TEST_DAT] td on se.F_TEST       = td.F_TEST "
 | |
|             Query   := "      JOIN [IRMNSPC].[dbo].[PART_DAT] pd on se.F_PART       = pd.F_PART "
 | |
|             Query   := "      JOIN [IRMNSPC].[dbo].[PRCS_DAT] pr on se.F_PRCS       = pr.F_PRCS "
 | |
|             Query   := "      JOIN [IRMNSPC].[dbo].[SGRP_DSC] sd on se.F_SGRP       = sd.F_SGRP "
 | |
|             Query   := "      LEFT JOIN [IRMNSPC].[dbo].[DESC_DAT] dd on sd.F_DESC  = dd.F_DESC "
 | |
|             Query   := "      WHERE pd.F_NAME = '":PartNo:"'	AND "                                                   
 | |
|             Query   := "            pr.F_NAME = '":Reactor:"'	AND "                                                       
 | |
|             Query   := "            pl.F_NAME = '":RunNo:"'	    AND "                                                       
 | |
|             Query   := "            se.F_FLAG = 0				AND "
 | |
|             Query   := "            (td.F_NAME = 'Epi Thickness Mean' or td.F_NAME = 'Epi Thickness Std Dev %') AND "
 | |
|             Query   := "            dd.F_DSGP  = 1337859646 and dd.F_NAME IS NOT NULL) "
 | |
|             Query   := "ORDER BY td.F_NAME"     
 | |
| 
 | |
|             If Query NE '' then Response = SQL_Services('PostSQLRequest', 'IQSDMS1', Query)
 | |
| 
 | |
|             Convert @FM to @VM in Response
 | |
|             Convert @RM to @FM in Response
 | |
|             
 | |
|         end
 | |
|     end
 | |
|     
 | |
| end service
 | |
| 
 | |
| 
 | |
| //----------------------------------------------------------------------------------------------------------------------
 | |
| // GetPLData
 | |
| //
 | |
| //
 | |
| //----------------------------------------------------------------------------------------------------------------------
 | |
| Service GetPLData(RDSNo)
 | |
| 
 | |
|     If RDSNo NE '' then
 | |
|            
 | |
|         ReactRunRec = Database_Services('ReadDataRow', 'REACT_RUN', RDSNo)
 | |
|         If Error_Services('NoError') then 										 
 | |
|             RunNo    = ReactRunRec<REACT_RUN_GAN_RUN_ID$>
 | |
|             Reactor  = 'R':ReactRunRec<REACT_RUN_REACTOR$>
 | |
|             PartNo   = Xlate('REACT_RUN', RDSNo, 'WFR_TRACK_PART', 'X')       
 | |
|             Query    = ''                                                                    
 | |
|             Query    = "SELECT td.F_NAME, se.F_VAL "                                            
 | |
|             Query   := "FROM [IRMNSPC].[dbo].[SGRP_EXT] se "                                                          
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[PART_LOT] pl on se.F_LOT  = pl.F_LOT "                                  
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[TEST_DAT] td on se.F_TEST = td.F_TEST "                                 
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[PART_DAT] pd on se.F_PART = pd.F_PART "                                 
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[PRCS_DAT] pr on se.F_PRCS = pr.F_PRCS "                                 
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[SGRP_DSC] sd on se.F_SGRP = sd.F_SGRP "                                 
 | |
|             Query   := "LEFT JOIN [IRMNSPC].[dbo].[DESC_DAT] dd on sd.F_DESC = dd.F_DESC "                            
 | |
|             Query   := "WHERE pd.F_NAME = '":PartNo:"'	AND "                                                   
 | |
|             Query   := "      pr.F_NAME = '":Reactor:"'	AND "                                                       
 | |
|             Query   := "      pl.F_NAME = '":RunNo:"'	AND "                                                       
 | |
|             Query   := "      se.F_FLAG = 0				AND "
 | |
|             Query   := "      (td.F_NAME = 'PL Ratio' or td.F_NAME = 'BandEdge_V' or td.F_NAME = 'YellowBand_V') AND "
 | |
|             Query   := "      dd.F_DSGP  = 1337859646 AND "                            
 | |
|             Query   := "      dd.F_NAME IS NOT NULL AND "
 | |
|             Query   := "	  sd.F_SGRP = "
 | |
|             Query   := "      (SELECT MAX(sd.F_SGRP)  "
 | |
|             Query   := "      FROM [IRMNSPC].[dbo].[SGRP_EXT] se  " 
 | |
|             Query   := "      JOIN [IRMNSPC].[dbo].[PART_LOT] pl on se.F_LOT  = pl.F_LOT  " 
 | |
|             Query   := "      JOIN [IRMNSPC].[dbo].[TEST_DAT] td on se.F_TEST       = td.F_TEST  "
 | |
|             Query   := "      JOIN [IRMNSPC].[dbo].[PART_DAT] pd on se.F_PART       = pd.F_PART  "
 | |
|             Query   := "      JOIN [IRMNSPC].[dbo].[PRCS_DAT] pr on se.F_PRCS       = pr.F_PRCS  "
 | |
|             Query   := "      JOIN [IRMNSPC].[dbo].[SGRP_DSC] sd on se.F_SGRP       = sd.F_SGRP  "
 | |
|             Query   := "      LEFT JOIN [IRMNSPC].[dbo].[DESC_DAT] dd on sd.F_DESC  = dd.F_DESC  "
 | |
|             Query   := "      WHERE pd.F_NAME = '":PartNo:"'	AND "                                                   
 | |
|             Query   := "            pr.F_NAME = '":Reactor:"'	AND "                                                       
 | |
|             Query   := "            pl.F_NAME = '":RunNo:"'	    AND "                                                       
 | |
|             Query   := "            se.F_FLAG = 0				AND "
 | |
|             Query   := "            (td.F_NAME = 'PL Ratio' or td.F_NAME = 'BandEdge_V' or "
 | |
|             Query   := "             td.F_NAME  = 'YellowBand_V') AND "
 | |
|             Query   := "            dd.F_DSGP  = 1337859646 and dd.F_NAME IS NOT NULL) "
 | |
|             Query   := "ORDER BY td.F_NAME"     
 | |
| 
 | |
|             If Query NE '' then Response = SQL_Services('PostSQLRequest', 'IQSDMS1', Query)
 | |
| 
 | |
|             Convert @FM to @VM in Response
 | |
|             Convert @RM to @FM in Response
 | |
|             
 | |
|         end
 | |
|     end
 | |
|     
 | |
| end service
 | |
| 
 | |
| 
 | |
| //----------------------------------------------------------------------------------------------------------------------
 | |
| // GetPRData
 | |
| //
 | |
| //
 | |
| //----------------------------------------------------------------------------------------------------------------------
 | |
| Service GetPRData(RDSNo)
 | |
| 
 | |
|     If RDSNo NE '' then
 | |
|            
 | |
|         ReactRunRec = Database_Services('ReadDataRow', 'REACT_RUN', RDSNo)
 | |
|         If Error_Services('NoError') then 										 
 | |
|             RunNo      = ReactRunRec<REACT_RUN_GAN_RUN_ID$>
 | |
|             Reactor    = 'R':ReactRunRec<REACT_RUN_REACTOR$>
 | |
|             PartNo     = Xlate('REACT_RUN', RDSNo, 'WFR_TRACK_PART', 'X')
 | |
|             EpiPartNo  = Xlate('REACT_RUN', RDSNo, 'EPI_PART_NO', 'X')
 | |
|             WfrSize    = Xlate('EPI_PART', EpiPartNo, 'SUB_WAFER_SIZE', 'X')
 | |
|             
 | |
|             If WfrSize EQ '200 mm 8 in' then
 | |
|                 Query  = "SELECT td.F_NAME, se.F_SBNO,  se.F_VAL "
 | |
|                 Query := "FROM [IRMNSPC].[dbo].[SGRP_EXT] se " 
 | |
|                 Query := "JOIN [IRMNSPC].[dbo].[PART_LOT] pl on se.F_LOT        = pl.F_LOT " 
 | |
|                 Query := "JOIN [IRMNSPC].[dbo].[TEST_DAT] td on se.F_TEST       = td.F_TEST " 
 | |
|                 Query := "JOIN [IRMNSPC].[dbo].[PART_DAT] pd on se.F_PART       = pd.F_PART " 
 | |
|                 Query := "JOIN [IRMNSPC].[dbo].[PRCS_DAT] pr on se.F_PRCS       = pr.F_PRCS " 
 | |
|                 Query := "JOIN [IRMNSPC].[dbo].[SGRP_DSC] sd on se.F_SGRP       = sd.F_SGRP " 
 | |
|                 Query := "LEFT JOIN [IRMNSPC].[dbo].[DESC_DAT] dd on sd.F_DESC  = dd.F_DESC " 
 | |
|                 Query := "WHERE pd.F_NAME  = '":PartNo:"' AND       pr.F_NAME = '":Reactor:"' " 
 | |
|                 Query := "    AND pl.F_NAME = '":RunNo:"' AND       se.F_FLAG = 0 " 
 | |
|                 Query := "    AND (td.F_NAME = 'Barrier_Composition_RPM_XY' or td.F_NAME = 'Y-Coord') " 
 | |
|                 Query := "    AND dd.F_DSGP = 1337859646 " 
 | |
|                 Query := "    AND dd.F_NAME IS NOT NULL " 	
 | |
|                 Query := "    AND se.F_SGRP = " 
 | |
|                 Query := "    (SELECT TOP 1 se.F_SGRP " 
 | |
|                 Query := "        FROM [IRMNSPC].[dbo].[SGRP_EXT] se " 
 | |
|                 Query := "        JOIN [IRMNSPC].[dbo].[PART_LOT] pl on se.F_LOT  = pl.F_LOT " 
 | |
|                 Query := "        JOIN [IRMNSPC].[dbo].[TEST_DAT] td on se.F_TEST = td.F_TEST " 
 | |
|                 Query := "        JOIN [IRMNSPC].[dbo].[PART_DAT] pd on se.F_PART = pd.F_PART " 
 | |
|                 Query := "        JOIN [IRMNSPC].[dbo].[PRCS_DAT] pr on se.F_PRCS = pr.F_PRCS " 
 | |
|                 Query := "        JOIN [IRMNSPC].[dbo].[SGRP_DSC] sd on se.F_SGRP = sd.F_SGRP " 
 | |
|                 Query := "        LEFT JOIN [IRMNSPC].[dbo].[DESC_DAT] dd on sd.F_DESC = dd.F_DESC " 
 | |
|                 Query := "        WHERE pd.F_NAME = '":PartNo:"' AND       pr.F_NAME = '":Reactor:"' AND       pl.F_NAME = '":RunNo:"' " 
 | |
|                 Query := "        AND       se.F_FLAG = 0    AND       (td.F_NAME = 'Barrier_Composition_RPM_XY' or td.F_NAME = 'Y-Coord') " 
 | |
|                 Query := "        AND        dd.F_DSGP  = 1337859646 and dd.F_NAME IS NOT NULL) " 
 | |
|                 Query := "ORDER BY td.F_NAME, se.F_SBNO DESC" 
 | |
|             end else                                                                    
 | |
|                 Query  = "SELECT td.F_NAME, se.F_SBNO, se.F_VAL "                                           
 | |
|                 Query := "FROM [IRMNSPC].[dbo].[SGRP_EXT] se "                                                          
 | |
|                 Query := "JOIN [IRMNSPC].[dbo].[PART_LOT] pl on se.F_LOT  = pl.F_LOT "                                  
 | |
|                 Query := "JOIN [IRMNSPC].[dbo].[TEST_DAT] td on se.F_TEST = td.F_TEST "                                 
 | |
|                 Query := "JOIN [IRMNSPC].[dbo].[PART_DAT] pd on se.F_PART = pd.F_PART "                                 
 | |
|                 Query := "JOIN [IRMNSPC].[dbo].[PRCS_DAT] pr on se.F_PRCS = pr.F_PRCS "                                 
 | |
|                 Query := "JOIN [IRMNSPC].[dbo].[SGRP_DSC] sd on se.F_SGRP = sd.F_SGRP "                                 
 | |
|                 Query := "LEFT JOIN [IRMNSPC].[dbo].[DESC_DAT] dd on sd.F_DESC = dd.F_DESC "                            
 | |
|                 Query := "WHERE pd.F_NAME = '":PartNo:"'	AND "                                                   
 | |
|                 Query := "      pr.F_NAME = '":Reactor:"'	AND "                                                       
 | |
|                 Query := "      pl.F_NAME = '":RunNo:"'	    AND "                                                       
 | |
|                 Query := "      se.F_FLAG = 0				AND "
 | |
|                 Query := "      (td.F_NAME = 'PR Peak' or td.F_NAME = 'PR Barrier Composition') AND "
 | |
|                 Query := "      dd.F_DSGP  = 1337859592 AND "                            
 | |
|                 Query := "      dd.F_NAME IS NOT NULL AND "
 | |
|                 Query := "      sd.F_SGRP  = " 
 | |
|                 Query := "          (SELECT MAX(sd.F_SGRP) "
 | |
|                 Query := "          FROM [IRMNSPC].[dbo].[SGRP_EXT] se "
 | |
|                 Query := "          JOIN [IRMNSPC].[dbo].[PART_LOT] pl on se.F_LOT        = pl.F_LOT "
 | |
|                 Query := "          JOIN [IRMNSPC].[dbo].[TEST_DAT] td on se.F_TEST       = td.F_TEST "
 | |
|                 Query := "          JOIN [IRMNSPC].[dbo].[PART_DAT] pd on se.F_PART       = pd.F_PART "
 | |
|                 Query := "          JOIN [IRMNSPC].[dbo].[PRCS_DAT] pr on se.F_PRCS       = pr.F_PRCS "
 | |
|                 Query := "          JOIN [IRMNSPC].[dbo].[SGRP_DSC] sd on se.F_SGRP       = sd.F_SGRP "
 | |
|                 Query := "          LEFT JOIN [IRMNSPC].[dbo].[DESC_DAT] dd on sd.F_DESC  = dd.F_DESC "
 | |
|                 Query := "          WHERE pd.F_NAME  = '":PartNo:"'  AND "
 | |
|                 Query := "                pr.F_NAME  = '":Reactor:"' AND "
 | |
|                 Query := "                pl.F_NAME  = '":RunNo:"'   AND "
 | |
|                 Query := "                se.F_FLAG = 0              AND "
 | |
|                 Query := "                (td.F_NAME = 'PR Peak' or td.F_NAME = 'PR Barrier Composition') AND "  
 | |
|                 Query := "                dd.F_DSGP  = 1337859592 and dd.F_NAME IS NOT NULL) "
 | |
|                 Query := "ORDER BY td.F_NAME, se.F_SBNO DESC"                
 | |
|             end
 | |
| 
 | |
|             If Query NE '' then Response = SQL_Services('PostSQLRequest', 'IQSDMS1', Query)
 | |
| 
 | |
|             Convert @FM to @VM in Response
 | |
|             Convert @RM to @FM in Response
 | |
|             
 | |
|         end
 | |
|     end
 | |
| 
 | |
| end service
 | |
| 
 | |
| 
 | |
| //----------------------------------------------------------------------------------------------------------------------
 | |
| // GetWARPData
 | |
| //
 | |
| //
 | |
| //----------------------------------------------------------------------------------------------------------------------
 | |
| Service GetWARPData(RDSNo)
 | |
| 
 | |
|     If RDSNo NE '' then
 | |
|            
 | |
|         ReactRunRec = Database_Services('ReadDataRow', 'REACT_RUN', RDSNo)
 | |
|         If Error_Services('NoError') then 										 
 | |
|             RunNo      = ReactRunRec<REACT_RUN_GAN_RUN_ID$>
 | |
|             Reactor    = 'R':ReactRunRec<REACT_RUN_REACTOR$>
 | |
|             PartNo     = Xlate('REACT_RUN', RDSNo, 'WFR_TRACK_PART', 'X')
 | |
|             EpiPartNo  = Xlate('REACT_RUN', RDSNo, 'EPI_PART_NO', 'X')
 | |
|             WfrSize    = Xlate('EPI_PART', EpiPartNo, 'SUB_WAFER_SIZE', 'X')    
 | |
|             Query      = ''                                                                    
 | |
|             Query      = "SELECT td.F_NAME, se.F_TSNO, se.F_VAL "                                            
 | |
|             Query     := "FROM [IRMNSPC].[dbo].[SGRP_EXT] se "                                                          
 | |
|             Query     := "JOIN [IRMNSPC].[dbo].[PART_LOT] pl on se.F_LOT  = pl.F_LOT "                                  
 | |
|             Query     := "JOIN [IRMNSPC].[dbo].[TEST_DAT] td on se.F_TEST = td.F_TEST "                                 
 | |
|             Query     := "JOIN [IRMNSPC].[dbo].[PART_DAT] pd on se.F_PART = pd.F_PART "                                 
 | |
|             Query     := "JOIN [IRMNSPC].[dbo].[PRCS_DAT] pr on se.F_PRCS = pr.F_PRCS "                                 
 | |
|             Query     := "JOIN [IRMNSPC].[dbo].[SGRP_DSC] sd on se.F_SGRP = sd.F_SGRP "                                 
 | |
|             Query     := "LEFT JOIN [IRMNSPC].[dbo].[DESC_DAT] dd on sd.F_DESC = dd.F_DESC "                            
 | |
|             Query     := "WHERE pd.F_NAME = '":PartNo:"'	AND "                                                   
 | |
|             Query     := "      pr.F_NAME = '":Reactor:"'	AND "                                                       
 | |
|             Query     := "      pl.F_NAME = '":RunNo:"'	    AND "                                                       
 | |
|             Query     := "      se.F_FLAG = 0				AND "
 | |
|             Query     := "      (td.F_NAME = 'Warp' "
 | |
|             If WfrSize EQ '200 mm 8 in' then
 | |
|                 Query := "or td.F_NAME = 'BowCenter') AND "                       
 | |
|             end else
 | |
|                 Query := "or td.F_NAME = 'Bow') AND "   
 | |
|             end
 | |
|             Query := "      dd.F_DSGP  = 1337859646 AND "                            
 | |
|             Query := "      dd.F_NAME IS NOT NULL AND "
 | |
|             Query := "      sd.F_SGRP = "
 | |
|             Query := "      (SELECT MAX(sd.F_SGRP) "
 | |
|             Query := "      FROM [IRMNSPC].[dbo].[SGRP_EXT] se "
 | |
|             Query := "      JOIN [IRMNSPC].[dbo].[PART_LOT] pl on se.F_LOT        = pl.F_LOT  "
 | |
|             Query := "      JOIN [IRMNSPC].[dbo].[TEST_DAT] td on se.F_TEST       = td.F_TEST "
 | |
|             Query := "      JOIN [IRMNSPC].[dbo].[PART_DAT] pd on se.F_PART       = pd.F_PART "
 | |
|             Query := "      JOIN [IRMNSPC].[dbo].[PRCS_DAT] pr on se.F_PRCS       = pr.F_PRCS "
 | |
|             Query := "      JOIN [IRMNSPC].[dbo].[SGRP_DSC] sd on se.F_SGRP       = sd.F_SGRP "
 | |
|             Query := "      LEFT JOIN [IRMNSPC].[dbo].[DESC_DAT] dd on sd.F_DESC  = dd.F_DESC "
 | |
|             Query :=        "WHERE  pd.F_NAME = '":PartNo:"'	AND "                                                   
 | |
|             Query := "              pr.F_NAME = '":Reactor:"'	AND "                                                       
 | |
|             Query := "              pl.F_NAME = '":RunNo:"'	    AND "                                                       
 | |
|             Query := "              se.F_FLAG = 0				AND "
 | |
|             Query := "              (td.F_NAME = 'Warp' "
 | |
|             If WfrSize EQ '200 mm 8 in' then
 | |
|                 Query := "or td.F_NAME = 'BowCenter') AND "                       
 | |
|             end else
 | |
|                 Query := "or td.F_NAME = 'Bow') AND "   
 | |
|             end
 | |
|             Query := "              dd.F_DSGP  = 1337859646 and dd.F_NAME IS NOT NULL) "
 | |
|             Query := "ORDER BY td.F_NAME"     
 | |
| 
 | |
|             If Query NE '' then Response = SQL_Services('PostSQLRequest', 'IQSDMS1', Query)
 | |
| 
 | |
|             Convert @FM to @VM in Response
 | |
|             Convert @RM to @FM in Response
 | |
|             
 | |
|         end
 | |
|     end
 | |
|     
 | |
| end service
 | |
| 
 | |
| 
 | |
| //----------------------------------------------------------------------------------------------------------------------
 | |
| // GetCandelaData
 | |
| //
 | |
| //
 | |
| //----------------------------------------------------------------------------------------------------------------------
 | |
| Service GetCandelaData(RDSNo)
 | |
| 
 | |
|     If RDSNo NE '' then
 | |
|            
 | |
|         ReactRunRec = Database_Services('ReadDataRow', 'REACT_RUN', RDSNo)
 | |
|         If Error_Services('NoError') then 										 
 | |
|             RunNo      = ReactRunRec<REACT_RUN_GAN_RUN_ID$>
 | |
|             Reactor    = 'R':ReactRunRec<REACT_RUN_REACTOR$>
 | |
|             EpiPartNo  = Xlate('REACT_RUN', RDSNo, 'EPI_PART_NO', 'X')
 | |
|             WfrSize    = Xlate('EPI_PART', EpiPartNo, 'SUB_WAFER_SIZE', 'X')
 | |
|             PartNo     = Xlate('REACT_RUN', RDSNo, 'WFR_TRACK_PART', 'X')       
 | |
|             Query      = ''                                                                    
 | |
|             Query      = "SELECT td.F_NAME, se.F_TSNO, se.F_VAL "                                            
 | |
|             Query     := "FROM [IRMNSPC].[dbo].[SGRP_EXT] se "                                                          
 | |
|             Query     := "JOIN [IRMNSPC].[dbo].[PART_LOT] pl on se.F_LOT  = pl.F_LOT "                                  
 | |
|             Query     := "JOIN [IRMNSPC].[dbo].[TEST_DAT] td on se.F_TEST = td.F_TEST "                                 
 | |
|             Query     := "JOIN [IRMNSPC].[dbo].[PART_DAT] pd on se.F_PART = pd.F_PART "                                 
 | |
|             Query     := "JOIN [IRMNSPC].[dbo].[PRCS_DAT] pr on se.F_PRCS = pr.F_PRCS "                                 
 | |
|             Query     := "JOIN [IRMNSPC].[dbo].[SGRP_DSC] sd on se.F_SGRP = sd.F_SGRP "                                 
 | |
|             Query     := "LEFT JOIN [IRMNSPC].[dbo].[DESC_DAT] dd on sd.F_DESC = dd.F_DESC "                            
 | |
|             Query     := "WHERE pd.F_NAME = '":PartNo:"'	AND "                                                   
 | |
|             Query     := "      pr.F_NAME = '":Reactor:"'	AND "                                                       
 | |
|             Query     := "      pl.F_NAME = '":RunNo:"'	    AND "                                                       
 | |
|             Query     := "      se.F_FLAG = 0				AND "
 | |
|             Query     := "      (td.F_NAME = 'Candela Cracking' or td.F_NAME = 'Candela Cracking Acceptable' or "
 | |
|             Query     := "       td.F_NAME  = 'Candela Crater' or td.F_NAME = 'Candela LPD Large' or "
 | |
|             Query     := "       td.F_NAME  = 'Candela LPD Medium' or td.F_NAME = 'Candela LPD Small' or "
 | |
|             Query     := "       td.F_NAME  = 'Candela Pits' or td.F_NAME = 'Candela SPE' or "
 | |
|             Query     := "       td.F_NAME  = 'Candela Spirals' "
 | |
|             If WfrSize EQ '200 mm 8 in' then
 | |
|                 Query := "or td.F_NAME = 'Candela Total Defects') AND "                       
 | |
|             end else
 | |
|                 Query := ") AND "   
 | |
|             end
 | |
|             Query := "       dd.F_DSGP  = 1337859646 AND dd.F_NAME IS NOT NULL AND "
 | |
|             Query := "       sd.F_SGRP = "
 | |
|             Query := "       (SELECT MAX(sd.F_SGRP) "
 | |
|             Query := "       FROM [IRMNSPC].[dbo].[SGRP_EXT] se "
 | |
|             Query := "       JOIN [IRMNSPC].[dbo].[PART_LOT] pl on se.F_LOT        = pl.F_LOT "
 | |
|             Query := "       JOIN [IRMNSPC].[dbo].[TEST_DAT] td on se.F_TEST       = td.F_TEST "
 | |
|             Query := "       JOIN [IRMNSPC].[dbo].[PART_DAT] pd on se.F_PART       = pd.F_PART "
 | |
|             Query := "       JOIN [IRMNSPC].[dbo].[PRCS_DAT] pr on se.F_PRCS       = pr.F_PRCS "
 | |
|             Query := "       JOIN [IRMNSPC].[dbo].[SGRP_DSC] sd on se.F_SGRP       = sd.F_SGRP "
 | |
|             Query := "       LEFT JOIN [IRMNSPC].[dbo].[DESC_DAT] dd on sd.F_DESC  = dd.F_DESC "
 | |
|             Query := "       WHERE pd.F_NAME = '":PartNo:"'	    AND "
 | |
|             Query := "             pr.F_NAME = '":Reactor:"'    AND "
 | |
|             Query := "             pl.F_NAME = '":RunNo:"'	    AND "
 | |
|             Query := "             se.F_FLAG  = 0 "
 | |
|             Query := "       AND (td.F_NAME = 'Candela Cracking' or td.F_NAME = 'Candela Cracking Acceptable' or td.F_NAME = 'Candela Crater' or "
 | |
|             Query := "            td.F_NAME = 'Candela LPD Large' or td.F_NAME = 'Candela LPD Medium' or td.F_NAME = 'Candela LPD Small' or td.F_NAME = 'Candela Pits' or "
 | |
|             Query := "            td.F_NAME = 'Candela SPE' or td.F_NAME = 'Candela Spirals' "
 | |
|             If WfrSize EQ '200 mm 8 in' then
 | |
|                 Query := "or td.F_NAME = 'Candela Total Defects') AND "                       
 | |
|             end else
 | |
|                 Query := ") AND "   
 | |
|             end  
 | |
|             Query := "      dd.F_DSGP  = 1337859646 and dd.F_NAME IS NOT NULL) "
 | |
|             Query := "ORDER BY td.F_NAME"
 | |
| 
 | |
|             Response = SQL_Services('PostSQLRequest', 'IQSDMS1', Query)
 | |
|             Convert @FM to @VM in Response
 | |
|             Convert @RM to @FM in Response
 | |
|         end
 | |
|     end
 | |
|     
 | |
| end service
 | |
| 
 | |
| 
 | |
| //----------------------------------------------------------------------------------------------------------------------
 | |
| // GetXRDAlumData
 | |
| //
 | |
| //
 | |
| //----------------------------------------------------------------------------------------------------------------------
 | |
| Service GetXRDAlumData(RDSNo)
 | |
| 
 | |
|     If RDSNo NE '' then
 | |
|            
 | |
|         ReactRunRec = Database_Services('ReadDataRow', 'REACT_RUN', RDSNo)
 | |
|         If Error_Services('NoError') then 										 
 | |
|             RunNo    = ReactRunRec<REACT_RUN_GAN_RUN_ID$>
 | |
|             Reactor  = 'R':ReactRunRec<REACT_RUN_REACTOR$>
 | |
|             PartNo   = Xlate('REACT_RUN', RDSNo, 'WFR_TRACK_PART', 'X')       
 | |
|             Query    = ''                                                                    
 | |
|             Query    = "SELECT td.F_NAME, se.F_SBNO, dd.F_NAME, se.F_VAL "                                            
 | |
|             Query   := "FROM [IRMNSPC].[dbo].[SGRP_EXT] se "                                                          
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[PART_LOT] pl on se.F_LOT  = pl.F_LOT "                                  
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[TEST_DAT] td on se.F_TEST = td.F_TEST "                                 
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[PART_DAT] pd on se.F_PART = pd.F_PART "                                 
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[PRCS_DAT] pr on se.F_PRCS = pr.F_PRCS "                                 
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[SGRP_DSC] sd on se.F_SGRP = sd.F_SGRP "                                 
 | |
|             Query   := "LEFT JOIN [IRMNSPC].[dbo].[DESC_DAT] dd on sd.F_DESC = dd.F_DESC "                            
 | |
|             Query   := "WHERE pd.F_NAME = '":PartNo:"'	AND "                                                   
 | |
|             Query   := "      pr.F_NAME = '":Reactor:"'	AND "                                                       
 | |
|             Query   := "      pl.F_NAME = '":RunNo:"'	AND "                                                       
 | |
|             Query   := "      se.F_FLAG = 0				AND "
 | |
|             Query   := "      (td.F_NAME = 'Al% B.B.' or td.F_NAME = 'Al% Barrier' or td.F_NAME = 'Al% SLS' or "
 | |
|             Query   := "       td.F_NAME = 'Al% TL1' or td.F_NAME = 'SL Period') AND "                       
 | |
|             Query   := "       dd.F_DSGP  = 1337859646 AND dd.F_NAME IS NOT NULL AND "
 | |
|             Query   := "       sd.F_SGRP = "
 | |
|             Query   := "       (SELECT MAX(sd.F_SGRP) "
 | |
|             Query   := "       FROM [IRMNSPC].[dbo].[SGRP_EXT] se "
 | |
|             Query   := "       JOIN [IRMNSPC].[dbo].[PART_LOT] pl on se.F_LOT        = pl.F_LOT  "
 | |
|             Query   := "       JOIN [IRMNSPC].[dbo].[TEST_DAT] td on se.F_TEST       = td.F_TEST "
 | |
|             Query   := "       JOIN [IRMNSPC].[dbo].[PART_DAT] pd on se.F_PART       = pd.F_PART "
 | |
|             Query   := "       JOIN [IRMNSPC].[dbo].[PRCS_DAT] pr on se.F_PRCS       = pr.F_PRCS "
 | |
|             Query   := "       JOIN [IRMNSPC].[dbo].[SGRP_DSC] sd on se.F_SGRP       = sd.F_SGRP "
 | |
|             Query   := "       LEFT JOIN [IRMNSPC].[dbo].[DESC_DAT] dd on sd.F_DESC  = dd.F_DESC "
 | |
|             Query   := "       WHERE pd.F_NAME = '":PartNo:"'	AND "                                                   
 | |
|             Query   := "             pr.F_NAME = '":Reactor:"'	AND "                                                       
 | |
|             Query   := "             pl.F_NAME = '":RunNo:"'	AND "                                                       
 | |
|             Query   := "             se.F_FLAG = 0				AND "
 | |
|             Query   := "             (td.F_NAME = 'Al% B.B.' or td.F_NAME = 'Al% Barrier' or "
 | |
|             Query   := "              td.F_NAME  = 'Al% SLS' or td.F_NAME = 'Al% TL1' or td.F_NAME = 'SL Period') AND "
 | |
|             Query   := "              dd.F_DSGP  = 1337859646 and dd.F_NAME IS NOT NULL) "
 | |
|             Query   := "ORDER BY td.F_NAME, se.F_SBNO"
 | |
| 
 | |
|             Response = SQL_Services('PostSQLRequest', 'IQSDMS1', Query)
 | |
|             Convert @FM to @VM in Response
 | |
|             Convert @RM to @FM in Response
 | |
|         end
 | |
|     end
 | |
|     
 | |
| end service
 | |
| 
 | |
| 
 | |
| //----------------------------------------------------------------------------------------------------------------------
 | |
| // GetXRDThicknessData
 | |
| //
 | |
| //
 | |
| //----------------------------------------------------------------------------------------------------------------------
 | |
| Service GetXRDThicknessData(RDSNo)
 | |
| 
 | |
|     If RDSNo NE '' then
 | |
|            
 | |
|         ReactRunRec = Database_Services('ReadDataRow', 'REACT_RUN', RDSNo)
 | |
|         If Error_Services('NoError') then 										 
 | |
|             RunNo    = ReactRunRec<REACT_RUN_GAN_RUN_ID$>
 | |
|             Reactor  = 'R':ReactRunRec<REACT_RUN_REACTOR$>
 | |
|             PartNo   = Xlate('REACT_RUN', RDSNo, 'WFR_TRACK_PART', 'X')       
 | |
|             Query    = ''                                                                    
 | |
|             Query    = "SELECT td.F_NAME, se.F_SBNO, dd.F_NAME, se.F_VAL "                                            
 | |
|             Query   := "FROM [IRMNSPC].[dbo].[SGRP_EXT] se "                                                          
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[PART_LOT] pl on se.F_LOT  = pl.F_LOT "                                  
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[TEST_DAT] td on se.F_TEST = td.F_TEST "                                 
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[PART_DAT] pd on se.F_PART = pd.F_PART "                                 
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[PRCS_DAT] pr on se.F_PRCS = pr.F_PRCS "                                 
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[SGRP_DSC] sd on se.F_SGRP = sd.F_SGRP "                                 
 | |
|             Query   := "LEFT JOIN [IRMNSPC].[dbo].[DESC_DAT] dd on sd.F_DESC = dd.F_DESC "                            
 | |
|             Query   := "WHERE pd.F_NAME = '":PartNo:"'	AND "                                                   
 | |
|             Query   := "      pr.F_NAME = '":Reactor:"'	AND "                                                       
 | |
|             Query   := "      pl.F_NAME = '":RunNo:"'	AND "                                                       
 | |
|             Query   := "      se.F_FLAG = 0				AND "
 | |
|             Query   := "      (td.F_NAME = 'XRR Thickness (nm)' or td.F_NAME = 'FWHM 006' or "
 | |
|             Query   := "       td.F_NAME = 'FWHM 105') AND "                       
 | |
|             Query   := "       dd.F_DSGP  = 1337859646 AND dd.F_NAME IS NOT NULL AND "
 | |
|             Query   := "       sd.F_SGRP = "
 | |
|             Query   := "       (SELECT MAX(sd.F_SGRP) "
 | |
|             Query   := "       FROM [IRMNSPC].[dbo].[SGRP_EXT] se "
 | |
|             Query   := "       JOIN [IRMNSPC].[dbo].[PART_LOT] pl on se.F_LOT        = pl.F_LOT  "
 | |
|             Query   := "       JOIN [IRMNSPC].[dbo].[TEST_DAT] td on se.F_TEST       = td.F_TEST "
 | |
|             Query   := "       JOIN [IRMNSPC].[dbo].[PART_DAT] pd on se.F_PART       = pd.F_PART "
 | |
|             Query   := "       JOIN [IRMNSPC].[dbo].[PRCS_DAT] pr on se.F_PRCS       = pr.F_PRCS "
 | |
|             Query   := "       JOIN [IRMNSPC].[dbo].[SGRP_DSC] sd on se.F_SGRP       = sd.F_SGRP "
 | |
|             Query   := "       LEFT JOIN [IRMNSPC].[dbo].[DESC_DAT] dd on sd.F_DESC  = dd.F_DESC "
 | |
|             Query   := "       WHERE pd.F_NAME = '":PartNo:"'	AND "                                                   
 | |
|             Query   := "             pr.F_NAME = '":Reactor:"'	AND "                                                       
 | |
|             Query   := "             pl.F_NAME = '":RunNo:"'	AND "                                                       
 | |
|             Query   := "             se.F_FLAG = 0				AND "
 | |
|             Query   := "             (td.F_NAME = 'XRR Thickness (nm)' or td.F_NAME = 'FWHM 006' or "
 | |
|             Query   := "              td.F_NAME = 'FWHM 105') AND "
 | |
|             Query   := "              dd.F_DSGP  = 1337859646 and dd.F_NAME IS NOT NULL) "
 | |
|             Query   := "ORDER BY td.F_NAME, se.F_SBNO"
 | |
| 
 | |
|             Response = SQL_Services('PostSQLRequest', 'IQSDMS1', Query)
 | |
|             Convert @FM to @VM in Response
 | |
|             Convert @RM to @FM in Response
 | |
|         end
 | |
|     end
 | |
|     
 | |
| end service
 | |
| 
 | |
| 
 | |
| //----------------------------------------------------------------------------------------------------------------------
 | |
| // GetXRDWtAvgData
 | |
| //
 | |
| //
 | |
| //----------------------------------------------------------------------------------------------------------------------
 | |
| Service GetXRDWtAvgData(RDSNo)
 | |
| 
 | |
|     If RDSNo NE '' then
 | |
|            
 | |
|         ReactRunRec = Database_Services('ReadDataRow', 'REACT_RUN', RDSNo)
 | |
|         If Error_Services('NoError') then 										 
 | |
|             RunNo    = ReactRunRec<REACT_RUN_GAN_RUN_ID$>
 | |
|             Reactor  = 'R':ReactRunRec<REACT_RUN_REACTOR$>
 | |
|             PartNo   = Xlate('REACT_RUN', RDSNo, 'WFR_TRACK_PART', 'X')       
 | |
|             Query    = ''                                                                    
 | |
|             Query    = "SELECT td.F_NAME, se.F_SBNO, dd.F_NAME, se.F_VAL "                                            
 | |
|             Query   := "FROM [IRMNSPC].[dbo].[SGRP_EXT] se "                                                          
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[PART_LOT] pl on se.F_LOT  = pl.F_LOT "                                  
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[TEST_DAT] td on se.F_TEST = td.F_TEST "                                 
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[PART_DAT] pd on se.F_PART = pd.F_PART "                                 
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[PRCS_DAT] pr on se.F_PRCS = pr.F_PRCS "                                 
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[SGRP_DSC] sd on se.F_SGRP = sd.F_SGRP "                                 
 | |
|             Query   := "LEFT JOIN [IRMNSPC].[dbo].[DESC_DAT] dd on sd.F_DESC = dd.F_DESC "                            
 | |
|             Query   := "WHERE pd.F_NAME = '":PartNo:"'	AND "                                                   
 | |
|             Query   := "      pr.F_NAME = '":Reactor:"'	AND "                                                       
 | |
|             Query   := "      pl.F_NAME = '":RunNo:"'	AND "                                                       
 | |
|             Query   := "      se.F_FLAG = 0				AND "
 | |
|             Query   := "      (td.F_NAME = 'Al% B.B. WTAVG' or "
 | |
|             Query   := "       td.F_NAME = 'Al% Barrier WTAVG' or td.F_NAME = 'Al% SLS WTAVG' or "
 | |
|             Query   := "       td.F_NAME = 'Al% TL1 WTAVG' or td.F_NAME = 'SL Period WTAVG') AND "                       
 | |
|             Query   := "       dd.F_DSGP  = 1337859646 AND dd.F_NAME IS NOT NULL AND "
 | |
|             Query   := "       sd.F_SGRP = "
 | |
|             Query   := "       (SELECT MAX(sd.F_SGRP) "
 | |
|             Query   := "       FROM [IRMNSPC].[dbo].[SGRP_EXT] se "
 | |
|             Query   := "       JOIN [IRMNSPC].[dbo].[PART_LOT] pl on se.F_LOT        = pl.F_LOT  "
 | |
|             Query   := "       JOIN [IRMNSPC].[dbo].[TEST_DAT] td on se.F_TEST       = td.F_TEST "
 | |
|             Query   := "       JOIN [IRMNSPC].[dbo].[PART_DAT] pd on se.F_PART       = pd.F_PART "
 | |
|             Query   := "       JOIN [IRMNSPC].[dbo].[PRCS_DAT] pr on se.F_PRCS       = pr.F_PRCS "
 | |
|             Query   := "       JOIN [IRMNSPC].[dbo].[SGRP_DSC] sd on se.F_SGRP       = sd.F_SGRP "
 | |
|             Query   := "       LEFT JOIN [IRMNSPC].[dbo].[DESC_DAT] dd on sd.F_DESC  = dd.F_DESC "
 | |
|             Query   := "       WHERE pd.F_NAME = '":PartNo:"'	AND "                                                   
 | |
|             Query   := "             pr.F_NAME = '":Reactor:"'	AND "                                                       
 | |
|             Query   := "             pl.F_NAME = '":RunNo:"'	AND "                                                       
 | |
|             Query   := "             se.F_FLAG = 0				AND "
 | |
|             Query   := "             (td.F_NAME = 'Al% B.B. WTAVG' or "
 | |
|             Query   := "              td.F_NAME = 'Al% Barrier WTAVG' or td.F_NAME = 'Al% SLS WTAVG' or "
 | |
|             Query   := "              td.F_NAME = 'Al% TL1 WTAVG' or td.F_NAME = 'SL Period WTAVG') AND "
 | |
|             Query   := "              dd.F_DSGP  = 1337859646 and dd.F_NAME IS NOT NULL) "
 | |
|             Query   := "ORDER BY td.F_NAME, se.F_SBNO"
 | |
| 
 | |
|             Response = SQL_Services('PostSQLRequest', 'IQSDMS1', Query)
 | |
|             Convert @FM to @VM in Response
 | |
|             Convert @RM to @FM in Response
 | |
|         end
 | |
|     end
 | |
|     
 | |
| end service
 | |
| 
 | |
| 
 | |
| //----------------------------------------------------------------------------------------------------------------------
 | |
| // GetXRDCoordData
 | |
| //
 | |
| //
 | |
| //----------------------------------------------------------------------------------------------------------------------
 | |
| Service GetXRDXCoordData(RDSNo)
 | |
| 
 | |
|     Response = ''
 | |
|     If RDSNo NE '' then
 | |
|            
 | |
|         ReactRunRec = Database_Services('ReadDataRow', 'REACT_RUN', RDSNo)
 | |
|         If Error_Services('NoError') then 										 
 | |
|             RunNo    = ReactRunRec<REACT_RUN_GAN_RUN_ID$>
 | |
|             Reactor  = 'R':ReactRunRec<REACT_RUN_REACTOR$>
 | |
|             PartNo   = Xlate('REACT_RUN', RDSNo, 'WFR_TRACK_PART', 'X')       
 | |
|             Query    = ''                                                                    
 | |
|             Query    = "SELECT td.F_NAME, se.F_SBNO, dd.F_NAME, se.F_VAL "                                            
 | |
|             Query   := "FROM [IRMNSPC].[dbo].[SGRP_EXT] se "                                                          
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[PART_LOT] pl on se.F_LOT  = pl.F_LOT "                                  
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[TEST_DAT] td on se.F_TEST = td.F_TEST "                                 
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[PART_DAT] pd on se.F_PART = pd.F_PART "                                 
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[PRCS_DAT] pr on se.F_PRCS = pr.F_PRCS "                                 
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[SGRP_DSC] sd on se.F_SGRP = sd.F_SGRP "                                 
 | |
|             Query   := "LEFT JOIN [IRMNSPC].[dbo].[DESC_DAT] dd on sd.F_DESC = dd.F_DESC "                            
 | |
|             Query   := "WHERE pd.F_NAME = '":PartNo:"'	AND "                                                   
 | |
|             Query   := "      pr.F_NAME = '":Reactor:"'	AND "                                                       
 | |
|             Query   := "      pl.F_NAME = '":RunNo:"'	AND "                                                       
 | |
|             Query   := "      se.F_FLAG = 0				AND "
 | |
|             Query   := "      td.F_NAME = 'X-Coord' AND "
 | |
|             Query   := "      dd.F_DSGP  = 1337859646 AND dd.F_NAME IS NOT NULL AND se.F_SBNO > 0 AND "
 | |
|             Query   := "      sd.F_TRTM = "
 | |
|             Query   := "         (SELECT MAX(sd.F_TRTM) "
 | |
|             Query   := "         FROM [IRMNSPC].[dbo].[SGRP_EXT] se "
 | |
|             Query   := "         JOIN [IRMNSPC].[dbo].[PART_LOT] pl on se.F_LOT  = pl.F_LOT "
 | |
|             Query   := "         JOIN [IRMNSPC].[dbo].[TEST_DAT] td on se.F_TEST = td.F_TEST "
 | |
|             Query   := "         JOIN [IRMNSPC].[dbo].[PART_DAT] pd on se.F_PART = pd.F_PART "
 | |
|             Query   := "         JOIN [IRMNSPC].[dbo].[PRCS_DAT] pr on se.F_PRCS = pr.F_PRCS "
 | |
|             Query   := "         JOIN [IRMNSPC].[dbo].[SGRP_DSC] sd on se.F_SGRP = sd.F_SGRP "
 | |
|             Query   := "         LEFT JOIN [IRMNSPC].[dbo].[DESC_DAT] dd on sd.F_DESC = dd.F_DESC "
 | |
|             Query   := "         WHERE pd.F_NAME = '":PartNo:"'	    AND "
 | |
|             Query   := "               pr.F_NAME = '":Reactor:"'	AND "
 | |
|             Query   := "               pl.F_NAME = '":RunNo:"'	    AND " 
 | |
|             Query   := "               se.F_FLAG = 0 AND td.F_NAME = 'X-Coord' AND "
 | |
|             Query   := "               dd.F_DSGP  = 1337859646 and dd.F_NAME IS NOT NULL)"
 | |
|             
 | |
|             Response = SQL_Services('PostSQLRequest', 'IQSDMS1', Query)
 | |
|             Convert @FM to @VM in Response
 | |
|             Convert @RM to @FM in Response
 | |
|         end
 | |
|     end
 | |
|     
 | |
| end service
 | |
| 
 | |
| 
 | |
| //----------------------------------------------------------------------------------------------------------------------
 | |
| // GetXRDCoordData
 | |
| //
 | |
| //
 | |
| //----------------------------------------------------------------------------------------------------------------------
 | |
| Service GetXRDYCoordData(RDSNo)
 | |
| 
 | |
|     Response = ''
 | |
|     If RDSNo NE '' then
 | |
|            
 | |
|         ReactRunRec = Database_Services('ReadDataRow', 'REACT_RUN', RDSNo)
 | |
|         If Error_Services('NoError') then 										 
 | |
|             RunNo    = ReactRunRec<REACT_RUN_GAN_RUN_ID$>
 | |
|             Reactor  = 'R':ReactRunRec<REACT_RUN_REACTOR$>
 | |
|             PartNo   = Xlate('REACT_RUN', RDSNo, 'WFR_TRACK_PART', 'X')       
 | |
|             Query    = ''                                                                    
 | |
|             Query    = "SELECT td.F_NAME, se.F_SBNO, dd.F_NAME, se.F_VAL "                                            
 | |
|             Query   := "FROM [IRMNSPC].[dbo].[SGRP_EXT] se "                                                          
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[PART_LOT] pl on se.F_LOT  = pl.F_LOT "                                  
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[TEST_DAT] td on se.F_TEST = td.F_TEST "                                 
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[PART_DAT] pd on se.F_PART = pd.F_PART "                                 
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[PRCS_DAT] pr on se.F_PRCS = pr.F_PRCS "                                 
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[SGRP_DSC] sd on se.F_SGRP = sd.F_SGRP "                                 
 | |
|             Query   := "LEFT JOIN [IRMNSPC].[dbo].[DESC_DAT] dd on sd.F_DESC = dd.F_DESC "                            
 | |
|             Query   := "WHERE pd.F_NAME = '":PartNo:"'	AND "                                                   
 | |
|             Query   := "      pr.F_NAME = '":Reactor:"'	AND "                                                       
 | |
|             Query   := "      pl.F_NAME = '":RunNo:"'	AND "                                                       
 | |
|             Query   := "      se.F_FLAG = 0				AND "
 | |
|             Query   := "      td.F_NAME = 'Y-Coord' AND "
 | |
|             Query   := "      dd.F_DSGP  = 1337859646 AND dd.F_NAME IS NOT NULL AND se.F_SBNO > 0 AND "
 | |
|             Query   := "      sd.F_TRTM = "
 | |
|             Query   := "         (SELECT MAX(sd.F_TRTM) "
 | |
|             Query   := "         FROM [IRMNSPC].[dbo].[SGRP_EXT] se "
 | |
|             Query   := "         JOIN [IRMNSPC].[dbo].[PART_LOT] pl on se.F_LOT  = pl.F_LOT "
 | |
|             Query   := "         JOIN [IRMNSPC].[dbo].[TEST_DAT] td on se.F_TEST = td.F_TEST "
 | |
|             Query   := "         JOIN [IRMNSPC].[dbo].[PART_DAT] pd on se.F_PART = pd.F_PART "
 | |
|             Query   := "         JOIN [IRMNSPC].[dbo].[PRCS_DAT] pr on se.F_PRCS = pr.F_PRCS "
 | |
|             Query   := "         JOIN [IRMNSPC].[dbo].[SGRP_DSC] sd on se.F_SGRP = sd.F_SGRP "
 | |
|             Query   := "         LEFT JOIN [IRMNSPC].[dbo].[DESC_DAT] dd on sd.F_DESC = dd.F_DESC "
 | |
|             Query   := "         WHERE pd.F_NAME = '":PartNo:"'	    AND "
 | |
|             Query   := "               pr.F_NAME = '":Reactor:"'	AND "
 | |
|             Query   := "               pl.F_NAME = '":RunNo:"'	    AND " 
 | |
|             Query   := "               se.F_FLAG = 0 AND td.F_NAME = 'Y-Coord' AND "
 | |
|             Query   := "               dd.F_DSGP  = 1337859646 and dd.F_NAME IS NOT NULL)"
 | |
|             
 | |
|             Response = SQL_Services('PostSQLRequest', 'IQSDMS1', Query)
 | |
|             Convert @FM to @VM in Response
 | |
|             Convert @RM to @FM in Response
 | |
|         end
 | |
|     end
 | |
|     
 | |
| end service
 | |
| 
 | |
| 
 | |
| //----------------------------------------------------------------------------------------------------------------------
 | |
| // GetBVData
 | |
| //
 | |
| //
 | |
| //----------------------------------------------------------------------------------------------------------------------
 | |
| Service GetBVData(RDSNo, Parameter=BV_PARAMETERS)
 | |
| 
 | |
|     If RDSNo NE '' then
 | |
|            
 | |
|         ReactRunRec = Database_Services('ReadDataRow', 'REACT_RUN', RDSNo)
 | |
|         If Error_Services('NoError') then 										 
 | |
|             RunNo    = ReactRunRec<REACT_RUN_GAN_RUN_ID$>
 | |
|             Reactor  = 'R':ReactRunRec<REACT_RUN_REACTOR$>
 | |
|             PartNo   = Xlate('REACT_RUN', RDSNo, 'WFR_TRACK_PART', 'X')       
 | |
|             Query    = ''                                                                    
 | |
|             Query    = "SELECT td.F_NAME, se.F_SBNO, se.F_VAL "                                            
 | |
|             Query   := "FROM [IRMNSPC].[dbo].[SGRP_EXT] se "                                                          
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[PART_LOT] pl on se.F_LOT  = pl.F_LOT "                                  
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[TEST_DAT] td on se.F_TEST = td.F_TEST "                                 
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[PART_DAT] pd on se.F_PART = pd.F_PART "                                 
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[PRCS_DAT] pr on se.F_PRCS = pr.F_PRCS "                                 
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[SGRP_DSC] sd on se.F_SGRP = sd.F_SGRP "                                 
 | |
|             Query   := "LEFT JOIN [IRMNSPC].[dbo].[DESC_DAT] dd on sd.F_DESC = dd.F_DESC "                            
 | |
|             Query   := "WHERE pd.F_NAME = '":PartNo:"'	AND "                                                   
 | |
|             Query   := "      pr.F_NAME = '":Reactor:"'	AND "                                                       
 | |
|             Query   := "      pl.F_NAME = '":RunNo:"'	AND "                                                       
 | |
|             Query   := "      se.F_FLAG = 0				AND "
 | |
|             Query   := "      td.F_NAME = '":Parameter:"' AND "
 | |
|             Query   := "      dd.F_DSGP  = 1337859646 AND "                            
 | |
|             Query   := "dd.F_NAME IS NOT NULL "
 | |
|             Query   := "AND sd.F_SGRP = "
 | |
|             Query   :=            "(SELECT MIN(sd.F_SGRP) "
 | |
|             Query   :=            "FROM [IRMNSPC].[dbo].[SGRP_EXT] se "
 | |
|             Query   :=            "JOIN [IRMNSPC].[dbo].[PART_LOT] pl on se.F_LOT  = pl.F_LOT "
 | |
|             Query   :=            "JOIN [IRMNSPC].[dbo].[TEST_DAT] td on se.F_TEST = td.F_TEST "
 | |
|             Query   :=            "JOIN [IRMNSPC].[dbo].[PART_DAT] pd on se.F_PART = pd.F_PART "
 | |
|             Query   :=            "JOIN [IRMNSPC].[dbo].[PRCS_DAT] pr on se.F_PRCS = pr.F_PRCS "
 | |
|             Query   :=            "JOIN [IRMNSPC].[dbo].[SGRP_DSC] sd on se.F_SGRP = sd.F_SGRP "
 | |
|             Query   :=            "LEFT JOIN [IRMNSPC].[dbo].[DESC_DAT] dd on sd.F_DESC = dd.F_DESC "
 | |
|             Query   :=            "WHERE pd.F_NAME = '":PartNo:"'	AND "                                                   
 | |
|             Query   :=            "      pr.F_NAME = '":Reactor:"'	AND "                                                       
 | |
|             Query   :=            "      pl.F_NAME = '":RunNo:"'	AND "
 | |
|             Query   :=            "      se.F_FLAG  = 0 AND td.F_NAME = '":Parameter:"' AND "
 | |
|             Query   :=            "      dd.F_DSGP  = 1337859646 and dd.F_NAME IS NOT NULL)"
 | |
|                         
 | |
|             If Query NE '' then Response = SQL_Services('PostSQLRequest', 'IQSDMS1', Query)
 | |
| 
 | |
|             Convert @FM to @VM in Response
 | |
|             Convert @RM to @FM in Response
 | |
|             
 | |
|         end
 | |
|     end
 | |
|     
 | |
| end service
 | |
| 
 | |
| 
 | |
| //----------------------------------------------------------------------------------------------------------------------
 | |
| // GetHallData
 | |
| //
 | |
| //
 | |
| //----------------------------------------------------------------------------------------------------------------------
 | |
| Service GetHallData(RDSNo)
 | |
| 
 | |
|     If RDSNo NE '' then
 | |
|            
 | |
|         ReactRunRec = Database_Services('ReadDataRow', 'REACT_RUN', RDSNo)
 | |
|         If Error_Services('NoError') then 										 
 | |
|             RunNo    = ReactRunRec<REACT_RUN_GAN_RUN_ID$>
 | |
|             Reactor  = 'R':ReactRunRec<REACT_RUN_REACTOR$>
 | |
|             PartNo   = Xlate('REACT_RUN', RDSNo, 'WFR_TRACK_PART', 'X')       
 | |
|             Query    = ''                                                                    
 | |
|             Query    = "SELECT td.F_NAME, se.F_SBNO, se.F_VAL "                                            
 | |
|             Query   := "FROM [IRMNSPC].[dbo].[SGRP_EXT] se "                                                          
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[PART_LOT] pl on se.F_LOT  = pl.F_LOT "                                  
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[TEST_DAT] td on se.F_TEST = td.F_TEST "                                 
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[PART_DAT] pd on se.F_PART = pd.F_PART "                                 
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[PRCS_DAT] pr on se.F_PRCS = pr.F_PRCS "                                 
 | |
|             Query   := "JOIN [IRMNSPC].[dbo].[SGRP_DSC] sd on se.F_SGRP = sd.F_SGRP "                                 
 | |
|             Query   := "LEFT JOIN [IRMNSPC].[dbo].[DESC_DAT] dd on sd.F_DESC = dd.F_DESC "                            
 | |
|             Query   := "WHERE pd.F_NAME = '":PartNo:"'	AND "                                                   
 | |
|             Query   := "      pr.F_NAME = '":Reactor:"'	AND "                                                       
 | |
|             Query   := "      pl.F_NAME = '":RunNo:"'	AND "                                                       
 | |
|             Query   := "      se.F_FLAG = 0				AND "
 | |
|             Query   := "      (td.F_NAME = 'Hall Rs' or td.F_NAME = 'Mobility' or "
 | |
|             Query   := "       td.F_NAME  = 'Sheet Concentration') AND "                       
 | |
|             Query   := "       dd.F_DSGP  = 1337859646 AND dd.F_NAME IS NOT NULL AND "
 | |
|             Query   := "	   sd.F_SGRP = "
 | |
|             Query   := "	  (SELECT MAX(sd.F_SGRP) "
 | |
|             Query   := "	  FROM [IRMNSPC].[dbo].[SGRP_EXT] se "
 | |
|             Query   := "	  JOIN [IRMNSPC].[dbo].[PART_LOT] pl on se.F_LOT        = pl.F_LOT "
 | |
|             Query   := "	  JOIN [IRMNSPC].[dbo].[TEST_DAT] td on se.F_TEST       = td.F_TEST "
 | |
|             Query   := "	  JOIN [IRMNSPC].[dbo].[PART_DAT] pd on se.F_PART       = pd.F_PART "
 | |
|             Query   := "	  JOIN [IRMNSPC].[dbo].[PRCS_DAT] pr on se.F_PRCS       = pr.F_PRCS "
 | |
|             Query   := "	  JOIN [IRMNSPC].[dbo].[SGRP_DSC] sd on se.F_SGRP       = sd.F_SGRP "
 | |
|             Query   := "	  LEFT JOIN [IRMNSPC].[dbo].[DESC_DAT] dd on sd.F_DESC  = dd.F_DESC "
 | |
|             Query   := "      WHERE pd.F_NAME = '":PartNo:"'	AND "                                                   
 | |
|             Query   := "            pr.F_NAME = '":Reactor:"'	AND "                                                       
 | |
|             Query   := "            pl.F_NAME = '":RunNo:"'	    AND "                                                       
 | |
|             Query   := "            se.F_FLAG = 0				AND "
 | |
|             Query   := "	        (td.F_NAME = 'Hall Rs' or td.F_NAME = 'Mobility' or "
 | |
|             Query   := "             td.F_NAME  = 'Sheet Concentration') AND "
 | |
|             Query   := "	         dd.F_DSGP  = 1337859646 and dd.F_NAME IS NOT NULL) "
 | |
|             Query   := "ORDER BY td.F_NAME, se.F_SBNO"
 | |
| 
 | |
|             Response = SQL_Services('PostSQLRequest', 'IQSDMS1', Query)
 | |
|             Convert @FM to @VM in Response
 | |
|             Convert @RM to @FM in Response
 | |
|         end
 | |
|     end
 | |
|     
 | |
| end service
 | |
| 
 | |
| 
 | |
| //----------------------------------------------------------------------------------------------------------------------
 | |
| // UpdateExcelIndexes
 | |
| //
 | |
| //
 | |
| //----------------------------------------------------------------------------------------------------------------------
 | |
| Service UpdateExcelIndexes() 
 | |
| 
 | |
|     StartRow         = 5 ; // All spreadsheets use the first four rows for header information 
 | |
|     SpreadsheetInfo  = Engineering_Services('GetSpreadSheets')
 | |
|     SpreadsheetNames = SpreadsheetInfo<1>
 | |
|     WorksheetNames   = SpreadsheetInfo<2>
 | |
|     SpreadsheetPWs   = SpreadsheetInfo<3>
 | |
|     SpreadsheetDirs  = SpreadsheetInfo<4>
 | |
|     Offsets          = SpreadsheetInfo<5>
 | |
|     hDict            = Database_Services('GetTableHandle', 'DICT.REACT_RUN')
 | |
|     If Error_Services('NoError') then
 | |
|         
 | |
|         For each SpreadSheetName in SpreadsheetNames using @VM setting sPos
 | |
|             
 | |
|             WorksheetName  = WorksheetNames<0, sPos>
 | |
|             SpreadsheetPW  = SpreadsheetPWs<0, sPos>
 | |
|             SpreadSheetDir = SpreadsheetDirs<0, sPos>
 | |
|             Offset         = Offsets<0, sPos>
 | |
|             
 | |
|             DocumentPath    = SpreadsheetDir:SpreadsheetName
 | |
|             DocObj          = Excel_Services('OpenDocument', DocumentPath, SpreadsheetPW)
 | |
|             If Error_Services('NoError') then
 | |
|                 
 | |
|                 // Process Spreadsheet
 | |
|                 MaxValidRow = ''                
 | |
|                 NumExcelRows = Excel_Services('GetNumRows', DocObj, WorksheetName)
 | |
|                 StartRow     = (NumExcelRows - (30 * Offset) )
 | |
|                 If StartRow LT 5 then StartRow = 5
 | |
|                 If Error_Services('NoError') then
 | |
|                     Row         = StartRow
 | |
|                     RunIDRow    = Excel_Services('GetCellValue', DocObj, WorksheetName, 'A', Row)
 | |
|                     ExcelRunID  = RunIDRow[1, 12]       
 | |
|                     RunNo       = ExcelRunID[1, 7]                        
 | |
|                     PrevRunNo   = RunNo
 | |
|                     Row        += 1
 | |
|                     Loop
 | |
|                         RunIDRow   = Excel_Services('GetCellValue', DocObj, WorksheetName, 'A', Row)
 | |
|                         ExcelRunID = RunIDRow[1, 12]
 | |
|                         RunNo      = ExcelRunID[1, 7]
 | |
|                         ValidRunID = ( (ExcelRunID Matches "'69'5N'hvfet'") or (ExcelRunID Matches "'69'5N'mvfet'") or (ExcelRunID Matches "'71'5N'hvfet'") or (ExcelRunID Matches "'71'5N'mvfet'") )
 | |
|                         If ( (ValidRunID EQ True$) and (RunNo NE PrevRunNo) ) then
 | |
|                             MaxValidRow = Row
 | |
|                             GoSub ClearCursors
 | |
|                             Query       = 'GAN_RUN_ID' : @VM : ExcelRunID : @FM
 | |
|                             RDSNo       = ''
 | |
|                             Option      = ''
 | |
|                             Flag        = ''
 | |
|                             Btree.Extract(Query, 'REACT_RUN', hDict, RDSNo, Option, Flag)
 | |
|                             If RDSNo NE '' then
 | |
|                                 ReactRunRec = Database_Services('ReadDataRow', 'REACT_RUN', RDSNo)
 | |
|                                 If Error_Services('NoError') then
 | |
|                                     RRIndex     = ReactRunRec<REACT_RUN_EA_ROW_INDEX$>
 | |
|                                     If RRIndex NE Row then
 | |
|                                         ReactRunRec<REACT_RUN_EA_ROW_INDEX$>      = Row
 | |
|                                         Database_Services('WriteDataRow', 'REACT_RUN', RDSNo, ReactRunRec, True$, False$, True$)
 | |
|                                     end
 | |
|                                 end
 | |
|                             end
 | |
|                         end
 | |
|                         Row       += 1
 | |
|                         PrevRunNo  = RunNo
 | |
|                     Until Row GT NumExcelRows
 | |
|                     Repeat
 | |
|                 end
 | |
|                 // Update APP_INFO table containing max row counters
 | |
|                 NextValidRow = MaxValidRow + Offset
 | |
|                 Database_Services('WriteDataRow', 'APP_INFO', WorksheetName, NextValidRow, True$, False$, True$)                    
 | |
|                 Excel_Services('CloseDocument', DocObj)                   
 | |
|             end else
 | |
|                 ErrMsg = Error_Services('GetMessage')                    
 | |
|             end
 | |
|               
 | |
|         Next SpreadSheetName
 | |
|     end
 | |
|     
 | |
| end service
 | |
| 
 | |
| 
 | |
| //----------------------------------------------------------------------------------------------------------------------
 | |
| // PostEARequest
 | |
| //
 | |
| // Input:
 | |
| //      RDSNo  - [Required]
 | |
| //      Stage  - [Required]
 | |
| //      WfrID  - [Optional]
 | |
| //      ToolID - [Optional]
 | |
| //
 | |
| //----------------------------------------------------------------------------------------------------------------------
 | |
| Service PostEARequest(RDSNo, Stage=STAGES, WfrID, ToolID)
 | |
| 
 | |
|     If ( (RDSNo NE '') and (Stage NE '') ) then
 | |
|         ErrorMessage = ''
 | |
|         LogData      = ''
 | |
|         LogData<1>   = LoggingDTM
 | |
|         LogData<2>   = RDSNo
 | |
|         LogData<3>   = Stage
 | |
|         // Look for a pre-existing request in the queue
 | |
|         hDict        = Database_Services('GetTableHandle', 'DICT.EA_REQUESTS')
 | |
|         If Error_Services('NoError') then
 | |
|             RequestKeyID = ''   
 | |
|             Query        = 'RDS_NO' : @VM : RDSNo : @FM : 'STAGE' : @VM : Stage : @FM
 | |
|             Option       = ''
 | |
|             Flag         = ''
 | |
|             Btree.Extract(Query, 'EA_REQUESTS', hDict, RequestKeyID, Option, Flag)
 | |
|             If RequestKeyID EQ '' then
 | |
|                 // This is a new request
 | |
|                 RequestDate                      = Date()
 | |
|                 RequestTime                      = Time()
 | |
|                 RequestKeyID                     = RDSNo:'*':Stage:'*':RequestDate :'*':RequestTime
 | |
|                 RequestRow                       = ''
 | |
|                 RequestRow<EA_REQUESTS.WFR_ID$>  = WfrID
 | |
|                 RequestRow<EA_REQUESTS.TOOL_ID$> = ToolID
 | |
|                 Database_Services('WriteDataRow', 'EA_REQUESTS', RequestKeyID, RequestRow, False$, False$, False$)
 | |
|                 LogData<4>                       = 'EA request posted'
 | |
|             end else
 | |
|                 LogData<4> = 'Duplicate EA request found, request ignored.'
 | |
|             end
 | |
|             Logging_Services('AppendLog', QueueObjLog, LogData, @RM, @FM)
 | |
|         end
 | |
|     end else
 | |
|         Error_Services('Add', 'Null parameter passed into service call. All parameters are required.')
 | |
|     end
 | |
|     
 | |
| end service
 | |
| 
 | |
| 
 | |
| //----------------------------------------------------------------------------------------------------------------------
 | |
| // ProcessEARequests
 | |
| //
 | |
| //----------------------------------------------------------------------------------------------------------------------
 | |
| Service ProcessEARequests()
 | |
| 
 | |
|     hSysLists   = Database_Services('GetTableHandle', 'SYSLISTS')
 | |
|     Lock hSysLists, ServiceKeyID then
 | |
|         Tablename = 'EA_REQUESTS'
 | |
|         hEARequests = Database_Services('GetTableHandle', Tablename)
 | |
|         If Error_Services('NoError') then
 | |
|             Sentence = 'SELECT ':Tablename:' BY RESPONSE_DATE BY RESPONSE_TIME BY REQUEST_DATE BY REQUEST_TIME'
 | |
|             Set_Status(0)
 | |
|             GoSub ClearCursors
 | |
|             RList(Sentence, TARGET_ACTIVELIST$, '', '', '')
 | |
|             // Just process one request at a time so that this service doesn't tie up an OEngine for too long.
 | |
|             ReadNext RequestKeyID then                      
 | |
|                 Lock hEARequests, RequestKeyID then
 | |
|                     RequestRow = Database_Services('ReadDataRow', 'EA_REQUESTS', RequestKeyID)
 | |
|                     RDSNo      = Field(RequestKeyID, '*', 1)
 | |
|                     Stage      = Field(RequestKeyID, '*', 2)
 | |
| *                    If ( (RDSNo EQ 463119) and (Stage EQ 'GROWTH') ) then debug
 | |
|                     WfrID      = RequestRow<EA_REQUESTS.WFR_ID$>
 | |
|                     ToolID     = RequestRow<EA_REQUESTS.TOOL_ID$>
 | |
|                     RDSClosed  = False$ ; //Xlate('REACT_RUN', RDSNo, REACT_RUN_DISP_COMPLETE$, 'X')
 | |
|                     If RDSClosed EQ True$ then
 | |
|                         // No need to process this request
 | |
|                         // Request was successful, so remove the request from the queue
 | |
|                         Database_Services('DeleteDataRow', 'EA_REQUESTS', RequestKeyID, True$)
 | |
|                         LogData    = ''
 | |
|                         LogData<1> = Oconv(Date(), 'D4/')  : ' ' : Oconv(Time(), 'MTS')
 | |
|                         LogData<2> = RDSNo
 | |
|                         LogData<3> = Stage
 | |
|                         LogData<4> = 'Run closed. Deleting EA request from queue.'
 | |
|                         Logging_Services('AppendLog', QueueObjLog, LogData, @RM, @FM)
 | |
|                     end else
 | |
|                         If Stage EQ 'GROWTH' then
 | |
|                             // Ensure this GROWTH request is the oldest GROWTH request (i.e. ensure the GROWTH requests
 | |
|                             // are processed in order).
 | |
|                             Sentence         = 'SELECT ':Tablename:' WITH STAGE EQ "GROWTH" BY REQUEST_DATE BY REQUEST_TIME'
 | |
|                             Set_Status(0)
 | |
|                             GoSub ClearCursors
 | |
|                             RList(Sentence, TARGET_ACTIVELIST$, '', '', '')
 | |
|                             ReadNext GrowthKeyID then
 | |
|                                 If GrowthKeyID NE RequestKeyID then
 | |
|                                     // This is not the oldest GROWTH request. Push this request to the back of the queue.
 | |
|                                     Error_Services('Add', 'Older GROWTH request found in queue. Pushing this request to back of queue.')
 | |
|                                 end
 | |
|                             end
 | |
|                         end
 | |
|                         If Error_Services('NoError') then
 | |
|                             Engineering_Services('ProcessEARequest', RDSNo, Stage, WfrID, ToolID)
 | |
|                             If Error_Services('NoError') then
 | |
|                                 // Request was successful, so remove the request from the queue
 | |
|                                 Database_Services('DeleteDataRow', 'EA_REQUESTS', RequestKeyID, True$)
 | |
|                                 LogData    = ''
 | |
|                                 LogData<1> = Oconv(Date(), 'D4/')  : ' ' : Oconv(Time(), 'MTS')
 | |
|                                 LogData<2> = RDSNo
 | |
|                                 LogData<3> = Stage
 | |
|                                 LogData<4> = 'Request successfully processed. Deleting EA request from queue.'
 | |
|                                 Logging_Services('AppendLog', QueueObjLog, LogData, @RM, @FM)
 | |
|                             end else
 | |
|                                 ErrorMsg                               = Error_Services('GetMessage')
 | |
|                                 LogData                                = ''
 | |
|                                 LogData<1>                             = Oconv(Date(), 'D4/')  : ' ' : Oconv(Time(), 'MTS')
 | |
|                                 LogData<2>                             = RDSNo
 | |
|                                 LogData<3>                             = Stage
 | |
|                                 LogData<4>                             = 'Request failed to process. Error message: ':ErrorMsg
 | |
|                                 Logging_Services('AppendLog', QueueObjLog, LogData, @RM, @FM)                        
 | |
|                                 // Keep request in the queue (i.e. do not delete it)
 | |
|                                 RequestRow<EA_REQUESTS.RESPONSE_TIME$> = Time()
 | |
|                                 RequestRow<EA_REQUESTS.RESPONSE_DATE$> = Date()
 | |
|                                 RequestRow<EA_REQUESTS.RESPONSE$>      = ErrorMsg
 | |
|                                 Database_Services('WriteDataRow', 'EA_REQUESTS', RequestKeyID, RequestRow, True$, False$, True$)
 | |
|                                 Unlock hEARequests, RequestKeyID else
 | |
|                                     Error_Services('Add', 'Error unlocking ':RequestKeyID:', ':Tablename:' within ':Service)
 | |
|                                 end
 | |
|                             end                            
 | |
|                         end else
 | |
|                             ErrorMsg                               = Error_Services('GetMessage')
 | |
|                             LogData                                = ''
 | |
|                             LogData<1>                             = Oconv(Date(), 'D4/')  : ' ' : Oconv(Time(), 'MTS')
 | |
|                             LogData<2>                             = RDSNo
 | |
|                             LogData<3>                             = Stage
 | |
|                             LogData<4>                             = 'Request failed to process. Error message: ':ErrorMsg
 | |
|                             Logging_Services('AppendLog', QueueObjLog, LogData, @RM, @FM)                        
 | |
|                             // Keep request in the queue (i.e. do not delete it)
 | |
|                             RequestRow<EA_REQUESTS.RESPONSE_TIME$> = Time()
 | |
|                             RequestRow<EA_REQUESTS.RESPONSE_DATE$> = Date()
 | |
|                             RequestRow<EA_REQUESTS.RESPONSE$>      = ErrorMsg
 | |
|                             Database_Services('WriteDataRow', 'EA_REQUESTS', RequestKeyID, RequestRow, True$, False$, True$)
 | |
|                             Unlock hEARequests, RequestKeyID else
 | |
|                                 Error_Services('Add', 'Error unlocking ':RequestKeyID:', ':Tablename:' within ':Service)
 | |
|                             end    
 | |
|                         end                       
 | |
|                     end
 | |
|                 end
 | |
|             end
 | |
|         end else
 | |
|             ErrorMsg = Error_Services('GetMessage')
 | |
|         end
 | |
|         Unlock hSysLists, ServiceKeyID else Null    
 | |
|     end
 | |
|     
 | |
| end service
 | |
| 
 | |
| 
 | |
| //----------------------------------------------------------------------------------------------------------------------
 | |
| // ProcessEARequest
 | |
| //
 | |
| // Input:
 | |
| //      RDSNo  - [Required]
 | |
| //      Stage  - [Required]
 | |
| //      WfrID  - [Optional]
 | |
| //      ToolID - [Optional]
 | |
| //
 | |
| //----------------------------------------------------------------------------------------------------------------------
 | |
| Service ProcessEARequest(RDSNo, Stage, WfrID, ToolID)
 | |
|     
 | |
|     If ( (RDSNo NE '') and (Stage NE '') ) then
 | |
|                 
 | |
|             Begin Case
 | |
|                 Case Stage EQ 'CHAR'
 | |
|                     Engineering_Services('PostCHARData', RDSNo)
 | |
|                     
 | |
|                 Case Stage EQ 'GROWTH'                   
 | |
|                     Engineering_Services('PostGrowthData', RDSNo)
 | |
|                     
 | |
|                 Case ( (Stage EQ 'UV') or (Stage EQ 'UV_PRE') or (Stage EQ 'UV_PST') )
 | |
|                     Engineering_Services('PostUVData', RDSNo)
 | |
|                     
 | |
|                 Case Stage EQ 'WARP'
 | |
|                     Engineering_Services('PostWARPData', RDSNo)
 | |
| 
 | |
|                 Case ( (Stage EQ 'CAN') or (Stage EQ 'CAN_PRE') or (Stage EQ 'CAN_PST') )
 | |
|                     Engineering_Services('PostCANData', RDSNo) 
 | |
|                     
 | |
|                 Case Stage EQ 'XRD'
 | |
|                     Engineering_Services('PostXRDData', RDSNo)
 | |
|                     
 | |
|                 Case Stage EQ 'AFM'                   
 | |
|                     Engineering_Services('PostAFMData', RDSNo)
 | |
|                     
 | |
|                 Case Stage EQ 'RPM'
 | |
|                     Engineering_Services('PostRPMData', RDSNo)
 | |
|                     
 | |
|                 Case Stage EQ 'PR'
 | |
|                     Engineering_Services('PostPRData', RDSNo)
 | |
|                     
 | |
|                 Case Stage EQ 'BV'
 | |
|                     Engineering_Services('PostBVData', RDSNo)
 | |
|                     
 | |
|                 Case ( (Stage EQ 'HALL') or (Stage EQ 'RTA_HALL') or (Stage EQ 'HALL_PGAN') )
 | |
|                     Engineering_Services('PostHALLData', RDSNo)
 | |
|     
 | |
|             End Case
 | |
| 
 | |
|     end else
 | |
|         Error_Services('Add', 'Null RDSNo passed into service ':Service:'.')
 | |
|     end
 | |
| 
 | |
| end service
 | |
| 
 | |
| 
 | |
| //----------------------------------------------------------------------------------------------------------------------
 | |
| // ClearEARequests
 | |
| //
 | |
| // Input:
 | |
| //      RDSNo  - [Required]
 | |
| //
 | |
| //----------------------------------------------------------------------------------------------------------------------
 | |
| Service ClearEARequests(RDSNo)
 | |
| 
 | |
|     If RDSNo NE ''then
 | |
|         LogData    = ''
 | |
|         LogData<1> = LoggingDTM
 | |
|         LogData<2> = RDSNo
 | |
|         // Look for a pre-existing request in the queue
 | |
|         hDict      = Database_Services('GetTableHandle', 'DICT.EA_REQUESTS')
 | |
|         If Error_Services('NoError') then
 | |
|             RequestKeyIDs = ''   
 | |
|             Query         = 'RDS_NO' : @VM : RDSNo : @FM
 | |
|             Option        = ''
 | |
|             Flag          = ''
 | |
|             Btree.Extract(Query, 'EA_REQUESTS', hDict, RequestKeyIDs, Option, Flag)
 | |
|             If RequestKeyIDs NE '' then
 | |
|                 LogKeys    = RequestKeyIDs
 | |
|                 Swap @VM with ',' in LogKeys
 | |
|                 LogData<3> = 'Removing the following requests from the queue: ':LogKeys
 | |
|                 For each RequestKeyID in RequestKeyIDs using @VM setting vPos
 | |
|                     Database_Services('DeleteDataRow', 'EA_REQUESTS', RequestKeyID)                   
 | |
|                 Next RequestKeyID
 | |
|             end           
 | |
|             Logging_Services('AppendLog', QueueObjLog, LogData, @RM, @FM)
 | |
|         end
 | |
|     end else
 | |
|         Error_Services('Add', 'Null parameter passed into service call. All parameters are required.')
 | |
|     end
 | |
|     
 | |
| end service
 | |
| 
 | |
| 
 | |
| Service UpdateAll(RDSNo)
 | |
| 
 | |
|     ReactRunRec = Database_Services('ReadDataRow', 'REACT_RUN', RDSNo)
 | |
|     WfrIDs      = ReactRunRec<REACT_RUN_IN_WFR_ID$>
 | |
|     WfrStages   = ReactRunRec<REACT_RUN_WFR_STAGE$>
 | |
|     EAStages    = 'UV,UV_PRE,WARP,CAN,CAN_PRE,UV_PST,CAN_PST,HALL,XRD,AFM,RPM,PR,BV'
 | |
|     // All runs must complete the GROWTH stage so simply submit a request for that stage.
 | |
|     Engineering_Services('PostEARequest', RDSNo, 'GROWTH')
 | |
|     // The remaining stages may or may not be completed, so ensure at least one wafer has completed
 | |
|     // the stage before submitting a request.
 | |
|     For each Stage in EAStages using ','
 | |
|         StageComp = False$
 | |
|         Locate Stage in WfrStages using @VM setting vPos then           
 | |
|             For each WfrID in WfrIDs using @VM
 | |
|                 FormattedWfrID = WfrID
 | |
|                 Swap '*' with '.' in FormattedWfrID
 | |
|                 RunStageWfrID  = RDSNo:'*':Stage:'*':FormattedWfrID
 | |
|                 StageStatus    = Xlate('RUN_STAGE_WFR', RunStageWfrID, 'STATUS', 'X')
 | |
|                 StageComp      = (StageStatus EQ 'COMP')
 | |
|             Until StageComp EQ True$
 | |
|             Next WfrID
 | |
|         end
 | |
|         If StageComp EQ True$ then Engineering_Services('PostEARequest', RDSNo, Stage)
 | |
|     Next Stage
 | |
|     
 | |
| end service
 | |
| 
 | |
| 
 | |
| Service GetQueueReport(Stage)
 | |
|        
 | |
|     Sentence   = 'SELECT EA_REQUESTS WITH STAGE EQ "':Stage:'"'
 | |
|     Set_Status(0)
 | |
|     GoSub ClearCursors
 | |
|     RList(Sentence, TARGET_ACTIVELIST$, '', '', '')
 | |
|     EOF        = False$
 | |
|     ReportPath = Environment_Services('GetReportsRootPath')
 | |
|     Filename   = @User4:' - ':Stage:' - Queue Report.csv'
 | |
|     SavePath   = ReportPath:'\':Filename
 | |
|     ReportText = ''
 | |
|     LineNo     = 0
 | |
|     Loop
 | |
|         ReadNext RequestKeyID else EOF = True$
 | |
|         If RequestKeyID NE '' then
 | |
|             LineNo                += 1
 | |
|             RDSNo                  = Field(RequestKeyID, '*', 1)
 | |
|             GaNRunID               = Xlate('REACT_RUN', RDSNo, 'GAN_RUN_ID', 'X')
 | |
|             ReportText<LineNo, 1>  = GaNRunID
 | |
|             ReportText<LineNo, 2>  = RDSNo
 | |
|         end
 | |
|     Until EOF EQ True$
 | |
|     Repeat
 | |
|     Swap @VM with ',' in ReportText
 | |
|     Swap @FM with CRLF$ in ReportText
 | |
|     OSWrite ReportText to SavePath
 | |
|     
 | |
| end service
 | |
| 
 | |
| 
 | |
| ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 | |
| // Internal GoSubs
 | |
| ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 | |
| 
 | |
| ClearCursors:
 | |
|     For counter = 0 to 8
 | |
|         ClearSelect counter
 | |
|     Next counter
 | |
| return
 | |
| 
 |