open-insight/LSL2/STPROC/ENGINEERING_SERVICES.txt
Infineon\StieberD 7762b129af pre cutover push
2024-09-04 20:33:41 -07:00

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