open-insight/LSL2/STPROC/DEVELOPMENT_SERVICES.txt

660 lines
29 KiB
Plaintext

Compile function Development_Services(@Service, @Params)
#pragma precomp SRP_PreCompiler
$INSERT SERVICE_SETUP
$INSERT POPUP_EQUATES
$INSERT LOGICAL
$INSERT MSG_EQUATES
$INSERT APPCOLORS
$INSERT WM_IN_EQUATES
$INSERT WM_OUT_EQUATES
$INSERT WO_LOG_EQU
$INSERT WO_STEP_EQU
$INSERT WO_MAT_EQUATES
$INSERT ORDER_EQU
$INSERT RDS_EQUATES
$INSERT PROD_SPEC_EQU
$INSERT NOTIFICATION_EQU
$INSERT LSL_USERS_EQU
$INSERT SECURITY_RIGHTS_EQU
$INSERT RTI_LH_INFO_EQUATES
$INSERT WO_MAT_QA_EQUATES
$INSERT CUST_EPI_PART_EQUATES
$INSERT PRS_STAGE_EQUATES
$INSERT RLIST_EQUATES
$INSERT CLEAN_INSP_EQUATES
$INSERT TOOL_PARMS_EQUATES
$INSERT SERVICES_EQUATES
EQU COL$QA_MET_PHASE_MIN TO 17
Equ Tab$ to \09\
Equ CRLF$ to \0D0A\
Equ LF$ to \0A\
Equ Comma$ to ','
Declare subroutine Set_Property, Set_Status, ErrMsg, Set_Property, obj_AppWindow, Send_Message, Logging_Services
Declare subroutine Btree.Extract, Send_Event, Security_Err_Msg, Forward_Event, End_Window, Start_Window
Declare subroutine EditCell, obj_NCR, obj_Notes, Post_Event, obj_WO_Mat, obj_WO_Mat_Log, obj_WO_Wfr, obj_Tables, obj_RDS
Declare subroutine Error_Services, RDS_Services, Dialog_Box, Insert, Unlock, QA_Services, Validate, Development_Services
Declare subroutine Update_Index, Database_Services, Messaging_Services
Declare function Get_Property, Get_Status, Popup, Send_Message, Msg, Security_Check, Dialog_Box, RowExists, Utility
Declare function Dialog_Box, obj_WO_Log, obj_NCR, Check_Notes, obj_MUWafers, obj_WO_Mat, Error_Services, RDS_Services
Declare function MemberOf, obj_Tables, obj_RDS, Environment_Services, Logging_Services, Material_Services, ErrMsg
Declare function Work_Order_Services, RetStack, Min, Max, Obj_Prod_Spec, Insert, SRP_Trim, Xlate, Obj_Wo_Mat
Declare function Security_Services, QA_Services, Database_Services, RowExists, Rti_Lh_Info, UNICODE_ANSI, UNICODE_UTF8
Declare function index, Httpclient_Services, SRP_Encode, SRP_Decode, DirList, Obj_Rds_Test, Tool_Parms_Services
Declare function SQL_Services, RDS_Services, Obj_WM_out, Schedule_Services, Obj_Tool, SRP_Sort_Array
Declare function Development_Services
GoToService
Return Response or ""
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Service Parameter Options
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Options PROJECTS = 'HGCV'
//-----------------------------------------------------------------------------
// SERVICES
//-----------------------------------------------------------------------------
Service UpdateProdCI()
* ConvRecipes = '6IN_PTYPE ROTR,6IN_THIN ROTR,6IN_THICK ROTR,8IN_THIN ROTR,8IN_THICK ROTR,IFX_ROTR,8IN_IFX_ROTR,' |
* : 'EPISIL,GEN5_ROTR,AS_IFX_ROTR'
* FailRecipes = '6IN100_ROTR,6IN100_ROTR,6IN100_ROTR,8IN100_ROTR,8IN100_ROTR,IFX100_ROTR,IFX100_ROTR,EPISIL_100,' |
* : 'GEN5_100ROTR,AS_IFX100_ROTR'
ConvRecipes = '6IN_PTYPE ROTR'
FailRecipes = '6IN_PTYPE_100'
RemoveRecipes = '6IN100_ROTR'
Query = "SELECT WO_MAT WITH CURR_STATUS EQ 'REL' OR WITH CURR_STATUS EQ 'VER' OR WITH CURR_STATUS EQ 'UNLOAD' " |
: "OR WITH CURR_STATUS EQ 'LOAD' OR WITH CURR_STATUS EQ 'NCR' OR WITH CURR_STATUS EQ 'LWIS' OR WITH " |
: "CURR_STATUS EQ 'LWII' OR WITH CURR_STATUS EQ 'RX' OR WITH CURR_STATUS EQ 'HOLD'"
GoSub ClearCursors
Rlist(Query, Target_ActiveList$, '', '', '')
If @RecCount GT 0 then
Open 'CLEAN_INSP' to hCI then
EOF = False$
Loop
ReadNext KeyID else EOF = True$
RDSNo = Xlate('WO_MAT', KeyID, 'RDS_NO', 'X')
If RDSNo GT 200000 and RDSNo LT 900000 then
CINo = Xlate('RDS', RDSNo, 'LWI_CI_NO', 'X')
If RowExists('CLEAN_INSP', CINo) then
Read CIRec from hCI, CINo then
CIRecipes = CIRec<CLEAN_INSP_SPEC_SURFSCAN_RECIPE$>
CIHaze = CIRec<CLEAN_INSP_SPEC_SURF_HAZE$>
CIDefects = CIRec<CLEAN_INSP_SPEC_SURF_DEFECTS$>
For each Recipe in ConvRecipes using ',' setting Pos
Locate Recipe in CIRecipes using @VM setting vPos then
Locate Recipe in ConvRecipes using ',' setting rPos then
FailRecipe = Field(FailRecipes, ',', rPos, 1)
RemoveRecipe = Field(RemoveRecipes, ',', rPos, 1)
Locate FailRecipe in CIRecipes using @VM setting fPos then
CIHaze<0, fPos> = CIHaze<0, vPos>
CIDefects<0, fPos> = CIDefects<0, vPos>
end else
CIRecipes<0, -1> = FailRecipe
CIHaze<0, -1> = CIHaze<0, vPos>
CIDefects<0, -1> = CIDefects<0, vPos>
end
Locate RemoveRecipe in CIRecipes using @VM setting RemPos then
CIRecipes = Delete(CIRecipes, 0, RemPos, 0)
CIHaze = Delete(CIHaze, 0, RemPos, 0)
CIDefects = Delete(CIDefects, 0, RemPos, 0)
end
end
end
Next Recipe
CIRec<CLEAN_INSP_SPEC_SURFSCAN_RECIPE$> = CIRecipes
CIRec<CLEAN_INSP_SPEC_SURF_HAZE$> = CIHaze
CIRec<CLEAN_INSP_SPEC_SURF_DEFECTS$> = CIDefects
Write CIRec on hCI, CINo else
ErrMsg('Error updating CLEAN_INSP record ':CINo)
end
end else
ErrMsg('Error reading CLEAN_INSP record ':CINo)
end
end
end
Until EOF
Repeat
end
end
end service
Service UpdateROTRPSNs()
* ConvRecipes = '6IN_PTYPE ROTR,6IN_THIN ROTR,6IN_THICK ROTR,8IN_THIN ROTR,8IN_THICK ROTR,IFX_ROTR,8IN_IFX_ROTR,' |
* : 'EPISIL,GEN5_ROTR,AS_IFX_ROTR'
* FailRecipes = '6IN100_ROTR,6IN100_ROTR,6IN100_ROTR,8IN100_ROTR,8IN100_ROTR,IFX100_ROTR,IFX100_ROTR,EPISIL_100,' |
* : 'GEN5_100ROTR,AS_IFX100_ROTR'
ConvRecipes = '6IN_PTYPE ROTR'
FailRecipes = '6IN_PTYPE_100'
RemoveRecipes = '6IN100_ROTR'
Pos = ''
Query = 'SELECT PRS_STAGE WITH STAGE EQ "LWI" AND WITH SURFSCAN_RECIPE CONTAINING '
For each Recipe in ConvRecipes using ',' setting Pos
If Pos GT 1 then
Query := ' OR WITH STAGE EQ "LWI" AND WITH SURFSCAN_RECIPE CONTAINING ':Quote(Recipe)
end else
Query := Quote(Recipe)
end
Next Recipe
GoSub ClearCursors
Rlist(Query, Target_ActiveList$, '', '', '')
If @RecCount GT 0 then
Open 'PRS_STAGE' to hPRS then
EOF = False$
Loop
ReadNext KeyID else EOF = True$
Read PRSRec from hPRS, KeyID then
PRSRecipes = PRSRec<PRS_STAGE_SURFSCAN_RECIPE$>
PRSHaze = PRSRec<PRS_STAGE_SURF_HAZE$>
PRSDefects = PRSRec<PRS_STAGE_SURF_DEFECTS$>
PRSSample = PRSRec<PRS_STAGE_SS_SAMP_QTY$>
SampleSize = 25
For each Recipe in ConvRecipes using ',' setting Pos
Locate Recipe in PRSRecipes using @VM setting vPos then
Locate Recipe in ConvRecipes using ',' setting rPos then
FailRecipe = Field(FailRecipes, ',', rPos, 1)
RemoveRecipe = Field(RemoveRecipes, ',', rPos, 1)
Locate FailRecipe in PRSRecipes using @VM setting fPos then
PRSHaze<0, fPos> = PRSHaze<0, vPos>
PRSDefects<0, fPos> = PRSDefects<0, vPos>
PRSSample<0, fPos> = SampleSize
end else
PRSRecipes<0, -1> = FailRecipe
PRSHaze<0, -1> = PRSHaze<0, vPos>
PRSDefects<0, -1> = PRSDefects<0, vPos>
PRSSample<0, -1> = SampleSize
end
Locate RemoveRecipe in PRSRecipes using @VM setting RemPos then
PRSRecipes = Delete(PRSRecipes, 0, RemPos, 0)
PRSHaze = Delete(PRSHaze, 0, RemPos, 0)
PRSDefects = Delete(PRSDefects, 0, RemPos, 0)
PRSSample = Delete(PRSSample, 0, RemPos, 0)
end
end
end
Next Recipe
PRSRec<PRS_STAGE_SURFSCAN_RECIPE$> = PRSRecipes
PRSRec<PRS_STAGE_SURF_HAZE$> = PRSHaze
PRSRec<PRS_STAGE_SURF_DEFECTS$> = PRSDefects
PRSRec<PRS_STAGE_SS_SAMP_QTY$> = PRSSample
Write PRSRec on hPRS, KeyID else
ErrMsg('Error updating PRS_STAGE SurfScan recipes for record ':KeyID)
end
end else
ErrMsg('Error reading PRS_STAGE SurfScan recipes for record ':KeyID)
end
Until EOF
Repeat
end
end
end service
Service GetProjectStatus(ProjectName=PROJECTS)
// Initialize ProjectStatus to false to be safe.
ProjectStatus = False$
ProjectStatus = Xlate('DEVELOPMENT', ProjectName, 'STATUS', 'X')
Response = ProjectStatus
end service
Service DeployProject(ProjectName=PROJECTS)
ServiceName = 'Deploy':ProjectName
Development_Services(ServiceName)
Database_Services('ActivateRecord', 'DEVELOPMENT', ProjectName)
{STATUS} = True$
{START_DTM} = Date():'.':Time()
{END_DTM} = ''
Database_Services('WriteDataRow', 'DEVELOPMENT', ProjectName, @Record)
end service
Service RollbackProject(ProjectName=PROJECTS)
ServiceName = 'Rollback':ProjectName
Development_Services(ServiceName)
Database_Services('ActivateRecord', 'DEVELOPMENT', ProjectName)
{STATUS} = False$
{END_DTM} = Date():'.':Time()
Database_Services('WriteDataRow', 'DEVELOPMENT', ProjectName, @Record)
end service
Service DeployHGCV()
! Get list of work orders in production today.
SchedEvents = Schedule_Services('GetScheduleEvents', (date() - 7), (date() + 7))
WOList = ''
For each Row in SchedEvents using @FM
ThisWO = Field(Row<1,2>, '*', 1)
Locate ThisWO in WOList using @VM setting vPos else
If ThisWO NE '' then WOList<1,-1> = ThisWO
end
Next Row
! Get list of WO_MAT_QA records in production today.
Table = 'WO_MAT_QA'
Open 'DICT.':Table to @DICT then
Query = 'WO_NO':@VM:WOList:@FM
KeyList = ''
Option = ''
Flag = ''
Btree.Extract(Query, Table, @DICT, KeyList, Option, Flag)
end
Database_Services('WriteDataRow', 'SYSLISTS', 'HGCV_UAT', KeyList, True$, False$, True$)
! Update UNLOAD PSNs with the new PROD naming convention introduced in the HgCV Project
! We have to use a traditional select here because the PRS_STAGE_KEY column does not have a Btree index on it
Cursor = ''
EOF = False$
Query = "SELECT PROD_SPEC WITH PRS_STAGE_KEY CONTAINING 'UNLOAD' AND WITH STATUS EQ 'A'"
GoSub ClearCursors
Rlist(Query, Target_ActiveList$, '', '', '')
Loop
While EOF EQ False$
ReadNext PSN else EOF = True$
If PSN NE '' then
PRSStageKey = PSN:'*UNLOAD'
If RowExists('PRS_STAGE', PRSStageKey) then
PRSStageRec = Database_Services('ReadDataRow', 'PRS_STAGE', PRSStageKey)
MetTests = PRSStageRec<PRS_STAGE_MET_TEST$>
ThickRecipeFound = False$
RHORecipeFound = False$
Locate 'THICK_ONLY' in MetTests using @VM setting vPos then
MetRecipes = PRSStageRec<PRS_STAGE_MET_RECIPE$>
ThickOnlyRecipe = MetRecipes<0, vPos>
ThickOnlyRecipe = Trim(ThickOnlyRecipe)
ThickRecipeFound = True$
NewProdRecipe = ''
Begin Case
Case ThickOnlyRecipe EQ 'thin6inch'
NewProdRecipe = 'PROD_thin6'
Case ThickOnlyRecipe EQ '8inch'
NewProdRecipe = 'PROD_8inch'
Case ThickOnlyRecipe EQ 'thin8inch'
NewProdRecipe = 'PROD_thin8'
Case ThickOnlyRecipe EQ 'IRC6in_6mm'
NewProdRecipe = 'PROD_IRC6'
Case ThickOnlyRecipe EQ 'Wacker'
NewProdRecipe = 'PROD_Wack'
Case ThickOnlyRecipe EQ '8IN_INF'
NewProdRecipe = 'PROD_INF'
Case ThickOnlyRecipe EQ '6inTHICK'
NewProdRecipe = 'PROD_IRC6'
Case ThickOnlyRecipe = 'EP_8IN9PT'
NewProdRecipe = 'PROD_8inch'
Case Otherwise$
// Unexpected THICK_ONLY recipe name -> proceed to next PSN
ThickRecipeFound = False$
End Case
end
Locate 'LW_RHO' in MetTests using @VM setting vPos then
MetRecipes = PRSStageRec<PRS_STAGE_MET_RECIPE_PATTERN$>
LWRHORecipe = MetRecipes<0, vPos>
LWRHORecipe = Trim(LWRHORecipe)
RHORecipeFound = True$
NewProdRecipe = ''
Begin Case
Case LWRHORecipe EQ 'IRC6mm'
NewProdRecipe = 'PROD_IRC6mm'
Case LWRHORecipe EQ '10PT_5mm'
NewProdRecipe = 'PROD_10PT_5mm'
Case Otherwise$
// Unexpected LW_RHO recipe name -> proceed to next PSN
RHORecipeFound = False$
End Case
end
If (ThickRecipeFound EQ True$) then
MetRecipes<0, vPos> = NewProdRecipe
PRSStageRec<PRS_STAGE_MET_RECIPE$> = MetRecipes
Database_Services('WriteDataRow', 'PRS_STAGE', PRSStageKey, PRSStageRec)
end
If (RHORecipeFound EQ True$) then
MetRecipes<0, vPos> = NewProdRecipe
PRSStageRec<PRS_STAGE_MET_RECIPE_PATTERN$> = MetRecipes
Database_Services('WriteDataRow', 'PRS_STAGE', PRSStageKey, PRSStageRec, True$, False$, True$)
end
end
end
Repeat
! Update all WO_MAT_QA records currently in production.
HgCVList = Database_Services('ReadDataRow', 'SYSLISTS', 'HGCV_UAT')
For each WoMatQAKey in HgCVList using @VM
Database_Services('ActivateRecord', 'WO_MAT_QA', WoMatQAKey)
Profiles = {PROFILE}
ThickRecipeFound = False$
RHORecipeFound = False$
Locate '1THICK_ONLY' in Profiles using @VM setting vPos then
ThickPos = vPos
MetRecipes = {RECIPE}
ThickOnlyRecipe = MetRecipes<0, vPos>
ThickOnlyRecipe = Trim(ThickOnlyRecipe)
ThickRecipeFound = True$
NewProdRecipe = ''
Begin Case
Case ThickOnlyRecipe EQ 'thin6inch'
NewProdRecipe = 'PROD_thin6'
Case ThickOnlyRecipe EQ '8inch'
NewProdRecipe = 'PROD_8inch'
Case ThickOnlyRecipe EQ 'thin8inch'
NewProdRecipe = 'PROD_thin8'
Case ThickOnlyRecipe EQ 'IRC6in_6mm'
NewProdRecipe = 'PROD_IRC6'
Case ThickOnlyRecipe EQ 'Wacker'
NewProdRecipe = 'PROD_Wack'
Case ThickOnlyRecipe EQ '8IN_INF'
NewProdRecipe = 'PROD_INF'
Case ThickOnlyRecipe EQ '6inTHICK'
NewProdRecipe = 'PROD_IRC6'
Case ThickOnlyRecipe = 'EP_8IN9PT'
NewProdRecipe = 'PROD_8inch'
Case Otherwise$
// Unexpected THICK_ONLY recipe name -> proceed to next PSN
ThickRecipeFound = False$
End Case
end
Locate '1LW_RHO' in Profiles using @VM setting vPos then
RHOPos = vPos
MetRecipes = {RECIPE_PATTERN}
LWRHORecipe = MetRecipes<0, vPos>
LWRHORecipe = Trim(LWRHORecipe)
RHORecipeFound = True$
NewProdRecipe = ''
Begin Case
Case LWRHORecipe EQ 'IRC6mm'
NewProdRecipe = 'PROD_IRC6mm'
Case LWRHORecipe EQ '10PT_5mm'
NewProdRecipe = 'PROD_10PT_5mm'
Case Otherwise$
// Unexpected 1LW_RHO pattern name -> proceed to next PSN
RHORecipeFound = False$
End Case
end
If (ThickRecipeFound EQ True$) then
MetRecipes<0, ThickPos> = NewProdRecipe
{RECIPE} = MetRecipes
Database_Services('WriteDataRow', 'WO_MAT_QA', WoMatQAKey, @Record, True$, False$, True$)
end
If (RHORecipeFound EQ True$) then
MetRecipes<0, RHOPos> = NewProdRecipe
{RECIPE_PATTERN} = MetRecipes
Database_Services('WriteDataRow', 'WO_MAT_QA', WoMatQAKey, @Record, True$, False$, True$)
end
Next WoMatQAKey
End Service
Service RollbackHGCV()
! Get list of work orders in production today.
SchedEvents = Schedule_Services('GetScheduleEvents', date(), date())
WOList = ''
For each Row in SchedEvents using @FM
ThisWO = Field(Row<1,2>, '*', 1)
Locate ThisWO in WOList using @VM setting vPos else
WOList<1,-1> = ThisWO
end
Next Row
! Get list of WO_MAT_QA records in production today.
Table = 'WO_MAT_QA'
Open 'DICT.':Table to @DICT then
Query = 'WO_NO':@VM:WOList:@FM
KeyList = ''
Option = ''
Flag = ''
Btree.Extract(Query, Table, @DICT, KeyList, Option, Flag)
end
Database_Services('WriteDataRow', 'SYSLISTS', 'HGCV_UAT', KeyList, True$, False$, True$)
! Rollback UNLOAD PSNs to their original naming convention (i.e. without 'PROD_')
! We have to use a traditional select here because the PRS_STAGE_KEY column does not have a Btree index on it
Cursor = ''
EOF = False$
Query = "SELECT PROD_SPEC WITH PRS_STAGE_KEY CONTAINING 'UNLOAD' AND WITH STATUS EQ 'A'"
GoSub ClearCursors
Rlist(Query, Target_ActiveList$, '', '', '')
Loop
While EOF EQ False$
ReadNext PSN else EOF = True$
If PSN NE '' then
PRSStageKey = PSN:'*UNLOAD'
If RowExists('PRS_STAGE', PRSStageKey) then
PRSStageRec = Database_Services('ReadDataRow', 'PRS_STAGE', PRSStageKey)
MetTests = PRSStageRec<PRS_STAGE_MET_TEST$>
ThickRecipeFound = False$
RHORecipeFound = False$
Locate 'THICK_ONLY' in MetTests using @VM setting vPos then
MetRecipes = PRSStageRec<PRS_STAGE_MET_RECIPE$>
ThickOnlyRecipe = MetRecipes<0, vPos>
ThickOnlyRecipe = Trim(ThickOnlyRecipe)
ThickRecipeFound = True$
NewProdRecipe = ''
Begin Case
Case ThickOnlyRecipe EQ 'PROD_thin6'
NewProdRecipe = 'thin6inch'
Case ThickOnlyRecipe EQ 'PROD_8inch'
NewProdRecipe = '8inch'
Case ThickOnlyRecipe EQ 'PROD_thin8'
NewProdRecipe = 'thin8inch'
Case ThickOnlyRecipe EQ 'PROD_IRC6'
NewProdRecipe = 'IRC6in_6mm'
Case ThickOnlyRecipe EQ 'PROD_Wack'
NewProdRecipe = 'Wacker'
Case ThickOnlyRecipe EQ 'PROD_INF'
NewProdRecipe = '8IN_INF'
Case Otherwise$
// Unexpected THICK_ONLY recipe name -> proceed to next PSN
ThickRecipeFound = False$
End Case
end
* Locate 'LW_RHO' in MetTests using @VM setting vPos then
* MetRecipes = PRSStageRec<PRS_STAGE_MET_RECIPE$>
* LWRHORecipe = MetRecipes<0, vPos>
* LWRHORecipe = Trim(LWRHORecipe)
* RHORecipeFound = True$
* NewProdRecipe = ''
* Begin Case
* Case LWRHORecipe EQ 'PROD_IRC6mm'
* NewProdRecipe = 'IRC6mm'
* Case Otherwise$
* // Unexpected LW_RHO recipe name -> proceed to next PSN
* RHORecipeFound = False$
* End Case
* end
If (ThickRecipeFound EQ True$) then
// or (RHORecipeFound EQ True$) then
MetRecipes<0, vPos> = NewProdRecipe
PRSStageRec<PRS_STAGE_MET_RECIPE$> = MetRecipes
Database_Services('WriteDataRow', 'PRS_STAGE', PRSStageKey, PRSStageRec)
end
end
end
Repeat
! Revert all WO_MAT_QA records currently in production.
HgCVList = Database_Services('ReadDataRow', 'SYSLISTS', 'HGCV_UAT')
For each WoMatQAKey in HgCVList using @VM
Database_Services('ActivateRecord', 'WO_MAT_QA', WoMatQAKey)
Profiles = {PROFILE}
ThickRecipeFound = False$
RHORecipeFound = False$
Locate '1THICK_ONLY' in Profiles using @VM setting vPos then
MetRecipes = {RECIPE}
ThickOnlyRecipe = MetRecipes<0, vPos>
ThickOnlyRecipe = Trim(ThickOnlyRecipe)
ThickRecipeFound = True$
NewProdRecipe = ''
Begin Case
Case ThickOnlyRecipe EQ 'PROD_thin6'
NewProdRecipe = 'thin6inch'
Case ThickOnlyRecipe EQ 'PROD_8inch'
NewProdRecipe = '8inch'
Case ThickOnlyRecipe EQ 'PROD_thin8'
NewProdRecipe = 'thin8inch'
Case ThickOnlyRecipe EQ 'PROD_IRC6'
NewProdRecipe = 'IRC6in_6mm'
Case ThickOnlyRecipe EQ 'PROD_Wack'
NewProdRecipe = 'Wacker'
Case ThickOnlyRecipe EQ 'PROD_INF'
NewProdRecipe = '8IN_INF'
Case Otherwise$
// Unexpected THICK_ONLY recipe name -> proceed to next PSN
ThickRecipeFound = False$
End Case
end
* Locate '1LW_RHO' in Profiles using @VM setting vPos then
* MetRecipes = {RECIPE}
* LWRHORecipe = MetRecipes<0, vPos>
* LWRHORecipe = Trim(LWRHORecipe)
* RHORecipeFound = True$
* NewProdRecipe = ''
* Begin Case
* Case LWRHORecipe EQ 'PROD_IRC6mm'
* NewProdRecipe = 'IRC6mm'
* Case Otherwise$
* // Unexpected 1LW_RHO recipe name -> proceed to next PSN
* RHORecipeFound = False$
* End Case
* end
If (ThickRecipeFound EQ True$) then
//or (RHORecipeFound EQ True$) then
MetRecipes<0, vPos> = NewProdRecipe
{RECIPE} = MetRecipes
Database_Services('WriteDataRow', 'WO_MAT_QA', WoMatQAKey, @Record, True$, False$, True$)
end
Next WoMatQAKey
End Service
//----------------------------------------------------------------------------------------------------------------------
// SetupDevServices
//
// This service can be used to setup the development servers services after a restore from production.
// Only the bare necesseties are turned on to prevent individual development instances from potentially stepping
// on each other (e.g. SHARED_TEST and JONATHAN_O instance trying to import a metrology file simultaneously).
//----------------------------------------------------------------------------------------------------------------------
Service SetupDevServices()
DevAppServices = ''
DevDBServices = 'Update Material Logs':@VM:'Log Transaction Postings':@VM:'Process Wafer Image Queue':@VM
DevDBServices := 'Process UCL Requests':@VM:'Process ROTR Requests':@VM:'Process Wafer Image Requests':@VM
DevDBServices := 'Process SQL Requests':@VM:'Send Notes':@VM:'Update Notification Groups':@VM
DevDBServices := 'Update Security Groups':@VM:'Auto Scheduler'
Query = "SELECT SERVICES"
GoSub ClearCursors
Rlist(Query, Target_ActiveList$, '', '', '')
If @RecCount GT 0 then
Open 'SERVICES' to hServices then
EOF = False$
Loop
ReadNext ServiceName else EOF = True$
ServiceRec = Database_Services('ReadDataRow', 'SERVICES', ServiceName)
Server = ServiceRec<SERVICES.SERVER$>
Begin Case
Case ( (Server _EQC 'MESSA005') or (Server _EQC 'MESSA012') )
// App Servers
Locate ServiceName in DevAppServices using @VM setting vPos then
ServiceRec<SERVICES.SERVER$> = 'MESSA012'
ServiceRec<SERVICES.ACTIVE$> = True$
end else
ServiceRec<SERVICES.SERVER$> = 'MESSA012'
ServiceRec<SERVICES.ACTIVE$> = False$
end
Case ( (Server _EQC 'MESSA01EC') or (Server _EQC 'MESTSA01EC') )
// DB Servers
Locate ServiceName in DevDBServices using @VM setting vPos then
ServiceRec<SERVICES.SERVER$> = 'MESTSA01EC'
ServiceRec<SERVICES.ACTIVE$> = True$
end else
ServiceRec<SERVICES.SERVER$> = 'MESTSA01EC'
ServiceRec<SERVICES.ACTIVE$> = False$
end
End Case
Database_Services('WriteDataRow', 'SERVICES', ServiceName, ServiceRec, True$, False$, True$)
Until EOF
Repeat
end
end
end service
Service DeployRoutine(StoredProcNames)
If StoredProcNames NE '' then
For each StoredProcName in StoredProcNames using @FM setting fPos
SysObjKey = '$':StoredProcName:'*LSL2'
If RowExists('SYSOBJ', SysObjKey) then
Messaging_Services('SendMessage', 'RunProcedure', 'Request', '', 'All', 'RTP27,':StoredProcName, '', '', '')
end else
Error_Services('Add', 'Error in ':Service:' service. Stored procedure ':StoredProcName:' does not exist!')
end
Next StoredProcName
end
end service
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Internal GoSubs
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ClearCursors:
For counter = 0 to 8
ClearSelect counter
Next counter
return