pre cutover push
This commit is contained in:
@ -71,8 +71,6 @@ Service GetADGroups(Username, Domain)
|
||||
AccountMgmtDllPath = DotNetDir:'System.DirectoryServices.AccountManagement.dll'
|
||||
Set_Property.Net(DotNetHandle, "AssemblyName", AccountMgmtDllPath)
|
||||
If Not(Get_Status(errCode)) then
|
||||
|
||||
|
||||
Params = 'Domain':@FM:'Infineon'
|
||||
ParamTypes = 'System.DirectoryServices.AccountManagement.ContextType':@FM:'System.String'
|
||||
objPC = Create_Class.Net(DotNetHandle, "System.DirectoryServices.AccountManagement.PrincipalContext", 0, Params, ParamTypes)
|
||||
@ -142,4 +140,3 @@ Service GetComputerDomain()
|
||||
end service
|
||||
|
||||
|
||||
|
||||
|
@ -137,4 +137,3 @@ return 0
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -137,4 +137,3 @@ GOTO READRECORD
|
||||
*
|
||||
END
|
||||
|
||||
|
||||
|
@ -164,4 +164,3 @@ write '' on SysListsTable, ListsId else
|
||||
return 0
|
||||
end
|
||||
RETURN 0
|
||||
|
||||
|
@ -26,4 +26,3 @@ begin case
|
||||
status() = invalid_msg$
|
||||
end case
|
||||
return
|
||||
|
||||
|
@ -108,4 +108,3 @@ StartStop:
|
||||
END
|
||||
|
||||
return
|
||||
|
||||
|
@ -59,4 +59,3 @@ End
|
||||
|
||||
Return Status
|
||||
|
||||
|
||||
|
57
LSL2/STPROC/ADMIN_API.txt
Normal file
57
LSL2/STPROC/ADMIN_API.txt
Normal file
@ -0,0 +1,57 @@
|
||||
Function Admin_API(@API)
|
||||
/***********************************************************************************************************************
|
||||
|
||||
This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written
|
||||
permission from SRP Computer Solutions, Inc.
|
||||
|
||||
Name : Admin_API
|
||||
|
||||
Description : API logic for the Admin resource.
|
||||
|
||||
Notes : All web APIs should include the API_SETUP insert. This will provide several useful variables:
|
||||
|
||||
HTTPMethod - The HTTP Method (Verb) submitted by the client (e.g., GET, POST, etc.)
|
||||
APIURL - The URL for the API entry point (e.g., api.mysite.com/v1).
|
||||
FullEndpointURL - The URL submitted by the client, including query params.
|
||||
FullEndpointURLNoQuery - The URL submitted by the client, excluding query params.
|
||||
EndpointSegment - The URL endpoint segment.
|
||||
ParentURL - The URL path preceeding the current endpoint.
|
||||
CurrentAPI - The name of this stored procedure.
|
||||
|
||||
Parameters :
|
||||
API [in] -- Web API to process. Format is [APIPattern].[HTTPMethod]:
|
||||
- APIPattern must follow this structure Admin[.ID.[<Property>]]
|
||||
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
|
||||
Examples:
|
||||
- Admin.POST
|
||||
- Admin.ID.PUT
|
||||
- Admin.ID.firstName.GET
|
||||
Response [out] -- Response to be sent back to the Controller (HTTP_MCP) or requesting procedure. Web API
|
||||
services do not rely upon anything being returned in the response. This is what the
|
||||
various services like SetResponseBody and SetResponseStatus services are for. A response
|
||||
value is only helpful if the developers want to use it for debug purposes.
|
||||
|
||||
History : (Date, Initials, Notes)
|
||||
03/14/24 xxx Original programmer.
|
||||
|
||||
***********************************************************************************************************************/
|
||||
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
$insert APP_INSERTS
|
||||
$insert API_SETUP
|
||||
$insert HTTP_INSERTS
|
||||
|
||||
GoToAPI else
|
||||
// The specific resource endpoint doesn't have a API handler yet.
|
||||
HTTP_Services('SetResponseStatus', 204, 'This is a valid endpoint but a web API handler has not yet been created.')
|
||||
end
|
||||
|
||||
Return Response OR ''
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Endpoint Handlers
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
@ -7,4 +7,3 @@ $insert logical
|
||||
$insert lsl_users_equ
|
||||
Valid = xlate( 'LSL_USERS', UserToCheck, lsl_users_admin_user$, 'X' )
|
||||
return Valid
|
||||
|
||||
|
@ -57,4 +57,3 @@ For Each Domain in Domains using ','
|
||||
Next Domain
|
||||
Set_Property(@Window : '.TABLE_1', 'LIST', List)
|
||||
return 0
|
||||
|
||||
|
85
LSL2/STPROC/ARCHIVE_SERVICES.txt
Normal file
85
LSL2/STPROC/ARCHIVE_SERVICES.txt
Normal file
@ -0,0 +1,85 @@
|
||||
Compile function Archive_Services(@Service, @Params)
|
||||
#pragma precomp SRP_PreCompiler
|
||||
$insert LOGICAL
|
||||
$insert APP_INSERTS
|
||||
EQU COMMA$ To ','
|
||||
|
||||
Declare subroutine Change_Log_Services, Logging_Services
|
||||
Declare function SRP_Datetime, Logging_Services, Environment_Services, Datetime
|
||||
|
||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\Archive'
|
||||
LogDate = Oconv(Date(), 'D4/')
|
||||
LogTime = Oconv(Time(), 'MTS')
|
||||
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' ArchiveService.csv'
|
||||
Headers = 'Logging DTM' : @FM : 'Message' : @FM : 'Cutoff Date'
|
||||
objLogArchiveService = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$)
|
||||
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
|
||||
|
||||
GoToService
|
||||
|
||||
Return Response or ""
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// SERVICES
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
Service ArchiveRecords()
|
||||
Errors = ''
|
||||
StatusMessage = 'Starting Archive Script.'
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = StatusMessage
|
||||
Logging_Services('AppendLog', objLogArchiveService, LogData, @RM, @FM)
|
||||
|
||||
//Archive Change Log Records
|
||||
GoSub ChangeLogArchive
|
||||
|
||||
//Finish
|
||||
Locate True$ in Errors using @FM setting ePos then
|
||||
StatusMessage = 'Archive script complete. Errors detected. Check individual archive logs for more info.'
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = StatusMessage
|
||||
Logging_Services('AppendLog', objLogArchiveService, LogData, @RM, @FM)
|
||||
end else
|
||||
StatusMessage = 'Archive script complete. No errors detected.'
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = StatusMessage
|
||||
Logging_Services('AppendLog', objLogArchiveService, LogData, @RM, @FM)
|
||||
end
|
||||
|
||||
End Service
|
||||
|
||||
Service DearchiveRecord(Table, ID)
|
||||
|
||||
end service
|
||||
|
||||
ChangeLogArchive:
|
||||
StatusMessage = 'Starting Change_Log Archive Script.'
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = StatusMessage
|
||||
Logging_Services('AppendLog', objLogArchiveService, LogData, @RM, @FM)
|
||||
ChangeLogArchiveDate = SRP_Datetime('AddYears', Datetime(), -1)
|
||||
Change_Log_Services('ArchiveChangeLogRecByDate', ChangeLogArchiveDate)
|
||||
If Error_Services('NoError') then
|
||||
StatusMessage = 'Starting Change_Log Archive Script.'
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = StatusMessage
|
||||
Logging_Services('AppendLog', objLogArchiveService, LogData, @RM, @FM)
|
||||
end else
|
||||
StatusMessage = 'Error in Change_Log Archive Script.'
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = StatusMessage
|
||||
Logging_Services('AppendLog', objLogArchiveService, LogData, @RM, @FM)
|
||||
Errors<-1> = True$
|
||||
end
|
||||
return
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -33,4 +33,3 @@ for j = 1 to NumValues
|
||||
next k
|
||||
next j
|
||||
|
||||
|
||||
|
@ -105,4 +105,3 @@ end else
|
||||
end
|
||||
osclose DosTableVar
|
||||
return 0
|
||||
|
||||
|
@ -28,4 +28,3 @@ begin case
|
||||
status() = invalid_msg$
|
||||
end case
|
||||
return
|
||||
|
||||
|
@ -207,4 +207,3 @@ Main_Process:
|
||||
end
|
||||
return
|
||||
|
||||
|
||||
|
@ -262,4 +262,3 @@ Remove_Arev_Table_Name:
|
||||
|
||||
CALL @NEXTFS(CODE, FS, Real_Handle, NAME, FMC, RECORD, STATUS)
|
||||
return
|
||||
|
||||
|
152
LSL2/STPROC/AUTHENTICATION_API.txt
Normal file
152
LSL2/STPROC/AUTHENTICATION_API.txt
Normal file
@ -0,0 +1,152 @@
|
||||
Function Authentication_API(@API)
|
||||
/***********************************************************************************************************************
|
||||
|
||||
This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written
|
||||
permission from SRP Computer Solutions, Inc.
|
||||
|
||||
Name : Authentication_API
|
||||
|
||||
Description : API logic for the Authentication resource.
|
||||
|
||||
Notes : All web APIs should include the API_SETUP insert. This will provide several useful variables:
|
||||
|
||||
HTTPMethod - The HTTP Method (Verb) submitted by the client (e.g., GET, POST, etc.)
|
||||
APIURL - The URL for the API entry point (e.g., api.mysite.com/v1).
|
||||
FullEndpointURL - The URL submitted by the client, including query params.
|
||||
FullEndpointURLNoQuery - The URL submitted by the client, excluding query params.
|
||||
EndpointSegment - The URL endpoint segment.
|
||||
ParentURL - The URL path preceeding the current endpoint.
|
||||
CurrentAPI - The name of this stored procedure.
|
||||
|
||||
Parameters :
|
||||
API [in] -- Web API to process. Format is [APIPattern].[HTTPMethod]:
|
||||
- APIPattern must follow this structure Authentication[.ID.[<Property>]]
|
||||
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
|
||||
Examples:
|
||||
- Authentication.POST
|
||||
- Authentication.ID.PUT
|
||||
- Authentication.ID.firstName.GET
|
||||
Response [out] -- Response to be sent back to the Controller (HTTP_MCP) or requesting procedure. Web API
|
||||
services do not rely upon anything being returned in the response. This is what the
|
||||
various services like SetResponseBody and SetResponseStatus services are for. A response
|
||||
value is only helpful if the developers want to use it for debug purposes.
|
||||
|
||||
History : (Date, Initials, Notes)
|
||||
07/17/24 djs Original programmer.
|
||||
|
||||
***********************************************************************************************************************/
|
||||
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
$insert APP_INSERTS
|
||||
$insert API_SETUP
|
||||
$insert HTTP_INSERTS
|
||||
$insert LSL_USERS_EQUATES
|
||||
|
||||
Equ USERNAME$ To 1
|
||||
Equ GROUP$ To 2
|
||||
Equ PASSWORD$ To 3
|
||||
Equ CONTEXT$ To 4
|
||||
|
||||
Declare function Database_Services, MemberOf
|
||||
|
||||
GoToAPI else
|
||||
// The specific resource endpoint doesn't have a API handler yet.
|
||||
HTTP_Services('SetResponseStatus', 204, 'This is a valid endpoint but a web API handler has not yet been created.')
|
||||
end
|
||||
|
||||
Return Response OR ''
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Endpoint Handlers
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
API authentication.POST
|
||||
|
||||
Body = HTTP_Services('GetHTTPPostString')
|
||||
If Body NE '' then
|
||||
// The POST string will have been encoded so use percent (URL) decoding
|
||||
AuthJson = HTTP_Services('DecodePercentString', Body)
|
||||
hAuthJson = ''
|
||||
ParseResponse = SRP_JSON(hAuthJson, 'PARSE', AuthJson)
|
||||
If (ParseResponse EQ '') then
|
||||
Username = SRP_JSON(hAuthJson, 'GetValue', 'Username')
|
||||
Password = SRP_JSON(hAuthJson, 'GetValue', 'Password')
|
||||
Groups = ''
|
||||
hGroups = SRP_JSON(hAuthJson, 'get', 'Groups')
|
||||
If hGroups then
|
||||
ElementHandles = SRP_JSON(hGroups, 'GetElements', @VM)
|
||||
If ElementHandles NE '' then
|
||||
For each ElementHandle in ElementHandles using @VM
|
||||
Groups<0, -1> = SRP_JSON(ElementHandle, 'GetValue')
|
||||
SRP_JSON(ElementHandle, 'Release')
|
||||
Next ElementHandle
|
||||
end
|
||||
SRP_JSON(hGroups, 'Release')
|
||||
end
|
||||
SRP_JSON(hAuthJson, 'Release')
|
||||
// Validate Credentials
|
||||
UserRec = Database_Services('ReadDataRow', 'LSL_USERS', Username)
|
||||
If Error_Services('NoError') then
|
||||
Credentials = ''
|
||||
Credentials<USERNAME$> = Username
|
||||
Credentials<PASSWORD$> = UserRec<LSL_USERS_PASSWORD$>
|
||||
Credentials<GROUP$> = UserRec<LSL_USERS_GROUPS$>
|
||||
|
||||
Member = False$
|
||||
Group = ''
|
||||
If Groups NE '' then
|
||||
For each Group in Groups using @VM
|
||||
Member = MemberOf(Credentials<USERNAME$>, Group)
|
||||
Until Member EQ True$
|
||||
Next Group
|
||||
end else
|
||||
Member = True$
|
||||
end
|
||||
|
||||
Begin Case
|
||||
|
||||
Case (Password EQ Credentials<PASSWORD$>) AND (Member EQ True$)
|
||||
// Return 200, authentication successful
|
||||
StatusCode = 200
|
||||
Message = 'Authentication successful'
|
||||
HTTP_Services('SetResponseStatus', 200, Message)
|
||||
Case (Password EQ Credentials<PASSWORD$>) AND (Member EQ False$)
|
||||
// Return 401, not a member of required groups
|
||||
NumGroups = DCount(Groups, @VM)
|
||||
If NumGroups GT 1 then
|
||||
Swap @VM with ' or ' in Groups
|
||||
Message = 'User is not a member of the ' : Groups : ' groups.'
|
||||
end else
|
||||
Message = 'User is not a member of the ' : Group : ' group.'
|
||||
end
|
||||
HTTP_Services('SetResponseStatus', 401, 'Authentication failed. ':Message)
|
||||
|
||||
Case Password NE Credentials<PASSWORD$>
|
||||
// Return 401, unable to validate password
|
||||
Message = 'Unable to validate username. Please re-enter.'
|
||||
HTTP_Services('SetResponseStatus', 401, 'Authentication failed. ':Message)
|
||||
Case Otherwise$
|
||||
HTTP_Services('SetResponseStatus', 500, 'Error in the ' : CurrentAPI : ' API. Unhandled case.')
|
||||
End Case
|
||||
end else
|
||||
// Error reading user record
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
HTTP_Services('SetResponseStatus', 500, 'Error in the ' : CurrentAPI : ' API. Message: ': ErrorMsg)
|
||||
end
|
||||
end else
|
||||
HTTP_Services('SetResponseStatus', 400, 'Error in the ' : CurrentAPI : ' API. Error parsing JSON.')
|
||||
end
|
||||
end else
|
||||
HTTP_Services('SetResponseStatus', 400, 'Error in the ' : CurrentAPI : ' API. Empty request.')
|
||||
end
|
||||
|
||||
end api
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Internal GoSubs
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
415
LSL2/STPROC/AUTOMATED_WORKFLOW_SERVICES.txt
Normal file
415
LSL2/STPROC/AUTOMATED_WORKFLOW_SERVICES.txt
Normal file
@ -0,0 +1,415 @@
|
||||
Compile function Automated_Workflow_Services(@Service, @Params)
|
||||
|
||||
/*
|
||||
Initial Author: Jonathan Ouellette
|
||||
This service module has a catalogued list of functions to quickly and easily perform certain functions related to lot
|
||||
processing.
|
||||
|
||||
1. CreateAWO - Imitates the process of getting data from SAP and processing the WO start in OI.
|
||||
2. RouteWO - Imitates routing of a WO, AKA selecting a ProdVer and Assigning the WO to a reactor Type
|
||||
3. PrescribeWafers - Imitates creating the child lots for a WO, AKA creating WO_MAT records
|
||||
4. ReleaseCassettes - Assigns raw substrates to the WO_MAT records. RDS for non-epipro is created at this point.
|
||||
5. PerformPTI - Imitates Receiving operator moving the lot into the fab.
|
||||
6. Perform1VER - Performs the 1VER operation for an RDS.
|
||||
7. PerformLoad - Performs the load operation for an RDS.
|
||||
8. PerformUnload - Performs the unload operation for a non-epipro RDS.
|
||||
9. EnterRecipeParms - Used in conjunction with PerformLoad. Used to enter the parameters for the Reactor Recipe upon load
|
||||
typically this is the first load of a Work Order.
|
||||
10. VerifyRecipeParms - Used in conjunction with PerformLoad. Used to verify the current recipe setpoints for an RDS load.
|
||||
|
||||
|
||||
*/
|
||||
#pragma precomp SRP_PreCompiler
|
||||
Declare function Gan_Services, Obj_Notes_Sent, msg, Check_Notes, Jonathan_Services, Database_Services, SRP_Datetime
|
||||
Declare function Lsl_Users_Services, SRP_Time, RList, Error_Services, Obj_Wo_Mat, Pm_Services, Date_Services, Test_Run_Services
|
||||
Declare function Reactor_Services, Reactor_Log_Services, obj_react_item, Utility, Environment_Services, obj_wo_log, Qa_Services
|
||||
Declare subroutine Start_Window, RList, Set_Status, Database_Services, Obj_Sap, Sap_Services, Btree.Extract, Qa_Services
|
||||
Declare subroutine Reactor_Services, Obj_Wo_Log, obj_wo_mat, Work_Order_Services, Material_Movement_Services, Automated_Workflow_Services
|
||||
Declare subroutine Override_Services, Obj_Wo_Mat_Log, obj_post_log, Obj_Sap
|
||||
|
||||
$insert LOGICAL
|
||||
$insert NOTE_PTRS_EQU
|
||||
$insert MSG_EQUATES
|
||||
$Insert APP_INSERTS
|
||||
$Insert RLIST_EQUATES
|
||||
$Insert WO_LOG_EQUATES
|
||||
$Insert RDS_EQUATES
|
||||
$Insert WO_STEP_EQUATES
|
||||
$Insert WO_MAT_QA_EQUATES
|
||||
$Insert REACT_RUN_EQUATES
|
||||
$Insert RDS_LAYER_EQUATES
|
||||
$Insert RDS_TEST_EQUATES
|
||||
$Insert PM_EQUATES
|
||||
$Insert PM_SPEC_EQUATES
|
||||
$Insert WO_MAT_EQUATES
|
||||
$Insert WM_OUT_EQUATES
|
||||
$Insert TEST_RUN_EQUATES
|
||||
$Insert TEST_RUN_WAFER_EQUATES
|
||||
$Insert TEST_WAFER_PROD_EQUATES
|
||||
$Insert TEST_RUN_TYPE_EQUATES
|
||||
$Insert EPI_PART_EQUATES
|
||||
$Insert POPUP_EQUATES
|
||||
$Insert REACTOR_EQUATES
|
||||
|
||||
GoToService
|
||||
|
||||
Return Response or ""
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// SERVICES
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
Service CreatAWO()
|
||||
|
||||
//Step 1: Start a WO WOLogFileIn variable emulates what an SAP file would have
|
||||
/*
|
||||
ProdOrdNo = FileIn<1,1>
|
||||
CustPONo = FileIn<1,2>
|
||||
PromiseShipDt = FileIn<1,3>
|
||||
EpiPartNo = FileIn<1,4>
|
||||
SubPartNo = FileIn<1,5>
|
||||
SubRevNo = FileIn<1,6>
|
||||
WOQty = FileIn<1,7>
|
||||
VendCd = FileIn<1,8>
|
||||
*/
|
||||
WOLogFileIn = 'M124567.1':@VM:'NA':@VM:'02/29/2024':@VM:'400149S':@VM:'827906':@VM:'1.0':@VM:'150':@VM:'NA'
|
||||
RetVal = obj_WO_LOG('SAPCreate',WOLogFileIn)
|
||||
Response = RetVal
|
||||
end service
|
||||
|
||||
Service RouteWO(WO_No)
|
||||
//Step 2: Route a WO with a Product Version
|
||||
|
||||
WOLogRec = Database_Services('ReadDataRow', 'WO_LOG', WO_No)
|
||||
EpiPartNo = WOLogRec<WO_LOG_EPI_PART_NO$>
|
||||
If EpiPartNo NE '' then
|
||||
AllProdVerNos = XLATE('EPI_PART',EpiPartNo,EPI_PART_PROD_VER_NO$,'X')
|
||||
TypeOver = ''
|
||||
TypeOver<PDISPLAY$> = AllProdVerNos
|
||||
TypeOver<PSELECT$> = 1
|
||||
TypeOver<PMODE$> = 'K'
|
||||
SelectedProdVerNo = Popup(@WINDOW,TypeOver,'PROD_VER')
|
||||
If SelectedProdVerNo NE '' then
|
||||
obj_WO_Log('Route',WO_No:@RM:SelectedProdVerNo)
|
||||
end
|
||||
end
|
||||
end service
|
||||
|
||||
Service PrescribeWafers(WONo, AmountToRX)
|
||||
//Step 3: prescribe wafers. This is the same as assigning lot numbers to individual lots of raw material. AKA creating WO_MAT records
|
||||
/*
|
||||
a. User clicks the PUB_RX button on the WO_LOG form.
|
||||
b. Opens WO Receipt form
|
||||
c. Users clicks on WO's Due in
|
||||
d. User selects or enters a WO.
|
||||
e. User clicks scan codes, opens
|
||||
*/
|
||||
debug
|
||||
ProdVerNo = XLATE('WO_LOG', WONo, 'PROD_VER_NO', 'X')
|
||||
ReactType = XLATE('WO_LOG', WONo, 'REACT_TYPE', 'X')
|
||||
CassLotNo = '123456789'
|
||||
CustPartNo = XLATE('WO_LOG', WONo, 'CUST_PART_NO', 'X')
|
||||
CassQty = 25
|
||||
NumCassToRX = AmountToRX / 25
|
||||
ExistingWOMatList = XLATE('WO_LOG', WONo, 'WO_MAT_KEY', 'X')
|
||||
LastCassNo = 0
|
||||
for each cass in ExistingWOMatList using @VM setting iPos
|
||||
thisCassNo = FIELD(cass, '*', 2)
|
||||
if thisCassNo GT LastCassNo then LastCassNo = thisCassNo
|
||||
Next cass
|
||||
for i = 1 to NumCassToRX
|
||||
NextCassNo = LastCassNo + 1
|
||||
LastCassNo = nextCassNo
|
||||
Parms = WONo:@RM
|
||||
Parms := NextCassNo:@RM
|
||||
Parms := ProdVerNo:@RM
|
||||
Parms := CassLotNo:@RM
|
||||
Parms := CassQty:@RM
|
||||
Parms := CustPartNo:@RM ;* This is the CUSTOMER part No
|
||||
Parms := 1:@RM
|
||||
Parms := ReactType:@RM ;* 3 character Reactor Type Code
|
||||
Parms := '':@RM
|
||||
Parms := 'SR':@RM ;* Warehouse = 'SR' - Shipping/Receiving Area
|
||||
Parms := 'RB':@RM ;* Location = 'RB' - Receiving Bench
|
||||
Parms := OCONV(SRP_Datetime('Now'), 'DT/4'):@RM
|
||||
Parms := 'JONATHAN_O':@RM
|
||||
Parms := '':@RM
|
||||
Parms := '':@RM
|
||||
Parms := '':@RM ;* Added 8/18/2009 JCH
|
||||
Parms := '':@RM ;* Added 12/16/2009 JCH
|
||||
Parms := 25:@RM ;* Added 11/4/2009 JCH
|
||||
Parms := 0:@RM ;* Added 05/14/2010 JCH
|
||||
Parms := '':@RM ;* Added 07/14/2011 for SAP Project JCH
|
||||
Parms := 25 ; // Added 02/01/2018 dmb
|
||||
obj_WO_Mat('Create',Parms)
|
||||
If Error_Services('NoError') then
|
||||
WOLogRec = Database_Services('ReadDataRow', 'WO_LOG', WONo)
|
||||
WOLogRec<WO_LOG_WO_MAT_KEY$, -1> = WONo : '*' : LastCassNo
|
||||
Database_Services('WriteDataRow', 'WO_LOG', WONo, WOLogRec, 1, 0, 1)
|
||||
end
|
||||
Next i
|
||||
Work_Order_Services('UpdateReceivedQty', WONo)
|
||||
|
||||
|
||||
end service
|
||||
|
||||
Service ReleaseCassettes(WONo)
|
||||
|
||||
//Step 4: User clicks release cassettes(PUB_RELEASE) from WO_LOG form
|
||||
Work_Order_Services('ReleaseCassettes', WONo)
|
||||
//Can get RDS number at this point
|
||||
end service
|
||||
|
||||
Service PerformPTI(CassID)
|
||||
//Step 5: User performs a PTI scan to tag lot into the fab.
|
||||
Warehouse = '1K'
|
||||
Location = 'PTI'
|
||||
Material_Movement_Services('SaveRecord', CassID, Warehouse, Location, @USER4)
|
||||
end service
|
||||
|
||||
* Service BatchProcessLotList()
|
||||
* RDSList = ''
|
||||
*
|
||||
* RDSList<1> = 627134
|
||||
* RDSList<2> = 627135
|
||||
* RDSList<3> = 627136
|
||||
* RDSList<4> = 627132
|
||||
* RDSList<5> = 627133
|
||||
*
|
||||
* for each rds in RDSList using @FM
|
||||
* //Automated_Workflow_Services('Perform1VER', rds, 63, 25)
|
||||
* Automated_Workflow_Services('PerformUnload', rds)
|
||||
* Next rds
|
||||
* end service
|
||||
|
||||
Service Perform1VER(CassID, ReactorID, WfrQty)
|
||||
|
||||
//Step 6
|
||||
If RowExists('RDS', CassID) AND ReactorID NE '' then
|
||||
ReadyToSign = QA_Services('PreEpiSignatureReady', CassID, @User4, WfrQty, ReactorID)
|
||||
If (ReadyToSign EQ True$) then
|
||||
QA_Services('SignPreEpiStage', CassID, @USER4, WfrQty, ReactorID)
|
||||
end
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
Service PerformLoad(CassID, WfrInQty, LorRLL)
|
||||
|
||||
//Step 7
|
||||
If RowExists('RDS', CassID) then
|
||||
ReadyToSign = Qa_Services('LoadSignatureReady', CassID, @User4, WfrInQty, LorRLL, 0)
|
||||
If ReadyToSign then
|
||||
Qa_Services('SignLoadStage', CassID, @User4, WfrInQty, LorRLL, 0)
|
||||
end else
|
||||
ErrorReason = Error_Services('GetMessage')
|
||||
Begin Case
|
||||
Case ErrorReason EQ 'Process Error: Recipe parameters have not been entered.'
|
||||
//Get the expected parameters and enter them. This is in the RDS_Layer Record
|
||||
//First lets get limits from the RDS Layer Record(s)
|
||||
RDSLayerKeys = XLATE('RDS', CassID, RDS_RDS_LAYER_KEYS$, 'X')
|
||||
for each RDSLayerKey in RDSLayerKeys using @VM setting rlPos
|
||||
Automated_Workflow_Services('EnterRecipeParams', RDSLayerKey)
|
||||
If Error_Services('NoError') then
|
||||
Automated_Workflow_Services('PerformLoad', CassID, WfrInQty, LorRLL)
|
||||
end else
|
||||
//Die
|
||||
Return
|
||||
end
|
||||
Next RDSLayerKey
|
||||
Case ErrorReason EQ 'RDS layer parameters must be reviewed for accuracy and acknowledged before the load operation can be signed.'
|
||||
Automated_Workflow_Services('VerifyRecipeParams', CassID)
|
||||
If Error_Services('NoError') then
|
||||
Automated_Workflow_Services('PerformLoad', CassID, WfrInQty, LorRLL)
|
||||
end else
|
||||
//Die
|
||||
Return
|
||||
end
|
||||
End Case
|
||||
end
|
||||
end
|
||||
end service
|
||||
|
||||
Service PerformUnload(RDSNo)
|
||||
//Step 8
|
||||
|
||||
If RDSNo NE '' then
|
||||
Reactor = XLATE('RDS', RDSNo, 'REACTOR', 'X')
|
||||
If Reactor NE '' then
|
||||
ReadyToSign = QA_Services('UnloadSignatureReady', RDSNo, @User4, Reactor)
|
||||
If Error_Services('HasError') then
|
||||
If ErrorMsg EQ 'Cassette runtime exceeds three days! An override by a LEAD or SUPERVISOR is required.' then
|
||||
Override_Services('SetOverride', 'RDS', RDSNo, 'UNLOAD_DTM', @USER4)
|
||||
ReadyToSign = True$
|
||||
end
|
||||
end
|
||||
If ReadyToSign then
|
||||
QA_Services('SignUnloadStage', RDSNo, @User4)
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'No Reactor assigned to RDS!')
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'No RDS No. Supplied!')
|
||||
end
|
||||
end service
|
||||
|
||||
Service PerformFQA(RDSNo)
|
||||
|
||||
ToolID = ''
|
||||
WHCd = 'CR'
|
||||
LocCD = 'QA'
|
||||
Tag = ''
|
||||
SigDt = Date()
|
||||
SigTm = Time()
|
||||
WONo = XLATE('RDS', RDSNo, RDS_WO$, 'X')
|
||||
CassNo = XLATE('RDS', RDSNo, RDS_CASS_NO$, 'X')
|
||||
|
||||
Equ COL$LOG_FILE to 1
|
||||
Equ COL$LOG_DTM to 2
|
||||
Equ COL$ACTION to 3
|
||||
Equ COL$WH_CD to 4
|
||||
Equ COL$LOC_CD to 5
|
||||
Equ COL$WO_NOS to 6
|
||||
Equ COL$CASS_NOS to 7
|
||||
Equ COL$USER_ID to 8
|
||||
Equ COL$TAGS to 9
|
||||
Equ COL$TOOL_ID to 10
|
||||
EventParms = ''
|
||||
EventParms<COL$LOG_FILE> = 'WO_MAT'
|
||||
EventParms<COL$LOG_DTM> = SigDt:' ':SigTm
|
||||
EventParms<COL$ACTION> = 1:'QA'
|
||||
EventParms<COL$WH_CD> = 'CR'
|
||||
EventParms<COL$LOC_CD> = 'QA'
|
||||
EventParms<COL$WO_NOS> = WONo
|
||||
EventParms<COL$CASS_NOS> = CassNo
|
||||
EventParms<COL$USER_ID> = @USER4
|
||||
EventParms<COL$TAGS> = ''
|
||||
EventParms<COL$TOOL_ID> = ''
|
||||
|
||||
CONVERT @FM TO @RM IN EventParms
|
||||
|
||||
obj_WO_Mat_Log('Create',EventParms) ;* * * * * INV EVENT LOG * * * * *
|
||||
Obj_Post_Log('POST')
|
||||
|
||||
Qa_Services('SignFQAStage', RDSNo, @USER4)
|
||||
end service
|
||||
|
||||
|
||||
Service EnterRecipeParams(RDSLayerKey)
|
||||
|
||||
RDSLayerRec = Database_Services('ReadDataRow', 'RDS_LAYER', RDSLayerKey)
|
||||
If RDSLayerRec NE '' then
|
||||
If RDSLayerRec<RDS_LAYER_EPI_TIME_MIN$> NE '' AND RDSLayerRec<RDS_LAYER_EPI_TIME_MAX$> NE '' then
|
||||
//Epi Deposit Time
|
||||
RDSLayerRec<RDS_LAYER_EPI_TIME$> = ((RDSLayerRec<RDS_LAYER_EPI_TIME_MAX$> - RDSLayerRec<RDS_LAYER_EPI_TIME_MIN$>) / 2) + RDSLayerRec<RDS_LAYER_EPI_TIME_MIN$>
|
||||
end
|
||||
|
||||
If RDSLayerRec<RDS_LAYER_DILUENT_MIN$> NE '' AND RDSLayerRec<RDS_LAYER_DILUENT_MAX$> NE '' then
|
||||
//Diluent
|
||||
RDSLayerRec<RDS_LAYER_DILUENT_ADJ_PARAM$> = ((RDSLayerRec<RDS_LAYER_DILUENT_MAX$> - RDSLayerRec<RDS_LAYER_DILUENT_MIN$>) / 2) + RDSLayerRec<RDS_LAYER_DILUENT_MIN$>
|
||||
end
|
||||
|
||||
If RDSLayerRec<RDS_LAYER_DOPANT_FLOW_MIN$> NE '' AND RDSLayerRec<RDS_LAYER_DOPANT_FLOW_MAX$> NE '' then
|
||||
//Dopant Flow
|
||||
RDSLayerRec<RDS_LAYER_DOPANT_FLOW$> = ((RDSLayerRec<RDS_LAYER_DOPANT_FLOW_MAX$> - RDSLayerRec<RDS_LAYER_DOPANT_FLOW_MIN$>) / 2) + RDSLayerRec<RDS_LAYER_DOPANT_FLOW_MIN$>
|
||||
end
|
||||
|
||||
If RDSLayerRec<RDS_LAYER_HCL_FLOW_MIN$> NE '' AND RDSLayerRec<RDS_LAYER_HCL_FLOW_MAX$> NE '' then
|
||||
//HCL Flow
|
||||
RDSLayerRec<RDS_LAYER_HCL_FLOW$> = ((RDSLayerRec<RDS_LAYER_HCL_FLOW_MAX$> - RDSLayerRec<RDS_LAYER_HCL_FLOW_MIN$>) / 2) + RDSLayerRec<RDS_LAYER_HCL_FLOW_MIN$>
|
||||
end
|
||||
|
||||
If RDSLayerRec<RDS_LAYER_BAKE_TIME_MIN$> NE '' AND RDSLayerRec<RDS_LAYER_BAKE_TIME_MAX$> NE '' then
|
||||
//Bake Time
|
||||
RDSLayerRec<RDS_LAYER_BAKE_TIME$> = ((RDSLayerRec<RDS_LAYER_BAKE_TIME_MAX$> - RDSLayerRec<RDS_LAYER_BAKE_TIME_MIN$>) / 2) + RDSLayerRec<RDS_LAYER_BAKE_TIME_MIN$>
|
||||
end
|
||||
|
||||
If RDSLayerRec<RDS_LAYER_EPI_H2_FLOW_MIN$> NE '' AND RDSLayerRec<RDS_LAYER_EPI_H2_FLOW_MAX$> NE '' then
|
||||
//H2 Flow
|
||||
RDSLayerRec<RDS_LAYER_EPI_H2_FLOW$> = ((RDSLayerRec<RDS_LAYER_EPI_H2_FLOW_MAX$> - RDSLayerRec<RDS_LAYER_EPI_H2_FLOW_MIN$>) / 2) + RDSLayerRec<RDS_LAYER_EPI_H2_FLOW_MIN$>
|
||||
end
|
||||
|
||||
If RDSLayerRec<RDS_LAYER_TCS_FLOW_MIN$> NE '' AND RDSLayerRec<RDS_LAYER_TCS_FLOW_MAX$> NE '' then
|
||||
//TCS Flow
|
||||
RDSLayerRec<RDS_LAYER_TCS_FLOW$> = ((RDSLayerRec<RDS_LAYER_TCS_FLOW_MAX$> - RDSLayerRec<RDS_LAYER_TCS_FLOW_MIN$>) / 2) + RDSLayerRec<RDS_LAYER_TCS_FLOW_MIN$>
|
||||
end
|
||||
|
||||
If RDSLayerRec<RDS_LAYER_DCS_FLOW_MIN$> NE '' AND RDSLayerRec<RDS_LAYER_DCS_FLOW_MAX$> NE '' then
|
||||
//DCS Flow
|
||||
RDSLayerRec<RDS_LAYER_DCS_FLOW$> = ((RDSLayerRec<RDS_LAYER_DCS_FLOW_MAX$> - RDSLayerRec<RDS_LAYER_DCS_FLOW_MIN$>) / 2) + RDSLayerRec<RDS_LAYER_DCS_FLOW_MIN$>
|
||||
end
|
||||
|
||||
If RDSLayerRec<RDS_LAYER_AUX1_MIN$> NE '' AND RDSLayerRec<RDS_LAYER_AUX1_MAX$> NE '' then
|
||||
//AUX 1
|
||||
RDSLayerRec<RDS_LAYER_AUX1$> = ((RDSLayerRec<RDS_LAYER_AUX1_MAX$> - RDSLayerRec<RDS_LAYER_AUX1_MIN$>) / 2) + RDSLayerRec<RDS_LAYER_AUX1_MIN$>
|
||||
end
|
||||
|
||||
If RDSLayerRec<RDS_LAYER_AUX2_MIN$> NE '' AND RDSLayerRec<RDS_LAYER_AUX2_MAX$> NE '' then
|
||||
//AUX2
|
||||
RDSLayerRec<RDS_LAYER_AUX2$> = ((RDSLayerRec<RDS_LAYER_AUX2_MAX$> - RDSLayerRec<RDS_LAYER_AUX2_MIN$>) / 2) + RDSLayerRec<RDS_LAYER_AUX2_MIN$>
|
||||
end
|
||||
|
||||
If RDSLayerRec<RDS_LAYER_F_OFFSET_MIN$> NE '' AND RDSLayerRec<RDS_LAYER_F_OFFSET_MAX$> NE '' then
|
||||
//F_OFFSET
|
||||
RDSLayerRec<RDS_LAYER_F_OFFSET$> = ((RDSLayerRec<RDS_LAYER_F_OFFSET_MAX$> - RDSLayerRec<RDS_LAYER_F_OFFSET_MIN$>) / 2) + RDSLayerRec<RDS_LAYER_F_OFFSET_MIN$>
|
||||
end
|
||||
|
||||
If RDSLayerRec<RDS_LAYER_S_OFFSET_MIN$> NE '' AND RDSLayerRec<RDS_LAYER_S_OFFSET_MAX$> NE '' then
|
||||
//S_OFFSET
|
||||
RDSLayerRec<RDS_LAYER_S_OFFSET$> = ((RDSLayerRec<RDS_LAYER_S_OFFSET_MAX$> - RDSLayerRec<RDS_LAYER_S_OFFSET_MIN$>) / 2) + RDSLayerRec<RDS_LAYER_S_OFFSET_MIN$>
|
||||
end
|
||||
|
||||
If RDSLayerRec<RDS_LAYER_R_OFFSET_MIN$> NE '' AND RDSLayerRec<RDS_LAYER_R_OFFSET_MAX$> NE '' then
|
||||
//R OFFSET
|
||||
RDSLayerRec<RDS_LAYER_R_OFFSET$> = ((RDSLayerRec<RDS_LAYER_R_OFFSET_MAX$> - RDSLayerRec<RDS_LAYER_R_OFFSET_MIN$>) / 2) + RDSLayerRec<RDS_LAYER_R_OFFSET_MIN$>
|
||||
end
|
||||
|
||||
If RDSLayerRec<RDS_LAYER_ETCH1_MIN$> NE '' AND RDSLayerRec<RDS_LAYER_ETCH1_MAX$> NE '' then
|
||||
//ETCH 1
|
||||
RDSLayerRec<RDS_LAYER_ETCH1$> = ((RDSLayerRec<RDS_LAYER_ETCH1_MAX$> - RDSLayerRec<RDS_LAYER_ETCH1_MIN$>) / 2) + RDSLayerRec<RDS_LAYER_ETCH1_MIN$>
|
||||
end
|
||||
|
||||
If RDSLayerRec<RDS_LAYER_ETCH2_MIN$> NE '' AND RDSLayerRec<RDS_LAYER_ETCH2_MAX$> NE '' then
|
||||
//ETCH 2
|
||||
RDSLayerRec<RDS_LAYER_ETCH2$> = ((RDSLayerRec<RDS_LAYER_ETCH2_MAX$> - RDSLayerRec<RDS_LAYER_ETCH2_MIN$>) / 2) + RDSLayerRec<RDS_LAYER_ETCH2_MIN$>
|
||||
end
|
||||
|
||||
If RDSLayerRec<RDS_LAYER_ETCH3_MIN$> NE '' AND RDSLayerRec<RDS_LAYER_ETCH3_MAX$> NE '' then
|
||||
//ETCH 3
|
||||
RDSLayerRec<RDS_LAYER_ETCH3$> = ((RDSLayerRec<RDS_LAYER_ETCH3_MAX$> - RDSLayerRec<RDS_LAYER_ETCH3_MIN$>) / 2) + RDSLayerRec<RDS_LAYER_ETCH3_MIN$>
|
||||
end
|
||||
|
||||
If RDSLayerRec<RDS_LAYER_UL_TEMP_MIN$> NE '' AND RDSLayerRec<RDS_LAYER_UL_TEMP_MAX$> NE '' then
|
||||
//UL_TEMP
|
||||
RDSLayerRec<RDS_LAYER_UL_TEMP$> = ((RDSLayerRec<RDS_LAYER_UL_TEMP_MAX$> - RDSLayerRec<RDS_LAYER_UL_TEMP_MIN$>) / 2) + RDSLayerRec<RDS_LAYER_UL_TEMP_MIN$>
|
||||
end
|
||||
|
||||
If RDSLayerRec<RDS_LAYER_SUSC_ETCH_MIN$> NE '' AND RDSLayerRec<RDS_LAYER_SUSC_ETCH_MAX$> NE '' then
|
||||
//Susceptor Etch
|
||||
RDSLayerRec<RDS_LAYER_SUSC_ETCH$> = ((RDSLayerRec<RDS_LAYER_SUSC_ETCH_MAX$> - RDSLayerRec<RDS_LAYER_SUSC_ETCH_MIN$>) / 2) + RDSLayerRec<RDS_LAYER_SUSC_ETCH_MIN$>
|
||||
end
|
||||
Database_Services('WriteDataRow', 'RDS_LAYER', RDSLayerKey, RDSLayerRec, True$, False$, True$)
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
Service VerifyRecipeParams(RDSNo)
|
||||
//Used to verify exisiting recipe params. This is if they are already set.
|
||||
IF RDSNo NE '' then
|
||||
RDSRec = Database_Services('ReadDataRow', 'RDS', RDSNo)
|
||||
RDSRec<RDS_RDS_LAYER_ACK$> = True$
|
||||
Database_Services('WriteDataRow', 'RDS', RDSNo, RDSRec, True$, False$, True$)
|
||||
end else
|
||||
Error_Services('Add', 'RDS No was blank!!!')
|
||||
end
|
||||
end service
|
||||
|
||||
Service SendCassComp(WoMatKey)
|
||||
Sap_Services('RetransmitCassComp', WoMatKey)
|
||||
obj_sap('SendOutbound')
|
||||
end service
|
||||
|
||||
|
||||
|
||||
|
@ -261,4 +261,3 @@ RETURN
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -31,4 +31,3 @@ begin case
|
||||
status() = invalid_msg$
|
||||
end case
|
||||
return
|
||||
|
||||
|
@ -68,4 +68,3 @@ NEXT I
|
||||
END
|
||||
|
||||
|
||||
|
||||
|
@ -481,4 +481,3 @@ Bail:
|
||||
* * * * * * *
|
||||
|
||||
RETURN
|
||||
|
||||
|
@ -37,4 +37,3 @@ begin case
|
||||
status() = invalid_conv$
|
||||
end case
|
||||
return
|
||||
|
||||
|
@ -12,4 +12,3 @@ if DateOut and DateIn then
|
||||
end
|
||||
return Tot
|
||||
|
||||
|
||||
|
@ -92,7 +92,7 @@ FOR I = 1 to RdsCnt
|
||||
END
|
||||
|
||||
NEXT I
|
||||
if @UserName EQ 'DAN_CR' Then Debug
|
||||
|
||||
//DPC - 3/11/2020 - hack to account for formatting/conversion issue in Thick Vals from RDS_Test
|
||||
IF ThickAvgCount > 0 THEN
|
||||
StatThickAvg = (ThickAvgSum/ThickAvgCount)*10
|
||||
|
@ -201,4 +201,3 @@ RETURN
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -185,4 +185,3 @@ Service GetCalibListData(CalibType=CALIB_TYPES, SelectActive=BOOLEAN)
|
||||
End Service
|
||||
|
||||
|
||||
|
||||
|
@ -72,7 +72,7 @@ Create:
|
||||
* * * * * * *
|
||||
|
||||
|
||||
IF MemberOf(@USER4,'CALIBRATION') OR @USERNAME = 'BRYCE_BARB' ELSE
|
||||
IF MemberOf(@USER4,'CALIBRATION') ELSE
|
||||
ErrMsg('Only authorized personnel may update the Calibration List.')
|
||||
End_Window(@WINDOW)
|
||||
RETURN
|
||||
|
@ -28,4 +28,3 @@ begin case
|
||||
status() = invalid_msg$
|
||||
end case
|
||||
return
|
||||
|
||||
|
@ -26,4 +26,3 @@ begin case
|
||||
status() = invalid_msg$
|
||||
end case
|
||||
return
|
||||
|
||||
|
@ -141,4 +141,3 @@ write '' on SysListsTable, ListsId else
|
||||
end
|
||||
return 0
|
||||
|
||||
|
||||
|
@ -204,4 +204,3 @@ GOTO READRECORD
|
||||
*
|
||||
END
|
||||
|
||||
|
||||
|
@ -200,4 +200,3 @@ write '' on SysListsTable, ListsId else
|
||||
end
|
||||
|
||||
RETURN 0
|
||||
|
||||
|
@ -30,4 +30,3 @@ begin case
|
||||
status() = invalid_msg$
|
||||
end case
|
||||
return
|
||||
|
||||
|
@ -32,4 +32,3 @@ begin case
|
||||
status() = invalid_msg$
|
||||
end case
|
||||
return
|
||||
|
||||
|
@ -36,4 +36,3 @@ Event SIGN_BUTTON.CLICK()
|
||||
end event
|
||||
|
||||
|
||||
|
||||
|
139
LSL2/STPROC/CHANGELOG_API.txt
Normal file
139
LSL2/STPROC/CHANGELOG_API.txt
Normal file
@ -0,0 +1,139 @@
|
||||
Function Changelog_API(@API)
|
||||
/***********************************************************************************************************************
|
||||
|
||||
This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written
|
||||
permission from SRP Computer Solutions, Inc.
|
||||
|
||||
Name : Changelog_API
|
||||
|
||||
Description : API logic for the Changelog resource.
|
||||
|
||||
Notes : All web APIs should include the API_SETUP insert. This will provide several useful variables:
|
||||
|
||||
HTTPMethod - The HTTP Method (Verb) submitted by the client (e.g., GET, POST, etc.)
|
||||
APIURL - The URL for the API entry point (e.g., api.mysite.com/v1).
|
||||
FullEndpointURL - The URL submitted by the client, including query params.
|
||||
FullEndpointURLNoQuery - The URL submitted by the client, excluding query params.
|
||||
EndpointSegment - The URL endpoint segment.
|
||||
ParentURL - The URL path preceeding the current endpoint.
|
||||
CurrentAPI - The name of this stored procedure.
|
||||
|
||||
Parameters :
|
||||
API [in] -- Web API to process. Format is [APIPattern].[HTTPMethod]:
|
||||
- APIPattern must follow this structure Changelog[.ID.[<Property>]]
|
||||
- HTTPMethod can be any valid HTTP method, e.g., GET, POST, PUT, DELETE, etc.
|
||||
Examples:
|
||||
- Changelog.POST
|
||||
- Changelog.ID.PUT
|
||||
- Changelog.ID.firstName.GET
|
||||
Response [out] -- Response to be sent back to the Controller (HTTP_MCP) or requesting procedure. Web API
|
||||
services do not rely upon anything being returned in the response. This is what the
|
||||
various services like SetResponseBody and SetResponseStatus services are for. A response
|
||||
value is only helpful if the developers want to use it for debug purposes.
|
||||
|
||||
History : (Date, Initials, Notes)
|
||||
07/24/24 xxx Original programmer.
|
||||
|
||||
***********************************************************************************************************************/
|
||||
|
||||
#pragma precomp SRP_PreCompiler
|
||||
|
||||
Declare function Datetime, SRP_Datetime, Change_Log_Services, Environment_Services, Logging_Services
|
||||
Declare subroutine Logging_Services
|
||||
|
||||
$insert APP_INSERTS
|
||||
$insert API_SETUP
|
||||
$insert HTTP_INSERTS
|
||||
EQU Comma$ to ','
|
||||
|
||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\API\Admin\ChangeLog'
|
||||
LogDate = Oconv(Date(), 'D4/')
|
||||
LogTime = Oconv(Time(), 'MTS')
|
||||
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' ChangeLogArchiveService.csv'
|
||||
Headers = 'Logging DTM' : @FM : 'From IP Address' : @FM : 'Message'
|
||||
objLogChangeLogAPI = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$)
|
||||
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
|
||||
RequesterIPAddr = HTTP_Services('GetHTTPRemoteAddr')
|
||||
|
||||
GoToAPI else
|
||||
// The specific resource endpoint doesn't have a API handler yet.
|
||||
HTTP_Services('SetResponseStatus', 200, 'This is a valid endpoint but a web API handler has not yet been created.')
|
||||
end
|
||||
|
||||
Return Response OR ''
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Endpoint Handlers
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
API changelog.HEAD
|
||||
API changelog.GET
|
||||
StartDtm = Http_Services('GetQueryField', 'FromDatetime')
|
||||
ToDtm = Http_Services('GetQueryField', 'ToDatetime')
|
||||
|
||||
StartDtm = IConv(StartDtm, 'DT')
|
||||
ToDtm = IConv(ToDtm, 'DT')
|
||||
|
||||
If StartDtm EQ '' then
|
||||
StartDtm = SRP_Datetime('AddDays', Datetime(), -60)
|
||||
end
|
||||
If ToDtm EQ '' then
|
||||
ToDtm = Datetime()
|
||||
end
|
||||
|
||||
EntityName = Http_Services('GetQueryField', 'EntityName')
|
||||
UserId = Http_Services('GetQueryField', 'UserID')
|
||||
|
||||
ChangeLogIDs = Change_Log_Services('GetChangeLogRecIDs', EntityName, StartDtm, ToDtm, UserId)
|
||||
If Error_Services('NoError') then
|
||||
GoSub CreateHALCollection
|
||||
end else
|
||||
ErrorMsg = Error_Services('GetMessage')
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = RequesterIPAddr
|
||||
LogData<3> = ErrorMsg
|
||||
Logging_Services('AppendLog', objLogChangeLogAPI, LogData, @RM, @FM)
|
||||
HTTP_Services('SetResponseStatus', 500, 'Error Getting change log records from change_log table.')
|
||||
end
|
||||
|
||||
end api
|
||||
|
||||
CreateHALCollection:
|
||||
hJsonCollection = ''
|
||||
hChangeLogArray = ''
|
||||
hChangeLogObj = ''
|
||||
hChangeLog = ''
|
||||
hChangeLogJson = ''
|
||||
Abort = False$
|
||||
If SRP_JSON(hJSONCollection, 'New', 'Object') then
|
||||
If SRP_JSON(hChangeLogArray, 'New', 'Array') then
|
||||
For each ChangeLogID in ChangeLogIDs using @VM setting fPos
|
||||
//rdsJSON = Rds_Services('ConvertRecordToJSON', rds, '' ,FullEndpointURL:'/':rds)
|
||||
ChangeLogJson = Change_Log_Services('ConvertRecordToJSON', ChangeLogID)
|
||||
If Error_Services('NoError') then
|
||||
If (SRP_JSON(hChangeLog, 'Parse', ChangeLogJson) EQ '') then
|
||||
SRP_JSON(hChangeLogArray, 'Add', hChangeLog)
|
||||
SRP_JSON(hChangeLog, 'Release')
|
||||
end
|
||||
end else
|
||||
Abort = True$
|
||||
end
|
||||
Until Abort
|
||||
Next rds
|
||||
If Abort EQ False$ then
|
||||
SRP_JSON(hJSONCollection, 'Set', 'ChangeLogRecords', hChangeLogArray)
|
||||
end
|
||||
SRP_JSON(hChangeLogArray, 'Release')
|
||||
end
|
||||
JSONCollection = SRP_JSON(hJSONCollection, 'Stringify', 'Styled')
|
||||
SRP_JSON(hJSONCollection, 'Release')
|
||||
HTTP_Services('SetResponseHeaderField', 'Content-Location', FullEndpointURL)
|
||||
HTTP_Services('SetResponseBody', JSONCollection, False$, 'application/hal+json')
|
||||
HTTP_Services('SetResponseStatus', 200)
|
||||
end
|
||||
|
||||
return
|
||||
|
@ -75,4 +75,3 @@ Bail:
|
||||
END
|
||||
|
||||
|
||||
|
||||
|
@ -7,69 +7,221 @@ FUNCTION CHANGE_LOG_SERVICES(@Service, @Params)
|
||||
$Insert LOGICAL
|
||||
$insert SERVICE_SETUP
|
||||
$Insert REVDOTNETEQUATES
|
||||
$Insert CHANGE_LOG_EQUATES
|
||||
$Insert APP_INSERTS
|
||||
|
||||
EQU COMMA$ to ','
|
||||
|
||||
Declare function Repository, Get_Repos_Entities, SRP_DateTime, SRP_Array, Get_Status, Set_Status, Errmsg, Datetime
|
||||
Declare subroutine Set_Status, Errmsg, Error_Services
|
||||
Declare Function Database_Services
|
||||
Declare Function Environment_Services
|
||||
|
||||
|
||||
|
||||
Declare subroutine Set_Status, Errmsg, Error_Services, Database_Services, Btree.Extract, Logging_Services, Change_Log_Services, SRP_Json
|
||||
Declare Function Database_Services, Rti_Createguid, Logging_Services
|
||||
Declare Function Environment_Services, SRP_Path, SRP_Json
|
||||
|
||||
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\Archive\Change_Log'
|
||||
LogDate = Oconv(Date(), 'D4/')
|
||||
LogTime = Oconv(Time(), 'MTS')
|
||||
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' ChangeLogArchiveService.csv'
|
||||
Headers = 'Logging DTM' : @FM : 'Message' : @FM : 'Record ID' : @FM : 'Record Date'
|
||||
objLogChangeLogArchive = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$)
|
||||
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
|
||||
|
||||
GoToService else
|
||||
Error_Services('Add', Service : ' is not a valid service request within the ' : ServiceModule : ' services module.')
|
||||
end
|
||||
Return Response OR ''
|
||||
|
||||
//Write to sharepoint
|
||||
Service WriteToSharePoint()
|
||||
Service WriteChangeLog()
|
||||
hSysLists = Database_Services('GetTableHandle', 'SYSLISTS')
|
||||
Lock hSysLists, ServiceKeyID then
|
||||
//Define the dotNet version
|
||||
DotNetHandle = StartDotNet("","4.0")
|
||||
|
||||
//Specify the DLL
|
||||
rv = Set_Property.NET(DotNetHandle, "AssemblyName", "D:\Apps\OICurrent\IFXAPI\SharePoint\SharePointTools.dll")
|
||||
|
||||
//Create_Class.NET(//Define the classes
|
||||
SPApi = Create_Class.NET(DotNetHandle, "SharePointTools.ExportToSharePoint", 0)
|
||||
|
||||
//Set report start time to the past 30 minutes.
|
||||
StartDateTime = Datetime()
|
||||
StartDateTime = SRP_DateTime("AddMinutes", StartDateTime, -15)
|
||||
//StartDateTime = SRP_DateTime('AddDays', StartDateTime, -7)
|
||||
|
||||
//Pull in a list of all existing entities
|
||||
AllEntityIDs = Get_Repos_Entities('LSL2', '', '', 0, 1, 0, '')
|
||||
EntityList = ''
|
||||
|
||||
Server = Environment_Services('GetServer')
|
||||
IF Server EQ 'MESSA005' then
|
||||
Environment = 'PROD'
|
||||
end else
|
||||
Environment = 'DEV'
|
||||
end
|
||||
|
||||
Environment = 'DEV'
|
||||
IF Server EQ 'MESSA005' OR Server EQ 'MESSA01EC' then Environment = 'PROD'
|
||||
For Each EntityID in AllEntityIDs using @FM
|
||||
|
||||
ChangeLogRec = ''
|
||||
Set_Status(0)
|
||||
statList = ''
|
||||
Entity = Repository('GET', EntityID)
|
||||
time = Entity<25>
|
||||
If time GE StartDateTime then
|
||||
time = OCONV(time,'DT4/^H')
|
||||
(application, entityType, entityClass, entityName) using '*' = EntityID
|
||||
updatedBy = Entity<26>
|
||||
IF entityType NE 'STPROCDBG' AND entityType NE 'STPROCEXE' then
|
||||
SharePointLog = Send_Message.NET(SPApi, "SendToList",time:@FM:application:@FM:entityType:@FM:entityClass:@FM:entityName:@FM:updatedBy:@FM:Environment, "System.String":@FM:"System.String":@FM:"System.String":@FM:"System.String":@FM:"System.String":@FM:"System.String":@FM:"System.String")
|
||||
(Application, EntityType, EntityClass, EntityName) using '*' = EntityID
|
||||
UpdatedBy = Entity<26>
|
||||
IF entityType EQ 'STPROC' then
|
||||
NewChangeLogRecID = Rti_Createguid()
|
||||
ChangeLogRec<CHANGE_LOG_CHANGE_DTM$> = Time
|
||||
ChangeLogRec<CHANGE_LOG_APPLICATION$> = Application
|
||||
ChangeLogRec<CHANGE_LOG_ENTITY_TYPE$> = EntityType
|
||||
ChangeLogRec<CHANGE_LOG_ENTITY_CLASS$> = EntityClass
|
||||
ChangeLogRec<CHANGE_LOG_ENTITY_NAME$> = EntityName
|
||||
ChangeLogRec<CHANGE_LOG_UPDATED_BY$> = UpdatedBy
|
||||
ChangeLogRec<CHANGE_LOG_ENVIRONMENT$> = Environment
|
||||
Database_Services('WriteDataRow', 'CHANGE_LOG',NewChangeLogRecID, ChangeLogRec, True$, False$, True$)
|
||||
end
|
||||
end
|
||||
test1='test'
|
||||
Next EntityID
|
||||
end
|
||||
Unlock hSysLists, ServiceKeyID else Null
|
||||
end service
|
||||
|
||||
Service GetChangeLogRecIDs(EntityName, StartDtm, EndDtm, UserId)
|
||||
//This will be the main entry point
|
||||
Table = 'CHANGE_LOG'
|
||||
Open 'DICT ':Table To @DICT then
|
||||
Query = ''
|
||||
If StartDtm NE '' then
|
||||
Query := 'CHANGE_DTM':@VM:'>=': StartDtm
|
||||
end else
|
||||
Query := 'CHANGE_DTM':@VM:'>0'; *Need a default value.
|
||||
end
|
||||
If EndDtm NE '' then
|
||||
Query<-1> = 'CHANGE_DTM':@VM:'<=': EndDtm
|
||||
end
|
||||
If EntityName NE '' then
|
||||
Query<-1> = 'ENTITY_NAME':@VM:EntityName
|
||||
end
|
||||
If UserId NE '' then
|
||||
Query<-1> = 'UPDATED_BY':@VM:UserId
|
||||
end
|
||||
KeyList = ''
|
||||
Option = ''
|
||||
Flag = ''
|
||||
Btree.Extract(Query, Table, @DICT, KeyList, Option, Flag)
|
||||
Response = KeyList
|
||||
end else
|
||||
Error_Services('Add', 'Error Opening CHANGE_LOG Dictionary')
|
||||
end
|
||||
end service
|
||||
|
||||
Service ArchiveChangeLogRecByDate(StartDTM)
|
||||
If StartDTM NE '' then
|
||||
Table = 'CHANGE_LOG'
|
||||
Open 'DICT ':Table To @DICT then
|
||||
Query = ''
|
||||
If StartDtm NE '' then
|
||||
Query := 'CHANGE_DTM':@VM:'<='StartDtm:@FM
|
||||
end
|
||||
KeyList = ''
|
||||
Option = ''
|
||||
Flag = ''
|
||||
Btree.Extract(Query, Table, @DICT, KeyList, Option, Flag)
|
||||
If KeyList NE '' then
|
||||
for each ChangeLogRecID in Keylist using @FM
|
||||
Change_Log_Services('ArchiveChangeLogRecById', ChangeLogRecID)
|
||||
If Error_Services('NoError') then
|
||||
Change_Log_Services('DeleteChangeLogRec', ChangeLogRecID)
|
||||
end else
|
||||
ErrMsg = Error_Services('GetMessage')
|
||||
Error_Services('Add', ErrMsg)
|
||||
end
|
||||
Next ChangeLogID
|
||||
end else
|
||||
ErrorMsg = 'No Change Log Keys found to archive.'
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = ErrorMsg
|
||||
LogData<3> = ''
|
||||
LogData<4> = ''
|
||||
Logging_Services('AppendLog', objLogChangeLogArchive, LogData, @RM, @FM)
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'Error Opening CHANGE_LOG Dictionary')
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'Error Opening CHANGE_LOG Dictionary')
|
||||
end
|
||||
|
||||
end service
|
||||
|
||||
Service ArchiveChangeLogRecByID(ChangeLogRecID)
|
||||
//For now output the record to a CSV file on the HDD. Eventually right to SQL Server
|
||||
If RowExists('CHANGE_LOG', ChangeLogRecID) then
|
||||
ChangeLogRec = Database_Services('ReadDataRow', 'CHANGE_LOG', ChangeLogRecID)
|
||||
If Error_Services('NoError') then
|
||||
swap @VM with ',' in ChangeLogRec
|
||||
swap @FM with CRLF$ in ChangeLogRec
|
||||
ArchivePath = Environment_Services('GetApplicationRootPath') : '\Archive\CHANGE_LOG'
|
||||
FileName = ChangeLogRecID : '.csv'
|
||||
FullSavePath = ArchivePath : '\' : FileName
|
||||
OSWrite ChangeLogRec To FullSavePath
|
||||
If SRP_Path('Exists', FullSavePath) then
|
||||
SuccessMsg = 'Successfully saved CHANGE_LOG archive record.'
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = SuccessMsg
|
||||
LogData<3> = ChangeLogRecID
|
||||
LogData<4> = ''
|
||||
Logging_Services('AppendLog', objLogChangeLogArchive, LogData, @RM, @FM)
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end else
|
||||
ErrorMsg = 'Attempt to archive CHANGE_LOG record ' : ChangeLogRecID : ' failed. Error verifying archived file.'
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = ErrorMsg
|
||||
LogData<3> = ChangeLogRecID
|
||||
LogData<4> = ''
|
||||
Logging_Services('AppendLog', objLogChangeLogArchive, LogData, @RM, @FM)
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Attempt to archive CHANGE_LOG record ' : ChangeLogRecID : ' failed. Error while attempting to read record.'
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = ErrorMsg
|
||||
LogData<3> = ChangeLogRecID
|
||||
LogData<4> = ''
|
||||
Logging_Services('AppendLog', objLogChangeLogArchive, LogData, @RM, @FM)
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
end else
|
||||
ErrorMsg = 'Attempt to archive CHANGE_LOG record ' : ChangeLogRecID : ' failed. Record does not exist.'
|
||||
LogData = ''
|
||||
LogData<1> = LoggingDTM
|
||||
LogData<2> = ErrorMsg
|
||||
LogData<3> = ChangeLogRecID
|
||||
LogData<4> = ''
|
||||
Logging_Services('AppendLog', objLogChangeLogArchive, LogData, @RM, @FM)
|
||||
Error_Services('Add', ErrorMsg)
|
||||
end
|
||||
end service
|
||||
|
||||
Service DeleteChangeLogRec(ChangeLogRecID)
|
||||
|
||||
end service
|
||||
|
||||
Service ConvertRecordToJson(ChangeLogRecID)
|
||||
|
||||
JSON = ''
|
||||
If ChangeLogRecID NE '' then
|
||||
If RowExists('CHANGE_LOG', ChangeLogRecID) then
|
||||
ChangeLogRec = Database_Services('ReadDataRow', 'CHANGE_LOG', ChangeLogRecID)
|
||||
objChangeLog = ''
|
||||
objJson = ''
|
||||
If SRP_JSON(objJson, 'New', 'Object') then
|
||||
SRP_JSON(objJson, 'SetValue', 'CHANGE_DTM', OConv(ChangeLogRec<CHANGE_LOG_CHANGE_DTM$>, 'DT'))
|
||||
SRP_JSON(objJson, 'SetValue', 'APPLICATION', ChangeLogRec<CHANGE_LOG_APPLICATION$>)
|
||||
SRP_JSON(objJson, 'SetValue', 'ENTITY_TYPE', ChangeLogRec<CHANGE_LOG_ENTITY_TYPE$>)
|
||||
SRP_JSON(objJson, 'SetValue', 'ENTITY_CLASS', ChangeLogRec<CHANGE_LOG_ENTITY_CLASS$>)
|
||||
SRP_JSON(objJson, 'SetValue', 'ENTITY_NAME', ChangeLogRec<CHANGE_LOG_ENTITY_NAME$>)
|
||||
SRP_JSON(objJson, 'SetValue', 'UPDATED_BY', ChangeLogRec<CHANGE_LOG_UPDATED_BY$>)
|
||||
SRP_JSON(objJson, 'SetValue', 'ENVIRONMENT', ChangeLogRec<CHANGE_LOG_ENVIRONMENT$>)
|
||||
SRP_JSON(objJson, 'Set', 'ChangeLogRec', objChangeLog)
|
||||
JSON = SRP_JSON(objJson, 'Stringify', 'Styled')
|
||||
SRP_JSON(objJson, 'Release')
|
||||
end else
|
||||
Error_Services('Add', 'Error in Change_Log_Services -> ConvertRecordToJson : Error Creating Json object')
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'Error in Change_Log_Services -> ConvertRecordToJson : Change_Log with record with ID ' : ChangeLogRecID : ' did not exist ')
|
||||
end
|
||||
end else
|
||||
Error_Services('Add', 'Error in Change_Log_Services -> ConvertRecordToJson : Null Change_Log ID passed into routine')
|
||||
end
|
||||
Response = JSON
|
||||
end service
|
||||
|
||||
|
||||
|
||||
|
@ -137,4 +137,3 @@ RETURN
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -153,4 +153,3 @@ end service
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -22,4 +22,3 @@ if xlate( 'NOTE_PTRS', @user4, 'NEW_MESSAGES', 'X' ) then
|
||||
end
|
||||
Return 0
|
||||
|
||||
|
||||
|
@ -12,18 +12,21 @@ COMPILE FUNCTION Clean_Insp(EntID,Event,Parm1,Parm2,Parm3,Parm4,Parm5)
|
||||
and SignScan subroutines
|
||||
04/23/2021 - djs - Updated SIGN_ROTR_ACCEPTANCE.CLICK event to not block acceptance signatures when a 100%
|
||||
failure scan is required.
|
||||
05/13/2024 - djs - Replaced Ole Tab control (OLE_TAB_ROTR) with a groupbox control (ROTR_GROUP) to mitigate
|
||||
form behavior bugs in OI 10 post migration.
|
||||
06/13/2024 djm Add new stage-specific supplement system.
|
||||
*/
|
||||
|
||||
DECLARE SUBROUTINE Set_Property, End_Dialog, Send_Event, Set_Status, Center_Window, Post_Event, Comm_RDS
|
||||
DECLARE SUBROUTINE ErrMsg, Send_Message, Set_Property, Send_Event, Btree.Extract, obj_AppWindow, Signature_Services
|
||||
DECLARE SUBROUTINE obj_Notes, Security_Err_Msg, End_Window, Forward_Event, Start_Window, Create_Note
|
||||
DECLARE SUBROUTINE obj_WO_Mat_Log, obj_WO_Mat, obj_Clean_Insp, Unlock, Lock, Database_Services, Yield
|
||||
DECLARE SUBROUTINE Override_Log_Services, Dialog_Box, obj_WO_Wfr
|
||||
DECLARE SUBROUTINE Override_Log_Services, Dialog_Box, obj_WO_Wfr, Error_Services
|
||||
|
||||
DECLARE FUNCTION Get_Property, Get_Status, Dialog_Box, Utility, Popup, Collect.Ixvals, Environment_Services
|
||||
DECLARE FUNCTION Send_Message, Msg, Security_Check, obj_React_Run_CI, Select_Into, MemberOf, Database_Services
|
||||
DECLARE FUNCTION Start_Window, Create_Dialog, Database_Services, Set_Property, Error_Services, SRP_DateTime
|
||||
DECLARE FUNCTION obj_NCR, SRP_Array
|
||||
DECLARE FUNCTION obj_NCR, SRP_Array, Supplement_Services
|
||||
|
||||
$INSERT LOGICAL
|
||||
$INSERT MSG_EQUATES
|
||||
@ -67,19 +70,19 @@ EQU COL$INSP_SPEC_SPOTS TO 9
|
||||
EQU COL$INSP_SPEC_FOV TO 10
|
||||
EQU COL$INSP_SPEC_BL_DEFECTS TO 11
|
||||
|
||||
EQU COL$INSP_TOOL TO 2 ;* Added INSP_TOOL column 10/29/2012 JCH
|
||||
EQU COL$INSP_LPD TO 3
|
||||
EQU COL$INSP_SCRATCHES TO 4
|
||||
EQU COL$INSP_SCRATCH_LEN TO 5
|
||||
EQU COL$INSP_PITS TO 6
|
||||
EQU COL$INSP_MOUNDS TO 7
|
||||
EQU COL$INSP_STACK_FAULTS TO 8
|
||||
EQU COL$INSP_SPIKES TO 9
|
||||
EQU COL$INSP_SPOTS TO 10
|
||||
EQU COL$INSP_FOV TO 11
|
||||
EQU COL$INSP_BL_DEFECTS TO 12
|
||||
EQU COL$INSP_SIG TO 13
|
||||
EQU COL$INSP_SIG_DTM TO 14
|
||||
EQU COL$INSP_TOOL TO 2 ;* Added INSP_TOOL column 10/29/2012 JCH
|
||||
EQU COL$INSP_LPD TO 3
|
||||
EQU COL$INSP_SCRATCHES TO 4
|
||||
EQU COL$INSP_SCRATCH_LEN TO 5
|
||||
EQU COL$INSP_PITS TO 6
|
||||
EQU COL$INSP_MOUNDS TO 7
|
||||
EQU COL$INSP_STACK_FAULTS TO 8
|
||||
EQU COL$INSP_SPIKES TO 9
|
||||
EQU COL$INSP_SPOTS TO 10
|
||||
EQU COL$INSP_FOV TO 11
|
||||
EQU COL$INSP_BL_DEFECTS TO 12
|
||||
EQU COL$INSP_SIG TO 13
|
||||
EQU COL$INSP_SIG_DTM TO 14
|
||||
|
||||
EQU COL$INSP_SPEC_BSIDE_SCRATCHES TO 1
|
||||
EQU COL$INSP_SPEC_BSIDE_SCRATCH_LEN TO 2
|
||||
@ -159,19 +162,18 @@ BEGIN CASE
|
||||
CASE Event[1,3] = 'QBF' ; GOSUB Refresh
|
||||
END CASE
|
||||
|
||||
CASE EntID = @WINDOW:'.SIGN_CLEAN' AND Event = 'CLICK' ; GOSUB SignClean
|
||||
CASE EntID = @WINDOW:'.SIGN_INSP' AND Event = 'CLICK' ; GOSUB SignInsp
|
||||
CASE EntID = @WINDOW:'.SIGN_SCAN' AND Event = 'CLICK' ; GOSUB SignScan
|
||||
CASE EntID = @WINDOW:'.SIGN_ROTR_ACCEPTANCE' AND Event = 'CLICK' ; GOSUB SIGN_ROTR_ACCEPTANCE.CLICK
|
||||
CASE EntID = @WINDOW:'.BTN_WAFER_DETAILS' AND Event = 'CLICK' ; GOSUB BTN_WAFER_DETAILS.CLICK
|
||||
CASE EntID = @WINDOW:'.SCAN_RESULTS' AND Event = 'CHAR' ; GOSUB SCAN_RESULTS.CHAR
|
||||
CASE EntID = @WINDOW:'.SCAN_RESULTS' AND Event = 'POSCHANGED'; GOSUB SCAN_RESULTS.POSCHANGED
|
||||
CASE EntID = @WINDOW:'.SPEC_BRIGHTLIGHT' AND Event = 'CLICK' ; GOSUB Refresh
|
||||
CASE EntID = @WINDOW:'.SPEC_MICROSCOPE' AND Event = 'CLICK' ; GOSUB Refresh
|
||||
CASE EntID = @WINDOW:'.CHK_EDGE' AND Event = 'CLICK' ; GOSUB Refresh
|
||||
CASE EntID = @WINDOW:'.REFRESH_SPEC' AND Event = 'CLICK' ; GOSUB RefreshSpec
|
||||
CASE EntID = @WINDOW:'.CI_TAB' AND Event = 'CLICK' ; GOSUB Page
|
||||
*CASE FIELD(EntID,'.',2) = 'ROTR_ACTION' AND Event = 'CLICK' ; GOSUB Refresh
|
||||
CASE EntID = @WINDOW:'.SIGN_CLEAN' AND Event = 'CLICK' ; GOSUB SignClean
|
||||
CASE EntID = @WINDOW:'.SIGN_INSP' AND Event = 'CLICK' ; GOSUB SignInsp
|
||||
CASE EntID = @WINDOW:'.SIGN_SCAN' AND Event = 'CLICK' ; GOSUB SignScan
|
||||
CASE EntID = @WINDOW:'.SIGN_ROTR_ACCEPTANCE' AND Event = 'CLICK' ; GOSUB SIGN_ROTR_ACCEPTANCE.CLICK
|
||||
CASE EntID = @WINDOW:'.BTN_WAFER_DETAILS' AND Event = 'CLICK' ; GOSUB BTN_WAFER_DETAILS.CLICK
|
||||
CASE EntID = @WINDOW:'.SCAN_RESULTS' AND Event = 'CHAR' ; GOSUB SCAN_RESULTS.CHAR
|
||||
CASE EntID = @WINDOW:'.SCAN_RESULTS' AND Event = 'POSCHANGED' ; GOSUB SCAN_RESULTS.POSCHANGED
|
||||
CASE EntID = @WINDOW:'.SPEC_BRIGHTLIGHT' AND Event = 'CLICK' ; GOSUB Refresh
|
||||
CASE EntID = @WINDOW:'.SPEC_MICROSCOPE' AND Event = 'CLICK' ; GOSUB Refresh
|
||||
CASE EntID = @WINDOW:'.CHK_EDGE' AND Event = 'CLICK' ; GOSUB Refresh
|
||||
CASE EntID = @WINDOW:'.REFRESH_SPEC' AND Event = 'CLICK' ; GOSUB RefreshSpec
|
||||
CASE EntID = @WINDOW:'.CI_TAB' AND Event = 'CLICK' ; GOSUB Page
|
||||
CASE EntID = @WINDOW:'.INSP_RESULTS' AND Event = 'POSCHANGED' ; GOSUB InspPC
|
||||
CASE EntID = @WINDOW:'.INSP_RESULTS_BSIDE' AND Event = 'POSCHANGED' ; GOSUB BSideInspPC
|
||||
|
||||
@ -218,7 +220,7 @@ Create:
|
||||
CleanStyles<COL$CLEAN_SRD_NO> = BitOr(CleanStyles<COL$CLEAN_SRD_NO>,DTCS_DROPDOWN$)
|
||||
|
||||
Send_Message(@WINDOW:'.CLEAN_RESULTS','COLSTYLE',0,CleanStyles) ;* Set Styles
|
||||
|
||||
|
||||
* Setup Inspection Section
|
||||
|
||||
InspStyles = Send_Message(@WINDOW:'.INSP_RESULTS','COLSTYLE',0,'')
|
||||
@ -227,9 +229,6 @@ Create:
|
||||
|
||||
Send_Message(@WINDOW:'.INSP_RESULTS','COLSTYLE',0,InspStyles)
|
||||
|
||||
* InspTools = XLATE('TOOL_CLASS','MICROSCOPE',TOOL_CLASS_TOOL$,'X') ;* Microscope class tools
|
||||
* InspTools := @VM:XLATE('TOOL_CLASS','BRIGHTLIGHT',TOOL_CLASS_TOOL$,'X') ;* Brightlight tools
|
||||
* InspTools := @VM:Xlate('TOOL_CLASS', 'FF/LIGHT', TOOL_CLASS_TOOL$, 'X') ;* Edge inspection tools
|
||||
InspTools = 'SCOPE':@VM:'FF EDGE INSP':@VM:'SCOPE/FF EDGE INSP'
|
||||
|
||||
Send_Message(@WINDOW:'.INSP_RESULTS','COLFORMAT',COL$INSP_TOOL,InspTools)
|
||||
@ -253,17 +252,11 @@ Create:
|
||||
Set_Property(@WINDOW:'.REFRESH_SPEC','VISIBLE',0)
|
||||
END
|
||||
|
||||
Ctrl = @Window : '.OLE_TAB_ROTR'
|
||||
Set_Property(Ctrl, 'OLE.AllowXPTheme', 0)
|
||||
|
||||
CIKey = Get_Property(@Window : '.CI_NO', 'TEXT')
|
||||
ReactorNo = Xlate('CLEAN_INSP', CIKey, 'REACT_NO', 'X')
|
||||
|
||||
// ROTR Development Code - 12/03/18 - djs --------------------------------------------------------------------------
|
||||
Stage = Get_Property(@Window : '.STAGE', 'TEXT')
|
||||
If Stage EQ 'LWI' then
|
||||
* ROTREnabled = Xlate('REACTOR', ReactorNo, 'ENABLE_ROTR', 'X')
|
||||
* If (ROTREnabled EQ True$) then
|
||||
CanEdit = Memberof(@USER4, 'ENGINEERING') or Memberof(@USER4, 'LEAD') or Memberof(@USER4, 'SUPERVISOR') |
|
||||
or Memberof(@USER4, 'FINAL_QA') or Memberof(@USER4, 'ROTR_OVERRIDE')
|
||||
// Check if manual entry lock is temporarily disabled for all users due to ROTR queue overflow.
|
||||
@ -281,11 +274,8 @@ Create:
|
||||
ScanStyles<COL$SCAN_TOOL> = BitAnd(ScanStyles<COL$SCAN_TOOL>, BitNot(DTCS_DROPDOWN$) )
|
||||
ScanStyles = Send_Message(@Window : '.SCAN_RESULTS', 'COLSTYLE', 0, ScanStyles)
|
||||
end
|
||||
* end
|
||||
end
|
||||
|
||||
* GOSUB Refresh
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
@ -319,9 +309,10 @@ Clear:
|
||||
Send_Event(@WINDOW,'PAGE',1)
|
||||
|
||||
|
||||
* * * * * * *
|
||||
* * * * * * *
|
||||
Refresh:
|
||||
* * * * * * *
|
||||
|
||||
CIKey = Get_Property(@WINDOW:'.CI_NO', 'TEXT')
|
||||
// Hide or show the Cass No label and edit line based on the whether the reactor is EpiPro or not. - 04/10/2018 - dmb
|
||||
WONo = Get_Property(@Window : '.WO_NO', 'TEXT')
|
||||
@ -337,27 +328,8 @@ Refresh:
|
||||
|
||||
Stage = Get_Property(@WINDOW:'.STAGE','TEXT')
|
||||
|
||||
Ctrls = @WINDOW:'.ROTR_GROUP':@RM ; Props = 'VISIBLE':@RM
|
||||
Ctrls := @WINDOW:'.ROTR_ACTION':@RM ; Props := 'VISIBLE':@RM
|
||||
*Ctrls := @WINDOW:'.ROTR_ACTION.NONE':@RM ; Props := 'VISIBLE':@RM
|
||||
*Ctrls := @WINDOW:'.ROTR_ACTION.PASS':@RM ; Props := 'VISIBLE':@RM
|
||||
*Ctrls := @WINDOW:'.ROTR_ACTION.FAIL':@RM ; Props := 'VISIBLE':@RM
|
||||
*Ctrls := @WINDOW:'.ROTR_ACTION.WAIVED':@RM ; Props := 'VISIBLE':@RM
|
||||
Ctrls := @WINDOW:'.SURF_SCAN_GROUP' ; Props := 'TEXT'
|
||||
|
||||
IF Stage = 'LWI' THEN
|
||||
Vals = STR('1':@RM,5)
|
||||
Vals := 'Surface Scan / ROTR'
|
||||
END ELSE
|
||||
Vals = STR('0':@RM,5)
|
||||
Vals := 'Surface Scan'
|
||||
END
|
||||
|
||||
* Set_Property(Ctrls,Props,Vals)
|
||||
|
||||
* * * * *
|
||||
|
||||
|
||||
Ctrls = @WINDOW:'.STAGE':@RM ; Props = 'TEXT':@RM
|
||||
Ctrls := @WINDOW:'.SPEC_FWI_LWI':@RM ; Props := 'TEXT':@RM
|
||||
Ctrls := @WINDOW:'.SPEC_CLEAN_TOOL_REP':@RM ; Props := 'DEFPROP':@RM
|
||||
@ -395,55 +367,6 @@ Refresh:
|
||||
SpecCleanTools[-1,1] = ''
|
||||
REPEAT
|
||||
|
||||
/*
|
||||
InspSpecStyles = Send_Message(@WINDOW:'.SPEC_INSP','COLSTYLE',0,'')
|
||||
InspStyles = Send_Message(@WINDOW:'.INSP_RESULTS','COLSTYLE',0,'')
|
||||
|
||||
IF SpecBrightlight = 1 THEN
|
||||
FOR Col = COL$INSP_SPEC_LPD TO COL$INSP_SPEC_SCRATCH_LEN
|
||||
InspSpecStyles<Col> = BitAnd(InspSpecStyles<Col>,BitNot(HIDDEN$)) ;* Show Specs
|
||||
NEXT Col
|
||||
FOR Col = COL$INSP_LPD TO COL$INSP_SCRATCH_LEN
|
||||
InspStyles<Col> = BitAnd(InspStyles<Col>, BitNot(HIDDEN$)) ;* Show Results
|
||||
NEXT Col
|
||||
|
||||
|
||||
END ELSE
|
||||
FOR Col = COL$INSP_SPEC_LPD TO COL$INSP_SPEC_SCRATCH_LEN
|
||||
InspSpecStyles<Col> = BitOr(InspSpecStyles<Col>,HIDDEN$) ;* Hide Specs
|
||||
NEXT Col
|
||||
FOR Col = COL$INSP_LPD TO COL$INSP_SCRATCH_LEN
|
||||
InspStyles<Col> = BitOr(InspStyles<Col>, HIDDEN$) ;* Hide Results
|
||||
NEXT Col
|
||||
END
|
||||
|
||||
IF SpecMicroscope = 1 THEN
|
||||
|
||||
FOR Col = COL$INSP_SPEC_PITS TO COL$INSP_SPEC_BL_DEFECTS
|
||||
InspSpecStyles<Col> = BitAnd(InspSpecStyles<Col>,BitNot(HIDDEN$))
|
||||
NEXT Col
|
||||
|
||||
FOR Col = COL$INSP_PITS TO COL$INSP_BL_DEFECTS
|
||||
InspStyles<Col> = BitAnd(InspStyles<Col>, BitNot(HIDDEN$))
|
||||
NEXT Col
|
||||
|
||||
END ELSE
|
||||
|
||||
FOR Col = COL$INSP_SPEC_PITS TO COL$INSP_SPEC_BL_DEFECTS
|
||||
InspSpecStyles<Col> = BitOr(InspSpecStyles<Col>,HIDDEN$)
|
||||
NEXT Col
|
||||
|
||||
FOR Col = COL$INSP_PITS TO COL$INSP_BL_DEFECTS
|
||||
InspStyles<Col> = BitOr(InspStyles<Col>, HIDDEN$)
|
||||
NEXT Col
|
||||
|
||||
END
|
||||
|
||||
|
||||
Send_Message(@WINDOW:'.SPEC_INSP','COLSTYLE',0,InspSpecStyles)
|
||||
Send_Message(@WINDOW:'.INSP_RESULTS','COLSTYLE',0,InspStyles)
|
||||
*/
|
||||
|
||||
ScanRecipes = Get_Property(@WINDOW:'.SPEC_SURFSCAN','ARRAY')<COL$SCAN_SPEC_SURF_RECIPE$> ;* 1/22/2013 JCH ***********
|
||||
Send_Message(@WINDOW:'.SCAN_RESULTS','COLFORMAT',COL$SCAN_RECIPE,ScanRecipes)
|
||||
|
||||
@ -469,9 +392,7 @@ Refresh:
|
||||
CASE 1 ; LabelText = 'Cleaning && Inspection'
|
||||
END CASE
|
||||
Set_Property(@WINDOW:'.WINDOW_LABEL_FIX','TEXT',LabelText)
|
||||
|
||||
|
||||
|
||||
|
||||
Ctrls = @WINDOW:'.SPEC_CLEAN_SUBOXIDE':@RM ; Props = 'CHECK':@RM
|
||||
Ctrls := @WINDOW:'.SPEC_CLEAN_TOOL':@RM ; Props := 'TEXT':@RM
|
||||
Ctrls := @WINDOW:'.SPEC_CLEAN_AKRION_RECIPE':@RM ; Props := 'TEXT':@RM
|
||||
@ -531,7 +452,6 @@ Refresh:
|
||||
InspReq = Xlate('CLEAN_INSP', CIKey, 'INSP_REQ', 'X')
|
||||
end
|
||||
|
||||
* InspReq = Xlate('CLEAN_INSP', CIKey, 'INSP_REQ', 'X')
|
||||
If InspReq EQ False$ then
|
||||
Set_Property(@WINDOW:'.INSP_RESULT_GROUP', 'TEXT', 'Visual Inspection Not Required')
|
||||
end
|
||||
@ -552,65 +472,23 @@ Refresh:
|
||||
|
||||
ReqBackColor = CI_GROUP_BLUE$
|
||||
|
||||
IF CleanSigReq THEN
|
||||
Vals = 1:@RM:STR(ReqBackColor:@RM,6)
|
||||
END ELSE
|
||||
Vals = 1:@RM:STR(DefBack:@RM,6)
|
||||
END
|
||||
|
||||
IF InspSigReq THEN
|
||||
Vals := 1:@RM:STR(ReqBackColor:@RM,5)
|
||||
END ELSE
|
||||
Vals := 1:@RM:STR(DefBack:@RM,5)
|
||||
END
|
||||
|
||||
IF SurfScanSigReq THEN
|
||||
Vals := 1:@RM:STR(ReqBackColor:@RM,2)
|
||||
END ELSE
|
||||
Vals := 1:@RM:STR(DefBack:@RM,2)
|
||||
END
|
||||
|
||||
IF Vals[-1,1] = @RM THEN Vals[-1,1] = ''
|
||||
|
||||
Ctrls = @WINDOW:'.CLEANS_GROUP':@RM ; Props = 'ENABLED':@RM
|
||||
Ctrls := @WINDOW:'.CLEANS_GROUP':@RM ; Props := 'BACKCOLOR':@RM
|
||||
Ctrls := @WINDOW:'.CLEAN_RESULTS_GROUP':@RM ; Props := 'BACKCOLOR':@RM
|
||||
Ctrls := @WINDOW:'.SPEC_CLEAN_REQ':@RM ; Props := 'BACKCOLOR':@RM
|
||||
Ctrls := @WINDOW:'.SPEC_CLEAN_SUBOXIDE':@RM ; Props := 'BACKCOLOR':@RM
|
||||
Ctrls := @WINDOW:'.SPEC_CLEAN_TOOL_LABEL':@RM ; Props := 'BACKCOLOR':@RM
|
||||
Ctrls := @WINDOW:'.SPEC_CLEAN_RECIPE_LABEL':@RM ; Props := 'BACKCOLOR':@RM
|
||||
|
||||
Ctrls := @WINDOW:'.INSP_RESULT_GROUP':@RM ; Props := 'ENABLED':@RM
|
||||
Ctrls := @WINDOW:'.INSP_RESULT_GROUP':@RM ; Props := 'BACKCOLOR':@RM
|
||||
Ctrls := @WINDOW:'.SPEC_INSP_REQ':@RM ; Props := 'BACKCOLOR':@RM ;* Checkbox
|
||||
Ctrls := @WINDOW:'.SPEC_BRIGHTLIGHT':@RM ; Props := 'BACKCOLOR':@RM ;* Checkbox (currently hidden and not used)
|
||||
Ctrls := @WINDOW:'.SPEC_MICROSCOPE':@RM ; Props := 'BACKCOLOR':@RM ;* Checkbox
|
||||
Ctrls := @WINDOW:'.CHK_EDGE':@RM ; Props := 'BACKCOLOR':@RM ;* Checkbox
|
||||
Ctrls := @WINDOW:'.BACKSIDE_LABEL':@RM ; Props := 'BACKCOLOR':@RM ;* Backside Label
|
||||
|
||||
Ctrls := @WINDOW:'.SURF_SCAN_GROUP':@RM ; Props := 'ENABLED':@RM
|
||||
Ctrls := @WINDOW:'.SURF_SCAN_GROUP':@RM ; Props := 'BACKCOLOR':@RM
|
||||
Ctrls := @WINDOW:'.SPEC_SURFSCAN_REQ' ; Props := 'BACKCOLOR'
|
||||
|
||||
Set_Property(Ctrls,Props,Vals)
|
||||
|
||||
* ROTR 2/1/2012
|
||||
|
||||
RotrAction = Get_Property(@WINDOW:'.ROTR_ACTION','TEXT')
|
||||
|
||||
BEGIN CASE
|
||||
CASE RotrAction = 'Passed'
|
||||
RBackColor = GREEN$ ;*LS1_GREEN$
|
||||
BypassEnabled = False$
|
||||
RBackColor = GREEN$ ;*LS1_GREEN$
|
||||
BypassEnabled = False$
|
||||
CASE RotrAction = 'Failed'
|
||||
RBackColor = RED$
|
||||
BypassEnabled = MemberOf(@USER4, 'ENGINEERING') OR MemberOf(@USER4, 'LEAD') OR MemberOf(@USER4, 'SUPERVISOR') OR MemberOf(@USER4, 'OI_ADMIN') OR MemberOf(@USER4, 'ROTR_OVERRIDE')
|
||||
RBackColor = RED$
|
||||
BypassEnabled = MemberOf(@USER4, 'ENGINEERING') OR MemberOf(@USER4, 'LEAD') OR MemberOf(@USER4, 'SUPERVISOR') OR MemberOf(@USER4, 'OI_ADMIN') OR MemberOf(@USER4, 'ROTR_OVERRIDE')
|
||||
CASE RotrAction = 'Waived'
|
||||
RBackColor = YELLOW$ ;*CMB_YELLOW$
|
||||
BypassEnabled = False$
|
||||
RBackColor = YELLOW$ ;*CMB_YELLOW$
|
||||
BypassEnabled = False$
|
||||
CASE RotrAction = 'Accepted'
|
||||
RBackColor = ORANGE$
|
||||
BypassEnabled = False$
|
||||
RBackColor = ORANGE$
|
||||
BypassEnabled = False$
|
||||
CASE 1
|
||||
IF SurfScanSigReq THEN
|
||||
RBackColor = ReqBackColor
|
||||
@ -620,17 +498,15 @@ Refresh:
|
||||
BypassEnabled = False$
|
||||
END CASE
|
||||
|
||||
Ctrls = @WINDOW:'.ROTR_GROUP':@FM ; Props = 'BACKCOLOR':@FM ; Vals = RBackColor:@FM
|
||||
Ctrls = @WINDOW:'.OLE_TAB_ROTR':@FM ; Props = 'OLE.CustomPaneColor':@FM ; Vals = RBackColor:@FM
|
||||
* Ctrls := @WINDOW:'.ROTR_ACTION':@FM ; Props := 'BACKCOLOR':@FM ; Vals := RBackColor:@FM
|
||||
* Ctrls := @WINDOW:'.ROTR_ACTION.NONE':@FM ; Props := 'BACKCOLOR':@FM ; Vals := RBackColor:@FM
|
||||
* Ctrls := @WINDOW:'.ROTR_ACTION.PASS':@FM ; Props := 'BACKCOLOR':@FM ; Vals := RBackColor:@FM
|
||||
* Ctrls := @WINDOW:'.ROTR_ACTION.FAIL':@FM ; Props := 'BACKCOLOR':@FM ; Vals := RBackColor:@FM
|
||||
* Ctrls := @WINDOW:'.ROTR_ACTION.WAIVED':@FM ; Props := 'BACKCOLOR':@FM ; Vals := RBackColor:@FM
|
||||
Ctrls := @WINDOW:'.ROTR_ACTION':@FM ; Props := 'ENABLED':@FM ; Vals := 0:@FM
|
||||
Ctrls := @WINDOW:'.EDL_ROTR_REASON':@FM ; Props := 'ENABLED':@FM ; Vals := 0:@FM
|
||||
Ctrls := @WINDOW:'.SIGN_ROTR_ACCEPTANCE':@FM ; Props := 'ENABLED':@FM ; Vals := BypassEnabled:@FM
|
||||
Ctrls := @WINDOW ; Props := 'REDRAW' ; Vals := 1
|
||||
Ctrls = @WINDOW:'.ROTR_STATUS_LABEL':@FM ; Props = 'BACKCOLOR':@FM ; Vals = RBackColor:@FM
|
||||
Ctrls := @WINDOW:'.ROTR_REASON_LABEL':@FM ; Props := 'BACKCOLOR':@FM ; Vals := RBackColor:@FM
|
||||
Ctrls := @WINDOW:'.SIGN_ROTR_SIGNATURE_LABEL':@FM ; Props := 'BACKCOLOR':@FM ; Vals := RBackColor:@FM
|
||||
Ctrls := @WINDOW:'.SIGN_ROTR_REASON_LABEL':@FM ; Props := 'BACKCOLOR':@FM ; Vals := RBackColor:@FM
|
||||
Ctrls := @WINDOW:'.ROTR_GROUP':@FM ; Props := 'BACKCOLOR':@FM ; Vals := RBackColor:@FM
|
||||
Ctrls := @WINDOW:'.ROTR_ACTION':@FM ; Props := 'ENABLED':@FM ; Vals := 0:@FM
|
||||
Ctrls := @WINDOW:'.EDL_ROTR_REASON':@FM ; Props := 'ENABLED':@FM ; Vals := 0:@FM
|
||||
Ctrls := @WINDOW:'.SIGN_ROTR_ACCEPTANCE':@FM ; Props := 'ENABLED':@FM ; Vals := BypassEnabled:@FM
|
||||
Ctrls := @WINDOW ; Props := 'REDRAW' ; Vals := 1
|
||||
|
||||
Convert @FM to @RM in Ctrls
|
||||
Convert @FM to @RM in Props
|
||||
@ -638,8 +514,6 @@ Refresh:
|
||||
Set_Property(Ctrls,Props,Vals)
|
||||
Set_Property(@Window:'.OLE_PIC_ROTR', 'OLE.BackgroundColor', RBackColor)
|
||||
|
||||
*
|
||||
|
||||
IF Get_Property(@WINDOW:'.SPC_DTM','DEFPROP') = '' THEN
|
||||
Set_Property(@WINDOW:'.SEND_SPC','TEXT','Send to SPC')
|
||||
END ELSE
|
||||
@ -757,43 +631,6 @@ Refresh:
|
||||
SurfResults[COL1(),99] = ''
|
||||
REPEAT
|
||||
|
||||
/*
|
||||
OutOfSpec = 0 ;* Set Flag
|
||||
|
||||
|
||||
IF SSurfRecipes NE '' THEN
|
||||
ResCnt = COUNT(SurfResults,@FM) + (SurfResults NE '')
|
||||
|
||||
FOR I = 1 TO ResCnt
|
||||
ResRecipe = SurfResults<I,COL$SCAN_RECIPE>
|
||||
LOCATE ResRecipe IN SSurfRecipes USING @VM SETTING Pos THEN
|
||||
SSurfDefect = SSurfDefects<1,Pos>
|
||||
SSurfHaze = SSurfHazes<1,Pos>
|
||||
|
||||
* 8/9/2013 JCH - Added check for presence of Spec data before checking for out of spec condition
|
||||
|
||||
IF SSurfDefect NE '' THEN
|
||||
IF SurfResults<1,COL$SCAN_SUM_OF_DEF_AVG> > SSurfDefect THEN OutOfSpec = 1
|
||||
END
|
||||
|
||||
IF SSurfHaze NE '' THEN
|
||||
IF SurfResults<1,COL$SCAN_HAZE_AVG_AVG> > SSurfHaze THEN OutOfSpec = 1
|
||||
END
|
||||
END
|
||||
|
||||
NEXT I
|
||||
END
|
||||
|
||||
|
||||
|
||||
|
||||
IF OutOfSpec = 1 THEN
|
||||
Set_Property(@WINDOW:'.SCAN_RESULTS','BACKCOLOR',RED$)
|
||||
END ELSE
|
||||
Set_Property(@WINDOW:'.SCAN_RESULTS','BACKCOLOR',WHITE$)
|
||||
END
|
||||
*/
|
||||
|
||||
CurrRec = Get_Property(@Window, 'RECORD')
|
||||
ScanResults = CurrRec<CLEAN_INSP_SCAN_RESULT$>
|
||||
CtrlName = @WINDOW:'.SCAN_RESULTS'
|
||||
@ -830,8 +667,6 @@ Refresh:
|
||||
|
||||
Set_Property(Ctrls,Props,Vals)
|
||||
|
||||
|
||||
|
||||
* Turn edit table symbolic column backgrounds to green **************************************************
|
||||
|
||||
ETSymbolics = Get_Property(@WINDOW,'@ET_SYMBOLICS') ;* Loaded during 'Create' in obj_Appwindow
|
||||
@ -909,15 +744,6 @@ RETURN
|
||||
Delete:
|
||||
* * * * * * *
|
||||
|
||||
/*
|
||||
IF Security_Check('Order',Delete$) THEN
|
||||
Result = 1 ;* Proceed with delete
|
||||
END ELSE
|
||||
Security_Err_Msg('Order',Delete$)
|
||||
Result = 0 ;* Stop event chain
|
||||
END
|
||||
*/
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
@ -980,15 +806,25 @@ SignClean:
|
||||
|
||||
IF SigRow NE '' AND CtrlList<SelectedRow,COL$CLEAN_SIG> = '' THEN
|
||||
|
||||
If ( (SelectedRow EQ 1) and (ReactType NE 'EPP') ) then
|
||||
If SelectedRow EQ 1 then
|
||||
WOMatKey = WONo:'*':CassNo
|
||||
Signature_Services('CheckSigOrder', WOMatKey, SigStage)
|
||||
Signature_Services('CheckSigOrder', WOMatKey, SigStage, RDSNo)
|
||||
If Error_Services('HasError') then
|
||||
ErrMsg(Error_Services('GetMessage'))
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
// Add check for supplement signatures
|
||||
ValidStages = Supplement_Services('GetStagesForLot', 'RDS', RDSNo)
|
||||
If Count(ValidStages, SigStage) NE 0 then
|
||||
UnacknowledgedSupp = Supplement_Services('UnacknowledgedSupplementCheck', 'RDS', RDSNo, SigStage)
|
||||
If UnacknowledgedSupp NE FALSE$ then
|
||||
Response = Dialog_Box('NDW_RDS_SUPP_SIG', @Window, RDSNo :@FM: SigStage :@FM: FALSE$)
|
||||
If Response EQ False$ then return
|
||||
end
|
||||
End
|
||||
|
||||
IF MemberOf(@USER4, 'OI_SUPERUSER') THEN
|
||||
Valid = 1
|
||||
END ELSE
|
||||
@ -1184,9 +1020,9 @@ SignInsp:
|
||||
|
||||
IF SigRow NE '' AND CtrlList<SelectedRow,COL$INSP_SIG> = '' THEN
|
||||
|
||||
If ( (SelectedRow EQ 1) and (ReactType NE 'EPP') ) then
|
||||
If SelectedRow EQ 1 then
|
||||
WOMatKey = WONo:'*':CassNo
|
||||
Signature_Services('CheckSigOrder', WOMatKey, SigStage, False$)
|
||||
Signature_Services('CheckSigOrder', WOMatKey, SigStage, False$, RDSNo)
|
||||
If Error_Services('HasError') then
|
||||
ErrMsg(Error_Services('GetMessage'))
|
||||
return
|
||||
@ -1194,6 +1030,16 @@ SignInsp:
|
||||
|
||||
END ;* End of check for 1st Signature row
|
||||
|
||||
// Add check for supplement signatures
|
||||
ValidStages = Supplement_Services('GetStagesForLot', 'RDS', RDSNo)
|
||||
If Count(ValidStages, SigStage) NE 0 then
|
||||
UnacknowledgedSupp = Supplement_Services('UnacknowledgedSupplementCheck', 'RDS', RDSNo, SigStage)
|
||||
If UnacknowledgedSupp NE FALSE$ then
|
||||
Response = Dialog_Box('NDW_RDS_SUPP_SIG', @Window, RDSNo :@FM: SigStage :@FM: FALSE$)
|
||||
If Response EQ False$ then return
|
||||
end
|
||||
End
|
||||
|
||||
// Check if edge inspection is prescribed. If so, prompt user whether or not edge defects are present.
|
||||
If EdgeInspReq then
|
||||
// If edge defects are present, present user with a wafer selection dialog and create an NCR for those wafers.
|
||||
@ -1674,8 +1520,6 @@ SignInsp:
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
|
||||
* * * * * * *
|
||||
SignScan:
|
||||
* * * * * * *
|
||||
@ -1738,15 +1582,25 @@ SignScan:
|
||||
|
||||
IF SigRow NE '' AND CtrlList<SelectedRow,COL$SCAN_SIG> = '' AND CtrlList<SelectedRow,COL$SCAN_SIG_DTM> = '' THEN
|
||||
|
||||
If ( (SelectedRow EQ 1) and (ReactType NE 'EPP') ) then
|
||||
If SelectedRow EQ 1 then
|
||||
WOMatKey = WONo:'*':CassNo
|
||||
Signature_Services('CheckSigOrder', WOMatKey, SigStage, False$)
|
||||
Signature_Services('CheckSigOrder', WOMatKey, SigStage, False$, RDSNo)
|
||||
If Error_Services('HasError') then
|
||||
ErrMsg(Error_Services('GetMessage'))
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
// Add check for supplement signatures
|
||||
ValidStages = Supplement_Services('GetStagesForLot', 'RDS', RDSNo)
|
||||
If Count(ValidStages, SigStage) NE 0 then
|
||||
UnacknowledgedSupp = Supplement_Services('UnacknowledgedSupplementCheck', 'RDS', RDSNo, SigStage)
|
||||
If UnacknowledgedSupp NE FALSE$ then
|
||||
Response = Dialog_Box('NDW_RDS_SUPP_SIG', @Window, RDSNo :@FM: SigStage :@FM: FALSE$)
|
||||
If Response EQ False$ then return
|
||||
end
|
||||
End
|
||||
|
||||
// This checks to see if manually entered data is authorized to be signed.
|
||||
IF (SigRow NE '') AND (CtrlList<SelectedRow,COL$SCAN_TEST_RUN_DTM> = '') AND (Stage NE 'POST') THEN
|
||||
Authorized = MemberOf(@USER4, 'ENGINEERING') OR MemberOf(@USER4, 'LEAD') OR MemberOf(@USER4, 'SUPERVISOR') OR MemberOf(@USER4, 'ROTR_OVERRIDE')
|
||||
@ -1836,35 +1690,6 @@ RETURN
|
||||
|
||||
SIGN_ROTR_ACCEPTANCE.CLICK:
|
||||
|
||||
// ROTR Development Code - 11/21/18 - djs --------------------------------------------------------------------------
|
||||
* Stage = Get_Property(@Window : '.STAGE', 'TEXT')
|
||||
* If Stage EQ 'LWI' then
|
||||
* CIKey = Get_Property(@Window : '.CI_NO', 'TEXT')
|
||||
* ReactorNo = Xlate('CLEAN_INSP', CIKey, 'REACT_NO', 'X')
|
||||
* ROTREnabled = Xlate('REACTOR', ReactorNo, 'ENABLE_ROTR', 'X')
|
||||
* If (ROTREnabled EQ True$) then
|
||||
* ROTRReason = Get_Property(@Window : '.EDL_ROTR_REASON', 'TEXT')
|
||||
* ErrorMsg = ''
|
||||
* RDSNo = Get_Property(@Window : '.RDS_NO', 'TEXT')
|
||||
* PostCINo = Xlate('RDS', RDSNo, 'POST_CI_NO', 'X')
|
||||
* PostCleanSig = Xlate('CLEAN_INSP', PostCINo, 'CLEAN_SIG', 'X')
|
||||
* Begin Case
|
||||
* Case ( (ROTRReason EQ 'Wafer fail limit met - 100% scan required') and (PostCleanSig EQ '') )
|
||||
* ErrorMsg = 'A 100% scan must be run or a post clean must be completed in order to accept ROTR.'
|
||||
* Case ROTRReason EQ 'ROTR awaiting processing'
|
||||
* ErrorMsg = 'ROTR cannot be accepted until after ROTR data has finished processing.'
|
||||
* Case Otherwise$
|
||||
* Null
|
||||
* // Allow ROTR acceptance
|
||||
* End Case
|
||||
* If ErrorMsg NE '' then
|
||||
* Msg(@Window, '', 'OK', '', ROTRReason:@FM:ErrorMsg)
|
||||
* return
|
||||
* end
|
||||
* end
|
||||
* end
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
Valid = Dialog_Box( 'QUOTE_SIG_PWD_ENTRY', @WINDOW, @USER4:@VM:XLATE( 'LSL_USERS', @USER4, LSL_USERS_PASSWORD$, 'X' ) )
|
||||
If Valid EQ True$ then
|
||||
OrigReason = Get_Property(@Window : '.SIGN_ROTR_REASON', 'DEFPROP')
|
||||
@ -1882,14 +1707,11 @@ return
|
||||
|
||||
SCAN_RESULTS.CHAR:
|
||||
|
||||
// ROTR Development Code - 11/21/18 - djs --------------------------------------------------------------------------
|
||||
Stage = Get_Property(@Window : '.STAGE', 'TEXT')
|
||||
If Stage EQ 'LWI' then
|
||||
CtrlEntID = 'SCAN_RESULTS'
|
||||
CIKey = Get_Property(@Window : '.CI_NO', 'TEXT')
|
||||
ReactorNo = Xlate('CLEAN_INSP', CIKey, 'REACT_NO', 'X')
|
||||
* ROTREnabled = Xlate('REACTOR', ReactorNo, 'ENABLE_ROTR', 'X')
|
||||
* If (ROTREnabled EQ True$) then
|
||||
CanEdit = Get_Property(@Window, '@CAN_EDIT')
|
||||
If Not(CanEdit) then
|
||||
PrevFocusID = Get_Property (@Window, "PREVFOCUS")
|
||||
@ -1934,21 +1756,19 @@ SCAN_RESULTS.CHAR:
|
||||
ScanStyles<COL$SCAN_TOOL> = BitOr(ScanStyles<COL$SCAN_TOOL>, DTCS_DROPDOWN$ )
|
||||
ScanStyles = Send_Message(@Window : '.SCAN_RESULTS', 'COLSTYLE', 0, ScanStyles)
|
||||
end
|
||||
* end
|
||||
end
|
||||
****************Logging Manual Data Entry********************
|
||||
TableContents = Get_Property(@Window:'.SCAN_RESULTS', 'ARRAY')
|
||||
ToolID = TableContents<COL$SCAN_TOOL, 1>
|
||||
IF ToolID NE '' then
|
||||
Date = SRP_DateTime('Now')
|
||||
EpochStart = 00732
|
||||
EpochTime = SRP_DateTime('SecondSpan',EpochStart, Date)
|
||||
RDSNo = Get_Property(@Window:'.RDS_NO', 'DEFPROP')
|
||||
PSNo = Get_Property(@Window:'.PS_NO', 'DEFPROP')
|
||||
//Tool = Get_Property(@Window:'.SPEC_THICK_MTOOL', 'DEFPROP')
|
||||
User = @User4
|
||||
Date = SRP_DateTime('Now')
|
||||
EpochStart = 00732
|
||||
EpochTime = SRP_DateTime('SecondSpan',EpochStart, Date)
|
||||
RDSNo = Get_Property(@Window:'.RDS_NO', 'DEFPROP')
|
||||
PSNo = Get_Property(@Window:'.PS_NO', 'DEFPROP')
|
||||
User = @User4
|
||||
Description = 'Manual SurfScan Data Entry detected for RDS #: ':RDSNo
|
||||
Reactor = XLATE('RDS', RDSNo, 2, 'X')
|
||||
Reactor = XLATE('RDS', RDSNo, 2, 'X')
|
||||
|
||||
FileName = Environment_Services('GetApplicationRootPath'): '\LogFiles\ManualDataEntry\PollPath\' : EpochTime :'.json'
|
||||
|
||||
@ -1957,7 +1777,6 @@ SCAN_RESULTS.CHAR:
|
||||
|
||||
OSWrite JSON to FileName
|
||||
end
|
||||
// -----------------------------------------------------------------------------------------------------------------
|
||||
|
||||
return
|
||||
|
||||
@ -2015,7 +1834,6 @@ RefreshSpec:
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
* * * * * * *
|
||||
InspPC:
|
||||
* * * * * * *
|
||||
@ -2056,9 +1874,6 @@ BSideInspPC:
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
* * * * * * *
|
||||
SendSPC:
|
||||
* * * * * * *
|
||||
@ -2121,7 +1936,7 @@ SendSPC:
|
||||
|
||||
DOSFile = Environment_Services('GetSPCDataPath') : '\SPC_Surf.txt'
|
||||
|
||||
* * * * * * *
|
||||
* * * * * * *
|
||||
DosRead:
|
||||
* * * * * * *
|
||||
|
||||
@ -2148,3 +1963,5 @@ SetGroupBackground:
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -855,13 +855,12 @@ WRITE_RECORD:
|
||||
ScanSigDTM = Record<CLEAN_INSP_SCAN_SIG_DTM$>
|
||||
|
||||
SigProfUpdate = False$
|
||||
|
||||
|
||||
|
||||
If ( (OrigInspSig NE InspSig) or (OrigInspSigDTM NE InspSigDTM) ) then
|
||||
WOMatStage = '1':Stage:'I'
|
||||
Locate WOMatStage in WOMatSigProf using @VM setting vPos then
|
||||
WOMatSigs<0, vPos> = InspSig
|
||||
WOMatSigDTMs<0, vPos> = InspSigDTM
|
||||
WOMatSigs<0, vPos> = InspSig[-1, 'B':@VM]
|
||||
WOMatSigDTMs<0, vPos> = InspSigDTM[-1, 'B':@VM]
|
||||
SigProfUpdate = True$
|
||||
end
|
||||
end
|
||||
@ -869,8 +868,8 @@ WRITE_RECORD:
|
||||
If ( (OrigCleanSig NE CleanSig) or (OrigCleanSigDTM NE CleanSigDTM) ) then
|
||||
WOMatStage = '1':Stage:'C'
|
||||
Locate WOMatStage in WOMatSigProf using @VM setting vPos then
|
||||
WOMatSigs<0, vPos> = CleanSig
|
||||
WOMatSigDTMs<0, vPos> = CleanSigDTM
|
||||
WOMatSigs<0, vPos> = CleanSig[-1, 'B':@VM]
|
||||
WOMatSigDTMs<0, vPos> = CleanSigDTM[-1, 'B':@VM]
|
||||
SigProfUpdate = True$
|
||||
end
|
||||
end
|
||||
@ -878,15 +877,16 @@ WRITE_RECORD:
|
||||
If ( (OrigScanSig NE ScanSig) or (OrigScanSigDTM NE ScanSigDTM) ) then
|
||||
WOMatStage = '1':Stage:'S'
|
||||
Locate WOMatStage in WOMatSigProf using @VM setting vPos then
|
||||
WOMatSigs<0, vPos> = ScanSig
|
||||
WOMatSigDTMs<0, vPos> = ScanSigDTM
|
||||
WOMatSigs<0, vPos> = ScanSig[-1, 'B':@VM]
|
||||
WOMatSigDTMs<0, vPos> = ScanSigDTM[-1, 'B':@VM]
|
||||
SigProfUpdate = True$
|
||||
end
|
||||
end
|
||||
|
||||
If SigProfUpdate then
|
||||
WOMatRec<WO_MAT_SIGNATURE$> = WOMatSigs
|
||||
WOMatRec<WO_MAT_SIG_DTM$> = WOMatSigDTMs
|
||||
NumSteps = DCount(WOMatSigProf, @VM)
|
||||
WOMatRec<WO_MAT_SIGNATURE$> = Field(WOMatSigs, @VM, 1, NumSteps)
|
||||
WOMatRec<WO_MAT_SIG_DTM$> = Field(WOMatSigDTMs, @VM, 1, NumSteps)
|
||||
Database_Services('WriteDataRow', 'WO_MAT', WOMatKey, WOMatRec, True$, False$, True$)
|
||||
end
|
||||
end
|
||||
|
@ -29,4 +29,3 @@ BEGIN CASE
|
||||
Status() = invalid_msg$
|
||||
END CASE
|
||||
RETURN
|
||||
|
||||
|
@ -448,4 +448,3 @@ end service
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -70,4 +70,3 @@ Bail:
|
||||
* * * * * * *
|
||||
|
||||
END
|
||||
|
||||
|
@ -61,4 +61,3 @@ Bail:
|
||||
* * * * * * *
|
||||
|
||||
END
|
||||
|
||||
|
@ -92,4 +92,3 @@ write '' on SysListsTable, ListsId else
|
||||
return 0
|
||||
end
|
||||
RETURN 0
|
||||
|
||||
|
@ -137,4 +137,3 @@ Void = utility( 'CURSOR', 'A' )
|
||||
|
||||
|
||||
RETURN 0
|
||||
|
||||
|
@ -793,4 +793,3 @@ RETURN
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -309,4 +309,3 @@ RETURN
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -6,4 +6,3 @@ COMPILE FUNCTION Comm_Clean_Insp(Instruction,Parm1,Parm2)
|
||||
|
||||
RETURN ''
|
||||
|
||||
|
||||
|
@ -159,4 +159,3 @@ RETURN
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -176,4 +176,3 @@ RETURN
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -80,4 +80,3 @@ RETURN
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -75,4 +75,3 @@ RETURN
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -140,4 +140,3 @@ obj_AppWindow('LUValReturn',CustNo:@RM:ReturnToCtrl:@RM:ReturnToPos:@RM:1) ;* La
|
||||
|
||||
|
||||
RETURN
|
||||
|
||||
|
@ -97,4 +97,3 @@ RETURN
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -195,13 +195,22 @@ Refresh:
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
* * * * * * *
|
||||
Page:
|
||||
* * * * * * *
|
||||
|
||||
obj_Appwindow('Page')
|
||||
|
||||
RETURN
|
||||
Page = Parm1
|
||||
|
||||
IF Page = '' THEN
|
||||
Page = Get_Property(@WINDOW:'.TAB_MAIN','VALUE')
|
||||
END ELSE
|
||||
Set_Property(@WINDOW:'.TAB_MAIN','VALUE',Page)
|
||||
END
|
||||
|
||||
Set_Property(@WINDOW,'VPOSITION', Page)
|
||||
|
||||
return
|
||||
|
||||
|
||||
* * * * * * *
|
||||
@ -816,4 +825,3 @@ return
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -335,4 +335,3 @@ RETURN
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -327,4 +327,3 @@ End_Dialog(@WINDOW,'Cancel')
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
|
@ -697,4 +697,3 @@ RETURN
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -147,4 +147,3 @@ RETURN
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -89,4 +89,3 @@ RETURN
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -779,4 +779,3 @@ RETURN
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -114,4 +114,3 @@ End_Dialog(@WINDOW,Vals)
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
|
@ -97,4 +97,3 @@ End_Dialog( @WINDOW, GenericDt )
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
|
@ -87,4 +87,3 @@ End_Dialog( @WINDOW, StartDt:@FM:EndDt )
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
|
@ -697,4 +697,3 @@ RETURN
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -391,4 +391,3 @@ RETURN
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -156,4 +156,3 @@ End_Dialog(@WINDOW,Result)
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
|
@ -404,4 +404,3 @@ RETURN
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -325,7 +325,6 @@ FOR I = 1 TO CassCnt
|
||||
NEXT I
|
||||
|
||||
UserID = @USER4
|
||||
IF UserID = '' THEN UserID = @USERNAME
|
||||
|
||||
LogFile = 'WO_MAT' ;* Changed so all scans are logged in the WO_MAT table 12/3/2006
|
||||
|
||||
@ -367,6 +366,7 @@ Logging_Services('AppendLog', objLog, LogData, @FM, @VM)
|
||||
|
||||
obj_WO_Mat_Log('Create',LogFile:@RM:CurrDTM:@RM:Action:@RM:WhCd:@RM:LocCd:@RM:WONos:@RM:CassNos:@RM:UserID:@RM:CassIDs)
|
||||
|
||||
errCode = ''
|
||||
IF Get_Status(errCode) THEN
|
||||
Errmsg(errCode)
|
||||
END
|
||||
|
@ -226,53 +226,58 @@ WaferList = Get_Property(@WINDOW:'.SLOT_REJECT','LIST')
|
||||
WONo = Get_Property(@WINDOW:'.WO_NO','DEFPROP')
|
||||
CassNo = Get_Property(@WINDOW:'.CASS_NO','DEFPROP')
|
||||
|
||||
NCRNo = Get_Property(@Window:'.NCR_NO', 'TEXT')
|
||||
SAPBatchNo = Xlate('NCR', NCRNo, 'SAP_BATCH_NO', 'X')
|
||||
If SAPBatchNo EQ '' then
|
||||
|
||||
WaferSelection = Get_Property(@WINDOW:'.SLOT_REJECT','SELPOS')
|
||||
SelectedWafers = WaferSelection<2>
|
||||
WaferSelection = Get_Property(@WINDOW:'.SLOT_REJECT','SELPOS')
|
||||
SelectedWafers = WaferSelection<2>
|
||||
|
||||
IF SelectedWafers = '' THEN RETURN
|
||||
IF SelectedWafers = '' THEN RETURN
|
||||
|
||||
SelCnt = COUNT(SelectedWafers,@VM) + (SelectedWafers NE '')
|
||||
WaferCnt = COUNT(WaferList,@FM) + (WaferList NE '')
|
||||
SelCnt = COUNT(SelectedWafers,@VM) + (SelectedWafers NE '')
|
||||
WaferCnt = COUNT(WaferList,@FM) + (WaferList NE '')
|
||||
|
||||
IF SelCnt = WaferCnt THEN
|
||||
ErrMesg = 'There must be at least one rejected wafer on the NCR. '
|
||||
ErrMesg := 'If you are moving wafers from one slot to another, '
|
||||
ErrMesg := 'reject wafers from the cassette and then replace '
|
||||
ErrMesg := 'from the NCR.':CRLF$:CRLF$
|
||||
ErrMesg := 'If you are going to delete the NCR completely, '
|
||||
ErrMesg := 'you do not need to replace the wafers. The program '
|
||||
ErrMesg := 'will replace them during the NCR delete process.'
|
||||
ErrMsg(ErrMesg)
|
||||
RETURN
|
||||
END
|
||||
IF SelCnt = WaferCnt THEN
|
||||
ErrMesg = 'There must be at least one rejected wafer on the NCR. '
|
||||
ErrMesg := 'If you are moving wafers from one slot to another, '
|
||||
ErrMesg := 'reject wafers from the cassette and then replace '
|
||||
ErrMesg := 'from the NCR.':CRLF$:CRLF$
|
||||
ErrMesg := 'If you are going to delete the NCR completely, '
|
||||
ErrMesg := 'you do not need to replace the wafers. The program '
|
||||
ErrMesg := 'will replace them during the NCR delete process.'
|
||||
ErrMsg(ErrMesg)
|
||||
RETURN
|
||||
END
|
||||
|
||||
SlotList = Get_Property(@WINDOW:'.WO_MAT_SLOT','LIST')
|
||||
SlotList = Get_Property(@WINDOW:'.WO_MAT_SLOT','LIST')
|
||||
|
||||
FOR I = SelCnt TO 1 STEP -1
|
||||
SelectedWafer = SelectedWafers<1,I>
|
||||
|
||||
SlotNo = WaferList<SelectedWafer,NCR_COL$SLOT_NO>
|
||||
WaferID = WaferList<SelectedWafer,NCR_COL$WAFER_ID>
|
||||
PrevNCR = WaferList<SelectedWafer,NCR_COL$PREV_NCR>
|
||||
RejMetNo = WaferList<SelectedWafer,NCR_COL$REJ_MET_NO>
|
||||
FOR I = SelCnt TO 1 STEP -1
|
||||
SelectedWafer = SelectedWafers<1,I>
|
||||
|
||||
SlotNo = WaferList<SelectedWafer,NCR_COL$SLOT_NO>
|
||||
WaferID = WaferList<SelectedWafer,NCR_COL$WAFER_ID>
|
||||
PrevNCR = WaferList<SelectedWafer,NCR_COL$PREV_NCR>
|
||||
RejMetNo = WaferList<SelectedWafer,NCR_COL$REJ_MET_NO>
|
||||
|
||||
WaferList = DELETE(WaferList,SelectedWafer,0,0)
|
||||
|
||||
SlotList<SlotNo,WFR_COL$SLOT> = SlotNo
|
||||
SlotList<SlotNo,WFR_COL$WAFER_ID> = WaferID
|
||||
SlotList<SlotNo,WFR_COL$SLOT_NCR> = PrevNCR
|
||||
SlotList<SlotNo,WFR_COL$MET_NO> = RejMetNo
|
||||
IF PrevNCR NE '' THEN
|
||||
SlotList<SlotNo,WFR_COL$REPLACED_BY> = WaferID
|
||||
END
|
||||
NEXT I
|
||||
WaferList = DELETE(WaferList,SelectedWafer,0,0)
|
||||
|
||||
SlotList<SlotNo,WFR_COL$SLOT> = SlotNo
|
||||
SlotList<SlotNo,WFR_COL$WAFER_ID> = WaferID
|
||||
SlotList<SlotNo,WFR_COL$SLOT_NCR> = PrevNCR
|
||||
SlotList<SlotNo,WFR_COL$MET_NO> = RejMetNo
|
||||
IF PrevNCR NE '' THEN
|
||||
SlotList<SlotNo,WFR_COL$REPLACED_BY> = WaferID
|
||||
END
|
||||
NEXT I
|
||||
|
||||
Set_Property(@WINDOW:'.SLOT_REJECT','LIST',WaferList)
|
||||
Set_Property(@WINDOW:'.WO_MAT_SLOT','LIST',SlotList)
|
||||
Set_Property(@WINDOW:'.SLOT_REJECT','LIST',WaferList)
|
||||
Set_Property(@WINDOW:'.WO_MAT_SLOT','LIST',SlotList)
|
||||
|
||||
end else
|
||||
ErrMsg('Wafers cannot be replaced because an SAP batch number has been assigned. Contact FI for further assistance.')
|
||||
end
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -269,66 +269,71 @@ WaferList = Get_Property(@WINDOW:'.SLOT_REJECT','LIST')
|
||||
WONo = Get_Property(@WINDOW:'.WO_NO','DEFPROP')
|
||||
CassNo = Get_Property(@WINDOW:'.CASS_NO','DEFPROP')
|
||||
|
||||
NCRNo = Get_Property(@Window:'.NCR_NO', 'TEXT')
|
||||
SAPBatchNo = Xlate('NCR', NCRNo, 'SAP_BATCH_NO', 'X')
|
||||
|
||||
WaferSelection = Get_Property(@WINDOW:'.SLOT_REJECT','SELPOS')
|
||||
SelectedWafers = WaferSelection<2>
|
||||
If SAPBatchNo EQ '' then
|
||||
|
||||
WaferSelection = Get_Property(@WINDOW:'.SLOT_REJECT','SELPOS')
|
||||
SelectedWafers = WaferSelection<2>
|
||||
|
||||
IF SelectedWafers = '' THEN RETURN
|
||||
IF SelectedWafers = '' THEN RETURN
|
||||
|
||||
SelCnt = COUNT(SelectedWafers,@VM) + (SelectedWafers NE '')
|
||||
WaferCnt = COUNT(WaferList,@FM) + (WaferList NE '')
|
||||
SelCnt = COUNT(SelectedWafers,@VM) + (SelectedWafers NE '')
|
||||
WaferCnt = COUNT(WaferList,@FM) + (WaferList NE '')
|
||||
|
||||
IF SelCnt = WaferCnt THEN
|
||||
ErrMesg = 'There must be at least one rejected wafer on the NCR. '
|
||||
ErrMesg := 'If you are moving wafers from one slot to another, '
|
||||
ErrMesg := 'reject wafers from the cassette and then replace '
|
||||
ErrMesg := 'from the NCR.':CRLF$:CRLF$
|
||||
ErrMesg := 'If you are going to delete the NCR completely, '
|
||||
ErrMesg := 'you do not need to replace the wafers. The program '
|
||||
ErrMesg := 'will replace them during the NCR delete process.'
|
||||
ErrMsg(ErrMesg)
|
||||
RETURN
|
||||
END
|
||||
IF SelCnt = WaferCnt THEN
|
||||
ErrMesg = 'There must be at least one rejected wafer on the NCR. '
|
||||
ErrMesg := 'If you are moving wafers from one slot to another, '
|
||||
ErrMesg := 'reject wafers from the cassette and then replace '
|
||||
ErrMesg := 'from the NCR.':CRLF$:CRLF$
|
||||
ErrMesg := 'If you are going to delete the NCR completely, '
|
||||
ErrMesg := 'you do not need to replace the wafers. The program '
|
||||
ErrMesg := 'will replace them during the NCR delete process.'
|
||||
ErrMsg(ErrMesg)
|
||||
RETURN
|
||||
END
|
||||
|
||||
SlotList = Get_Property(@WINDOW:'.WM_OUT_SLOT','LIST')
|
||||
SlotList = Get_Property(@WINDOW:'.WM_OUT_SLOT','LIST')
|
||||
|
||||
FOR I = SelCnt TO 1 STEP -1
|
||||
SelectedWafer = SelectedWafers<1,I>
|
||||
|
||||
FOR I = SelCnt TO 1 STEP -1
|
||||
SelectedWafer = SelectedWafers<1,I>
|
||||
|
||||
|
||||
OutSlot = WaferList<SelectedWafer,NCR_COL$OUT_SLOT>
|
||||
RDSNo = WaferList<SelectedWafer,NCR_COL$RDS>
|
||||
Pocket = WaferList<SelectedWafer,NCR_COL$POCKET>
|
||||
Zone = WaferList<SelectedWafer,NCR_COL$ZONE>
|
||||
InCass = WaferList<SelectedWafer,NCR_COL$IN_CASS>
|
||||
InSlot = WaferList<SelectedWafer,NCR_COL$IN_SLOT>
|
||||
PrevNCR = WaferList<SelectedWafer,NCR_COL$PREV_NCR>
|
||||
MUWONo = WaferList<SelectedWafer,NCR_COL$MU_WO_NO>
|
||||
MUWOStep = WaferList<SelectedWafer,NCR_COL$MU_STEP>
|
||||
MUCassID = WaferList<SelectedWafer,NCR_COL$MU_CASS>
|
||||
MUSlot = WaferList<SelectedWafer,NCR_COL$MU_SLOT>
|
||||
|
||||
WaferList = DELETE(WaferList,SelectedWafer,0,0) ;* Removes rejected wafer from NCR list
|
||||
|
||||
SlotList<OutSlot,WFR_COL$OUT_SLOT> = OutSlot
|
||||
SlotList<OutSlot,WFR_COL$RDS> = RDSNo
|
||||
SlotList<OutSlot,WFR_COL$POCKET> = Pocket
|
||||
SlotList<OutSlot,WFR_COL$ZONE> = Zone
|
||||
SlotList<OutSlot,WFR_COL$IN_CASS> = InCass
|
||||
SlotList<OutSlot,WFR_COL$IN_SLOT> = InSlot
|
||||
SlotList<OutSlot,WFR_COL$SLOT_NCR> = PrevNCR
|
||||
SlotList<OutSlot,WFR_COL$MU_WO_NO> = MUWONo
|
||||
SlotList<OutSlot,WFR_COL$MU_STEP> = MUWOStep
|
||||
SlotList<OutSlot,WFR_COL$MU_CASS> = MUCassID
|
||||
SlotList<OutSlot,WFR_COL$MU_SLOT> = MUSlot
|
||||
|
||||
NEXT I
|
||||
OutSlot = WaferList<SelectedWafer,NCR_COL$OUT_SLOT>
|
||||
RDSNo = WaferList<SelectedWafer,NCR_COL$RDS>
|
||||
Pocket = WaferList<SelectedWafer,NCR_COL$POCKET>
|
||||
Zone = WaferList<SelectedWafer,NCR_COL$ZONE>
|
||||
InCass = WaferList<SelectedWafer,NCR_COL$IN_CASS>
|
||||
InSlot = WaferList<SelectedWafer,NCR_COL$IN_SLOT>
|
||||
PrevNCR = WaferList<SelectedWafer,NCR_COL$PREV_NCR>
|
||||
MUWONo = WaferList<SelectedWafer,NCR_COL$MU_WO_NO>
|
||||
MUWOStep = WaferList<SelectedWafer,NCR_COL$MU_STEP>
|
||||
MUCassID = WaferList<SelectedWafer,NCR_COL$MU_CASS>
|
||||
MUSlot = WaferList<SelectedWafer,NCR_COL$MU_SLOT>
|
||||
|
||||
WaferList = DELETE(WaferList,SelectedWafer,0,0) ;* Removes rejected wafer from NCR list
|
||||
|
||||
SlotList<OutSlot,WFR_COL$OUT_SLOT> = OutSlot
|
||||
SlotList<OutSlot,WFR_COL$RDS> = RDSNo
|
||||
SlotList<OutSlot,WFR_COL$POCKET> = Pocket
|
||||
SlotList<OutSlot,WFR_COL$ZONE> = Zone
|
||||
SlotList<OutSlot,WFR_COL$IN_CASS> = InCass
|
||||
SlotList<OutSlot,WFR_COL$IN_SLOT> = InSlot
|
||||
SlotList<OutSlot,WFR_COL$SLOT_NCR> = PrevNCR
|
||||
SlotList<OutSlot,WFR_COL$MU_WO_NO> = MUWONo
|
||||
SlotList<OutSlot,WFR_COL$MU_STEP> = MUWOStep
|
||||
SlotList<OutSlot,WFR_COL$MU_CASS> = MUCassID
|
||||
SlotList<OutSlot,WFR_COL$MU_SLOT> = MUSlot
|
||||
|
||||
NEXT I
|
||||
|
||||
Set_Property(@WINDOW:'.SLOT_REJECT','LIST',WaferList)
|
||||
Set_Property(@WINDOW:'.WM_OUT_SLOT','LIST',SlotList)
|
||||
Set_Property(@WINDOW:'.SLOT_REJECT','LIST',WaferList)
|
||||
Set_Property(@WINDOW:'.WM_OUT_SLOT','LIST',SlotList)
|
||||
end else
|
||||
ErrMsg('Wafers cannot be replaced because an SAP batch number has been assigned. Contact FI for further assistance.')
|
||||
end
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -155,4 +155,3 @@ Cancel:
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
|
@ -658,4 +658,3 @@ RETURN
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -136,4 +136,3 @@ Cancel:
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
|
@ -156,4 +156,3 @@ RETURN
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -248,4 +248,3 @@ RETURN
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -421,4 +421,3 @@ END
|
||||
|
||||
RETURN
|
||||
|
||||
|
||||
|
@ -209,4 +209,3 @@ END
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
|
@ -195,4 +195,3 @@ End_Dialog(@WINDOW,Result)
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
|
@ -246,4 +246,3 @@ RETURN
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -288,4 +288,3 @@ RETURN
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -238,4 +238,3 @@ RETURN
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -247,4 +247,3 @@ Timer:
|
||||
Set_Property(@WINDOW,'TIMER','0':@FM:'1000') ;* Set the next timer event to start in 1000 msecs (1 second).
|
||||
|
||||
RETURN
|
||||
|
||||
|
@ -79,4 +79,3 @@ End_Dialog(@WINDOW,Result)
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
|
@ -239,4 +239,3 @@ return
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -368,4 +368,3 @@ RETURN
|
||||
|
||||
|
||||
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -159,4 +159,3 @@ End_Dialog(@WINDOW,CassQtys)
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
|
@ -494,4 +494,3 @@ RETURN
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -752,4 +752,3 @@ RETURN
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -571,4 +571,3 @@ End_Dialog(@WINDOW,Result)
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
|
@ -436,4 +436,3 @@ End_Dialog(@WINDOW,Result)
|
||||
RETURN
|
||||
|
||||
|
||||
|
||||
|
@ -179,4 +179,3 @@ RETURN
|
||||
|
||||
|
||||
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -373,4 +373,3 @@ RETURN
|
||||
|
||||
|
||||
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user